@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,218 +0,0 @@
1
- module.exports =
2
- pkg:
3
- name: 'bubble', version: '0.0.1'
4
- extend: {name: "base", version: "0.0.1"}
5
- dependencies: []
6
- i18n:
7
- "zh-TW":
8
- "K": \千
9
- "M": \百萬
10
- init: ({root, context, pubsub, t}) ->
11
- pubsub.fire \init, mod: mod {context, t} .then ~> it.0
12
-
13
- mod = ({context, t}) ->
14
- {d3,forceBoundary,ldcolor,chart} = context
15
- sample: ->
16
- raw: [0 to 100].map (val) ~> {val: val, cat: Math.floor(Math.random! * 5), name: val}
17
- binding:
18
- group: {key: \cat}
19
- name: {key: \name}
20
- color: {key: \cat}
21
- area: {key: \val}
22
- config: {} <<< chart.utils.config.preset.default
23
- dimension:
24
- group: {type: \C, name: "group", priority: 2}
25
- color: {type: \NR, name: "color", priority: 4}
26
- area: {type: \R, name: "area", priority: 1}
27
- name: {type: \NC, name: "name", priority: 3}
28
- init: ->
29
- @tint = tint = new chart.utils.tint!
30
- @parsed = @parsed or []
31
- @g = Object.fromEntries <[view unit legend]>.map ~> [it, d3.select(@layout.get-group it)]
32
- node = @root.querySelector '[ld=tip]'
33
- @tip = new chart.utils.tip {
34
- root: @root
35
- accessor: ({evt}) ~>
36
- if !(evt.target and data = d3.select(evt.target).datum!) => return null
37
- return {name: data.name, value: "#{data.area}#{@binding.area.unit or ''}"}
38
- range: ~> return @layout.get-node \view .getBoundingClientRect!
39
- }
40
- @legend = new chart.utils.legend do
41
- layout: @layout
42
- name: \legend
43
- root: @root
44
- shape: (d) -> d3.select(@).attr \fill, tint.get d.key
45
- direction: if @cfg.{}legend.position == \bottom => \horizontal else \vertical
46
- cfg: selectable: true
47
- @legend.on \select, ~> @bind!; @resize!; @render!
48
-
49
- destroy: -> @tip.destroy!
50
-
51
- parse: ->
52
- @valid = @data.filter -> !isNaN(it.area)
53
- @groups = Array.from(new Set(@valid.map -> it.group)).filter -> it
54
- @sim = null
55
- @legend.data @groups.map -> {key: it, text: it}
56
- resize: ->
57
- @root.querySelector('.pdl-layout').classList.toggle \legend-bottom, @cfg.{}legend.position == \bottom
58
- @tip.toggle(if @cfg.{}tip.enabled? => @cfg.tip.enabled else true)
59
- @cfg.{}legend
60
- @random = d3.randomUniform.source(d3.randomLcg(+Date.now!))(0, 1)
61
- list = (
62
- [{key: 'root', root: true}] ++
63
- @groups.map(->{key: "group-#it"}) ++
64
- @valid.filter(~> !@cfg.legend.enabled or @legend.is-selected it.group)
65
- )
66
- if @legend.enabled! => list = list.filter ~> !it._raw or @legend.is-selected it.group
67
-
68
- @legend.config @cfg.legend
69
- @legend.update!
70
- @layout.update false
71
-
72
- ret = d3.hierarchy(
73
- d3.stratify!
74
- .id(->if it._idx? => it._idx else it.key)
75
- # no group-based position
76
- #.parentId(-> if it.root => '' else 'root' ) list
77
- # group-based position
78
- .parentId(-> if it.root => '' else if it.group => "group-#that" else \root) list
79
- )
80
- .sum -> it.data.area
81
- .sort (a,b) -> b.value - a.value # sort or not
82
-
83
- box = @vbox = @layout.get-box \view
84
- pack = d3.pack!size([box.width, box.height]) ret
85
- @parsed = ret.leaves!
86
- .map (d) ~>
87
- d._raw = d.data.data._raw
88
- ddata = d.data.data
89
- pos = if (!(@cfg.grouping?) and @cfg.grouping) => d else
90
- # randomized position regardless of grouping
91
- x: Math.random! * box.width * 0.8 + box.width * 0.1
92
- y: Math.random! * box.height * 0.8 + box.height * 0.1
93
-
94
- # if @parsed exists, then this is a data / size / config update.
95
- # we use the old data position for a smooth transition effect.
96
- od = if @parsed =>
97
- p = @parsed
98
- .filter (p) ->
99
- if (p.name? or ddata.name?) => (p.name == ddata.name)
100
- else (p._idx == ddata._idx)
101
- .0
102
- if p => p else d
103
- else d
104
- {x,y} = d
105
- d <<< {radius: ddata.area ** 0.5, x, y}
106
- d <<< ddata{_idx, name, color, group, area}
107
- if od._x => d._x = od._x else if !d._x => d._x = d.x
108
- if od._y => d._y = od._y else if !d._y => d._y = d.y
109
- d
110
- .filter -> it.area?
111
- @sim = null
112
- @start!
113
-
114
-
115
- render: ->
116
- {binding, tint} = @
117
- box = @vbox
118
- # automatically adjust circle size based on canvas size.
119
- @rate = rate = 0.85 * # make it slightly smaller. adjust as your wish
120
- Math.PI / (2 * Math.sqrt(3)) * # wasted space from exterior hexagon to circle
121
- Math.sqrt(box.width * box.height / @parsed.map(-> Math.PI * (it.r ** 2)).reduce(((a,b) -> a + b),0))
122
- @parsed.map (d,i) ~> d.rr = (d.r * @rate) >? 2
123
- tint.set(@cfg.palette)
124
- @g.view.selectAll \circle.bubble .data @parsed, (->it.name or it._idx)
125
- ..exit!remove!
126
- ..enter!append \circle
127
- .attr \class, 'bubble data'
128
- .attr \r, (d,i) ~> 0
129
- .attr \fill, (d,i) ~> tint.get(d.color or d.group or d.name)
130
- .attr \cx, (d,i) -> d._x
131
- .attr \cy, (d,i) -> d._y
132
-
133
- @g.view.selectAll \circle.bubble
134
- .attr \cx, (d,i) -> d._x
135
- .attr \cy, (d,i) -> d._y
136
- .transition!duration 350
137
- .attr \fill, (d,i) ~> tint.get(d.color or d.group or d.name)
138
- .attr \r, (d,i) ~> d.rr
139
-
140
- @g.view.selectAll \g.label .data @parsed, (->it.name or it._idx)
141
- ..exit!remove!
142
- ..enter!append \g
143
- .attr \class, 'label data'
144
- .attr \transform, (d,i) -> "translate(#{d.x},#{d.y})"
145
- .attr \opacity, 0
146
- .style \pointer-events, \none
147
- .style \cursor, \pointer
148
- .each (d,i) ->
149
- [0,1]
150
- .map ~> d3.select(@).append \text
151
- .map ->
152
- it
153
- .attr \dy, \-.28em
154
- .attr \text-anchor, \middle
155
- .style \pointer-event, \none
156
- @g.view.selectAll \g.label
157
- .attr \transform, (d,i) -> "translate(#{d._x},#{d._y})"
158
- .each (d,i) ->
159
- d3.select(@).selectAll \text
160
- .attr \dy, (e,i) -> if i == 0 => '-.28em' else '.88em'
161
- .text (e,i) ->
162
- if i == 0 =>
163
- area = d3.format('.3s')(d.area)
164
- /*
165
- ret = if area > 1000000 => (area/1000000).toFixed(1) + t(\M)
166
- else if area > 1000 => (area/1000).toFixed(1) + t(\K)
167
- else (area).toFixed(0)
168
- */
169
- ret = area
170
- if ret => ret = "#{ret}#{binding.area.unit or ''}"
171
- return ret
172
- else return d.name or ''
173
- .attr \font-size, (d,i) -> return if i => '0.9em' else '1.1em'
174
-
175
- .transition!duration 350
176
- .attr \fill, ->
177
- hcl = ldcolor.hcl(tint.get d.color or d.group or d.name)
178
- if hcl.l < 50 => \#fff else \#000
179
- @g.view.selectAll \g.label
180
- .transition!duration 350
181
- .attr \opacity, (d,i) ->
182
- box = @getBoundingClientRect!
183
- [w,h] = [box.width, box.height]
184
- if (2 * d.rr) < w or (2 * d.rr) < h => 0 else 1
185
- @legend.render!
186
-
187
- tick: ->
188
- cfg = @cfg
189
- pad = cfg.pad or 5
190
- box = @vbox
191
- if !@sim =>
192
- kickoff = true
193
- @fc = fc = d3.forceCollide!strength 0.5 .iterations 20 .radius ~> @rate * it.r
194
- @fg = d3.forceCenter!strength 0.5
195
- @fb = forceBoundary(
196
- (~> it.rr + pad), (~> it.rr + pad),
197
- (~> box.width - it.rr - pad), (~> box.height - it.rr - pad)
198
- ).strength 0.5
199
- @sim = d3.forceSimulation!
200
- # we can't make it center properly so disable it for now.
201
- #.force \center, @fg
202
- .force \b, @fb
203
- .force \collide, @fc
204
- @sim.stop!
205
- @sim.alpha 0.9
206
- @fg.x(box.width / 2)
207
- @fg.y(box.height / 2)
208
- @sim.nodes(@parsed)
209
- @sim.tick if kickoff => 10 else 1
210
- @parsed.map ->
211
- it._x = it._x + (it.x - it._x) * 0.1
212
- it._y = it._y + (it.y - it._y) * 0.1
213
-
214
- @g.view.selectAll \circle.bubble
215
- .attr \cx, (d,i) -> d._x
216
- .attr \cy, (d,i) -> d._y
217
- @g.view.selectAll \g.label
218
- .attr \transform, (d,i) -> "translate(#{d._x},#{d._y})"
@@ -1,42 +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="unit")
7
- .pdl-cell(data-name="legend")
8
- div(data-type="render")
9
- style(type="text/css"): :stylus
10
- /*.pdl-cell { width: 100%; height: 100% }*/
11
- .pdl-layout > div[data-type=layout]
12
- display: grid
13
- grid-template-columns: 1fr fit-content(10em)
14
- grid-template-rows: 1fr fit-content(1em)
15
- & > .pdl-cell[data-name=view]
16
- grid-area: 1 / 1
17
- & > .pdl-cell[data-name=legend]
18
- grid-column: 2
19
- grid-row: 1 / span 2
20
- padding: 0 .5em 0 .5em
21
- & > .pdl-cell[data-name=unit]
22
- grid-column: 1
23
- grid-row: 2
24
- line-height: 1em
25
- text-align: right
26
- padding: .25em 0
27
- .pdl-layout.legend-bottom > div[data-type=layout]
28
- grid-template-columns: 1fr fit-content(1em)
29
- grid-template-rows: 1fr fit-content(3em)
30
- .pdl-cell[data-name=view]
31
- grid-column: 1 / span 2
32
- grid-row: 1
33
- .pdl-cell[data-name=legend]
34
- padding-top: 1em
35
- grid-column: 1
36
- grid-row: 2
37
- .pdl-cell[data-name=unit]
38
- padding-top: 1em
39
- grid-column: 2
40
- grid-row: 2
41
-
42
- script(type="@plotdb/block"): include:lsc index.ls
@@ -1,85 +0,0 @@
1
- module.exports =
2
- pkg:
3
- name: 'curve-bar', version: '0.0.1'
4
- extend: {name: "base", version: "0.0.1"}
5
- dependencies: []
6
-
7
- init: ({root, context, pubsub}) ->
8
- pubsub.fire \init, mod: mod {context}
9
-
10
- mod = ({context}) ->
11
- {d3,legend,chart} = context
12
- sample: ->
13
- raw: [1 to 5].map (val) ~> {val: Math.random!, name: val}
14
- binding:
15
- name: {key: \name}
16
- value: {key: \val}
17
- config: {}
18
- dimension:
19
- value: {type: \R, name: "value"}
20
- name: {type: \N, name: "name"}
21
- init: ->
22
-
23
- @gview = d3.select @layout.get-group \view
24
- @g = @gview.append \g
25
- @tint = tint = new chart.utils.tint!
26
-
27
- @arc = d3.arc!
28
- .innerRadius 0
29
- .outerRadius 100
30
- .startAngle 0
31
- .endAngle(Math.PI / 2)
32
-
33
- @legend = new chart.utils.legend do
34
- root: @root
35
- name: 'legend'
36
- shape: (d) -> d3.select(@).attr \fill, tint.get d.text
37
- layout: @layout
38
-
39
- parse: ->
40
- @tint.reset!
41
- @extent =
42
- v: d3.extent @data.map -> it.value
43
- @data.sort (a,b) -> a.value - b.value
44
- @legend.data @data.map -> {key: it.name, text: it.name}
45
-
46
- resize: ->
47
- box = @layout.get-box \view
48
- @layout.get-node \view .style.width = "#{box.height}px"
49
- @layout.update false
50
- [w,h] = [box.width, box.height]
51
- size = Math.min(w,h)
52
- @scale =
53
- v: d3.scaleLinear!domain [0, @extent.v.1] .range [0, Math.PI * 3 / 2]
54
- r: d3.scaleBand!domain (@data.map (d,i) -> i) .range [24, size/2]
55
- render: ->
56
- {scale} = @
57
- bw = @scale.r.bandwidth!
58
- @arc.cornerRadius bw/2
59
- if @cfg? and @cfg.palette => @tint.set(@cfg.palette.colors.map -> it.value or it)
60
- @legend.render!
61
-
62
- box = @layout.get-box \view
63
- @g.attr \transform, "translate(#{box.width / 2},#{box.height / 2})"
64
- @g.selectAll \path.data .data @data
65
- ..exit!remove!
66
- ..enter!append \path .attr \class, \data
67
- @g.selectAll \path.data
68
- .attr \d, (d,i) ~>
69
- @arc
70
- .startAngle 0
71
- .endAngle scale.v d.value
72
- .innerRadius scale.r(i)
73
- .outerRadius scale.r(i) + bw - 2
74
- @arc!
75
- .attr \fill, (d,i) ~> @tint.get d.name or d._idx
76
- @g.selectAll \text.label .data @data
77
- ..exit!remove!
78
- ..enter!append \text .attr \class, \label
79
- @g.selectAll \text.label
80
- .attr \dominant-baseline, \center
81
- .attr \text-anchor, \end
82
- .attr \x, \-.5em
83
- .attr \y, (d,i) -> -scale.r(i)
84
- .attr \dy, -bw * 1/4
85
- .text (d,i) -> d.name
@@ -1,16 +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="legend")
7
- div(data-type="render")
8
- style(type="text/css"): :stylus
9
- .pdl-layout > div[data-type=layout]
10
- display: flex
11
- justify-content: center
12
- align-items: center
13
- [data-name=view]
14
- height: 100%
15
- margin-right: 1em
16
- script(type="@plotdb/block"): include:lsc index.ls