├── .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 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------