├── .clang-format
├── .eslintrc.cjs
├── .github
└── workflows
│ ├── cd.yml
│ ├── docker-vizzu-dev-desktop.yml
│ ├── docker-vizzu-dev-wasm.yml
│ └── slack.yml
├── .gitignore
├── .prettierignore
├── .puppeteerrc.cjs
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── FAQ.md
├── LICENSE
├── NOTICE
├── PROJECTS.md
├── README.md
├── docs
├── assets
│ ├── api-overview.svg
│ ├── data
│ │ ├── music_data.csv
│ │ ├── music_data.js
│ │ └── music_data.json
│ ├── favicon.svg
│ ├── javascripts
│ │ ├── analytics
│ │ │ └── head.js
│ │ ├── csv2js.js
│ │ ├── extlinks.js
│ │ ├── highlight.js
│ │ ├── iframe
│ │ │ ├── autoheight.js
│ │ │ ├── autoscale.js
│ │ │ └── click.js
│ │ ├── mdchart.js
│ │ ├── snippet.js
│ │ ├── style_ref_allbtn.js
│ │ ├── style_ref_clickevent.js
│ │ └── thumbs.js
│ ├── logo-white.svg
│ └── stylesheets
│ │ ├── chart.css
│ │ ├── gallery.css
│ │ ├── highlight.css
│ │ ├── style_reference.css
│ │ └── vizzu.css
├── examples
│ └── index.md
├── installation.md
├── reference
│ └── index.md
└── tutorial
│ ├── .eslintrc.cjs
│ ├── aggregating_data.md
│ ├── aggregating_data
│ ├── 01_a.js
│ ├── 01_b.js
│ ├── 01_c.js
│ ├── 01_d.js
│ ├── 02_a.js
│ ├── 02_b.js
│ ├── 03_a.js
│ ├── 03_b.js
│ ├── 04_a.js
│ ├── 04_b.js
│ ├── 05_a.js
│ ├── 05_b.js
│ ├── 06_a.js
│ ├── 06_b.js
│ ├── 07_a.js
│ ├── 07_b.js
│ └── config.js
│ ├── align_range.md
│ ├── align_range
│ ├── 01.js
│ ├── 02_a.js
│ ├── 02_b.js
│ ├── 03_a.js
│ ├── 03_b.js
│ ├── 04_a.js
│ ├── 04_b.js
│ ├── 05_a.js
│ ├── 05_b.js
│ ├── 06_a.js
│ ├── 06_b.js
│ └── config.js
│ ├── animation_control_keyframes.md
│ ├── animation_control_keyframes
│ ├── 01.js
│ ├── 02_a.js
│ ├── 02_b.js
│ ├── 03_a.js
│ ├── 03_b.js
│ └── config.js
│ ├── animation_options.md
│ ├── animation_options
│ ├── 01.js
│ ├── 02_a.js
│ ├── 02_b.js
│ ├── 03_a.js
│ ├── 03_b.js
│ ├── 04_a.js
│ ├── 04_b.js
│ ├── 05_a.js
│ ├── 05_b.js
│ ├── 06_a.js
│ ├── 06_b.js
│ └── config.js
│ ├── assets
│ ├── chart-gen-overview.svg
│ ├── setup
│ │ ├── init.md
│ │ ├── setup_a.md
│ │ ├── setup_b.js
│ │ ├── setup_b.md
│ │ ├── setup_c.js
│ │ └── setup_c.md
│ └── snippet.js
│ ├── axes_title_tooltip.md
│ ├── axes_title_tooltip
│ ├── 01.js
│ ├── 02.js
│ ├── 03.js
│ ├── 04_a.js
│ ├── 04_b.js
│ ├── 05.js
│ ├── 06.js
│ └── config.js
│ ├── changing_dimensions.md
│ ├── changing_dimensions
│ ├── 01.js
│ ├── 02_a.js
│ ├── 02_b.js
│ ├── 03_a.js
│ ├── 03_b.js
│ ├── 04_a.js
│ ├── 04_b.js
│ ├── 05_a.js
│ ├── 05_b.js
│ └── config.js
│ ├── channels_legend.md
│ ├── channels_legend
│ ├── 01.js
│ ├── 02_a.js
│ ├── 02_b.js
│ ├── 03_a.js
│ ├── 03_b.js
│ ├── 04_a.js
│ ├── 04_b.js
│ └── config.js
│ ├── chart_layout.md
│ ├── chart_layout
│ ├── 01.js
│ ├── 02_a.js
│ ├── 02_b.js
│ ├── 03.js
│ ├── 04_a.js
│ ├── 04_b.js
│ ├── 05.js
│ ├── 06_a.js
│ ├── 06_b.js
│ ├── 07.js
│ └── config.js
│ ├── chart_presets.md
│ ├── chart_presets
│ ├── 01_a.js
│ ├── 01_b.js
│ ├── 02_a.js
│ ├── 02_b.js
│ ├── 03_a.js
│ ├── 03_b.js
│ └── config.js
│ ├── color_palette_fonts.md
│ ├── color_palette_fonts
│ ├── 01_a.js
│ ├── 01_b.js
│ ├── 02_a.js
│ ├── 02_b.js
│ ├── 03_a.js
│ ├── 03_b.js
│ ├── 04_a.js
│ ├── 04_b.js
│ ├── 05_a.js
│ ├── 05_b.js
│ └── config.js
│ ├── data.md
│ ├── events.md
│ ├── events
│ ├── 01.js
│ ├── 02_a.js
│ ├── 02_b.js
│ ├── 03_a.js
│ ├── 03_b.js
│ ├── 04_a.js
│ ├── 04_b.js
│ └── config.js
│ ├── filter_add_new_records.md
│ ├── filter_add_new_records
│ ├── 01.js
│ ├── 02_a.js
│ ├── 02_b.js
│ ├── 03_a.js
│ ├── 03_b.js
│ ├── 04_a.js
│ ├── 04_b.js
│ └── config.js
│ ├── geometry.md
│ ├── geometry
│ ├── 01.js
│ ├── 02_a.js
│ ├── 02_b.js
│ ├── 03_a.js
│ ├── 03_b.js
│ ├── 04_a.js
│ ├── 04_b.js
│ └── config.js
│ ├── group_stack.md
│ ├── group_stack
│ ├── 01.js
│ ├── 02_a.js
│ ├── 02_b.js
│ ├── 03_a.js
│ ├── 03_b.js
│ ├── 04_a.js
│ ├── 04_b.js
│ └── config.js
│ ├── index.md
│ ├── initialization.md
│ ├── orientation_split_polar.md
│ ├── orientation_split_polar
│ ├── 01.js
│ ├── 02_a.js
│ ├── 02_b.js
│ ├── 03_a.js
│ ├── 03_b.js
│ ├── 04_a.js
│ ├── 04_b.js
│ ├── 05_a.js
│ ├── 05_b.js
│ └── config.js
│ ├── shorthands_store.md
│ ├── shorthands_store
│ ├── 01.js
│ ├── 02.js
│ ├── 03_a.js
│ ├── 03_b.js
│ ├── 04_a.js
│ ├── 04_b.js
│ ├── 05_a.js
│ ├── 05_b.js
│ ├── 06_a.js
│ ├── 06_b.js
│ ├── 07_a.js
│ ├── 07_b.js
│ ├── 08.js
│ ├── 09.js
│ └── config.js
│ ├── sorting.md
│ ├── sorting
│ ├── 01.js
│ ├── 02_a.js
│ ├── 02_b.js
│ ├── 03_a.js
│ ├── 03_b.js
│ ├── 04_a.js
│ ├── 04_b.js
│ ├── 05_a.js
│ ├── 05_b.js
│ └── config.js
│ ├── stacking_explanation.md
│ ├── stacking_explanation
│ ├── 01_a.js
│ ├── 01_b.js
│ ├── 01_c.js
│ ├── 01_d.js
│ ├── config.js
│ └── data.js
│ ├── style.md
│ ├── without_coordinates_noop_channel.md
│ ├── without_coordinates_noop_channel
│ ├── 01.js
│ ├── 02_a.js
│ ├── 02_b.js
│ ├── 03_a.js
│ ├── 03_b.js
│ └── config.js
│ └── writing_plugins.md
├── package-lock.json
├── package.json
├── project
└── cmake
│ ├── CMakeLists.txt
│ ├── common.txt
│ ├── emcc.txt
│ ├── guicommon.txt
│ ├── includes.txt
│ ├── lib
│ └── CMakeLists.txt
│ ├── link.txt
│ ├── qtest
│ └── CMakeLists.txt
│ ├── test
│ └── CMakeLists.txt
│ ├── tests.txt
│ ├── todochk.txt
│ ├── version.txt
│ └── weblib
│ ├── CMakeLists.txt
│ ├── emcc.txt
│ └── gen.txt
├── src
├── .clang-tidy
├── .eslintrc.cjs
├── apps
│ ├── qutils
│ │ ├── canvas.cpp
│ │ └── canvas.h
│ └── weblib
│ │ ├── .gitignore
│ │ ├── canvas.yaml
│ │ ├── cinterface.cpp
│ │ ├── cinterface.h
│ │ ├── interface.cpp
│ │ ├── interface.h
│ │ ├── interface.js
│ │ ├── interfacejs.h
│ │ ├── jscriptcanvas.cpp
│ │ ├── jscriptcanvas.h
│ │ ├── jsfunctionwrapper.h
│ │ ├── objectregistry.h
│ │ ├── ts-api
│ │ ├── animcompleting.ts
│ │ ├── animcontrol.ts
│ │ ├── chart.ts
│ │ ├── cvizzu.d.ts
│ │ ├── cvizzu.types.d.ts
│ │ ├── data.ts
│ │ ├── datarecord.ts
│ │ ├── errors.ts
│ │ ├── events.ts
│ │ ├── geom.ts
│ │ ├── index.ts
│ │ ├── module
│ │ │ ├── canimctrl.ts
│ │ │ ├── ccanvas.ts
│ │ │ ├── cchart.ts
│ │ │ ├── ccolorgradient.ts
│ │ │ ├── ccoordsys.ts
│ │ │ ├── cdata.ts
│ │ │ ├── cenv.ts
│ │ │ ├── cerror.ts
│ │ │ ├── chart.ts
│ │ │ ├── cproxy.ts
│ │ │ ├── crenderer.ts
│ │ │ ├── loader.ts
│ │ │ ├── module.ts
│ │ │ └── objregistry.ts
│ │ ├── plugins.ts
│ │ ├── plugins
│ │ │ ├── canvasrenderer.ts
│ │ │ ├── clock.ts
│ │ │ ├── coordsys.ts
│ │ │ ├── cssproperties.ts
│ │ │ ├── cssutils.ts
│ │ │ ├── htmlcanvas.ts
│ │ │ ├── logging.ts
│ │ │ ├── pivotdata.ts
│ │ │ ├── pointerevents.ts
│ │ │ ├── presetconfigs.js
│ │ │ ├── presets.ts
│ │ │ ├── rendercontrol.ts
│ │ │ ├── scheduler.ts
│ │ │ ├── shorthands-augmentation.ts
│ │ │ ├── shorthands.ts
│ │ │ ├── tooltip.ts
│ │ │ └── unpivot.ts
│ │ ├── tsconfig.json
│ │ ├── tsutils.ts
│ │ ├── utils.ts
│ │ └── vizzu.ts
│ │ └── typeschema-api
│ │ ├── anim.yaml
│ │ ├── config.yaml
│ │ ├── data.yaml
│ │ └── styles.yaml
├── base
│ ├── alg
│ │ └── merge.h
│ ├── anim
│ │ ├── control.cpp
│ │ ├── control.h
│ │ ├── controllable.h
│ │ ├── duration.cpp
│ │ ├── duration.h
│ │ ├── easing.cpp
│ │ ├── easing.h
│ │ ├── easingfunc.h
│ │ ├── easinggradient.cpp
│ │ ├── easinggradient.h
│ │ ├── element.h
│ │ ├── group.cpp
│ │ ├── group.h
│ │ ├── interpolated.h
│ │ ├── options.h
│ │ ├── sequence.cpp
│ │ └── sequence.h
│ ├── app
│ │ ├── git.h
│ │ ├── version.cpp
│ │ └── version.h
│ ├── conv
│ │ ├── auto_json.h
│ │ ├── numtostr.cpp
│ │ ├── numtostr.h
│ │ ├── parse.h
│ │ └── tostring.h
│ ├── geom
│ │ ├── affinetransform.cpp
│ │ ├── affinetransform.h
│ │ ├── angle.cpp
│ │ ├── angle.h
│ │ ├── bezier.h
│ │ ├── circle.cpp
│ │ ├── circle.h
│ │ ├── line.h
│ │ ├── orientation.h
│ │ ├── point.cpp
│ │ ├── point.h
│ │ ├── polygon.cpp
│ │ ├── polygon.h
│ │ ├── quadrilateral.cpp
│ │ ├── quadrilateral.h
│ │ ├── rect.cpp
│ │ ├── rect.h
│ │ ├── solutions.h
│ │ ├── transformedrect.h
│ │ ├── triangle.cpp
│ │ └── triangle.h
│ ├── gfx
│ │ ├── canvas.h
│ │ ├── color.cpp
│ │ ├── color.h
│ │ ├── colorgradient.cpp
│ │ ├── colorgradient.h
│ │ ├── colorpalette.cpp
│ │ ├── colorpalette.h
│ │ ├── colortransform.cpp
│ │ ├── colortransform.h
│ │ ├── draw
│ │ │ ├── infobubble.cpp
│ │ │ ├── infobubble.h
│ │ │ ├── roundedrect.cpp
│ │ │ ├── roundedrect.h
│ │ │ ├── textbox.cpp
│ │ │ └── textbox.h
│ │ ├── font.cpp
│ │ ├── font.h
│ │ ├── length.cpp
│ │ ├── length.h
│ │ ├── lineargradient.h
│ │ ├── pathsampler.cpp
│ │ └── pathsampler.h
│ ├── gui
│ │ ├── accessories.h
│ │ └── pointer.h
│ ├── io
│ │ ├── log.cpp
│ │ └── log.h
│ ├── math
│ │ ├── floating.h
│ │ ├── fuzzybool.h
│ │ ├── interpolation.h
│ │ ├── normalizednumber.cpp
│ │ ├── normalizednumber.h
│ │ ├── range.h
│ │ ├── renard.cpp
│ │ ├── renard.h
│ │ ├── segmentedfunc.h
│ │ ├── statistics.h
│ │ ├── tolerance.h
│ │ ├── trig.cpp
│ │ └── trig.h
│ ├── refl
│ │ ├── auto_accessor.h
│ │ ├── auto_enum.h
│ │ ├── auto_name.h
│ │ └── auto_struct.h
│ ├── style
│ │ ├── impl.tpp
│ │ ├── param.h
│ │ ├── parammerger.h
│ │ └── sheet.h
│ ├── text
│ │ ├── character.h
│ │ ├── funcstring.cpp
│ │ ├── funcstring.h
│ │ ├── naturalcmp.cpp
│ │ ├── naturalcmp.h
│ │ ├── numberscale.cpp
│ │ ├── numberscale.h
│ │ ├── smartstring.cpp
│ │ ├── smartstring.h
│ │ ├── valueunit.cpp
│ │ └── valueunit.h
│ ├── type
│ │ ├── booliter.h
│ │ ├── physicalvalue.h
│ │ ├── traits.h
│ │ └── uniquelist.h
│ └── util
│ │ ├── event.h
│ │ ├── eventdispatcher.cpp
│ │ └── eventdispatcher.h
├── chart
│ ├── animator
│ │ ├── animation.cpp
│ │ ├── animation.h
│ │ ├── animator.cpp
│ │ ├── animator.h
│ │ ├── keyframe.cpp
│ │ ├── keyframe.h
│ │ ├── morph.cpp
│ │ ├── morph.h
│ │ ├── options.cpp
│ │ ├── options.h
│ │ ├── planner.cpp
│ │ ├── planner.h
│ │ ├── styles.cpp
│ │ └── styles.h
│ ├── generator
│ │ ├── axis.cpp
│ │ ├── axis.h
│ │ ├── buckets.cpp
│ │ ├── buckets.h
│ │ ├── colorbase.h
│ │ ├── colorbuilder.cpp
│ │ ├── guides.cpp
│ │ ├── guides.h
│ │ ├── marker.cpp
│ │ ├── marker.h
│ │ ├── plot.cpp
│ │ ├── plot.h
│ │ ├── plotbuilder.cpp
│ │ ├── plotbuilder.h
│ │ └── plotptr.h
│ ├── main
│ │ ├── chart.cpp
│ │ ├── chart.h
│ │ ├── events.cpp
│ │ ├── events.h
│ │ ├── layout.cpp
│ │ ├── layout.h
│ │ ├── style.cpp
│ │ ├── style.h
│ │ ├── stylesheet.cpp
│ │ ├── stylesheet.h
│ │ ├── version.cpp
│ │ └── version.h
│ ├── options
│ │ ├── align.h
│ │ ├── autoparam.h
│ │ ├── channel.cpp
│ │ ├── channel.h
│ │ ├── channelrange.cpp
│ │ ├── channelrange.h
│ │ ├── channels.cpp
│ │ ├── channels.h
│ │ ├── config.cpp
│ │ ├── config.h
│ │ ├── coordsystem.h
│ │ ├── options.cpp
│ │ ├── options.h
│ │ ├── shapetype.cpp
│ │ ├── shapetype.h
│ │ └── sort.h
│ ├── rendering
│ │ ├── colorbuilder.cpp
│ │ ├── colorbuilder.h
│ │ ├── drawaxes.cpp
│ │ ├── drawaxes.h
│ │ ├── drawbackground.cpp
│ │ ├── drawbackground.h
│ │ ├── drawchart.cpp
│ │ ├── drawchart.h
│ │ ├── drawguides.cpp
│ │ ├── drawguides.h
│ │ ├── drawingcontext.h
│ │ ├── drawinterlacing.cpp
│ │ ├── drawinterlacing.h
│ │ ├── drawlabel.cpp
│ │ ├── drawlabel.h
│ │ ├── drawlegend.cpp
│ │ ├── drawlegend.h
│ │ ├── drawmarkerinfo.cpp
│ │ ├── drawmarkerinfo.h
│ │ ├── drawplot.cpp
│ │ ├── drawplot.h
│ │ ├── logo.cpp
│ │ ├── logo.h
│ │ ├── markerrenderer.cpp
│ │ ├── markerrenderer.h
│ │ ├── markers
│ │ │ ├── abstractmarker.cpp
│ │ │ ├── abstractmarker.h
│ │ │ ├── circlemarker.cpp
│ │ │ ├── circlemarker.h
│ │ │ ├── connectingmarker.cpp
│ │ │ ├── connectingmarker.h
│ │ │ ├── rectanglemarker.cpp
│ │ │ └── rectanglemarker.h
│ │ ├── orientedlabel.cpp
│ │ ├── orientedlabel.h
│ │ ├── painter
│ │ │ ├── coordinatesystem.cpp
│ │ │ ├── coordinatesystem.h
│ │ │ ├── drawline.cpp
│ │ │ ├── drawline.h
│ │ │ ├── drawpolygon.cpp
│ │ │ ├── drawpolygon.h
│ │ │ ├── painter.cpp
│ │ │ ├── painter.h
│ │ │ ├── pathsampler.cpp
│ │ │ └── pathsampler.h
│ │ ├── renderedchart.cpp
│ │ └── renderedchart.h
│ ├── speclayout
│ │ ├── bubblechart.cpp
│ │ ├── bubblechart.h
│ │ ├── bubblechartbuilder.h
│ │ ├── sizedependentlayout.h
│ │ ├── specmarker.h
│ │ ├── tablechart.h
│ │ ├── treemap.cpp
│ │ └── treemap.h
│ └── ui
│ │ ├── chart.cpp
│ │ ├── chart.h
│ │ ├── events.cpp
│ │ └── events.h
├── dataframe
│ ├── impl
│ │ ├── aggregators.cpp
│ │ ├── aggregators.h
│ │ ├── data_source.cpp
│ │ ├── data_source.h
│ │ ├── dataframe.cpp
│ │ └── dataframe.h
│ ├── interface.cpp
│ ├── interface.h
│ └── old
│ │ ├── datatable.cpp
│ │ ├── datatable.h
│ │ └── types.h
└── package.json
├── test
├── .eslintrc.cjs
├── dts
│ └── vizzu.d.ts
├── e2e
│ ├── accept-changes.cjs
│ ├── man.cjs
│ ├── modules
│ │ ├── browser
│ │ │ ├── browsers-chrome.cjs
│ │ │ ├── puppeteer-chrome.cjs
│ │ │ └── selenium-chrome.cjs
│ │ ├── console
│ │ │ ├── assert.cjs
│ │ │ ├── assert.test.cjs
│ │ │ ├── console.cjs
│ │ │ └── console.test.cjs
│ │ ├── e2e-test
│ │ │ ├── client
│ │ │ │ ├── index.html
│ │ │ │ └── index.js
│ │ │ ├── test-case
│ │ │ │ ├── test-case-result.cjs
│ │ │ │ ├── test-case.cjs
│ │ │ │ ├── test-cases-config.cjs
│ │ │ │ ├── test-cases-config.test.cjs
│ │ │ │ ├── test-cases-config.test
│ │ │ │ │ ├── test-cases-1.json
│ │ │ │ │ ├── test-cases-2.json
│ │ │ │ │ ├── test-cases-3.json
│ │ │ │ │ ├── test-cases-notjson.json
│ │ │ │ │ ├── test-cases-notschema
│ │ │ │ │ │ ├── test-cases-notschema-1.json
│ │ │ │ │ │ ├── test-cases-notschema-2.json
│ │ │ │ │ │ ├── test-cases-notschema-3.json
│ │ │ │ │ │ ├── test-cases-notschema-4.json
│ │ │ │ │ │ ├── test-cases-notschema-5.json
│ │ │ │ │ │ ├── test-cases-notschema-6.json
│ │ │ │ │ │ └── test-cases-notschema-7.json
│ │ │ │ │ └── test-cases-result.cjs
│ │ │ │ ├── test-cases.cjs
│ │ │ │ └── test-cases.test.cjs
│ │ │ ├── test-console.cjs
│ │ │ ├── test-console.test.cjs
│ │ │ ├── test-env.cjs
│ │ │ ├── test-env.test.cjs
│ │ │ ├── test-suite-result.cjs
│ │ │ └── test-suite.cjs
│ │ ├── img
│ │ │ └── imgdiff.js
│ │ ├── jest.config.cjs
│ │ ├── videorecorder
│ │ │ ├── .gitignore
│ │ │ ├── client
│ │ │ │ ├── index.html
│ │ │ │ ├── index.js
│ │ │ │ └── videorecorder.js
│ │ │ ├── generate.cjs
│ │ │ └── resize.cjs
│ │ ├── vizzu
│ │ │ ├── vizzu-cloudfunctions.cjs
│ │ │ ├── vizzu-cloudfunctions.test.cjs
│ │ │ ├── vizzu-url.cjs
│ │ │ ├── vizzu-url.test.cjs
│ │ │ ├── vizzu-version-client
│ │ │ │ ├── index.html
│ │ │ │ └── index.js
│ │ │ └── vizzu-version.cjs
│ │ └── workspace
│ │ │ ├── workspace-host.cjs
│ │ │ ├── workspace-path.cjs
│ │ │ └── workspace-path.test.cjs
│ ├── test.cjs
│ ├── test_cases
│ │ ├── basic_animations
│ │ │ ├── anim_order
│ │ │ │ ├── circle_without_2_carte_horizontal.mjs
│ │ │ │ ├── circle_without_2_carte_vertical.mjs
│ │ │ │ ├── rectangle_without_2_carte_bar.mjs
│ │ │ │ ├── rectangle_without_2_carte_column.mjs
│ │ │ │ ├── rectangle_without_2_polar_bar.mjs
│ │ │ │ └── rectangle_without_2_polar_column.mjs
│ │ │ ├── coordsystems
│ │ │ │ ├── area_carte_2_polar.mjs
│ │ │ │ ├── circle_without_2_carte.mjs
│ │ │ │ ├── rectangle_carte_2_polar.mjs
│ │ │ │ ├── rectangle_without_2_carte.mjs
│ │ │ │ └── rectangle_without_2_polar.mjs
│ │ │ ├── labels
│ │ │ │ ├── axis
│ │ │ │ │ └── circle_negative_2dis_3con.mjs
│ │ │ │ ├── marker
│ │ │ │ │ ├── area_2dis_3con.mjs
│ │ │ │ │ ├── circle_negative_2dis_3con.mjs
│ │ │ │ │ ├── line_2dis_3con.mjs
│ │ │ │ │ ├── padding_test_rectangle_negative_2dis_3con.mjs
│ │ │ │ │ └── rectangle_negative_2dis_3con.mjs
│ │ │ │ └── rectangle_labels_rotated_charts.mjs
│ │ │ ├── legend_transitions
│ │ │ │ ├── color_2discrete_anim.mjs
│ │ │ │ ├── color_conti_anim.mjs
│ │ │ │ ├── color_conti_changes_anim.mjs
│ │ │ │ ├── color_conti_discrete_anim.mjs
│ │ │ │ ├── color_discrete_anim.mjs
│ │ │ │ ├── color_discrete_changes_anim.mjs
│ │ │ │ ├── color_off_on_anim.mjs
│ │ │ │ ├── color_off_on_series_anim.mjs
│ │ │ │ ├── lightness_2discrete_anim.mjs
│ │ │ │ ├── lightness_conti_anim.mjs
│ │ │ │ ├── lightness_conti_discrete_anim.mjs
│ │ │ │ ├── lightness_discrete_anim.mjs
│ │ │ │ ├── lightness_on_off_anim.mjs
│ │ │ │ ├── size_2discrete_anim.mjs
│ │ │ │ ├── size_conti_anim.mjs
│ │ │ │ ├── size_conti_discrete_anim.mjs
│ │ │ │ ├── size_discrete_anim.mjs
│ │ │ │ └── size_on_off_anim.mjs
│ │ │ ├── markers_morph
│ │ │ │ ├── marker_trans_neg_1dis_1con.mjs
│ │ │ │ └── marker_trans_polar.mjs
│ │ │ └── someOtherTests
│ │ │ │ ├── merge_split_area_stream_2dis_1con.mjs
│ │ │ │ ├── total_time_area_bar.mjs
│ │ │ │ ├── total_time_area_column.mjs
│ │ │ │ ├── total_time_bar_line.mjs
│ │ │ │ └── total_time_column_line.mjs
│ │ ├── chart_precision
│ │ │ ├── area_negative_x.mjs
│ │ │ ├── area_negative_y.mjs
│ │ │ ├── area_x.mjs
│ │ │ ├── area_y.mjs
│ │ │ ├── bubble.mjs
│ │ │ ├── circle.mjs
│ │ │ ├── circle_negative.mjs
│ │ │ ├── column_color_gradient.mjs
│ │ │ ├── column_lightness.mjs
│ │ │ ├── line_negative_x.mjs
│ │ │ ├── line_negative_y.mjs
│ │ │ ├── line_x.mjs
│ │ │ ├── line_y.mjs
│ │ │ ├── rectangle_negative_x.mjs
│ │ │ ├── rectangle_negative_y.mjs
│ │ │ ├── rectangle_x.mjs
│ │ │ ├── rectangle_y.mjs
│ │ │ └── treemap.mjs
│ │ ├── color_palettes
│ │ │ └── color_conti_gradient.mjs
│ │ ├── data_fault_and_formats
│ │ │ ├── column_rectangle_less_disc.mjs
│ │ │ ├── column_rectangle_more_conti.mjs
│ │ │ ├── column_rectangle_more_disc.mjs
│ │ │ └── rectangle_data_cube.mjs
│ │ ├── lay_out
│ │ │ ├── full_coxcomb_rectangle_2dis_1con.mjs
│ │ │ ├── full_line_negative_2dis_1con.mjs
│ │ │ ├── legend_plot_coxcomb_rectangle_2dis_1con.mjs
│ │ │ ├── legend_plot_line_negative_2dis_1con.mjs
│ │ │ ├── plot_coxcomb_rectangle_2dis_1con.mjs
│ │ │ ├── plot_line_negative_2dis_1con.mjs
│ │ │ ├── title_plot_coxcomb_rectangle_2dis_1con.mjs
│ │ │ └── title_plot_line_negative_2dis_1con.mjs
│ │ ├── operations
│ │ │ ├── all_operations.mjs
│ │ │ ├── all_operations_sizeing.mjs
│ │ │ ├── drilldown_aggregate_tutorial_data
│ │ │ │ ├── area_drilldown_aggregate.mjs
│ │ │ │ ├── circle_drilldown_aggregate.mjs
│ │ │ │ ├── circle_drilldown_aggregate_bubble.mjs
│ │ │ │ ├── line_drilldown_aggregate_x.mjs
│ │ │ │ ├── line_drilldown_aggregate_y.mjs
│ │ │ │ ├── rectangle_drilldown_aggregate_X.mjs
│ │ │ │ ├── rectangle_drilldown_aggregate_Y.mjs
│ │ │ │ └── rectangle_drilldown_aggregate_treemap.mjs
│ │ │ ├── filter_tutorial_data
│ │ │ │ ├── area_filter_x.mjs
│ │ │ │ ├── area_filter_y.mjs
│ │ │ │ ├── circle_filter.mjs
│ │ │ │ ├── circle_filter_bubble.mjs
│ │ │ │ ├── filter_off_anim.mjs
│ │ │ │ ├── line_filter_x.mjs
│ │ │ │ ├── line_filter_y.mjs
│ │ │ │ ├── rectangle_filter_treemap.mjs
│ │ │ │ ├── rectangle_filter_x.mjs
│ │ │ │ └── rectangle_filter_y.mjs
│ │ │ ├── group_stack_tutorial_data
│ │ │ │ ├── area_group_stack.mjs
│ │ │ │ ├── bubble_group_stack.mjs
│ │ │ │ ├── line_group_stack.mjs
│ │ │ │ └── treemap_group_stack.mjs
│ │ │ ├── histogram_2_drilldown_negative_1dis_1con.mjs
│ │ │ ├── orientation_tutorial_data
│ │ │ │ ├── area_orientation.mjs
│ │ │ │ ├── line_orientation.mjs
│ │ │ │ └── rectangle_orientation.mjs
│ │ │ └── split_merge_tutorial_data
│ │ │ │ ├── area_split_merge.mjs
│ │ │ │ ├── circle_split_merge.mjs
│ │ │ │ ├── line_split_merge.mjs
│ │ │ │ └── rectangle_split_merge.mjs
│ │ ├── shorthands
│ │ │ └── column_shorthands.mjs
│ │ ├── static_chart_types
│ │ │ ├── cartesian_coo_sys
│ │ │ │ ├── area_1dis_1con.mjs
│ │ │ │ ├── area_negative_1dis_1con.mjs
│ │ │ │ ├── bar_rectangle_negative_1dis_1con.mjs
│ │ │ │ ├── bar_stacked_rectangle_negative_2dis_1con.mjs
│ │ │ │ ├── column_grouped_rectangle_negative_2dis_1con.mjs
│ │ │ │ ├── column_stacked_rectangle_1dis_1con.mjs
│ │ │ │ ├── column_stacked_rectangle_negative_2dis_1con.mjs
│ │ │ │ ├── column_stacked_rectangle_negative_3dis_1con.mjs
│ │ │ │ ├── dotplot_circle_negative_1dis_1con.mjs
│ │ │ │ ├── histogram_rectangle_negative_1dis_1con.mjs
│ │ │ │ ├── icicle_rectangle_2dis_1con.mjs
│ │ │ │ ├── line_negative_1dis_1con.mjs
│ │ │ │ ├── line_negative_2dis_1con.mjs
│ │ │ │ ├── marimekko_rectangle_1dis_2con.mjs
│ │ │ │ ├── marimekko_rectangle_2dis_2con.mjs
│ │ │ │ ├── scatterplot_circle_negative_1dis_1con.mjs
│ │ │ │ ├── scatterplot_circle_negative_1dis_2con.mjs
│ │ │ │ ├── scatterplot_circle_negative_2dis_3con.mjs
│ │ │ │ ├── stacked_area_negative_2dis_1con.mjs
│ │ │ │ ├── waterfall_rectangle_bar_negative_2dis_2con.mjs
│ │ │ │ └── waterfall_rectangle_negative_2dis_1con.mjs
│ │ │ ├── polar_coo_sys
│ │ │ │ ├── NO_spiderweb_area_2dis_1con.mjs
│ │ │ │ ├── NO_spiderweb_line_2dis_1con.mjs
│ │ │ │ ├── coxcomb_rectangle_1dis_1con.mjs
│ │ │ │ ├── coxcomb_stacked_rectangle_2dis_1con.mjs
│ │ │ │ ├── coxcomb_stacked_rectangle_2dis_2con.mjs
│ │ │ │ ├── radial_rectangle_1dis_1con.mjs
│ │ │ │ ├── radial_rectangle_2dis_1con.mjs
│ │ │ │ ├── radial_stacked_rectangle_2dis_1con.mjs
│ │ │ │ ├── spiderweb_area_1dis_1con.mjs
│ │ │ │ ├── spiderweb_line_1dis_1con.mjs
│ │ │ │ ├── sunburst_rectangle_2dis_1con.mjs
│ │ │ │ └── sunburst_rectangle_2dis_2con.mjs
│ │ │ └── without_coo_sys
│ │ │ │ ├── bubble_circle_1dis_2con.mjs
│ │ │ │ ├── bubble_circle_2dis_1con.mjs
│ │ │ │ ├── bubble_circle_2dis_2con.mjs
│ │ │ │ ├── treemap_rectangle_2dis_1con.mjs
│ │ │ │ └── treemap_rectangle_2dis_2con.mjs
│ │ ├── test_cases.json
│ │ ├── web_content
│ │ │ ├── analytical_operations
│ │ │ │ ├── change_dimension
│ │ │ │ │ ├── area_polar_stacked.mjs
│ │ │ │ │ ├── area_stacked.mjs
│ │ │ │ │ ├── column_stacked.mjs
│ │ │ │ │ ├── dotplot_1.mjs
│ │ │ │ │ ├── dotplot_2.mjs
│ │ │ │ │ ├── dotplot_polar.mjs
│ │ │ │ │ ├── line.mjs
│ │ │ │ │ └── line_polar.mjs
│ │ │ │ ├── compare
│ │ │ │ │ ├── area_100percent_stacked.mjs
│ │ │ │ │ ├── area_polar_split.mjs
│ │ │ │ │ ├── area_polar_stacked.mjs
│ │ │ │ │ ├── area_split_stacked.mjs
│ │ │ │ │ ├── area_stacked.mjs
│ │ │ │ │ ├── column_100percent_stacked.mjs
│ │ │ │ │ ├── column_groupped_1.mjs
│ │ │ │ │ ├── column_groupped_2.mjs
│ │ │ │ │ ├── column_split_stacked_1.mjs
│ │ │ │ │ ├── column_split_stacked_2.mjs
│ │ │ │ │ ├── column_stacked_1.mjs
│ │ │ │ │ ├── column_stacked_2.mjs
│ │ │ │ │ ├── coxcomb_1.mjs
│ │ │ │ │ ├── coxcomb_2.mjs
│ │ │ │ │ ├── line.mjs
│ │ │ │ │ ├── line_polar.mjs
│ │ │ │ │ ├── stream_stacked.mjs
│ │ │ │ │ └── waterfall.mjs
│ │ │ │ ├── distribute
│ │ │ │ │ ├── existingmeasure_area_stacked.mjs
│ │ │ │ │ ├── existingmeasure_bubble.mjs
│ │ │ │ │ ├── existingmeasure_bubble_stacked_1.mjs
│ │ │ │ │ ├── existingmeasure_bubble_stacked_2.mjs
│ │ │ │ │ ├── existingmeasure_column_stacked.mjs
│ │ │ │ │ ├── existingmeasure_coxcomb.mjs
│ │ │ │ │ ├── existingmeasure_dotplot.mjs
│ │ │ │ │ ├── existingmeasure_scatterplot.mjs
│ │ │ │ │ ├── existingmeasure_scatterplot_split.mjs
│ │ │ │ │ ├── existingmeasure_treemap_stacked.mjs
│ │ │ │ │ ├── newmeasure_column.mjs
│ │ │ │ │ ├── newmeasure_column_split_stacked.mjs
│ │ │ │ │ ├── newmeasure_column_stacked.mjs
│ │ │ │ │ ├── newmeasure_dotplot_1.mjs
│ │ │ │ │ ├── newmeasure_dotplot_2.mjs
│ │ │ │ │ ├── newmeasure_dotplot_3.mjs
│ │ │ │ │ └── newmeasure_dotplot_4.mjs
│ │ │ │ ├── drilldown
│ │ │ │ │ ├── area.mjs
│ │ │ │ │ ├── area_polar.mjs
│ │ │ │ │ ├── bubble_and_distribution.mjs
│ │ │ │ │ ├── column_1.mjs
│ │ │ │ │ ├── column_2.mjs
│ │ │ │ │ ├── column_3.mjs
│ │ │ │ │ ├── column_4.mjs
│ │ │ │ │ ├── column_stacked.mjs
│ │ │ │ │ ├── donut.mjs
│ │ │ │ │ ├── line_1.mjs
│ │ │ │ │ ├── line_2.mjs
│ │ │ │ │ ├── line_polar_1.mjs
│ │ │ │ │ ├── line_polar_2.mjs
│ │ │ │ │ ├── radial.mjs
│ │ │ │ │ └── scatterplot.mjs
│ │ │ │ ├── filter
│ │ │ │ │ ├── area_polar_stacked.mjs
│ │ │ │ │ ├── area_stacked.mjs
│ │ │ │ │ ├── line.mjs
│ │ │ │ │ ├── line_polar.mjs
│ │ │ │ │ ├── stream_1.mjs
│ │ │ │ │ └── stream_2.mjs
│ │ │ │ ├── misc
│ │ │ │ │ ├── donut_to_coxcomb.mjs
│ │ │ │ │ ├── make_space_with_polar.mjs
│ │ │ │ │ ├── orientation_marimekko.mjs
│ │ │ │ │ └── pie_to_donut.mjs
│ │ │ │ ├── split
│ │ │ │ │ ├── area_polar_stacked.mjs
│ │ │ │ │ ├── area_stacked.mjs
│ │ │ │ │ ├── column_100percent_stacked.mjs
│ │ │ │ │ ├── column_stacked.mjs
│ │ │ │ │ ├── coxcomb.mjs
│ │ │ │ │ ├── radial_stacked.mjs
│ │ │ │ │ ├── scatterplot_1.mjs
│ │ │ │ │ └── scatterplot_2.mjs
│ │ │ │ ├── stretch_to_proportion
│ │ │ │ │ ├── area_stacked.mjs
│ │ │ │ │ ├── column_groupped.mjs
│ │ │ │ │ ├── column_split_stacked.mjs
│ │ │ │ │ ├── column_stacked.mjs
│ │ │ │ │ └── line.mjs
│ │ │ │ └── sum
│ │ │ │ │ ├── area_100percent_stacked.mjs
│ │ │ │ │ ├── area_polar_split.mjs
│ │ │ │ │ ├── area_polar_stacked.mjs
│ │ │ │ │ ├── area_split.mjs
│ │ │ │ │ ├── area_stacked.mjs
│ │ │ │ │ ├── bubble.mjs
│ │ │ │ │ ├── bubble_to_column.mjs
│ │ │ │ │ ├── bubble_to_coxcomb.mjs
│ │ │ │ │ ├── bubble_to_radial.mjs
│ │ │ │ │ ├── bubbleplot_1.mjs
│ │ │ │ │ ├── bubbleplot_2.mjs
│ │ │ │ │ ├── bubbleplot_to_radial.mjs
│ │ │ │ │ ├── column_1.mjs
│ │ │ │ │ ├── column_100percent_stacked.mjs
│ │ │ │ │ ├── column_2.mjs
│ │ │ │ │ ├── column_groupped.mjs
│ │ │ │ │ ├── column_split_stacked.mjs
│ │ │ │ │ ├── column_stacked_1.mjs
│ │ │ │ │ ├── column_stacked_2.mjs
│ │ │ │ │ ├── column_to_bar.mjs
│ │ │ │ │ ├── column_to_waterfall.mjs
│ │ │ │ │ ├── coxcomb_1.mjs
│ │ │ │ │ ├── coxcomb_2.mjs
│ │ │ │ │ ├── coxcomb_split.mjs
│ │ │ │ │ ├── dotplot.mjs
│ │ │ │ │ ├── line_1.mjs
│ │ │ │ │ ├── line_2.mjs
│ │ │ │ │ ├── line_polar_1.mjs
│ │ │ │ │ ├── line_polar_2.mjs
│ │ │ │ │ ├── scatterplot.mjs
│ │ │ │ │ ├── scatterplot_polar.mjs
│ │ │ │ │ ├── stream_stacked.mjs
│ │ │ │ │ └── treemap.mjs
│ │ │ ├── cookbook
│ │ │ │ ├── chart_types
│ │ │ │ │ ├── annotation_editor.mjs
│ │ │ │ │ ├── annotations.mjs
│ │ │ │ │ ├── exploded_pie_chart.mjs
│ │ │ │ │ ├── gant_chart.mjs
│ │ │ │ │ ├── historgram.mjs
│ │ │ │ │ ├── map.mjs
│ │ │ │ │ ├── multilayer.mjs
│ │ │ │ │ ├── network_graph.mjs
│ │ │ │ │ ├── step_line_chart.mjs
│ │ │ │ │ └── trendline.mjs
│ │ │ │ ├── data_source
│ │ │ │ │ ├── csv_load.mjs
│ │ │ │ │ ├── data_from_model.mjs
│ │ │ │ │ ├── data_from_model2.mjs
│ │ │ │ │ ├── paint.mjs
│ │ │ │ │ └── realtime_data.mjs
│ │ │ │ ├── exports
│ │ │ │ │ ├── animated_gif_export.mjs
│ │ │ │ │ ├── pptx-export.mjs
│ │ │ │ │ └── video_export.mjs
│ │ │ │ ├── interactive
│ │ │ │ │ ├── data_selector_combobox.mjs
│ │ │ │ │ ├── filter_on_click.mjs
│ │ │ │ │ ├── filter_slider.mjs
│ │ │ │ │ ├── fullscreen.mjs
│ │ │ │ │ ├── marker_label_on_mouseon.mjs
│ │ │ │ │ ├── mouse_scroll.mjs
│ │ │ │ │ ├── mouse_wheel_zoom.mjs
│ │ │ │ │ ├── range_slider_zoom.mjs
│ │ │ │ │ ├── seeker_slider.mjs
│ │ │ │ │ ├── swipe_to_seek.mjs
│ │ │ │ │ └── window_zoom.mjs
│ │ │ │ ├── rendering
│ │ │ │ │ ├── 3d_chart.mjs
│ │ │ │ │ ├── background_image.mjs
│ │ │ │ │ ├── custom_linetype.mjs
│ │ │ │ │ ├── custom_markers.mjs
│ │ │ │ │ ├── dropshadow_on_marker.mjs
│ │ │ │ │ ├── gradient_on_marker.mjs
│ │ │ │ │ ├── grid_lines.mjs
│ │ │ │ │ ├── image_axis_labels.mjs
│ │ │ │ │ ├── motion_blur.mjs
│ │ │ │ │ ├── random_gradient_pattern.mjs
│ │ │ │ │ ├── rounded_bars.mjs
│ │ │ │ │ ├── smooth_line_chart.mjs
│ │ │ │ │ └── sparse_axis_labels.mjs
│ │ │ │ ├── responsive-size.mjs.bak
│ │ │ │ └── style
│ │ │ │ │ ├── colorfilter.mjs
│ │ │ │ │ ├── d3_color_palette.mjs
│ │ │ │ │ ├── dark_theme.mjs
│ │ │ │ │ └── highligh_markers.mjs
│ │ │ ├── infinite.mjs
│ │ │ ├── presets
│ │ │ │ ├── chart
│ │ │ │ │ ├── area.mjs
│ │ │ │ │ ├── area_percentage.mjs
│ │ │ │ │ ├── area_splitted.mjs
│ │ │ │ │ ├── area_stacked.mjs
│ │ │ │ │ ├── bar.mjs
│ │ │ │ │ ├── bar_grouped.mjs
│ │ │ │ │ ├── bar_percentage.mjs
│ │ │ │ │ ├── bar_radial.mjs
│ │ │ │ │ ├── bar_radial_stacked.mjs
│ │ │ │ │ ├── bar_splitted.mjs
│ │ │ │ │ ├── bar_stacked.mjs
│ │ │ │ │ ├── bubble.mjs
│ │ │ │ │ ├── bubble_stacked.mjs
│ │ │ │ │ ├── column.mjs
│ │ │ │ │ ├── column_grouped.mjs
│ │ │ │ │ ├── column_percentage.mjs
│ │ │ │ │ ├── column_polar.mjs
│ │ │ │ │ ├── column_polar_stacked.mjs
│ │ │ │ │ ├── column_splitted.mjs
│ │ │ │ │ ├── column_stacked.mjs
│ │ │ │ │ ├── donut.mjs
│ │ │ │ │ ├── donut_nested.mjs
│ │ │ │ │ ├── line.mjs
│ │ │ │ │ ├── line_polar.mjs
│ │ │ │ │ ├── line_vertical.mjs
│ │ │ │ │ ├── lollipop.mjs
│ │ │ │ │ ├── marimekko.mjs
│ │ │ │ │ ├── mekko_stacked.mjs
│ │ │ │ │ ├── pie.mjs
│ │ │ │ │ ├── pie_variable_radius.mjs
│ │ │ │ │ └── waterfall.mjs
│ │ │ │ ├── graph
│ │ │ │ │ ├── stream.mjs
│ │ │ │ │ ├── stream_vertical.mjs
│ │ │ │ │ ├── violin.mjs
│ │ │ │ │ └── violin_vertical.mjs
│ │ │ │ ├── heatmap.mjs
│ │ │ │ ├── plot
│ │ │ │ │ ├── bubble.mjs
│ │ │ │ │ ├── scatter.mjs
│ │ │ │ │ └── scatter_polar.mjs
│ │ │ │ ├── treemap.mjs
│ │ │ │ └── treemap_stacked.mjs
│ │ │ ├── presets_config
│ │ │ │ ├── chart
│ │ │ │ │ ├── bar_radial.mjs
│ │ │ │ │ ├── bar_radial_stacked.mjs
│ │ │ │ │ ├── bar_stacked.mjs
│ │ │ │ │ ├── bubble_stacked.mjs
│ │ │ │ │ ├── column_polar.mjs
│ │ │ │ │ ├── column_polar_stacked.mjs
│ │ │ │ │ ├── column_stacked.mjs
│ │ │ │ │ └── pie_variable_radius.mjs
│ │ │ │ └── treemap.mjs
│ │ │ └── static
│ │ │ │ ├── chart
│ │ │ │ ├── area.mjs
│ │ │ │ ├── area_polar.mjs
│ │ │ │ ├── area_stacked.mjs
│ │ │ │ ├── bar.mjs
│ │ │ │ ├── bar_radial.mjs
│ │ │ │ ├── bar_stacked_radial.mjs
│ │ │ │ ├── bubble.mjs
│ │ │ │ ├── bubble_stacked.mjs
│ │ │ │ ├── column.mjs
│ │ │ │ ├── column_grouped.mjs
│ │ │ │ ├── column_single_stacked.mjs
│ │ │ │ ├── column_stacked.mjs
│ │ │ │ ├── coxcomb.mjs
│ │ │ │ ├── donut.mjs
│ │ │ │ ├── line.mjs
│ │ │ │ ├── line_polar.mjs
│ │ │ │ ├── line_single.mjs
│ │ │ │ ├── line_single_polar.mjs
│ │ │ │ ├── marimekko.mjs
│ │ │ │ ├── mekko.mjs
│ │ │ │ ├── mekko_stacked.mjs
│ │ │ │ ├── pie.mjs
│ │ │ │ └── waterfall.mjs
│ │ │ │ ├── graph
│ │ │ │ └── stream_stacked.mjs
│ │ │ │ ├── histogram.mjs
│ │ │ │ ├── plot
│ │ │ │ ├── bubble.mjs
│ │ │ │ ├── dot.mjs
│ │ │ │ └── scatter.mjs
│ │ │ │ ├── treemap.mjs
│ │ │ │ └── treemap_stacked.mjs
│ │ ├── web_content_removed
│ │ │ └── animated
│ │ │ │ ├── composition_comparison_pie_coxcomb_column_2dis_2con.mjs
│ │ │ │ ├── composition_comparison_waterfall_column_2dis_1con.mjs
│ │ │ │ ├── composition_percentage_area_stream_3dis_1con.mjs
│ │ │ │ ├── composition_percentage_column_3dis_1con.mjs
│ │ │ │ ├── composition_percentage_column_stream_3dis_1con.mjs
│ │ │ │ ├── distribution_relationship_dotplot_dotplot.mjs
│ │ │ │ ├── drill_aggreg_improve_line.mjs
│ │ │ │ ├── drilldown_aggregate_line.mjs
│ │ │ │ ├── merge_split_area_stream_3dis_1con.mjs
│ │ │ │ ├── merge_split_bar.mjs
│ │ │ │ ├── merge_split_radial_stacked_rectangle_2dis_1con.mjs
│ │ │ │ ├── orientation_circle.mjs
│ │ │ │ ├── orientation_dot_circle.mjs
│ │ │ │ ├── orientation_marimekko_rectangle_2dis_2con.mjs
│ │ │ │ ├── orientation_rectangle.mjs
│ │ │ │ ├── pie_donut2_rectangle_1dis_1con.mjs
│ │ │ │ ├── relationship_comparison_circle_2_bubble_plot.mjs
│ │ │ │ ├── relationship_total_bubble_plot_column.mjs
│ │ │ │ ├── stack_group_area_line.mjs
│ │ │ │ ├── stack_group_circle.mjs
│ │ │ │ ├── stack_group_treemap.mjs
│ │ │ │ ├── total_element_bubble_2_bar.mjs
│ │ │ │ ├── total_element_bubble_column.mjs
│ │ │ │ ├── treemap_radial.mjs
│ │ │ │ ├── zoom_area.mjs
│ │ │ │ ├── zoom_area_polar.mjs
│ │ │ │ ├── zoom_line.mjs
│ │ │ │ └── zoom_line_polar.mjs
│ │ ├── ww_animTiming
│ │ │ ├── descartes-polar
│ │ │ │ ├── 01_d-p_r-r-r.mjs
│ │ │ │ ├── 02_d-p_c-r-c.mjs
│ │ │ │ ├── 03_d-p_a-r-a.mjs
│ │ │ │ ├── 04_d-p_l-r-l.mjs
│ │ │ │ ├── 05_d-p_r-c-r.mjs
│ │ │ │ ├── 06_d-p_c-c-c.mjs
│ │ │ │ ├── 07_d-p_a-c-a.mjs
│ │ │ │ ├── 08_d-p_l-c-l.mjs
│ │ │ │ ├── 09_d-p_r-a-r.mjs
│ │ │ │ ├── 10_d-p_c-a-c.mjs
│ │ │ │ ├── 11_d-p_a-a-a.mjs
│ │ │ │ ├── 12_d-p_l-a-l.mjs
│ │ │ │ ├── 13_d-p_r-l-r.mjs
│ │ │ │ ├── 14_d-p_c-l-c.mjs
│ │ │ │ ├── 15_d-p_a-l-a.mjs
│ │ │ │ └── 16_d-p_l-l-l.mjs
│ │ │ ├── descartes-polar_orient
│ │ │ │ ├── 01_d-p_o_r-r-r.mjs
│ │ │ │ ├── 02_d-p_o_c-r-c.mjs
│ │ │ │ ├── 03_d-p_o_a-r-a.mjs
│ │ │ │ ├── 04_d-p_o_l-r-l.mjs
│ │ │ │ ├── 05_d-p_o_r-c-r.mjs
│ │ │ │ ├── 06_d-p_o_c-c-c.mjs
│ │ │ │ ├── 07_d-p_o_a-c-a.mjs
│ │ │ │ ├── 08_d-p_o_l-c-l.mjs
│ │ │ │ ├── 09_d-p_o_r-a-r.mjs
│ │ │ │ ├── 10_d-p_o_c-a-c.mjs
│ │ │ │ ├── 11_d-p_o_a-a-a.mjs
│ │ │ │ ├── 12_d-p_o_l-a-l.mjs
│ │ │ │ ├── 13_d-p_o_r-l-r.mjs
│ │ │ │ ├── 14_d-p_o_c-l-c.mjs
│ │ │ │ ├── 15_d-p_o_a-l-a.mjs
│ │ │ │ └── 16_d-p_o_l-l-l.mjs
│ │ │ ├── descartes
│ │ │ │ ├── 02_d-d_c-r-c.mjs
│ │ │ │ ├── 03_d-d_a-r-a.mjs
│ │ │ │ ├── 04_d-d_l-r-l.mjs
│ │ │ │ ├── 07_d-d_a-c-a.mjs
│ │ │ │ ├── 08_d-d_l-c-l.mjs
│ │ │ │ ├── 12_d-d_l-a-l.mjs
│ │ │ │ └── easing_test.mjs
│ │ │ ├── descartes_orientation
│ │ │ │ ├── 01_d-d_o_r-r-r.mjs
│ │ │ │ ├── 02_d-d_o_c-r-c.mjs
│ │ │ │ ├── 03_d-d_o_a-r-a.mjs
│ │ │ │ ├── 03_d-d_o_a-r-a_split.mjs
│ │ │ │ ├── 04_d-d_o_l-r-l.mjs
│ │ │ │ ├── 04_d-d_o_l-r-l_stacked.mjs
│ │ │ │ ├── 05_d-d_o_r-c-r.mjs
│ │ │ │ ├── 06_d-d_o_c-c-c.mjs
│ │ │ │ ├── 07_d-d_o_a-c-a.mjs
│ │ │ │ ├── 08_d-d_o_l-c-l.mjs
│ │ │ │ ├── 09_d-d_o_r-a-r.mjs
│ │ │ │ ├── 10_d-d_o_c-a-c.mjs
│ │ │ │ ├── 11_d-d_o_a-a-a.mjs
│ │ │ │ ├── 12_d-d_o_l-a-l.mjs
│ │ │ │ ├── 13_d-d_o_r-l-r.mjs
│ │ │ │ ├── 14_d-d_o_c-l-c.mjs
│ │ │ │ ├── 15_d-d_o_a-l-a.mjs
│ │ │ │ └── 16_d-d_o_l-l-l.mjs
│ │ │ ├── polar
│ │ │ │ ├── 02_p-p_c-r-c.mjs
│ │ │ │ ├── 03_p-p_a-r-a.mjs
│ │ │ │ ├── 04_p-p_l-r-l.mjs
│ │ │ │ ├── 07_p-p_a-c-a.mjs
│ │ │ │ ├── 08_p-p_l-c-l.mjs
│ │ │ │ └── 12_p-p_l-a-l.mjs
│ │ │ ├── polar_orientation
│ │ │ │ ├── 01_p-p_o_r-r-r.mjs
│ │ │ │ ├── 02_p-p_o_c-r-c.mjs
│ │ │ │ ├── 03_p-p_o_a-r-a.mjs
│ │ │ │ ├── 04_p-p_o_l-r-l.mjs
│ │ │ │ ├── 05_p-p_o_r-c-r.mjs
│ │ │ │ ├── 06_p-p_o_c-c-c.mjs
│ │ │ │ ├── 07_p-p_o_a-c-a.mjs
│ │ │ │ ├── 08_p-p_o_l-c-l.mjs
│ │ │ │ ├── 09_p-p_o_r-a-r.mjs
│ │ │ │ ├── 10_p-p_o_c-a-c.mjs
│ │ │ │ ├── 11_p-p_o_a-a-a.mjs
│ │ │ │ ├── 12_p-p_o_l-a-l.mjs
│ │ │ │ ├── 13_p-p_o_r-l-r.mjs
│ │ │ │ ├── 14_p-p_o_c-l-c.mjs
│ │ │ │ ├── 15_p-p_o_a-l-a.mjs
│ │ │ │ └── 16_p-p_o_l-l-l.mjs
│ │ │ ├── without-descartes
│ │ │ │ ├── 01_w-d_r-r-r.mjs
│ │ │ │ ├── 02_w-d_c-r-c.mjs
│ │ │ │ ├── 05_w-d_r-c-r.mjs
│ │ │ │ ├── 06_w-d_c-c-c.mjs
│ │ │ │ ├── 09_w-d_r-a-r.mjs
│ │ │ │ ├── 10_w-d_c-a-c.mjs
│ │ │ │ ├── 13_w-d_r-l-r.mjs
│ │ │ │ └── 14_w-d_c-l-c.mjs
│ │ │ ├── without-descartes_orientation
│ │ │ │ ├── 01_w-d_o_r-r-r.mjs
│ │ │ │ ├── 02_w-d_o_c-r-c.mjs
│ │ │ │ ├── 05_w-d_o_r-c-r.mjs
│ │ │ │ ├── 06_w-d_o_c-c-c.mjs
│ │ │ │ ├── 09_w-d_o_r-a-r.mjs
│ │ │ │ ├── 10_w-d_o_c-a-c.mjs
│ │ │ │ ├── 13_w-d_o_r-l-r.mjs
│ │ │ │ └── 14_w-d_o_c-l-c.mjs
│ │ │ ├── without-polar
│ │ │ │ ├── 01_w-p_r-r-r.mjs
│ │ │ │ ├── 02_w-p_c-r-c.mjs
│ │ │ │ ├── 05_w-p_r-c-r.mjs
│ │ │ │ ├── 06_w-p_c-c-c.mjs
│ │ │ │ ├── 09_w-p_r-a-r.mjs
│ │ │ │ ├── 10_w-p_c-a-c.mjs
│ │ │ │ ├── 13_w-p_r-l-r.mjs
│ │ │ │ └── 14_w-p_c-l-c.mjs
│ │ │ ├── without-polar_orientation
│ │ │ │ ├── 01_w-p_o_r-r-r.mjs
│ │ │ │ ├── 02_w-p_o_c-r-c.mjs
│ │ │ │ ├── 05_w-p_o_r-c-r.mjs
│ │ │ │ ├── 06_w-p_o_c-c-c.mjs
│ │ │ │ ├── 09_w-p_o_r-a-r.mjs
│ │ │ │ ├── 10_w-p_o_c-a-c.mjs
│ │ │ │ ├── 13_w-p_o_r-l-r.mjs
│ │ │ │ └── 14_w-p_o_c-l-c.mjs
│ │ │ └── without
│ │ │ │ └── 02_w-w_c-r-c.mjs
│ │ ├── ww_animTiming_TESTS
│ │ │ ├── descartes-polar
│ │ │ │ ├── 02_d-p_c-r-c.mjs
│ │ │ │ ├── 03_d-p_a-r-a.mjs
│ │ │ │ ├── 04_d-p_l-r-l.mjs
│ │ │ │ ├── 05_d-p_r-c-r.mjs
│ │ │ │ ├── 06_d-p_c-c-c.mjs
│ │ │ │ ├── 07_d-p_a-c-a.mjs
│ │ │ │ ├── 08_d-p_l-c-l.mjs
│ │ │ │ ├── 09_d-p_r-a-r.mjs
│ │ │ │ ├── 10_d-p_c-a-c.mjs
│ │ │ │ ├── 11_d-p_a-a-a.mjs
│ │ │ │ ├── 12_d-p_l-a-l.mjs
│ │ │ │ ├── 13_d-p_r-l-r.mjs
│ │ │ │ ├── 14_d-p_c-l-c.mjs
│ │ │ │ ├── 15_d-p_a-l-a.mjs
│ │ │ │ └── 16_d-p_l-l-l.mjs
│ │ │ ├── descartes-polar_orient
│ │ │ │ ├── 01_d-p_o_r-r-r.mjs
│ │ │ │ ├── 02_d-p_o_c-r-c.mjs
│ │ │ │ ├── 03_d-p_o_a-r-a.mjs
│ │ │ │ ├── 04_d-p_o_l-r-l.mjs
│ │ │ │ ├── 05_d-p_o_r-c-r.mjs
│ │ │ │ ├── 06_d-p_o_c-c-c.mjs
│ │ │ │ ├── 07_d-p_o_a-c-a.mjs
│ │ │ │ ├── 08_d-p_o_l-c-l.mjs
│ │ │ │ ├── 09_d-p_o_r-a-r.mjs
│ │ │ │ ├── 10_d-p_o_c-a-c.mjs
│ │ │ │ ├── 11_d-p_o_a-a-a.mjs
│ │ │ │ ├── 12_d-p_o_l-a-l.mjs
│ │ │ │ ├── 13_d-p_o_r-l-r.mjs
│ │ │ │ ├── 14_d-p_o_c-l-c.mjs
│ │ │ │ ├── 15_d-p_o_a-l-a.mjs
│ │ │ │ └── 16_d-p_o_l-l-l.mjs
│ │ │ ├── descartes
│ │ │ │ ├── 02_d-d_c-r-c.mjs
│ │ │ │ ├── 03_d-d_a-r-a.mjs
│ │ │ │ ├── 04_d-d_l-r-l.mjs
│ │ │ │ ├── 07_d-d_a-c-a.mjs
│ │ │ │ ├── 08_d-d_l-c-l.mjs
│ │ │ │ ├── 12_d-d_l-a-l.mjs
│ │ │ │ └── easing_test.mjs
│ │ │ ├── descartes_orientation
│ │ │ │ ├── 01_d-d_o_r-r-r.mjs
│ │ │ │ ├── 02_d-d_o_c-r-c.mjs
│ │ │ │ ├── 03_d-d_o_a-r-a.mjs
│ │ │ │ ├── 03_d-d_o_a-r-a_split.mjs
│ │ │ │ ├── 04_d-d_o_l-r-l.mjs
│ │ │ │ ├── 04_d-d_o_l-r-l_stacked.mjs
│ │ │ │ ├── 05_d-d_o_r-c-r.mjs
│ │ │ │ ├── 06_d-d_o_c-c-c.mjs
│ │ │ │ ├── 07_d-d_o_a-c-a.mjs
│ │ │ │ ├── 08_d-d_o_l-c-l.mjs
│ │ │ │ ├── 09_d-d_o_r-a-r.mjs
│ │ │ │ ├── 10_d-d_o_c-a-c.mjs
│ │ │ │ ├── 11_d-d_o_a-a-a.mjs
│ │ │ │ ├── 12_d-d_o_l-a-l.mjs
│ │ │ │ ├── 13_d-d_o_r-l-r.mjs
│ │ │ │ ├── 14_d-d_o_c-l-c.mjs
│ │ │ │ ├── 15_d-d_o_a-l-a.mjs
│ │ │ │ └── 16_d-d_o_l-l-l.mjs
│ │ │ ├── polar
│ │ │ │ ├── 02_p-p_c-r-c.mjs
│ │ │ │ ├── 03_p-p_a-r-a.mjs
│ │ │ │ ├── 04_p-p_l-r-l.mjs
│ │ │ │ ├── 07_p-p_a-c-a.mjs
│ │ │ │ ├── 08_p-p_l-c-l.mjs
│ │ │ │ └── 12_p-p_l-a-l.mjs
│ │ │ ├── polar_orientation
│ │ │ │ ├── 01_p-p_o_r-r-r.mjs
│ │ │ │ ├── 02_p-p_o_c-r-c.mjs
│ │ │ │ ├── 03_p-p_o_a-r-a.mjs
│ │ │ │ ├── 04_p-p_o_l-r-l.mjs
│ │ │ │ ├── 05_p-p_o_r-c-r.mjs
│ │ │ │ ├── 06_p-p_o_c-c-c.mjs
│ │ │ │ ├── 07_p-p_o_a-c-a.mjs
│ │ │ │ ├── 08_p-p_o_l-c-l.mjs
│ │ │ │ ├── 09_p-p_o_r-a-r.mjs
│ │ │ │ ├── 10_p-p_o_c-a-c.mjs
│ │ │ │ ├── 11_p-p_o_a-a-a.mjs
│ │ │ │ ├── 12_p-p_o_l-a-l.mjs
│ │ │ │ ├── 13_p-p_o_r-l-r.mjs
│ │ │ │ ├── 14_p-p_o_c-l-c.mjs
│ │ │ │ ├── 15_p-p_o_a-l-a.mjs
│ │ │ │ └── 16_p-p_o_l-l-l.mjs
│ │ │ ├── without-descartes
│ │ │ │ ├── 01_w-d_r-r-r.mjs
│ │ │ │ ├── 02_w-d_c-r-c.mjs
│ │ │ │ ├── 05_w-d_r-c-r.mjs
│ │ │ │ ├── 06_w-d_c-c-c.mjs
│ │ │ │ ├── 09_w-d_r-a-r.mjs
│ │ │ │ ├── 10_w-d_c-a-c.mjs
│ │ │ │ ├── 13_w-d_r-l-r.mjs
│ │ │ │ └── 14_w-d_c-l-c.mjs
│ │ │ ├── without-descartes_orientation
│ │ │ │ ├── 01_w-d_o_r-r-r.mjs
│ │ │ │ ├── 02_w-d_o_c-r-c.mjs
│ │ │ │ ├── 05_w-d_o_r-c-r.mjs
│ │ │ │ ├── 06_w-d_o_c-c-c.mjs
│ │ │ │ ├── 09_w-d_o_r-a-r.mjs
│ │ │ │ ├── 10_w-d_o_c-a-c.mjs
│ │ │ │ ├── 13_w-d_o_r-l-r.mjs
│ │ │ │ └── 14_w-d_o_c-l-c.mjs
│ │ │ ├── without-polar
│ │ │ │ ├── 01_w-p_r-r-r.mjs
│ │ │ │ ├── 02_w-p_c-r-c.mjs
│ │ │ │ ├── 05_w-p_r-c-r.mjs
│ │ │ │ ├── 06_w-p_c-c-c.mjs
│ │ │ │ ├── 09_w-p_r-a-r.mjs
│ │ │ │ ├── 10_w-p_c-a-c.mjs
│ │ │ │ ├── 13_w-p_r-l-r.mjs
│ │ │ │ └── 14_w-p_c-l-c.mjs
│ │ │ ├── without-polar_orientation
│ │ │ │ ├── 01_w-p_o_r-r-r.mjs
│ │ │ │ ├── 02_w-p_o_c-r-c.mjs
│ │ │ │ ├── 05_w-p_o_r-c-r.mjs
│ │ │ │ ├── 06_w-p_o_c-c-c.mjs
│ │ │ │ ├── 09_w-p_o_r-a-r.mjs
│ │ │ │ ├── 10_w-p_o_c-a-c.mjs
│ │ │ │ ├── 13_w-p_o_r-l-r.mjs
│ │ │ │ └── 14_w-p_o_c-l-c.mjs
│ │ │ └── without
│ │ │ │ └── 02_w-w_c-r-c.mjs
│ │ ├── ww_next_steps
│ │ │ ├── next_steps
│ │ │ │ ├── 02_C_R.mjs
│ │ │ │ ├── 02_C_R_water_comparison_sum.mjs
│ │ │ │ ├── 03_C_R.mjs
│ │ │ │ ├── 04_C_R.mjs
│ │ │ │ ├── 05_C_R.mjs
│ │ │ │ ├── 21_C_C_dotplot.mjs
│ │ │ │ ├── 22_C_C.mjs
│ │ │ │ ├── 28_C_A.mjs
│ │ │ │ ├── 35_C_A_violin.mjs
│ │ │ │ └── 38_C_L_line.mjs
│ │ │ ├── next_steps_Tests
│ │ │ │ ├── 02_C_R.mjs
│ │ │ │ ├── 02_C_R_water_comparison_sum.mjs
│ │ │ │ ├── 03_C_R.mjs
│ │ │ │ ├── 04_C_R.mjs
│ │ │ │ ├── 05_C_R.mjs
│ │ │ │ ├── 21_C_C_dotplot.mjs
│ │ │ │ ├── 22_C_C.mjs
│ │ │ │ ├── 28_C_A.mjs
│ │ │ │ ├── 38_C_L_line.mjs
│ │ │ │ └── axisLabel_problem.mjs
│ │ │ └── next_steps_byOperations
│ │ │ │ ├── compare
│ │ │ │ ├── comparison_01.mjs
│ │ │ │ ├── comparison_02.mjs
│ │ │ │ ├── comparison_03.mjs
│ │ │ │ ├── comparison_04.mjs
│ │ │ │ ├── comparison_05.mjs
│ │ │ │ ├── comparison_06.mjs
│ │ │ │ ├── comparison_09.mjs
│ │ │ │ ├── comparison_10.mjs
│ │ │ │ └── comparison_11.mjs
│ │ │ │ ├── components
│ │ │ │ ├── components_01.mjs
│ │ │ │ ├── components_02.mjs
│ │ │ │ ├── components_03.mjs
│ │ │ │ ├── components_04.mjs
│ │ │ │ ├── components_05.mjs
│ │ │ │ ├── components_06.mjs
│ │ │ │ └── components_07.mjs
│ │ │ │ ├── distribute
│ │ │ │ ├── distribution_01.mjs
│ │ │ │ ├── distribution_02.mjs
│ │ │ │ ├── distribution_03.mjs
│ │ │ │ ├── distribution_04.mjs
│ │ │ │ ├── distribution_05.mjs
│ │ │ │ ├── distribution_06.mjs
│ │ │ │ ├── distribution_07.mjs
│ │ │ │ └── distribution_08.mjs
│ │ │ │ ├── drilldown
│ │ │ │ ├── drilldown_01.mjs
│ │ │ │ ├── drilldown_02.mjs
│ │ │ │ ├── drilldown_03.mjs
│ │ │ │ ├── drilldown_04.mjs
│ │ │ │ ├── drilldown_05.mjs
│ │ │ │ ├── drilldown_06.mjs
│ │ │ │ ├── drilldown_07.mjs
│ │ │ │ ├── drilldown_10.mjs
│ │ │ │ ├── drilldown_11.mjs
│ │ │ │ ├── drilldown_12.mjs
│ │ │ │ └── drilldown_13.mjs
│ │ │ │ ├── other
│ │ │ │ └── other_add_measure_01.mjs
│ │ │ │ ├── ratio
│ │ │ │ ├── ratio_01.mjs
│ │ │ │ ├── ratio_02.mjs
│ │ │ │ ├── ratio_03.mjs
│ │ │ │ ├── ratio_04.mjs
│ │ │ │ └── ratio_05.mjs
│ │ │ │ ├── remove
│ │ │ │ ├── remove_01.mjs
│ │ │ │ ├── remove_02.mjs
│ │ │ │ ├── remove_03.mjs
│ │ │ │ ├── remove_04.mjs
│ │ │ │ ├── remove_05.mjs
│ │ │ │ └── remove_07.mjs
│ │ │ │ ├── sum_aggregate
│ │ │ │ ├── sum_aggregate_01.mjs
│ │ │ │ ├── sum_aggregate_02.mjs
│ │ │ │ ├── sum_aggregate_03.mjs
│ │ │ │ ├── sum_aggregate_04.mjs
│ │ │ │ ├── sum_aggregate_05.mjs
│ │ │ │ ├── sum_aggregate_06.mjs
│ │ │ │ ├── sum_aggregate_07.mjs
│ │ │ │ ├── sum_aggregate_08.mjs
│ │ │ │ ├── sum_aggregate_09.mjs
│ │ │ │ ├── sum_aggregate_10.mjs
│ │ │ │ ├── sum_aggregate_11.mjs
│ │ │ │ ├── sum_aggregate_12.mjs
│ │ │ │ ├── sum_aggregate_13.mjs
│ │ │ │ ├── sum_aggregate_14.mjs
│ │ │ │ ├── sum_aggregate_16.mjs
│ │ │ │ ├── sum_aggregate_17.mjs
│ │ │ │ ├── sum_aggregate_18.mjs
│ │ │ │ ├── sum_aggregate_19.mjs
│ │ │ │ ├── sum_aggregate_20.mjs
│ │ │ │ ├── sum_aggregate_21.mjs
│ │ │ │ └── sum_aggregate_22.mjs
│ │ │ │ ├── total
│ │ │ │ ├── total_01.mjs
│ │ │ │ ├── total_02.mjs
│ │ │ │ ├── total_03.mjs
│ │ │ │ ├── total_04.mjs
│ │ │ │ └── total_05.mjs
│ │ │ │ ├── wOld_animated
│ │ │ │ ├── composition_comparison_pie_coxcomb_column_2dis_2con.mjs
│ │ │ │ ├── distribution_relationship_dotplot_dotplot.mjs
│ │ │ │ ├── drill_aggreg_improve_line.mjs
│ │ │ │ ├── merge_split_radial_stacked_rectangle_2dis_1con.mjs
│ │ │ │ ├── orientation_dot_circle.mjs
│ │ │ │ ├── orientation_marimekko_rectangle_2dis_2con.mjs
│ │ │ │ ├── other_cartesian_radial_02.mjs
│ │ │ │ ├── treemap_radial.mjs
│ │ │ │ ├── zoom_area.mjs
│ │ │ │ ├── zoom_area_polar.mjs
│ │ │ │ ├── zoom_line.mjs
│ │ │ │ └── zoom_line_polar.mjs
│ │ │ │ └── wREGIEKBOL
│ │ │ │ ├── 02_cir.mjs
│ │ │ │ ├── 03_d-w_are.mjs
│ │ │ │ ├── 03_d-w_cir.mjs
│ │ │ │ ├── 03_d-w_lin.mjs
│ │ │ │ ├── 03_d-w_rec.mjs
│ │ │ │ ├── 03a_d-w_are.mjs
│ │ │ │ ├── 04_cir_2c.mjs
│ │ │ │ ├── 06_cir_2c.mjs
│ │ │ │ ├── 06b_are.mjs
│ │ │ │ ├── 06b_cir_1c.mjs
│ │ │ │ └── NoFade_Promobol
│ │ │ │ ├── 2_05b_lin.mjs
│ │ │ │ ├── 4_06b_rec_1c.mjs
│ │ │ │ ├── 4a_06b_rec_1c.mjs
│ │ │ │ ├── 5_04a_rec_1c.mjs
│ │ │ │ ├── 6_04a_cir_1c.mjs
│ │ │ │ ├── 7_05_cir_2c.mjs
│ │ │ │ ├── 8_06b_d-w_cir_1c.mjs
│ │ │ │ ├── 9_06b_d-w_rec_1c.mjs
│ │ │ │ └── 9a_06b_d-w_rec_1c.mjs
│ │ ├── ww_noFade
│ │ │ ├── wNoFade_Tests
│ │ │ │ ├── 1_des_pol
│ │ │ │ │ ├── area
│ │ │ │ │ │ ├── 03_are.mjs
│ │ │ │ │ │ ├── 04a_are.mjs
│ │ │ │ │ │ ├── 04b_are.mjs
│ │ │ │ │ │ ├── 06a_are.mjs
│ │ │ │ │ │ └── 06b_are.mjs
│ │ │ │ │ ├── circle-rectangle
│ │ │ │ │ │ ├── 02_cir.mjs
│ │ │ │ │ │ ├── 03_cir.mjs
│ │ │ │ │ │ ├── 04_cir.mjs
│ │ │ │ │ │ ├── 05_cir.mjs
│ │ │ │ │ │ ├── 06_cir_NO.mjs
│ │ │ │ │ │ ├── 07_cir.mjs
│ │ │ │ │ │ └── 08_cir.mjs
│ │ │ │ │ ├── circle-rectangle_Ve1
│ │ │ │ │ │ ├── 04_cir_Ve1.mjs
│ │ │ │ │ │ ├── 04_cir_Ve2.mjs
│ │ │ │ │ │ └── 07_cir_Ve1.mjs
│ │ │ │ │ ├── circle
│ │ │ │ │ │ ├── 02_cir.mjs
│ │ │ │ │ │ ├── 03_cir.mjs
│ │ │ │ │ │ ├── 04_cir_2c.mjs
│ │ │ │ │ │ ├── 04a_cir_1c.mjs
│ │ │ │ │ │ ├── 04b_cir_1c.mjs
│ │ │ │ │ │ ├── 05_cir_2c.mjs
│ │ │ │ │ │ ├── 05a_cir_1c.mjs
│ │ │ │ │ │ ├── 05b_cir_1c.mjs
│ │ │ │ │ │ ├── 06_cir_2c.mjs
│ │ │ │ │ │ ├── 06a_cir_1c.mjs
│ │ │ │ │ │ ├── 06b_cir_1c.mjs
│ │ │ │ │ │ ├── 07_cir_2c.mjs
│ │ │ │ │ │ └── 08_cir_2c.mjs
│ │ │ │ │ ├── line
│ │ │ │ │ │ ├── 02a_lin.mjs
│ │ │ │ │ │ ├── 02b_lin.mjs
│ │ │ │ │ │ ├── 03_lin.mjs
│ │ │ │ │ │ ├── 04a_lin.mjs
│ │ │ │ │ │ ├── 04b_lin.mjs
│ │ │ │ │ │ ├── 05a_lin.mjs
│ │ │ │ │ │ ├── 05b_lin.mjs
│ │ │ │ │ │ ├── 06a_lin.mjs
│ │ │ │ │ │ └── 06b_lin.mjs
│ │ │ │ │ └── rectangle
│ │ │ │ │ │ ├── 02a_rec.mjs
│ │ │ │ │ │ ├── 02b_rec.mjs
│ │ │ │ │ │ ├── 03_rec.mjs
│ │ │ │ │ │ ├── 04a_rec_1c.mjs
│ │ │ │ │ │ ├── 04a_rec_2c.mjs
│ │ │ │ │ │ ├── 04b_rec_1c.mjs
│ │ │ │ │ │ ├── 04b_rec_2c.mjs
│ │ │ │ │ │ ├── 05a_rec_2c.mjs
│ │ │ │ │ │ ├── 05b_rec_2c.mjs
│ │ │ │ │ │ ├── 06a_rec_1c.mjs
│ │ │ │ │ │ ├── 06a_rec_2c.mjs
│ │ │ │ │ │ ├── 06b_rec_1c.mjs
│ │ │ │ │ │ ├── 06b_rec_2c.mjs
│ │ │ │ │ │ ├── 07a_rec_1c.mjs
│ │ │ │ │ │ ├── 07a_rec_2c.mjs
│ │ │ │ │ │ └── 08a_rec_2c.mjs
│ │ │ │ ├── 2_des_pol-without
│ │ │ │ │ ├── area-rectangle
│ │ │ │ │ │ ├── 03_d-w_are.mjs
│ │ │ │ │ │ ├── 04a_d-w_are.mjs
│ │ │ │ │ │ ├── 04b_d-w_are.mjs
│ │ │ │ │ │ ├── 06a_d-w_are.mjs
│ │ │ │ │ │ ├── 06b_d-w_are.mjs
│ │ │ │ │ │ └── 10_d-w_are_temporal_bubble.mjs
│ │ │ │ │ ├── area
│ │ │ │ │ │ ├── 03_d-w_are.mjs
│ │ │ │ │ │ ├── 04a_d-w_are.mjs
│ │ │ │ │ │ ├── 04b_d-w_are.mjs
│ │ │ │ │ │ ├── 06a_d-w_are.mjs
│ │ │ │ │ │ ├── 06b_d-w_are.mjs
│ │ │ │ │ │ └── 06b_d-w_are_V1_filter.mjs
│ │ │ │ │ ├── circle-rectangle
│ │ │ │ │ │ └── 04a_d-w_cir_1c.mjs
│ │ │ │ │ ├── circle
│ │ │ │ │ │ ├── 03_d-w_cir.mjs
│ │ │ │ │ │ ├── 04_d-w_cir_2c.mjs
│ │ │ │ │ │ ├── 04a_d-w_cir_1c.mjs
│ │ │ │ │ │ ├── 04b_d-w_cir_1c.mjs
│ │ │ │ │ │ ├── 05_d-w_cir_2c.mjs
│ │ │ │ │ │ ├── 05a_d-w_cir_1c.mjs
│ │ │ │ │ │ ├── 05b_d-w_cir_1c.mjs
│ │ │ │ │ │ ├── 06_d-w_cir_2c.mjs
│ │ │ │ │ │ ├── 06a_d-w_cir_1c.mjs
│ │ │ │ │ │ ├── 06b_d-w_cir_1c.mjs
│ │ │ │ │ │ ├── 07_d-w_cir_2c.mjs
│ │ │ │ │ │ └── 08_d-w_cir_2c.mjs
│ │ │ │ │ ├── line-rectangle
│ │ │ │ │ │ ├── 02_d-w_lin.mjs
│ │ │ │ │ │ ├── 03_d-w_lin.mjs
│ │ │ │ │ │ ├── 04a_d-w_lin.mjs
│ │ │ │ │ │ ├── 04b_d-w_lin.mjs
│ │ │ │ │ │ ├── 05a_d-w_lin.mjs
│ │ │ │ │ │ ├── 05b_d-w_lin.mjs
│ │ │ │ │ │ ├── 06a_d-w_lin.mjs
│ │ │ │ │ │ └── 06b_d-w_lin.mjs
│ │ │ │ │ ├── line
│ │ │ │ │ │ ├── 02_d-w_lin.mjs
│ │ │ │ │ │ ├── 03_d-w_lin.mjs
│ │ │ │ │ │ ├── 04a_d-w_lin.mjs
│ │ │ │ │ │ ├── 04b_d-w_lin.mjs
│ │ │ │ │ │ ├── 05a_d-w_lin.mjs
│ │ │ │ │ │ ├── 05b_d-w_lin.mjs
│ │ │ │ │ │ ├── 06a_d-w_lin.mjs
│ │ │ │ │ │ └── 06b_d-w_lin.mjs
│ │ │ │ │ └── rectangle
│ │ │ │ │ │ ├── 02_d-w_rec.mjs
│ │ │ │ │ │ ├── 03_d-w_rec.mjs
│ │ │ │ │ │ ├── 04a_d-w_rec_1c.mjs
│ │ │ │ │ │ ├── 04a_d-w_rec_2c.mjs
│ │ │ │ │ │ ├── 04b_d-w_rec_1c.mjs
│ │ │ │ │ │ ├── 04b_d-w_rec_2c.mjs
│ │ │ │ │ │ ├── 05a_d-w_rec_2c.mjs
│ │ │ │ │ │ ├── 05b_d-w_rec_2c.mjs
│ │ │ │ │ │ ├── 06a_d-w_rec_1c.mjs
│ │ │ │ │ │ ├── 06b_d-w_rec_1c.mjs
│ │ │ │ │ │ ├── 06b_d-w_rec_2c.mjs
│ │ │ │ │ │ ├── 07a_d-w_rec_1c.mjs
│ │ │ │ │ │ ├── 07a_d-w_rec_2c.mjs
│ │ │ │ │ │ └── 08a_d-w_rec_2c.mjs
│ │ │ │ ├── Marker_label_problem
│ │ │ │ │ └── rotated_bar_to_donut.mjs
│ │ │ │ ├── Marker_transition_problem
│ │ │ │ │ ├── Bubble_Stacked_Bubble_to_Area.mjs
│ │ │ │ │ ├── Bubble_Stacked_Bubble_to_Line.mjs
│ │ │ │ │ ├── Treemap_Stacked_Treemap_to_Area.mjs
│ │ │ │ │ ├── area_column_time_sum.mjs
│ │ │ │ │ ├── area_orientation.mjs
│ │ │ │ │ ├── line_bar_time_sum.mjs
│ │ │ │ │ ├── line_column_time_sum.mjs
│ │ │ │ │ ├── line_drilldown_aggregate_x.mjs
│ │ │ │ │ ├── line_orientation.mjs
│ │ │ │ │ └── line_tooltip_test.mjs
│ │ │ │ └── noFade_AND_Marker_transition_problem
│ │ │ │ │ └── pie_coxcomb_drilldown.mjs
│ │ │ ├── wNoFade_cases
│ │ │ │ ├── 1_des_pol
│ │ │ │ │ ├── area
│ │ │ │ │ │ ├── 04a_are.mjs
│ │ │ │ │ │ ├── 04b_are.mjs
│ │ │ │ │ │ ├── 06a_are.mjs
│ │ │ │ │ │ └── 06b_are.mjs
│ │ │ │ │ ├── area_V1
│ │ │ │ │ │ └── 06b_are_V1.mjs
│ │ │ │ │ ├── circle-rectangle
│ │ │ │ │ │ ├── 02_cir.mjs
│ │ │ │ │ │ ├── 03_cir.mjs
│ │ │ │ │ │ ├── 04_cir.mjs
│ │ │ │ │ │ ├── 05_cir.mjs
│ │ │ │ │ │ ├── 06_cir_NO.mjs
│ │ │ │ │ │ ├── 07_cir.mjs
│ │ │ │ │ │ └── 08_cir.mjs
│ │ │ │ │ ├── circle-rectangle_Ve1
│ │ │ │ │ │ ├── 04_cir_Ve1.mjs
│ │ │ │ │ │ ├── 04_cir_Ve2.mjs
│ │ │ │ │ │ └── 07_cir_Ve1.mjs
│ │ │ │ │ ├── circle
│ │ │ │ │ │ ├── 04_cir_2c.mjs
│ │ │ │ │ │ ├── 04a_cir_1c.mjs
│ │ │ │ │ │ ├── 04b_cir_1c.mjs
│ │ │ │ │ │ ├── 05_cir_2c.mjs
│ │ │ │ │ │ ├── 05a_cir_1c.mjs
│ │ │ │ │ │ ├── 05b_cir_1c.mjs
│ │ │ │ │ │ ├── 06_cir_2c.mjs
│ │ │ │ │ │ ├── 06a_cir_1c.mjs
│ │ │ │ │ │ ├── 06b_cir_1c.mjs
│ │ │ │ │ │ ├── 07_cir_2c.mjs
│ │ │ │ │ │ └── 08_cir_2c.mjs
│ │ │ │ │ ├── line
│ │ │ │ │ │ ├── 04a_lin.mjs
│ │ │ │ │ │ ├── 04b_lin.mjs
│ │ │ │ │ │ ├── 05a_lin.mjs
│ │ │ │ │ │ ├── 05b_lin.mjs
│ │ │ │ │ │ ├── 06a_lin.mjs
│ │ │ │ │ │ └── 06b_lin.mjs
│ │ │ │ │ ├── rectangle
│ │ │ │ │ │ ├── 04a_rec_1c.mjs
│ │ │ │ │ │ ├── 04a_rec_2c.mjs
│ │ │ │ │ │ ├── 04b_rec_1c.mjs
│ │ │ │ │ │ ├── 04b_rec_2c.mjs
│ │ │ │ │ │ ├── 05a_rec_2c.mjs
│ │ │ │ │ │ ├── 05b_rec_2c.mjs
│ │ │ │ │ │ ├── 06a_rec_1c.mjs
│ │ │ │ │ │ ├── 06a_rec_2c.mjs
│ │ │ │ │ │ ├── 06b_rec_1c.mjs
│ │ │ │ │ │ ├── 06b_rec_2c.mjs
│ │ │ │ │ │ ├── 07a_rec_1c.mjs
│ │ │ │ │ │ ├── 07a_rec_2c.mjs
│ │ │ │ │ │ ├── 08a_rec_2c.mjs
│ │ │ │ │ │ └── 09_rec_TemporalDistribution.mjs
│ │ │ │ │ ├── rectangle_V1
│ │ │ │ │ │ ├── 05b_rec_2c_V1.mjs
│ │ │ │ │ │ └── 06b_rec_1c_V1.mjs
│ │ │ │ │ └── rectangle_Ve1
│ │ │ │ │ │ ├── 04a_rec_Ve1_1c.mjs
│ │ │ │ │ │ ├── 04a_rec_Ve1_2c.mjs
│ │ │ │ │ │ ├── 05a_rec_Ve1_2c.mjs
│ │ │ │ │ │ ├── 06a_rec_Ve1_1c.mjs
│ │ │ │ │ │ ├── 07a_rec_Ve1_2c.mjs
│ │ │ │ │ │ ├── 07a_rec_Ve2_2c.mjs
│ │ │ │ │ │ └── 08a_rec_Ve1_2c.mjs
│ │ │ │ └── 2_des_pol-without
│ │ │ │ │ ├── area-rectangle
│ │ │ │ │ ├── 03_d-w_are.mjs
│ │ │ │ │ ├── 04a_d-w_are.mjs
│ │ │ │ │ ├── 04b_d-w_are.mjs
│ │ │ │ │ ├── 06a_d-w_are.mjs
│ │ │ │ │ ├── 06b_d-w_are.mjs
│ │ │ │ │ └── 10_d-w_are_temporal_bubble.mjs
│ │ │ │ │ ├── area
│ │ │ │ │ ├── 03_d-w_are.mjs
│ │ │ │ │ ├── 04a_d-w_are.mjs
│ │ │ │ │ ├── 04b_d-w_are.mjs
│ │ │ │ │ ├── 06a_d-w_are.mjs
│ │ │ │ │ ├── 06b_d-w_are.mjs
│ │ │ │ │ └── 10_d-w_are_temporal_bubble.mjs
│ │ │ │ │ ├── area_V1
│ │ │ │ │ ├── 03_d-w_are_V1.mjs
│ │ │ │ │ ├── 04a_d-w_are_V1.mjs
│ │ │ │ │ ├── 04b_d-w_are_V1.mjs
│ │ │ │ │ ├── 06b_d-w_are_V1.mjs
│ │ │ │ │ └── 06b_d-w_are_V1_filter.mjs
│ │ │ │ │ ├── circle-rectangle
│ │ │ │ │ ├── 04a_d-w_cir_1c.mjs
│ │ │ │ │ └── 04a_d-w_cir_V1_1c.mjs
│ │ │ │ │ ├── circle
│ │ │ │ │ ├── 02_d-w_cir.mjs
│ │ │ │ │ ├── 03_d-w_cir.mjs
│ │ │ │ │ ├── 04_d-w_cir_2c.mjs
│ │ │ │ │ ├── 04a_d-w_cir_1c.mjs
│ │ │ │ │ ├── 04b_d-w_cir_1c.mjs
│ │ │ │ │ ├── 05_d-w_cir_2c.mjs
│ │ │ │ │ ├── 05a_d-w_cir_1c.mjs
│ │ │ │ │ ├── 05b_d-w_cir_1c.mjs
│ │ │ │ │ ├── 06_d-w_cir_2c.mjs
│ │ │ │ │ ├── 06a_d-w_cir_1c.mjs
│ │ │ │ │ ├── 06b_d-w_cir_1c.mjs
│ │ │ │ │ ├── 07_d-w_cir_2c.mjs
│ │ │ │ │ └── 08_d-w_cir_2c.mjs
│ │ │ │ │ ├── circle_V1
│ │ │ │ │ ├── 03_d-w_cir_V1.mjs
│ │ │ │ │ ├── 04_d-w_cir_V1_2c.mjs
│ │ │ │ │ ├── 04a_d-w_cir_V1_1c.mjs
│ │ │ │ │ ├── 04b_d-w_cir_V1_1c.mjs
│ │ │ │ │ ├── 05_d-w_cir_V1_2c.mjs
│ │ │ │ │ ├── 05b_d-w_cir_V1_1c.mjs
│ │ │ │ │ ├── 06_d-w_cir_V1_2c.mjs
│ │ │ │ │ ├── 07_d-w_cir_V1_2c.mjs
│ │ │ │ │ └── 08_d-w_cir_V1_2c.mjs
│ │ │ │ │ ├── line-rectangle
│ │ │ │ │ ├── 02_d-d_lin.mjs
│ │ │ │ │ ├── 02_d-w_lin.mjs
│ │ │ │ │ ├── 03_d-w_lin.mjs
│ │ │ │ │ ├── 04a_d-w_lin.mjs
│ │ │ │ │ ├── 04b_d-w_lin.mjs
│ │ │ │ │ ├── 05a_d-w_lin.mjs
│ │ │ │ │ ├── 05b_d-w_lin.mjs
│ │ │ │ │ ├── 06a_d-w_lin.mjs
│ │ │ │ │ └── 06b_d-w_lin.mjs
│ │ │ │ │ ├── line
│ │ │ │ │ ├── 02_d-w_lin.mjs
│ │ │ │ │ ├── 03_d-w_lin.mjs
│ │ │ │ │ ├── 04a_d-w_lin.mjs
│ │ │ │ │ ├── 04b_d-w_lin.mjs
│ │ │ │ │ ├── 05a_d-w_lin.mjs
│ │ │ │ │ ├── 05b_d-w_lin.mjs
│ │ │ │ │ ├── 06a_d-w_lin.mjs
│ │ │ │ │ └── 06b_d-w_lin.mjs
│ │ │ │ │ ├── line_V1
│ │ │ │ │ ├── 02_d-w_lin_V1.mjs
│ │ │ │ │ ├── 03_d-w_lin_V1.mjs
│ │ │ │ │ ├── 04a_d-w_lin_V1.mjs
│ │ │ │ │ ├── 04b_d-w_lin_V1.mjs
│ │ │ │ │ ├── 05a_d-w_lin_V1.mjs
│ │ │ │ │ ├── 05b_d-w_lin_V1.mjs
│ │ │ │ │ ├── 06a_d-w_lin_V1.mjs
│ │ │ │ │ └── 06b_d-w_lin_V1.mjs
│ │ │ │ │ ├── rectangle
│ │ │ │ │ ├── 02_d-w_rec.mjs
│ │ │ │ │ ├── 03_d-w_rec.mjs
│ │ │ │ │ ├── 04a_d-w_rec_1c.mjs
│ │ │ │ │ ├── 04a_d-w_rec_2c.mjs
│ │ │ │ │ ├── 04b_d-w_rec_1c.mjs
│ │ │ │ │ ├── 04b_d-w_rec_2c.mjs
│ │ │ │ │ ├── 05a_d-w_rec_2c.mjs
│ │ │ │ │ ├── 05b_d-w_rec_2c.mjs
│ │ │ │ │ ├── 06a_d-w_rec_1c.mjs
│ │ │ │ │ ├── 06b_d-w_rec_1c.mjs
│ │ │ │ │ ├── 06b_d-w_rec_2c.mjs
│ │ │ │ │ ├── 07a_d-w_rec_1c.mjs
│ │ │ │ │ ├── 07a_d-w_rec_2c.mjs
│ │ │ │ │ └── 08a_d-w_rec_2c.mjs
│ │ │ │ │ ├── rectangle_V1
│ │ │ │ │ ├── 03_d-w_rec_V1.mjs
│ │ │ │ │ ├── 04a_d-w_rec_Ve1_1c_V1.mjs
│ │ │ │ │ ├── 04a_d-w_rec_Ve1_2c_V1.mjs
│ │ │ │ │ ├── 04b_d-w_rec_1c_V1.mjs
│ │ │ │ │ ├── 04b_d-w_rec_2c_V1.mjs
│ │ │ │ │ ├── 05b_d-w_rec_2c_V1.mjs
│ │ │ │ │ ├── 07a_d-w_rec_Ve1_2c_V1.mjs
│ │ │ │ │ └── 08a_d-w_rec_Ve1_2c_V1.mjs
│ │ │ │ │ └── rectangle_Ve1
│ │ │ │ │ ├── 04a_d-w_rec_Ve1_1c.mjs
│ │ │ │ │ ├── 04a_d-w_rec_Ve1_2c.mjs
│ │ │ │ │ ├── 05a_d-w_rec_Ve1_2c.mjs
│ │ │ │ │ ├── 06a_d-w_rec_Ve1_1c.mjs
│ │ │ │ │ ├── 06a_d-w_rec_Ve1_2c.mjs
│ │ │ │ │ ├── 07a_d-w_rec_Ve1_2c.mjs
│ │ │ │ │ ├── 07a_d-w_rec_Ve1_2c_filter.mjs
│ │ │ │ │ ├── 07a_d-w_rec_Ve2_1c.mjs
│ │ │ │ │ ├── 07a_d-w_rec_Ve2_2c.mjs
│ │ │ │ │ ├── 07a_d-w_rec_Ve3_2c.mjs
│ │ │ │ │ └── 08a_d-w_rec_Ve1_2c.mjs
│ │ │ └── wNoFade_wPromotion
│ │ │ │ ├── 0_01_reorder.mjs
│ │ │ │ ├── 1_06b_are.mjs
│ │ │ │ ├── 2_05b_lin.mjs
│ │ │ │ ├── 3_04_cir.mjs
│ │ │ │ ├── 4_06b_rec_1c.mjs
│ │ │ │ ├── 4a_06b_rec_1c.mjs
│ │ │ │ ├── 5_04a_rec_1c.mjs
│ │ │ │ ├── 6_04a_cir_1c.mjs
│ │ │ │ ├── 7_05_cir_2c.mjs
│ │ │ │ ├── 8_06b_d-w_cir_1c.mjs
│ │ │ │ ├── 9_06b_d-w_rec_1c.mjs
│ │ │ │ └── 9a_06b_d-w_rec_1c.mjs
│ │ ├── ww_samples_for_presets
│ │ │ ├── cartesian_coo_sys
│ │ │ │ ├── 01_C_R_histogram.mjs
│ │ │ │ ├── 03_C_R_grouped_column_chart_negative.mjs
│ │ │ │ ├── 05_C_R_split_column_chart.mjs
│ │ │ │ ├── 06_C_R_100_stacked_column_chart.mjs
│ │ │ │ ├── 07_C_R_range_column_chart.mjs
│ │ │ │ ├── 08_C_R_waterfall.mjs
│ │ │ │ ├── 09_C_R_stacked_mekko_chart.mjs
│ │ │ │ ├── 10_C_R_marimekko_chart.mjs
│ │ │ │ ├── 112_C_R_icicle_chart.mjs
│ │ │ │ ├── 11_C_R_icicle_chart.mjs
│ │ │ │ ├── 12_C_R_matrix_chart.mjs
│ │ │ │ ├── 13_C_R_bar_chart_negative.mjs
│ │ │ │ ├── 14_C_R_grouped_bar_chart_negative.mjs
│ │ │ │ ├── 16_C_R_splitted_bar_chart.mjs
│ │ │ │ ├── 17_C_R_100_stacked_bar_chart.mjs
│ │ │ │ ├── 19_C_R_range_bar_chart.mjs
│ │ │ │ ├── 201_C_C_devided_lollipop_chart.mjs
│ │ │ │ ├── 20_C_C_lollipop_chart.mjs
│ │ │ │ ├── 21_C_C_dot_plot_chart.mjs
│ │ │ │ ├── 22_C_C_scatter_plot.mjs
│ │ │ │ ├── 24_C_C_bubble_plot.mjs
│ │ │ │ ├── 25_C_C_correlogram.mjs
│ │ │ │ ├── 27_C_A_area_chart.mjs
│ │ │ │ ├── 27_C_A_area_chart_negative.mjs
│ │ │ │ ├── 29_C_A_stacked_area_chart_percentage_labels.mjs
│ │ │ │ ├── 30_C_A_overlay_area_chart.mjs
│ │ │ │ ├── 31_C_A_splitted_area_chart.mjs
│ │ │ │ ├── 32_C_A_stream_graph.mjs
│ │ │ │ ├── 33_C_A_stream_graph_vert.mjs
│ │ │ │ ├── 34_C_A_violin_graph.mjs
│ │ │ │ ├── 35_C_A_violin_graph_vert.mjs
│ │ │ │ ├── 36_C_A_range_area_chart.mjs
│ │ │ │ ├── 371_C_L_line_chart_nega.mjs
│ │ │ │ ├── 37_C_A_funnel.mjs
│ │ │ │ ├── 38_C_L_line_chart_nega.mjs
│ │ │ │ └── 39_C_L_line_chart_vert.mjs
│ │ │ ├── polar_coo_sys
│ │ │ │ ├── 41_P_R_multi-level_pie_chart.mjs
│ │ │ │ ├── 43_P_R_polar_column_chart_Yrange.mjs
│ │ │ │ ├── 46_P_R_coxcomb_nightingale_rose_chart.mjs
│ │ │ │ ├── 47_P_R_polar_area_chart.mjs
│ │ │ │ ├── 48_P_R_polar_range_column_chart.mjs
│ │ │ │ ├── 52_P_R_nested_multi_level_donut_chart.mjs
│ │ │ │ ├── 53_P_C_polar_scatter_plot.mjs
│ │ │ │ ├── 54_P_A_area_trump_chart.mjs
│ │ │ │ ├── 551_P_A_polar_stream_graph.mjs
│ │ │ │ ├── 55_P_A_polar_overlay_area_chart.mjs
│ │ │ │ └── 56_P_A_polar_line_chart.mjs
│ │ │ └── without_coo_sys
│ │ │ │ ├── 601_W_R_heatmap_gradient.mjs
│ │ │ │ ├── 602_W_R_heatmap3.mjs
│ │ │ │ └── 60_W_R_heatmap.mjs
│ │ └── www_new_analytical_operations
│ │ │ └── operations
│ │ │ ├── 01_drilldown
│ │ │ ├── Bar_Bar.mjs
│ │ │ └── Column_Stacked_Column.mjs
│ │ │ ├── 02_sum
│ │ │ ├── Area_Stacked_Area.mjs
│ │ │ ├── Bubble_Bubble.mjs
│ │ │ ├── Column_Groupped_Column_1.mjs
│ │ │ ├── Column_Groupped_Column_2.mjs
│ │ │ ├── Column_Groupped_Column_to_Bar.mjs
│ │ │ ├── Column_Stacked_Column_1.mjs
│ │ │ ├── Column_Stacked_Column_2.mjs
│ │ │ ├── Coxcomb_Coxcomb_to_Donut.mjs
│ │ │ └── Line_Line_3.mjs
│ │ │ └── 07_distribute
│ │ │ ├── Bubble_Stacked_Bubble_to_Area.mjs
│ │ │ ├── Bubble_Stacked_Bubble_to_Line.mjs
│ │ │ └── Treemap_Stacked_Treemap_to_Area.mjs
│ ├── test_data
│ │ ├── IMDB_data.mjs
│ │ ├── capitals.mjs
│ │ ├── chart_precision.mjs
│ │ ├── chart_types_eu.mjs
│ │ ├── correlogram_data.mjs
│ │ ├── cube_test_data.mjs
│ │ ├── data_missing_long.mjs
│ │ ├── data_missing_long_more_conti.mjs
│ │ ├── data_missing_long_more_disc.mjs
│ │ ├── funnel_data.mjs
│ │ ├── icicle.mjs
│ │ ├── icicle2.mjs
│ │ ├── infinite_data.mjs
│ │ ├── music_data.mjs
│ │ ├── music_industry_history_1.mjs
│ │ ├── sunburst.mjs
│ │ ├── sunburst2.mjs
│ │ └── tutorial.mjs
│ ├── tests
│ │ ├── chart.mjs
│ │ ├── config.mjs
│ │ ├── config_tests.json
│ │ ├── config_tests
│ │ │ ├── channel_ranges
│ │ │ │ ├── dim_axis.mjs
│ │ │ │ ├── dim_color.mjs
│ │ │ │ ├── dim_lightness.mjs
│ │ │ │ └── meas_axis.mjs
│ │ │ ├── dimension_axis_density.mjs
│ │ │ ├── dimension_axis_title.mjs
│ │ │ ├── geometry.mjs
│ │ │ ├── main_axis_split.mjs
│ │ │ └── wrong_channels.mjs
│ │ ├── data.mjs
│ │ ├── docs.json
│ │ ├── docs
│ │ │ ├── tutorial.mjs
│ │ │ └── tutorial
│ │ │ │ ├── aggregating_data.mjs
│ │ │ │ ├── align_range.mjs
│ │ │ │ ├── animation_control_keyframes.mjs
│ │ │ │ ├── animation_options.mjs
│ │ │ │ ├── axes_title_tooltip.mjs
│ │ │ │ ├── changing_dimensions.mjs
│ │ │ │ ├── channels_legend.mjs
│ │ │ │ ├── chart_layout.mjs
│ │ │ │ ├── chart_presets.mjs
│ │ │ │ ├── color_palette_fonts.mjs
│ │ │ │ ├── events.mjs
│ │ │ │ ├── filter_add_new_records.mjs
│ │ │ │ ├── geometry.mjs
│ │ │ │ ├── group_stack.mjs
│ │ │ │ ├── orientation_split_polar.mjs
│ │ │ │ ├── shorthands_store.mjs
│ │ │ │ ├── sorting.mjs
│ │ │ │ ├── stacking_explanation.mjs
│ │ │ │ └── without_coordinates_noop_channel.mjs
│ │ ├── features.json
│ │ ├── features
│ │ │ ├── aggregators
│ │ │ │ ├── aggregators.mjs
│ │ │ │ └── aggregators_together.mjs
│ │ │ ├── anim
│ │ │ │ └── speed.mjs
│ │ │ ├── axis_title_positioning.mjs
│ │ │ ├── cssproperties.mjs
│ │ │ ├── data_input
│ │ │ │ ├── category_indexed.mjs
│ │ │ │ └── object_records.mjs
│ │ │ ├── detach.mjs
│ │ │ ├── events
│ │ │ │ └── drawing_events.mjs
│ │ │ ├── legend_interpolation.mjs
│ │ │ ├── presets.mjs
│ │ │ └── subtitle_caption.mjs
│ │ ├── fixes.json
│ │ ├── fixes
│ │ │ ├── 143.mjs
│ │ │ ├── 144.mjs
│ │ │ ├── 146.mjs
│ │ │ ├── 163.mjs
│ │ │ ├── 174.mjs
│ │ │ ├── 250.mjs
│ │ │ ├── 252.mjs
│ │ │ ├── 319.mjs
│ │ │ ├── 320.mjs
│ │ │ ├── 32303048.mjs
│ │ │ ├── 327.mjs
│ │ │ ├── 333.mjs
│ │ │ ├── 38072036.mjs
│ │ │ ├── 41932946.mjs
│ │ │ ├── 42836788.mjs
│ │ │ ├── 450.mjs
│ │ │ ├── 47977099.mjs
│ │ │ ├── 530.mjs
│ │ │ ├── 536.mjs
│ │ │ ├── 53913538.mjs
│ │ │ ├── 53978116.mjs
│ │ │ ├── 540.mjs
│ │ │ ├── 55278793.mjs
│ │ │ ├── 75.mjs
│ │ │ └── 91.mjs
│ │ ├── style_tests.json
│ │ ├── style_tests
│ │ │ ├── legend
│ │ │ │ └── offsetY.mjs
│ │ │ └── plot
│ │ │ │ ├── backgroundColor
│ │ │ │ ├── err.mjs
│ │ │ │ ├── hex.mjs
│ │ │ │ ├── hexa.mjs
│ │ │ │ ├── hexshort.mjs
│ │ │ │ ├── rgb.mjs
│ │ │ │ └── rgba.mjs
│ │ │ │ ├── borderColor
│ │ │ │ └── hexa.mjs
│ │ │ │ ├── borderWidth.mjs
│ │ │ │ ├── interlacing.mjs
│ │ │ │ ├── paddingBottom.mjs
│ │ │ │ ├── paddingLeft.mjs
│ │ │ │ ├── paddingRight.mjs
│ │ │ │ ├── paddingTop.mjs
│ │ │ │ ├── spacing.mjs
│ │ │ │ ├── xAxis
│ │ │ │ ├── color
│ │ │ │ │ └── hexa.mjs
│ │ │ │ ├── interlacing
│ │ │ │ │ └── color
│ │ │ │ │ │ └── hexa.mjs
│ │ │ │ ├── label
│ │ │ │ │ ├── angle
│ │ │ │ │ │ ├── deg.mjs
│ │ │ │ │ │ ├── grad.mjs
│ │ │ │ │ │ ├── number.mjs
│ │ │ │ │ │ ├── rad.mjs
│ │ │ │ │ │ └── turn.mjs
│ │ │ │ │ ├── autorotate.mjs
│ │ │ │ │ ├── color
│ │ │ │ │ │ └── hexa.mjs
│ │ │ │ │ ├── fontSize
│ │ │ │ │ │ ├── elementFontPercentage.mjs
│ │ │ │ │ │ ├── elementPercentage.mjs
│ │ │ │ │ │ ├── number.mjs
│ │ │ │ │ │ └── pixel.mjs
│ │ │ │ │ ├── fontStyle.mjs
│ │ │ │ │ ├── fontWeight.mjs
│ │ │ │ │ ├── orientation.mjs
│ │ │ │ │ ├── paddingBottom.mjs
│ │ │ │ │ ├── paddingLeft.mjs
│ │ │ │ │ ├── paddingRight.mjs
│ │ │ │ │ ├── paddingTop.mjs
│ │ │ │ │ ├── position.mjs
│ │ │ │ │ ├── side.mjs
│ │ │ │ │ └── textAlign.mjs
│ │ │ │ └── ticks
│ │ │ │ │ ├── color
│ │ │ │ │ └── hexa.mjs
│ │ │ │ │ ├── length
│ │ │ │ │ ├── elementFontPercentage.mjs
│ │ │ │ │ ├── elementPercentage.mjs
│ │ │ │ │ ├── number.mjs
│ │ │ │ │ └── pixel.mjs
│ │ │ │ │ ├── lineWidth.mjs
│ │ │ │ │ └── position.mjs
│ │ │ │ └── yAxis
│ │ │ │ ├── color
│ │ │ │ └── hexa.mjs
│ │ │ │ ├── interlacing
│ │ │ │ └── color
│ │ │ │ │ └── hexa.mjs
│ │ │ │ └── ticks
│ │ │ │ ├── color
│ │ │ │ └── hexa.mjs
│ │ │ │ ├── length
│ │ │ │ ├── elementFontPercentage.mjs
│ │ │ │ ├── elementPercentage.mjs
│ │ │ │ ├── number.mjs
│ │ │ │ └── pixel.mjs
│ │ │ │ ├── lineWidth.mjs
│ │ │ │ └── position.mjs
│ │ ├── tickets.json
│ │ └── tickets
│ │ │ ├── 138.mjs
│ │ │ ├── 142.mjs
│ │ │ ├── 145.mjs
│ │ │ ├── 146.mjs
│ │ │ ├── 255.mjs
│ │ │ ├── 268.mjs
│ │ │ ├── 300.mjs
│ │ │ ├── 361.mjs
│ │ │ ├── 372.mjs
│ │ │ ├── 376.mjs
│ │ │ ├── 377.mjs
│ │ │ ├── 378.mjs
│ │ │ ├── 397.mjs
│ │ │ └── 398.mjs
│ ├── tools
│ │ └── manual
│ │ │ ├── client
│ │ │ ├── frame.html
│ │ │ ├── frame.js
│ │ │ ├── index.html
│ │ │ ├── index.js
│ │ │ ├── test-case.js
│ │ │ ├── test-lib.js
│ │ │ └── url.js
│ │ │ ├── server
│ │ │ ├── handlers
│ │ │ │ ├── libs.cjs
│ │ │ │ ├── test-case.cjs
│ │ │ │ └── tests.cjs
│ │ │ └── main.cjs
│ │ │ └── shared
│ │ │ └── test-case.js
│ └── utils
│ │ ├── lastanimation.mjs
│ │ ├── mouse.mjs
│ │ ├── testcontrol.mjs
│ │ ├── vizzu-markerdropshadow.mjs
│ │ ├── vizzu-pptxgen.mjs
│ │ ├── vizzu-svgrender.mjs
│ │ └── vizzu-videocapture.mjs
├── qtest
│ ├── chart.cpp
│ ├── chart.h
│ ├── main.cpp
│ ├── window.cpp
│ ├── window.h
│ └── window.ui
└── unit
│ ├── apps
│ └── weblib
│ │ └── js-api
│ │ ├── cssutils.test.js
│ │ ├── unpivot.test.data
│ │ ├── unpivot.test.data.1D.js
│ │ └── unpivot.test.data.3D.js
│ │ └── unpivot.test.js
│ ├── base
│ ├── conv
│ │ ├── auto_json.cpp
│ │ ├── numtostr.cpp
│ │ ├── parse.cpp
│ │ └── tostring.cpp
│ ├── gfx
│ │ └── color.cpp
│ ├── refl
│ │ ├── auto_accessor.cpp
│ │ ├── auto_enum.cpp
│ │ ├── auto_struct.cpp
│ │ └── struct.cpp
│ ├── style
│ │ └── parammerger.cpp
│ ├── testclasses.h
│ └── text
│ │ └── funcstring.cpp
│ ├── chart
│ └── events.cpp
│ ├── dataframe
│ └── interface_test.cpp
│ ├── jest.config.js
│ ├── test.cpp
│ └── util
│ ├── ansi.h
│ ├── application.h
│ ├── arguments.h
│ ├── case.h
│ ├── case_registry.h
│ ├── collection.h
│ ├── compiler.h
│ ├── condition.h
│ ├── src_location.h
│ ├── suite_proxy.h
│ ├── test.h
│ └── to_string.h
└── tools
├── ci
├── .pylintrc
├── docker
│ ├── vizzu-dev-desktop
│ └── vizzu-dev-wasm
├── gcp
│ ├── cloudbucket
│ │ └── CORS
│ │ │ ├── cors.json
│ │ │ └── cors.md
│ ├── cloudbuild
│ │ └── cloudbuild.yaml
│ ├── cloudfunctions
│ │ └── getVizzuList
│ │ │ ├── index.js
│ │ │ └── package.json
│ └── cloudrun
│ │ └── slack
│ │ ├── slack.md
│ │ └── slackconfig
├── markdown_format.py
├── pdm.lock
├── purge.cjs
├── pyproject.toml
├── rollup.config.cjs
├── run
│ ├── docs-build.sh
│ ├── docs-deploy.sh
│ ├── docs-gen-thumbnail-gsutil.sh
│ ├── docs-gen-thumbnail.sh
│ ├── format-black-py.sh
│ ├── format-mdformat-py.sh
│ ├── init-py.sh
│ ├── lint-pylint-py.sh
│ ├── lock-py.sh
│ ├── pkg-build-desktop-clangformat.sh
│ ├── pkg-build-desktop-clangtidy.sh
│ ├── pkg-build-desktop.sh
│ ├── pkg-build-js.sh
│ ├── pkg-build-ts.sh
│ ├── pkg-build-wasm-wocpp-gsutil.sh
│ ├── pkg-build-wasm-wocpp.sh
│ ├── pkg-build-wasm.sh
│ ├── pkg-purge-js.sh
│ ├── pkg-rollup-js.sh
│ ├── pkg-set-version-js.sh
│ ├── test-gsutil.sh
│ └── type-mypy-py.sh
├── sizeCheck.cjs
├── std_check.py
├── type
│ ├── gen-canvas-h.cjs
│ ├── gen-canvas-js.cjs
│ ├── gen-canvas-ts.cjs
│ ├── gen-dts.cjs
│ ├── gen-presets.cjs
│ └── gen-simple.cjs
└── version.cjs
├── docs
├── config.py
├── deploy.py
├── examples
│ ├── gen_examples.py
│ ├── gen_thumbnails.py
│ ├── gen_webcontent_hash.cjs
│ ├── mjs2csv.mjs
│ ├── mjs2js.mjs
│ └── mjs2md.mjs
├── mkdocs.yml
├── overrides
│ ├── main.html
│ └── mike
│ │ └── redirect.html
├── pages
│ └── gen_pages.py
├── placeholder.py
├── reference
│ ├── gen_reference.cjs
│ └── gen_reference.py
└── style
│ ├── gen_style_reference.mjs
│ └── gen_style_reference.py
├── gittools
├── commitdepth.sh
├── gitcpp.sh
├── hash.sh
└── root.sh
├── js2csv
└── js2csv.js
├── modules
├── chdir.py
├── node.py
└── vizzu.py
├── swatools
├── cincdep.sh
├── cincdot.sh
├── cmoddep.sh
├── cmoduml.sh
├── linelen.sh
├── lscmod.sh
├── lscsrc.sh
├── lssrc.sh
├── slcsv.sh
├── sloc.sh
└── todos.sh
└── warnings
├── tidy-warnings.sh
└── warnings.sh
/.github/workflows/cd.yml:
--------------------------------------------------------------------------------
1 | name: CD
2 |
3 | on:
4 | release:
5 | types: [published]
6 |
7 | jobs:
8 | publish:
9 | runs-on: ubuntu-22.04
10 |
11 | steps:
12 | - name: Trigger Cloud Build
13 | run: |
14 | curl -X POST -H "Content-type: application/json" "https://cloudbuild.googleapis.com/v1/projects/vizzu-ci/triggers/vizzu-lib-release:webhook?key=${{ secrets.VIZZUHQ_GCP_BUILD }}" -d "{}"
15 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .vscode
2 |
3 | build*
4 | dist
5 |
6 | .coverage
7 | test_report
8 | test_report.tgz
9 | *.ppt
10 | *.pptx
11 | *.ipynb
12 |
13 | __pycache__
14 |
15 | .venv*
16 | vizzu_dev*
17 | .pdm-python
18 |
19 | placeholder-plugin.yaml
20 | docs/examples/**/*.png
21 | docs/examples/**/*.mp4
22 | docs/examples/**/*.webm
23 | docs/assets/dist
24 | docs/readme
25 | docs/showcases
26 | site
27 | node_modules
28 | tmp
29 |
30 | .DS_Store
31 | release
32 | *.lib
33 | *.user
34 | *.wasm
35 | *.data
36 | *.wast
37 | *.map
38 | *.o
39 | *.gz
40 | *.a
41 | git.cpp
42 | cvizzu.js
43 | presets.yaml
44 | Makefile
45 | /index.html
46 |
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | *.md
2 | .clang-tidy
3 |
--------------------------------------------------------------------------------
/.puppeteerrc.cjs:
--------------------------------------------------------------------------------
1 | const { join } = require('path')
2 |
3 | module.exports = {
4 | cacheDirectory: join(__dirname, 'node_modules', '.cache', 'puppeteer')
5 | }
6 |
--------------------------------------------------------------------------------
/NOTICE:
--------------------------------------------------------------------------------
1 | Vizzu
2 | Copyright 2021-2024 Vizzu Inc.
3 |
4 | This product includes software developed at Vizzu Inc.
5 |
--------------------------------------------------------------------------------
/docs/assets/data/music_data.csv:
--------------------------------------------------------------------------------
1 | Genres,Kinds,Popularity
2 | Pop,Hard,114
3 | Rock,Hard,96
4 | Jazz,Hard,78
5 | Metal,Hard,52
6 | Pop,Smooth,56
7 | Rock,Experimental,36
8 | Jazz,Smooth,174
9 | Metal,Smooth,121
10 | Pop,Experimental,127
11 | Rock,Experimental,83
12 | Jazz,Experimental,94
13 | Metal,Experimental,58
--------------------------------------------------------------------------------
/docs/assets/data/music_data.json:
--------------------------------------------------------------------------------
1 | {
2 | "dimensions": [
3 | { "name": "Genres", "values": ["Pop", "Rock", "Jazz", "Metal"] },
4 | { "name": "Kinds", "values": ["Hard", "Smooth", "Experimental"] }
5 | ],
6 | "measures": [
7 | {
8 | "name": "Popularity",
9 | "values": [
10 | [114, 96, 78, 52],
11 | [56, 36, 174, 121],
12 | [127, 83, 94, 58]
13 | ]
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/docs/assets/favicon.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/docs/assets/javascripts/highlight.js:
--------------------------------------------------------------------------------
1 | document.addEventListener('DOMContentLoaded', (event) => {
2 | document.querySelectorAll('pre code').forEach((el) => {
3 | if (window.location.href.includes('LICENSE')) {
4 | return
5 | }
6 |
7 | hljs.highlightElement(el) // eslint-disable-line no-undef
8 | if (
9 | window.location.href.includes('/examples/') ||
10 | window.location.href.includes('/showcases/')
11 | ) {
12 | hljs.lineNumbersBlock(el) // eslint-disable-line no-undef
13 | }
14 | })
15 | })
16 |
--------------------------------------------------------------------------------
/docs/assets/javascripts/iframe/autoheight.js:
--------------------------------------------------------------------------------
1 | const iframe = document.getElementById('showcase')
2 |
3 | iframe.addEventListener('load', function () {
4 | const childBody = iframe.contentWindow.document.body
5 |
6 | function resizeIframe() {
7 | const childHeight = childBody.scrollHeight
8 | iframe.style.height = childHeight + 50 + 'px' // todo: get showcase explorers size correctly
9 | }
10 |
11 | resizeIframe()
12 |
13 | iframe.contentWindow.addEventListener('resize', resizeIframe)
14 | })
15 |
--------------------------------------------------------------------------------
/docs/assets/javascripts/iframe/click.js:
--------------------------------------------------------------------------------
1 | const collection = document.getElementsByClassName('showcase')
2 | if (collection) {
3 | collection[0].addEventListener('click', () => {
4 | const iframe = document.getElementById('showcase')
5 | iframe.src = iframe.src // eslint-disable-line no-self-assign
6 | })
7 | }
8 |
--------------------------------------------------------------------------------
/docs/assets/stylesheets/gallery.css:
--------------------------------------------------------------------------------
1 | .image-gallery {
2 | max-width: 320px;
3 | border: 1px solid #ddd;
4 | margin: 20px;
5 | }
6 |
7 | .image-gallery-w-caption {
8 | max-width: 320px;
9 | border: 1px solid #ddd;
10 | margin: 20px;
11 | margin-bottom: 0px !important;
12 | }
13 |
14 | .image-figure {
15 | margin: 0px !important;
16 | }
17 |
18 | .image-caption {
19 | margin: 0px;
20 | margin-bottom: 20px !important;
21 | font-family: 'Roboto' !important;
22 | font-style: normal !important;
23 | }
24 |
25 | .image-center {
26 | display: block;
27 | margin-left: auto;
28 | margin-right: auto;
29 | }
30 |
--------------------------------------------------------------------------------
/docs/assets/stylesheets/style_reference.css:
--------------------------------------------------------------------------------
1 | .not-collapsible-style {
2 | text-align: left;
3 | font-size: 0.8rem;
4 | margin: 5px;
5 | }
6 |
7 | .collapsible-style,
8 | .allbtn-style {
9 | cursor: pointer;
10 | font-size: 0.8rem;
11 | margin: 5px;
12 | }
13 |
14 | .collapsible-style:hover button,
15 | .allbtn-style:hover button {
16 | color: #4171cd;
17 | }
18 |
19 | .collapsible-style-content {
20 | max-height: 0;
21 | overflow: hidden;
22 | transition: max-height 0.1s ease-out;
23 | }
24 |
--------------------------------------------------------------------------------
/docs/installation.md:
--------------------------------------------------------------------------------
1 | # Installation
2 |
3 | Install via [npm](https://www.npmjs.com/package/vizzu):
4 |
5 | ```sh
6 | npm install vizzu
7 | ```
8 |
9 | Or use it from [CDN](https://www.jsdelivr.com/package/npm/vizzu):
10 |
11 | ```html
12 |
13 |
14 |
18 |
19 |
20 |
21 | ```
22 |
--------------------------------------------------------------------------------
/docs/tutorial/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | globals: {
3 | chart: true,
4 | Vizzu: true,
5 | assets: true,
6 | image: true,
7 | clickHandler: true,
8 | labelDrawHandler: true,
9 | logoDrawHandler: true,
10 | backgroundImageHandler: true
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/01_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Sum of all Popularity Values'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/01_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: { set: ['Popularity'] }
5 | }
6 | }
7 | })
8 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/01_c.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Sum of Popularity by Genre'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/01_d.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | x: { set: ['Genres'] }
5 | }
6 | }
7 | })
8 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/02_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Minimum of Popularity by Genre'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/02_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: { set: ['min(Popularity)'] }
5 | }
6 | }
7 | })
8 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/03_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Maximum of Popularity by Genre'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/03_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: { set: ['max(Popularity)'] }
5 | }
6 | }
7 | })
8 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/04_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Mean of Popularity by Genre'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/04_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: { set: ['mean(Popularity)'] }
5 | }
6 | }
7 | })
8 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/05_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Count of items by Genre'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/05_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: { set: ['count()'] }
5 | }
6 | }
7 | })
8 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/06_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Distinct Kinds by Genre'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/06_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: { set: ['distinct(Kinds)'] }
5 | }
6 | }
7 | })
8 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/07_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Sum of Popularity by Genre'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/07_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: { set: ['sum(Popularity)'] }
5 | }
6 | }
7 | })
8 |
--------------------------------------------------------------------------------
/docs/tutorial/aggregating_data/config.js:
--------------------------------------------------------------------------------
1 | export default [
2 | ['01_a', '01_b', '01_c', '01_d'],
3 | ['02_a', '02_b'],
4 | ['03_a', '03_b'],
5 | ['04_a', '04_b'],
6 | ['05_a', '05_b'],
7 | ['06_a', '06_b'],
8 | ['07_a', '07_b']
9 | ]
10 |
--------------------------------------------------------------------------------
/docs/tutorial/align_range/01.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: {
5 | align: 'center',
6 | labels: false
7 | }
8 | }
9 | }
10 | })
11 |
--------------------------------------------------------------------------------
/docs/tutorial/align_range/02_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Align: stretch = % view'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/align_range/02_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | y: {
4 | align: 'stretch',
5 | labels: true
6 | }
7 | }
8 | })
9 |
--------------------------------------------------------------------------------
/docs/tutorial/align_range/03_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Align: none - default'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/align_range/03_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | y: {
4 | align: 'none'
5 | }
6 | }
7 | })
8 |
--------------------------------------------------------------------------------
/docs/tutorial/align_range/04_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Axis range set proportionally to shown values'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/align_range/04_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: {
5 | range: {
6 | max: '150%'
7 | }
8 | }
9 | }
10 | }
11 | })
12 |
--------------------------------------------------------------------------------
/docs/tutorial/align_range/05_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Axis range set explicitly on an axis with discrete series'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/align_range/05_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | x: {
5 | range: {
6 | min: -2,
7 | max: 3
8 | }
9 | }
10 | }
11 | }
12 | })
13 |
--------------------------------------------------------------------------------
/docs/tutorial/align_range/06_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Back to the default ranges'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/align_range/06_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: {
5 | range: {
6 | max: 'auto'
7 | }
8 | },
9 | x: {
10 | range: {
11 | min: 'auto',
12 | max: 'auto'
13 | }
14 | }
15 | }
16 | }
17 | })
18 |
--------------------------------------------------------------------------------
/docs/tutorial/align_range/config.js:
--------------------------------------------------------------------------------
1 | export default [
2 | [
3 | {
4 | name: '../assets/setup/setup_c',
5 | replace: [['config: {', "config: {title: 'Align: center',"]]
6 | },
7 | '01'
8 | ],
9 | ['02_a', '02_b'],
10 | ['03_a', '03_b'],
11 | ['04_a', '04_b'],
12 | ['05_a', '05_b'],
13 | ['06_a', '06_b']
14 | ]
15 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_control_keyframes/01.js:
--------------------------------------------------------------------------------
1 | chart
2 | .animate({
3 | config: {
4 | channels: {
5 | x: {
6 | attach: ['Kinds']
7 | },
8 | y: {
9 | detach: ['Kinds']
10 | }
11 | }
12 | }
13 | })
14 | .activated.then((control) => control.seek('50%'))
15 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_control_keyframes/02_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Using initial animation control parameters'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_control_keyframes/02_b.js:
--------------------------------------------------------------------------------
1 | chart
2 | .animate(
3 | {
4 | config: {
5 | channels: {
6 | x: {
7 | detach: ['Kinds']
8 | },
9 | y: {
10 | attach: ['Kinds']
11 | }
12 | }
13 | }
14 | },
15 | {
16 | playState: 'paused',
17 | position: 0.5
18 | }
19 | )
20 | .activated.then((control) => control.play())
21 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_control_keyframes/03_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Using keyframes'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_control_keyframes/03_b.js:
--------------------------------------------------------------------------------
1 | chart.animate([
2 | {
3 | target: {
4 | config: {
5 | channels: {
6 | x: {
7 | attach: ['Kinds']
8 | },
9 | y: {
10 | detach: ['Kinds']
11 | }
12 | }
13 | }
14 | },
15 | options: {
16 | duration: 0.5
17 | }
18 | },
19 | {
20 | target: {
21 | config: {
22 | channels: {
23 | x: {
24 | detach: ['Kinds']
25 | },
26 | y: {
27 | attach: ['Kinds']
28 | }
29 | }
30 | }
31 | },
32 | options: {
33 | duration: 1
34 | }
35 | }
36 | ])
37 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_control_keyframes/config.js:
--------------------------------------------------------------------------------
1 | export default [
2 | [
3 | {
4 | name: '../assets/setup/setup_c',
5 | replace: [
6 | [
7 | 'config: {',
8 | "config: {title: 'Jumping from 0% to 50% progress at the begining of the animation',"
9 | ]
10 | ]
11 | },
12 | {
13 | name: '01',
14 | returnOriginal: true
15 | }
16 | ],
17 | [
18 | '02_a',
19 | {
20 | name: '02_b',
21 | returnOriginal: true
22 | }
23 | ],
24 | [
25 | '03_a',
26 | {
27 | name: '03_b',
28 | returnOriginal: true
29 | }
30 | ]
31 | ]
32 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_options/01.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: {
5 | detach: ['Kinds']
6 | },
7 | x: {
8 | attach: ['Kinds']
9 | }
10 | }
11 | }
12 | })
13 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_options/02_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Default options - step 2'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_options/02_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | x: {
5 | detach: ['Kinds']
6 | },
7 | y: {
8 | attach: ['Kinds']
9 | }
10 | }
11 | }
12 | })
13 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_options/03_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Custom animation settings for specific groups'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_options/03_b.js:
--------------------------------------------------------------------------------
1 | chart.animate(
2 | {
3 | config: {
4 | channels: {
5 | x: {
6 | attach: ['Kinds']
7 | },
8 | y: {
9 | detach: ['Kinds']
10 | }
11 | }
12 | }
13 | },
14 | {
15 | y: {
16 | duration: 2,
17 | delay: 2
18 | },
19 | style: {
20 | duration: 2,
21 | delay: 4
22 | }
23 | }
24 | )
25 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_options/04_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Custom options for the whole animation'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_options/04_b.js:
--------------------------------------------------------------------------------
1 | chart.animate(
2 | {
3 | config: {
4 | channels: {
5 | x: {
6 | detach: ['Kinds']
7 | },
8 | y: {
9 | attach: ['Kinds']
10 | }
11 | }
12 | }
13 | },
14 | {
15 | duration: 1,
16 | easing: 'linear'
17 | }
18 | )
19 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_options/05_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Custom settings for both'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_options/05_b.js:
--------------------------------------------------------------------------------
1 | chart.animate(
2 | {
3 | config: {
4 | channels: {
5 | x: {
6 | attach: ['Kinds']
7 | },
8 | y: {
9 | detach: ['Kinds']
10 | }
11 | }
12 | }
13 | },
14 | {
15 | duration: 1,
16 | easing: 'linear',
17 | y: {
18 | duration: 2,
19 | delay: 2
20 | },
21 | style: {
22 | duration: 2,
23 | delay: 4
24 | }
25 | }
26 | )
27 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_options/06_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Custom unit for duration'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_options/06_b.js:
--------------------------------------------------------------------------------
1 | chart.animate(
2 | {
3 | config: {
4 | channels: {
5 | x: {
6 | detach: ['Kinds']
7 | },
8 | y: {
9 | attach: ['Kinds']
10 | }
11 | }
12 | }
13 | },
14 | '500ms'
15 | )
16 |
--------------------------------------------------------------------------------
/docs/tutorial/animation_options/config.js:
--------------------------------------------------------------------------------
1 | export default [
2 | [
3 | {
4 | name: '../assets/setup/setup_c',
5 | replace: [['config: {', "config: {title: 'Default options - step 1',"]]
6 | },
7 | '01'
8 | ],
9 | ['02_a', '02_b'],
10 | ['03_a', '03_b'],
11 | ['04_a', '04_b'],
12 | ['05_a', '05_b'],
13 | ['06_a', '06_b']
14 | ]
15 |
--------------------------------------------------------------------------------
/docs/tutorial/assets/setup/setup_a.md:
--------------------------------------------------------------------------------
1 | ??? info "Info - How to setup Vizzu"
2 | // {% include-markdown "tutorial/assets/setup/init.md" %}
3 |
--------------------------------------------------------------------------------
/docs/tutorial/assets/setup/setup_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: {
5 | set: ['Popularity']
6 | },
7 | x: {
8 | set: ['Genres']
9 | }
10 | }
11 | }
12 | })
13 |
--------------------------------------------------------------------------------
/docs/tutorial/assets/setup/setup_b.md:
--------------------------------------------------------------------------------
1 | ??? info "Info - How to setup Vizzu"
2 | // {% include-markdown "tutorial/assets/setup/init.md" %}
3 |
4 | ```javascript
5 | // {% include "tutorial/assets/setup/setup_b.js" %}
6 | ```
7 |
--------------------------------------------------------------------------------
/docs/tutorial/assets/setup/setup_c.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: {
5 | set: ['Popularity', 'Kinds']
6 | },
7 | x: {
8 | set: ['Genres']
9 | },
10 | color: {
11 | set: ['Kinds']
12 | },
13 | label: {
14 | set: ['Popularity']
15 | }
16 | }
17 | }
18 | })
19 |
--------------------------------------------------------------------------------
/docs/tutorial/assets/setup/setup_c.md:
--------------------------------------------------------------------------------
1 | ??? info "Info - How to setup Vizzu"
2 | // {% include-markdown "tutorial/assets/setup/init.md" %}
3 |
4 | ```javascript
5 | // {% include "tutorial/assets/setup/setup_c.js" %}
6 | ```
7 |
--------------------------------------------------------------------------------
/docs/tutorial/axes_title_tooltip/01.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: {
5 | set: [
6 | {
7 | name: 'Popularity'
8 | }
9 | ]
10 | },
11 | x: {
12 | set: [
13 | {
14 | name: 'Genres'
15 | }
16 | ]
17 | }
18 | }
19 | }
20 | })
21 |
--------------------------------------------------------------------------------
/docs/tutorial/axes_title_tooltip/02.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | x: {
5 | set: null
6 | },
7 | y: {
8 | set: ['Genres', 'Popularity']
9 | }
10 | }
11 | }
12 | })
13 |
--------------------------------------------------------------------------------
/docs/tutorial/axes_title_tooltip/03.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: {
5 | detach: ['Popularity']
6 | },
7 | x: {
8 | attach: ['Popularity']
9 | }
10 | }
11 | }
12 | })
13 |
--------------------------------------------------------------------------------
/docs/tutorial/axes_title_tooltip/04_a.js:
--------------------------------------------------------------------------------
1 | console.log(chart.config)
2 |
--------------------------------------------------------------------------------
/docs/tutorial/axes_title_tooltip/04_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'My first chart'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/axes_title_tooltip/05.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | subtitle: 'with fancy animations',
4 | caption: 'Source: Vizzu tutorial'
5 | }
6 | })
7 |
--------------------------------------------------------------------------------
/docs/tutorial/axes_title_tooltip/06.js:
--------------------------------------------------------------------------------
1 | chart.feature('tooltip', true)
2 |
--------------------------------------------------------------------------------
/docs/tutorial/axes_title_tooltip/config.js:
--------------------------------------------------------------------------------
1 | export default [
2 | ['../assets/setup/setup_b', '01'],
3 | ['02'],
4 | ['03'],
5 | [{ name: '04_a', returnOriginal: true }, '04_b'],
6 | ['05'],
7 | [{ name: '06', returnOriginal: true }]
8 | ]
9 |
--------------------------------------------------------------------------------
/docs/tutorial/changing_dimensions/01.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | x: {
5 | set: null
6 | }
7 | }
8 | }
9 | })
10 |
--------------------------------------------------------------------------------
/docs/tutorial/changing_dimensions/02_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Changing dimensions'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/changing_dimensions/02_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: { detach: ['Kinds'] },
5 | x: { set: ['Genres'] },
6 | color: { set: null }
7 | }
8 | }
9 | })
10 |
--------------------------------------------------------------------------------
/docs/tutorial/changing_dimensions/03_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Changing dimensions by drilling down'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/changing_dimensions/03_b.js:
--------------------------------------------------------------------------------
1 | chart.animate(
2 | {
3 | config: {
4 | channels: {
5 | x: { detach: ['Genres'], attach: ['Kinds'] }
6 | }
7 | }
8 | },
9 | { regroupStrategy: 'drilldown' }
10 | )
11 |
--------------------------------------------------------------------------------
/docs/tutorial/changing_dimensions/04_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Changing dimensions with fading'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/changing_dimensions/04_b.js:
--------------------------------------------------------------------------------
1 | chart.animate(
2 | {
3 | config: {
4 | channels: {
5 | x: { detach: ['Kinds'], attach: ['Genres'] }
6 | }
7 | }
8 | },
9 | { regroupStrategy: 'fade' }
10 | )
11 |
--------------------------------------------------------------------------------
/docs/tutorial/changing_dimensions/05_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Drill-down'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/changing_dimensions/05_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: { attach: ['Kinds'] },
5 | color: { set: ['Kinds'] }
6 | }
7 | }
8 | })
9 |
--------------------------------------------------------------------------------
/docs/tutorial/changing_dimensions/config.js:
--------------------------------------------------------------------------------
1 | export default [
2 | [
3 | {
4 | name: '../assets/setup/setup_c',
5 | replace: [['config: {', "config: {title: 'Aggregate',"]]
6 | },
7 | '01'
8 | ],
9 | ['02_a', '02_b'],
10 | ['03_a', '03_b'],
11 | ['04_a', '04_b'],
12 | ['05_a', '05_b']
13 | ]
14 |
--------------------------------------------------------------------------------
/docs/tutorial/channels_legend/01.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | label: {
5 | attach: ['Popularity']
6 | }
7 | }
8 | }
9 | })
10 |
--------------------------------------------------------------------------------
/docs/tutorial/channels_legend/02_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Lightness - legend on'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/channels_legend/02_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | lightness: {
5 | attach: ['Popularity']
6 | }
7 | },
8 | legend: 'lightness'
9 | }
10 | })
11 |
--------------------------------------------------------------------------------
/docs/tutorial/channels_legend/03_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Color'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/channels_legend/03_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | lightness: {
5 | set: null
6 | },
7 | color: {
8 | attach: ['Genres']
9 | }
10 | },
11 | legend: 'color'
12 | }
13 | })
14 |
--------------------------------------------------------------------------------
/docs/tutorial/channels_legend/04_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Size - change of geometry required'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/channels_legend/04_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | size: {
5 | set: ['Popularity']
6 | }
7 | },
8 | geometry: 'circle'
9 | }
10 | })
11 |
--------------------------------------------------------------------------------
/docs/tutorial/channels_legend/config.js:
--------------------------------------------------------------------------------
1 | export default [
2 | [
3 | {
4 | name: '../assets/setup/setup_b',
5 | replace: [['config: {', "config: {title: 'Label',"]]
6 | },
7 | '01'
8 | ],
9 | ['02_a', '02_b'],
10 | ['03_a', '03_b'],
11 | ['04_a', '04_b']
12 | ]
13 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_layout/01.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | style: {
3 | backgroundColor: '#A0A0A0',
4 | plot: {
5 | backgroundColor: '#D2D2D2'
6 | },
7 | legend: {
8 | backgroundColor: '#808080'
9 | }
10 | }
11 | })
12 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_layout/02_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Legend width'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_layout/02_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | style: {
3 | legend: {
4 | width: 50
5 | }
6 | }
7 | })
8 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_layout/03.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | style: {
3 | legend: {
4 | width: null
5 | }
6 | }
7 | })
8 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_layout/04_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Title padding'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_layout/04_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | style: {
3 | title: {
4 | paddingTop: 20,
5 | paddingBottom: 20,
6 | paddingLeft: 200
7 | }
8 | }
9 | })
10 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_layout/05.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | style: {
3 | title: {
4 | paddingTop: null,
5 | paddingBottom: null,
6 | paddingLeft: null
7 | }
8 | }
9 | })
10 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_layout/06_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Plot padding'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_layout/06_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | style: {
3 | plot: {
4 | paddingLeft: 100,
5 | paddingRight: 100
6 | }
7 | }
8 | })
9 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_layout/07.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | style: {
3 | plot: {
4 | paddingLeft: null,
5 | paddingRight: null
6 | }
7 | }
8 | })
9 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_layout/config.js:
--------------------------------------------------------------------------------
1 | export default [
2 | [
3 | {
4 | name: '../assets/setup/setup_c',
5 | replace: [['config: {', "config: {title: 'Plot, legend and background',"]]
6 | },
7 | '01'
8 | ],
9 | ['02_a', '02_b'],
10 | ['03'],
11 | ['04_a', '04_b'],
12 | ['05'],
13 | ['06_a', '06_b'],
14 | ['07']
15 | ]
16 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_presets/01_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Using a preset'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_presets/01_b.js:
--------------------------------------------------------------------------------
1 | chart.animate(
2 | Vizzu.presets.stackedBubble({
3 | size: 'Popularity',
4 | color: 'Kinds',
5 | stackedBy: 'Genres'
6 | })
7 | )
8 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_presets/02_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Set sorting for a chart preset'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_presets/02_b.js:
--------------------------------------------------------------------------------
1 | chart.animate(
2 | Vizzu.presets.radialStackedBar({
3 | angle: 'Popularity',
4 | radius: 'Genres',
5 | stackedBy: 'Kinds',
6 | sort: 'byValue'
7 | })
8 | )
9 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_presets/03_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Setting style for a preset'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_presets/03_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: Vizzu.presets.radialBar({
3 | angle: 'Popularity',
4 | radius: 'Genres'
5 | }),
6 | style: {
7 | 'plot.xAxis.interlacing.color': '#ffffff00'
8 | }
9 | })
10 |
--------------------------------------------------------------------------------
/docs/tutorial/chart_presets/config.js:
--------------------------------------------------------------------------------
1 | export default [
2 | ['01_a', { name: '01_b', replace: [['Vizzu.presets.', 'chart.constructor.presets.']] }],
3 | ['02_a', { name: '02_b', replace: [['Vizzu.presets.', 'chart.constructor.presets.']] }],
4 | ['03_a', { name: '03_b', replace: [['Vizzu.presets.', 'chart.constructor.presets.']] }]
5 | ]
6 |
--------------------------------------------------------------------------------
/docs/tutorial/color_palette_fonts/01_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | style: {
3 | plot: {
4 | marker: {
5 | colorPalette: '#9355e8FF #123456FF #BDAF10FF'
6 | }
7 | }
8 | }
9 | })
10 |
--------------------------------------------------------------------------------
/docs/tutorial/color_palette_fonts/01_b.js:
--------------------------------------------------------------------------------
1 | console.log(chart.style)
2 |
--------------------------------------------------------------------------------
/docs/tutorial/color_palette_fonts/02_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Title font size'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/color_palette_fonts/02_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | style: {
3 | title: {
4 | fontSize: 50
5 | }
6 | }
7 | })
8 |
--------------------------------------------------------------------------------
/docs/tutorial/color_palette_fonts/03_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Title font size - back to default'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/color_palette_fonts/03_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | style: {
3 | title: {
4 | fontSize: null
5 | }
6 | }
7 | })
8 |
--------------------------------------------------------------------------------
/docs/tutorial/color_palette_fonts/04_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Setting all font sizes in one step'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/color_palette_fonts/04_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | style: {
3 | fontSize: 20
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/color_palette_fonts/05_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Setting all style settings back to default'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/color_palette_fonts/05_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | style: null
3 | })
4 |
--------------------------------------------------------------------------------
/docs/tutorial/color_palette_fonts/config.js:
--------------------------------------------------------------------------------
1 | export default [
2 | [
3 | {
4 | name: '../assets/setup/setup_c',
5 | replace: [['config: {', "config: {title: 'Color palette',"]]
6 | },
7 | '01_a',
8 | { name: '01_b', returnOriginal: true }
9 | ],
10 | ['02_a', '02_b'],
11 | ['03_a', '03_b'],
12 | ['04_a', '04_b'],
13 | ['05_a', '05_b']
14 | ]
15 |
--------------------------------------------------------------------------------
/docs/tutorial/events/01.js:
--------------------------------------------------------------------------------
1 | chart.on('click', clickHandler)
2 |
--------------------------------------------------------------------------------
/docs/tutorial/events/02_a.js:
--------------------------------------------------------------------------------
1 | try {
2 | chart.off('plot-axis-label-draw', assets.eventHandler)
3 | } catch (error) {
4 | if (!error.toString().includes('unknown event handler')) {
5 | throw error
6 | }
7 | }
8 | chart = chart.animate({
9 | config: {
10 | title: 'Changing the canvas context before label draw'
11 | }
12 | })
13 |
--------------------------------------------------------------------------------
/docs/tutorial/events/02_b.js:
--------------------------------------------------------------------------------
1 | chart.on('plot-axis-label-draw', labelDrawHandler)
2 |
--------------------------------------------------------------------------------
/docs/tutorial/events/03_a.js:
--------------------------------------------------------------------------------
1 | try {
2 | chart.off('logo-draw', assets.eventHandler)
3 | } catch (error) {
4 | if (!error.toString().includes('unknown event handler')) {
5 | throw error
6 | }
7 | }
8 | chart = chart.animate({
9 | config: {
10 | title: 'Prevent default behavior'
11 | }
12 | })
13 |
--------------------------------------------------------------------------------
/docs/tutorial/events/03_b.js:
--------------------------------------------------------------------------------
1 | chart.on('logo-draw', logoDrawHandler)
2 |
--------------------------------------------------------------------------------
/docs/tutorial/events/04_a.js:
--------------------------------------------------------------------------------
1 | try {
2 | chart.off('background-draw', assets.eventHandler)
3 | } catch (error) {
4 | if (!error.toString().includes('unknown event handler')) {
5 | throw error
6 | }
7 | }
8 | chart = chart.animate({
9 | config: {
10 | title: 'Add background image'
11 | }
12 | })
13 |
--------------------------------------------------------------------------------
/docs/tutorial/events/04_b.js:
--------------------------------------------------------------------------------
1 | image.onload = () => {
2 | chart.on('background-draw', backgroundImageHandler)
3 | }
4 |
--------------------------------------------------------------------------------
/docs/tutorial/filter_add_new_records/01.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | data: {
3 | filter: (record) => record.Genres === 'Pop' || record.Genres === 'Metal'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/filter_add_new_records/02_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Filter by two dimensions'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/filter_add_new_records/02_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | data: {
3 | filter: (record) =>
4 | (record.Genres === 'Pop' || record.Genres === 'Metal') && record.Kinds === 'Smooth'
5 | }
6 | })
7 |
--------------------------------------------------------------------------------
/docs/tutorial/filter_add_new_records/03_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Filter off'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/filter_add_new_records/03_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | data: {
3 | filter: null
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/filter_add_new_records/04_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Adding new records'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/filter_add_new_records/04_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | data: {
3 | records: [
4 | ['Soul', 'Hard', 91],
5 | ['Soul', 'Smooth', 57],
6 | ['Soul', 'Experimental', 115]
7 | ]
8 | }
9 | })
10 |
--------------------------------------------------------------------------------
/docs/tutorial/geometry/01.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | geometry: 'area'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/geometry/02_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Geometry: line'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/geometry/02_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | geometry: 'line'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/geometry/03_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Geometry: circle'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/geometry/03_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | geometry: 'circle'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/geometry/04_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Geometry: rectangle - default'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/geometry/04_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | geometry: 'rectangle'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/geometry/config.js:
--------------------------------------------------------------------------------
1 | export default [
2 | [
3 | {
4 | name: '../assets/setup/setup_b',
5 | replace: [['config: {', "config: {title: 'Geometry: area',"]]
6 | },
7 | '01'
8 | ],
9 | ['02_a', '02_b'],
10 | ['03_a', '03_b'],
11 | ['04_a', '04_b']
12 | ]
13 |
--------------------------------------------------------------------------------
/docs/tutorial/group_stack/01.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: {
5 | attach: ['Kinds']
6 | },
7 | color: {
8 | attach: ['Kinds']
9 | }
10 | }
11 | }
12 | })
13 |
--------------------------------------------------------------------------------
/docs/tutorial/group_stack/02_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: '...then you can add it to another channel = group elements'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/group_stack/02_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: { detach: ['Kinds'] },
5 | x: { attach: ['Kinds'] }
6 | }
7 | }
8 | })
9 |
--------------------------------------------------------------------------------
/docs/tutorial/group_stack/03_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Regrouping the chart'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/group_stack/03_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | x: { set: ['Kinds', 'Genres'] }
5 | }
6 | }
7 | })
8 |
--------------------------------------------------------------------------------
/docs/tutorial/group_stack/04_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: '...doing it the other way is how you stack your chart'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/group_stack/04_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | x: { detach: ['Kinds'] },
5 | y: { attach: ['Kinds'] }
6 | }
7 | }
8 | })
9 |
--------------------------------------------------------------------------------
/docs/tutorial/group_stack/config.js:
--------------------------------------------------------------------------------
1 | export default [
2 | [
3 | {
4 | name: '../assets/setup/setup_b',
5 | replace: [['config: {', "config: {title: 'Creating a stacked chart',"]]
6 | },
7 | '01'
8 | ],
9 | ['02_a', '02_b'],
10 | ['03_a', '03_b'],
11 | ['04_a', '04_b']
12 | ]
13 |
--------------------------------------------------------------------------------
/docs/tutorial/orientation_split_polar/01.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: {
5 | detach: ['Popularity']
6 | },
7 | x: {
8 | attach: ['Popularity']
9 | }
10 | }
11 | }
12 | })
13 |
--------------------------------------------------------------------------------
/docs/tutorial/orientation_split_polar/02_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Split stacked values = show side-by-side'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/orientation_split_polar/02_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | x: { split: true }
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/orientation_split_polar/03_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Merge'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/orientation_split_polar/03_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | x: { split: false }
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/orientation_split_polar/04_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Aggregate'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/orientation_split_polar/04_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | x: {
5 | detach: ['Genres']
6 | }
7 | }
8 | }
9 | })
10 |
--------------------------------------------------------------------------------
/docs/tutorial/orientation_split_polar/05_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Polar coordinates'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/orientation_split_polar/05_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: {
5 | range: {
6 | min: '-30%'
7 | }
8 | }
9 | },
10 | coordSystem: 'polar'
11 | }
12 | })
13 |
--------------------------------------------------------------------------------
/docs/tutorial/orientation_split_polar/config.js:
--------------------------------------------------------------------------------
1 | export default [
2 | [
3 | {
4 | name: '../assets/setup/setup_c',
5 | replace: [
6 | ['config: {', "config: {title: 'Switch the orientation = arrange by other axis',"]
7 | ]
8 | },
9 | '01'
10 | ],
11 | ['02_a', '02_b'],
12 | ['03_a', '03_b'],
13 | ['04_a', '04_b'],
14 | ['05_a', '05_b']
15 | ]
16 |
--------------------------------------------------------------------------------
/docs/tutorial/shorthands_store/01.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | // config: {
3 | y: {
4 | align: 'stretch'
5 | }
6 | // }
7 | })
8 |
--------------------------------------------------------------------------------
/docs/tutorial/shorthands_store/02.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Store function'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/shorthands_store/03_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'When just one series is used'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/shorthands_store/03_b.js:
--------------------------------------------------------------------------------
1 | var animation
2 |
3 | chart
4 | .animate({
5 | channels: {
6 | // x: { attach: [ 'Kinds' ] },
7 | x: {
8 | attach: 'Kinds'
9 | },
10 | // y: { detach: [ 'Kinds' ] },
11 | y: {
12 | detach: 'Kinds',
13 | align: 'none'
14 | }
15 | }
16 | })
17 | .activated.then((control) => {
18 | animation = control.store()
19 | })
20 |
--------------------------------------------------------------------------------
/docs/tutorial/shorthands_store/04_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'When you use set and no other channel options'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/shorthands_store/04_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | channels: {
3 | // y: { set: [ 'Kinds', 'Popularity' ] },
4 | y: ['Kinds', 'Popularity'],
5 | // x: { set: [ 'Genres' ] },
6 | x: 'Genres'
7 | }
8 | })
9 |
--------------------------------------------------------------------------------
/docs/tutorial/shorthands_store/05_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: "You don't have to use the channel object"
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/shorthands_store/05_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | // channels: {
3 | y: 'Kinds',
4 | x: ['Genres', 'Popularity']
5 | // }
6 | })
7 |
--------------------------------------------------------------------------------
/docs/tutorial/shorthands_store/06_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: "You don't have to use the keyframe object"
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/shorthands_store/06_b.js:
--------------------------------------------------------------------------------
1 | chart.animate([
2 | {
3 | // target: {
4 | x: 'Kinds',
5 | y: ['Genres', 'Popularity']
6 | // }
7 | },
8 | {
9 | // target: {
10 | x: ['Genres', 'Popularity'],
11 | y: 'Kinds'
12 | // }
13 | }
14 | ])
15 |
--------------------------------------------------------------------------------
/docs/tutorial/shorthands_store/07_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Shorthand for styles'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/shorthands_store/07_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | style: {
3 | // plot: { xAxis: { label: { fontSize: '150%' } } }
4 | 'plot.xAxis.label.fontSize': '150%',
5 | 'plot.backgroundColor': '#A0A0A0'
6 | }
7 | })
8 |
--------------------------------------------------------------------------------
/docs/tutorial/shorthands_store/08.js:
--------------------------------------------------------------------------------
1 | chart.animate(
2 | {
3 | style: null,
4 | config: {
5 | title: 'Store function',
6 |
7 | channels: {
8 | y: {
9 | set: ['Popularity', 'Kinds'],
10 | align: 'stretch'
11 | },
12 | x: ['Genres'],
13 | label: ['Popularity']
14 | },
15 | color: ['Kinds']
16 | }
17 | },
18 | 0
19 | )
20 |
--------------------------------------------------------------------------------
/docs/tutorial/shorthands_store/09.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | style: null,
3 | config: {
4 | title: 'Store function',
5 | channels: {
6 | y: {
7 | set: ['Popularity', 'Kinds'],
8 | align: 'stretch'
9 | },
10 | x: ['Genres'],
11 | label: ['Popularity']
12 | },
13 | color: ['Kinds']
14 | }
15 | })
16 |
--------------------------------------------------------------------------------
/docs/tutorial/sorting/01.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | x: { sort: 'byValue' }
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/sorting/02_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: '...or descending order.'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/sorting/02_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | x: { reverse: true }
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/sorting/03_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: "Let's get back to where we were"
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/sorting/03_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | x: {
4 | sort: 'none',
5 | reverse: false
6 | }
7 | }
8 | })
9 |
--------------------------------------------------------------------------------
/docs/tutorial/sorting/04_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'With two discretes on one axis...'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/sorting/04_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: {
5 | detach: ['Kinds']
6 | },
7 | x: {
8 | set: ['Genres', 'Kinds']
9 | }
10 | }
11 | }
12 | })
13 |
--------------------------------------------------------------------------------
/docs/tutorial/sorting/05_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: '...grouping is determined by their order.'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/sorting/05_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | x: {
5 | set: ['Kinds', 'Genres']
6 | }
7 | }
8 | }
9 | })
10 |
--------------------------------------------------------------------------------
/docs/tutorial/sorting/config.js:
--------------------------------------------------------------------------------
1 | export default [
2 | [
3 | {
4 | name: '../assets/setup/setup_c',
5 | replace: [['config: {', "config: {title: 'Switch to ascending order...',"]]
6 | },
7 | '01'
8 | ],
9 | ['02_a', '02_b'],
10 | ['03_a', '03_b'],
11 | ['04_a', '04_b'],
12 | ['05_a', '05_b']
13 | ]
14 |
--------------------------------------------------------------------------------
/docs/tutorial/stacking_explanation/01_c.js:
--------------------------------------------------------------------------------
1 | chart.animate(
2 | {
3 | config: {
4 | title: 'Measure only',
5 | channels: {
6 | x: {
7 | set: 'M',
8 | range: { max: 7 },
9 | axis: true,
10 | labels: true,
11 | title: 'x: [ measure ]',
12 | interlacing: false,
13 | markerGuides: true,
14 | ticks: true
15 | },
16 | y: {
17 | set: null,
18 | axis: true,
19 | labels: false,
20 | title: null,
21 | interlacing: false
22 | },
23 | color: 'D',
24 | label: ['D']
25 | }
26 | }
27 | },
28 | {
29 | duration: 2,
30 | delay: 3
31 | }
32 | )
33 |
--------------------------------------------------------------------------------
/docs/tutorial/stacking_explanation/config.js:
--------------------------------------------------------------------------------
1 | export default [['01_a', '01_b', '01_c', '01_d']]
2 |
--------------------------------------------------------------------------------
/docs/tutorial/stacking_explanation/data.js:
--------------------------------------------------------------------------------
1 | const data = {
2 | series: [
3 | { name: 'D', values: ['A', 'B', 'C'] },
4 | { name: 'M', values: [6.1, 3.5, 1.4] },
5 | { name: 'i', values: [1, 1, 1] }
6 | ]
7 | }
8 |
9 | export default data
10 |
--------------------------------------------------------------------------------
/docs/tutorial/without_coordinates_noop_channel/01.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | y: {
5 | set: null
6 | },
7 | x: {
8 | set: null
9 | },
10 | size: {
11 | attach: ['Genres', 'Popularity']
12 | }
13 | }
14 | }
15 | })
16 |
--------------------------------------------------------------------------------
/docs/tutorial/without_coordinates_noop_channel/02_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Bubble chart - stacked'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/without_coordinates_noop_channel/02_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | geometry: 'circle'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/without_coordinates_noop_channel/03_a.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | title: 'Bubble chart - grouped - using the noop channel'
4 | }
5 | })
6 |
--------------------------------------------------------------------------------
/docs/tutorial/without_coordinates_noop_channel/03_b.js:
--------------------------------------------------------------------------------
1 | chart.animate({
2 | config: {
3 | channels: {
4 | size: {
5 | detach: ['Genres']
6 | },
7 | noop: {
8 | set: ['Genres']
9 | }
10 | }
11 | }
12 | })
13 |
--------------------------------------------------------------------------------
/docs/tutorial/without_coordinates_noop_channel/config.js:
--------------------------------------------------------------------------------
1 | export default [
2 | [
3 | {
4 | name: '../assets/setup/setup_c',
5 | replace: [['config: {', "config: {title: 'Treemap',"]]
6 | },
7 | '01'
8 | ],
9 | ['02_a', '02_b'],
10 | ['03_a', '03_b']
11 | ]
12 |
--------------------------------------------------------------------------------
/project/cmake/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 2.8.11)
2 | project(Vizzu)
3 |
4 | add_subdirectory(lib)
5 | add_subdirectory(test)
6 |
7 | if(EMSCRIPTEN)
8 | add_subdirectory(weblib)
9 | else()
10 | find_package(Qt5Core QUIET)
11 |
12 | if(Qt5Core_FOUND)
13 | add_subdirectory(qtest)
14 | endif()
15 | endif()
16 |
17 | include(tests.txt)
18 |
--------------------------------------------------------------------------------
/project/cmake/emcc.txt:
--------------------------------------------------------------------------------
1 | set(CMAKE_EXECUTABLE_SUFFIX ".js")
2 |
3 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --bind -s WASM=1 -s ASSERTIONS=1 -s ALLOW_MEMORY_GROWTH=1 \
4 | -Wno-unused-command-line-argument -fno-rtti")
5 |
6 | set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Oz -flto")
7 |
8 | set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -gsource-map")
9 |
10 | set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} -Wno-limited-postlink-optimizations \
11 | -gsource-map --source-map-base http://127.0.0.1:8080/dist/")
12 |
--------------------------------------------------------------------------------
/project/cmake/guicommon.txt:
--------------------------------------------------------------------------------
1 | if(WIN32)
2 | if(MSVC)
3 | set_target_properties(${TARGET} PROPERTIES
4 | WIN32_EXECUTABLE YES
5 | LINK_FLAGS "/ENTRY:mainCRTStartup")
6 | endif()
7 | endif()
8 |
9 |
--------------------------------------------------------------------------------
/project/cmake/includes.txt:
--------------------------------------------------------------------------------
1 | include_directories(${sourceDir})
2 |
3 | if(EMSCRIPTEN OR WIN32)
4 | include_directories(
5 | ${root}/contrib/include)
6 | endif()
7 |
--------------------------------------------------------------------------------
/project/cmake/lib/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | include(../common.txt)
2 |
3 | file(GLOB_RECURSE sources CONFIGURE_DEPENDS
4 | ${root}/plugin/*.cpp
5 | ${root}/src/base/*.cpp
6 | ${root}/src/chart/*.cpp
7 | ${root}/src/dataframe/*.cpp)
8 |
9 | include(../version.txt)
10 |
11 | file(GLOB_RECURSE headers CONFIGURE_DEPENDS
12 | ${root}/plugin/*.h
13 | ${root}/src/base/*.h
14 | ${root}/src/chart/*.h
15 | ${root}/src/dataframe/*.h)
16 |
17 | add_library(vizzulib ${sources})
18 |
19 | include(../includes.txt)
20 | include(../todochk.txt)
21 |
22 | if(EMSCRIPTEN)
23 | include(../emcc.txt)
24 | endif()
25 |
--------------------------------------------------------------------------------
/project/cmake/link.txt:
--------------------------------------------------------------------------------
1 | link_directories(${root}/lib)
2 |
3 | if (WIN32)
4 | link_directories(${root}/contrib/lib)
5 | endif()
6 |
--------------------------------------------------------------------------------
/project/cmake/tests.txt:
--------------------------------------------------------------------------------
1 | enable_testing()
2 | if(EMSCRIPTEN)
3 | add_test(unittest "node" "test/vizzutest.js" "-a")
4 | else()
5 | add_test(unittest "test/vizzutest" "-a")
6 | endif()
--------------------------------------------------------------------------------
/project/cmake/todochk.txt:
--------------------------------------------------------------------------------
1 | add_custom_command(
2 | TARGET vizzulib
3 | POST_BUILD
4 | COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/${root}/tools/swatools/todos.sh src
5 | )
--------------------------------------------------------------------------------
/project/cmake/version.txt:
--------------------------------------------------------------------------------
1 | add_custom_command(
2 | OUTPUT git.cpp
3 | COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/${root}/tools/gittools/gitcpp.sh > git.cpp
4 | DEPENDS ${root}/.git ${CMAKE_CURRENT_SOURCE_DIR}/${root}/tools/gittools/gitcpp.sh
5 | VERBATIM)
6 |
7 | set(sources ${sources} git.cpp)
8 |
--------------------------------------------------------------------------------
/src/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | globals: {
3 | getValue: true,
4 | LibraryManager: true,
5 | mergeInto: true,
6 | Module: true,
7 | setValue: true,
8 | UTF8ToString: true
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/apps/weblib/.gitignore:
--------------------------------------------------------------------------------
1 | ts-api/types
2 | ts-api/module/canvas.ts
3 | canvas.h
4 | canvas.js
--------------------------------------------------------------------------------
/src/apps/weblib/interfacejs.h:
--------------------------------------------------------------------------------
1 | #ifndef INTERFACEJS_H
2 | #define INTERFACEJS_H
3 |
4 | extern "C" {
5 | extern void chart_openUrl(const void *, const char *);
6 | extern void chart_doChange(const void *);
7 | extern void
8 | textBoundary(const char *, const char *, double *, double *);
9 | }
10 |
11 | #endif
--------------------------------------------------------------------------------
/src/apps/weblib/jsfunctionwrapper.h:
--------------------------------------------------------------------------------
1 | #ifndef LIB_JSFUNCTIONWRAPPER_H
2 | #define LIB_JSFUNCTIONWRAPPER_H
3 |
4 | #include
5 |
6 | #include "interfacejs.h"
7 |
8 | namespace Vizzu
9 | {
10 |
11 | // Unlike std::unique_ptr, the deleter of std::shared_ptr is invoked
12 | // even if the managed pointer is null -> keep unique_ptr
13 | template
14 | using JsFunctionWrapper =
15 | std::unique_ptr *...),
16 | void (*)(R(std::remove_reference_t *...))>;
17 |
18 | }
19 |
20 | #endif
21 |
--------------------------------------------------------------------------------
/src/apps/weblib/ts-api/animcompleting.ts:
--------------------------------------------------------------------------------
1 | import Vizzu from './vizzu.js'
2 | import { AnimControl } from './animcontrol.js'
3 |
4 | /** Promise resolves to the Vizzu object when the animation completed. */
5 | export interface AnimCompleting extends Promise {
6 | /** Promise resolves to the animation controller object when the animation starts. */
7 | activated?: Promise
8 | }
9 |
--------------------------------------------------------------------------------
/src/apps/weblib/ts-api/cvizzu.d.ts:
--------------------------------------------------------------------------------
1 | import { ModuleOptions, CVizzu } from './cvizzu.types'
2 |
3 | declare function VizzuModule(options: ModuleOptions): Promise
4 |
5 | export default VizzuModule
6 |
--------------------------------------------------------------------------------
/src/apps/weblib/ts-api/datarecord.ts:
--------------------------------------------------------------------------------
1 | import * as Data from './types/data.js'
2 | import { CRecord } from './module/cdata.js'
3 |
4 | export class DataRecord implements Data.Record {
5 | [seriesName: Data.SeriesName]: Data.Value
6 |
7 | constructor(cRecord: CRecord) {
8 | return new Proxy(this, {
9 | get: (_target, columnName: string): Data.Value => {
10 | return cRecord.getValue(columnName)
11 | }
12 | })
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/apps/weblib/ts-api/errors.ts:
--------------------------------------------------------------------------------
1 | export class CancelError extends Error {
2 | constructor() {
3 | super('animation canceled')
4 | this.name = 'CancelError'
5 | }
6 | }
7 |
8 | export class NotInitializedError extends Error {
9 | constructor() {
10 | super('vizzu is not initialized, use `initializing` promise')
11 | this.name = 'NotInitializedError'
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/apps/weblib/ts-api/module/cerror.ts:
--------------------------------------------------------------------------------
1 | import { CPointer, CVizzu } from '../cvizzu.types'
2 |
3 | export class CError extends Error {
4 | constructor(ptr: CPointer, wasm: CVizzu) {
5 | const type = new wasm.ExceptionInfo(ptr).get_type()
6 | const cMessage = wasm._vizzu_errorMessage(ptr, type)
7 | const message = wasm.UTF8ToString(cMessage)
8 | super('error: ' + message)
9 | this.name = 'CError'
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/apps/weblib/ts-api/module/chart.ts:
--------------------------------------------------------------------------------
1 | import * as C from '../cvizzu.types.js'
2 |
3 | export interface Chart {
4 | doChange(): void
5 | openUrl(url: C.CString): void
6 | }
7 |
--------------------------------------------------------------------------------
/src/apps/weblib/ts-api/plugins/logging.ts:
--------------------------------------------------------------------------------
1 | import { Plugin } from '../plugins.js'
2 |
3 | export class Logging implements Plugin {
4 | private _setEnable: (enabled: boolean) => void
5 |
6 | meta = { name: 'logging' }
7 |
8 | constructor(setEnable: (enabled: boolean) => void) {
9 | this._setEnable = setEnable
10 | }
11 |
12 | enable(enabled: boolean): void {
13 | this._setEnable(enabled)
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/apps/weblib/ts-api/plugins/shorthands-augmentation.ts:
--------------------------------------------------------------------------------
1 | import '../vizzu.js'
2 | import { AnimCompleting } from '../animcompleting.js'
3 | import { AnyAnimOptions, AnyAnimTarget } from './shorthands.js'
4 |
5 | declare module '../vizzu' {
6 | interface Vizzu {
7 | animate(target: AnyAnimTarget, options?: AnyAnimOptions): AnimCompleting
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/apps/weblib/ts-api/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@tsconfig/strictest/tsconfig.json",
3 | "include": ["**/*.ts"],
4 | "compilerOptions": {
5 | "target": "es2021",
6 | "module": "ES6",
7 | "rootDir": "./",
8 | "outDir": "../../../../dist",
9 | "moduleResolution": "node",
10 | "declaration": true,
11 | "skipLibCheck": false
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/src/apps/weblib/ts-api/tsutils.ts:
--------------------------------------------------------------------------------
1 | import { ReadonlyDeep, RequiredDeep } from 'type-fest'
2 |
3 | export type Mirrored = ReadonlyDeep>
4 |
--------------------------------------------------------------------------------
/src/base/anim/sequence.h:
--------------------------------------------------------------------------------
1 | #ifndef BASE_ANIM_SEQUENCE_H
2 | #define BASE_ANIM_SEQUENCE_H
3 |
4 | #include
5 |
6 | #include "base/anim/controllable.h"
7 |
8 | namespace Anim
9 | {
10 |
11 | class Sequence : public Controllable
12 | {
13 | public:
14 | Sequence();
15 | void setPosition(Duration progress) override;
16 | void addKeyframe(ControllablePtr &&keyframe);
17 |
18 | protected:
19 | std::vector keyframes;
20 | Controllable *actual{};
21 | };
22 |
23 | }
24 |
25 | #endif
26 |
--------------------------------------------------------------------------------
/src/base/app/git.h:
--------------------------------------------------------------------------------
1 | #ifndef APP_GIT
2 | #define APP_GIT
3 |
4 | namespace App::Git
5 | {
6 |
7 | extern const char *const hash;
8 | extern const unsigned int depth;
9 |
10 | }
11 |
12 | #endif
13 |
--------------------------------------------------------------------------------
/src/base/app/version.cpp:
--------------------------------------------------------------------------------
1 | #include "base/app/version.h"
2 |
3 | #include
4 |
5 | #include "base/app/git.h"
6 |
7 | namespace App
8 | {
9 |
10 | std::string Version::buildTimestamp()
11 | {
12 | return __DATE__ " " __TIME__;
13 | }
14 |
15 | Version::operator std::string() const
16 | {
17 | return std::to_string(major) + "." + std::to_string(minor) + "."
18 | + std::to_string(patch) + "-" + std::to_string(Git::depth)
19 | + "-" + Git::hash + "-" + "[" + buildTimestamp() + "]";
20 | }
21 |
22 | }
--------------------------------------------------------------------------------
/src/base/app/version.h:
--------------------------------------------------------------------------------
1 | #ifndef APP_VERSION
2 | #define APP_VERSION
3 |
4 | #include
5 |
6 | namespace App
7 | {
8 |
9 | class Version
10 | {
11 | public:
12 | constexpr Version(int major, int minor, int patch) noexcept :
13 | major(major),
14 | minor(minor),
15 | patch(patch)
16 | {}
17 |
18 | explicit operator std::string() const;
19 |
20 | private:
21 | int major;
22 | int minor;
23 | int patch;
24 |
25 | static std::string buildTimestamp();
26 | };
27 |
28 | }
29 |
30 | #endif
31 |
--------------------------------------------------------------------------------
/src/base/geom/bezier.h:
--------------------------------------------------------------------------------
1 | #ifndef BASE_GEOM_BEZIER_H
2 | #define BASE_GEOM_BEZIER_H
3 |
4 | #include
5 |
6 | namespace Geom
7 | {
8 |
9 | template class CubicBezier
10 | {
11 | public:
12 | CubicBezier(T val0, T val1, T val2, T val3) :
13 | values{val0, val1, val2, val3}
14 | {}
15 |
16 | T operator()(double t) const
17 | {
18 | auto it = 1 - t;
19 |
20 | return values[0] * it * it * it + values[1] * 3 * it * it * t
21 | + values[2] * 3 * it * t * t + values[3] * t * t * t;
22 | }
23 |
24 | private:
25 | std::array values;
26 | };
27 |
28 | }
29 |
30 | #endif
31 |
--------------------------------------------------------------------------------
/src/base/geom/orientation.h:
--------------------------------------------------------------------------------
1 | #ifndef BASE_GEOM_ORIENTATION_H
2 | #define BASE_GEOM_ORIENTATION_H
3 |
4 | namespace Geom
5 | {
6 |
7 | enum class Orientation : bool { horizontal, vertical };
8 |
9 | constexpr bool isHorizontal(Orientation orientation)
10 | {
11 | return orientation == Orientation::horizontal;
12 | }
13 |
14 | constexpr Orientation operator!(Orientation orientation)
15 | {
16 | return isHorizontal(orientation) ? Orientation::vertical
17 | : Orientation::horizontal;
18 | }
19 |
20 | }
21 |
22 | #endif
23 |
--------------------------------------------------------------------------------
/src/base/geom/polygon.cpp:
--------------------------------------------------------------------------------
1 | #include "polygon.h"
2 |
3 | #include "point.h"
4 | #include "rect.h"
5 |
6 | namespace Geom
7 | {
8 |
9 | void Polygon::add(const Point &point) { points.push_back(point); }
10 |
11 | Rect Polygon::boundary() const { return Rect::Boundary(points); }
12 |
13 | }
--------------------------------------------------------------------------------
/src/base/geom/polygon.h:
--------------------------------------------------------------------------------
1 | #ifndef GEOM_POLYGON
2 | #define GEOM_POLYGON
3 |
4 | #include
5 |
6 | #include "base/geom/point.h"
7 | #include "base/geom/rect.h"
8 |
9 | namespace Geom
10 | {
11 |
12 | class Polygon
13 | {
14 | public:
15 | std::vector points;
16 |
17 | void add(const Geom::Point &point);
18 | [[nodiscard]] Geom::Rect boundary() const;
19 | };
20 |
21 | }
22 |
23 | #endif
24 |
--------------------------------------------------------------------------------
/src/base/geom/solutions.h:
--------------------------------------------------------------------------------
1 | #ifndef GEOM_SOLUTIONS
2 | #define GEOM_SOLUTIONS
3 |
4 | #include
5 | #include
6 |
7 | namespace Geom
8 | {
9 |
10 | template
11 | using Solutions = std::array, N>;
12 |
13 | }
14 |
15 | #endif
16 |
--------------------------------------------------------------------------------
/src/base/geom/triangle.h:
--------------------------------------------------------------------------------
1 | #ifndef GEOM_TRIANGLE
2 | #define GEOM_TRIANGLE
3 |
4 | #include
5 |
6 | #include "point.h"
7 |
8 | namespace Geom
9 | {
10 |
11 | class Triangle
12 | {
13 | public:
14 | std::array points;
15 |
16 | [[nodiscard]] double area() const;
17 |
18 | [[nodiscard]] double distance(const Point &point) const;
19 | };
20 |
21 | }
22 |
23 | #endif
24 |
--------------------------------------------------------------------------------
/src/base/gfx/draw/infobubble.h:
--------------------------------------------------------------------------------
1 | #ifndef GFX_DRAW_INFOBUBBLE
2 | #define GFX_DRAW_INFOBUBBLE
3 |
4 | #include "base/geom/rect.h"
5 | #include "base/gfx/canvas.h"
6 |
7 | #include "roundedrect.h"
8 |
9 | namespace Gfx::Draw
10 | {
11 |
12 | class InfoBubble : RoundedRect
13 | {
14 | public:
15 | InfoBubble(ICanvas &canvas,
16 | const Geom::Rect &rect,
17 | double radius,
18 | double arrowWidth,
19 | const Geom::Point &arrowhead);
20 | };
21 |
22 | }
23 |
24 | #endif
25 |
--------------------------------------------------------------------------------
/src/base/gfx/draw/roundedrect.h:
--------------------------------------------------------------------------------
1 | #ifndef GFX_DRAW_ROUNDEDRECT
2 | #define GFX_DRAW_ROUNDEDRECT
3 |
4 | #include "base/geom/rect.h"
5 | #include "base/gfx/canvas.h"
6 |
7 | namespace Gfx::Draw
8 | {
9 |
10 | class RoundedRect
11 | {
12 | public:
13 | RoundedRect(ICanvas &canvas,
14 | const Geom::Rect &rect,
15 | double radius);
16 |
17 | protected:
18 | void corner(Geom::Point corner,
19 | const Geom::Point &dir0,
20 | const Geom::Point &dir1);
21 |
22 | private:
23 | ICanvas &canvas;
24 | double radius;
25 | };
26 |
27 | }
28 |
29 | #endif
30 |
--------------------------------------------------------------------------------
/src/base/gfx/lineargradient.h:
--------------------------------------------------------------------------------
1 | #ifndef GFX_LINEARGRADIENT_H
2 | #define GFX_LINEARGRADIENT_H
3 |
4 | #include "base/geom/line.h"
5 |
6 | #include "colorgradient.h"
7 |
8 | namespace Gfx
9 | {
10 |
11 | struct LinearGradient
12 | {
13 | Geom::Line line;
14 | ColorGradient colors;
15 | };
16 |
17 | }
18 |
19 | #endif // GFX_LINEARGRADIENT_H
20 |
--------------------------------------------------------------------------------
/src/base/gui/accessories.h:
--------------------------------------------------------------------------------
1 | #ifndef GUI_ACCESSORIES
2 | #define GUI_ACCESSORIES
3 |
4 | #include "base/geom/point.h"
5 |
6 | namespace GUI
7 | {
8 | struct Margin
9 | {
10 | double top;
11 | double left;
12 | double bottom;
13 | double right;
14 | [[nodiscard]] Geom::Size getSpace() const
15 | {
16 | return {left + right, top + bottom};
17 | }
18 | [[nodiscard]] Geom::Point topLeft() const { return {left, top}; }
19 | [[nodiscard]] Geom::Point bottomRight() const
20 | {
21 | return {right, bottom};
22 | }
23 | };
24 | }
25 |
26 | #endif
27 |
--------------------------------------------------------------------------------
/src/base/gui/pointer.h:
--------------------------------------------------------------------------------
1 | #ifndef GUI_POINTER
2 | #define GUI_POINTER
3 |
4 | #include
5 | #include
6 | #include
7 |
8 | #include "base/geom/affinetransform.h"
9 | #include "base/geom/point.h"
10 |
11 | namespace GUI
12 | {
13 |
14 | struct PointerEvent
15 | {
16 | int pointerId{};
17 | Geom::Point position;
18 | };
19 |
20 | }
21 |
22 | #endif
23 |
--------------------------------------------------------------------------------
/src/base/math/renard.h:
--------------------------------------------------------------------------------
1 | #ifndef MATH_RENARD
2 | #define MATH_RENARD
3 |
4 | #include
5 |
6 | namespace Math
7 | {
8 |
9 | class Renard
10 | {
11 | public:
12 | static Renard R3();
13 | static Renard R5();
14 | explicit Renard(std::span const &numbers) :
15 | numbers(numbers)
16 | {}
17 | double ceil(double value);
18 | double floor(double value);
19 |
20 | private:
21 | std::span numbers;
22 | };
23 |
24 | }
25 |
26 | #endif
27 |
--------------------------------------------------------------------------------
/src/base/math/statistics.h:
--------------------------------------------------------------------------------
1 | #ifndef MATH_STATISTICS
2 | #define MATH_STATISTICS
3 |
4 | #include
5 |
6 | namespace Math
7 | {
8 |
9 | template
10 | static T mean(const std::array &values)
11 | {
12 | static_assert(N > 0);
13 | return std::accumulate(values.begin(), values.end(), T()) / N;
14 | }
15 |
16 | }
17 |
18 | #endif
19 |
--------------------------------------------------------------------------------
/src/base/math/trig.cpp:
--------------------------------------------------------------------------------
1 | #include "trig.h"
2 |
3 | #include
4 | #include
5 |
6 | int Math::rad2quadrant(double angle)
7 | {
8 | return static_cast(round(angle / (std::numbers::pi / 2.0)));
9 | }
10 |
--------------------------------------------------------------------------------
/src/base/math/trig.h:
--------------------------------------------------------------------------------
1 | #ifndef MATH_TRIG
2 | #define MATH_TRIG
3 |
4 | namespace Math
5 | {
6 |
7 | int rad2quadrant(double angle);
8 |
9 | }
10 |
11 | #endif
12 |
--------------------------------------------------------------------------------
/src/base/style/param.h:
--------------------------------------------------------------------------------
1 | #ifndef STYLE_PARAM_H
2 | #define STYLE_PARAM_H
3 |
4 | #include
5 |
6 | #include "base/type/traits.h"
7 |
8 | namespace Style
9 | {
10 |
11 | template using Param = std::optional;
12 |
13 | template concept IsParam = Type::is_optional_v;
14 |
15 | template using ParamT = Type::optional_t;
16 |
17 | }
18 |
19 | #endif
20 |
--------------------------------------------------------------------------------
/src/base/text/valueunit.cpp:
--------------------------------------------------------------------------------
1 | #include "valueunit.h"
2 |
3 | #include
4 | #include
5 |
6 | #include "base/text/smartstring.h"
7 |
8 | namespace Text
9 | {
10 |
11 | ValueUnit::ValueUnit(const std::string &str)
12 | {
13 | size_t next{};
14 | value = std::stod(str, &next);
15 | unit = str.substr(next);
16 | SmartString::trim(unit);
17 | }
18 |
19 | }
--------------------------------------------------------------------------------
/src/base/text/valueunit.h:
--------------------------------------------------------------------------------
1 | #ifndef BASE_TEXT_VALUEUNIT_H
2 | #define BASE_TEXT_VALUEUNIT_H
3 |
4 | #include
5 |
6 | namespace Text
7 | {
8 |
9 | class ValueUnit
10 | {
11 | public:
12 | explicit ValueUnit(const std::string &str);
13 | [[nodiscard]] double getValue() const { return value; }
14 | [[nodiscard]] const std::string &getUnit() const { return unit; }
15 |
16 | private:
17 | double value;
18 | std::string unit;
19 | };
20 |
21 | }
22 |
23 | #endif
24 |
--------------------------------------------------------------------------------
/src/chart/generator/colorbuilder.cpp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vizzuhq/vizzu-lib/5798871bff8122bf1647a020fce6afb862cbb298/src/chart/generator/colorbuilder.cpp
--------------------------------------------------------------------------------
/src/chart/generator/plotptr.h:
--------------------------------------------------------------------------------
1 | #ifndef PLOTPTR_H
2 | #define PLOTPTR_H
3 |
4 | #include
5 |
6 | namespace Vizzu::Gen
7 | {
8 | class Plot;
9 | using PlotPtr = std::shared_ptr;
10 |
11 | class Marker;
12 | }
13 |
14 | #endif
15 |
--------------------------------------------------------------------------------
/src/chart/main/version.cpp:
--------------------------------------------------------------------------------
1 | #include "version.h"
2 |
3 | #include "base/app/version.h"
4 |
5 | const App::Version Vizzu::Main::version(0, 16, 0);
6 |
7 | const char *const Vizzu::Main::siteUrl = "https://vizzu.io/";
8 |
--------------------------------------------------------------------------------
/src/chart/main/version.h:
--------------------------------------------------------------------------------
1 | #ifndef CHART_VERSION_H
2 | #define CHART_VERSION_H
3 |
4 | #include "base/app/version.h"
5 |
6 | namespace Vizzu::Main
7 | {
8 |
9 | extern const App::Version version;
10 |
11 | extern const char *const siteUrl;
12 |
13 | }
14 |
15 | #endif
16 |
--------------------------------------------------------------------------------
/src/chart/options/coordsystem.h:
--------------------------------------------------------------------------------
1 | #ifndef CHART_OPTIONS_COORDSYSTEM_H
2 | #define CHART_OPTIONS_COORDSYSTEM_H
3 |
4 | #include
5 |
6 | namespace Vizzu::Gen
7 | {
8 |
9 | enum class CoordSystem : std::uint8_t { cartesian, polar };
10 |
11 | }
12 |
13 | #endif
14 |
--------------------------------------------------------------------------------
/src/chart/options/shapetype.cpp:
--------------------------------------------------------------------------------
1 |
2 | #include "shapetype.h"
3 |
4 | #include
5 |
6 | namespace Vizzu::Gen
7 | {
8 |
9 | bool isConnecting(ShapeType type)
10 | {
11 | switch (type) {
12 | case ShapeType::rectangle:
13 | case ShapeType::circle: return false;
14 |
15 | case ShapeType::line:
16 | case ShapeType::area: return true;
17 |
18 | default:
19 | throw std::logic_error("internal error: invalid shape type");
20 | };
21 | }
22 |
23 | }
--------------------------------------------------------------------------------
/src/chart/options/shapetype.h:
--------------------------------------------------------------------------------
1 | #ifndef SHAPETYPE_H
2 | #define SHAPETYPE_H
3 |
4 | #include
5 |
6 | namespace Vizzu::Gen
7 | {
8 |
9 | enum class ShapeType : std::uint8_t { rectangle, circle, area, line };
10 |
11 | bool isConnecting(ShapeType type);
12 |
13 | }
14 |
15 | #endif
16 |
--------------------------------------------------------------------------------
/src/chart/options/sort.h:
--------------------------------------------------------------------------------
1 | #ifndef CHART_OPTIONS_SORT_H
2 | #define CHART_OPTIONS_SORT_H
3 |
4 | #include
5 |
6 | namespace Vizzu::Gen
7 | {
8 |
9 | enum class Sort : std::uint8_t { none, byValue, byLabel };
10 |
11 | }
12 |
13 | #endif
14 |
--------------------------------------------------------------------------------
/src/chart/rendering/drawplot.h:
--------------------------------------------------------------------------------
1 | #ifndef DRAW_PLOT_H
2 | #define DRAW_PLOT_H
3 |
4 | #include "drawingcontext.h"
5 | #include "markerrenderer.h"
6 |
7 | namespace Vizzu::Draw
8 | {
9 |
10 | class AbstractMarker;
11 |
12 | class DrawPlot : public DrawingContext
13 | {
14 | public:
15 | void draw(Gfx::ICanvas &canvas,
16 | Painter &painter,
17 | const Geom::Rect &plotRect) const;
18 |
19 | private:
20 | void drawPlotArea(Gfx::ICanvas &canvas,
21 | Painter &painter,
22 | bool clip) const;
23 | };
24 |
25 | }
26 |
27 | #endif
28 |
--------------------------------------------------------------------------------
/src/chart/rendering/markers/circlemarker.h:
--------------------------------------------------------------------------------
1 | #ifndef MARKERS_CIRCLEMARKER_H
2 | #define MARKERS_CIRCLEMARKER_H
3 |
4 | #include "chart/rendering/painter/coordinatesystem.h"
5 |
6 | #include "abstractmarker.h"
7 |
8 | namespace Vizzu::Draw
9 | {
10 |
11 | class CircleMarker : public SingleDrawMarker
12 | {
13 | public:
14 | CircleMarker(const Gen::Marker &marker,
15 | const CoordinateSystem &coordSys,
16 | const Gen::Options &options,
17 | const Styles::Chart &style);
18 | };
19 |
20 | static_assert(sizeof(CircleMarker) == sizeof(AbstractMarker));
21 |
22 | }
23 |
24 | #endif
25 |
--------------------------------------------------------------------------------
/src/chart/rendering/markers/connectingmarker.h:
--------------------------------------------------------------------------------
1 | #ifndef MARKERS_CONNECTINGMARKER_H
2 | #define MARKERS_CONNECTINGMARKER_H
3 |
4 | #include "abstractmarker.h"
5 |
6 | namespace Vizzu::Draw
7 | {
8 |
9 | class ConnectingMarker : public AbstractMarker
10 | {
11 | public:
12 | ConnectingMarker(const DrawingContext &ctx,
13 | const Gen::Marker &marker,
14 | ::Anim::InterpolateIndex lineIndex,
15 | Gen::ShapeType type);
16 |
17 | static const Gen::Marker *getPrev(const Gen::Marker &marker,
18 | ::Anim::InterpolateIndex lineIndex);
19 | };
20 |
21 | }
22 |
23 | #endif
24 |
--------------------------------------------------------------------------------
/src/chart/rendering/markers/rectanglemarker.h:
--------------------------------------------------------------------------------
1 | #ifndef MARKERS_RECTANGLEMARKER_H
2 | #define MARKERS_RECTANGLEMARKER_H
3 |
4 | #include "abstractmarker.h"
5 |
6 | namespace Vizzu::Draw
7 | {
8 |
9 | class RectangleMarker : public SingleDrawMarker
10 | {
11 | public:
12 | RectangleMarker(const Gen::Marker &marker,
13 | const CoordinateSystem &coordSys,
14 | const Gen::Options &options,
15 | const Styles::Chart &style);
16 | };
17 |
18 | static_assert(sizeof(RectangleMarker) == sizeof(AbstractMarker));
19 |
20 | }
21 |
22 | #endif
23 |
--------------------------------------------------------------------------------
/src/chart/rendering/painter/pathsampler.cpp:
--------------------------------------------------------------------------------
1 |
2 | #include "pathsampler.h"
3 |
4 | #include "base/geom/point.h"
5 | #include "base/gfx/pathsampler.h"
6 |
7 | namespace Vizzu::Draw
8 | {
9 |
10 | PathSampler::PathSampler(const Geom::Point &p0,
11 | const Geom::Point &p1,
12 | const Options &options) :
13 | Gfx::PathSampler(options),
14 | coordSys(options.coordSys),
15 | p0(p0),
16 | p1(p1)
17 | {}
18 |
19 | }
--------------------------------------------------------------------------------
/src/dataframe/impl/aggregators.h:
--------------------------------------------------------------------------------
1 | #ifndef VIZZU_DATAFRAME_AGGREGATORS_H
2 | #define VIZZU_DATAFRAME_AGGREGATORS_H
3 |
4 | #include "../interface.h"
5 | #include "base/refl/auto_enum.h"
6 |
7 | namespace Vizzu::dataframe
8 | {
9 | extern const Refl::EnumArray
10 | aggregators;
11 | }
12 |
13 | #endif // VIZZU_DATAFRAME_AGGREGATORS_H
14 |
--------------------------------------------------------------------------------
/src/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "jest.config.js",
3 | "type": "module"
4 | }
5 |
--------------------------------------------------------------------------------
/test/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | globals: {
3 | d3: true,
4 | GIF: true,
5 | markerjs2: true,
6 | mjslive: true,
7 | Module: true,
8 | tinycolor: true
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/test/dts/vizzu.d.ts:
--------------------------------------------------------------------------------
1 | // eslint-disable-next-line @typescript-eslint/no-unused-vars
2 | import * as vizzu from '../../dist/vizzu'
3 |
--------------------------------------------------------------------------------
/test/e2e/modules/console/assert.cjs:
--------------------------------------------------------------------------------
1 | const assert = (condition, message) => {
2 | if (!condition) {
3 | throw new Error('Assert failed: ' + (message || ''))
4 | }
5 | }
6 |
7 | module.exports = assert
8 |
--------------------------------------------------------------------------------
/test/e2e/modules/console/assert.test.cjs:
--------------------------------------------------------------------------------
1 | const assert = require('./assert.cjs')
2 |
3 | describe('assert()', () => {
4 | test('if passed', () => {
5 | expect(() => {
6 | assert(true)
7 | }).not.toThrow()
8 | })
9 |
10 | test('if failed without msg', () => {
11 | expect(() => {
12 | assert(false)
13 | }).toThrow('Assert failed: ')
14 | })
15 |
16 | test('if failed with msg', () => {
17 | expect(() => {
18 | assert(false, 'err msg')
19 | }).toThrow('Assert failed: err msg')
20 | })
21 | })
22 |
--------------------------------------------------------------------------------
/test/e2e/modules/e2e-test/client/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Testing...
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/test/e2e/modules/e2e-test/test-case/test-cases-config.test/test-cases-1.json:
--------------------------------------------------------------------------------
1 | {
2 | "suite": "/test/e2e/modules/e2e-test/test-cases/test-suite-1",
3 | "test": {
4 | "example-group-1/example-1": {
5 | "refs": ["1111111"]
6 | },
7 | "example-group-1/example-2": {
8 | "refs": ["2222222"]
9 | },
10 | "example-group-2/example-3": {
11 | "refs": ["3333333"]
12 | },
13 | "example-group-2/example-4": {
14 | "refs": ["4444444"]
15 | },
16 | "example-group-2/example-5": {
17 | "refs": ["5555555"]
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/test/e2e/modules/e2e-test/test-case/test-cases-config.test/test-cases-2.json:
--------------------------------------------------------------------------------
1 | {
2 | "suite": "/test/e2e/modules/e2e-test/test-cases/test-suite-2",
3 | "test": {
4 | "example-group-3/example-6": {
5 | "refs": ["6666666"]
6 | },
7 | "example-group-3/example-7": {
8 | "refs": ["7777777"]
9 | },
10 | "example-group-4/example-8": {
11 | "refs": ["8888888"]
12 | },
13 | "example-group-4/example-9": {
14 | "refs": ["9999999"]
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/test/e2e/modules/e2e-test/test-case/test-cases-config.test/test-cases-3.json:
--------------------------------------------------------------------------------
1 | {
2 | "suite": "/test/e2e/modules/e2e-test/test-cases/test-suite-3"
3 | }
4 |
--------------------------------------------------------------------------------
/test/e2e/modules/e2e-test/test-case/test-cases-config.test/test-cases-notjson.json:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vizzuhq/vizzu-lib/5798871bff8122bf1647a020fce6afb862cbb298/test/e2e/modules/e2e-test/test-case/test-cases-config.test/test-cases-notjson.json
--------------------------------------------------------------------------------
/test/e2e/modules/e2e-test/test-case/test-cases-config.test/test-cases-notschema/test-cases-notschema-1.json:
--------------------------------------------------------------------------------
1 | []
2 |
--------------------------------------------------------------------------------
/test/e2e/modules/e2e-test/test-case/test-cases-config.test/test-cases-notschema/test-cases-notschema-2.json:
--------------------------------------------------------------------------------
1 | {}
2 |
--------------------------------------------------------------------------------
/test/e2e/modules/e2e-test/test-case/test-cases-config.test/test-cases-notschema/test-cases-notschema-3.json:
--------------------------------------------------------------------------------
1 | {
2 | "suite": 1
3 | }
4 |
--------------------------------------------------------------------------------
/test/e2e/modules/e2e-test/test-case/test-cases-config.test/test-cases-notschema/test-cases-notschema-4.json:
--------------------------------------------------------------------------------
1 | {
2 | "suite": "/test/e2e/modules/e2e-test/test-cases/test-suite",
3 | "foo": []
4 | }
5 |
--------------------------------------------------------------------------------
/test/e2e/modules/e2e-test/test-case/test-cases-config.test/test-cases-notschema/test-cases-notschema-5.json:
--------------------------------------------------------------------------------
1 | {
2 | "suite": "/test/e2e/modules/e2e-test/test-cases/test-suite",
3 | "test": []
4 | }
5 |
--------------------------------------------------------------------------------
/test/e2e/modules/e2e-test/test-case/test-cases-config.test/test-cases-notschema/test-cases-notschema-6.json:
--------------------------------------------------------------------------------
1 | {
2 | "suite": "/test/e2e/modules/e2e-test/test-cases/test-suite",
3 | "test": {
4 | "example": {
5 | "refs": ""
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/test/e2e/modules/e2e-test/test-case/test-cases-config.test/test-cases-notschema/test-cases-notschema-7.json:
--------------------------------------------------------------------------------
1 | {
2 | "suite": "/test/e2e/modules/e2e-test/test-cases/test-suite",
3 | "test": {
4 | "example": {
5 | "animstep": 1
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/test/e2e/modules/jest.config.cjs:
--------------------------------------------------------------------------------
1 | const config = {
2 | rootDir: '.',
3 | collectCoverage: true,
4 | coverageDirectory: '../test_report/unit/.coverage',
5 | restoreMocks: true,
6 | testRegex: '(.*test.cjs)$',
7 | transform: {},
8 | moduleFileExtensions: ['js', 'cjs'],
9 | setupFilesAfterEnv: ['jest-extended/all'],
10 | testTimeout: 10000,
11 | openHandlesTimeout: 5000
12 | }
13 |
14 | module.exports = config
15 |
--------------------------------------------------------------------------------
/test/e2e/modules/videorecorder/.gitignore:
--------------------------------------------------------------------------------
1 | *.webm
2 | *.mp4
--------------------------------------------------------------------------------
/test/e2e/modules/videorecorder/client/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Recording....
5 |
6 |
7 |
8 |
9 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/test/e2e/modules/vizzu/vizzu-cloudfunctions.cjs:
--------------------------------------------------------------------------------
1 | class VizzuCloudFunctions {
2 | static getRemoteCloudFunctions() {
3 | return 'https://europe-west3-vizzu-ci.cloudfunctions.net'
4 | }
5 | }
6 |
7 | module.exports = VizzuCloudFunctions
8 |
--------------------------------------------------------------------------------
/test/e2e/modules/vizzu/vizzu-cloudfunctions.test.cjs:
--------------------------------------------------------------------------------
1 | const VizzuCloudFunctions = require('./vizzu-cloudfunctions.cjs')
2 |
3 | test('if getRemoteCloudFunctions()', () => {
4 | expect(VizzuCloudFunctions.getRemoteCloudFunctions()).toBe(
5 | 'https://europe-west3-vizzu-ci.cloudfunctions.net'
6 | )
7 | })
8 |
--------------------------------------------------------------------------------
/test/e2e/modules/vizzu/vizzu-version-client/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Loading...
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/test/e2e/modules/workspace/workspace-path.cjs:
--------------------------------------------------------------------------------
1 | const path = require('path')
2 |
3 | class WorkspacePath {
4 | static resolvePath(p, root, dirname) {
5 | if (!p || !root || !dirname) {
6 | throw new Error('parameter is required')
7 | }
8 | if (path.isAbsolute(p)) {
9 | return path.resolve(path.join(root, p))
10 | } else {
11 | return path.resolve(path.join(dirname, p))
12 | }
13 | }
14 | }
15 |
16 | module.exports = WorkspacePath
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/chart_precision/area_negative_x.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_precision.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: {
10 | attach: ['Childs', 'Values child'],
11 | range: { min: '0%', max: '110%' }
12 | },
13 | y: { attach: ['Parents'] },
14 | label: { attach: ['Values child'] },
15 | lightness: { attach: ['Childs'] }
16 | },
17 | title: 'Chart Precision Area - X',
18 | geometry: 'area'
19 | }
20 | })
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/chart_precision/area_negative_y.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_precision.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: { attach: ['Parents'] },
10 | y: {
11 | attach: ['Childs', 'Values child'],
12 | range: { min: '0%', max: '110%' }
13 | },
14 | label: { attach: ['Values child'] },
15 | lightness: { attach: ['Childs'] }
16 | },
17 | title: 'Chart Precision Area',
18 | geometry: 'area'
19 | }
20 | })
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/chart_precision/area_x.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_precision.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: {
10 | attach: ['Childs', 'Values parent'],
11 | range: { min: '0%', max: '110%' }
12 | },
13 | y: { attach: ['Parents'] },
14 | label: { attach: ['Values parent'] },
15 | lightness: { attach: ['Childs'] }
16 | },
17 | title: 'Chart Precision Area - X',
18 | geometry: 'area'
19 | }
20 | })
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/chart_precision/area_y.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_precision.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: { attach: ['Parents'] },
10 | y: {
11 | attach: ['Childs', 'Values parent'],
12 | range: { min: '0%', max: '110%' }
13 | },
14 | label: { attach: ['Values parent'] },
15 | lightness: { attach: ['Childs'] }
16 | },
17 | title: 'Chart Precision Area',
18 | geometry: 'area'
19 | }
20 | })
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/chart_precision/bubble.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_precision.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | label: { attach: ['Values parent'] },
10 | size: { attach: ['Values parent', 'Parents'] },
11 | color: { attach: ['Childs'] }
12 | },
13 | title: 'Bubble',
14 | geometry: 'circle'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/chart_precision/circle.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_precision.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: { attach: ['Parents'] },
10 | y: {
11 | attach: ['Childs', 'Values parent'],
12 | range: { min: '0%', max: '110%' }
13 | },
14 | label: { attach: ['Values parent'] },
15 | size: { attach: ['Values parent'] }
16 | },
17 | title: 'Chart Precision Circle',
18 | geometry: 'circle'
19 | }
20 | })
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/chart_precision/circle_negative.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_precision.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: { attach: ['Parents'] },
10 | y: { attach: ['Values child'], range: { min: '0%', max: '110%' } },
11 | label: { attach: ['Childs', 'Values child'] },
12 | size: { attach: ['Values child'] }
13 | },
14 | title: 'Chart Precision Circle',
15 | geometry: 'circle'
16 | }
17 | })
18 | ]
19 |
20 | export default testSteps
21 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/chart_precision/column_color_gradient.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_precision.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: { attach: ['Parents', 'Childs'] },
10 | y: {
11 | attach: ['Parents', 'Childs', 'Values child'],
12 | range: { min: '110%', max: '0%' }
13 | },
14 | color: { attach: ['Values child'] }
15 | },
16 | title: 'Waterfall (-) Color Gradient',
17 | legend: 'color'
18 | }
19 | })
20 | ]
21 |
22 | export default testSteps
23 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/chart_precision/line_negative_y.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_precision.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: { attach: ['Parents'] },
10 | y: { attach: ['Values child'], range: { min: '0%', max: '110%' } },
11 | label: { attach: ['Childs', 'Values child'] },
12 | size: { attach: ['Values child'] }
13 | },
14 | title: 'Chart Precision Line (-) - Y',
15 | geometry: 'line'
16 | }
17 | })
18 | ]
19 |
20 | export default testSteps
21 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/chart_precision/line_x.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_precision.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: {
10 | attach: ['Childs', 'Values parent'],
11 | range: { min: '0%', max: '110%' }
12 | },
13 | y: { attach: ['Parents'] },
14 | label: { attach: ['Values parent'] },
15 | size: { attach: ['Values parent'] }
16 | },
17 | title: 'Chart Precision Line - X',
18 | geometry: 'line'
19 | }
20 | })
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/chart_precision/line_y.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_precision.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: { attach: ['Parents'] },
10 | y: {
11 | attach: ['Childs', 'Values parent'],
12 | range: { min: '0%', max: '110%' }
13 | },
14 | label: { attach: ['Values parent'] },
15 | size: { attach: ['Values parent'] }
16 | },
17 | title: 'Chart Precision Line - Y',
18 | geometry: 'line'
19 | }
20 | })
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/chart_precision/rectangle_negative_x.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_precision.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: {
10 | attach: ['Childs', 'Values child'],
11 | range: { min: '0%', max: '110%' }
12 | },
13 | y: { attach: ['Parents', 'Childs'] },
14 | label: { attach: ['Values child'] }
15 | },
16 | title: 'Chart Precision Rectangle (-) - X'
17 | }
18 | })
19 | ]
20 |
21 | export default testSteps
22 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/chart_precision/rectangle_negative_y.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_precision.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: { attach: ['Parents', 'Childs'] },
10 | y: {
11 | attach: ['Childs', 'Values child'],
12 | range: { min: '0%', max: '110%' }
13 | },
14 | label: { attach: ['Values child'] }
15 | },
16 | title: 'Chart Precision Rectangle (-) - Y'
17 | }
18 | })
19 | ]
20 |
21 | export default testSteps
22 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/chart_precision/rectangle_x.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_precision.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: {
10 | attach: ['Childs', 'Values parent'],
11 | range: { min: '0%', max: '110%' }
12 | },
13 | y: { attach: ['Parents'] },
14 | label: { attach: ['Values parent'] }
15 | },
16 | title: 'Chart Precision Rectangle - X'
17 | }
18 | })
19 | ]
20 |
21 | export default testSteps
22 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/chart_precision/rectangle_y.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_precision.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: { attach: ['Parents'] },
10 | y: {
11 | attach: ['Childs', 'Values parent'],
12 | range: { min: '0%', max: '110%' }
13 | },
14 | label: { attach: ['Values parent'] }
15 | },
16 | title: 'Chart Precision Rectangle - Y'
17 | }
18 | })
19 | ]
20 |
21 | export default testSteps
22 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/chart_precision/treemap.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_precision.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | label: { attach: ['Values parent'] },
10 | size: { attach: ['Values parent', 'Parents'] },
11 | color: { attach: ['Childs'] }
12 | },
13 | title: 'Treemap'
14 | }
15 | })
16 | ]
17 |
18 | export default testSteps
19 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/data_fault_and_formats/rectangle_data_cube.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/cube_test_data.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: {
10 | set: ['Genres', 'Popularity'],
11 | range: { min: '110%', max: '0%' }
12 | },
13 | x: { set: ['Kinds'] },
14 | color: { set: ['Genres'] },
15 | label: { set: ['Popularity'] }
16 | },
17 | title: 'Data Cube'
18 | }
19 | })
20 | ]
21 |
22 | export default testSteps
23 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/lay_out/legend_plot_line_negative_2dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: { attach: ['Value 5 (+/-)'], range: { min: '0%', max: '110%' } },
10 | x: { attach: ['Year'] },
11 | color: { attach: ['Country'] }
12 | },
13 | title: null,
14 | geometry: 'line'
15 | },
16 | style: {
17 | legend: {
18 | backgroundColor: 'rgb(180,180,180 )'
19 | }
20 | }
21 | })
22 | ]
23 |
24 | export default testSteps
25 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/cartesian_coo_sys/area_1dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: 'Value 2 (+)',
11 | label: 'Value 2 (+)'
12 | },
13 | title: 'Area Chart',
14 | geometry: 'area'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/cartesian_coo_sys/area_negative_1dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: 'Value 5 (+/-)',
11 | label: 'Value 5 (+/-)'
12 | },
13 | title: 'Area Chart with (-) Nums',
14 | geometry: 'area'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/cartesian_coo_sys/column_stacked_rectangle_1dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: ['Joy factors', 'Value 2 (+)'],
10 | color: 'Joy factors',
11 | label: 'Value 2 (+)'
12 | },
13 | title: 'Column Chart Stacked'
14 | }
15 | })
16 | ]
17 |
18 | export default testSteps
19 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/cartesian_coo_sys/column_stacked_rectangle_negative_2dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: ['Country', 'Year', 'Value 5 (+/-)'],
10 | x: 'Country_code',
11 | color: 'Country_code',
12 | lightness: 'Value 5 (+/-)'
13 | },
14 | title: 'Stacked Column Chart with (-) Numbers',
15 | legend: 'lightness'
16 | }
17 | })
18 | ]
19 |
20 | export default testSteps
21 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/cartesian_coo_sys/column_stacked_rectangle_negative_3dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: ['Value 5 (+/-)', 'Country_code'],
10 | x: ['Year', 'Joy factors'],
11 | color: 'Country_code',
12 | size: ['Country_code', 'Value 2 (+)'],
13 | noop: 'Year'
14 | },
15 | title: 'Stacked Column Chart with (-) Nums'
16 | }
17 | })
18 | ]
19 |
20 | export default testSteps
21 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/cartesian_coo_sys/dotplot_circle_negative_1dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: ['Year', 'Value 5 (+/-)']
10 | },
11 | title: 'DotPlot with (-) Nums',
12 | geometry: 'circle'
13 | }
14 | })
15 | ]
16 |
17 | export default testSteps
18 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/cartesian_coo_sys/histogram_rectangle_negative_1dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: 'Value 5 (+/-)',
11 | label: 'Value 5 (+/-)'
12 | },
13 | title: 'Histogram with (-) Nums'
14 | }
15 | })
16 | ]
17 |
18 | export default testSteps
19 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/cartesian_coo_sys/line_negative_1dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: 'Value 5 (+/-)',
11 | label: 'Value 5 (+/-)'
12 | },
13 | title: 'Line Chart with (-) Nums',
14 | geometry: 'line'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/cartesian_coo_sys/line_negative_2dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: 'Value 5 (+/-)',
10 | x: 'Year',
11 | color: 'Country'
12 | },
13 | title: 'Line Chart with (-) Nums (2disc)',
14 | geometry: 'line'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/cartesian_coo_sys/scatterplot_circle_negative_1dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: 'Value 5 (+/-)',
11 | label: 'Value 5 (+/-)'
12 | },
13 | title: 'Scatterplot',
14 | geometry: 'circle'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/cartesian_coo_sys/scatterplot_circle_negative_1dis_2con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Value 6 (+/-)',
10 | y: 'Value 5 (+/-)',
11 | noop: 'Year',
12 | label: 'Year'
13 | },
14 | title: 'Scatterplot with (-) Nums',
15 | geometry: 'circle',
16 | coordSystem: 'cartesian'
17 | }
18 | })
19 | ]
20 |
21 | export default testSteps
22 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/cartesian_coo_sys/scatterplot_circle_negative_2dis_3con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: 'Value 5 (+/-)',
10 | x: 'Value 6 (+/-)',
11 | color: 'Country',
12 | size: 'Value 4 (+/-)',
13 | label: 'Value 5 (+/-)'
14 | },
15 | title: 'Scatterplot with (-) Nums',
16 | geometry: 'circle'
17 | }
18 | })
19 | ]
20 |
21 | export default testSteps
22 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/cartesian_coo_sys/stacked_area_negative_2dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: ['Country', 'Value 5 (+/-)'],
10 | x: 'Year',
11 | color: 'Country'
12 | },
13 | title: 'Stacked Area Chart with (-) Nums',
14 | geometry: 'area'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/polar_coo_sys/NO_spiderweb_area_2dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: ['Country', 'Value 2 (+)'],
10 | x: 'Year',
11 | color: 'Country'
12 | },
13 | title: 'Area Spiderweb (fake. no multiaxes)',
14 | geometry: 'area',
15 | coordSystem: 'polar'
16 | }
17 | })
18 | ]
19 |
20 | export default testSteps
21 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/polar_coo_sys/NO_spiderweb_line_2dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: 'Value 2 (+)',
10 | x: 'Year',
11 | color: 'Country'
12 | },
13 | title: 'Spiderweb (fake. no multiaxes)',
14 | geometry: 'line',
15 | coordSystem: 'polar'
16 | }
17 | })
18 | ]
19 |
20 | export default testSteps
21 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/polar_coo_sys/coxcomb_rectangle_1dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: 'Value 2 (+)',
10 | x: 'Joy factors',
11 | color: 'Joy factors',
12 | label: 'Value 2 (+)'
13 | },
14 | title: 'Coxcomb Chart',
15 | orientation: 'horizontal',
16 | coordSystem: 'polar'
17 | }
18 | })
19 | ]
20 |
21 | export default testSteps
22 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/polar_coo_sys/coxcomb_stacked_rectangle_2dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: ['Joy factors', 'Value 2 (+)'],
10 | x: 'Year',
11 | color: 'Joy factors'
12 | },
13 | title: 'Stacked Coxcomb Chart',
14 | coordSystem: 'polar'
15 | },
16 | style: {
17 | plot: {
18 | marker: {
19 | rectangleSpacing: 0.1
20 | }
21 | }
22 | }
23 | })
24 | ]
25 |
26 | export default testSteps
27 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/polar_coo_sys/radial_rectangle_1dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: { set: ['Joy factors'], range: { min: '-30%' } },
10 | x: { set: ['Value 2 (+)'], range: { max: '133%' } },
11 | color: 'Joy factors'
12 | },
13 | title: 'Radial Chart',
14 | coordSystem: 'polar'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/polar_coo_sys/radial_rectangle_2dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: { set: 'Joy factors', range: { min: '-30%' } },
10 | x: { set: ['Country', 'Value 2 (+)'], range: { max: '133%' } },
11 | color: 'Country'
12 | },
13 | title: 'Radial Chart (2disc)',
14 | coordSystem: 'polar'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/without_coo_sys/bubble_circle_1dis_2con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | color: 'Country',
10 | label: 'Country_code',
11 | lightness: 'Value 5 (+/-)',
12 | size: 'Value 5 (+/-)'
13 | },
14 | title: 'Bubble Chart',
15 | geometry: 'circle'
16 | }
17 | })
18 | ]
19 |
20 | export default testSteps
21 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/without_coo_sys/bubble_circle_2dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | color: 'Joy factors',
10 | size: ['Country_code', 'Value 2 (+)'],
11 | label: 'Country_code'
12 | },
13 | title: 'Bubble chart',
14 | geometry: 'circle'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/without_coo_sys/bubble_circle_2dis_2con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | color: 'Joy factors',
10 | size: ['Country_code', 'Value 2 (+)'],
11 | label: 'Country_code',
12 | lightness: 'Value 4 (+/-)'
13 | },
14 | title: 'Bubble Chart',
15 | geometry: 'circle'
16 | }
17 | })
18 | ]
19 |
20 | export default testSteps
21 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/without_coo_sys/treemap_rectangle_2dis_1con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | color: 'Joy factors',
10 | size: ['Value 2 (+)', 'Country_code'],
11 | label: 'Country_code'
12 | },
13 | title: 'Treemap (Stacked)'
14 | }
15 | })
16 | ]
17 |
18 | export default testSteps
19 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/static_chart_types/without_coo_sys/treemap_rectangle_2dis_2con.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | color: 'Joy factors',
10 | size: ['Value 2 (+)', 'Country_code'],
11 | label: 'Country_code',
12 | lightness: 'Value 2 (+)'
13 | },
14 | title: 'Treemap (Stacked+2conti)'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/cookbook/responsive-size.mjs.bak:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vizzuhq/vizzu-lib/5798871bff8122bf1647a020fce6afb862cbb298/test/e2e/test_cases/web_content/cookbook/responsive-size.mjs.bak
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/area.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.area({
8 | x: 'Year',
9 | y: 'Value 5 (+/-)',
10 | title: 'Area Chart'
11 | })
12 | })
13 | ]
14 |
15 | export default testSteps
16 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/area_percentage.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.percentageArea({
8 | x: 'Year',
9 | y: 'Value 2 (+)',
10 | stackedBy: 'Country',
11 | title: 'Percentage Area Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/area_splitted.mjs:
--------------------------------------------------------------------------------
1 | import { data_6 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_6,
7 | config: chart.constructor.presets.splittedArea({
8 | x: 'Year',
9 | y: 'Value 2 (+)',
10 | splittedBy: 'Country',
11 | title: 'Splitted Area Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/area_stacked.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.stackedArea({
8 | x: 'Year',
9 | y: 'Value 2 (+)',
10 | stackedBy: 'Country',
11 | title: 'Stacked Area Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/bar.mjs:
--------------------------------------------------------------------------------
1 | import { data_6 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_6,
7 | config: chart.constructor.presets.bar({
8 | x: 'Value 5 (+/-)',
9 | y: 'Country',
10 | title: 'Bar Chart'
11 | })
12 | })
13 | ]
14 |
15 | export default testSteps
16 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/bar_grouped.mjs:
--------------------------------------------------------------------------------
1 | import { data_6 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_6,
7 | config: chart.constructor.presets.groupedBar({
8 | x: 'Value 5 (+/-)',
9 | y: 'Country',
10 | groupedBy: 'Joy factors',
11 | title: 'Grouped Bar Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/bar_percentage.mjs:
--------------------------------------------------------------------------------
1 | import { data_6 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_6,
7 | config: chart.constructor.presets.percentageBar({
8 | x: 'Value 2 (+)',
9 | y: 'Country',
10 | stackedBy: 'Joy factors',
11 | title: 'Percentage Bar Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/bar_radial.mjs:
--------------------------------------------------------------------------------
1 | import { data_6 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_6,
7 | config: chart.constructor.presets.radialBar({
8 | angle: 'Value 1 (+)',
9 | radius: 'Country',
10 | title: 'Radial Bar Chart'
11 | })
12 | })
13 | ]
14 |
15 | export default testSteps
16 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/bar_radial_stacked.mjs:
--------------------------------------------------------------------------------
1 | import { data_6 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_6,
7 | config: chart.constructor.presets.radialStackedBar({
8 | angle: 'Value 2 (+)',
9 | radius: 'Country',
10 | stackedBy: 'Joy factors',
11 | title: 'Radial Stacked Bar Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/bar_splitted.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.splittedBar({
8 | x: 'Value 2 (+)',
9 | y: 'Year',
10 | splittedBy: 'Joy factors',
11 | title: 'Splitted Bar Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/bar_stacked.mjs:
--------------------------------------------------------------------------------
1 | import { data_6 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_6,
7 | config: chart.constructor.presets.stackedBar({
8 | x: 'Value 2 (+)',
9 | y: 'Country',
10 | stackedBy: 'Joy factors',
11 | title: 'Stacked Bar Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/bubble.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.bubble({
8 | size: 'Value 5 (+/-)',
9 | color: 'Country_code',
10 | title: 'Bubble Chart'
11 | })
12 | })
13 | ]
14 |
15 | export default testSteps
16 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/bubble_stacked.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.stackedBubble({
8 | size: 'Value 2 (+)',
9 | color: 'Joy factors',
10 | stackedBy: 'Country_code',
11 | title: 'Stacked Bubble Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/column.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.column({
8 | x: 'Joy factors',
9 | y: 'Value 2 (+)',
10 | title: 'Column Chart'
11 | })
12 | })
13 | ]
14 |
15 | export default testSteps
16 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/column_grouped.mjs:
--------------------------------------------------------------------------------
1 | import { data_6 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_6,
7 | config: chart.constructor.presets.groupedColumn({
8 | x: 'Country',
9 | y: 'Value 5 (+/-)',
10 | groupedBy: 'Joy factors',
11 | title: 'Grouped Column Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/column_percentage.mjs:
--------------------------------------------------------------------------------
1 | import { data_6 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_6,
7 | config: chart.constructor.presets.percentageColumn({
8 | x: 'Country',
9 | y: 'Value 2 (+)',
10 | stackedBy: 'Joy factors',
11 | title: 'Percentage Column Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/column_polar.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.polarColumn({
8 | angle: 'Joy factors',
9 | radius: 'Value 2 (+)',
10 | title: 'Polar Column Chart'
11 | })
12 | })
13 | ]
14 |
15 | export default testSteps
16 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/column_polar_stacked.mjs:
--------------------------------------------------------------------------------
1 | import { data_6 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_6,
7 | config: chart.constructor.presets.polarStackedColumn({
8 | angle: 'Country',
9 | radius: 'Value 2 (+)',
10 | stackedBy: 'Joy factors',
11 | title: 'Polar Stacked Column Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/column_splitted.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.splittedColumn({
8 | x: 'Year',
9 | y: 'Value 2 (+)',
10 | splittedBy: 'Joy factors',
11 | title: 'Splitted Column Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/column_stacked.mjs:
--------------------------------------------------------------------------------
1 | import { data_6 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_6,
7 | config: chart.constructor.presets.stackedColumn({
8 | x: 'Country',
9 | y: 'Value 2 (+)',
10 | stackedBy: 'Joy factors',
11 | title: 'Stacked Column Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/donut.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.donut({
8 | angle: 'Value 2 (+)',
9 | stackedBy: 'Joy factors',
10 | title: 'Donut Chart'
11 | })
12 | })
13 | ]
14 |
15 | export default testSteps
16 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/line.mjs:
--------------------------------------------------------------------------------
1 | import { data_6 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_6,
7 | config: chart.constructor.presets.line({
8 | x: 'Year',
9 | y: 'Value 6 (+/-)',
10 | dividedBy: 'Country',
11 | title: 'Line Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/line_polar.mjs:
--------------------------------------------------------------------------------
1 | import { data_6 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_6,
7 | config: chart.constructor.presets.polarLine({
8 | angle: 'Year',
9 | radius: 'Value 2 (+)',
10 | dividedBy: 'Country',
11 | title: 'Polar Line Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/line_vertical.mjs:
--------------------------------------------------------------------------------
1 | import { data_6 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_6,
7 | config: chart.constructor.presets.line({
8 | x: 'Value 6 (+/-)',
9 | y: 'Year',
10 | dividedBy: 'Country',
11 | title: 'Vertical Line Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/lollipop.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.lollipop({
8 | x: 'Year',
9 | y: 'Value 1 (+)',
10 | title: 'Lollipop Chart'
11 | })
12 | })
13 | ]
14 |
15 | export default testSteps
16 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/marimekko.mjs:
--------------------------------------------------------------------------------
1 | import { data_4 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_4,
7 | config: chart.constructor.presets.marimekko({
8 | x: 'Value 2 (+)',
9 | y: 'Value 3 (+)',
10 | stackedBy: 'Joy factors',
11 | groupedBy: 'Country',
12 | title: 'Marimekko Chart'
13 | })
14 | })
15 | ]
16 |
17 | export default testSteps
18 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/mekko_stacked.mjs:
--------------------------------------------------------------------------------
1 | import { data_4 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_4,
7 | config: chart.constructor.presets.mekko({
8 | x: 'Value 1 (+)',
9 | y: 'Value 2 (+)',
10 | stackedBy: 'Joy factors',
11 | groupedBy: 'Country',
12 | title: 'Stacked Mekko Chart'
13 | })
14 | })
15 | ]
16 |
17 | export default testSteps
18 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/pie.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.pie({
8 | angle: 'Value 2 (+)',
9 | by: 'Joy factors',
10 | title: 'Pie Chart'
11 | })
12 | })
13 | ]
14 |
15 | export default testSteps
16 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/chart/pie_variable_radius.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.variableRadiusPie({
8 | angle: 'Value 2 (+)',
9 | radius: 'Value 1 (+)',
10 | by: 'Joy factors',
11 | title: 'Variable Radius Pie Chart'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/graph/stream.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/music_industry_history_1.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.stream({
8 | x: 'Year',
9 | y: 'Revenue',
10 | stackedBy: 'Format',
11 | title: 'Stream Graph'
12 | }),
13 | style: {
14 | plot: {
15 | yAxis: { label: { numberScale: 'K, M, B, T' } },
16 | xAxis: { label: { angle: '-45deg' } }
17 | }
18 | }
19 | })
20 | ]
21 |
22 | export default testSteps
23 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/graph/stream_vertical.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/music_industry_history_1.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.verticalStream({
8 | x: 'Revenue',
9 | y: 'Year',
10 | stackedBy: 'Format',
11 | title: 'Vertical Stream Graph'
12 | }),
13 | style: {
14 | plot: {
15 | yAxis: { label: { numberScale: 'K, M, B, T' } },
16 | xAxis: { label: { angle: '-45deg' } }
17 | }
18 | }
19 | })
20 | ]
21 |
22 | export default testSteps
23 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/graph/violin.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/music_industry_history_1.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.violin({
8 | x: 'Year',
9 | y: 'Revenue',
10 | splittedBy: 'Format',
11 | title: 'Violin Graph'
12 | }),
13 | style: {
14 | plot: {
15 | yAxis: { label: { numberScale: 'K, M, B, T' } },
16 | xAxis: { label: { angle: '-45deg' } }
17 | }
18 | }
19 | })
20 | ]
21 |
22 | export default testSteps
23 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/graph/violin_vertical.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/music_industry_history_1.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.verticalViolin({
8 | x: 'Revenue',
9 | y: 'Year',
10 | splittedBy: 'Format',
11 | title: 'Vertical Violin Graph'
12 | }),
13 | style: {
14 | plot: {
15 | xAxis: { interlacing: { color: '#ffffff00' } },
16 | yAxis: { label: { numberScale: 'K, M, B, T' } }
17 | }
18 | }
19 | })
20 | ]
21 |
22 | export default testSteps
23 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/heatmap.mjs:
--------------------------------------------------------------------------------
1 | import { data_6 } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_6,
7 | config: chart.constructor.presets.heatmap({
8 | x: 'Year',
9 | y: 'Country_code',
10 | lightness: 'Value 3 (+)',
11 | title: 'Heatmap'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/plot/bubble.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.bubbleplot({
8 | x: 'Value 4 (+/-)',
9 | y: 'Value 5 (+/-)',
10 | color: 'Joy factors',
11 | dividedBy: 'Country',
12 | size: 'Value 3 (+)',
13 | title: 'Bubble Plot'
14 | })
15 | })
16 | ]
17 |
18 | export default testSteps
19 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/plot/scatter.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.scatter({
8 | x: 'Value 6 (+/-)',
9 | y: 'Value 5 (+/-)',
10 | dividedBy: 'Year',
11 | title: 'Scatter Plot'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/plot/scatter_polar.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.polarScatter({
8 | angle: 'Value 3 (+)',
9 | radius: 'Value 2 (+)',
10 | dividedBy: 'Country',
11 | title: 'Polar Scatter Plot'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/treemap.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.treemap({
8 | size: 'Value 2 (+)',
9 | color: 'Country_code',
10 | title: 'Treemap'
11 | })
12 | })
13 | ]
14 |
15 | export default testSteps
16 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets/treemap_stacked.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: chart.constructor.presets.stackedTreemap({
8 | size: 'Value 2 (+)',
9 | color: 'Joy factors',
10 | title: 'Stacked Treemap',
11 | dividedBy: 'Country_code'
12 | })
13 | })
14 | ]
15 |
16 | export default testSteps
17 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets_config/chart/bubble_stacked.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | color: 'Joy factors',
10 | size: ['Country_code', 'Value 2 (+)']
11 | },
12 | title: 'Stacked Bubble Chart',
13 | geometry: 'circle'
14 | }
15 | })
16 | ]
17 |
18 | export default testSteps
19 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets_config/chart/column_polar.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Joy factors',
10 | y: 'Value 2 (+)',
11 | label: 'Value 2 (+)'
12 | },
13 | title: 'Polar Column Chart',
14 | coordSystem: 'polar'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets_config/chart/pie_variable_radius.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: ['Joy factors', 'Value 2 (+)'],
10 | y: 'Value 1 (+)',
11 | color: 'Joy factors',
12 | label: 'Value 1 (+)'
13 | },
14 | title: 'Variable Radius Pie Chart',
15 | coordSystem: 'polar'
16 | }
17 | })
18 | ]
19 |
20 | export default testSteps
21 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/presets_config/treemap.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | color: 'Country_code',
10 | size: ['Value 2 (+)', 'Country_code'],
11 | label: 'Country_code'
12 | },
13 | title: 'Treemap'
14 | }
15 | })
16 | ]
17 |
18 | export default testSteps
19 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/chart/area.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: 'Value 5 (+/-)',
11 | label: 'Value 5 (+/-)'
12 | },
13 | title: 'Area Chart',
14 | geometry: 'area'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/chart/area_stacked.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: ['Country', 'Value 2 (+)'],
11 | color: 'Country'
12 | },
13 | title: 'Stacked Area Chart',
14 | geometry: 'area'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/chart/bar.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Value 5 (+/-)',
10 | y: 'Country',
11 | color: 'Country',
12 | label: 'Value 5 (+/-)'
13 | },
14 | title: 'Bar Chart'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/chart/bubble.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | color: 'Country_code',
10 | label: 'Country_code',
11 | size: 'Value 5 (+/-)'
12 | },
13 | title: 'Bubble Chart',
14 | geometry: 'circle'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/chart/bubble_stacked.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | color: 'Joy factors',
10 | size: ['Country_code', 'Value 2 (+)'],
11 | label: 'Country_code'
12 | },
13 | title: 'Stacked Bubble Chart',
14 | geometry: 'circle'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/chart/column.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Joy factors',
10 | y: 'Value 2 (+)',
11 | label: 'Value 2 (+)'
12 | },
13 | title: 'Column Chart'
14 | }
15 | })
16 | ]
17 |
18 | export default testSteps
19 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/chart/column_single_stacked.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: ['Joy factors', 'Value 2 (+)'],
10 | color: 'Joy factors',
11 | label: 'Value 2 (+)'
12 | },
13 | title: 'Single Stacked Column Chart'
14 | }
15 | })
16 | ]
17 |
18 | export default testSteps
19 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/chart/coxcomb.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: ['Joy factors', 'Value 2 (+)'],
11 | color: 'Joy factors'
12 | },
13 | title: 'Coxcomb Chart',
14 | coordSystem: 'polar'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/chart/donut.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: ['Joy factors', 'Value 2 (+)'],
10 | /* Setting the radius of the empty circle
11 | in the centre. */
12 | y: { range: { min: '-200%' } },
13 | color: 'Joy factors',
14 | label: 'Value 2 (+)'
15 | },
16 | title: 'Donut Chart',
17 | coordSystem: 'polar'
18 | }
19 | })
20 | ]
21 |
22 | export default testSteps
23 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/chart/line.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: 'Value 5 (+/-)',
11 | color: 'Country'
12 | },
13 | title: 'Line Chart',
14 | geometry: 'line'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/chart/line_polar.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: 'Value 2 (+)',
11 | color: 'Country'
12 | },
13 | title: 'Polar Line Chart',
14 | geometry: 'line',
15 | coordSystem: 'polar'
16 | }
17 | })
18 | ]
19 |
20 | export default testSteps
21 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/chart/line_single.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: 'Value 5 (+/-)',
11 | label: 'Value 5 (+/-)'
12 | },
13 | title: 'Single Line Chart',
14 | geometry: 'line'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/chart/mekko.mjs:
--------------------------------------------------------------------------------
1 | import { data_4 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_4,
7 | config: {
8 | channels: {
9 | x: ['Country', 'Value 2 (+)'],
10 | y: { set: ['Value 1 (+)'], range: { max: '110%' } },
11 | color: 'Country',
12 | label: ['Value 2 (+)']
13 | },
14 | title: 'Mekko Chart'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/chart/mekko_stacked.mjs:
--------------------------------------------------------------------------------
1 | import { data_4 } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_4,
7 | config: {
8 | channels: {
9 | x: ['Country', 'Value 2 (+)'],
10 | y: {
11 | set: ['Joy factors', 'Value 3 (+)'],
12 | range: { max: '110%' }
13 | },
14 | color: 'Joy factors',
15 | label: ['Value 2 (+)']
16 | },
17 | title: 'Stacked Mekko Chart',
18 | orientation: 'horizontal'
19 | }
20 | })
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/chart/pie.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: ['Joy factors', 'Value 2 (+)'],
10 | color: 'Joy factors',
11 | label: 'Value 2 (+)'
12 | },
13 | title: 'Pie Chart',
14 | coordSystem: 'polar'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/histogram.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: 'Value 5 (+/-)',
11 | label: 'Value 5 (+/-)'
12 | },
13 | title: 'Histogram'
14 | },
15 | /* Spaces between markers should be
16 | eliminated on this chart. */
17 | style: {
18 | 'plot.marker.rectangleSpacing': 0.07
19 | }
20 | })
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/plot/bubble.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Value 6 (+/-)',
10 | y: 'Value 5 (+/-)',
11 | color: 'Country',
12 | size: 'Value 4 (+/-)',
13 | label: 'Value 5 (+/-)'
14 | },
15 | title: 'Bubble Plot',
16 | geometry: 'circle'
17 | }
18 | })
19 | ]
20 |
21 | export default testSteps
22 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/plot/dot.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: ['Year', 'Value 5 (+/-)']
10 | },
11 | title: 'Dot Plot',
12 | geometry: 'circle'
13 | }
14 | })
15 | ]
16 |
17 | export default testSteps
18 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/plot/scatter.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Value 6 (+/-)',
10 | y: 'Value 5 (+/-)',
11 | noop: 'Year',
12 | label: 'Year'
13 | },
14 | title: 'Scatter Plot',
15 | geometry: 'circle'
16 | }
17 | })
18 | ]
19 |
20 | export default testSteps
21 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/treemap.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | label: 'Country_code',
10 | size: 'Value 2 (+)'
11 | },
12 | title: 'Treemap'
13 | }
14 | })
15 | ]
16 |
17 | export default testSteps
18 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content/static/treemap_stacked.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | color: 'Joy factors',
10 | size: ['Value 2 (+)', 'Country_code'],
11 | label: 'Country_code',
12 | lightness: 'Value 2 (+)'
13 | },
14 | title: 'Stacked Treemap'
15 | }
16 | })
17 | ]
18 |
19 | export default testSteps
20 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/web_content_removed/animated/merge_split_bar.mjs:
--------------------------------------------------------------------------------
1 | import { data_6 } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_6,
7 | config: {
8 | channels: {
9 | x: ['Value 3 (+)', 'Country'],
10 | y: ['Year', 'Joy factors'],
11 | color: 'Country'
12 | },
13 | title: 'Stacked Bar Chart'
14 | }
15 | }),
16 |
17 | (chart) =>
18 | chart.animate({
19 | config: {
20 | title: 'Split Bar Chart',
21 | x: { split: true }
22 | }
23 | })
24 | ]
25 |
26 | export default testSteps
27 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/ww_samples_for_presets/cartesian_coo_sys/05_C_R_split_column_chart.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: { set: ['Value 2 (+)', 'Joy factors'], split: true },
10 | x: 'Year',
11 | color: 'Joy factors',
12 | label: 'Value 2 (+)'
13 | },
14 | title: 'Split Column Chart'
15 | }
16 | }),
17 |
18 | (chart) => {
19 | chart.feature('tooltip', true)
20 | return chart
21 | }
22 | ]
23 |
24 | export default testSteps
25 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/ww_samples_for_presets/cartesian_coo_sys/16_C_R_splitted_bar_chart.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: { set: ['Value 2 (+)', 'Joy factors'], split: true },
10 | y: 'Year',
11 | color: 'Joy factors',
12 | label: 'Value 2 (+)'
13 | },
14 | title: 'Split Bar Chart'
15 | }
16 | }),
17 | (chart) => {
18 | chart.feature('tooltip', true)
19 | return chart
20 | }
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/ww_samples_for_presets/cartesian_coo_sys/201_C_C_devided_lollipop_chart.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: 'Value 3 (+)',
11 | color: 'Country'
12 | },
13 | title: 'Lollipop Chart',
14 | geometry: 'circle'
15 | }
16 | }),
17 | (chart) => {
18 | chart.feature('tooltip', true)
19 | return chart
20 | }
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/ww_samples_for_presets/cartesian_coo_sys/20_C_C_lollipop_chart.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: 'Value 1 (+)',
11 | label: 'Value 2 (+)'
12 | },
13 | title: 'Lollipop Chart',
14 | geometry: 'circle'
15 | }
16 | }),
17 | (chart) => {
18 | chart.feature('tooltip', true)
19 | return chart
20 | }
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/ww_samples_for_presets/cartesian_coo_sys/21_C_C_dot_plot_chart.mjs:
--------------------------------------------------------------------------------
1 | import { data_1974_1990 } from '../../../test_data/IMDB_data.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data: data_1974_1990,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: { set: 'Index', range: { max: '110%' } }
11 | },
12 | title: 'Dot plot Chart',
13 | geometry: 'circle'
14 | }
15 | }),
16 | (chart) => {
17 | chart.feature('tooltip', true)
18 | return chart
19 | }
20 | ]
21 |
22 | export default testSteps
23 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/ww_samples_for_presets/cartesian_coo_sys/22_C_C_scatter_plot.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | y: 'Value 5 (+/-)',
10 | x: 'Value 6 (+/-)',
11 | noop: ['Year']
12 | },
13 | title: 'Scatterplot with (-) Nums',
14 | legend: null,
15 | geometry: 'circle'
16 | }
17 | }),
18 | (chart) => {
19 | chart.feature('tooltip', true)
20 | return chart
21 | }
22 | ]
23 |
24 | export default testSteps
25 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/ww_samples_for_presets/cartesian_coo_sys/24_C_C_bubble_plot.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Value 4 (+/-)',
10 | y: 'Value 5 (+/-)',
11 | noop: 'Country',
12 | color: 'Joy factors',
13 | size: 'Value 3 (+)'
14 | },
15 | title: 'Bubble Plot',
16 | geometry: 'circle'
17 | }
18 | }),
19 | (chart) => {
20 | chart.feature('tooltip', true)
21 | return chart
22 | }
23 | ]
24 |
25 | export default testSteps
26 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/ww_samples_for_presets/cartesian_coo_sys/25_C_C_correlogram.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/correlogram_data.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Alphabet 1',
10 | y: { set: 'Alphabet 2', range: { max: '110%' } },
11 | color: 'Frequency',
12 | size: 'Frequency'
13 | },
14 | title: 'Correlogram',
15 | geometry: 'circle'
16 | }
17 | }),
18 | (chart) => {
19 | chart.feature('tooltip', true)
20 | return chart
21 | }
22 | ]
23 |
24 | export default testSteps
25 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/ww_samples_for_presets/cartesian_coo_sys/27_C_A_area_chart.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: { set: 'Value 1 (+)', range: { min: '0%', max: '110%' } }
11 | },
12 | title: 'Area Chart',
13 | geometry: 'area'
14 | }
15 | }),
16 | (chart) => {
17 | chart.feature('tooltip', true)
18 | return chart
19 | }
20 | ]
21 |
22 | export default testSteps
23 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/ww_samples_for_presets/cartesian_coo_sys/27_C_A_area_chart_negative.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: { set: ['Value 5 (+/-)'], range: { min: '0%', max: '110%' } }
11 | },
12 | title: 'Area Chart with (-) Nums',
13 | geometry: 'area'
14 | }
15 | }),
16 | (chart) => {
17 | chart.feature('tooltip', true)
18 | return chart
19 | }
20 | ]
21 |
22 | export default testSteps
23 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/ww_samples_for_presets/cartesian_coo_sys/371_C_L_line_chart_nega.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Year',
10 | y: 'Value 6 (+/-)'
11 | },
12 | title: 'Line Chart with (-)',
13 | geometry: 'line'
14 | }
15 | }),
16 | (chart) => {
17 | chart.feature('tooltip', true)
18 | return chart
19 | }
20 | ]
21 |
22 | export default testSteps
23 |
--------------------------------------------------------------------------------
/test/e2e/test_cases/ww_samples_for_presets/polar_coo_sys/43_P_R_polar_column_chart_Yrange.mjs:
--------------------------------------------------------------------------------
1 | import { data } from '../../../test_data/chart_types_eu.mjs'
2 |
3 | const testSteps = [
4 | (chart) =>
5 | chart.animate({
6 | data,
7 | config: {
8 | channels: {
9 | x: 'Joy factors',
10 | y: { set: 'Value 2 (+)', range: { min: '-50%' } },
11 | label: 'Value 2 (+)'
12 | },
13 | title: 'Polar Column Chart (Yrange)',
14 | coordSystem: 'polar'
15 | }
16 | }),
17 | (chart) => {
18 | chart.feature('tooltip', true)
19 | return chart
20 | }
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/test_data/cube_test_data.mjs:
--------------------------------------------------------------------------------
1 | export const data = {
2 | dimensions: [
3 | { name: 'Genres', values: ['Pop', 'Rock', 'Jazz', 'Metal'] },
4 | { name: 'Kinds', values: ['Hard', 'Smooth', 'Experimental', 'Alter'] }
5 | ],
6 | measures: [
7 | {
8 | name: 'Popularity',
9 | values: [
10 | [114, 96, 78, 52],
11 | [56, 36, 174, 121],
12 | [127, 83, 94, 58],
13 | [46, 55, 65, 21]
14 | ]
15 | }
16 | ]
17 | }
18 |
--------------------------------------------------------------------------------
/test/e2e/test_data/funnel_data.mjs:
--------------------------------------------------------------------------------
1 | export const data = {
2 | series: [
3 | { name: 'Phase', type: 'dimension' },
4 | { name: 'Filter', type: 'dimension' },
5 | { name: 'Num', type: 'measure' }
6 | ],
7 | records: [
8 | ['5th', 'a', '12'],
9 | ['4th', 'b', '67'],
10 | ['3rd', 'c', '275'],
11 | ['2nd', 'd', '1231'],
12 | ['1st', 'e', '5342']
13 | ]
14 | }
15 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/aggregating_data.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps(
4 | '../../../../docs/assets/data/music_data.js',
5 | 'aggregating_data'
6 | )
7 |
8 | export default testSteps
9 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/align_range.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps('../../../../docs/assets/data/music_data.js', 'align_range')
4 |
5 | export default testSteps
6 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/animation_control_keyframes.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps(
4 | '../../../../docs/assets/data/music_data.js',
5 | 'animation_control_keyframes'
6 | )
7 |
8 | export default testSteps
9 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/animation_options.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps(
4 | '../../../../docs/assets/data/music_data.js',
5 | 'animation_options'
6 | )
7 |
8 | export default testSteps
9 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/axes_title_tooltip.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps(
4 | '../../../../docs/assets/data/music_data.js',
5 | 'axes_title_tooltip'
6 | )
7 |
8 | export default testSteps
9 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/changing_dimensions.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps(
4 | '../../../../docs/assets/data/music_data.js',
5 | 'changing_dimensions'
6 | )
7 |
8 | export default testSteps
9 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/channels_legend.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps(
4 | '../../../../docs/assets/data/music_data.js',
5 | 'channels_legend'
6 | )
7 |
8 | export default testSteps
9 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/chart_layout.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps('../../../../docs/assets/data/music_data.js', 'chart_layout')
4 |
5 | export default testSteps
6 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/chart_presets.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps('../../../../docs/assets/data/music_data.js', 'chart_presets')
4 |
5 | export default testSteps
6 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/color_palette_fonts.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps(
4 | '../../../../docs/assets/data/music_data.js',
5 | 'color_palette_fonts'
6 | )
7 |
8 | export default testSteps
9 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/filter_add_new_records.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps(
4 | '../../../../docs/assets/data/music_data.js',
5 | 'filter_add_new_records'
6 | )
7 |
8 | export default testSteps
9 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/geometry.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps('../../../../docs/assets/data/music_data.js', 'geometry')
4 |
5 | export default testSteps
6 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/group_stack.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps('../../../../docs/assets/data/music_data.js', 'group_stack')
4 |
5 | export default testSteps
6 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/orientation_split_polar.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps(
4 | '../../../../docs/assets/data/music_data.js',
5 | 'orientation_split_polar'
6 | )
7 |
8 | export default testSteps
9 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/shorthands_store.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps(
4 | '../../../../docs/assets/data/music_data.js',
5 | 'shorthands_store'
6 | )
7 |
8 | export default testSteps
9 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/sorting.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps('../../../../docs/assets/data/music_data.js', 'sorting')
4 |
5 | export default testSteps
6 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/stacking_explanation.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps(
4 | '../../../../docs/tutorial/stacking_explanation/data.js',
5 | 'stacking_explanation'
6 | )
7 |
8 | export default testSteps
9 |
--------------------------------------------------------------------------------
/test/e2e/tests/docs/tutorial/without_coordinates_noop_channel.mjs:
--------------------------------------------------------------------------------
1 | import getTestSteps from '../tutorial.mjs'
2 |
3 | const testSteps = await getTestSteps(
4 | '../../../../docs/assets/data/music_data.js',
5 | 'without_coordinates_noop_channel'
6 | )
7 |
8 | export default testSteps
9 |
--------------------------------------------------------------------------------
/test/e2e/tests/fixes/146.mjs:
--------------------------------------------------------------------------------
1 | /** Title should not disapear from empty chart. */
2 |
3 | const testSteps = [
4 | (chart) => {
5 | const data = {
6 | series: [
7 | { name: 'Foo', values: ['Alice', 'Bob', 'Ted'] },
8 | { name: 'Bar', values: [15, 32, 12] },
9 | { name: 'Baz', values: [5, 3, 2] }
10 | ]
11 | }
12 |
13 | return chart.animate({ data })
14 | },
15 | (chart) => chart.animate({ title: 'Test' }),
16 | (chart) =>
17 | chart.animate({
18 | x: 'Foo',
19 | y: 'Bar'
20 | })
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/tests/fixes/163.mjs:
--------------------------------------------------------------------------------
1 | /** Title should fade in beside the chart, not after. */
2 |
3 | const testSteps = [
4 | (chart) => {
5 | const data = {
6 | series: [
7 | { name: 'Foo', values: ['Alice', 'Bob', 'Ted'] },
8 | { name: 'Bar', values: [15, 32, 12] },
9 | { name: 'Baz', values: [5, 3, 2] }
10 | ]
11 | }
12 |
13 | return chart.animate({ data })
14 | },
15 | (chart) =>
16 | chart.animate({
17 | x: 'Foo',
18 | y: 'Bar',
19 | title: 'Test'
20 | })
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/tests/fixes/174.mjs:
--------------------------------------------------------------------------------
1 | const testSteps = [
2 | (chart) => {
3 | const data = {
4 | series: [
5 | { name: 'Foo', values: ['Alice', 'Bob', 'Ted'] },
6 | { name: 'Bar', values: [15, 32, 12] },
7 | { name: 'Baz', values: [5, 3, 2] }
8 | ]
9 | }
10 |
11 | return chart.animate({ data })
12 | },
13 | (chart) =>
14 | chart.animate({
15 | x: { set: 'Foo', title: 'Valami', ticks: true, guides: true, sort: 'byValue' },
16 | y: { set: 'Bar', title: 'Valami', ticks: true, guides: true, interlacing: false },
17 | geometry: 'circle'
18 | })
19 | ]
20 |
21 | export default testSteps
22 |
--------------------------------------------------------------------------------
/test/e2e/tests/fixes/32303048.mjs:
--------------------------------------------------------------------------------
1 | const testSteps = [
2 | (chart) => {
3 | const data = {
4 | series: [
5 | { name: 'Foo', values: ['Alice', 'Bob', 'Ted'] },
6 | { name: 'Bar', values: [15, 32, 12] }
7 | ]
8 | }
9 | return chart.animate({ data }, 0)
10 | },
11 | (chart) => {
12 | return chart.animate(
13 | {
14 | data: { filter: (record) => record.Foo === 'Alice' },
15 | config: {
16 | x: 'Foo',
17 | y: ['Foo', 'Bar']
18 | }
19 | },
20 | 0
21 | )
22 | }
23 | ]
24 |
25 | export default testSteps
26 |
--------------------------------------------------------------------------------
/test/e2e/tests/fixes/333.mjs:
--------------------------------------------------------------------------------
1 | /** Title should fade in beside the chart, not after. */
2 |
3 | const testSteps = [
4 | (chart) => {
5 | const data = {
6 | series: [
7 | { name: 'Foo', values: ['a', 'b', 'c', 'a', 'b', 'c'] },
8 | { name: 'Foo2', values: ['A', 'A', 'A', 'B', 'B', 'B'] },
9 | { name: 'Bar', values: [15, 32, 12, 3, 2] }
10 | ]
11 | }
12 |
13 | return chart.animate({ data })
14 | },
15 | (chart) =>
16 | chart.animate({
17 | color: 'Foo2',
18 | x: { set: ['Foo2', 'Foo'], labelLevel: 1 },
19 | y: 'Bar'
20 | })
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/tests/fixes/450.mjs:
--------------------------------------------------------------------------------
1 | const testSteps = [
2 | (chart) => {
3 | const data = {
4 | series: [
5 | { name: 'Foo', values: ['a', 'b', 'c', 'a', 'b', 'c'] },
6 | { name: 'Foo2', values: ['A', 'A', 'A', 'B', 'B', 'B'] },
7 | { name: 'Bar', values: [150000000, 32, 12, 3, 2, 10], unit: 'p' }
8 | ]
9 | }
10 |
11 | return chart.animate({ data })
12 | },
13 | (chart) =>
14 | chart.animate({
15 | config: {
16 | x: { set: 'Foo2' },
17 | y: 'Bar',
18 | color: 'Bar',
19 | legend: 'color',
20 | label: 'Bar'
21 | }
22 | })
23 | ]
24 |
25 | export default testSteps
26 |
--------------------------------------------------------------------------------
/test/e2e/tests/fixes/47977099.mjs:
--------------------------------------------------------------------------------
1 | const testSteps = [
2 | (chart) => {
3 | const data = {
4 | series: [
5 | { name: 'Foo', values: ['Alice', 'Bob', '"\\␡\t\n'] },
6 | { name: 'Bar', values: [15, 32, 12] },
7 | { name: 'Baz', values: [5, 3, 2] }
8 | ]
9 | }
10 |
11 | return chart.animate({ data })
12 | },
13 | (chart) =>
14 | chart.animate({
15 | x: 'Foo',
16 | y: 'Bar'
17 | }),
18 | (chart) => {
19 | console.info(chart.data)
20 | return chart
21 | }
22 | ]
23 |
24 | export default testSteps
25 |
--------------------------------------------------------------------------------
/test/e2e/tests/fixes/53978116.mjs:
--------------------------------------------------------------------------------
1 | const testSteps = [
2 | (chart) => {
3 | const data = {
4 | series: [
5 | { name: 'Foo', values: ['Alice', 'Alice', 'Ted'] },
6 | { name: 'Bar', values: ['x', 'y', 'z'] },
7 | { name: 'Baz', values: [5, 3, 2] }
8 | ]
9 | }
10 | return chart.animate({ data })
11 | },
12 | (chart) =>
13 | chart.animate({
14 | x: 'Foo',
15 | y: ['min(Baz)', 'Bar'],
16 | color: 'Bar'
17 | })
18 | ]
19 |
20 | export default testSteps
21 |
--------------------------------------------------------------------------------
/test/e2e/tests/fixes/55278793.mjs:
--------------------------------------------------------------------------------
1 | const testSteps = [
2 | (chart) =>
3 | chart.animate({
4 | data: {
5 | series: [
6 | {
7 | name: 'D1',
8 | values: ['v1', 'v2']
9 | },
10 | {
11 | name: 'M1',
12 | values: [-1, -2]
13 | }
14 | ]
15 | },
16 | config: {
17 | size: ['D1', 'M1']
18 | }
19 | })
20 | ]
21 |
22 | export default testSteps
23 |
--------------------------------------------------------------------------------
/test/e2e/tests/fixes/91.mjs:
--------------------------------------------------------------------------------
1 | const testSteps = [
2 | (chart) =>
3 | chart.animate({
4 | data: {
5 | series: [
6 | { name: 'Foo', values: ['Alice', 'Bob', 'Ted'] },
7 | { name: 'Bar', values: [15, 32, 12] }
8 | ]
9 | }
10 | }),
11 | (chart) =>
12 | chart.animate({
13 | y: 'Foo',
14 | x: 'Bar'
15 | }),
16 | (chart) =>
17 | chart.animate({
18 | color: 'Foo',
19 | y: ['Bar', 'Foo'],
20 | x: null
21 | })
22 | ]
23 |
24 | export default testSteps
25 |
--------------------------------------------------------------------------------
/test/e2e/tests/tickets/138.mjs:
--------------------------------------------------------------------------------
1 | const testSteps = [
2 | (chart) => {
3 | const data = {
4 | series: [
5 | { name: 'Foo', values: ['A', 'B', 'C', 'A', 'B', 'C'] },
6 | { name: 'Foo2', values: ['1', '1', '1', '2', '2', '2'] },
7 | { name: 'Bar', values: [15, 32, 12, 3, 2, 4] }
8 | ]
9 | }
10 |
11 | return chart.animate({ data })
12 | },
13 | (chart) =>
14 | chart.animate({
15 | x: 'Foo',
16 | color: 'Foo2',
17 | y: { set: ['Bar', 'Foo2'], range: { max: 1.2 }, align: 'stretch' }
18 | })
19 | ]
20 |
21 | export default testSteps
22 |
--------------------------------------------------------------------------------
/test/e2e/tests/tickets/268.mjs:
--------------------------------------------------------------------------------
1 | const testSteps = [
2 | (chart) => {
3 | const data = {
4 | series: [
5 | { name: 'Foo', values: ['Alice', 'Bob', 'Alice', 'Bob'] },
6 | { name: 'Foo2', values: ['A', 'A', 'B', 'B'] },
7 | { name: 'Bar', values: [15, 32, 12, 23] }
8 | ]
9 | }
10 |
11 | return chart.animate({ data })
12 | },
13 | (chart) =>
14 | chart.animate({
15 | x: ['Foo', 'Foo2'],
16 | y: 'max(Bar)',
17 | color: 'Foo2'
18 | }),
19 | (chart) =>
20 | chart.animate({
21 | x: 'Foo',
22 | y: 'max(Bar)',
23 | color: null
24 | })
25 | ]
26 |
27 | export default testSteps
28 |
--------------------------------------------------------------------------------
/test/e2e/tests/tickets/300.mjs:
--------------------------------------------------------------------------------
1 | const testSteps = [
2 | (chart) => {
3 | const data = {
4 | series: [
5 | { name: 'Foo', values: ['Alice', 'Bob', 'Ted'] },
6 | { name: 'Bar', values: [15, 32, 12] },
7 | { name: 'Baz', values: [5, 3, 2] }
8 | ]
9 | }
10 |
11 | return chart.animate({ data })
12 | },
13 | (chart) =>
14 | chart.animate({
15 | title: 'Foo'
16 | }),
17 | (chart) =>
18 | chart.animate({
19 | config: {
20 | x: 'Foo',
21 | y: 'Bar'
22 | },
23 | style: {
24 | paddingLeft: '200px'
25 | }
26 | })
27 | ]
28 |
29 | export default testSteps
30 |
--------------------------------------------------------------------------------
/test/e2e/tests/tickets/361.mjs:
--------------------------------------------------------------------------------
1 | const testSteps = [
2 | (chart) => {
3 | const data = {
4 | series: [
5 | { name: 'Foo', values: ['Alice', 'Bob', 'Ted'] },
6 | { name: 'Bar', values: [15, 32, 28] },
7 | { name: 'Baz', values: [5, 3, 2] }
8 | ]
9 | }
10 |
11 | return chart.animate({ data })
12 | },
13 | (chart) =>
14 | chart.animate({
15 | x: ['Foo', 'Baz'],
16 | y: { set: ['Bar'], range: { max: 20 } },
17 | label: 'Bar',
18 | color: 'Foo',
19 | coordSystem: 'polar'
20 | })
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/tests/tickets/372.mjs:
--------------------------------------------------------------------------------
1 | const testSteps = [
2 | (chart) => {
3 | const data = {
4 | series: [
5 | { name: 'Foo', values: ['Alice', 'Bob', 'Ted', 'Alice', 'Bob', 'Ted'] },
6 | { name: 'Foo3', values: ['a', 'a', 'b', 'b', 'c', 'c'] }
7 | ]
8 | }
9 |
10 | return chart.animate({ data })
11 | },
12 | (chart) =>
13 | chart.animate({
14 | color: ['Foo']
15 | }),
16 | (chart) =>
17 | chart.animate({
18 | color: ['Foo3'],
19 | label: ['Foo']
20 | })
21 | ]
22 |
23 | export default testSteps
24 |
--------------------------------------------------------------------------------
/test/e2e/tests/tickets/376.mjs:
--------------------------------------------------------------------------------
1 | const testSteps = [
2 | (chart) => {
3 | const data = {
4 | series: [
5 | { name: 'Foo', values: ['Alice', 'Bob', 'Ted'] },
6 | { name: 'Bar', values: [15, 0.1, 12] }
7 | ]
8 | }
9 |
10 | return chart.animate({ data })
11 | },
12 | (chart) =>
13 | chart.animate({
14 | config: {
15 | size: 'Bar',
16 | color: 'Foo',
17 | geometry: 'circle'
18 | },
19 | style: {
20 | plot: {
21 | marker: {
22 | circleMinRadius: 0.05
23 | }
24 | }
25 | }
26 | })
27 | ]
28 |
29 | export default testSteps
30 |
--------------------------------------------------------------------------------
/test/e2e/tests/tickets/378.mjs:
--------------------------------------------------------------------------------
1 | const testSteps = [
2 | (chart) => {
3 | const data = {
4 | series: [
5 | { name: 'Foo', values: Array.from(Array(120).keys()).map((x) => x + '.') },
6 | {
7 | name: 'Bar',
8 | values: [100, 100, 100, 100, 100, 100, 65].concat(
9 | Array.from(Array(113).keys()).map((x) => 1)
10 | )
11 | }
12 | ]
13 | }
14 |
15 | return chart.animate({ data })
16 | },
17 | (chart) =>
18 | chart.animate({
19 | size: 'Bar',
20 | color: 'Foo',
21 | geometry: 'circle',
22 | legend: null
23 | })
24 | ]
25 |
26 | export default testSteps
27 |
--------------------------------------------------------------------------------
/test/e2e/tests/tickets/397.mjs:
--------------------------------------------------------------------------------
1 | const testSteps = [
2 | (chart) => {
3 | const data = {
4 | series: [
5 | { name: 'Foo', values: ['Alice', 'Bob', 'Ted'] },
6 | { name: 'Baz', values: [3, 5, 2] }
7 | ]
8 | }
9 |
10 | return chart.animate({ data })
11 | },
12 | (chart) =>
13 | chart.animate({
14 | x: 'Foo',
15 | y: 'Baz'
16 | }),
17 | (chart) =>
18 | chart.animate({
19 | x: { step: 2 }
20 | }),
21 | (chart) =>
22 | chart.animate({
23 | x: { step: 3 }
24 | })
25 | ]
26 |
27 | export default testSteps
28 |
--------------------------------------------------------------------------------
/test/e2e/tools/manual/client/test-lib.js:
--------------------------------------------------------------------------------
1 | class TestLib {
2 | constructor(url, name) {
3 | this.url = url
4 | this.name = name
5 | }
6 |
7 | createOption(select) {
8 | const option = document.createElement('option')
9 | option.value = this.url
10 | option.textContent = this.name
11 | select.appendChild(option)
12 | }
13 | }
14 |
15 | export default TestLib
16 |
--------------------------------------------------------------------------------
/test/e2e/tools/manual/client/url.js:
--------------------------------------------------------------------------------
1 | export default class Url {
2 | constructor() {
3 | this.urlParams = Url.getQueryParams()
4 | }
5 |
6 | static getQueryParams() {
7 | const queryString = window.location.search
8 | return new URLSearchParams(queryString)
9 | }
10 |
11 | getQueryParam(param) {
12 | return this.urlParams.get(param)
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/test/e2e/utils/lastanimation.mjs:
--------------------------------------------------------------------------------
1 | export class LastAnimation {
2 | constructor() {
3 | this._last = Promise.resolve()
4 | }
5 |
6 | get api() {
7 | return {
8 | last: () => {
9 | return this._last
10 | },
11 | reset: () => {
12 | this._last = Promise.resolve()
13 | }
14 | }
15 | }
16 |
17 | get hooks() {
18 | return {
19 | registerAnimation: (ctx, next) => {
20 | next()
21 | this._last = ctx.promise
22 | }
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/test/e2e/utils/testcontrol.mjs:
--------------------------------------------------------------------------------
1 | export function testController(chart, seekee) {
2 | const promise = Promise.resolve(chart)
3 | promise.activated = Promise.resolve({
4 | seek: (percent) => {
5 | seekee(parseFloat(percent) / 100)
6 | },
7 | pause: () => {},
8 | play: () => {}
9 | })
10 | return promise
11 | }
12 |
--------------------------------------------------------------------------------
/test/qtest/chart.h:
--------------------------------------------------------------------------------
1 | #ifndef QTEST_CHART_H
2 | #define QTEST_CHART_H
3 |
4 | #include "chart/ui/chart.h"
5 |
6 | class TestChart
7 | {
8 | public:
9 | explicit TestChart();
10 | void run();
11 | Vizzu::UI::ChartWidget &getChart() { return chart; }
12 | void operator()(Util::EventDispatcher::Params ¶m,
13 | const std::string &);
14 |
15 | private:
16 | Vizzu::UI::ChartWidget chart;
17 | void prepareData();
18 | };
19 |
20 | #endif
21 |
--------------------------------------------------------------------------------
/test/qtest/main.cpp:
--------------------------------------------------------------------------------
1 |
2 | #include
3 | #include
4 |
5 | #include "base/io/log.h"
6 |
7 | #include "window.h"
8 |
9 | int main(int argc, char *argv[])
10 | {
11 | try {
12 | IO::Log::set(
13 | [](const std::string &msg)
14 | {
15 | qWarning() << QString::fromStdString(msg);
16 | });
17 |
18 | const QApplication app(argc, argv);
19 | Window w;
20 | w.show();
21 | return QApplication::exec();
22 | }
23 | catch (std::exception &e) {
24 | qWarning() << QString::fromStdString(e.what());
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/test/qtest/window.ui:
--------------------------------------------------------------------------------
1 |
2 |
3 | Window
4 |
5 |
6 |
7 | 0
8 | 0
9 | 640
10 | 480
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/test/unit/base/refl/struct.cpp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vizzuhq/vizzu-lib/5798871bff8122bf1647a020fce6afb862cbb298/test/unit/base/refl/struct.cpp
--------------------------------------------------------------------------------
/test/unit/base/testclasses.h:
--------------------------------------------------------------------------------
1 | #ifndef TESTSTYLE_H
2 | #define TESTSTYLE_H
3 |
4 | #include
5 |
6 | struct Foo
7 | {
8 | std::optional foo;
9 | std::optional bar;
10 |
11 | void visit(auto &visitor) { visitor(foo, "foo")(bar, "bar"); }
12 | };
13 |
14 | struct Baz
15 | {
16 | std::optional baz;
17 | std::optional fobar;
18 |
19 | void visit(auto &visitor) { visitor(baz, "baz")(fobar, "fobar"); }
20 | };
21 |
22 | struct Fobar
23 | {
24 | Foo foo;
25 | Baz baz;
26 |
27 | void visit(auto &visitor) { visitor(foo, "foo")(baz, "baz"); }
28 | };
29 |
30 | #endif
31 |
--------------------------------------------------------------------------------
/test/unit/jest.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | rootDir: '../../',
3 | roots: ['/src', '/test/unit'],
4 | collectCoverage: true,
5 | coverageProvider: 'v8',
6 | coverageDirectory: '/test/unit/.coverage',
7 | coveragePathIgnorePatterns: ['test/unit/.*'],
8 | coverageThreshold: {
9 | global: {
10 | branches: 100,
11 | functions: 100,
12 | lines: 100,
13 | statements: 100
14 | }
15 | },
16 | testEnvironment: 'jest-environment-node',
17 | testRegex: '(test/unit/.*(\\.|/)test)\\.js$',
18 | transform: {}
19 | }
20 |
--------------------------------------------------------------------------------
/test/unit/util/ansi.h:
--------------------------------------------------------------------------------
1 | #ifndef TEST_ANSI
2 | #define TEST_ANSI
3 |
4 | #include
5 |
6 | namespace test::ansi
7 | {
8 |
9 | static constexpr std::string_view reset{"\033[0m"};
10 | static constexpr std::string_view fg_red{"\033[31m"};
11 | static constexpr std::string_view fg_green{"\033[32m"};
12 | static constexpr std::string_view fg_yellow{"\033[33m"};
13 |
14 | }
15 |
16 | #endif
17 |
--------------------------------------------------------------------------------
/test/unit/util/compiler.h:
--------------------------------------------------------------------------------
1 | #ifndef TEST_COMPILER_H
2 | #define TEST_COMPILER_H
3 |
4 | #ifdef __clang__
5 | #pragma clang diagnostic push
6 | #pragma clang diagnostic ignored "-Wunused-comparison"
7 | #pragma clang diagnostic ignored "-Woverloaded-shift-op-parentheses"
8 | #endif
9 |
10 | #endif
11 |
--------------------------------------------------------------------------------
/test/unit/util/test.h:
--------------------------------------------------------------------------------
1 | #ifndef TEST_H
2 | #define TEST_H
3 |
4 | #include "application.h"
5 | #include "collection.h"
6 | #include "compiler.h"
7 | #include "condition.h"
8 |
9 | #endif
10 |
--------------------------------------------------------------------------------
/tools/ci/.pylintrc:
--------------------------------------------------------------------------------
1 | [MESSAGES CONTROL]
2 | disable=
3 | fixme
4 | [BASIC]
5 | good-names=
6 | i,
7 | df
8 |
--------------------------------------------------------------------------------
/tools/ci/gcp/cloudbucket/CORS/cors.json:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "origin": ["*"],
4 | "method": ["GET", "POST", "HEAD"],
5 | "responseHeader": ["*"],
6 | "ExposeHeaders": ["*"],
7 | "maxAgeSeconds": 3600
8 | }
9 | ]
10 |
--------------------------------------------------------------------------------
/tools/ci/gcp/cloudbucket/CORS/cors.md:
--------------------------------------------------------------------------------
1 | # Configuring CORS on a bucket
2 |
3 | https://cloud.google.com/storage/docs/configuring-cors
4 |
5 | Use the gsutil cors command to configure CORS on a bucket:
6 | ```
7 | gsutil cors set JSON_FILE_NAME.json gs://BUCKET_NAME
8 | ```
9 | Where
10 | * JSON_FILE_NAME is the path to cors.json JSON file you created.
11 | * BUCKET_NAME is the name of the bucket. For example, my-bucket.
--------------------------------------------------------------------------------
/tools/ci/gcp/cloudfunctions/getVizzuList/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "getVizzuList",
3 | "version": "0.0.2",
4 | "dependencies": {
5 | "@google-cloud/storage": "*",
6 | "@google-cloud/functions-framework": "*"
7 | },
8 | "scripts": {
9 | "start": "npx functions-framework --target=getVizzuList"
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/tools/ci/gcp/cloudrun/slack/slackconfig:
--------------------------------------------------------------------------------
1 | apiVersion: cloud-build-notifiers/v1
2 | kind: SlackNotifier
3 | metadata:
4 | name: ci-results
5 | spec:
6 | notification:
7 | filter: build.status in [Build.Status.SUCCESS, Build.Status.FAILURE, Build.Status.TIMEOUT]
8 | delivery:
9 | webhookUrl:
10 | secretRef: webhook-url
11 | secrets:
12 | - name: webhook-url
13 | value: projects/418279184538/secrets/ci-results/versions/latest
--------------------------------------------------------------------------------
/tools/ci/rollup.config.cjs:
--------------------------------------------------------------------------------
1 | const path = require('path')
2 |
3 | const terser = require('@rollup/plugin-terser')
4 |
5 | module.exports = [
6 | {
7 | input: path.resolve(__dirname, '../../dist/index.js'),
8 | output: {
9 | file: path.resolve(__dirname, '../../dist/vizzu.min.js'),
10 | format: 'es',
11 | name: 'bundle'
12 | },
13 | plugins: [
14 | terser({
15 | mangle: {
16 | properties: {
17 | keep_quoted: true,
18 | regex: /^_/
19 | }
20 | }
21 | })
22 | ]
23 | }
24 | ]
25 |
--------------------------------------------------------------------------------
/tools/ci/run/docs-build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | rm -rf docs/assets/dist
6 | mkdir -p docs/assets/dist
7 | cp dist/vizzu.min.js docs/assets/dist/vizzu.min.js
8 | cp dist/cvizzu.wasm docs/assets/dist/cvizzu.wasm
9 |
10 | rm -rf docs/showcases
11 | cp -r vizzu-lib-doc/docs/showcases docs/
12 | rm -rf docs/readme
13 | cp -r vizzu-lib-doc/docs/readme docs/
14 |
15 | source .venv/bin/activate
16 | python tools/docs/placeholder.py
17 | mkdocs build -f ./tools/docs/mkdocs.yml
18 |
--------------------------------------------------------------------------------
/tools/ci/run/docs-deploy.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | rm -rf docs/assets/dist
6 | mkdir -p docs/assets/dist
7 | cp dist/vizzu.min.js docs/assets/dist/vizzu.min.js
8 | cp dist/cvizzu.wasm docs/assets/dist/cvizzu.wasm
9 |
10 | rm -rf docs/showcases
11 | cp -r vizzu-lib-doc/docs/showcases docs/
12 | rm -rf docs/readme
13 | cp -r vizzu-lib-doc/docs/readme docs/
14 |
15 | source .venv/bin/activate
16 | python tools/docs/placeholder.py
17 | python tools/docs/deploy.py
18 |
--------------------------------------------------------------------------------
/tools/ci/run/docs-gen-thumbnail.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | source .venv/bin/activate
6 |
7 | python tools/docs/examples/gen_thumbnails.py
8 |
--------------------------------------------------------------------------------
/tools/ci/run/format-black-py.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | source .venv/bin/activate
6 | black $@
7 |
--------------------------------------------------------------------------------
/tools/ci/run/format-mdformat-py.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | source .venv/bin/activate
6 | python ./tools/ci/std_check.py mdformat --wrap 80 --end-of-line keep --line-length 70 $@
7 |
--------------------------------------------------------------------------------
/tools/ci/run/init-py.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | if ! python3 -c 'import sys; assert sys.version_info >= (3,10)' > /dev/null; then
6 | echo "Python 3.10+ is required"
7 | exit 1
8 | fi
9 |
10 | test -f ~/.netrc && chmod u+rw,u-x,go-rwx ~/.netrc
11 |
12 | python3.10 -m venv --copies ".venv" || python3 -m venv --copies ".venv"
13 | source .venv/bin/activate
14 | pip install "setuptools<72.0.0"
15 | pip install pdm==2.10.3
16 | pdm install -p tools/ci --no-isolation
17 |
--------------------------------------------------------------------------------
/tools/ci/run/lint-pylint-py.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | source .venv/bin/activate
6 | pylint --rcfile tools/ci/.pylintrc $@
7 |
--------------------------------------------------------------------------------
/tools/ci/run/lock-py.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | source .venv/bin/activate
6 | pdm lock --no-default --no-isolation -d -p tools/ci
7 |
--------------------------------------------------------------------------------
/tools/ci/run/pkg-build-desktop-clangformat.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | # build desktop
6 |
7 | DEFAULT_JOBS=4
8 | JOBS="$1"
9 | if [ -z "$1" ]; then
10 | JOBS=$DEFAULT_JOBS
11 | fi
12 | export CC=/usr/bin/gcc-12
13 | export CXX=/usr/bin/g++-12
14 | mkdir -p build/cmake-desktop-gcc
15 | pushd build/cmake-desktop-gcc
16 | cmake -Dclangformat:BOOL="ON" ../../project/cmake/
17 | cmake --build . -- --jobs=$JOBS
18 | popd
19 |
20 | # test desktop
21 |
22 | pushd build/cmake-desktop-gcc/test
23 | ./vizzutest
24 | popd
25 |
--------------------------------------------------------------------------------
/tools/ci/run/pkg-build-desktop-clangtidy.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | # build desktop
6 |
7 | DEFAULT_JOBS=8
8 | JOBS="$1"
9 | if [ -z "$1" ]; then
10 | JOBS=$DEFAULT_JOBS
11 | fi
12 | mkdir -p build/cmake-desktop
13 | pushd build/cmake-desktop
14 | cmake -Dclangtidy:BOOL="ON" -Dcppcheck:BOOL="ON" ../../project/cmake/
15 | cmake --build . --target vizzutest -- --jobs=$JOBS
16 | popd
17 |
18 | # test desktop
19 |
20 | pushd build/cmake-desktop/test
21 | ./vizzutest
22 | popd
23 |
--------------------------------------------------------------------------------
/tools/ci/run/pkg-build-desktop.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | # build desktop
6 |
7 | DEFAULT_JOBS=8
8 | JOBS="$1"
9 | if [ -z "$1" ]; then
10 | JOBS=$DEFAULT_JOBS
11 | fi
12 | mkdir -p build/cmake-desktop
13 | pushd build/cmake-desktop
14 | cmake ../../project/cmake/
15 | cmake --build . -- --jobs=$JOBS
16 | popd
17 |
18 | # test desktop
19 |
20 | pushd build/cmake-desktop/test
21 | ./vizzutest
22 | popd
23 |
--------------------------------------------------------------------------------
/tools/ci/run/pkg-build-js.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | rm -rf build/js
6 | mkdir -p build/js
7 | npm pack --pack-destination build/js
8 | tar -ztvf build/js/*.tgz
9 |
--------------------------------------------------------------------------------
/tools/ci/run/pkg-build-ts.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | node tools/ci/type/gen-presets.cjs
6 | node tools/ci/type/gen-dts.cjs
7 | node tools/ci/type/gen-canvas-ts.cjs
8 | npx tsc -p src/apps/weblib/ts-api/tsconfig.json
9 | find "./src/apps/weblib/ts-api/" -type f -name "*.d.ts" -exec bash -c '
10 | for file do
11 | relative_path=$(realpath --relative-to="./src/apps/weblib/ts-api/" "$file")
12 | destination_path="./dist/$relative_path"
13 | mkdir -p "$(dirname "$destination_path")"
14 | cp "$file" "$destination_path"
15 | done
16 | ' bash {} +
17 |
--------------------------------------------------------------------------------
/tools/ci/run/pkg-build-wasm-wocpp-gsutil.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | rm -rf dist
6 | mkdir -p dist
7 |
8 | SHORT_SHA="$1"
9 | gsutil cp "gs://vizzu-lib-main-sha/lib-$SHORT_SHA/cvizzu.wasm" 'dist/cvizzu.wasm'
10 | gsutil cp "gs://vizzu-lib-main-sha/lib-$SHORT_SHA/cvizzu.js" 'dist/cvizzu.js'
11 |
12 | npm run build:ts
13 | npm run rollup
14 |
--------------------------------------------------------------------------------
/tools/ci/run/pkg-purge-js.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | version=$(node ./test/e2e/test.cjs -v --vizzu /dist/vizzu.min.js|awk -F'-' '{print $1}')
6 | echo "version: $version"
7 | npm cache clean --force && sleep 5
8 | npm install vizzu@$version
9 | node ./tools/ci/purge.cjs $version
10 |
--------------------------------------------------------------------------------
/tools/ci/run/pkg-rollup-js.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | rm -f dist/*.min.js
6 | npx rollup --config tools/ci/rollup.config.cjs
7 |
--------------------------------------------------------------------------------
/tools/ci/run/pkg-set-version-js.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | version=$(node ./test/e2e/test.cjs -v --vizzu /dist/vizzu.min.js|awk -F'-' '{print $1}')
6 | echo "version: $version"
7 | node ./tools/ci/version.cjs $version
8 |
9 | sed -i '/\#\# \[Unreleased\]/,/\#\#\ \[/{//!d}' CHANGELOG.md
10 | sed -i '/\#\# \[Unreleased\]/d' CHANGELOG.md
11 |
12 | npm version $version --no-git-tag-version
13 |
--------------------------------------------------------------------------------
/tools/ci/run/test-gsutil.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | SHORT_SHA="$1"
4 | npm test -- --vizzu /dist/vizzu.min.js --Werror sameref --hashes ALL --maxFailedImages 100 || TEST_FAILED=true
5 | tar -czvf test/e2e/test_report.tgz test/e2e/test_report/ || TGZ_FAILED=true
6 | gsutil cp "test/e2e/test_report.tgz" "gs://vizzu-lib-main-sha/lib-$SHORT_SHA/test_report.tgz" || GSUTIL_FAILED=true
7 | if [ "$TEST_FAILED" == "true" ] || [ "$TGZ_FAILED" == "true" ] || [ "$GSUTIL_FAILED" == "true" ]; then
8 | exit 1
9 | fi
10 |
--------------------------------------------------------------------------------
/tools/ci/run/type-mypy-py.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | source .venv/bin/activate
6 | mypy $@
7 |
--------------------------------------------------------------------------------
/tools/gittools/commitdepth.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | git rev-list --count HEAD
--------------------------------------------------------------------------------
/tools/gittools/gitcpp.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | rootPath=$(realpath $(dirname $(realpath -s $BASH_SOURCE))/../..)
4 |
5 | echo '#include "base/app/git.h"'
6 | echo 'namespace App::Git {'
7 | echo -n 'const char *const hash = "'
8 | $rootPath/tools/gittools/hash.sh | tr -d '\n'
9 | echo '";'
10 | echo -n 'const unsigned int depth = '
11 | $rootPath/tools/gittools/commitdepth.sh | tr -d '\n'
12 | echo ' + 0;'
13 | echo '}'
14 |
--------------------------------------------------------------------------------
/tools/gittools/hash.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | git rev-parse --short=6 HEAD
3 |
--------------------------------------------------------------------------------
/tools/gittools/root.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | git rev-parse --show-toplevel
3 |
--------------------------------------------------------------------------------
/tools/swatools/cincdot.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | if [ "$1" = "--help" ]; then
4 | echo "cincdot"
5 | echo "prints DOT graph of C header includes"
6 | echo
7 | exit
8 | fi
9 |
10 | rootPath=$(realpath $(dirname $(realpath -s $BASH_SOURCE))/../..)
11 |
12 | pushd $rootPath >/dev/null
13 |
14 | echo '
15 | digraph G {
16 | graph [splines=true overlap=false];
17 | '
18 | tools/swatools/cincdep.sh | perl -pe 's/^([^:]+): (.+)$/"\2" -> "\1";/'
19 | echo "}"
20 |
21 | popd >/dev/null
22 |
--------------------------------------------------------------------------------
/tools/swatools/linelen.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | if [ "$1" = "--help" ]; then
4 | echo "linelen"
5 | echo "prints line length histogram"
6 | echo
7 | exit
8 | fi
9 |
10 | rootPath=$(realpath $(dirname $(realpath -s $BASH_SOURCE))/../..)
11 |
12 | pushd $rootPath >/dev/null
13 |
14 | echo "lenght count"
15 | cat $( tools/swatools/lssrc.sh ) | perl -e '
16 | while() { $lens{length $_}++ }
17 | print "$_ $lens{$_}\n" for (sort { $a <=> $b } keys %lens)
18 | '
19 |
20 | popd >/dev/null
21 |
--------------------------------------------------------------------------------
/tools/swatools/lscsrc.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | if [ "$1" = "--help" ]; then
4 | echo "lscsrc"
5 | echo "lists C++ source files"
6 | echo
7 | exit
8 | fi
9 |
10 | rootPath=$(realpath $(dirname $(realpath -s $BASH_SOURCE))/../..)
11 |
12 | pushd $rootPath >/dev/null
13 |
14 | tools/swatools/lssrc.sh | grep -P '\.(cpp|h|inc|tpp)$' | grep -v tools
15 |
16 | popd >/dev/null
17 |
--------------------------------------------------------------------------------
/tools/swatools/sloc.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | if [ "$1" = "--help" ]; then
4 | echo "sloc"
5 | echo "prints source line count for the project"
6 | echo
7 | exit
8 | fi
9 |
10 | rootPath=$(realpath $(dirname $(realpath -s $BASH_SOURCE))/../..)
11 |
12 | pushd $rootPath >/dev/null
13 |
14 | wc -m -l $( tools/swatools/lssrc.sh ) | sort -n
15 |
16 | popd >/dev/null
17 |
--------------------------------------------------------------------------------
/tools/swatools/todos.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | if [ "$1" = "--help" ]; then
4 | echo "todos"
5 | echo "lists all todos from all source files"
6 | echo
7 | exit
8 | fi
9 |
10 | rootPath=$(realpath $(dirname $(realpath -s $BASH_SOURCE))/../..)
11 | if [ -z "$1" ]; then
12 | srcPath="$rootPath"
13 | else
14 | srcPath="$1"
15 | fi
16 |
17 | pushd $rootPath >/dev/null
18 |
19 | grep -ni todo $( tools/swatools/lssrc.sh "$srcPath" | grep -v tools ) \
20 | | perl -pe "s|^([^:]*:[^:]*):.*todo:?[ \t]*|${rootPath}/\1:0: info: todo: |i"
21 |
22 | popd >/dev/null
23 |
--------------------------------------------------------------------------------
/tools/warnings/tidy-warnings.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | make clean
3 | make 2>&1 | grep 'warning:' | grep -o '\[.*\]' | perl -ne 'print unless $seen{$_}++'
4 |
--------------------------------------------------------------------------------
/tools/warnings/warnings.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | make clean
3 | make 2>&1 | grep -o '\[-W.*\]' | perl -ne 'print unless $seen{$_}++'
4 |
--------------------------------------------------------------------------------