Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(patterns): Allow definig custom background patterns #196

Closed
wants to merge 2 commits into from

Conversation

julien
Copy link
Collaborator

@julien julien commented Nov 20, 2017

Issue

#193

Details

Allow defining background patterns via options

@coveralls
Copy link

Coverage Status

Changes Unknown when pulling 65b2cc6 on julien:patterns into ** on naver:master**.

@coveralls
Copy link

Coverage Status

Changes Unknown when pulling 4b4a638 on julien:patterns into ** on naver:master**.

@netil
Copy link
Member

netil commented Nov 21, 2017

Great work again @julien! I have some ideas to comment.

How about adding helper function?

Is kind of tedious appending elements directly. How about giving some helper function to facilitate and write less code?

  • internals/util.js
/**
 * Helper to append an element
 * @param {d3.selection} to Destination element
 * @param {String} tag A tag name string
 * @param {Object} attr Attributes value
 * @return {d3.selection} Appended element
 * @private
 */
const appendElement = (to, tag, attr) => {
	const pattern = to.append(tag);

	for (let x in attr) {
		pattern.attr(x, attr[x]);
	}

	tag === "pattern" && !("patternUnits" in attr) &&
		pattern.attr("patternUnits", "userSpaceOnUse");

	return pattern;
};
  • internals/ChartInternal.js
// Call patterns function if it's defined
if (isFunction(config.pattern)) {
	config.pattern(defs, appendElement);
}
  • User generation code:
    User can facilitate appending elements using a helper function.
    Or can decide handle directly with defs element
pattern: function(defs, helper) {
	const size = 32;
	const linesHorizontal = helper(defs, "pattern", { id: "lines-horizontal", width: size, height: size });
	const linesVertical = helper(defs, "pattern", { id: "lines-vertical", width: size, height: size });
	
	for (let i = 2; i <= 30; i += 4) {
		const attr = { x1: 0, x2: 32, y1: i, y2: i };
	
		helper(linesHorizontal, "line", attr);
		helper(linesVertical, "line", attr);
	}
	
	const circles = helper(defs, "pattern", { id: "circles", width: 10, height: 10, fill: "rgb(230, 0, 2)" });
	
	helper(circles, "circle", { cx: 3, cy: 3, r: 3});
	helper(circles, "circle", { cx: 13, cy: 13, r: 3 });
}

Data color indication

The representation of the color in legend area is replaced using stroke: url(#id);.

Is okay for the legend in below case, which is within svg element, but for tooltip element can't be displayed the correct pattern due to tooltip is located outside of svg element.

And also for tooltip, is used background-color: url(#id); property value, which isn't correct.

image

There's customizable legend option too.

IMO, it's difficult find a proper solution for this. The arbitrary will be getting fill value from the pattern and set as a color value for non svg within elements.

Do you have any better idea on this?

@julien
Copy link
Collaborator Author

julien commented Nov 21, 2017

Hi @netil,

How about adding helper function?

Thanks for the suggestion, it seems like a good idea to me too, I'll go ahead and add that.

Data color indication

That's a good point which I hadn't thought about and I understand your concerns.

Maybe we could try adapting the tooltip "template" to use an svg element rather than a span with a background-color, and use the same approach for the legend when patterns are in use.

This screenshot might help understand it better

tooltip

Thinking about this a bit more, I also think that it should be possible to use colors and patterns together, so it might be better for the patterns to be monochromatic (this might also avoid having to use patterns in legend and tooltip).

Anyway, I will start with the helper function and let you know which solution I came up with.

Thanks.

@netil netil added this to the 1.2.0 milestone Nov 21, 2017
@netil netil added the feature label Nov 21, 2017
@julien
Copy link
Collaborator Author

julien commented Nov 22, 2017

Hi again @netil,

I've got an update, but I will need your help and advice to complete the feature.

My first implementation is too simple because it does not allow combining colors and patterns.

Ideally, one should be able to use a background color (defined by the css fill property) and (optionally) a pattern (also defined by the css fill property).

Since svg elements do not support mutliple fill css properties; I made changes in arc.js to "duplicate" the path of the arc. The first path uses the background color and the second path uses the pattern.

(I thought that attaching an image would make it easier to understand)

multiple-paths

I had to modify the elements to which some event handlers are attached depending on whether patterns are specified in the config or not, but this fixes the issue of not being able to combine colors and patterns.

I also made similiar changes to legend and tooltip to keep everything consistent.

There is just one issue though 😅:

When clicking on the "legend items", the second path's d attribute (the one with the pattern fill) doesn't get updated and this creates a "glitch" effect and throws an error in the browser console similar to this:

d3.js:3487 Error: <path> attribute d: Expected arc flag ('0' or '1'), "…35.85,135.85,0,0.014924348603354…".

This is probably because this second path is not created exactly in the same way as the first path, (and does not use the d3 attrTween function) but I was not really sure on how to do that, and this is what I'd need help with.

If you have time could you please have a look and possibly guide me in the right direction.

To test this feature, you can use the following code

const chart = bb.generate({
  data: {
    columns: [
      ['data1', 20],
      ['data2', 35],
      ['data3', 45]
    ],
    type: "pie",
    pattern: [
      "#circles",
      "#lines-horizontal",
      "#lines-vertical"
    ],
    // pattern: {
    //   data1: "#circles",
    //   data2: "#lines-horizontal",
    //   data3: "#lines-vertical"
    // }
  },
  color: {
    pattern: ["red", "gold",  "green"]
  },
  pattern: function(defs, helper) {
    const circles  = defs.append("pattern")
      .attr("id", "circles").attr("patternUnits", "userSpaceOnUse")
      .attr("width", "16").attr("height", "16")
          .append("g").style("fill", "#000").style("opacity", "0.2");

    circles.append("circle").attr("cx", 3).attr("cy", 3).attr("r", 3);
    circles.append("circle").attr("cx", 13).attr("cy", 13).attr("r", 3);

    // lines-horizontal
    const linesHorizontal = defs.append("pattern")
      .attr("id", "lines-horizontal").attr("patternUnits", "userSpaceOnUse")
      .attr("width", "32").attr("height", "32");

    for (let i = 2; i <= 30; i += 4) {
      linesHorizontal.append("line")
        .attr("x1", "0").attr("x2", "32")
        .attr("y1", i).attr("y2", i)
        .style("stroke", "#000")
        .style("opacity", "0.2");
    }

    // lines-vertical
    const linesVertical = defs.append("pattern")
      .attr("id", "lines-vertical").attr("patternUnits", "userSpaceOnUse")
      .attr("width", "32").attr("height", "32");

    for (let i = 2; i <= 30; i += 4) {
      linesVertical.append("line")
        .attr("y1", "0").attr("y2", "32")
        .attr("x1", i).attr("x2", i)
        .style("stroke", "#000")
        .style("opacity", "0.2");
    }
  },
  bindto: '#chart'
});

A few notes

  • Although, in the example code above, I'm not using the new helper function, it has been added

  • Once we find a solution to the "glitch" issue (and if you agree), I'd have to apply the similar change for area and bar charts

Thanks in advance for your help.

@netil
Copy link
Member

netil commented Nov 23, 2017

@julien, it was good approach, but adding another <path> element it seems not really good idea in terms of performance(or compatibility) and side effects(like 'glitch' you mentioned), which can cause.

I just digged and figure out that adding a <rect> with the size of the pattern can make to style the background color.
image

I think this approach will degrade the possibility of unexpected behavior and is more clear, because it's fully making divide between the pattern and the data area.

So, basically the previous change was okay. If user needs to set bg color, user can define a pattern like that.

What do you think?

@julien
Copy link
Collaborator Author

julien commented Nov 23, 2017

@netil ,

You're right, adding the second path element was not the best approach and I think your solution is better. I've managed to get it working that way.

I'll send another pull request with more details.

Thanks!

@coveralls
Copy link

coveralls commented Nov 23, 2017

Coverage Status

Changes Unknown when pulling 99d5890 on julien:patterns into ** on naver:master**.

@netil
Copy link
Member

netil commented Nov 24, 2017

To be worked properly, the pattern option should return an array of element containing the id and <pattern> pairs.

[
	{ id, <pattern> },
	...
]

But, it seems the use of colorize is required(not optional).
I'm not sure if this interface is straight forward. I think it should provide more simple way on apply patterns.

Let me think more about it and hope you too.

@jbalsas
Copy link

jbalsas commented Nov 24, 2017

Hey @netil, @julien, I think it might make it simpler if we just assimilate the API inside the color config like:

const chart = bb.generate({
  data: {
    columns: [
      ['data1', 20],
      ['data2', 35],
      ['data3', 45]
    ],
    type: "pie",
  },
  color: {
    pattern: ["red", "gold",  "green"],
    tiles: function() {
        // Returns an array of <pattern> objects
    }
  });

There's really no need to pass in neither colors nor the colorize helper, which we do automatically inside the colors class.

@julien
Copy link
Collaborator Author

julien commented Nov 24, 2017

hey @netil ,

I've updated the code according to @jbalsas's suggestion.
Tell me what you think when you can.

Thanks!

@coveralls
Copy link

Coverage Status

Changes Unknown when pulling 26c040c on julien:patterns into ** on naver:master**.

@netil netil closed this in bec92dd Nov 27, 2017
@netil
Copy link
Member

netil commented Nov 27, 2017

Hi, @julien I just merged the PR with some code changes and added some more test cases.
Thanks again for the contribution!

@julien
Copy link
Collaborator Author

julien commented Nov 27, 2017

@netil Thanks!
Always happy to contribute.

@julien julien deleted the patterns branch December 7, 2017 08:43
netil pushed a commit that referenced this pull request Jun 18, 2019
# 1.0.0 (2019-06-18)

### Bug Fixes

* fallback to __bindto's id attribute when it is not a string ([16a1e6d](16a1e6d))
* regex replaces everything that is not alphanum, - or _ ([1f093dd](1f093dd))
* **tooltip:** Correct tooltip position when is zoomed ([45785ab](45785ab)), closes [#197](#197) [#281](#281) [#431](#431) [#546](#546)
* throw errors instead of alerts ([12cf47d](12cf47d))
* **all:** Re-organize import from d3 ([c11a215](c11a215)), closes [#285](#285) [#313](#313)
* **AMD-module:** updating to enforce the AMD standard ([4f8f63c](4f8f63c))
* **api:** Cancel transitions on destroy. ([7dd287d](7dd287d)), closes [#766](#766) [#765](#765)
* **api:** Change the way of hiding tooltip ([#358](#358)) ([67c8305](67c8305)), closes [#343](#343)
* **api:** Correct .x()/.xs() to work properly ([80d4e1b](80d4e1b)), closes [#634](#634) [#635](#635)
* **api:** Correct on exporting custom points ([f65bcfb](f65bcfb)), closes [#541](#541) [#741](#741)
* **api:** Correct toggle interaction ([#456](#456)) ([3682a83](3682a83)), closes [#454](#454)
* **api:** Fix css encoding in exported svg ([321971e](321971e)), closes [#843](#843) [#844](#844)
* **api:** Fix JSON data loading ([9067138](9067138)), closes [#398](#398) [#400](#400)
* **api:** Fix loading to maintain correct x index ([f3881bc](f3881bc)), closes [#517](#517) [#519](#519)
* **api:** Fix regions.remove() error ([#579](#579)) ([0c0374f](0c0374f)), closes [#529](#529) [#578](#578)
* **api:** Fix to remove instance ([#357](#357)) ([80fdc31](80fdc31)), closes [#347](#347)
* **api:** Remove cached data when .unload() is called ([aa91bab](aa91bab)), closes [#626](#626) [#627](#627)
* **api-load:** Allow false for unload ([e52e5ad](e52e5ad)), closes [#321](#321) [#333](#333)
* **api.zoom, interaction:** fix zoom bug for rects ([b3521c8](b3521c8)), closes [#33](#33) [#46](#46)
* **arc:** Correction on rendering 0 values ([dcfa12c](dcfa12c)), closes [#652](#652) [#656](#656)
* **arc:** Fix to generate arc when data is zero ([04a4dd8](04a4dd8)), closes [#935](#935)
* **arc,api:** Correct on data representation and handling ([#332](#332)) ([3eec8d7](3eec8d7)), closes [#303](#303) [#331](#331)
* **area:** Apply gradient on dynamic data loading ([954c303](954c303)), closes [#855](#855)
* **area-line-range:** Fix working with grouped data ([1546dda](1546dda)), closes [#630](#630) [#644](#644)
* **area-range:** Correct handling null data ([cc1d4ee](cc1d4ee)), closes [#482](#482) [#487](#487)
* **area-range:** Fixed data parsing ([#485](#485)) ([4b78de5](4b78de5)), closes [#481](#481)
* **axis:** Adjust axes range ([0130519](0130519)), closes [#859](#859)
* **axis:** Avoid unnecessary computing char dimension ([3f52827](3f52827)), closes [#399](#399) [#407](#407)
* **axis:** Correct axis label position ([#538](#538)) ([37cca8c](37cca8c)), closes [#519](#519) [#534](#534)
* **axis:** Correct axis transition ([e2bec90](e2bec90)), closes [#759](#759)
* **axis:** Correct not to generate unnecessary ticks ([#560](#560)) ([9346e66](9346e66)), closes [#348](#348)
* **axis:** Correct rotated x axis rendering ([2b02a03](2b02a03)), closes [#230](#230) [#234](#234)
* **axis:** Correct tick's position implementation ([#457](#457)) ([09547be](09547be)), closes [#380](#380)
* **axis:** Correct ticks less than ~0.1 to be shown ([8d14bcb](8d14bcb)), closes [#387](#387) [#409](#409)
* **axis:** Fix indexed x axis order ([#879](#879)) ([df8d385](df8d385)), closes [#714](#714) [#877](#877)
* **axis:** Fix on axis width sizing ([10f27e5](10f27e5)), closes [#920](#920)
* **axis:** fix side-effects from [#717](#717) ([#740](#740)) ([4eba766](4eba766))
* **axis:** Fix x Axis tick fit for timeseries ([9cda54f](9cda54f)), closes [#628](#628)
* **axis:** improve tick label size calculation ([8dc08bd](8dc08bd)), closes [#323](#323) [#324](#324)
* **axis:** Round float numbers from 'binary floating point' ([bd2fbbe](bd2fbbe)), closes [#222](#222) [#320](#320)
* **Axis:** Fix text alignment when legend is not showing ([620d737](620d737)), closes [#25](#25) [#686](#686)
* **Axis:** Fix tick text position ([0ca6b18](0ca6b18)), closes [#672](#672) [#678](#678)
* **bar:** Adjust bar width regardless tick count limit ([8f92d3e](8f92d3e)), closes [#166](#166) [#182](#182)
* **bar:** Fix bar position on width option ([0883588](0883588)), closes [#720](#720) [#832](#832)
* **bar:** Remove new line chars on path string ([#533](#533)) ([1f9db5a](1f9db5a)), closes [#530](#530)
* **bower:** add scss source files to bower package ([945ee66](945ee66))
* **bubble,point:** Fix bubble size change on load API ([#214](#214)) ([d9eb371](d9eb371)), closes [#163](#163)
* **chart:** Correct data label text prop ref ([d9f4477](d9f4477)), closes [#780](#780) [#781](#781)
* **color:** Correct the way on setting pattern value ([#509](#509)) ([164a3f9](164a3f9)), closes [#507](#507)
* **color:** Remove importing schemeCategory10 ([72864c5](72864c5)), closes [#298](#298) [#373](#373)
* **colors:** Fix color method ([8effaad](8effaad)), closes [#233](#233)
* **data:** babel transform bug ([1f8efc2](1f8efc2)), closes [#17](#17) [#18](#18)
* **data:** Correct data label text to be shown on scatter ([#492](#492)) ([f9f0081](f9f0081)), closes [#488](#488)
* **data:** Correct data order to not be altered ([e39db91](e39db91)), closes [#379](#379) [#412](#412)
* **data:** Correct data.onclick calls ([#203](#203)) ([a5fd3fc](a5fd3fc)), closes [#202](#202)
* **data:** Correct onover/out callback on touch ([#769](#769)) ([9ad9817](9ad9817)), closes [#768](#768)
* **data:** Fix data indexing ([2e3010b](2e3010b)), closes [#863](#863)
* **data:** Fix empty label text flickering ([173990b](173990b)), closes [#901](#901)
* **data:** Remove selection on data.onmin/max ([#143](#143)) ([7709c32](7709c32)), closes [#8](#8)
* **data,interaction:** Bar type interaction error on multiple x ([cf49d71](cf49d71)), closes [#178](#178) [#180](#180)
* **data.convert:** allow dots in json properties ([7ff837a](7ff837a)), closes [#14](#14)
* **dev-env:** Update main entry point ([1488232](1488232)), closes [#391](#391) [#525](#525) [#549](#549)
* **domain:** Fix getting Y domain min/max value ([864e112](864e112)), closes [#685](#685) [#690](#690)
* **event:** Correct on resizing all generated charts ([10d6d73](10d6d73)), closes [#404](#404) [#466](#466) [#468](#468)
* **gauge:** Correct background rendering on fullCircle ([#141](#141)) ([7f5fda2](7f5fda2)), closes [#140](#140)
* **grid:** Correct grid position ([5a7a94d](5a7a94d)), closes [#820](#820) [#821](#821)
* **grid:** Correct grid scale on zoom ([2904d41](2904d41)), closes [#799](#799)
* **grid:** Correct updating grid's attributes ([#414](#414)) ([1662a1f](1662a1f)), closes [#389](#389)
* **interaction:** Correct drag selection error ([#493](#493)) ([f38cd24](f38cd24)), closes [#490](#490)
* **interaction:** Correct event binding ([#27](#27)) ([f09d2ed](f09d2ed)), closes [#24](#24)
* **interaction:** Correct mouse event create ([#252](#252)) ([930f74b](930f74b)), closes [#251](#251)
* **interaction:** Correct rect element sizing ([6a09985](6a09985)), closes [#522](#522) [#523](#523)
* **interaction:** Prioritize mouse input ([#280](#280)) ([5cc3442](5cc3442)), closes [#92](#92)
* **internal:** Correct evaluating inputType condition ([#257](#257)) ([4b1f3cc](4b1f3cc)), closes [#92](#92)
* **internal:** Fix on unexpected resize event firing ([#572](#572)) ([dd5af9c](dd5af9c)), closes [#571](#571)
* **label:** Correct newly added texts transition position ([f81d440](f81d440)), closes [#648](#648) [#718](#718)
* **legend:** Correct legend positioning ([51ee8ce](51ee8ce)), closes [#737](#737) [#737](#737) [#752](#752)
* **legend:** Correct to keep the original class value ([46ebf35](46ebf35)), closes [#444](#444)
* **legend:** Fix legend template update for dynamic loading ([#622](#622)) ([1e465ae](1e465ae)), closes [#621](#621)
* **legend:** Fix resize for arc ([#707](#707)) ([89a3ece](89a3ece)), closes [#705](#705)
* **legend:** Fix resizing when legend template is used ([#706](#706)) ([87294dd](87294dd)), closes [#705](#705)
* **Legend:** working with useless transition effect ([676b1e5](676b1e5)), closes [#25](#25) [#41](#41)
* **line:** Correct on rotated step type ([#474](#474)) ([74bd639](74bd639)), closes [#471](#471)
* **line:** Correct zoom with data.regions ([a76000a](a76000a)), closes [#728](#728) [#729](#729)
* **line:** Fix areaGradient for spaced data name ([3fbd4b2](3fbd4b2)), closes [#930](#930)
* **line:** Fix gradient with dataname starting w/no ([fe31102](fe31102)), closes [#936](#936)
* **options:** Correct when bindto element not exist ([448a45d](448a45d)), closes [#743](#743) [#749](#749)
* **pie:** Correct multiline label text ([9bacb9b](9bacb9b)), closes [#784](#784)
* **point:** Check for node.childNodes existance for IE / Edge ([59a5a05](59a5a05)), closes [#601](#601) [#602](#602)
* **point:** Correct point expansion on old IEs ([2e9dbfe](2e9dbfe)), closes [#897](#897)
* **point:** Fix custom point hover position ([2edb82a](2edb82a)), closes [#618](#618) [#700](#700)
* **radar:** Correct on resizing ([#540](#540)) ([f2fdecc](f2fdecc)), closes [#497](#497)
* **radar:** Fix data.onover/out callback ([91c8df2](91c8df2)), closes [#768](#768) [#773](#773)
* **radar:** Fix incorrect rendering ([#738](#738)) ([f8915e2](f8915e2)), closes [#735](#735)
* **readme:** Change broken link about license ([#188](#188)) ([a9a1e09](a9a1e09))
* **regions:** Fix regions resizing on zoom ([#561](#561)) ([c61960d](c61960d)), closes [#483](#483)
* **selection:** Correct multiple callback calls ([#120](#120)) ([f7cae57](f7cae57)), closes [#117](#117)
* **selection:** Correct multiple selection error ([#455](#455)) ([353f809](353f809)), closes [#445](#445)
* **selection:** Correct on data selection ([#113](#113)) ([eb13350](eb13350)), closes [#112](#112)
* **shape:** Correct newly added points transition position ([d9dc75a](d9dc75a)), closes [#648](#648) [#659](#659)
* **shape:** Fix for empty data in normalization ([#649](#649)) ([76f3558](76f3558)), closes [#623](#623)
* **shape:** Fix normalization on hidden data ([#645](#645)) ([aba9496](aba9496)), closes [#643](#643)
* **shape:** line.step.type config not working ([#86](#86)) ([62273bf](62273bf)), closes [#85](#85)
* **shape:** Prevent when non-existed data.hide is given ([#650](#650)) ([6a72602](6a72602)), closes [#623](#623)
* **shape, api.zoom:** fix zoom for barchart ([917384f](917384f)), closes [#16](#16) [#32](#32)
* **shape.line:** Correct getting shape object ([#47](#47)) ([b2a0acf](b2a0acf)), closes [#10](#10)
* **shape.line:** Correct return type ([#148](#148)) ([3317183](3317183)), closes [#147](#147)
* **size:** Correct height increase during resize ([#223](#223)) ([9699a55](9699a55)), closes [#155](#155) [#164](#164)
* **size:** Correct width on resizing ([#189](#189)) ([5a93a19](5a93a19)), closes [#179](#179)
* **subchart:** Correct subchart extent option ([eac3e65](eac3e65)), closes [#142](#142) [#805](#805)
* **subchart:** Maintain subchart selection on resize ([c7d7fa5](c7d7fa5)), closes [#778](#778)
* **subchart:** Maintaion selection for category x axis ([3f46609](3f46609)), closes [#778](#778)
* **tiles:** Fix background tiles id ([c452b43](c452b43)), closes [#225](#225) [#226](#226)
* **tooltip:** Correct interaction on mobile ([23ff1df](23ff1df)), closes [#376](#376) [#377](#377)
* **tooltip:** Correct on toggling data series ([#253](#253)) ([e7d1b19](e7d1b19)), closes [#240](#240)
* **tooltip:** Enhancement for overlapped points ([3ee694d](3ee694d)), closes [#568](#568) [#569](#569)
* **tooltip:** Fix for dynamically loaded data adding column ([009d3b1](009d3b1)), closes [#660](#660) [#661](#661)
* **tooltip:** Fix for mobile environment ([#616](#616)) ([981bc77](981bc77)), closes [#593](#593)
* **tooltip:** Fix handling on color tile ([#875](#875)) ([56c2f99](56c2f99)), closes [#816](#816) [#816](#816)
* **tooltip:** Fix mid value showing for area-range type ([#598](#598)) ([a9d615b](a9d615b)), closes [#597](#597)
* **tooltip:** Fix on ungrouped tooltip showing for custom shape ([#548](#548)) ([9411758](9411758)), closes [#547](#547) [#241](#241)
* **tooltip:** Fix tooltip.show() for multi x axis ([aaa8293](aaa8293)), closes [#785](#785)
* **tooltip:** Make linked tooltip to work based on index ([2df0a38](2df0a38)), closes [#494](#494) [#496](#496)
* **tooltip:** Non linked tooltip exclusion ([feeb536](feeb536)), closes [#393](#393) [#396](#396)
* **ua:** Fix the side-effect by refactoring ([#898](#898)) ([d00d903](d00d903))
* **zoom:** Correct not firing data.onclick callback ([7368446](7368446)), closes [#583](#583) [#584](#584)
* **zoom:** Correct not to re-scale while zoom is disabled ([#273](#273)) ([502d6fd](502d6fd)), closes [#272](#272)
* **zoom:** Correct zoom in rendering on 0 coord. ([f61b792](f61b792)), closes [#169](#169) [#170](#170)
* **zoom:** Correct zoom resizing ([#139](#139)) ([67e863e](67e863e)), closes [#60](#60)
* **zoom:** Correct zoom.range() to work ([6830e5c](6830e5c)), closes [#290](#290) [#291](#291)
* **zoom:** Correct zooming for category axis type ([#441](#441)) ([c8a164a](c8a164a)), closes [#177](#177)
* **zoom:** Fix on .zoom() API  ([cd0d109](cd0d109)), closes [#581](#581) [#582](#582)
* **zoom:** Fix on rotated axis ([#892](#892)) ([983d970](983d970)), closes [#736](#736) [#818](#818)
* **zoom:** Fix on zoom.rescale option ([#566](#566)) ([851ec3e](851ec3e)), closes [#470](#470)
* **zoom:** Fix tooltip pos for bubble/scatter ([1fc9c16](1fc9c16)), closes [#906](#906)
* **zoom:** Fix zoom level reset ([ec24c2c](ec24c2c)), closes [#913](#913)
* **zoom:** Fix zoom rescale by wheel ([585d607](585d607)), closes [#890](#890)
* **zoom:** Maintain zoommed scale on .zoom() ([7b7a274](7b7a274)), closes [#654](#654) [#702](#702)
* **Zoom:** Updated domain values onzoom/onzoomend ([acf3239](acf3239)), closes [#770](#770) [#777](#777)

### Features

* **all:** Add TS definition  ([8b34691](8b34691)), closes [#629](#629) [#682](#682)
* **api:** Intent to ship .config() ([b0dc53a](b0dc53a)), closes [#502](#502) [#545](#545)
* **arc:** Enhance multiline text label ([7e57c67](7e57c67)), closes [#784](#784)
* **Arc:** Implement multiline donut title ([b816dc0](b816dc0)), closes [#71](#71) [#130](#130)
* **area:** Intent to ship area.linearGradient ([0063a4c](0063a4c)), closes [#755](#755) [#800](#800)
* **axis:** Enhancement on tick multiline ([#386](#386)) ([4178e40](4178e40)), closes [#381](#381)
* **axis:** Inten to ship axis.x.tick.tooltip ([94a8650](94a8650)), closes [#236](#236) [#240](#240)
* **axis:** Intent to ship axis clipPath option ([#459](#459)) ([e9fb973](e9fb973)), closes [#458](#458)
* **axis:** Intent to ship multi Axes ([becd3c3](becd3c3)), closes [#98](#98) [#697](#697) [#699](#699)
* **axis:** Intent to ship tick show options ([#746](#746)) ([89c1aa2](89c1aa2)), closes [#737](#737)
* **axis:** Intent to ship tick.text.position ([#426](#426)) ([816ce2a](816ce2a)), closes [#380](#380)
* **axis:** Pass category name param ([#329](#329)) ([7e06851](7e06851)), closes [#327](#327)
* **bar:** Intent to ship bar.radius option ([#476](#476)) ([17e2b41](17e2b41)), closes [#359](#359)
* **bar:** Intent to ship variant width ([ae46c85](ae46c85)), closes [#720](#720) [#724](#724)
* **bubble:** Intent to ship bubble type ([#195](#195)) ([c80d78f](c80d78f)), closes [#163](#163)
* **Chart:** Expose primary node elements ([#511](#511)) ([de3f60c](de3f60c)), closes [#423](#423)
* **ChartInternal,Options:** Add before/after initialization callbacks ([354d7e2](354d7e2)), closes [#55](#55) [#126](#126)
* **ChartInternal,Options:** Add new clipPath option ([6531692](6531692)), closes [#56](#56) [#95](#95)
* **color:** Intent to ship color.onover ([5ec2d9e](5ec2d9e)), closes [#754](#754) [#768](#768) [#772](#772)
* **core:** Intent to ship global config ([1b524e1](1b524e1)), closes [#932](#932)
* **core:** Intent to ship instance property ([#315](#315)) ([d20c68d](d20c68d)), closes [#308](#308)
* **data:** Intent to ship data.labels.centered ([cbe95b7](cbe95b7)), closes [#876](#876)
* **data:** Intent to ship data.labels.colors ([c10c946](c10c946)), closes [#871](#871)
* **data:** Intent to ship data.min()/max() ([e9f1417](e9f1417)), closes [#637](#637) [#638](#638)
* **data,Options:** Implement data.onmin/onmax callback ([6a88a74](6a88a74)), closes [#8](#8) [#125](#125)
* **data.type:** Intent to ship 'area-range' charts ([9fd9577](9fd9577)), closes [#277](#277) [#293](#293)
* **export:** Intent to ship export as an image ([9ad9956](9ad9956)), closes [#78](#78) [#213](#213)
* **gauge:** Enhance display multiline labels ([#516](#516)) ([3a1267e](3a1267e)), closes [#442](#442)
* **gauge:** Intent to ship stack data ([0d7fb3e](0d7fb3e)), closes [#580](#580)
* **grid:** Intent to ship grid.front option ([#385](#385)) ([58621a0](58621a0)), closes [#384](#384)
* **interaction:** Add new inputType.touch.preventDefault option ([baa7a7a](baa7a7a)), closes [#82](#82) [#88](#88)
* **legend:** Add argument to legend template ([2ecab0d](2ecab0d)), closes [#302](#302) [#322](#322)
* **legend:** Add shapes to legend ([a0b6542](a0b6542)), closes [#269](#269) [#289](#289)
* **legend:** Implement legend.contents ([26de147](26de147)), closes [#58](#58) [#134](#134)
* **line:** Ability to hide points for linecharts only ([3d217cc](3d217cc)), closes [#520](#520) [#521](#521)
* **option:** Intent to ship bar.padding option ([#370](#370)) ([6671e63](6671e63)), closes [#335](#335)
* **Options:** Add custom classname for bind element ([#212](#212)) ([22cee47](22cee47)), closes [#201](#201)
* **Options:** Implement color.tile option ([bec92dd](bec92dd)), closes [#193](#193) [#196](#196)
* **Options:** New tooltip onshow/onhidden and linked options ([c96d2dd](c96d2dd)), closes [#341](#341)
* **pie:** Enhance innerRadius option ([1668463](1668463)), closes [#856](#856)
* **pie:** Intent to ship pie's pdding and innerRadius options. ([b04ba3d](b04ba3d)), closes [#301](#301) [#304](#304)
* **plugin:** Add support for Stanford Diagrams ([a162cb7](a162cb7)), closes [#829](#829)
* **point:** Allow grouped custom point ([#565](#565)) ([ee12f96](ee12f96)), closes [#562](#562)
* **point:** Implement alternate markers ([8f1b56f](8f1b56f)), closes [#209](#209) [#219](#219)
* **point,bar:** Intent to ship sensitivity ([ebeb30f](ebeb30f)), closes [#831](#831)
* **radar:** Intent to ship multiline axis ([44198e1](44198e1)), closes [#904](#904)
* **radar:** Intent to ship radar type ([#453](#453)) ([7d0da65](7d0da65)), closes [#59](#59)
* **radar:** Intent to ship radar.direction.clockwise ([#543](#543)) ([f17fa7e](f17fa7e)), closes [#464](#464)
* **regions:** Intent to ship dasharray ([ca94580](ca94580)), closes [#491](#491) [#498](#498)
* **shape:** Intent to ship stack.normalize ([3af15a5](3af15a5)), closes [#623](#623) [#643](#643)
* **shape.line:** Add a line_classes option ([5781b5a](5781b5a)), closes [#181](#181)
* **shape.line:** Allow customization of points ([cc2ac8b](cc2ac8b)), closes [#173](#173) [#184](#184)
* **stats:** Intent to ship stats ([bc163b9](bc163b9)), closes [#928](#928)
* **text,Options:** Add new data.labels.position option ([51b09d7](51b09d7)), closes [#57](#57) [#99](#99)
* **theme:** Add new 'graph' theme ([014537a](014537a)), closes [#631](#631) [#647](#647)
* **theme:** Intent to ship css theme ([e113278](e113278)), closes [#241](#241) [#507](#507)
* **title:** Intent to ship multilined title ([#731](#731)) ([171df89](171df89)), closes [#612](#612) [#727](#727)
* **tooltip:** Implement tooltip.order ([db7d0f8](db7d0f8)), closes [#127](#127) [#131](#131)
* **tooltip:** Intent to ship linked tooltip with name ([ae263a1](ae263a1)), closes [#401](#401) [#402](#402)
* **tooltip:** Intent to ship tooltip.contents.template ([c1af5df](c1af5df)), closes [#813](#813)
* **tooltip:** Intent to ship tooltip.contents.text ([c16ab48](c16ab48)), closes [#826](#826)
* **tooltip:** Intent to ship tooltip.doNotHide ([81e2f09](81e2f09)), closes [#812](#812)
* **zoom:** Add option to zoom by dragging ([da2ce10](da2ce10)), closes [#416](#416) [#508](#508) [#513](#513)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants