@vc-shell/framework 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/ai-agent/index.js.map +1 -0
- package/dist/chunks/ExtensionPoint.vue_vue_type_style_index_0_lang-B1R06zHa.js.map +1 -0
- package/dist/chunks/VcAiAgentPanel.vue_vue_type_style_index_0_lang-D0kWIlz3.js.map +1 -0
- package/dist/chunks/{VcTableAdapter.vue_vue_type_style_index_0_lang-D71wkuIU.js → VcTableAdapter.vue_vue_type_style_index_0_lang-Dh7DDZB9.js} +5489 -5528
- package/dist/chunks/VcTableAdapter.vue_vue_type_style_index_0_lang-Dh7DDZB9.js.map +1 -0
- package/dist/chunks/index-BuTo_Lx8.js.map +1 -0
- package/dist/chunks/index-CDUdOax4.js.map +1 -0
- package/dist/chunks/vendor-boolbase-DYkUBG-P.js.map +1 -0
- package/dist/chunks/vendor-cheerio-DE71XQ9x.js.map +1 -0
- package/dist/chunks/vendor-cheerio-select-D-qK1Cpo.js.map +1 -0
- package/dist/chunks/vendor-css-select-DqoO1-RK.js.map +1 -0
- package/dist/chunks/vendor-css-what-CZZaquJM.js.map +1 -0
- package/dist/chunks/vendor-cypress-signalr-mock-itnm2wpA.js.map +1 -0
- package/dist/chunks/vendor-d3-array-9cpTrqlO.js.map +1 -0
- package/dist/chunks/vendor-d3-axis-D1_DbKLz.js.map +1 -0
- package/dist/chunks/vendor-d3-brush-CcKeJp9e.js.map +1 -0
- package/dist/chunks/vendor-d3-chord-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-d3-color-BOYE6h_9.js.map +1 -0
- package/dist/chunks/vendor-d3-dispatch-fx-WMg0D.js.map +1 -0
- package/dist/chunks/vendor-d3-drag-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-d3-ease-Cr34gv04.js.map +1 -0
- package/dist/chunks/vendor-d3-force-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-d3-format-DaIwZvFc.js.map +1 -0
- package/dist/chunks/vendor-d3-geo-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-d3-geo-projection-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-d3-hierarchy-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-d3-interpolate-BYG2gvO4.js.map +1 -0
- package/dist/chunks/vendor-d3-interpolate-path-CpGLvKgS.js.map +1 -0
- package/dist/chunks/vendor-d3-path-DJOTitNW.js.map +1 -0
- package/dist/chunks/vendor-d3-quadtree-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-d3-sankey-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-d3-scale-CC5rtdt5.js.map +1 -0
- package/dist/chunks/vendor-d3-selection-CNMxsYiL.js.map +1 -0
- package/dist/chunks/vendor-d3-shape-DBhCDMiV.js.map +1 -0
- package/dist/chunks/vendor-d3-time-DAPP210_.js.map +1 -0
- package/dist/chunks/vendor-d3-time-format-hD7iE2WG.js.map +1 -0
- package/dist/chunks/vendor-d3-timer-C1cUWKPz.js.map +1 -0
- package/dist/chunks/vendor-d3-transition-BbNQT7qF.js.map +1 -0
- package/dist/chunks/vendor-d3-zoom-CcKeJp9e.js.map +1 -0
- package/dist/chunks/vendor-date-fns-BKO3x1R1.js.map +1 -0
- package/dist/chunks/vendor-dom-serializer-BbVuF1MQ.js.map +1 -0
- package/dist/chunks/vendor-domelementtype-B3sFIGaC.js.map +1 -0
- package/dist/chunks/vendor-domhandler-Kufn9M_V.js.map +1 -0
- package/dist/chunks/vendor-dompurify-DpIUMBYC.js.map +1 -0
- package/dist/chunks/vendor-domutils-DDRq_ial.js.map +1 -0
- package/dist/chunks/vendor-elkjs-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-emotion-cache-eEZT5l-Q.js.map +1 -0
- package/dist/chunks/vendor-emotion-hash-DImMRhyK.js.map +1 -0
- package/dist/chunks/vendor-emotion-memoize-BcEUCz8q.js.map +1 -0
- package/dist/chunks/vendor-emotion-serialize-BSDW8NwU.js.map +1 -0
- package/dist/chunks/vendor-emotion-sheet-CS8ZBl9s.js.map +1 -0
- package/dist/chunks/vendor-emotion-unitless-B7u1PU6w.js.map +1 -0
- package/dist/chunks/vendor-emotion-utils-D7refZTM.js.map +1 -0
- package/dist/chunks/vendor-emotion-weak-memoize-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-entities-J86Og8IU.js.map +1 -0
- package/dist/chunks/vendor-floating-ui-core-BoHdh92a.js.map +1 -0
- package/dist/chunks/vendor-floating-ui-dom-BvVXFZ4B.js.map +1 -0
- package/dist/chunks/vendor-floating-ui-utils-CidJRIm2.js.map +1 -0
- package/dist/chunks/vendor-floating-ui-vue-sCrhit51.js.map +1 -0
- package/dist/chunks/vendor-gridstack-Beau2jQ7.js.map +1 -0
- package/dist/chunks/vendor-headlessui-vue-Cn-RMs4E.js.map +1 -0
- package/dist/chunks/vendor-htmlparser2-BxKKzWLL.js.map +1 -0
- package/dist/chunks/vendor-internmap-Q5729_cS.js.map +1 -0
- package/dist/chunks/vendor-intlify-core-base-Cf8V01l9.js.map +1 -0
- package/dist/chunks/vendor-intlify-message-compiler-h1txdYa8.js.map +1 -0
- package/dist/chunks/vendor-intlify-shared-D4BJYR57.js.map +1 -0
- package/dist/chunks/vendor-iso-639-1-BEjYyfKo.js.map +1 -0
- package/dist/chunks/vendor-juggle-resize-observer-DiSiNbbT.js.map +1 -0
- package/dist/chunks/vendor-kdbush-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-leaflet-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-linkify-it-LzoUhj6C.js.map +1 -0
- package/dist/chunks/vendor-linkifyjs-dCH9UYes.js.map +1 -0
- package/dist/chunks/vendor-lodash-es-CfnUOh0o.js.map +1 -0
- package/dist/chunks/vendor-lodash-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-lucide-vue-next-CwUrzD6N.js.map +1 -0
- package/dist/chunks/vendor-maplibre-gl-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-markdown-it-Bs9KEWkF.js.map +1 -0
- package/dist/chunks/vendor-markdown-it-task-lists-CHKeJZfk.js.map +1 -0
- package/dist/chunks/vendor-mdurl-DZFDNdqC.js.map +1 -0
- package/dist/chunks/vendor-microsoft-applicationinsights-analytics-js-ufpnHxNR.js.map +1 -0
- package/dist/chunks/vendor-microsoft-applicationinsights-cfgsync-js-BmGq5cEx.js.map +1 -0
- package/dist/chunks/vendor-microsoft-applicationinsights-channel-js-BdtUi1l8.js.map +1 -0
- package/dist/chunks/vendor-microsoft-applicationinsights-core-js-CR3vyuZc.js.map +1 -0
- package/dist/chunks/vendor-microsoft-applicationinsights-dependencies-js-DXmYt4tG.js.map +1 -0
- package/dist/chunks/vendor-microsoft-applicationinsights-properties-js-CLbNzgkN.js.map +1 -0
- package/dist/chunks/vendor-microsoft-applicationinsights-shims-CGX8KXgN.js.map +1 -0
- package/dist/chunks/vendor-microsoft-applicationinsights-web-DzgnK2Mn.js.map +1 -0
- package/dist/chunks/vendor-microsoft-dynamicproto-js-D7567TLZ.js.map +1 -0
- package/dist/chunks/vendor-microsoft-signalr-Bgpbb4fW.js.map +1 -0
- package/dist/chunks/vendor-nevware21-ts-async-BxN_lmkD.js.map +1 -0
- package/dist/chunks/vendor-nevware21-ts-utils-Dr-hD3q9.js.map +1 -0
- package/dist/chunks/vendor-nth-check-D0N1qpsw.js.map +1 -0
- package/dist/chunks/vendor-orderedmap-B3SOk52B.js.map +1 -0
- package/dist/chunks/vendor-parse5-htmlparser2-tree-adapter-BUDJ887-.js.map +1 -0
- package/dist/chunks/vendor-parse5-zq5Hn0y9.js.map +1 -0
- package/dist/chunks/vendor-prettier-2Sf6a5jB.js.map +1 -0
- package/dist/chunks/vendor-prosemirror-commands-BaRVaTVO.js.map +1 -0
- package/dist/chunks/vendor-prosemirror-dropcursor-PuLxL9JM.js.map +1 -0
- package/dist/chunks/vendor-prosemirror-gapcursor-C7MEx13L.js.map +1 -0
- package/dist/chunks/vendor-prosemirror-history-_AfZxoMt.js.map +1 -0
- package/dist/chunks/vendor-prosemirror-keymap-tvZqK1zZ.js.map +1 -0
- package/dist/chunks/vendor-prosemirror-markdown-rpUTSG_Q.js.map +1 -0
- package/dist/chunks/vendor-prosemirror-model-DAA3avbR.js.map +1 -0
- package/dist/chunks/vendor-prosemirror-schema-list-qDgvFydE.js.map +1 -0
- package/dist/chunks/vendor-prosemirror-state-BvFA7AjG.js.map +1 -0
- package/dist/chunks/vendor-prosemirror-tables-CbmHRq4G.js.map +1 -0
- package/dist/chunks/vendor-prosemirror-transform-DVGD47fI.js.map +1 -0
- package/dist/chunks/vendor-prosemirror-view-BW4UqvjQ.js.map +1 -0
- package/dist/chunks/vendor-punycode-js-CgGegfA_.js.map +1 -0
- package/dist/chunks/vendor-rope-sequence-BWC2FSrq.js.map +1 -0
- package/dist/chunks/vendor-sortablejs-Bsvu-FKn.js.map +1 -0
- package/dist/chunks/vendor-striptags-DtlgQudQ.js.map +1 -0
- package/dist/chunks/vendor-stylis-ClfDrgKE.js.map +1 -0
- package/dist/chunks/vendor-supercluster-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-swiper-BgqGfw3Y.js.map +1 -0
- package/dist/chunks/vendor-tanstack-virtual-core-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-tanstack-vue-virtual-CD9yLWd7.js.map +1 -0
- package/dist/chunks/vendor-three-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-throttle-debounce-CX0imT7m.js.map +1 -0
- package/dist/chunks/vendor-tiptap-core-CZbeo7XQ.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-blockquote-B8uwrgnZ.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-bold-Ch9pbrZY.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-code-CVh_mZgz.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-code-block-CfoUSR2N.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-document-C4tn-v0L.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-hard-break-CbK1eM89.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-heading-BlkYF-RD.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-horizontal-rule-DjMOsQCA.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-image-BpqLcXdw.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-italic-YDdh6jEW.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-link-CETrc0Mo.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-list-DsiDvJxK.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-paragraph-Bcss4jc0.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-placeholder-ClNjQXk_.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-strike-BZiBed9b.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-table-QVjcLO_H.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-table-cell-CuXZTKj8.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-table-header-CuXZTKj8.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-table-row-CuXZTKj8.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-text-Wofhchrp.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-text-style-Bc6nvmn0.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extension-underline-Bo1pXXDN.js.map +1 -0
- package/dist/chunks/vendor-tiptap-extensions-D7eaegpB.js.map +1 -0
- package/dist/chunks/vendor-tiptap-markdown-18K1hcU0.js.map +1 -0
- package/dist/chunks/vendor-tiptap-pm-yqZPZQMU.js.map +1 -0
- package/dist/chunks/vendor-tiptap-starter-kit-ny-AoaO_.js.map +1 -0
- package/dist/chunks/vendor-tiptap-vue-3-BNAw8onj.js.map +1 -0
- package/dist/chunks/vendor-topojson-client-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-truncate-html-ChA1T5zy.js.map +1 -0
- package/dist/chunks/vendor-tslib-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-uc-micro-4lbSaZOs.js.map +1 -0
- package/dist/chunks/vendor-unovis-dagre-layout-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-unovis-graphlibrary-l0sNRNKZ.js.map +1 -0
- package/dist/chunks/vendor-unovis-ts-stSsHr9j.js.map +1 -0
- package/dist/chunks/vendor-unovis-vue-CZWGT3-0.js.map +1 -0
- package/dist/chunks/vendor-vee-validate-i18n-zT8NxX3R.js.map +1 -0
- package/dist/chunks/vendor-vee-validate-rules-4oWUZPpG.js.map +1 -0
- package/dist/chunks/vendor-vue-currency-input-CckB4kjx.js.map +1 -0
- package/dist/chunks/vendor-vue-demi-CD9yLWd7.js.map +1 -0
- package/dist/chunks/vendor-vue-devtools-api-aVYGocXp.js.map +1 -0
- package/dist/chunks/vendor-vue-i18n-LO-EJStU.js.map +1 -0
- package/dist/chunks/vendor-vue3-application-insights-CAgbt8pk.js.map +1 -0
- package/dist/chunks/vendor-vue3-touch-events-DqysuuWh.js.map +1 -0
- package/dist/chunks/vendor-vuepic-vue-datepicker-CaZ_qpJp.js.map +1 -0
- package/dist/chunks/vendor-vueuse-components-BW7i7Uhb.js.map +1 -0
- package/dist/chunks/vendor-vueuse-core-CEdpDfzx.js.map +1 -0
- package/dist/chunks/vendor-vueuse-shared-BlCOXw5g.js.map +1 -0
- package/dist/chunks/vendor-w3c-keyname-CLxH8j-f.js.map +1 -0
- package/dist/chunks/vendor-web-vitals-ByFgAM-8.js.map +1 -0
- package/dist/core/notifications/composables/index.d.ts +1 -0
- package/dist/core/notifications/composables/index.d.ts.map +1 -1
- package/dist/core/notifications/composables/useBroadcastFilter.d.ts +7 -0
- package/dist/core/notifications/composables/useBroadcastFilter.d.ts.map +1 -0
- package/dist/core/notifications/index.d.ts +1 -0
- package/dist/core/notifications/index.d.ts.map +1 -1
- package/dist/core/notifications/store.d.ts +5 -1
- package/dist/core/notifications/store.d.ts.map +1 -1
- package/dist/core/plugins/signalR/index.d.ts +2 -5
- package/dist/core/plugins/signalR/index.d.ts.map +1 -1
- package/dist/extensions/index.js.map +1 -0
- package/dist/framework.js +1746 -1706
- package/dist/framework.js.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +3 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/shell/_internal/notifications/composables/useContainer/index.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/components/atoms/vc-card/vc-card.vue.d.ts.map +1 -1
- package/dist/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.vue.d.ts.map +1 -1
- package/dist/ui/index.js +1 -1
- package/dist/ui/index.js.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendor-unovis-ts-stSsHr9j.js","sources":["../../../node_modules/@unovis/ts/types/component.js","../../../node_modules/@unovis/ts/types/data.js","../../../node_modules/@unovis/ts/utils/data.js","../../../node_modules/@unovis/ts/utils/resize-observer.js","../../../node_modules/@unovis/ts/core/container/config.js","../../../node_modules/@unovis/ts/core/container/index.js","../../../node_modules/@emotion/css/create-instance/dist/emotion-css-create-instance.esm.js","../../../node_modules/@emotion/css/dist/emotion-css.esm.js","../../../node_modules/@unovis/ts/utils/misc.js","../../../node_modules/@unovis/ts/styles/colors.js","../../../node_modules/@unovis/ts/styles/patterns.js","../../../node_modules/@unovis/ts/styles/index.js","../../../node_modules/@unovis/ts/utils/d3.js","../../../node_modules/@unovis/ts/containers/single-container/config.js","../../../node_modules/@unovis/ts/containers/single-container/index.js","../../../node_modules/@unovis/ts/data-models/core.js","../../../node_modules/@unovis/ts/components/axis/types.js","../../../node_modules/@unovis/ts/types/scale.js","../../../node_modules/@unovis/ts/types/direction.js","../../../node_modules/@unovis/ts/containers/xy-container/config.js","../../../node_modules/@unovis/ts/containers/xy-container/index.js","../../../node_modules/@unovis/ts/core/component/config.js","../../../node_modules/@unovis/ts/core/component/index.js","../../../node_modules/@unovis/ts/data-models/series.js","../../../node_modules/@unovis/ts/core/xy-component/config.js","../../../node_modules/@unovis/ts/core/xy-component/index.js","../../../node_modules/@unovis/ts/types/position.js","../../../node_modules/@unovis/ts/components/tooltip/config.js","../../../node_modules/@unovis/ts/components/tooltip/style.js","../../../node_modules/@unovis/ts/components/tooltip/index.js","../../../node_modules/@unovis/ts/utils/color.js","../../../node_modules/@unovis/ts/types/curve.js","../../../node_modules/@unovis/ts/components/line/config.js","../../../node_modules/@unovis/ts/components/line/style.js","../../../node_modules/@unovis/ts/components/line/index.js","../../../node_modules/@unovis/ts/utils/path.js","../../../node_modules/@unovis/ts/components/grouped-bar/config.js","../../../node_modules/@unovis/ts/components/grouped-bar/style.js","../../../node_modules/@unovis/ts/components/grouped-bar/index.js","../../../node_modules/@unovis/ts/types/text.js","../../../node_modules/@unovis/ts/types/svg.js","../../../node_modules/@unovis/ts/utils/text.js","../../../node_modules/@unovis/ts/components/axis/config.js","../../../node_modules/@unovis/ts/utils/style.js","../../../node_modules/@unovis/ts/components/axis/style.js","../../../node_modules/@unovis/ts/components/axis/index.js","../../../node_modules/@unovis/ts/components/crosshair/config.js","../../../node_modules/@unovis/ts/components/crosshair/style.js","../../../node_modules/@unovis/ts/components/crosshair/index.js","../../../node_modules/@unovis/ts/components/donut/config.js","../../../node_modules/@unovis/ts/components/donut/modules/arc.js","../../../node_modules/@unovis/ts/components/donut/constants.js","../../../node_modules/@unovis/ts/components/donut/style.js","../../../node_modules/@unovis/ts/components/donut/index.js"],"sourcesContent":["var ComponentType;\r\n(function (ComponentType) {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n ComponentType[ComponentType[\"SVG\"] = 0] = \"SVG\";\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n ComponentType[ComponentType[\"HTML\"] = 1] = \"HTML\";\r\n})(ComponentType || (ComponentType = {}));\r\nvar Sizing;\r\n(function (Sizing) {\r\n Sizing[\"Fit\"] = \"fit\";\r\n Sizing[\"Extend\"] = \"extend\";\r\n Sizing[\"FitWidth\"] = \"fit_width\";\r\n})(Sizing || (Sizing = {}));\n\nexport { ComponentType, Sizing };\n//# sourceMappingURL=component.js.map\n","var FindNearestDirection;\r\n(function (FindNearestDirection) {\r\n FindNearestDirection[\"Left\"] = \"left\";\r\n FindNearestDirection[\"Right\"] = \"right\";\r\n FindNearestDirection[\"Auto\"] = \"auto\";\r\n})(FindNearestDirection || (FindNearestDirection = {}));\n\nexport { FindNearestDirection };\n//# sourceMappingURL=data.js.map\n","import { mean, min, max, bisectLeft, bisectRight } from 'd3-array';\nimport { throttle as throttle$1 } from 'throttle-debounce';\nimport { FindNearestDirection } from '../types/data.js';\n\nconst isNumber = (a) => typeof a === 'number';\r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\nconst isFunction = (a) => typeof a === 'function';\r\nconst isUndefined = (a) => a === undefined;\r\nconst isNil = (a) => a == null;\r\nconst isString = (a) => typeof a === 'string';\r\nconst isArray = (a) => Array.isArray(a);\r\nconst isObject = (a) => (a instanceof Object);\r\nconst isAClassInstance = (a) => a.constructor.name !== 'Function' && a.constructor.name !== 'Object';\r\nconst isPlainObject = (a) => isObject(a) && !isArray(a) && !isFunction(a) && !isAClassInstance(a);\r\nconst isEmpty = (obj) => {\r\n return [Object, Array].includes((obj || {}).constructor) &&\r\n !Object.entries((obj || {})).length;\r\n};\r\n// Based on https://github.com/maplibre/maplibre-gl-js/blob/e78ad7944ef768e67416daa4af86b0464bd0f617/src/style-spec/util/deep_equal.ts, 3-Clause BSD license\r\nconst isEqual = (a, b, skipKeys = [], visited = new Set()) => {\r\n if (Array.isArray(a)) {\r\n if (!Array.isArray(b) || a.length !== b.length)\r\n return false;\r\n if (visited.has(a))\r\n return true;\r\n else\r\n visited.add(a);\r\n for (let i = 0; i < a.length; i++) {\r\n if (!isEqual(a[i], b[i], skipKeys, visited))\r\n return false;\r\n }\r\n return true;\r\n }\r\n if (a instanceof Date && b instanceof Date) {\r\n return a.getTime() === b.getTime();\r\n }\r\n if (typeof a === 'object' && a !== null && b !== null) {\r\n if (!(typeof b === 'object'))\r\n return false;\r\n if (a === b)\r\n return true;\r\n const keysA = Object.keys(a).filter(key => !skipKeys.includes(key));\r\n const keysB = Object.keys(b).filter(key => !skipKeys.includes(key));\r\n if (keysA.length !== keysB.length)\r\n return false;\r\n if (visited.has(a))\r\n return true;\r\n else\r\n visited.add(a);\r\n for (const key of keysA) {\r\n if (!isEqual(a[key], b[key], skipKeys, visited))\r\n return false;\r\n }\r\n return true;\r\n }\r\n return a === b;\r\n};\r\nconst without = (arr, ...args) => arr.filter(item => !args.includes(item));\r\nconst flatten = (arr) => arr.flat();\r\nconst cloneDeep = (obj, stack = new Map()) => {\r\n if (typeof obj !== 'object' || obj === null) {\r\n return obj;\r\n }\r\n if (obj instanceof Date) {\r\n return new Date(obj.getTime());\r\n }\r\n if (obj instanceof Array) {\r\n const clone = [];\r\n stack.set(obj, clone);\r\n for (const item of obj) {\r\n clone.push(stack.has(item) ? stack.get(item) : cloneDeep(item, stack));\r\n }\r\n return clone;\r\n }\r\n // Class instances will be copied without cloning\r\n if (isAClassInstance(obj)) {\r\n const clone = obj;\r\n return clone;\r\n }\r\n if (obj instanceof Object) {\r\n const clone = {};\r\n stack.set(obj, clone);\r\n const objAsRecord = obj;\r\n Object.keys(obj)\r\n .reduce((newObj, key) => {\r\n newObj[key] = stack.has(objAsRecord[key]) ? stack.get(objAsRecord[key]) : cloneDeep(objAsRecord[key], stack);\r\n return newObj;\r\n }, clone);\r\n return clone;\r\n }\r\n return obj;\r\n};\r\nconst merge = (obj1, obj2, visited = new Map()) => {\r\n if (!obj1 || !obj2)\r\n return obj1;\r\n if (obj1 === obj2)\r\n return obj1;\r\n const newObj = (isAClassInstance(obj1) ? obj1 : cloneDeep(obj1));\r\n // Taking care of recursive structures\r\n if (visited.has(obj2))\r\n return visited.get(obj2);\r\n else\r\n visited.set(obj2, newObj);\r\n Object.keys(obj2).forEach(key => {\r\n // Preventing prototype pollution\r\n if (key === '__proto__' || key === 'constructor')\r\n return;\r\n if (isPlainObject(obj1[key]) && isPlainObject(obj2[key])) {\r\n newObj[key] = merge(obj1[key], obj2[key], visited);\r\n }\r\n else if (isAClassInstance(obj2)) {\r\n newObj[key] = obj2;\r\n }\r\n else {\r\n newObj[key] = cloneDeep(obj2[key]);\r\n }\r\n });\r\n return newObj;\r\n};\r\nconst omit = (obj, props) => {\r\n obj = Object.assign({}, obj);\r\n props.forEach(prop => delete obj[prop]);\r\n return obj;\r\n};\r\nconst groupBy = (arr, accessor) => {\r\n return arr.reduce((grouped, v, i, a, k = accessor(v, i)) => (((grouped[k] || (grouped[k] = [])).push(v), grouped)), {});\r\n};\r\nconst sortBy = (arr, accessor) => {\r\n return arr.concat() // The native sort method modifies the array in place. We use `.concat()` to copy the array first\r\n .sort((a, b) => {\r\n return (accessor(a) > accessor(b)) ? 1 : ((accessor(b) > accessor(a)) ? -1 : 0);\r\n });\r\n};\r\nconst throttle = (f, delay, options) => throttle$1(delay, f, options);\r\nfunction getValue(d, accessor, index) {\r\n // eslint-disable-next-line @typescript-eslint/ban-types\r\n if (isFunction(accessor))\r\n return accessor(d, index);\r\n else\r\n return accessor;\r\n}\r\nfunction getString(d, accessor, i) {\r\n return getValue(d, accessor, i);\r\n}\r\nfunction getNumber(d, accessor, i) {\r\n return getValue(d, accessor, i);\r\n}\r\nfunction getBoolean(d, accessor, i) {\r\n return getValue(d, accessor, i);\r\n}\r\nfunction clean(data) {\r\n return data.filter(d => d && !isNumber(d));\r\n}\r\nfunction clamp(d, min, max) {\r\n return Math.min(Math.max(d, min), max);\r\n}\r\nfunction unique(array) {\r\n return Array.from(new Set(array));\r\n}\r\nfunction countUnique(array, accessor = (d) => d) {\r\n return new Set(array.map(d => accessor(d))).size;\r\n}\r\nfunction arrayOfIndices(n) {\r\n return [...Array(n).keys()];\r\n}\r\nfunction shallowDiff(o1 = {}, o2 = {}) {\r\n return Object.keys(o2).reduce((diff, key) => {\r\n if (o1[key] === o2[key])\r\n return diff;\r\n return Object.assign(Object.assign({}, diff), { [key]: o2[key] });\r\n }, {});\r\n}\r\nfunction getStackedExtent(data, ...acs) {\r\n if (!data)\r\n return [undefined, undefined];\r\n if (isArray(acs)) {\r\n let minValue = 0;\r\n let maxValue = 0;\r\n data.forEach((d, i) => {\r\n let positiveStack = 0;\r\n let negativeStack = 0;\r\n for (const a of acs) {\r\n const value = getNumber(d, a, i) || 0;\r\n if (value >= 0)\r\n positiveStack += value;\r\n else\r\n negativeStack += value;\r\n }\r\n if (positiveStack > maxValue)\r\n maxValue = positiveStack;\r\n if (negativeStack < minValue)\r\n minValue = negativeStack;\r\n });\r\n return [minValue, maxValue];\r\n }\r\n}\r\nfunction getStackedValues(d, index, ...acs) {\r\n const values = [];\r\n let positiveStack = 0;\r\n let negativeStack = 0;\r\n for (const a of acs) {\r\n const value = getNumber(d, a, index) || 0;\r\n if (value >= 0) {\r\n values.push(positiveStack += value);\r\n }\r\n else {\r\n values.push(negativeStack += value);\r\n }\r\n }\r\n return values;\r\n}\r\nfunction getStackedData(data, baseline, acs, prevNegative // to help guessing the stack direction (positive/negative) when the values are 0 or null\r\n) {\r\n const baselineValues = data.map((d, i) => getNumber(d, baseline, i) || 0);\r\n const isNegativeStack = acs.map((a, j) => {\r\n const average = mean(data, (d, i) => getNumber(d, a, i) || 0);\r\n return (average === 0 && Array.isArray(prevNegative)) ? prevNegative[j] : average < 0;\r\n });\r\n const stackedData = acs.map(() => []);\r\n data.forEach((d, i) => {\r\n let positiveStack = baselineValues[i];\r\n let negativeStack = baselineValues[i];\r\n acs.forEach((a, j) => {\r\n const value = getNumber(d, a, i) || 0;\r\n if (value >= 0) {\r\n stackedData[j].push([positiveStack, positiveStack += value]);\r\n }\r\n else {\r\n stackedData[j].push([negativeStack, negativeStack += value]);\r\n }\r\n });\r\n });\r\n // Fill in additional stack information\r\n stackedData.forEach((stack, i) => {\r\n stack.isMostlyNegative = isNegativeStack[i];\r\n });\r\n return stackedData;\r\n}\r\nfunction getMin(data, ...acs) {\r\n if (!data)\r\n return undefined;\r\n const minValue = min(data, (d, i) => min(acs, a => getNumber(d, a, i)));\r\n return minValue;\r\n}\r\nfunction getMax(data, ...acs) {\r\n if (!data)\r\n return undefined;\r\n const maxValue = max(data, (d, i) => max(acs, a => getNumber(d, a, i)));\r\n return maxValue;\r\n}\r\nfunction getExtent(data, ...acs) {\r\n return [getMin(data, ...acs), getMax(data, ...acs)];\r\n}\r\nfunction getNearest(data, value, accessor, direction = FindNearestDirection.Auto) {\r\n if (data.length <= 1)\r\n return data[0];\r\n const dataWithIndex = data.map((d, i) => ([d, i]));\r\n const dataWithIndexSorted = dataWithIndex\r\n .sort(([a, i], [b, j]) => getNumber(a, accessor, i) - getNumber(b, accessor, j));\r\n const values = dataWithIndexSorted.map(([d, i]) => getNumber(d, accessor, i));\r\n const index = direction === FindNearestDirection.Right\r\n ? bisectLeft(values, value, 0, data.length - 1)\r\n : bisectRight(values, value, 1, data.length);\r\n if (direction === FindNearestDirection.Right) {\r\n return dataWithIndexSorted[index][0];\r\n }\r\n else if (direction === FindNearestDirection.Left) {\r\n return dataWithIndexSorted[index - 1][0];\r\n }\r\n // By default (`FindNearestDirection.Auto`) return the nearest value\r\n return value - values[index - 1] > values[index] - value ? dataWithIndexSorted[index][0] : dataWithIndexSorted[index - 1][0];\r\n}\r\nfunction filterDataByRange(data, range, accessor, includeNeighbors = false) {\r\n if (!accessor)\r\n return [];\r\n const filteredData = data.filter((d, i) => {\r\n const value = getNumber(d, accessor, i);\r\n return (value >= range[0]) && (value <= range[1]);\r\n });\r\n if (includeNeighbors) {\r\n // If `filteredData` is empty and `includeNeighbors` is true, try to find nearest points\r\n if (filteredData.length === 0) {\r\n const nearestLeft = getNearest(data, range[0], accessor, FindNearestDirection.Left);\r\n const nearestRight = getNearest(data, range[1], accessor, FindNearestDirection.Right);\r\n return [nearestLeft, nearestRight].filter(Boolean);\r\n }\r\n // Find indices of first and last filtered points in original data\r\n const firstFilteredItem = filteredData[0];\r\n const lastFilteredItem = filteredData[filteredData.length - 1];\r\n const firstFilteredIndex = data.findIndex((d) => d === firstFilteredItem);\r\n const lastFilteredIndex = data.findIndex((d) => d === lastFilteredItem);\r\n // Include neighbors (if they exist)\r\n const startIndex = Math.max(0, firstFilteredIndex - 1);\r\n const endIndex = Math.min(data.length - 1, lastFilteredIndex + 1);\r\n // Return data from startIndex to endIndex (inclusive)\r\n return data.slice(startIndex, endIndex + 1);\r\n }\r\n return filteredData;\r\n}\r\nfunction isNumberWithinRange(value, range) {\r\n return (value >= range[0] && value <= range[1]) || (value >= range[1] && value <= range[0]);\r\n}\r\nconst ensureArray = (value) => {\r\n if (value === null || value === undefined) {\r\n return [];\r\n }\r\n if (Array.isArray(value)) {\r\n return value;\r\n }\r\n return [value];\r\n};\n\nexport { arrayOfIndices, clamp, clean, cloneDeep, countUnique, ensureArray, filterDataByRange, flatten, getBoolean, getExtent, getMax, getMin, getNearest, getNumber, getStackedData, getStackedExtent, getStackedValues, getString, getValue, groupBy, isAClassInstance, isArray, isEmpty, isEqual, isFunction, isNil, isNumber, isNumberWithinRange, isObject, isPlainObject, isString, isUndefined, merge, omit, shallowDiff, sortBy, throttle, unique, without };\n//# sourceMappingURL=data.js.map\n","import { ResizeObserver as ResizeObserver$1 } from '@juggle/resize-observer';\n\nconst ResizeObserver = globalThis.ResizeObserver || ResizeObserver$1;\n\nexport { ResizeObserver };\n//# sourceMappingURL=resize-observer.js.map\n","import { Sizing } from '../../types/component.js';\n\n// Core\r\nconst ContainerDefaultConfig = {\r\n duration: undefined,\r\n margin: {\r\n top: 0,\r\n bottom: 0,\r\n left: 0,\r\n right: 0,\r\n },\r\n padding: {\r\n top: 0,\r\n bottom: 0,\r\n left: 0,\r\n right: 0,\r\n },\r\n sizing: Sizing.Fit,\r\n width: undefined,\r\n height: undefined,\r\n svgDefs: undefined,\r\n ariaLabel: undefined,\r\n};\n\nexport { ContainerDefaultConfig };\n//# sourceMappingURL=config.js.map\n","import { select } from 'd3-selection';\nimport { Sizing } from '../../types/component.js';\nimport { merge, clamp, isEqual } from '../../utils/data.js';\nimport { ResizeObserver } from '../../utils/resize-observer.js';\nimport { ContainerDefaultConfig } from './config.js';\n\nclass ContainerCore {\r\n constructor(element) {\r\n this._defaultConfig = ContainerDefaultConfig;\r\n this._isFirstRender = true;\r\n this._renderAnimationFrameId = null;\r\n this._container = element;\r\n // Setting `role` attribute to `image` to make the container accessible\r\n const container = select(this._container);\r\n container.attr('role', 'figure');\r\n // Create SVG element for visualizations\r\n this.svg = container.append('svg')\r\n // We set `display` to `block` because inline elements have an invisible\r\n // inline space that adds 4px to the height of the container\r\n .style('display', 'block')\r\n .attr('xmlns', 'http://www.w3.org/2000/svg')\r\n .attr('height', ContainerCore.DEFAULT_CONTAINER_HEIGHT) // Overriding default SVG height of 150\r\n .attr('aria-hidden', true);\r\n this._svgDefs = this.svg.append('defs');\r\n this._svgDefsExternal = this.svg.append('defs');\r\n this.element = this.svg.node();\r\n }\r\n updateContainer(config) {\r\n var _a;\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n this.prevConfig = this.config;\r\n this.config = merge(this._defaultConfig, config);\r\n // Add `svgDefs` if provided in the config\r\n if ((config === null || config === void 0 ? void 0 : config.svgDefs) !== ((_a = this.prevConfig) === null || _a === void 0 ? void 0 : _a.svgDefs)) {\r\n this._svgDefsExternal.selectAll('*').remove();\r\n this._svgDefsExternal.html(config.svgDefs);\r\n }\r\n }\r\n // The `_preRender` step should be used to perform some actions before rendering.\r\n // For example, calculating scales, setting component sizes, etc ...\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n _preRender() { }\r\n // The `_render` step should be used to perform the actual rendering\r\n _render(duration) {\r\n const { config } = this;\r\n // Apply the `aria-label` attribute\r\n select(this._container)\r\n .attr('aria-label', config.ariaLabel);\r\n this._isFirstRender = false;\r\n }\r\n // Warning: Some Containers (i.e. Single Container) may override this method, so if you introduce any changes here,\r\n // make sure to check that other containers didn't break after them.\r\n render(duration = this.config.duration) {\r\n const width = this.config.width || this.containerWidth;\r\n const height = this.config.height || this.containerHeight;\r\n // We set SVG size in `render()` instead of `_render()`, because the size values in pixels will become\r\n // available only in the next animation when being accessed via `element.clientWidth` and `element.clientHeight`,\r\n // and we rely on those values when setting width and size of the components.\r\n this.svg\r\n .attr('width', width)\r\n .attr('height', height);\r\n // Set up Resize Observer. We do it in `render()` to capture container size change if it happened\r\n // in the next animation frame after the initial `render` was called.\r\n if (!this._resizeObserver)\r\n this._setUpResizeObserver();\r\n // Schedule the actual rendering in the next frame\r\n cancelAnimationFrame(this._renderAnimationFrameId);\r\n this._renderAnimationFrameId = requestAnimationFrame(() => {\r\n this._preRender();\r\n this._render(duration);\r\n });\r\n }\r\n get containerWidth() {\r\n return this.config.width\r\n ? this.element.clientWidth\r\n : (this._container.clientWidth || this._container.getBoundingClientRect().width);\r\n }\r\n get containerHeight() {\r\n return this.config.height\r\n ? this.element.clientHeight\r\n : (this._container.clientHeight || this._container.getBoundingClientRect().height || ContainerCore.DEFAULT_CONTAINER_HEIGHT);\r\n }\r\n get width() {\r\n return clamp(this.containerWidth - this.config.margin.left - this.config.margin.right, 0, Number.POSITIVE_INFINITY);\r\n }\r\n get height() {\r\n return clamp(this.containerHeight - this.config.margin.top - this.config.margin.bottom, 0, Number.POSITIVE_INFINITY);\r\n }\r\n _removeAllChildren() {\r\n while (this.element.firstChild) {\r\n this.element.removeChild(this.element.firstChild);\r\n }\r\n }\r\n _onResize() {\r\n const { config } = this;\r\n const redrawOnResize = config.sizing === Sizing.Fit || config.sizing === Sizing.FitWidth;\r\n if (redrawOnResize)\r\n this.render(0);\r\n }\r\n _setUpResizeObserver() {\r\n if (this._resizeObserver)\r\n return;\r\n const containerRect = this._container.getBoundingClientRect();\r\n this._containerSize = { width: containerRect.width, height: containerRect.height };\r\n this._resizeObserver = new ResizeObserver((entries, observer) => {\r\n // Using request animation frame to avoid multiple resize events when scrollbars appear/disappear\r\n // See more: https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver#observation_errors\r\n cancelAnimationFrame(this._resizeObserverAnimationFrameId);\r\n this._resizeObserverAnimationFrameId = requestAnimationFrame(() => {\r\n const resizedContainerRect = this._container.getBoundingClientRect();\r\n const resizedContainerSize = { width: resizedContainerRect.width, height: resizedContainerRect.height };\r\n const hasSizeChanged = !isEqual(this._containerSize, resizedContainerSize);\r\n // Do resize only if element is attached to the DOM\r\n // will come in useful when some ancestor of container becomes detached\r\n if (hasSizeChanged && resizedContainerSize.width && resizedContainerSize.height) {\r\n this._containerSize = resizedContainerSize;\r\n this._onResize();\r\n }\r\n });\r\n });\r\n this._resizeObserver.observe(this._container);\r\n }\r\n destroy() {\r\n var _a;\r\n cancelAnimationFrame(this._renderAnimationFrameId);\r\n cancelAnimationFrame(this._resizeObserverAnimationFrameId);\r\n (_a = this._resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();\r\n this.svg.remove();\r\n }\r\n}\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nContainerCore.DEFAULT_CONTAINER_HEIGHT = 300;\n\nexport { ContainerCore };\n//# sourceMappingURL=index.js.map\n","import createCache from '@emotion/cache';\nimport { serializeStyles } from '@emotion/serialize';\nimport { getRegisteredStyles, insertStyles } from '@emotion/utils';\n\nfunction insertWithoutScoping(cache, serialized) {\n if (cache.inserted[serialized.name] === undefined) {\n return cache.insert('', serialized, cache.sheet, true);\n }\n}\n\nfunction merge(registered, css, className) {\n var registeredStyles = [];\n var rawClassName = getRegisteredStyles(registered, registeredStyles, className);\n\n if (registeredStyles.length < 2) {\n return className;\n }\n\n return rawClassName + css(registeredStyles);\n}\n\nvar createEmotion = function createEmotion(options) {\n var cache = createCache(options);\n\n cache.sheet.speedy = function (value) {\n\n this.isSpeedy = value;\n };\n\n cache.compat = true;\n\n var css = function css() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var serialized = serializeStyles(args, cache.registered, undefined);\n insertStyles(cache, serialized, false);\n return cache.key + \"-\" + serialized.name;\n };\n\n var keyframes = function keyframes() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n var serialized = serializeStyles(args, cache.registered);\n var animation = \"animation-\" + serialized.name;\n insertWithoutScoping(cache, {\n name: serialized.name,\n styles: \"@keyframes \" + animation + \"{\" + serialized.styles + \"}\"\n });\n return animation;\n };\n\n var injectGlobal = function injectGlobal() {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n var serialized = serializeStyles(args, cache.registered);\n insertWithoutScoping(cache, serialized);\n };\n\n var cx = function cx() {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n return merge(cache.registered, css, classnames(args));\n };\n\n return {\n css: css,\n cx: cx,\n injectGlobal: injectGlobal,\n keyframes: keyframes,\n hydrate: function hydrate(ids) {\n ids.forEach(function (key) {\n cache.inserted[key] = true;\n });\n },\n flush: function flush() {\n cache.registered = {};\n cache.inserted = {};\n cache.sheet.flush();\n },\n sheet: cache.sheet,\n cache: cache,\n getRegisteredStyles: getRegisteredStyles.bind(null, cache.registered),\n merge: merge.bind(null, cache.registered, css)\n };\n};\n\nvar classnames = function classnames(args) {\n var cls = '';\n\n for (var i = 0; i < args.length; i++) {\n var arg = args[i];\n if (arg == null) continue;\n var toAdd = void 0;\n\n switch (typeof arg) {\n case 'boolean':\n break;\n\n case 'object':\n {\n if (Array.isArray(arg)) {\n toAdd = classnames(arg);\n } else {\n toAdd = '';\n\n for (var k in arg) {\n if (arg[k] && k) {\n toAdd && (toAdd += ' ');\n toAdd += k;\n }\n }\n }\n\n break;\n }\n\n default:\n {\n toAdd = arg;\n }\n }\n\n if (toAdd) {\n cls && (cls += ' ');\n cls += toAdd;\n }\n }\n\n return cls;\n};\n\nexport { createEmotion as default };\n","import createEmotion from '../create-instance/dist/emotion-css-create-instance.esm.js';\nimport '@emotion/cache';\nimport '@emotion/serialize';\nimport '@emotion/utils';\n\nvar _createEmotion = createEmotion({\n key: 'css'\n}),\n flush = _createEmotion.flush,\n hydrate = _createEmotion.hydrate,\n cx = _createEmotion.cx,\n merge = _createEmotion.merge,\n getRegisteredStyles = _createEmotion.getRegisteredStyles,\n injectGlobal = _createEmotion.injectGlobal,\n keyframes = _createEmotion.keyframes,\n css = _createEmotion.css,\n sheet = _createEmotion.sheet,\n cache = _createEmotion.cache;\n\nexport { cache, css, cx, flush, getRegisteredStyles, hydrate, injectGlobal, keyframes, merge, sheet };\n","import { isString, getString } from './data.js';\nimport { toPx } from './to-px.js';\n\nfunction guid() {\r\n const s4 = () => Math.floor((1 + crypto.getRandomValues(new Uint32Array(1))[0]) * 0x10000)\r\n .toString(16)\r\n .substring(1);\r\n return `${s4() + s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`;\r\n}\r\nfunction stringToHtmlId(str) {\r\n return (str || '').replace(/\\W/g, '_');\r\n}\r\nfunction isStringCSSVariable(s) {\r\n return isString(s) ? (s.substring(0, 6) === 'var(--') : false;\r\n}\r\nconst cssVariableCache = new WeakMap();\r\nfunction getCSSVariableValue(s, context) {\r\n if (!isString(s))\r\n return '';\r\n const variableName = s.substr(4, s.length - 5);\r\n let elementCache = cssVariableCache.get(context);\r\n if (!elementCache) {\r\n elementCache = new Map();\r\n cssVariableCache.set(context, elementCache);\r\n }\r\n if (elementCache.has(variableName)) {\r\n return elementCache.get(variableName);\r\n }\r\n const value = getComputedStyle(context).getPropertyValue(variableName);\r\n elementCache.set(variableName, value);\r\n return value;\r\n}\r\nfunction getCSSVariableValueInPixels(s, context) {\r\n const val = getCSSVariableValue(s, context);\r\n return toPx(val);\r\n}\r\nfunction getPixelValue(v) {\r\n return typeof v === 'number' ? v : toPx(v);\r\n}\r\nfunction rectIntersect(rect1, rect2, tolerancePx = 0) {\r\n const [left1, top1, right1, bottom1] = [\r\n rect1.x + tolerancePx,\r\n rect1.y + rect1.height - 2 * tolerancePx,\r\n rect1.x + rect1.width - 2 * tolerancePx,\r\n rect1.y + tolerancePx,\r\n ];\r\n const [left2, top2, right2, bottom2] = [\r\n rect2.x + tolerancePx,\r\n rect2.y + rect2.height - 2 * tolerancePx,\r\n rect2.x + rect2.width - 2 * tolerancePx,\r\n rect2.y + tolerancePx,\r\n ];\r\n return !(top1 < bottom2 || top2 < bottom1 || right1 < left2 || right2 < left1);\r\n}\r\nfunction getHref(d, identifier) {\r\n const id = getString(d, identifier);\r\n return id ? `url(#${id})` : null;\r\n}\r\nfunction evaluateSimpleExpression(expr) {\r\n // Handle multiplication and division first (higher precedence)\r\n // Keep applying until no more operations are found\r\n while (/(-?\\d+(?:\\.\\d+)?)\\s*([*/])\\s*(-?\\d+(?:\\.\\d+)?)/.test(expr)) {\r\n expr = expr.replace(/(-?\\d+(?:\\.\\d+)?)\\s*([*/])\\s*(-?\\d+(?:\\.\\d+)?)/, (_, a, op, b) => {\r\n const numA = parseFloat(a);\r\n const numB = parseFloat(b);\r\n return String(op === '*' ? numA * numB : numA / numB);\r\n });\r\n }\r\n // Handle addition and subtraction (lower precedence)\r\n // Keep applying until no more operations are found\r\n while (/(-?\\d+(?:\\.\\d+)?)\\s*([+-])\\s*(-?\\d+(?:\\.\\d+)?)/.test(expr)) {\r\n expr = expr.replace(/(-?\\d+(?:\\.\\d+)?)\\s*([+-])\\s*(-?\\d+(?:\\.\\d+)?)/, (_, a, op, b) => {\r\n const numA = parseFloat(a);\r\n const numB = parseFloat(b);\r\n return String(op === '+' ? numA + numB : numA - numB);\r\n });\r\n }\r\n const result = parseFloat(expr);\r\n if (isNaN(result))\r\n throw new Error(`Invalid expression: ${expr}`);\r\n return result;\r\n}\r\nfunction evaluateCalcExpression(expression, basis) {\r\n try {\r\n // Replace percentages and pixels with resolved values\r\n let expr = expression\r\n .replace(/(\\d+(?:\\.\\d+)?)%/g, (_, num) => String((basis * parseFloat(num)) / 100))\r\n .replace(/(\\d+(?:\\.\\d+)?)px/g, '$1')\r\n .replace(/\\s+/g, '');\r\n // Validate parentheses pairs before processing\r\n let parenCount = 0;\r\n for (const char of expr) {\r\n if (char === '(')\r\n parenCount++;\r\n else if (char === ')')\r\n parenCount--;\r\n if (parenCount < 0)\r\n throw new Error('Mismatched parentheses: closing parenthesis without opening');\r\n }\r\n if (parenCount !== 0)\r\n throw new Error('Mismatched parentheses: unclosed opening parenthesis');\r\n // Check for invalid characters (only allow numbers, operators, decimal points, and parentheses)\r\n if (!/^[0-9+\\-*/.() ]+$/.test(expr))\r\n throw new Error('Invalid characters in expression');\r\n // Check for empty parentheses\r\n if (/\\(\\s*\\)/.test(expr))\r\n throw new Error('Empty parentheses not allowed');\r\n // Simple regex-based evaluation for basic expressions\r\n // Handles: number, number+number, number-number, number*number, number/number\r\n // And simple parentheses: (expression)\r\n // Evaluate parentheses first\r\n let iterations = 0;\r\n const maxIterations = 100; // Prevent infinite loops\r\n while (expr.includes('(') && iterations < maxIterations) {\r\n const prevExpr = expr;\r\n expr = expr.replace(/\\(([^()]+)\\)/g, (_, inner) => String(evaluateSimpleExpression(inner)));\r\n if (expr === prevExpr)\r\n throw new Error('Unable to resolve parentheses');\r\n iterations++;\r\n }\r\n if (iterations >= maxIterations)\r\n throw new Error('Expression too complex or contains infinite recursion');\r\n if (expr.includes('(') || expr.includes(')'))\r\n throw new Error('Unresolved parentheses remain');\r\n return evaluateSimpleExpression(expr);\r\n }\r\n catch (error) {\r\n console.warn(`Failed to evaluate calc() expression: ${expression}`, error);\r\n return 0;\r\n }\r\n}\r\nfunction parseUnit(value, basis = 0) {\r\n if (!value)\r\n return 0;\r\n else if (typeof value === 'number')\r\n return value;\r\n else if (typeof value === 'string' && value.startsWith('calc(') && value.endsWith(')')) {\r\n // Parse calc() expression\r\n const expression = value.slice(5, -1).trim(); // Remove 'calc(' and ')'\r\n return evaluateCalcExpression(expression, basis);\r\n }\r\n else if (value.endsWith('%'))\r\n return basis * parseFloat(value) / 100;\r\n else if (value.endsWith('px'))\r\n return parseFloat(value);\r\n else\r\n return parseFloat(value) || 0;\r\n}\n\nexport { getCSSVariableValue, getCSSVariableValueInPixels, getHref, getPixelValue, guid, isStringCSSVariable, parseUnit, rectIntersect, stringToHtmlId };\n//# sourceMappingURL=misc.js.map\n","import { hsl } from 'd3-color';\nimport { isNumber } from '../utils/data.js';\n\n/** Array of default colors */\r\nconst colors = (globalThis === null || globalThis === void 0 ? void 0 : globalThis.UNOVIS_COLORS) || ['#4D8CFD', '#FF6B7E', '#F4B83E', '#A6CC74', '#00C19A', '#6859BE'];\r\nconst colorsDark = (globalThis === null || globalThis === void 0 ? void 0 : globalThis.UNOVIS_COLORS_DARK) || ['#4D8CFD', '#FF6B7E', '#FFC16D', '#A6CC74', '#00C19A', '#7887E0'];\r\n/** Return a CSS Variable name for a given color index or string */\r\nconst getCSSColorVariable = (suffix) => {\r\n return `--vis-${isNumber(suffix) ? `color${suffix % colors.length}` : suffix}`;\r\n};\r\nfunction getLighterColor(hex, percentage = 0.4) {\r\n const c = hsl(hex);\r\n c.l = c.l * (1 + percentage);\r\n return c.formatHex();\r\n}\r\nfunction getDarkerColor(hex, percentageL = 0.4, percentageS = 0.6) {\r\n const c = hsl(hex);\r\n c.s = c.s * (1 - percentageS);\r\n c.l = c.l * (1 - percentageL);\r\n return c.formatHex();\r\n}\n\nexport { colors, colorsDark, getCSSColorVariable, getDarkerColor, getLighterColor };\n//# sourceMappingURL=colors.js.map\n","import { getCSSColorVariable } from './colors.js';\n\nconst PATTERN_SIZE_PX = 10;\r\nconst fills = [\r\n { id: 'stripes-diagonal', svg: '<path d=\"M-1,1 l2,-2 M0,10 l10,-10 M9,11 l2,-2\" stroke=\"#000\"/>' },\r\n { id: 'dots', svg: '<path d=\"m0-1.5a1 1 0 010 3m10-3a1 1 0 000 3M5 3.5a1 1 0 010 3 1 1 0 010-3M0 8.5 a1 1 0 010 3m10-3a1 1 0 000 3\" fill\"#000\"/>' },\r\n { id: 'stripes-vertical', svg: '<path d=\"M 5,-1 L5,11\" stroke=\"#000\"/>' },\r\n { id: 'crosshatch', svg: '<path d=\"M0 0L10 10ZM10 0L0 10Z\" stroke=\"#000\"/>' },\r\n { id: 'waves', svg: '<path d=\"M0 4Q2.5 1 5 4 7.5 7 10 4v2Q7.5 9 5 6 2.5 3 0 6Z\" fill=\"#000\"/>' },\r\n { id: 'circles', svg: '<circle cx=\"5\" cy=\"5\" r=\"3\" stroke=\"#000\" fill=\"#fff\"/>' },\r\n];\r\nconst lines = [\r\n { id: 'circle', marker: '<circle cx=\"5\" cy=\"5\" r=\"5\"/>', dashArray: [] },\r\n { id: 'triangle', marker: '<path d=\"M5,0 L10,9 L0,9Z\">', dashArray: [9, 1] },\r\n { id: 'diamond', marker: '<path d=\"M 0 5 L5 0 L 10 5 L 5 10 L 0 5Z\">', dashArray: [2] },\r\n { id: 'arrow', marker: '<path d=\"M4 0 0 0 6 5 0 10 4 10 10 5Z\">', dashArray: [2, 3, 8, 3] },\r\n { id: 'square', marker: '<rect x=\"1\" y=\"1\" width=\"8\" height=\"8\"/>', dashArray: [6] },\r\n { id: 'star', marker: '<path d=\"m2 9 3-9 3 9L0 3h10Z\"/>', dashArray: [1, 6] },\r\n];\r\nfunction getPatternVariable(p) {\r\n return `vis-${`pattern-${p.svg ? 'fill' : 'marker'}`}-${p.id}`;\r\n}\r\nconst maskDef = (p) => `<mask id=\"${getPatternVariable(p)}\">\n <pattern id=\"${p.id}\" viewBox=\"0 0 10 10\" width=\"${PATTERN_SIZE_PX}\" height=\"${PATTERN_SIZE_PX}\" patternUnits=\"userSpaceOnUse\">\n <rect width=\"100%\" height=\"100%\" fill=\"#fff\"/>\n ${p.svg}\n </pattern>\n <rect x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\" fill=\"url(#${p.id})\"/>\n </mask>`;\r\nconst markerDef = (p, i) => `<marker id=\"${getPatternVariable(p)}\"\n fill=\"var(${getCSSColorVariable(i)})\"\n markerUnits=\"userSpaceOnUse\"\n refX=\"5\"\n refY=\"5\"\n markerWidth=\"${PATTERN_SIZE_PX}\"\n markerHeight=\"${PATTERN_SIZE_PX}\">\n ${p.marker}\n </marker>`;\r\n// // Injecting SVG defs as a single SVG element on the page\r\nfunction injectSVGDefs() {\r\n const svgDefs = fills.map(maskDef).concat(lines.map(markerDef)).join('');\r\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\r\n svg.setAttribute('height', '100%');\r\n svg.setAttribute('width', '100%');\r\n svg.style.position = 'fixed';\r\n svg.style.zIndex = '-99999999';\r\n svg.innerHTML = `<defs>${svgDefs}</defs>`;\r\n document.body.appendChild(svg);\r\n}\r\nif (typeof window !== 'undefined')\r\n injectSVGDefs();\n\nexport { PATTERN_SIZE_PX, fills, getPatternVariable, lines };\n//# sourceMappingURL=patterns.js.map\n","import { injectGlobal } from '@emotion/css';\nimport { getCSSVariableValue } from '../utils/misc.js';\nimport { getCSSColorVariable, getLighterColor, colors, getDarkerColor, colorsDark } from './colors.js';\nimport { fills, getPatternVariable, lines } from './patterns.js';\n\nconst UNOVIS_ICON_FONT_FAMILY_DEFAULT = (globalThis === null || globalThis === void 0 ? void 0 : globalThis.UNOVIS_ICON_FONT_FAMILY) || 'FontAwesome';\r\nconst UNOVIS_FONT_WH_RATIO_DEFAULT = (globalThis === null || globalThis === void 0 ? void 0 : globalThis.UNOVIS_FONT_W2H_RATIO_DEFAULT) || 0.5;\r\nconst UNOVIS_TEXT_SEPARATOR_DEFAULT = (globalThis === null || globalThis === void 0 ? void 0 : globalThis.UNOVIS_TEXT_SEPARATOR_DEFAULT) || [' ', '-', '.', ','];\r\nconst UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT = (globalThis === null || globalThis === void 0 ? void 0 : globalThis.UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT) || '-';\r\nconst UNOVIS_TEXT_DEFAULT = (globalThis === null || globalThis === void 0 ? void 0 : globalThis.UNOVIS_TEXT_DEFAULT) || {\r\n // If you change these defaults, don't forget to update the values in the `UnovisText` type in `types/text.ts`\r\n text: '',\r\n fontSize: 12,\r\n fontFamily: 'var(--vis-font-family)',\r\n lineHeight: 1.25,\r\n marginTop: 0,\r\n marginBottom: 0,\r\n};\r\nconst variables = injectGlobal `\n :root {\n label: vis-root-styles;\n --vis-font-family: Inter, Arial, \"Helvetica Neue\", Helvetica, sans-serif;\n --vis-font-wh-ratio: ${UNOVIS_FONT_WH_RATIO_DEFAULT};\n --vis-color-main: var(${getCSSColorVariable(0)});\n --vis-color-main-light: ${getLighterColor(colors[0])};\n --vis-color-main-dark: ${getDarkerColor(colors[0])};\n --vis-color-grey: #2a2a2a;\n ${colors.map((c, i) => `${getCSSColorVariable(i)}: ${c};`)}\n ${colorsDark.map((c, i) => `--vis-dark-color${i}: ${c};`)}\n ${fills.map((p, i) => `\n --${getPatternVariable(p)}: url(#${getPatternVariable(p)});\n --vis-pattern-fill${i}: var(--${getPatternVariable(p)});\n `)}\n ${lines.map((p, i) => {\r\n var _a;\r\n return `\n --${getPatternVariable(p)}: url(#${getPatternVariable(p)});\n --vis-pattern-marker${i}: var(--${getPatternVariable(p)});\n --vis-pattern-dasharray${i}: ${(_a = p.dashArray) === null || _a === void 0 ? void 0 : _a.join(' ')};\n `;\r\n})}\n\n body.theme-dark {\n ${colors.map((c, i) => `${getCSSColorVariable(i)}: var(--vis-dark-color${i});`)}\n }\n\n body.theme-patterns {\n ${fills.map((_, i) => `path[style*=\"fill: var(${getCSSColorVariable(i)})\"] {\n mask: var(--vis-pattern-fill${i});\n }`)}\n ${lines.map((_, i) => `\n path[stroke=\"var(${getCSSColorVariable(i)})\"]:not([style*=\"fill\"]),\n path[style*=\"stroke: var(${getCSSColorVariable(i)})\"]:not([style*=\"fill\"]) {\n marker: var(--vis-pattern-marker${i});\n stroke-dasharray: var(--vis-pattern-dasharray${i});\n }\n `)}\n}\n`;\r\nfunction getFontWidthToHeightRatio(context = window === null || window === void 0 ? void 0 : window.document.body) {\r\n return context ? +getCSSVariableValue('var(--vis-font-wh-ratio)', context) : UNOVIS_FONT_WH_RATIO_DEFAULT;\r\n}\n\nexport { UNOVIS_FONT_WH_RATIO_DEFAULT, UNOVIS_ICON_FONT_FAMILY_DEFAULT, UNOVIS_TEXT_DEFAULT, UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT, UNOVIS_TEXT_SEPARATOR_DEFAULT, getFontWidthToHeightRatio, variables };\n//# sourceMappingURL=index.js.map\n","import { interrupt } from 'd3-transition';\n\nfunction smartTransition(selection, duration, easing) {\r\n selection.nodes().forEach(node => interrupt(node)); // Interrupt active transitions if any\r\n if (duration) {\r\n const transition = selection.transition().duration(duration);\r\n if (easing)\r\n transition.ease(easing);\r\n return transition;\r\n }\r\n else\r\n return selection;\r\n}\n\nexport { smartTransition };\n//# sourceMappingURL=d3.js.map\n","import { ContainerDefaultConfig } from '../../core/container/config.js';\n\n// Core\r\nconst SingleContainerDefaultConfig = Object.assign(Object.assign({}, ContainerDefaultConfig), { tooltip: undefined, annotations: undefined });\n\nexport { SingleContainerDefaultConfig };\n//# sourceMappingURL=config.js.map\n","import '../../styles/index.js';\nimport { ContainerCore } from '../../core/container/index.js';\nimport { smartTransition } from '../../utils/d3.js';\nimport { Sizing } from '../../types/component.js';\nimport { SingleContainerDefaultConfig } from './config.js';\n\n// Global CSS variables (side effects import)\r\nclass SingleContainer extends ContainerCore {\r\n constructor(element, config, data) {\r\n var _a;\r\n super(element);\r\n this._defaultConfig = SingleContainerDefaultConfig;\r\n this.config = this._defaultConfig;\r\n if (config) {\r\n this.updateContainer(config, true);\r\n this.component = config.component;\r\n }\r\n if (data) {\r\n this.setData(data, true);\r\n }\r\n // Render if component exists and has data\r\n if ((_a = this.component) === null || _a === void 0 ? void 0 : _a.datamodel.data)\r\n this.render();\r\n }\r\n setData(data, preventRender) {\r\n var _a;\r\n const { config } = this;\r\n if (this.component)\r\n this.component.setData(data);\r\n if (!preventRender)\r\n this.render();\r\n (_a = config.tooltip) === null || _a === void 0 ? void 0 : _a.hide();\r\n }\r\n updateContainer(containerConfig, preventRender) {\r\n super.updateContainer(containerConfig);\r\n this._removeAllChildren();\r\n this.component = containerConfig.component;\r\n if (containerConfig.sizing)\r\n this.component.sizing = containerConfig.sizing;\r\n this.element.appendChild(this.component.element);\r\n const tooltip = containerConfig.tooltip;\r\n if (tooltip) {\r\n if (!tooltip.hasContainer())\r\n tooltip.setContainer(this._container);\r\n tooltip.setComponents([this.component]);\r\n }\r\n const annotations = containerConfig.annotations;\r\n if (annotations) {\r\n this.element.appendChild(annotations.element);\r\n }\r\n // Defs\r\n this.element.appendChild(this._svgDefs.node());\r\n this.element.appendChild(this._svgDefsExternal.node());\r\n if (!preventRender)\r\n this.render();\r\n }\r\n updateComponent(componentConfig, preventRender) {\r\n this.component.setConfig(componentConfig);\r\n if (!preventRender)\r\n this.render();\r\n }\r\n update(containerConfig, componentConfig, data) {\r\n if (containerConfig)\r\n this.updateContainer(containerConfig, true);\r\n if (componentConfig)\r\n this.updateComponent(componentConfig, true);\r\n if (data)\r\n this.setData(data, true);\r\n this.render();\r\n }\r\n getFitWidthScale() {\r\n const { config, component } = this;\r\n const extendedSizeComponent = component;\r\n if (!extendedSizeComponent.getWidth)\r\n return 1;\r\n const componentWidth = extendedSizeComponent.getWidth() + config.margin.left + config.margin.right;\r\n return this.width / componentWidth;\r\n }\r\n _preRender() {\r\n var _a, _b;\r\n super._preRender();\r\n this.component.setSize(this.width, this.height, this.containerWidth, this.containerHeight);\r\n this.component.setContainerMargin(this.config.margin);\r\n (_a = this.config.annotations) === null || _a === void 0 ? void 0 : _a.setSize(this.width, this.height, this.containerWidth, this.containerHeight);\r\n (_b = this.config.annotations) === null || _b === void 0 ? void 0 : _b.setContainerMargin(this.config.margin);\r\n }\r\n _render(duration) {\r\n var _a, _b;\r\n const { config, component } = this;\r\n super._render(duration);\r\n component.g.attr('transform', `translate(${config.margin.left},${config.margin.top})`);\r\n component.render(duration);\r\n (_a = config.annotations) === null || _a === void 0 ? void 0 : _a.render(duration);\r\n if (config.tooltip)\r\n config.tooltip.update();\r\n (_b = config.onRenderComplete) === null || _b === void 0 ? void 0 : _b.call(config, this.svg.node(), config.margin, this.containerWidth, this.containerHeight, this.width, this.height);\r\n }\r\n // Re-defining the `render()` function to handle different sizing techniques (`Sizing.Extend` and `Sizing.FitWidth`)\r\n // Not calling `super.render()` because we don't want it to interfere with setting the SVG size here.\r\n render(duration = this.config.duration) {\r\n const { config, component } = this;\r\n if (config.sizing === Sizing.Extend || config.sizing === Sizing.FitWidth) {\r\n const fitToWidth = config.sizing === Sizing.FitWidth;\r\n const extendedSizeComponent = component;\r\n const componentWidth = extendedSizeComponent.getWidth() + config.margin.left + config.margin.right;\r\n const componentHeight = extendedSizeComponent.getHeight() + config.margin.top + config.margin.bottom;\r\n const scale = fitToWidth ? this.getFitWidthScale() : 1;\r\n const currentWidth = this.svg.attr('width');\r\n const currentHeight = this.svg.attr('height');\r\n const scaledWidth = componentWidth * scale;\r\n const scaledHeight = componentHeight * scale;\r\n const animated = currentWidth || currentHeight;\r\n smartTransition(this.svg, animated ? duration : 0)\r\n .attr('width', scaledWidth)\r\n .attr('height', scaledHeight)\r\n .attr('viewBox', `${0} ${0} ${componentWidth} ${fitToWidth ? scaledHeight : componentHeight}`)\r\n .attr('preserveAspectRatio', 'xMinYMin');\r\n }\r\n else {\r\n this.svg\r\n .attr('width', this.config.width || this.containerWidth)\r\n .attr('height', this.config.height || this.containerHeight);\r\n }\r\n // Set up Resize Observer\r\n if (!this._resizeObserver)\r\n this._setUpResizeObserver();\r\n // Schedule the actual rendering in the next frame\r\n cancelAnimationFrame(this._renderAnimationFrameId);\r\n this._renderAnimationFrameId = requestAnimationFrame(() => {\r\n this._preRender();\r\n this._render(duration);\r\n });\r\n }\r\n _onResize() {\r\n var _a;\r\n const { config } = this;\r\n super._onResize();\r\n (_a = config.tooltip) === null || _a === void 0 ? void 0 : _a.hide();\r\n }\r\n destroy() {\r\n var _a, _b;\r\n const { component, config } = this;\r\n super.destroy();\r\n component === null || component === void 0 ? void 0 : component.destroy();\r\n (_a = config.tooltip) === null || _a === void 0 ? void 0 : _a.destroy();\r\n (_b = config.annotations) === null || _b === void 0 ? void 0 : _b.destroy();\r\n }\r\n}\n\nexport { SingleContainer };\n//# sourceMappingURL=index.js.map\n","class CoreDataModel {\r\n constructor(data) {\r\n this.data = data;\r\n }\r\n get data() {\r\n return this._data;\r\n }\r\n set data(value) {\r\n this._data = value;\r\n }\r\n}\n\nexport { CoreDataModel };\n//# sourceMappingURL=core.js.map\n","var AxisType;\r\n(function (AxisType) {\r\n AxisType[\"X\"] = \"x\";\r\n AxisType[\"Y\"] = \"y\";\r\n})(AxisType || (AxisType = {}));\n\nexport { AxisType };\n//# sourceMappingURL=types.js.map\n","import { scaleLinear, scalePow, scaleSqrt, scaleLog, scaleSymlog, scaleIdentity, scaleTime, scaleUtc, scaleSequential, scaleDiverging, scaleQuantize, scaleQuantile, scaleThreshold, scaleOrdinal, scaleBand, scalePoint } from 'd3-scale';\n\nconst Scale = {\r\n scaleLinear,\r\n scalePow,\r\n scaleSqrt,\r\n scaleLog,\r\n scaleSymlog,\r\n scaleIdentity,\r\n scaleTime,\r\n scaleUtc,\r\n scaleSequential,\r\n scaleDiverging,\r\n scaleQuantize,\r\n scaleQuantile,\r\n scaleThreshold,\r\n scaleOrdinal,\r\n scaleBand,\r\n scalePoint,\r\n};\r\nvar ScaleDimension;\r\n(function (ScaleDimension) {\r\n ScaleDimension[\"X\"] = \"x\";\r\n ScaleDimension[\"Y\"] = \"y\";\r\n})(ScaleDimension || (ScaleDimension = {}));\n\nexport { Scale, ScaleDimension };\n//# sourceMappingURL=scale.js.map\n","var Direction;\r\n(function (Direction) {\r\n Direction[\"West\"] = \"west\";\r\n Direction[\"East\"] = \"east\";\r\n Direction[\"North\"] = \"north\";\r\n Direction[\"South\"] = \"south\";\r\n})(Direction || (Direction = {}));\n\nexport { Direction };\n//# sourceMappingURL=direction.js.map\n","import { ContainerDefaultConfig } from '../../core/container/config.js';\nimport { Direction } from '../../types/direction.js';\n\nconst XYContainerDefaultConfig = Object.assign(Object.assign({}, ContainerDefaultConfig), { components: [], tooltip: undefined, crosshair: undefined, annotations: undefined, xAxis: undefined, yAxis: undefined, autoMargin: true, xScale: undefined, xDomain: undefined, xDomainMinConstraint: undefined, xDomainMaxConstraint: undefined, xRange: undefined, yScale: undefined, yDomain: undefined, yDomainMinConstraint: undefined, yDomainMaxConstraint: undefined, yRange: undefined, yDirection: Direction.North, preventEmptyDomain: null, scaleByDomain: false, clipPathExtend: 2 });\n\nexport { XYContainerDefaultConfig };\n//# sourceMappingURL=config.js.map\n","import { css } from '@emotion/css';\nimport { extent, merge } from 'd3-array';\nimport '../../styles/index.js';\nimport { ContainerCore } from '../../core/container/index.js';\nimport { CoreDataModel } from '../../data-models/core.js';\nimport { AxisType } from '../../components/axis/types.js';\nimport { ScaleDimension } from '../../types/scale.js';\nimport { Direction } from '../../types/direction.js';\nimport { clamp, isEqual, clean, flatten } from '../../utils/data.js';\nimport { guid } from '../../utils/misc.js';\nimport { XYContainerDefaultConfig } from './config.js';\n\nclass XYContainer extends ContainerCore {\r\n constructor(element, config, data) {\r\n var _a, _b;\r\n super(element);\r\n this._defaultConfig = XYContainerDefaultConfig;\r\n this.datamodel = new CoreDataModel();\r\n this.config = this._defaultConfig;\r\n this._clipPathId = guid();\r\n this._axisMargin = { top: 0, bottom: 0, left: 0, right: 0 };\r\n this._firstRender = true;\r\n this._clipPath = this.svg.append('clipPath')\r\n .attr('id', this._clipPathId);\r\n this._clipPath.append('rect');\r\n // When the base tag is specified on the HTML head,\r\n // Safari fails to find the corresponding filter URL.\r\n // We have to provide tull url in order to fix that\r\n const highlightFilterId = 'saturate';\r\n const baseUrl = window.location.href.replace(window.location.hash, '');\r\n this.svg.attr('class', css `\n --highlight-filter-id: url(${baseUrl}#${highlightFilterId}); // defining a css variable\n `);\r\n this._svgDefs.append('filter')\r\n .attr('id', highlightFilterId)\r\n .attr('filterUnits', 'objectBoundingBox')\r\n .html('<feColorMatrix type=\"saturate\" in=\"SourceGraphic\" values=\"1.35\"/>');\r\n if (config) {\r\n this.updateContainer(config, true);\r\n }\r\n if (data) {\r\n this.setData(data, true);\r\n }\r\n // Render if there are axes or components with data\r\n if (this.config.xAxis ||\r\n this.config.yAxis ||\r\n ((_a = this.components) === null || _a === void 0 ? void 0 : _a.some(c => c.datamodel.data))) {\r\n this.render();\r\n }\r\n // Force re-render axes when fonts are loaded\r\n (_b = document.fonts) === null || _b === void 0 ? void 0 : _b.ready.then(() => {\r\n if (!this._firstRender)\r\n this._renderAxes(0);\r\n });\r\n }\r\n get components() {\r\n return this.config.components;\r\n }\r\n // Overriding ContainerCore default get width method to work with axis auto margin\r\n get width() {\r\n const margin = this._getMargin();\r\n return clamp(this.containerWidth - margin.left - margin.right, 0, Number.POSITIVE_INFINITY);\r\n }\r\n // Overriding ContainerCore default get height method to work with axis auto margin\r\n get height() {\r\n const margin = this._getMargin();\r\n return clamp(this.containerHeight - margin.top - margin.bottom, 0, Number.POSITIVE_INFINITY);\r\n }\r\n setData(data, preventRender) {\r\n var _a, _b, _c, _d, _e;\r\n const { components, config } = this;\r\n if (!data)\r\n return;\r\n this.datamodel.data = data;\r\n components.forEach((c) => {\r\n c.setData(data);\r\n });\r\n (_a = config.crosshair) === null || _a === void 0 ? void 0 : _a.setData(data);\r\n (_b = config.xAxis) === null || _b === void 0 ? void 0 : _b.setData(data);\r\n (_c = config.yAxis) === null || _c === void 0 ? void 0 : _c.setData(data);\r\n // Hide tooltip and crosshair if the data has changed\r\n // Important: We still want to do `setData` for the components above even if the data hasn't changed\r\n // because calling `updateContainer` may add new components and we need to pass them the data\r\n const hasDataUpdated = !isEqual(this.datamodel.data, data);\r\n if (hasDataUpdated) {\r\n (_d = config.tooltip) === null || _d === void 0 ? void 0 : _d.hide();\r\n (_e = config.crosshair) === null || _e === void 0 ? void 0 : _e.hide();\r\n }\r\n if (!preventRender)\r\n this.render();\r\n }\r\n updateContainer(containerConfig, preventRender) {\r\n super.updateContainer(containerConfig);\r\n this._removeAllChildren();\r\n // If there were any new components added we need to pass them data\r\n this.setData(this.datamodel.data, true);\r\n // Set up the axes\r\n if (containerConfig.xAxis) {\r\n this.config.xAxis.config.type = AxisType.X;\r\n this.element.appendChild(containerConfig.xAxis.element);\r\n }\r\n if (containerConfig.yAxis) {\r\n this.config.yAxis.config.type = AxisType.Y;\r\n this.element.appendChild(containerConfig.yAxis.element);\r\n }\r\n // Re-insert elements to the DOM\r\n for (const c of this.components) {\r\n this.element.appendChild(c.element);\r\n }\r\n // Set up the tooltip\r\n const tooltip = containerConfig.tooltip;\r\n if (tooltip) {\r\n if (!tooltip.hasContainer())\r\n tooltip.setContainer(this._container);\r\n tooltip.setComponents(this.components);\r\n }\r\n // Set up the crosshair\r\n const crosshair = containerConfig.crosshair;\r\n if (crosshair) {\r\n crosshair.setContainer(this.svg);\r\n crosshair.tooltip = tooltip;\r\n this.element.appendChild(crosshair.element);\r\n }\r\n // Set up annotations\r\n const annotations = containerConfig.annotations;\r\n if (annotations) {\r\n this.element.appendChild(annotations.element);\r\n }\r\n // Clipping path\r\n this.element.appendChild(this._clipPath.node());\r\n // Defs\r\n this.element.appendChild(this._svgDefs.node());\r\n this.element.appendChild(this._svgDefsExternal.node());\r\n // Rendering\r\n if (!preventRender)\r\n this.render();\r\n }\r\n updateComponents(componentConfigs, preventRender) {\r\n const { config } = this;\r\n this.components.forEach((c, i) => {\r\n const componentConfig = componentConfigs[i];\r\n if (componentConfig) {\r\n c.setConfig(componentConfigs[i]);\r\n }\r\n });\r\n this._updateScales(...this.components, config.xAxis, config.yAxis, config.crosshair);\r\n if (!preventRender)\r\n this.render();\r\n }\r\n update(containerConfig, componentConfigs, data) {\r\n if (data)\r\n this.datamodel.data = data; // Just updating the data model because the `updateContainer` method has the `setData` step inside\r\n if (containerConfig)\r\n this.updateContainer(containerConfig, true);\r\n if (componentConfigs)\r\n this.updateComponents(componentConfigs, true);\r\n this.render();\r\n }\r\n _preRender() {\r\n const { config } = this;\r\n super._preRender();\r\n // Calculate extra margin required to fit the axes\r\n if (config.autoMargin) {\r\n this._setAutoMargin();\r\n }\r\n // Pass size and margin to the components\r\n const components = clean([...this.components, config.xAxis, config.yAxis, config.crosshair, config.annotations]);\r\n const margin = this._getMargin();\r\n for (const c of components) {\r\n c.setSize(this.width, this.height, this.containerWidth, this.containerHeight);\r\n c.setContainerMargin(margin);\r\n }\r\n // Update Scales of all the components at once to calculate required paddings and sync them\r\n this._updateScales(...this.components, config.xAxis, config.yAxis, config.crosshair);\r\n }\r\n _render(customDuration) {\r\n var _a, _b, _c, _d, _e, _f;\r\n const { config } = this;\r\n super._render();\r\n // Get chart total margin after auto margin calculations\r\n const margin = this._getMargin();\r\n // Render components\r\n for (const c of this.components) {\r\n c.g.attr('transform', `translate(${margin.left},${margin.top})`)\r\n .style('clip-path', c.clippable ? `url(#${this._clipPathId})` : null)\r\n .style('-webkit-clip-path', c.clippable ? `url(#${this._clipPathId})` : null);\r\n c.render(customDuration);\r\n }\r\n this._renderAxes(this._firstRender ? 0 : customDuration);\r\n // Clip Rect\r\n // Extending the clipping path to allow small overflow (e.g. Line will looks better that way when it touches the edges)\r\n const clipPathExtension = config.clipPathExtend;\r\n this._clipPath.select('rect')\r\n .attr('x', -clipPathExtension)\r\n .attr('y', -clipPathExtension)\r\n .attr('width', this.width + 2 * clipPathExtension)\r\n .attr('height', this.height + 2 * clipPathExtension);\r\n // Tooltip\r\n (_a = config.tooltip) === null || _a === void 0 ? void 0 : _a.update(); // Re-bind events\r\n // Crosshair\r\n const crosshair = config.crosshair;\r\n if (crosshair) {\r\n // Pass accessors\r\n const yAccessors = this.components.filter(c => !c.stacked).map(c => c.config.y);\r\n const yStackedAccessors = this.components.filter(c => c.stacked).map(c => c.config.y);\r\n const baselineComponentConfig = (_b = this.components.find(c => c.config.baseline)) === null || _b === void 0 ? void 0 : _b.config;\r\n const baselineAccessor = baselineComponentConfig === null || baselineComponentConfig === void 0 ? void 0 : baselineComponentConfig.baseline;\r\n // Setting up fallback accessors for the crosshair to be used if they are not configured explicitly\r\n crosshair.accessors = {\r\n x: (_c = this.components[0]) === null || _c === void 0 ? void 0 : _c.config.x,\r\n y: flatten(yAccessors),\r\n yStacked: flatten(yStackedAccessors),\r\n baseline: baselineAccessor,\r\n };\r\n crosshair.g.attr('transform', `translate(${margin.left},${margin.top})`)\r\n .style('clip-path', `url(#${this._clipPathId})`)\r\n .style('-webkit-clip-path', `url(#${this._clipPathId})`);\r\n crosshair.render();\r\n }\r\n (_d = config.annotations) === null || _d === void 0 ? void 0 : _d.g.attr('transform', `translate(${margin.left},${margin.top})`);\r\n (_e = config.annotations) === null || _e === void 0 ? void 0 : _e.render();\r\n this._firstRender = false;\r\n (_f = config.onRenderComplete) === null || _f === void 0 ? void 0 : _f.call(config, this.svg.node(), margin, this._getBleed(this.components), this.containerWidth, this.containerHeight, this.width, this.height);\r\n }\r\n _updateScales(...components) {\r\n const c = clean(components || this.components);\r\n this._setScales(...c);\r\n this._updateScalesDomain(...c);\r\n this._updateScalesRange(...c);\r\n }\r\n _setScales(...components) {\r\n const { config } = this;\r\n if (!components)\r\n return;\r\n // Set the X and Y scales\r\n if (config.xScale)\r\n components.forEach(c => c.setScale(ScaleDimension.X, config.xScale));\r\n if (config.yScale)\r\n components.forEach(c => c.setScale(ScaleDimension.Y, config.yScale));\r\n }\r\n _updateScalesDomain(...components) {\r\n const { config } = this;\r\n if (!components)\r\n return;\r\n const componentsWithDomain = components.filter(c => !c.config.excludeFromDomainCalculation);\r\n // Loop over all the dimensions\r\n Object.values(ScaleDimension).forEach((dimension) => {\r\n var _a, _b, _c, _d, _e, _f, _g, _h;\r\n const [min, max] = extent(merge(componentsWithDomain.map(c => c.getDataExtent(dimension, config.scaleByDomain)))); // Components with undefined dimension accessors will return [undefined, undefined] but d3.extent will take care of that\r\n const configuredDomain = dimension === ScaleDimension.Y ? config.yDomain : config.xDomain;\r\n const configuredDomainMinConstraint = dimension === ScaleDimension.Y ? config.yDomainMinConstraint : config.xDomainMinConstraint;\r\n const configuredDomainMaxConstraint = dimension === ScaleDimension.Y ? config.yDomainMaxConstraint : config.xDomainMaxConstraint;\r\n const domainMin = (_b = (_a = configuredDomain === null || configuredDomain === void 0 ? void 0 : configuredDomain[0]) !== null && _a !== void 0 ? _a : min) !== null && _b !== void 0 ? _b : 0;\r\n const domainMax = (_d = (_c = configuredDomain === null || configuredDomain === void 0 ? void 0 : configuredDomain[1]) !== null && _c !== void 0 ? _c : max) !== null && _d !== void 0 ? _d : 1;\r\n const domain = [\r\n clamp(domainMin, (_e = configuredDomainMinConstraint === null || configuredDomainMinConstraint === void 0 ? void 0 : configuredDomainMinConstraint[0]) !== null && _e !== void 0 ? _e : Number.NEGATIVE_INFINITY, (_f = configuredDomainMinConstraint === null || configuredDomainMinConstraint === void 0 ? void 0 : configuredDomainMinConstraint[1]) !== null && _f !== void 0 ? _f : Number.POSITIVE_INFINITY),\r\n clamp(domainMax, (_g = configuredDomainMaxConstraint === null || configuredDomainMaxConstraint === void 0 ? void 0 : configuredDomainMaxConstraint[0]) !== null && _g !== void 0 ? _g : Number.NEGATIVE_INFINITY, (_h = configuredDomainMaxConstraint === null || configuredDomainMaxConstraint === void 0 ? void 0 : configuredDomainMaxConstraint[1]) !== null && _h !== void 0 ? _h : Number.POSITIVE_INFINITY),\r\n ];\r\n // Extend the X and Y domains if they're empty and `preventEmptyDomain` was explicitly set to `true`\r\n // or just the X domain if there is no data provided and `preventEmptyDomain` set to `null`\r\n if (domain[0] === domain[1]) {\r\n const hasDataProvided = componentsWithDomain.some(c => { var _a; return ((_a = c.datamodel.data) === null || _a === void 0 ? void 0 : _a.length) > 0; });\r\n if (config.preventEmptyDomain || (config.preventEmptyDomain === null && (!hasDataProvided || dimension === ScaleDimension.Y))) {\r\n domain[1] = domain[0] + 1;\r\n }\r\n }\r\n components.forEach(c => c.setScaleDomain(dimension, domain));\r\n });\r\n }\r\n _updateScalesRange(...components) {\r\n var _a, _b, _c, _d, _e, _f;\r\n const { config } = this;\r\n if (!components)\r\n return;\r\n // Set initial scale range\r\n const isYDirectionSouth = config.yDirection === Direction.South;\r\n const xRange = [(_a = config.padding.left) !== null && _a !== void 0 ? _a : 0, this.width - ((_b = config.padding.right) !== null && _b !== void 0 ? _b : 0)];\r\n const yRange = [this.height - ((_c = config.padding.bottom) !== null && _c !== void 0 ? _c : 0), (_d = config.padding.top) !== null && _d !== void 0 ? _d : 0];\r\n if (isYDirectionSouth)\r\n yRange.reverse();\r\n for (const c of components) {\r\n c.setSize(this.width, this.height, this.containerWidth, this.containerHeight);\r\n c.setScaleRange(ScaleDimension.X, (_e = config.xRange) !== null && _e !== void 0 ? _e : xRange);\r\n c.setScaleRange(ScaleDimension.Y, (_f = config.yRange) !== null && _f !== void 0 ? _f : yRange);\r\n }\r\n // Get and combine bleed\r\n const bleed = this._getBleed(components);\r\n // Update scale range\r\n for (const c of components) {\r\n c.setScaleRange(ScaleDimension.X, [xRange[0] + bleed.left, xRange[1] - bleed.right]);\r\n c.setScaleRange(ScaleDimension.Y, isYDirectionSouth\r\n ? [yRange[0] + bleed.top, yRange[1] - bleed.bottom] // if Y axis is directed downwards\r\n : [yRange[0] - bleed.bottom, yRange[1] + bleed.top] // if Y axis is directed upwards\r\n );\r\n }\r\n }\r\n _renderAxes(duration) {\r\n const { config: { xAxis, yAxis } } = this;\r\n const margin = this._getMargin();\r\n const axes = clean([xAxis, yAxis]);\r\n axes.forEach(axis => {\r\n const offset = axis.getOffset(margin);\r\n axis.g.attr('transform', `translate(${offset.left},${offset.top})`);\r\n axis.render(duration);\r\n });\r\n }\r\n _setAutoMargin() {\r\n const { config: { xAxis, yAxis } } = this;\r\n // At first we need to set the domain to the scales\r\n const components = clean([...this.components, xAxis, yAxis]);\r\n this._setScales(...components);\r\n this._updateScalesDomain(...components);\r\n // Calculate margin required by the axes\r\n // We do two iterations on the first render, because the amount and size of ticks can change\r\n // after new margin are calculated and applied (axes dimensions will change).\r\n // That's needed for correct label placement.\r\n const numIterations = this._firstRender ? 2 : 1;\r\n for (let i = 0; i < numIterations; i += 1) {\r\n const axisMargin = { top: 0, bottom: 0, left: 0, right: 0 };\r\n this._updateScalesRange(...components);\r\n const axes = clean([xAxis, yAxis]);\r\n axes.forEach(axis => {\r\n axis.preRender();\r\n const m = axis.getRequiredMargin();\r\n if (axisMargin.top < m.top)\r\n axisMargin.top = m.top;\r\n if (axisMargin.bottom < m.bottom)\r\n axisMargin.bottom = m.bottom;\r\n if (axisMargin.left < m.left)\r\n axisMargin.left = m.left;\r\n if (axisMargin.right < m.right)\r\n axisMargin.right = m.right;\r\n });\r\n this._axisMargin = axisMargin;\r\n }\r\n }\r\n _getMargin() {\r\n const { config: { margin } } = this;\r\n return {\r\n top: margin.top + this._axisMargin.top,\r\n bottom: margin.bottom + this._axisMargin.bottom,\r\n left: margin.left + this._axisMargin.left,\r\n right: margin.right + this._axisMargin.right,\r\n };\r\n }\r\n _getBleed(components) {\r\n return components.map(c => c.bleed).reduce((bleed, b) => {\r\n for (const key of Object.keys(bleed)) {\r\n const k = key;\r\n if (bleed[k] < b[k])\r\n bleed[k] = b[k];\r\n }\r\n return bleed;\r\n }, { top: 0, bottom: 0, left: 0, right: 0 });\r\n }\r\n destroy() {\r\n const { components, config: { tooltip, crosshair, annotations, xAxis, yAxis } } = this;\r\n super.destroy();\r\n for (const c of components)\r\n c === null || c === void 0 ? void 0 : c.destroy();\r\n tooltip === null || tooltip === void 0 ? void 0 : tooltip.destroy();\r\n crosshair === null || crosshair === void 0 ? void 0 : crosshair.destroy();\r\n annotations === null || annotations === void 0 ? void 0 : annotations.destroy();\r\n xAxis === null || xAxis === void 0 ? void 0 : xAxis.destroy();\r\n yAxis === null || yAxis === void 0 ? void 0 : yAxis.destroy();\r\n }\r\n}\n\nexport { XYContainer };\n//# sourceMappingURL=index.js.map\n","const ComponentDefaultConfig = {\r\n duration: 600,\r\n events: {},\r\n attributes: {},\r\n};\n\nexport { ComponentDefaultConfig };\n//# sourceMappingURL=config.js.map\n","import { select } from 'd3-selection';\nimport { CoreDataModel } from '../../data-models/core.js';\nimport { throttle, merge } from '../../utils/data.js';\nimport { guid } from '../../utils/misc.js';\nimport { ComponentType, Sizing } from '../../types/component.js';\nimport { ComponentDefaultConfig } from './config.js';\n\nclass ComponentCore {\r\n constructor(type = ComponentType.SVG) {\r\n var _a, _b;\r\n this.type = ComponentType.SVG;\r\n this.datamodel = new CoreDataModel();\r\n this.sizing = Sizing.Fit; // Supported by SingleContainer and a subset of components only (Sankey)\r\n this.events = {};\r\n /** Default configuration */\r\n this._defaultConfig = ComponentDefaultConfig;\r\n /** Component width in pixels. This property is set automatically by the container. */\r\n this._width = 400;\r\n /** Component height in pixels. This property is set automatically by the container. */\r\n this._height = 200;\r\n /** Container width in pixels. This property is set automatically by the container. */\r\n this._containerWidth = undefined;\r\n /** Container height in pixels. This property is set automatically by the container. */\r\n this._containerHeight = undefined;\r\n /** Container margin in pixels. This property is set automatically by the container. */\r\n this._containerMargin = { top: 0, bottom: 0, left: 0, right: 0 };\r\n this._setUpComponentEventsThrottled = throttle(this._setUpComponentEvents, 500);\r\n this._setCustomAttributesThrottled = throttle(this._setCustomAttributes, 500);\r\n if (type === ComponentType.SVG) {\r\n this.element = document.createElementNS('http://www.w3.org/2000/svg', 'g');\r\n }\r\n else {\r\n this.element = document.createElement('div');\r\n }\r\n this.uid = guid();\r\n this.g = select(this.element);\r\n // Setting the root class if available\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n // eslint-disable-next-line dot-notation\r\n const rootClass = (_b = (_a = this.constructor) === null || _a === void 0 ? void 0 : _a['selectors']) === null || _b === void 0 ? void 0 : _b.root;\r\n if (rootClass)\r\n this.g.attr('class', rootClass);\r\n }\r\n /** Set the container margin. Called automatically by containers. */\r\n setContainerMargin(margin) {\r\n this._containerMargin = margin;\r\n }\r\n setConfig(config) {\r\n this.prevConfig = this.config; // Store the previous config instance\r\n this.config = merge(this._defaultConfig, config);\r\n }\r\n setData(data) {\r\n this.datamodel.data = data;\r\n }\r\n setSize(width, height, containerWidth, containerHeight) {\r\n if (isFinite(width))\r\n this._width = width;\r\n if (isFinite(height))\r\n this._height = height;\r\n if (isFinite(containerWidth))\r\n this._containerWidth = containerWidth;\r\n if (isFinite(containerHeight))\r\n this._containerHeight = containerHeight;\r\n }\r\n render(duration = this.config.duration) {\r\n this._render(duration);\r\n // While transition is in progress, we add the 'animating' attribute to the component's SVG group\r\n const ANIMATING_ATTR = 'animating';\r\n if (duration) {\r\n this.g.attr(ANIMATING_ATTR, '');\r\n const transition = this.g\r\n .transition(ANIMATING_ATTR)\r\n .duration(duration);\r\n transition.on('end interrupt', () => {\r\n this.g.attr(ANIMATING_ATTR, null);\r\n });\r\n }\r\n this._setUpComponentEventsThrottled();\r\n this._setCustomAttributesThrottled();\r\n }\r\n get bleed() {\r\n return { top: 0, bottom: 0, left: 0, right: 0 };\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n _render(duration = this.config.duration) {\r\n }\r\n _setCustomAttributes() {\r\n const attributeMap = this.config.attributes;\r\n Object.keys(attributeMap).forEach(className => {\r\n Object.keys(attributeMap[className]).forEach(attr => {\r\n const selection = this.g\r\n .selectAll(`.${className}`);\r\n selection.attr(attr, attributeMap[className][attr]);\r\n });\r\n });\r\n }\r\n _setUpComponentEvents() {\r\n // Set up default events\r\n this._bindEvents(this.events);\r\n // Set up user-defined events\r\n this._bindEvents(this.config.events, '.user');\r\n }\r\n _bindEvents(events = this.events, suffix = '') {\r\n Object.keys(events).forEach(className => {\r\n Object.keys(events[className]).forEach(eventType => {\r\n const selection = this.g\r\n .selectAll(`.${className}`);\r\n selection.on(eventType + suffix, (event, d) => {\r\n const els = selection.nodes();\r\n const i = els.indexOf(event.currentTarget);\r\n const eventFunction = events[className][eventType];\r\n return eventFunction === null || eventFunction === void 0 ? void 0 : eventFunction(d, event, i, els);\r\n });\r\n });\r\n });\r\n }\r\n destroy() {\r\n var _a;\r\n (_a = this.g) === null || _a === void 0 ? void 0 : _a.remove();\r\n this.element = undefined;\r\n }\r\n isDestroyed() {\r\n return !this.element;\r\n }\r\n}\n\nexport { ComponentCore };\n//# sourceMappingURL=index.js.map\n","import { CoreDataModel } from './core.js';\n\n// Core\r\nclass SeriesDataModel extends CoreDataModel {\r\n constructor(data) {\r\n super(data);\r\n }\r\n get data() {\r\n var _a;\r\n return (_a = this._data) !== null && _a !== void 0 ? _a : [];\r\n }\r\n set data(data) {\r\n if (Array.isArray(data))\r\n this._data = data;\r\n }\r\n}\n\nexport { SeriesDataModel };\n//# sourceMappingURL=series.js.map\n","import { ComponentDefaultConfig } from '../component/config.js';\n\n// Config\r\nconst XYComponentDefaultConfig = Object.assign(Object.assign({}, ComponentDefaultConfig), { x: undefined, y: undefined, id: (d, i) => { var _a; return (_a = d.id) !== null && _a !== void 0 ? _a : `${i}`; }, color: (d) => d.color, xScale: undefined, yScale: undefined, excludeFromDomainCalculation: false });\n\nexport { XYComponentDefaultConfig };\n//# sourceMappingURL=config.js.map\n","import { ComponentCore } from '../component/index.js';\nimport { SeriesDataModel } from '../../data-models/series.js';\nimport { getExtent, filterDataByRange, isArray } from '../../utils/data.js';\nimport { Scale, ScaleDimension } from '../../types/scale.js';\nimport { XYComponentDefaultConfig } from './config.js';\n\n// Core\r\nclass XYComponentCore extends ComponentCore {\r\n constructor() {\r\n super(...arguments);\r\n this.datamodel = new SeriesDataModel();\r\n /** Clippable components can be affected by a clipping path (set up in the container) */\r\n this.clippable = true;\r\n /** Identifies whether the component displayed stacked data (eg StackedBar, Area) */\r\n this.stacked = false;\r\n this._defaultConfig = XYComponentDefaultConfig;\r\n this._xScale = Scale.scaleLinear();\r\n this._yScale = Scale.scaleLinear();\r\n }\r\n get xScale() {\r\n return this.config.xScale || this._xScale;\r\n }\r\n get yScale() {\r\n return this.config.yScale || this._yScale;\r\n }\r\n setConfig(config) {\r\n var _a, _b;\r\n // We don't allow changing scales after the component has been initialized\r\n if ((_a = this.config) === null || _a === void 0 ? void 0 : _a.xScale)\r\n config.xScale = this.config.xScale;\r\n if ((_b = this.config) === null || _b === void 0 ? void 0 : _b.yScale)\r\n config.yScale = this.config.yScale;\r\n super.setConfig(config);\r\n }\r\n setScaleDomain(dimension, domain) {\r\n var _a, _b;\r\n if (dimension === ScaleDimension.X)\r\n (_a = this._xScale) === null || _a === void 0 ? void 0 : _a.domain(domain);\r\n if (dimension === ScaleDimension.Y)\r\n (_b = this._yScale) === null || _b === void 0 ? void 0 : _b.domain(domain);\r\n }\r\n setScaleRange(dimension, range) {\r\n var _a, _b;\r\n if (dimension === ScaleDimension.X)\r\n (_a = this._xScale) === null || _a === void 0 ? void 0 : _a.range(range);\r\n if (dimension === ScaleDimension.Y)\r\n (_b = this._yScale) === null || _b === void 0 ? void 0 : _b.range(range);\r\n }\r\n setScale(dimension, scale) {\r\n if (scale && (dimension === ScaleDimension.X))\r\n this._xScale = scale;\r\n if (scale && (dimension === ScaleDimension.Y))\r\n this._yScale = scale;\r\n }\r\n getDataExtent(dimension, scaleByVisibleData) {\r\n const { config, datamodel } = this;\r\n switch (dimension) {\r\n case ScaleDimension.X: return this.getXDataExtent();\r\n case ScaleDimension.Y: return this.getYDataExtent(scaleByVisibleData);\r\n default: return getExtent(datamodel.data, config[dimension]);\r\n }\r\n }\r\n getXDataExtent() {\r\n const { config, datamodel } = this;\r\n return getExtent(datamodel.data, config.x);\r\n }\r\n /** Some components override this method to provide custom data extent calculation */\r\n getYDataExtent(scaleByVisibleData) {\r\n const { config, datamodel } = this;\r\n const xDomain = this.xScale.domain();\r\n const data = scaleByVisibleData ? filterDataByRange(datamodel.data, xDomain, config.x, true) : datamodel.data;\r\n const yAccessors = (isArray(config.y) ? config.y : [config.y]);\r\n return getExtent(data, ...yAccessors);\r\n }\r\n}\n\nexport { XYComponentCore };\n//# sourceMappingURL=index.js.map\n","var Position;\r\n(function (Position) {\r\n Position[\"Top\"] = \"top\";\r\n Position[\"Bottom\"] = \"bottom\";\r\n Position[\"Left\"] = \"left\";\r\n Position[\"Right\"] = \"right\";\r\n Position[\"Center\"] = \"center\";\r\n Position[\"Auto\"] = \"auto\";\r\n})(Position || (Position = {}));\r\nvar PositionStrategy;\r\n(function (PositionStrategy) {\r\n PositionStrategy[\"Absolute\"] = \"absolute\";\r\n PositionStrategy[\"Fixed\"] = \"fixed\";\r\n})(PositionStrategy || (PositionStrategy = {}));\r\nvar Arrangement;\r\n(function (Arrangement) {\r\n Arrangement[\"Inside\"] = \"inside\";\r\n Arrangement[\"Outside\"] = \"outside\";\r\n Arrangement[\"Center\"] = \"center\";\r\n})(Arrangement || (Arrangement = {}));\r\nvar Orientation;\r\n(function (Orientation) {\r\n Orientation[\"Horizontal\"] = \"horizontal\";\r\n Orientation[\"Vertical\"] = \"vertical\";\r\n})(Orientation || (Orientation = {}));\n\nexport { Arrangement, Orientation, Position, PositionStrategy };\n//# sourceMappingURL=position.js.map\n","import { Position } from '../../types/position.js';\n\n// Types\r\nconst TooltipDefaultConfig = {\r\n components: [],\r\n container: undefined,\r\n followCursor: true,\r\n allowHover: false,\r\n horizontalPlacement: Position.Auto,\r\n horizontalShift: 0,\r\n verticalPlacement: Position.Top,\r\n verticalShift: 0,\r\n attributes: {},\r\n triggers: {},\r\n className: undefined,\r\n showDelay: undefined,\r\n hideDelay: undefined,\r\n};\n\nexport { TooltipDefaultConfig };\n//# sourceMappingURL=config.js.map\n","import { css, injectGlobal } from '@emotion/css';\n\nconst root = css `\n label: tooltip;\n display: inline-block;\n left: 0;\n bottom: 0;\n min-width: max-content;\n position: absolute;\n opacity: 0;\n transition: opacity;\n transition-duration: var(--vis-tooltip-transition-duration);\n z-index: 999999;\n padding: var(--vis-tooltip-padding);\n color: var(--vis-tooltip-text-color);\n border-radius: var(--vis-tooltip-border-radius);\n box-shadow: var(--vis-tooltip-box-shadow);\n border: solid 1px var(--vis-tooltip-border-color);\n background-color: var(--vis-tooltip-background-color);\n backdrop-filter: var(--vis-tooltip-backdrop-filter);\n`;\r\n/**\r\n * @deprecated This selector is deprecated and will be removed in future versions. Use `root` instead.\r\n */\r\nconst tooltip = root;\r\nconst variables = injectGlobal `\n :root {\n --vis-tooltip-background-color: rgba(255, 255, 255, 0.95);\n --vis-tooltip-border-color: #e5e9f7;\n --vis-tooltip-text-color: #000;\n --vis-tooltip-shadow-color: rgba(172, 179, 184, 0.35);\n --vis-tooltip-backdrop-filter: none;\n --vis-tooltip-padding: 10px 15px;\n --vis-tooltip-border-radius: 5px;\n --vis-tooltip-transition-duration: 300ms;\n --vis-tooltip-box-shadow: none;\n\n --vis-dark-tooltip-background-color: rgba(30,30,30, 0.95);\n --vis-dark-tooltip-text-color: #e5e9f7;\n --vis-dark-tooltip-border-color: var(--vis-color-grey);\n --vis-dark-tooltip-shadow-color: rgba(0,0,0, 0.95);\n }\n\n body.theme-dark ${`.${root}`} {\n --vis-tooltip-background-color: var(--vis-dark-tooltip-background-color);\n --vis-tooltip-text-color: var(--vis-dark-tooltip-text-color);\n --vis-tooltip-border-color: var(--vis-dark-tooltip-border-color);\n --vis-tooltip-shadow-color: var(--vis-dark-tooltip-shadow-color);\n }\n\n body.theme-dark {\n --vis-tooltip-background-color: rgba(30,30,30, 0.95);\n --vis-tooltip-text-color: #e5e9f7;\n --vis-tooltip-border-color: var(--vis-color-grey);\n --vis-tooltip-shadow-color: rgba(0,0,0, 0.95);\n }\n`;\r\nconst positionFixed = css `\n bottom: unset;\n position: fixed;\n`;\r\nconst show = css `\n opacity: 1;\n`;\r\nconst hidden = css `\n display: none;\n`;\r\nconst nonInteractive = css `\n label: non-interactive;\n pointer-events: none;\n user-select: none;\n`;\n\nexport { hidden, nonInteractive, positionFixed, root, show, tooltip, variables };\n//# sourceMappingURL=style.js.map\n","import { select, pointer } from 'd3-selection';\nimport { Position } from '../../types/position.js';\nimport { throttle, merge } from '../../utils/data.js';\nimport { TooltipDefaultConfig } from './config.js';\nimport * as style from './style.js';\nimport { root, show, hidden, nonInteractive, positionFixed } from './style.js';\n\nclass Tooltip {\r\n constructor(config = {}) {\r\n this._defaultConfig = TooltipDefaultConfig;\r\n this.config = this._defaultConfig;\r\n this._setUpEventsThrottled = throttle(this._setUpEvents, 500);\r\n this._setContainerPositionThrottled = throttle(this._setContainerPosition, 500);\r\n this._isShown = false;\r\n this.element = document.createElement('div');\r\n this.div = select(this.element)\r\n .attr('class', root)\r\n .classed(show, false)\r\n .classed(hidden, true);\r\n this.setConfig(config);\r\n this.components = this.config.components;\r\n // Set up MutationObserver to automatically re-position the tooltip\r\n // if the content has been dynamically changed\r\n this._mutationObserver = new MutationObserver(() => {\r\n if (!this._isShown)\r\n return;\r\n // Handle changes to the content of this.div\r\n // Add your logic here\r\n if (!this.config.followCursor && this._hoveredElement) {\r\n this.placeByElement(this._hoveredElement);\r\n }\r\n else if (this._position) {\r\n this.place({ x: this._position[0], y: this._position[1] });\r\n }\r\n });\r\n this._mutationObserver.observe(this.div.node(), { childList: true, subtree: true });\r\n }\r\n setConfig(config) {\r\n var _a;\r\n this.prevConfig = this.config;\r\n this.config = merge(this._defaultConfig, config);\r\n // Reset `this._overriddenHorizontalPlacement` if the `horizontalPlacement` has changed\r\n if (this.prevConfig.horizontalPlacement !== this.config.horizontalPlacement) {\r\n this.overrideHorizontalPlacement(undefined);\r\n }\r\n if (this.config.container && (this.config.container !== ((_a = this.prevConfig) === null || _a === void 0 ? void 0 : _a.container))) {\r\n this.setContainer(this.config.container);\r\n }\r\n this._setUpAttributes();\r\n }\r\n setContainer(container) {\r\n var _a;\r\n (_a = this.element.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(this.element);\r\n this._container = container;\r\n this._container.appendChild(this.element);\r\n this._setContainerPositionThrottled();\r\n }\r\n getContainer() {\r\n return this._container;\r\n }\r\n hasContainer() {\r\n return !!this._container && this._container.isConnected;\r\n }\r\n setComponents(components) {\r\n this.components = components;\r\n }\r\n update() {\r\n if (!this._container)\r\n return;\r\n this._setUpEventsThrottled();\r\n }\r\n /** Show the tooltip immediately by providing content and position */\r\n show(html, pos) {\r\n this.render(html);\r\n this.place(pos);\r\n }\r\n _hide() {\r\n this.div\r\n .classed(show, false) // The `show` class triggers the opacity transition\r\n .on('transitionend', () => {\r\n // We hide the element once the transition completes\r\n // This ensures container overflow will not occur when the window is resized\r\n this.div.classed(hidden, !this._isShown);\r\n });\r\n this._isShown = false;\r\n }\r\n /** Hides the tooltip after `hideDelay` */\r\n hide() {\r\n window.clearTimeout(this._showDelayTimeoutId);\r\n if (this.config.hideDelay) {\r\n window.clearTimeout(this._hideDelayTimeoutId);\r\n this._hideDelayTimeoutId = setTimeout(() => this._hide(), this.config.hideDelay);\r\n }\r\n else {\r\n this._hide();\r\n }\r\n }\r\n _display() {\r\n window.clearTimeout(this._hideDelayTimeoutId);\r\n this.div\r\n .classed(hidden, false) // The `hidden` class sets `display: none;`\r\n .classed(show, true); // The `show` class triggers the opacity transition\r\n this._isShown = true;\r\n }\r\n /** Simply display the tooltip with its previous content on position, taking into account `showDelay` */\r\n display() {\r\n if (this._isShown)\r\n return;\r\n if (this.config.showDelay) {\r\n window.clearTimeout(this._showDelayTimeoutId);\r\n this._showDelayTimeoutId = setTimeout(() => {\r\n this._display();\r\n this.place({ x: this._position[0], y: this._position[1] });\r\n }, this.config.showDelay);\r\n }\r\n else {\r\n this._display();\r\n }\r\n }\r\n place(pos) {\r\n this._position = [pos.x, pos.y];\r\n if (!this.hasContainer()) {\r\n console.warn('Unovis | Tooltip: Container was not set or is not initialized yet');\r\n return;\r\n }\r\n const { config } = this;\r\n const tooltipWidth = this.element.offsetWidth;\r\n const tooltipHeight = this.element.offsetHeight;\r\n const horizontalPlacement = this._overriddenHorizontalPlacement ||\r\n (config.horizontalPlacement === Position.Auto\r\n ? Position.Center\r\n : config.horizontalPlacement);\r\n const verticalPlacement = config.verticalPlacement === Position.Auto\r\n ? ((pos.y - tooltipHeight) < 0 ? Position.Bottom : Position.Top)\r\n : config.verticalPlacement;\r\n // Todo: Get rid of the hardcoded margin in version 2.0\r\n // Can be simply replaced with `verticalShift` and `horizontalShift`\r\n // but it'll be a breaking change\r\n const margin = 5;\r\n const translateX = horizontalPlacement === Position.Left ? -tooltipWidth - margin - config.horizontalShift\r\n : horizontalPlacement === Position.Center ? -tooltipWidth / 2\r\n : margin + config.horizontalShift;\r\n const translateY = verticalPlacement === Position.Bottom ? margin + config.verticalShift\r\n : verticalPlacement === Position.Center ? -tooltipHeight / 2\r\n : -margin - config.verticalShift - tooltipHeight;\r\n // translateX and translateY variables shift the tooltip from the default position (above the cursor, centred horizontally)\r\n const [top, left] = this._constraintPosToContainer(pos.x + translateX, pos.y + translateY, tooltipWidth, tooltipHeight);\r\n this._applyPosition(top, left, tooltipHeight);\r\n }\r\n placeByElement(hoveredElement) {\r\n const { config } = this;\r\n // Store the hovered element and the event for future reference,\r\n // i.e. to re-position the tooltip if the content has been changed\r\n // by something else and it was captured by the MutationObserver\r\n this._hoveredElement = hoveredElement;\r\n // Todo: Get rid of the hardcoded margin in version 2.0\r\n // Can be simply replaced with `verticalShift` and `horizontalShift`\r\n // but it'll be a breaking change\r\n const margin = 5;\r\n const tooltipWidth = this.element.offsetWidth;\r\n const tooltipHeight = this.element.offsetHeight;\r\n const isContainerBody = this.isContainerBody();\r\n const containerWidth = isContainerBody ? window.innerWidth : this._container.scrollWidth;\r\n const hoveredElementRect = hoveredElement.getBoundingClientRect();\r\n // We use D3's point transformation to get the correct position of the element by pretending it's a pointer event\r\n // See more: https://github.com/d3/d3-selection/blob/main/src/pointer.js\r\n const elementPos = isContainerBody ? [hoveredElementRect.x, hoveredElementRect.y] : pointer({\r\n clientX: hoveredElementRect.x,\r\n clientY: hoveredElementRect.y,\r\n pageX: hoveredElementRect.x,\r\n pageY: hoveredElementRect.y,\r\n }, this._container);\r\n const horizontalPlacement = this._overriddenHorizontalPlacement || (config.horizontalPlacement === Position.Auto\r\n ? (elementPos[0] - tooltipWidth < 0 ? Position.Right\r\n : elementPos[0] + tooltipWidth > containerWidth ? Position.Left : Position.Center)\r\n : config.horizontalPlacement);\r\n let translateX = 0;\r\n switch (horizontalPlacement) {\r\n case Position.Left:\r\n translateX = -tooltipWidth - margin - config.horizontalShift;\r\n break;\r\n case Position.Right:\r\n translateX = hoveredElementRect.width + margin + config.horizontalShift;\r\n break;\r\n case Position.Center:\r\n default:\r\n translateX = (-tooltipWidth + hoveredElementRect.width) / 2;\r\n break;\r\n }\r\n const verticalPlacement = config.verticalPlacement === Position.Auto\r\n ? (horizontalPlacement !== Position.Center ? Position.Center\r\n : elementPos[1] - tooltipHeight < 0 ? Position.Bottom : Position.Top)\r\n : config.verticalPlacement;\r\n let translateY = -tooltipHeight;\r\n switch (verticalPlacement) {\r\n case Position.Center:\r\n translateY += (tooltipHeight + hoveredElementRect.height) / 2;\r\n break;\r\n case Position.Bottom:\r\n translateY += tooltipHeight + hoveredElementRect.height + margin + config.verticalShift;\r\n break;\r\n case Position.Top:\r\n default:\r\n translateY += -margin - config.verticalShift;\r\n break;\r\n }\r\n const [top, left] = this._constraintPosToContainer(elementPos[0] + translateX, elementPos[1] + translateY, tooltipWidth, tooltipHeight);\r\n this._applyPosition(top, left, tooltipHeight);\r\n }\r\n isContainerBody() {\r\n return this._container === document.body;\r\n }\r\n /** Allows to override the horizontal placement of the tooltip which is useful when you want to define custom positioning behavior.\r\n * This method has been added for Crosshair to allow it position tooltip left or right of the crosshair line\r\n * (see the `_showTooltip` method of the Crosshair component).\r\n */\r\n overrideHorizontalPlacement(placement) {\r\n this._overriddenHorizontalPlacement = placement;\r\n }\r\n render(html) {\r\n var _a;\r\n const { config, prevConfig } = this;\r\n if (html instanceof HTMLElement) {\r\n const node = this.div.select(':first-child').node();\r\n if (node !== html)\r\n this.div.html('').append(() => html);\r\n }\r\n else if (html !== null) {\r\n this.div.html(html || '');\r\n }\r\n this.div\r\n .classed((_a = config.className) !== null && _a !== void 0 ? _a : '', Boolean(config.className))\r\n .classed(nonInteractive, !config.allowHover);\r\n // Remove the previous class name if it was set\r\n if ((prevConfig === null || prevConfig === void 0 ? void 0 : prevConfig.className) && prevConfig.className !== config.className) {\r\n this.div.classed(prevConfig.className, false);\r\n }\r\n this.display();\r\n }\r\n _applyPosition(x, y, tooltipHeight) {\r\n const isContainerBody = this.isContainerBody();\r\n const containerHeight = isContainerBody ? window.innerHeight : this._container.scrollHeight;\r\n this.div\r\n .classed(positionFixed, isContainerBody)\r\n .style('top', isContainerBody ? `${y}px` : 'unset')\r\n .style('bottom', !isContainerBody ? `${containerHeight - y - tooltipHeight}px` : 'unset')\r\n .style('left', `${x}px`);\r\n }\r\n _constraintPosToContainer(top, left, tooltipWidth, tooltipHeight) {\r\n const isContainerBody = this.isContainerBody();\r\n const containerHeight = isContainerBody ? window.innerHeight : this._container.scrollHeight;\r\n const containerWidth = isContainerBody ? window.innerWidth : this._container.scrollWidth;\r\n // // Constraint to container\r\n const paddingX = 10;\r\n const hitRight = top > (containerWidth - tooltipWidth - paddingX);\r\n const hitLeft = top < paddingX;\r\n const constrainedLeft = hitRight ? containerWidth - tooltipWidth - paddingX\r\n : hitLeft ? paddingX : top;\r\n const paddingY = 10;\r\n const hitBottom = left > (containerHeight - tooltipHeight - paddingY);\r\n const hitTop = left < paddingY;\r\n const constrainedTop = hitBottom ? containerHeight - tooltipHeight - paddingY\r\n : hitTop ? paddingY : left;\r\n return [\r\n containerWidth < tooltipWidth ? 0 : constrainedLeft,\r\n containerHeight < tooltipHeight ? 0 : constrainedTop,\r\n ];\r\n }\r\n _setContainerPosition() {\r\n var _a;\r\n // Tooltip position calculation relies on the parent position\r\n // If it's not set (static), we set it to `relative` (not a good practice)\r\n if (this._container !== document.body && ((_a = getComputedStyle(this._container)) === null || _a === void 0 ? void 0 : _a.position) === 'static') {\r\n this._container.style.position = 'relative';\r\n }\r\n }\r\n _setUpEvents() {\r\n const { config } = this;\r\n // We use the Event Delegation pattern to set up Tooltip events\r\n // Every component will have single `mousemove` and `mouseleave` event listener functions, where we'll check\r\n // the `path` of the event and trigger corresponding callbacks\r\n this.components.forEach(component => {\r\n const selection = select(component.element);\r\n selection\r\n .on('mousemove.tooltip', (e) => {\r\n const { config: currentConfig } = this; // get latest config because it could have been changed after the event was triggered\r\n const path = (e.composedPath && e.composedPath()) || e.path || [e.target];\r\n // Go through all of the configured triggers\r\n for (const className of Object.keys(currentConfig.triggers)) {\r\n const template = currentConfig.triggers[className];\r\n if (!template)\r\n continue; // Skip if the trigger is not configured\r\n const els = selection.selectAll(`.${className}`).nodes();\r\n // Go through all of the elements in the event path (from the deepest element upwards)\r\n for (const el of path) {\r\n if (el === selection.node())\r\n break; // Break on the component's level (usually the `<g>` element)\r\n if (el.classList.contains(className)) { // If there's a match, show the tooltip\r\n const i = els.indexOf(el);\r\n const d = select(el).datum();\r\n const content = template(d, i, els);\r\n const [x, y] = this.isContainerBody() ? [e.clientX, e.clientY] : pointer(e, this._container);\r\n if (content === null) {\r\n // If the content is `null`, we hide the tooltip\r\n this.hide();\r\n }\r\n else {\r\n // Otherwise we show the tooltip, but don't render the content if it's `undefined` or\r\n // an empty string. This way we can allow it to work with things like `createPortal` in React\r\n this.render(content);\r\n if (currentConfig.followCursor)\r\n this.place({ x, y });\r\n else\r\n this.placeByElement(el);\r\n }\r\n // Stop propagation to prevent other interfering events from being triggered, e.g. Crosshair\r\n e.stopPropagation();\r\n // Stop looking for other matches\r\n return;\r\n }\r\n }\r\n }\r\n // Hide the tooltip if the event didn't pass through any of the configured triggers.\r\n // We use the `this._isShown` condition as a little performance optimization tweak\r\n // (we don't want the tooltip to update its class on every mouse movement, see `this.hide()`).\r\n if (this._isShown)\r\n this.hide();\r\n })\r\n .on('mouseleave.tooltip', (e) => {\r\n e.stopPropagation(); // Stop propagation to prevent other interfering events from being triggered, e.g. Crosshair\r\n this.hide();\r\n });\r\n });\r\n // Set up Tooltip hover\r\n if (config.allowHover) {\r\n this.div\r\n .on('mouseenter.tooltip', this._display.bind(this))\r\n .on('mouseleave.tooltip', this.hide.bind(this));\r\n }\r\n else {\r\n this.div\r\n .on('mouseenter.tooltip', null)\r\n .on('mouseleave.tooltip', null);\r\n }\r\n }\r\n _setUpAttributes() {\r\n const attributesMap = this.config.attributes;\r\n if (!attributesMap)\r\n return;\r\n Object.keys(attributesMap).forEach(attr => {\r\n this.div.attr(attr, attributesMap[attr]);\r\n });\r\n }\r\n destroy() {\r\n var _a;\r\n this._mutationObserver.disconnect();\r\n window.clearTimeout(this._hideDelayTimeoutId);\r\n window.clearTimeout(this._showDelayTimeoutId);\r\n (_a = this.div) === null || _a === void 0 ? void 0 : _a.remove();\r\n }\r\n}\r\nTooltip.selectors = style;\n\nexport { Tooltip };\n//# sourceMappingURL=index.js.map\n","import { color, hcl } from 'd3-color';\nimport { getCSSColorVariable } from '../styles/colors.js';\nimport { getString, isNumber } from './data.js';\nimport { isStringCSSVariable, getCSSVariableValue } from './misc.js';\n\n/** Retrieves color from the data if provided, fallbacks to CSS variables if the index was passed */\r\nfunction getColor(d, accessor, index, dontFallbackToCssVar) {\r\n if (Array.isArray(accessor) && isFinite(index))\r\n return accessor[index % accessor.length];\r\n const value = getString(d, accessor, index);\r\n return (value || ((isNumber(index) && !dontFallbackToCssVar) ? `var(${getCSSColorVariable(index)})` : null));\r\n}\r\nfunction hexToRgb(hex) {\r\n const parsed = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n return parsed ? {\r\n r: parseInt(parsed[1], 16),\r\n g: parseInt(parsed[2], 16),\r\n b: parseInt(parsed[3], 16),\r\n } : { r: 0, g: 0, b: 0 };\r\n}\r\nfunction rgbToBrightness(rgb) {\r\n return (0.2126 * rgb.r + 0.7152 * rgb.g + 0.0722 * rgb.b) / 255;\r\n}\r\nfunction hexToBrightness(hex) {\r\n const rgb = hexToRgb(hex);\r\n return rgbToBrightness(rgb);\r\n}\r\nfunction getHexValue(s, context) {\r\n var _a;\r\n const hex = isStringCSSVariable(s) ? getCSSVariableValue(s, context) : s;\r\n return (_a = color(hex)) === null || _a === void 0 ? void 0 : _a.formatHex();\r\n}\r\nfunction rgbaToRgb(rgba, backgroundColor) {\r\n var _a;\r\n const rgb = (_a = color(rgba)) === null || _a === void 0 ? void 0 : _a.rgb();\r\n if (!rgb || rgb.opacity === 1)\r\n return rgb;\r\n const alpha = 1 - rgb.opacity;\r\n const bg = color(backgroundColor !== null && backgroundColor !== void 0 ? backgroundColor : '#fff').rgb();\r\n return {\r\n r: Math.round((rgb.opacity * (rgb.r / 255) + (alpha * (bg.r / 255))) * 255),\r\n g: Math.round((rgb.opacity * (rgb.g / 255) + (alpha * (bg.g / 255))) * 255),\r\n b: Math.round((rgb.opacity * (rgb.b / 255) + (alpha * (bg.b / 255))) * 255),\r\n };\r\n}\r\n/**\r\n * Makes a color brighter by a certain amount\r\n * @param inputColor - The color to brighten (hex, rgb, or rgba)\r\n * @param amount - Amount to brighten by (0-1)\r\n * @returns The brightened color in hex format\r\n */\r\nfunction brighter(inputColor, amount) {\r\n const c = hcl(inputColor);\r\n if (!c)\r\n return inputColor;\r\n return c.brighter(amount).formatHex();\r\n}\r\nfunction isColorDark(color, threshold = 0.55) {\r\n const hex = getHexValue(color, document.body);\r\n if (!hex)\r\n return false;\r\n return hexToBrightness(hex) < threshold;\r\n}\n\nexport { brighter, getColor, getHexValue, hexToBrightness, hexToRgb, isColorDark, rgbToBrightness, rgbaToRgb };\n//# sourceMappingURL=color.js.map\n","import { curveBasis, curveBasisClosed, curveBasisOpen, curveBundle, curveCardinal, curveCardinalClosed, curveCardinalOpen, curveCatmullRom, curveCatmullRomClosed, curveCatmullRomOpen, curveLinear, curveLinearClosed, curveMonotoneX, curveMonotoneY, curveNatural, curveStep, curveStepAfter, curveStepBefore } from 'd3-shape';\n\nvar CurveType;\r\n(function (CurveType) {\r\n CurveType[\"Basis\"] = \"basis\";\r\n CurveType[\"BasisClosed\"] = \"basisClosed\";\r\n CurveType[\"BasisOpen\"] = \"basisOpen\";\r\n CurveType[\"Bundle\"] = \"bundle\";\r\n CurveType[\"Cardinal\"] = \"cardinal\";\r\n CurveType[\"CardinalClosed\"] = \"cardinalClosed\";\r\n CurveType[\"CardinalOpen\"] = \"cardinalOpen\";\r\n CurveType[\"CatmullRom\"] = \"catmullRom\";\r\n CurveType[\"CatmullRomClosed\"] = \"catmullRomClosed\";\r\n CurveType[\"CatmullRomOpen\"] = \"catmullRomOpen\";\r\n CurveType[\"Linear\"] = \"linear\";\r\n CurveType[\"LinearClosed\"] = \"linearClosed\";\r\n CurveType[\"MonotoneX\"] = \"monotoneX\";\r\n CurveType[\"MonotoneY\"] = \"monotoneY\";\r\n CurveType[\"Natural\"] = \"natural\";\r\n CurveType[\"Step\"] = \"step\";\r\n CurveType[\"StepAfter\"] = \"stepAfter\";\r\n CurveType[\"StepBefore\"] = \"stepBefore\";\r\n})(CurveType || (CurveType = {}));\r\nconst Curve = {\r\n [CurveType.Basis]: curveBasis,\r\n [CurveType.BasisClosed]: curveBasisClosed,\r\n [CurveType.BasisOpen]: curveBasisOpen,\r\n [CurveType.Bundle]: curveBundle,\r\n [CurveType.Cardinal]: curveCardinal,\r\n [CurveType.CardinalClosed]: curveCardinalClosed,\r\n [CurveType.CardinalOpen]: curveCardinalOpen,\r\n [CurveType.CatmullRom]: curveCatmullRom,\r\n [CurveType.CatmullRomClosed]: curveCatmullRomClosed,\r\n [CurveType.CatmullRomOpen]: curveCatmullRomOpen,\r\n [CurveType.Linear]: curveLinear,\r\n [CurveType.LinearClosed]: curveLinearClosed,\r\n [CurveType.MonotoneX]: curveMonotoneX,\r\n [CurveType.MonotoneY]: curveMonotoneY,\r\n [CurveType.Natural]: curveNatural,\r\n [CurveType.Step]: curveStep,\r\n [CurveType.StepAfter]: curveStepAfter,\r\n [CurveType.StepBefore]: curveStepBefore,\r\n};\n\nexport { Curve, CurveType };\n//# sourceMappingURL=curve.js.map\n","import { XYComponentDefaultConfig } from '../../core/xy-component/config.js';\nimport { CurveType } from '../../types/curve.js';\n\nconst LineDefaultConfig = Object.assign(Object.assign({}, XYComponentDefaultConfig), { curveType: CurveType.MonotoneX, lineWidth: 2, lineDashArray: undefined, fallbackValue: undefined, highlightOnHover: false, cursor: null, interpolateMissingData: false });\n\nexport { LineDefaultConfig };\n//# sourceMappingURL=config.js.map\n","import { injectGlobal, css } from '@emotion/css';\n\nconst globalStyles = injectGlobal `\n :root {\n --vis-line-cursor: default;\n --vis-line-stroke-dasharray: none;\n --vis-line-stroke-dashoffset: 0;\n\n --vis-line-gapfill-stroke-dasharray: 2 3;\n --vis-line-gapfill-stroke-opacity: 0.8;\n --vis-line-gapfill-stroke-dashoffset: 0;\n }\n`;\r\nconst root = css `\n label: line-component;\n`;\r\nconst line = css `\n label: line;\n transition: opacity 200ms;\n cursor: var(--vis-line-cursor);\n`;\r\nconst linePath = css `\n label: linePath;\n fill: none;\n stroke-dasharray: var(--vis-line-stroke-dasharray);\n stroke-dashoffset: var(--vis-line-stroke-dashoffset);\n`;\r\nconst lineSelectionHelper = css `\n label: lineSelectionHelper;\n fill: none;\n stroke: rgba(0, 0, 0, 0);\n stroke-width: 8px;\n`;\r\nconst dim = css `\n opacity: 0.2;\n`;\r\nconst interpolatedPath = css `\n label: interpolated-path;\n fill: none;\n stroke-dasharray: var(--vis-line-gapfill-stroke-dasharray);\n stroke-dashoffset: var(--vis-line-gapfill-stroke-dashoffset);\n stroke-opacity: var(--vis-line-gapfill-stroke-opacity);\n`;\n\nexport { dim, globalStyles, interpolatedPath, line, linePath, lineSelectionHelper, root };\n//# sourceMappingURL=style.js.map\n","import { select } from 'd3-selection';\nimport { line } from 'd3-shape';\nimport { interpolatePath } from 'd3-interpolate-path';\nimport { XYComponentCore } from '../../core/xy-component/index.js';\nimport { isNumber, isArray, getNumber, getString, getValue } from '../../utils/data.js';\nimport { smartTransition } from '../../utils/d3.js';\nimport { getColor } from '../../utils/color.js';\nimport { Curve, CurveType } from '../../types/curve.js';\nimport { Direction } from '../../types/direction.js';\nimport { LineDefaultConfig } from './config.js';\nimport * as style from './style.js';\nimport { line as line$1, linePath, lineSelectionHelper, interpolatedPath, dim } from './style.js';\n\nclass Line extends XYComponentCore {\r\n constructor(config) {\r\n super();\r\n this._defaultConfig = LineDefaultConfig;\r\n this.config = this._defaultConfig;\r\n this.curve = Curve[CurveType.MonotoneX];\r\n this.events = {\r\n [Line.selectors.line]: {\r\n mouseover: this._highlight.bind(this),\r\n mouseleave: this._resetHighlight.bind(this),\r\n },\r\n };\r\n if (config)\r\n this.setConfig(config);\r\n }\r\n get bleed() {\r\n const { config: { lineWidth } } = this;\r\n const yDomain = this.yScale.domain();\r\n const yDirection = this.yScale.range()[0] > this.yScale.range()[1]\r\n ? Direction.North\r\n : Direction.South;\r\n const isYDirectionSouth = yDirection === Direction.South;\r\n const isLineThick = lineWidth > 3;\r\n const isLineVeryThick = lineWidth >= 10;\r\n return {\r\n top: !isLineVeryThick && ((!isYDirectionSouth && (yDomain[1] === 0)) || (isYDirectionSouth && (yDomain[0] === 0))) ? 0 : lineWidth / 2,\r\n bottom: !isLineVeryThick && ((!isYDirectionSouth && (yDomain[0] === 0)) || (isYDirectionSouth && (yDomain[1] === 0))) ? 0 : lineWidth / 2,\r\n left: isLineThick ? lineWidth / 2 : 0,\r\n right: isLineThick ? lineWidth / 2 : 0,\r\n };\r\n }\r\n _render(customDuration) {\r\n super._render(customDuration);\r\n const { config, datamodel: { data } } = this;\r\n const duration = isNumber(customDuration) ? customDuration : config.duration;\r\n this.curve = Curve[config.curveType];\r\n this.lineGen = line()\r\n .x(d => d.x)\r\n .y(d => d.y)\r\n .defined(d => d.defined)\r\n .curve(this.curve);\r\n const yAccessors = (isArray(config.y) ? config.y : [config.y]);\r\n const lineDataX = data.map((d, i) => this.xScale(getNumber(d, config.x, i)));\r\n const lineData = yAccessors.map(a => {\r\n const ld = data.map((d, i) => {\r\n const rawValue = getNumber(d, a, i);\r\n // If `rawValue` is not numerical or if it's not finite (`NaN`, `undefined`, ...), we replace it with `config.fallbackValue`\r\n const value = (isNumber(rawValue) || (rawValue === null)) && isFinite(rawValue) ? rawValue : config.fallbackValue;\r\n const defined = config.interpolateMissingData\r\n ? (isNumber(rawValue) || (rawValue === null)) && isFinite(rawValue)\r\n : isFinite(value);\r\n return {\r\n x: lineDataX[i],\r\n y: this.yScale(value !== null && value !== void 0 ? value : 0),\r\n defined,\r\n value,\r\n };\r\n });\r\n const defined = ld.reduce((def, d) => (d.defined || def), false);\r\n let validGap = false;\r\n const gaps = ld.reduce((acc, d, i) => {\r\n // Gaps include fallback values if configured.\r\n if (!d.defined && isFinite(config.fallbackValue)) {\r\n acc.push(Object.assign(Object.assign({}, d), { defined: true }));\r\n }\r\n if (!d.defined && !validGap)\r\n validGap = true;\r\n const isEndpoint = (i > 0 && !ld[i - 1].defined) || (i < ld.length - 1 && !ld[i + 1].defined);\r\n if (d.defined && isEndpoint) {\r\n // If no undefined points have been found since the last endpoint, we insert one to enforce breaks between adjacent gaps.\r\n if (!validGap)\r\n acc.push(Object.assign(Object.assign({}, d), { defined: false }));\r\n acc.push(d);\r\n validGap = false;\r\n }\r\n return acc;\r\n }, []);\r\n // If the line consists only of `null` values, we'll still render it but it'll be invisible.\r\n // Such trick allows us to have better animated transitions.\r\n const visible = defined && ld.some(d => d.value !== null);\r\n return {\r\n values: ld,\r\n defined,\r\n gaps,\r\n visible,\r\n };\r\n });\r\n const lines = this.g\r\n .selectAll(`.${line$1}`)\r\n .data(lineData);\r\n const linesEnter = lines.enter().append('g')\r\n .attr('class', line$1);\r\n linesEnter\r\n .append('path')\r\n .attr('class', linePath)\r\n .attr('stroke', (d, i) => getColor(data, config.color, i))\r\n .attr('stroke-opacity', 0)\r\n .attr('stroke-width', config.lineWidth);\r\n linesEnter\r\n .append('path')\r\n .attr('class', lineSelectionHelper)\r\n .attr('d', this._emptyPath());\r\n linesEnter.append('path')\r\n .attr('class', interpolatedPath)\r\n .attr('d', this._emptyPath())\r\n .style('opacity', 0);\r\n const linesMerged = linesEnter.merge(lines);\r\n linesMerged.style('cursor', (d, i) => getString(data, config.cursor, i));\r\n linesMerged.each((d, i, elements) => {\r\n var _a;\r\n const group = select(elements[i]);\r\n const linePath$1 = group.select(`.${linePath}`);\r\n const lineSelectionHelper$1 = group.select(`.${lineSelectionHelper}`);\r\n const lineGaps = group.select(`.${interpolatedPath}`);\r\n const isLineVisible = d.visible;\r\n const dashArray = getValue(data, config.lineDashArray, i);\r\n const transition = smartTransition(linePath$1, duration)\r\n .attr('stroke', getColor(data, config.color, i))\r\n .attr('stroke-width', config.lineWidth)\r\n .attr('stroke-opacity', isLineVisible ? 1 : 0)\r\n .style('stroke-dasharray', (_a = dashArray === null || dashArray === void 0 ? void 0 : dashArray.join(' ')) !== null && _a !== void 0 ? _a : null); // We use `.style` because there's also a default CSS-variable for stroke-dasharray\r\n const hasUndefinedSegments = d.values.some(d => !d.defined);\r\n const svgPathD = this.lineGen(d.values);\r\n if (duration && !hasUndefinedSegments) {\r\n const previous = linePath$1.attr('d') || this._emptyPath();\r\n const next = svgPathD || this._emptyPath();\r\n const t = transition;\r\n t.attrTween('d', () => interpolatePath(previous, next));\r\n }\r\n else if (d.visible) {\r\n transition.attr('d', svgPathD);\r\n }\r\n lineSelectionHelper$1\r\n .attr('d', svgPathD)\r\n .attr('visibility', isLineVisible ? null : 'hidden');\r\n if (hasUndefinedSegments && config.interpolateMissingData) {\r\n smartTransition(lineGaps, duration)\r\n .attr('d', this.lineGen(d.gaps))\r\n .attr('stroke', getColor(data, config.color, i))\r\n .attr('stroke-width', config.lineWidth - 1)\r\n .style('opacity', 1);\r\n }\r\n else {\r\n lineGaps.transition()\r\n .duration(duration)\r\n .style('opacity', 0);\r\n }\r\n });\r\n smartTransition(lines.exit(), duration)\r\n .style('opacity', 0)\r\n .remove();\r\n }\r\n _emptyPath() {\r\n const xRange = this.xScale.range();\r\n const yRange = this.yScale.range();\r\n return `M${xRange[0]},${yRange[0]} L${xRange[1]},${yRange[0]}`;\r\n }\r\n _highlight(datum) {\r\n const { config } = this;\r\n if (config.highlightOnHover) {\r\n this.g\r\n .selectAll(`.${line$1}`)\r\n .classed(dim, d => d !== datum);\r\n }\r\n }\r\n _resetHighlight() {\r\n const { config } = this;\r\n if (config.highlightOnHover) {\r\n this.g\r\n .selectAll(`.${line$1}`)\r\n .classed(dim, false);\r\n }\r\n }\r\n}\r\nLine.selectors = style;\n\nexport { Line };\n//# sourceMappingURL=index.js.map\n","import { range, min, max } from 'd3-array';\nimport { line, curveCardinal, curveCardinalClosed } from 'd3-shape';\nimport { clamp } from './data.js';\n\n/*\r\n * Generate SVG path for rectangle with rounded corners\r\n *\r\n * @param {Object} props - Configuration object\r\n * @param {Number} props.x - Rect top left X coordinate\r\n * @param {Number} props.y - Rect top left Y coordinate\r\n * @param {Number} props.w - Rect width\r\n * @param {Number} props.h - Rect height\r\n * @param {Bool} [props.tl=false] - Round top left corner\r\n * @param {Bool} [props.tr=false] - Round top right corner\r\n * @param {Bool} [props.bl=false] - Round bottom left corner\r\n * @param {Bool} [props.br=false] - Round bottom right corner\r\n * @param {Number} [props.r=0] - Corner Radius\r\n * @return {String} Path string for the `d` attribute\r\n */\r\nfunction roundedRectPath({ x, y, w, h, tl = false, tr = false, bl = false, br = false, r = 0, }) {\r\n let path;\r\n path = `M${x + r},${y}h${w - 2 * r}`;\r\n let roundedR = tr ? r : 0;\r\n let angularR = tr ? 0 : r;\r\n path += `a${roundedR},${roundedR} 0 0 1 ${roundedR},${roundedR}`;\r\n path += `h${angularR}v${angularR}`;\r\n path += `v${h - 2 * r}`;\r\n roundedR = br ? r : 0;\r\n angularR = br ? 0 : r;\r\n path += `a${roundedR},${roundedR} 0 0 1 ${-roundedR},${roundedR}`;\r\n path += `v${angularR}h${-angularR}`;\r\n path += `h${2 * r - w}`;\r\n roundedR = bl ? r : 0;\r\n angularR = bl ? 0 : r;\r\n path += `a${roundedR},${roundedR} 0 0 1 ${-roundedR},${-roundedR}`;\r\n path += `h${-angularR}v${-angularR}`;\r\n path += `v${2 * r - h}`;\r\n roundedR = tl ? r : 0;\r\n angularR = tl ? 0 : r;\r\n path += `a${roundedR},${roundedR} 0 0 1 ${roundedR},${-roundedR}`;\r\n path += `v${-angularR}h${angularR}`;\r\n path += 'z';\r\n return path;\r\n}\r\nfunction polygon(size, n = 6, endAngle = 2 * Math.PI, open = false) {\r\n const r = n === 4 ? Math.sqrt(0.5) * size : size / 3.6 * 2;\r\n const deltaAngle = n === 4 ? Math.PI / 4 : 0; // rotate to 45 grads if shape is a rectangle\r\n const shiftedEndAngle = endAngle - deltaAngle;\r\n const completion = (shiftedEndAngle < 0 ? endAngle : shiftedEndAngle) / (2 * Math.PI);\r\n const nSegments = Math.ceil(n * completion);\r\n const centerAngle = 1 / n * Math.PI * 2; // /\\\r\n const baseAngle = (Math.PI - centerAngle) / 2; // /__\\\r\n const data = range(nSegments + (shiftedEndAngle >= 0 ? 1 : 0))\r\n .map((d, i) => {\r\n const isLastSegment = i === nSegments || (nSegments === 1 && shiftedEndAngle < 0);\r\n let mult = isLastSegment ? ((completion * n) % 1 || 1) : 1; // Handle partial shape\r\n if (shiftedEndAngle < 0) {\r\n mult += 0.5;\r\n }\r\n const angle = centerAngle * (i - 1 + mult);\r\n let radius;\r\n if (isLastSegment) {\r\n const thirdAngle = Math.PI - baseAngle - centerAngle * mult;\r\n radius = r * Math.sin(baseAngle) / Math.sin(thirdAngle); // Law of sines\r\n }\r\n else {\r\n radius = r;\r\n }\r\n return {\r\n x: Math.sin(angle + deltaAngle) * radius,\r\n y: -Math.cos(angle + deltaAngle) * radius,\r\n };\r\n });\r\n if (n === 4) {\r\n const angle = centerAngle * (-1 + 0.5);\r\n const thirdAngle = Math.PI * 0.5;\r\n const radius = r * Math.sin(baseAngle) / Math.sin(thirdAngle); // Law of sines\r\n data.unshift({\r\n x: Math.sin(angle + deltaAngle) * radius,\r\n y: -Math.cos(angle + deltaAngle) * radius,\r\n });\r\n }\r\n const path = line()\r\n /* eslint-disable-next-line dot-notation */\r\n .x(d => d['x'])\r\n /* eslint-disable-next-line dot-notation */\r\n .y(d => d['y'])\r\n .curve((open ? curveCardinal : curveCardinalClosed).tension(0.95));\r\n return path(data);\r\n}\r\nfunction circlePath(cx, cy, r) {\r\n return `\n M ${cx} ${cy}\n m ${-r}, 0\n a ${r},${r} 0 1,1 ${r * 2},0\n a ${r},${r} 0 1,1 ${-r * 2},0`;\r\n}\r\nfunction scoreRectPath({ x, y, w, h, r = 0, score = 1 }) {\r\n let path;\r\n const side = 1 / 4;\r\n const halfSide = side / 2;\r\n let part = score;\r\n // 8 1\r\n // - -\r\n // 7 | | 2\r\n // 6 | | 3\r\n // - -\r\n // 5 4\r\n // 1\r\n const hLength = min([w * 0.5 * (part / halfSide) + r, w * 0.5 - r]);\r\n path = `M${x + w * 0.5},${y}h${hLength}`;\r\n // 2, 3\r\n part = score - 1 / 8;\r\n if (part > 0) {\r\n path += `a${r},${r} 0 0 1 ${r},${r}`;\r\n const vLength = clamp(h * (part / side) - r, 0, h - 2 * r);\r\n path += `v${vLength}`;\r\n }\r\n // 4, 5\r\n part = score - 3 / 8;\r\n if (part > 0) {\r\n path += `a${r},${r} 0 0 1 ${-r},${r}`;\r\n const hLength = clamp(r - w * (part / side), 2 * r - w, 0);\r\n path += `h${hLength}`;\r\n }\r\n // 6, 7\r\n part = score - 5 / 8;\r\n if (part > 0) {\r\n path += `a${r},${r} 0 0 1 ${-r},${-r}`;\r\n const vLength = clamp(r - h * (part / side), 2 * r - h, 0);\r\n path += `v${vLength}`;\r\n }\r\n // 8\r\n part = score - 7 / 8;\r\n if (part > 0) {\r\n path += `a${r},${r} 0 0 1 ${r},${-r}`;\r\n const hLength = max([w * 0.5 * (part / halfSide) - r, 0]);\r\n path += `h${hLength}`;\r\n }\r\n return path;\r\n}\r\n/*\r\n * Replace L path command with arc with specified radius\r\n * @param {String} path - the path string\r\n * @param {number} r - radius in pixels\r\n * @returns {String} new path string\r\n */\r\nfunction convertLineToArc(path, r) {\r\n return path.toString().replace(/L(?<x>-?\\d*\\.?\\d*),(?<y>-?\\d+\\.?\\d*)/gm, (_, x, y) => `A ${r} ${r} 0 0 0 ${x} ${y}`);\r\n}\r\n/**\r\n * Generate an SVG path string for an arrow that follows a polyline path.\r\n * The arrow is composed of line segments between points and a triangular arrowhead at the end.\r\n *\r\n * @param opts - ArrowPolylinePathOptions object containing array of points and optional head dimensions.\r\n * @returns SVG path string for the arrow.\r\n */\r\nfunction arrowPolylinePath(points, arrowHeadLength = 8, arrowHeadWidth = 6, smoothing = 5) {\r\n if (points.length < 2)\r\n return '';\r\n // Calculate total path length\r\n let totalLength = 0;\r\n for (let i = 0; i < points.length - 1; i++) {\r\n const [x1, y1] = points[i];\r\n const [x2, y2] = points[i + 1];\r\n totalLength += Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\r\n }\r\n // If the total length is zero or nearly zero, don't draw anything\r\n if (totalLength === 0)\r\n return '';\r\n // Let the default values be modifiable based on the line length\r\n let headLength = arrowHeadLength;\r\n let headWidth = arrowHeadWidth;\r\n // If the line is very short, scale down the arrow head dimensions\r\n const threshold = arrowHeadLength * 2;\r\n if (totalLength < threshold) {\r\n const scale = totalLength / threshold;\r\n headLength *= scale;\r\n headWidth *= scale;\r\n }\r\n // Ensure the arrow head length is never longer than the line itself\r\n headLength = Math.min(headLength / 2, totalLength);\r\n // Get the last two points for arrowhead calculation\r\n const [lastX, lastY] = points[points.length - 1];\r\n const [prevX, prevY] = points[points.length - 2];\r\n // Calculate direction vector for the last segment\r\n const dx = lastX - prevX;\r\n const dy = lastY - prevY;\r\n const segmentLength = Math.sqrt(dx * dx + dy * dy);\r\n const ux = dx / segmentLength;\r\n const uy = dy / segmentLength;\r\n // Tail point of the arrow (where the arrowhead starts)\r\n const tailX = lastX - headLength * ux;\r\n const tailY = lastY - headLength * uy;\r\n // Perpendicular vector for arrowhead width calculation\r\n const perpX = -uy;\r\n const perpY = ux;\r\n // Calculate the two base points of the arrowhead triangle\r\n const leftX = tailX + (headWidth / 2) * perpX;\r\n const leftY = tailY + (headWidth / 2) * perpY;\r\n const rightX = tailX - (headWidth / 2) * perpX;\r\n const rightY = tailY - (headWidth / 2) * perpY;\r\n // Build the path\r\n const pathParts = [];\r\n if (points.length === 2) {\r\n // For a single segment, create a curved path\r\n const [startX, startY] = points[0];\r\n // Adjust smoothing based on segment length\r\n const adjustedSmoothing = Math.min(smoothing, segmentLength / 3);\r\n // Calculate control points for a cubic Bézier curve with adjusted smoothing\r\n const cp1x = startX + ux * adjustedSmoothing;\r\n const cp1y = startY + uy * adjustedSmoothing + perpY * adjustedSmoothing * 0.5;\r\n const cp2x = tailX - ux * adjustedSmoothing;\r\n const cp2y = tailY - uy * adjustedSmoothing + perpY * adjustedSmoothing * 0.5;\r\n // Start path and add cubic Bézier curve\r\n pathParts.push(`M${startX},${startY}`);\r\n pathParts.push(`C${cp1x},${cp1y} ${cp2x},${cp2y} ${lastX},${lastY}`);\r\n }\r\n else {\r\n // For multiple segments, use smooth Bézier corners with absolute smoothing\r\n pathParts.push(`M${points[0][0]},${points[0][1]}`);\r\n for (let i = 0; i < points.length - 2; i++) {\r\n const [x1, y1] = points[i];\r\n const [x2, y2] = points[i + 1];\r\n const [x3, y3] = points[i + 2];\r\n // Calculate vectors for the current and next segment\r\n const v1x = x2 - x1;\r\n const v1y = y2 - y1;\r\n const v2x = x3 - x2;\r\n const v2y = y3 - y2;\r\n // Calculate lengths of segments\r\n const len1 = Math.sqrt(v1x * v1x + v1y * v1y);\r\n const len2 = Math.sqrt(v2x * v2x + v2y * v2y);\r\n // Calculate unit vectors\r\n const u1x = v1x / len1;\r\n const u1y = v1y / len1;\r\n const u2x = v2x / len2;\r\n const u2y = v2y / len2;\r\n // Adjust smoothing based on the minimum segment length\r\n const minSegmentLength = Math.min(len1, len2);\r\n const adjustedSmoothing = Math.min(smoothing, minSegmentLength / 3);\r\n // Calculate the corner points and control points with adjusted smoothing\r\n const corner1x = x2 - u1x * adjustedSmoothing;\r\n const corner1y = y2 - u1y * adjustedSmoothing;\r\n const corner2x = x2 + u2x * adjustedSmoothing;\r\n const corner2y = y2 + u2y * adjustedSmoothing;\r\n // Add line to approach point\r\n pathParts.push(`L${corner1x},${corner1y}`);\r\n // Add cubic Bézier curve for the corner\r\n pathParts.push(`C${x2},${y2} ${x2},${y2} ${corner2x},${corner2y}`);\r\n }\r\n // Add the final line segment to the tail point\r\n pathParts.push(`L${lastX},${lastY}`);\r\n }\r\n // Add the arrowhead\r\n pathParts.push(`M${leftX},${leftY} L${lastX},${lastY} L${rightX},${rightY}`);\r\n return pathParts.join(' ');\r\n}\n\nexport { arrowPolylinePath, circlePath, convertLineToArc, polygon, roundedRectPath, scoreRectPath };\n//# sourceMappingURL=path.js.map\n","import { XYComponentDefaultConfig } from '../../core/xy-component/config.js';\nimport { Orientation } from '../../types/position.js';\n\nconst GroupedBarDefaultConfig = Object.assign(Object.assign({}, XYComponentDefaultConfig), { color: undefined, groupMaxWidth: undefined, groupWidth: undefined, dataStep: undefined, groupPadding: 0.05, barPadding: 0.0, roundedCorners: 2, barMinHeight: 2, cursor: null, orientation: Orientation.Vertical });\n\nexport { GroupedBarDefaultConfig };\n//# sourceMappingURL=config.js.map\n","import { css, injectGlobal } from '@emotion/css';\n\nconst root = css `\n label: grouped-bar-component;\n`;\r\nconst globalStyles = injectGlobal `\n :root {\n --vis-grouped-bar-cursor: default;\n --vis-grouped-bar-fill-color: var(--vis-color-main);\n --vis-grouped-bar-stroke-color: none;\n --vis-grouped-bar-stroke-width: 0px;\n --vis-grouped-bar-hover-stroke-width: 1px;\n --vis-grouped-bar-hover-stroke-color: none;\n\n\n /* Dark Theme */\n --vis-dark-grouped-bar-stroke-color: none;\n }\n\n body.theme-dark ${`.${root}`} {\n --vis-grouped-bar-stroke-color: var(--vis-dark-grouped-bar-stroke-color);\n }\n`;\r\nconst bar = css `\n label: bar;\n fill: var(--vis-grouped-bar-fill-color);\n stroke: var(--vis-grouped-bar-stroke-color);\n stroke-width: var(--vis-grouped-bar-stroke-width);\n cursor: var(--vis-grouped-bar-cursor);\n\n &:hover {\n stroke-width: var(--vis-grouped-bar-hover-stroke-width);\n stroke: var(--vis-grouped-bar-hover-stroke-color);\n }\n`;\r\nconst barGroup = css `\n label: barGroup;\n`;\r\nconst barGroupExit = css `\n label: barGroupExit;\n`;\n\nexport { bar, barGroup, barGroupExit, globalStyles, root };\n//# sourceMappingURL=style.js.map\n","import { scaleBand } from 'd3-scale';\nimport { min, max, range } from 'd3-array';\nimport { XYComponentCore } from '../../core/xy-component/index.js';\nimport { isArray, getNumber, isNumber, getString, clamp, isEmpty, getMin, getMax, getExtent } from '../../utils/data.js';\nimport { roundedRectPath } from '../../utils/path.js';\nimport { smartTransition } from '../../utils/d3.js';\nimport { getColor } from '../../utils/color.js';\nimport { Direction } from '../../types/direction.js';\nimport { Orientation } from '../../types/position.js';\nimport { GroupedBarDefaultConfig } from './config.js';\nimport * as style from './style.js';\nimport { barGroup, barGroupExit, bar } from './style.js';\n\nclass GroupedBar extends XYComponentCore {\r\n constructor(config) {\r\n super();\r\n this._defaultConfig = GroupedBarDefaultConfig;\r\n this.config = this._defaultConfig;\r\n this.getAccessors = () => isArray(this.config.y) ? this.config.y : [this.config.y];\r\n this.events = {};\r\n this._barData = [];\r\n if (config)\r\n this.setConfig(config);\r\n }\r\n get bleed() {\r\n this._barData = this._getVisibleData();\r\n if (this._barData.length === 0)\r\n return { top: 0, bottom: 0, left: 0, right: 0 };\r\n // By default, horizontal orientation is \"flipped\", i.e. the `yDirection` of `XYContainer` is set to `Direction.North`\r\n const isHorizontalAndFlipped = !this.isVertical() && (this.dataScale.range()[0] > this.dataScale.range()[1]);\r\n const dataDomain = this.dataScale.domain();\r\n const halfGroupWidth = this._getGroupWidth() / 2;\r\n const dataScaleValues = this._barData.map((d, i) => getNumber(d, this.config.x, i));\r\n const firstDataValue = min(dataScaleValues);\r\n const lastDataValue = max(dataScaleValues);\r\n const firstValuePx = this.dataScale(firstDataValue);\r\n const lastValuePx = this.dataScale(lastDataValue);\r\n const dataDomainRequiredStart = this.dataScale.invert(firstValuePx + (isHorizontalAndFlipped ? halfGroupWidth : -halfGroupWidth));\r\n const dataDomainRequiredEnd = this.dataScale.invert(lastValuePx + (isHorizontalAndFlipped ? -halfGroupWidth : halfGroupWidth));\r\n const bleedPxStart = dataDomainRequiredStart <= dataDomain[0] ? this.dataScale(dataDomain[0]) - this.dataScale(dataDomainRequiredStart) : 0;\r\n const bleedPxEnd = dataDomainRequiredEnd > dataDomain[1] ? this.dataScale(dataDomainRequiredEnd) - this.dataScale(dataDomain[1]) : 0;\r\n return {\r\n top: this.isVertical() ? 0 : (isHorizontalAndFlipped ? -bleedPxEnd : bleedPxStart),\r\n bottom: this.isVertical() ? 0 : (isHorizontalAndFlipped ? -bleedPxStart : bleedPxEnd),\r\n left: this.isVertical() ? bleedPxStart : 0,\r\n right: this.isVertical() ? bleedPxEnd : 0,\r\n };\r\n }\r\n get dataScale() {\r\n return this.isVertical() ? this.xScale : this.yScale;\r\n }\r\n get valueScale() {\r\n return this.isVertical() ? this.yScale : this.xScale;\r\n }\r\n isVertical() {\r\n return this.config.orientation === Orientation.Vertical;\r\n }\r\n _render(customDuration) {\r\n const { config } = this;\r\n const duration = isNumber(customDuration)\r\n ? customDuration\r\n : config.duration;\r\n const groupWidth = this._getGroupWidth();\r\n const yAccessors = this.getAccessors();\r\n const innerBandScaleRange = [-groupWidth / 2, groupWidth / 2];\r\n const innerBandScale = scaleBand()\r\n .domain(range(yAccessors.length))\r\n .range(innerBandScaleRange)\r\n .paddingInner(config.barPadding)\r\n .paddingOuter(config.barPadding);\r\n const barGroups = this.g\r\n .selectAll(`.${barGroup}`)\r\n .data(this._barData, (d, i) => { var _a; return `${(_a = getString(d, config.id, i)) !== null && _a !== void 0 ? _a : i}`; });\r\n const getBarGroupsTransform = (d, i) => {\r\n const v = this.dataScale(getNumber(d, config.x, i));\r\n const x = this.isVertical() ? v : 0;\r\n const y = this.isVertical() ? 0 : v;\r\n return `translate(${x},${y})`;\r\n };\r\n const barGroupsEnter = barGroups\r\n .enter()\r\n .append('g')\r\n .attr('class', barGroup)\r\n .attr('transform', getBarGroupsTransform)\r\n .style('opacity', 1);\r\n const barGroupsMerged = barGroupsEnter.merge(barGroups);\r\n smartTransition(barGroupsMerged, duration)\r\n .attr('transform', getBarGroupsTransform)\r\n .style('opacity', 1);\r\n const barGroupExit$1 = barGroups.exit().attr('class', barGroupExit);\r\n smartTransition(barGroupExit$1, duration).style('opacity', 0).remove();\r\n // Animate exiting bars going down\r\n smartTransition(barGroupExit$1.selectAll(`.${bar}`), duration)\r\n .attr('transform', (d, i, e) => {\r\n return this.isVertical()\r\n ? `translate(0,${this.yScale(0)}) scale(1,0)`\r\n : `translate(${this.xScale(0)},0) scale(0,1)`;\r\n });\r\n const barWidth = innerBandScale.bandwidth();\r\n const bars = barGroupsMerged\r\n .selectAll(`.${bar}`)\r\n .data((d) => yAccessors.map(() => d));\r\n const valueAxisDirection = this._getValueAxisDirection();\r\n const barsEnter = bars\r\n .enter()\r\n .append('path')\r\n .attr('class', bar)\r\n .attr('d', (d, i) => {\r\n const x = innerBandScale(i);\r\n const y = this.valueScale(0);\r\n const width = barWidth;\r\n const height = 0;\r\n return this._getBarPath(x, y, width, height, false, valueAxisDirection);\r\n })\r\n .style('fill', (d, i) => getColor(d, config.color, i));\r\n const barsMerged = barsEnter.merge(bars);\r\n smartTransition(barsMerged, duration)\r\n .attr('d', (d, j) => {\r\n const x = innerBandScale(j);\r\n const width = barWidth;\r\n // Todo: Find a way to pass the datum index to `getNumber` below\r\n const value = getNumber(d, yAccessors[j]);\r\n const isNegative = value < 0;\r\n let y = isNegative ? this.valueScale(0) : this.valueScale(value || 0);\r\n let height = Math.abs(this.valueScale(0) - this.valueScale(value)) || 0;\r\n // Optionally set minimum bar height\r\n if (height < config.barMinHeight) {\r\n const dir = valueAxisDirection === Direction.North ? -1 : 1;\r\n y = this.valueScale(0) + dir * config.barMinHeight;\r\n height = config.barMinHeight;\r\n }\r\n return this._getBarPath(x, y, width, height, isNegative, valueAxisDirection);\r\n })\r\n .style('fill', (d, i) => getColor(d, config.color, i))\r\n .style('cursor', (d, i) => getString(d, config.cursor, i));\r\n smartTransition(bars.exit(), duration).remove();\r\n }\r\n _getValueAxisDirection() {\r\n return this.valueScale.range()[0] > this.valueScale.range()[1]\r\n ? Direction.North\r\n : Direction.South;\r\n }\r\n _getVisibleData() {\r\n const { config, datamodel: { data }, } = this;\r\n const groupWidth = this._getGroupWidth();\r\n const halfGroupWidth = data.length < 2 ? 0 : groupWidth / 2;\r\n const dataScale = this.dataScale;\r\n const xHalfGroupWidth = Math.abs(dataScale.invert(halfGroupWidth) -\r\n dataScale.invert(0));\r\n const filtered = data === null || data === void 0 ? void 0 : data.filter((d, i) => {\r\n const v = getNumber(d, config.x, i);\r\n const domain = dataScale.domain();\r\n const domainMin = +domain[0];\r\n const domainMax = +domain[1];\r\n return (v >= domainMin - xHalfGroupWidth && v <= domainMax + xHalfGroupWidth);\r\n });\r\n return filtered;\r\n }\r\n _getBarPath(x, y, width, height, isNegative, direction) {\r\n const { config } = this;\r\n const cornerRadius = config.roundedCorners\r\n ? isNumber(config.roundedCorners)\r\n ? +config.roundedCorners\r\n : width / 2\r\n : 0;\r\n const cornerRadiusClamped = clamp(cornerRadius, 0, Math.min(height, width) / 2);\r\n const isNorthDirected = direction === Direction.North;\r\n const roundedTop = this.isVertical() && isNegative !== isNorthDirected;\r\n const roundedBottom = this.isVertical() && isNegative === isNorthDirected;\r\n const roundedLeft = !this.isVertical() && isNegative;\r\n const roundedRight = !this.isVertical() && !isNegative;\r\n return roundedRectPath({\r\n x: this.isVertical() ? x : y + (isNorthDirected ? 0 : -height),\r\n y: this.isVertical() ? y + (isNorthDirected ? 0 : -height) : x,\r\n w: this.isVertical() ? width : height,\r\n h: this.isVertical() ? height : width,\r\n tl: roundedTop || roundedLeft,\r\n tr: roundedTop || roundedRight,\r\n bl: roundedBottom || roundedLeft,\r\n br: roundedBottom || roundedRight,\r\n r: cornerRadiusClamped,\r\n });\r\n }\r\n _getGroupWidth() {\r\n const { config, datamodel: { data }, } = this;\r\n if (isEmpty(data))\r\n return 0;\r\n if (config.groupWidth) {\r\n return min([config.groupWidth, config.groupMaxWidth]);\r\n }\r\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\r\n // @ts-ignore\r\n const isOrdinal = this.dataScale.bandwidth;\r\n const domain = (this.dataScale.domain ? this.dataScale.domain() : []);\r\n const domainLength = isOrdinal ? domain.length : domain[1] - domain[0];\r\n // If the dataStep property is provided the amount of data elements is calculates as domainLength / dataStep\r\n // otherwise we get the number of data elements within the domain range\r\n // Or if the scale is ordinal we use data.length\r\n let dataSize = 1 + domainLength / config.dataStep ||\r\n (!isOrdinal &&\r\n data.filter((d, i) => {\r\n const value = getNumber(d, config.x, i);\r\n return value >= domain[0] && value <= domain[1];\r\n }).length) ||\r\n data.length;\r\n // We increase the dataSize by 1 to take into account possible additional domain space\r\n if (!isOrdinal && dataSize >= 2)\r\n dataSize += 1;\r\n const c = dataSize < 2 ? 1 : 1 - config.groupPadding;\r\n const groupWidth = (c * (this.isVertical() ? this._width : this._height)) / dataSize;\r\n return min([groupWidth, config.groupMaxWidth]);\r\n }\r\n getValueScaleExtent(scaleByVisibleData) {\r\n const { datamodel } = this;\r\n const yAccessors = this.getAccessors();\r\n const data = scaleByVisibleData ? this._getVisibleData() : datamodel.data;\r\n const min = getMin(data, ...yAccessors);\r\n const max = getMax(data, ...yAccessors);\r\n return [min > 0 ? 0 : min, max < 0 ? 0 : max];\r\n }\r\n getDataScaleExtent() {\r\n const { config, datamodel } = this;\r\n return getExtent(datamodel.data, config.x);\r\n }\r\n getYDataExtent(scaleByVisibleData) {\r\n return this.isVertical()\r\n ? this.getValueScaleExtent(scaleByVisibleData)\r\n : this.getDataScaleExtent();\r\n }\r\n getXDataExtent() {\r\n return this.isVertical()\r\n ? this.getDataScaleExtent()\r\n : this.getValueScaleExtent(false);\r\n }\r\n}\r\nGroupedBar.selectors = style;\n\nexport { GroupedBar };\n//# sourceMappingURL=index.js.map\n","var TrimMode;\r\n(function (TrimMode) {\r\n TrimMode[\"Start\"] = \"start\";\r\n TrimMode[\"Middle\"] = \"middle\";\r\n TrimMode[\"End\"] = \"end\";\r\n})(TrimMode || (TrimMode = {}));\r\nvar VerticalAlign;\r\n(function (VerticalAlign) {\r\n VerticalAlign[\"Top\"] = \"top\";\r\n VerticalAlign[\"Middle\"] = \"middle\";\r\n VerticalAlign[\"Bottom\"] = \"bottom\";\r\n})(VerticalAlign || (VerticalAlign = {}));\r\nvar FitMode;\r\n(function (FitMode) {\r\n FitMode[\"Wrap\"] = \"wrap\";\r\n FitMode[\"Trim\"] = \"trim\";\r\n})(FitMode || (FitMode = {}));\r\nvar TextAlign;\r\n(function (TextAlign) {\r\n TextAlign[\"Left\"] = \"left\";\r\n TextAlign[\"Center\"] = \"center\";\r\n TextAlign[\"Right\"] = \"right\";\r\n})(TextAlign || (TextAlign = {}));\n\nexport { FitMode, TextAlign, TrimMode, VerticalAlign };\n//# sourceMappingURL=text.js.map\n","import { TextAlign } from './text.js';\n\n/**\r\n * Converts a TextAlign value into an SVG text-anchor attribute value.\r\n *\r\n * @param {TextAlign | string} textAlign - The TextAlign value to convert.\r\n * @returns {'start' | 'middle' | 'end'} The corresponding text-anchor attribute value. Defaults to 'start' if an invalid TextAlign value is provided.\r\n */\r\nfunction getTextAnchorFromTextAlign(textAlign) {\r\n switch (textAlign) {\r\n case TextAlign.Center:\r\n return 'middle';\r\n case TextAlign.Right:\r\n return 'end';\r\n case TextAlign.Left:\r\n default:\r\n return 'start';\r\n }\r\n}\n\nexport { getTextAnchorFromTextAlign };\n//# sourceMappingURL=svg.js.map\n","import { sum } from 'd3-array';\nimport striptags from 'striptags';\nimport { TextAlign, TrimMode, VerticalAlign } from '../types/text.js';\nimport { flatten, isArray, merge } from './data.js';\nimport { getTextAnchorFromTextAlign } from '../types/svg.js';\nimport { getFontWidthToHeightRatio, UNOVIS_TEXT_DEFAULT, UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT, UNOVIS_TEXT_SEPARATOR_DEFAULT } from '../styles/index.js';\n\nconst textAlignToAnchor = (textAlign) => {\r\n switch (textAlign) {\r\n case TextAlign.Left: return 'start';\r\n case TextAlign.Right: return 'end';\r\n case TextAlign.Center: return 'middle';\r\n default: return null;\r\n }\r\n};\r\n/**\r\n * Converts a kebab-case string to camelCase.\r\n *\r\n * @param {string} str - The kebab-case string to be converted.\r\n * @returns {string} The resulting camelCase string.\r\n */\r\nfunction kebabCaseToCamel(str) {\r\n return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\r\n}\r\n/**\r\n * Converts a given string to kebab-case.\r\n * @param {string} str - The input string to be converted to kebab-case.\r\n * @returns {string} - The kebab-cased string.\r\n */\r\nfunction kebabCase(str) {\r\n var _a;\r\n return (_a = str.match(/[A-Z]{2,}(?=[A-Z][a-z0-9]*|\\b)|[A-Z]?[a-z0-9]*|[A-Z]|[0-9]+/g)) === null || _a === void 0 ? void 0 : _a.filter(Boolean).map(x => x.toLowerCase()).join('-');\r\n}\r\nfunction escapeStringKeepHash(str) {\r\n return str\r\n .replace(/['\"]/g, ''') // Escapes quotes with '\r\n // eslint-disable-next-line no-control-regex\r\n .replace(/\\u0000/g, '\\\\0') // Escapes null characters\r\n .replace(/\\n/g, '\\\\n') // Escapes new lines\r\n .replace(/\\r/g, '\\\\r') // Escapes carriage returns\r\n .replace(/\\v/g, '\\\\v') // Escapes vertical tabs\r\n .replace(/\\t/g, '\\\\t') // Escapes horizontal tabs\r\n .replace(/\\f/g, '\\\\f'); // Escapes form feeds\r\n}\r\n/**\r\n * Trims the input string from the start, leaving only the specified maximum length.\r\n * @param {string} str - The input string to be trimmed.\r\n * @param {number} [maxLength=15] - The maximum allowed length of the trimmed string.\r\n * @returns {string} - The trimmed string.\r\n */\r\nfunction trimStringStart(str, maxLength = 15) {\r\n if (!str)\r\n return '';\r\n return str.length > maxLength ? `…${str.substr(str.length - maxLength, maxLength)}` : str;\r\n}\r\n/**\r\n * Trims the input string from the middle, leaving only the specified maximum length.\r\n * @param {string} str - The input string to be trimmed.\r\n * @param {number} [maxLength=15] - The maximum allowed length of the trimmed string.\r\n * @returns {string} - The trimmed string.\r\n */\r\nfunction trimStringMiddle(str, maxLength = 15) {\r\n if (!str)\r\n return '';\r\n const dist = Math.floor((maxLength - 3) / 2);\r\n return str.length > maxLength ? `${str.substr(0, dist)}…${str.substr(-dist, dist)}` : str;\r\n}\r\n/**\r\n * Trims the input string from the end, leaving only the specified maximum length.\r\n * @param {string} str - The input string to be trimmed.\r\n * @param {number} [maxLength=15] - The maximum allowed length of the trimmed string.\r\n * @returns {string} - The trimmed string.\r\n */\r\nfunction trimStringEnd(str, maxLength = 15) {\r\n if (!str)\r\n return '';\r\n return str.length > maxLength ? `${str.substr(0, maxLength)}…` : str;\r\n}\r\n/**\r\n * Trims the input string according to the specified trim mode.\r\n * @param {string} str - The input string to be trimmed.\r\n * @param {number} [length=15] - The maximum allowed length of the trimmed string.\r\n * @param {TrimMode} [type=TrimMode.Middle] - The trim mode to be applied.\r\n * @returns {string} - The trimmed string.\r\n */\r\nfunction trimString(str, length = 15, type = TrimMode.Middle) {\r\n if (!str)\r\n return '';\r\n let result = trimStringEnd(str, length);\r\n if (type === TrimMode.Start)\r\n result = trimStringStart(str, length);\r\n else if (type === TrimMode.Middle)\r\n result = trimStringMiddle(str, length);\r\n return result;\r\n}\r\n/**\r\n * Splits the input string according to the specified separators.\r\n * @param {string} text - The input string to be split.\r\n * @param {string[]} [separators=[' ']] - The array of separators to be used for splitting.\r\n * @returns {string[]} - The array of split words.\r\n */\r\nfunction splitString(text, separators = [' ']) {\r\n let result = [text];\r\n for (let i = 0; i < separators.length; i++) {\r\n const sep = separators[i];\r\n result.forEach((d, index) => {\r\n const separated = d.split(sep);\r\n const words = separated.map((word, j) => `${word}${j === separated.length - 1 ? '' : sep}`);\r\n result[index] = words;\r\n });\r\n result = flatten(result);\r\n }\r\n return result;\r\n}\r\n/**\r\n * Wraps an SVG text element to fit within the specified width.\r\n * @param {Selection<SVGTextElement, any, SVGElement, any>} textElement - The SVG text element to be wrapped.\r\n * @param {number} width - The maximum allowed width for the text element.\r\n * @param {(string | string[])} [separator=[' ', '-', '.', ',']] - The separator(s) to be used for wrapping.\r\n */\r\nfunction wrapSVGText(textElement, width, separator = [' ', '-', '.', ',']) {\r\n const text = textElement.text();\r\n if (!text)\r\n return;\r\n // Wrap\r\n const separators = (isArray(separator) ? separator : [separator]);\r\n const words = splitString(text, separators);\r\n const x = parseFloat(textElement.attr('x')) || 0;\r\n textElement.text('');\r\n let tspan = textElement.append('tspan').attr('x', x);\r\n let tspanContent = `${words[0]}`;\r\n tspan.text(tspanContent);\r\n words.forEach((word, i) => {\r\n if (i === 0)\r\n return;\r\n const tspanText = `${tspanContent}${word}`;\r\n tspan.text(tspanText);\r\n const tspanWidth = tspan.node().getComputedTextLength();\r\n if (tspanWidth > width) {\r\n tspan.text(tspanContent.trim());\r\n tspan = textElement.append('tspan')\r\n .attr('x', x)\r\n .attr('dy', '1.2em')\r\n .text(word);\r\n tspanContent = word;\r\n }\r\n else\r\n tspanContent += word;\r\n });\r\n}\r\n/**\r\n * Trims an SVG text element based on the specified max width, trim type, and other options.\r\n * @param {Selection<SVGTextElement, any, SVGElement, any>} svgTextSelection - The D3 selection of the SVG text element to be trimmed.\r\n * @param {number} [maxWidth=50] - The maximum width of the text element.\r\n * @param {TrimMode} [trimType=TrimMode.Middle] - The type of trim (start, middle, or end).\r\n * @param {boolean} [fastMode=true] - Whether to use a fast estimation method for text length calculation.\r\n * @param {number} [fontSize=0] - The font size of the text.\r\n * @param {number} [fontWidthToHeightRatio=getFontWidthToHeightRatio()] - The font width to height ratio.\r\n * @returns {boolean} True if the text was trimmed, false otherwise.\r\n */\r\nfunction trimSVGText(svgTextSelection, maxWidth, trimType, fastMode, fontSize, fontWidthToHeightRatio) {\r\n var _a;\r\n if (maxWidth === void 0) { maxWidth = 50; }\r\n if (trimType === void 0) { trimType = TrimMode.Middle; }\r\n if (fastMode === void 0) { fastMode = true; }\r\n if (fontSize === void 0) { fontSize = +((_a = window.getComputedStyle(svgTextSelection.node())) === null || _a === void 0 ? void 0 : _a.fontSize) || 0; }\r\n if (fontWidthToHeightRatio === void 0) { fontWidthToHeightRatio = getFontWidthToHeightRatio(); }\r\n const text = svgTextSelection.text() || '';\r\n const textLength = text.length;\r\n const textWidth = fastMode ? fontSize * textLength * fontWidthToHeightRatio : svgTextSelection.node().getComputedTextLength();\r\n const tolerance = 1.1;\r\n const maxCharacters = Math.ceil(textLength * maxWidth / (tolerance * textWidth));\r\n if (maxCharacters < textLength) {\r\n svgTextSelection.text(trimString(text, maxCharacters, trimType));\r\n return true;\r\n }\r\n return false;\r\n}\r\n/**\r\n * Estimates the length of a string in pixels.\r\n * @param {string} str - The string to be measured.\r\n * @param {number} fontSize - The font size of the string.\r\n * @param {number} [fontWidthToHeightRatio=getFontWidthToHeightRatio()] - The font width to height ratio.\r\n * @returns {number} The estimated length of the string in pixels.\r\n */\r\nfunction estimateStringPixelLength(str, fontSize, fontWidthToHeightRatio = getFontWidthToHeightRatio()) {\r\n return str.length * fontSize * fontWidthToHeightRatio || 0;\r\n}\r\n/**\r\n * Calculates the precise length of a string in pixels.\r\n * @param {string} str - The string to be measured.\r\n * @param {string} [fontFamily] - The font family of the string.\r\n * @param {(string | number)} [fontSize] - The font size of the string.\r\n * @returns {number} The precise length of the string in pixels.\r\n */\r\nfunction getPreciseStringLengthPx(str, fontFamily, fontSize) {\r\n const svgNS = 'http://www.w3.org/2000/svg';\r\n const svg = document.createElementNS(svgNS, 'svg');\r\n const text = document.createElementNS(svgNS, 'text');\r\n text.textContent = str;\r\n text.setAttribute('font-size', `${fontSize}`);\r\n text.setAttribute('font-family', fontFamily);\r\n svg.appendChild(text);\r\n document.body.appendChild(svg);\r\n const length = text.getComputedTextLength();\r\n document.body.removeChild(svg);\r\n return length;\r\n}\r\n/**\r\n * Estimates the dimensions of an SVG text element.\r\n *\r\n * @export\r\n * @param {Selection<SVGTextElement, any, SVGElement, any>} svgTextSelection - The D3 selection of the SVG text element.\r\n * @param {number} fontSize - The font size.\r\n * @param {number} [dy=0.32] - The line height scaling factor.\r\n * @param {boolean} [fastMode=true] - Whether to use a fast estimation method or a more accurate one.\r\n * @param {number} [fontWidthToHeightRatio] - The font width-to-height ratio.\r\n * @returns {{width: number, height: number}} - The estimated dimensions of the text element.\r\n */\r\nfunction estimateTextSize(svgTextSelection, fontSize, dy = 0.32, fastMode = true, fontWidthToHeightRatio) {\r\n fontWidthToHeightRatio = fontWidthToHeightRatio || getFontWidthToHeightRatio();\r\n const tspanSelection = svgTextSelection.selectAll('tspan');\r\n const lines = tspanSelection.size() || 1;\r\n const height = svgTextSelection.text() ? 0.85 * fontSize * lines * (1 + dy) - dy : 0;\r\n let width = 0;\r\n if (tspanSelection.empty()) {\r\n const textLength = svgTextSelection.text().length;\r\n width = fastMode ? fontSize * textLength * fontWidthToHeightRatio : svgTextSelection.node().getComputedTextLength();\r\n }\r\n else {\r\n for (const tspan of tspanSelection.nodes()) {\r\n const tspanTextLength = tspan.textContent.length;\r\n const w = fastMode ? fontSize * tspanTextLength * fontWidthToHeightRatio : tspan.getComputedTextLength();\r\n if (w > width)\r\n width = w;\r\n }\r\n }\r\n return { width, height };\r\n}\r\n/**\r\n * Breaks a text block into lines based on the specified width.\r\n *\r\n * @param {UnovisText} textBlock - The text block to break into lines.\r\n * @param {number | undefined} [width=undefined] - The maximum width of a line in pixels.\r\n * @param {(number | undefined)} [height=undefined] - The height limit for the wrapped text in pixels.\r\n * @param {boolean} [fastMode=true] - Whether to use a fast estimation method or a more accurate one.\r\n * @param {string | string[]} [separator] - The word separators.\r\n * @returns {string[]} - The text split into lines.\r\n */\r\nfunction breakTextIntoLines(textBlock, width = undefined, fastMode = true, separator = UNOVIS_TEXT_SEPARATOR_DEFAULT, wordBreak = false) {\r\n var _a, _b, _c;\r\n const text = `${textBlock.text}`;\r\n if (!text)\r\n return [];\r\n const fontSize = (_a = textBlock.fontSize) !== null && _a !== void 0 ? _a : UNOVIS_TEXT_DEFAULT.fontSize;\r\n const fontFamily = (_b = textBlock.fontFamily) !== null && _b !== void 0 ? _b : UNOVIS_TEXT_DEFAULT.fontFamily;\r\n const fontWidthToHeightRatio = (_c = textBlock.fontWidthToHeightRatio) !== null && _c !== void 0 ? _c : UNOVIS_TEXT_DEFAULT.fontWidthToHeightRatio;\r\n const separators = Array.isArray(separator) ? separator : [separator];\r\n const splitByNewLine = text.split('\\n');\r\n return splitByNewLine.map((str) => {\r\n const lines = [];\r\n if (!width)\r\n return [str];\r\n const words = splitString(str, separators);\r\n let line = '';\r\n for (let i = 0; i < words.length; i += 1) {\r\n const textLengthPx = fastMode\r\n ? estimateStringPixelLength(line + words[i], fontSize, fontWidthToHeightRatio)\r\n : getPreciseStringLengthPx(line + words[i], fontFamily, fontSize);\r\n if (textLengthPx < width || i === 0) {\r\n line += words[i];\r\n }\r\n else {\r\n lines.push(line.trim());\r\n line = words[i];\r\n }\r\n // Word break functionality\r\n const minCharactersOnLine = 2;\r\n if (wordBreak) {\r\n while (line.trim().length > minCharactersOnLine) {\r\n const subLineLengthPx = fastMode\r\n ? estimateStringPixelLength(line, fontSize, fontWidthToHeightRatio)\r\n : getPreciseStringLengthPx(line, fontFamily, fontSize);\r\n if (subLineLengthPx > width) {\r\n let breakIndex = (line.trim()).length - minCharactersOnLine; // Place at least `minCharactersOnLine` characters onto the next line\r\n while (breakIndex > 0) {\r\n const subLine = `${line.substring(0, breakIndex)}${UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT}`; // Use hyphen when force breaking words\r\n const subLinePx = fastMode\r\n ? estimateStringPixelLength(subLine, fontSize, fontWidthToHeightRatio)\r\n : getPreciseStringLengthPx(subLine, fontFamily, fontSize);\r\n // If the subline is less than the width, or just one character left, break the line\r\n if (subLinePx <= width || breakIndex === 1) {\r\n lines.push(subLine.trim());\r\n line = line.substring(breakIndex);\r\n break;\r\n }\r\n breakIndex--;\r\n }\r\n }\r\n else {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n // Adding the final line after the loop\r\n if (line)\r\n lines.push(line.trim());\r\n return lines;\r\n }).flat();\r\n}\r\n/**\r\n * Wraps a text or array of texts to fit within specified width and height, if provided.\r\n *\r\n * @export\r\n * @param {UnovisText | UnovisText[]} text - The text or array of texts to wrap.\r\n * @param {number | undefined} [width=undefined] - The maximum width of a line in pixels.\r\n * @param {boolean} [fastMode=true] - Whether to use a fast estimation method or a more accurate one.\r\n * @param {string | string[]} [separator] - The word separators.\r\n * @returns {UnovisWrappedText[]} - The wrapped texts.\r\n */\r\nfunction getWrappedText(text, width = undefined, height = undefined, fastMode = true, separator = UNOVIS_TEXT_SEPARATOR_DEFAULT, wordBreak = false) {\r\n // Merge input text with default values and convert it to an array if it's not already\r\n const textArrays = Array.isArray(text) ? text.map(t => merge(UNOVIS_TEXT_DEFAULT, t)) : [merge(UNOVIS_TEXT_DEFAULT, text)];\r\n // Break input text into lines based on width and separator\r\n const textWrapped = textArrays.map(block => breakTextIntoLines(block, width, fastMode, separator, wordBreak));\r\n const firstBlock = textArrays[0];\r\n let h = -firstBlock.fontSize * (firstBlock.lineHeight - 1);\r\n const blocks = [];\r\n // Process each text block and its lines based on height limit\r\n textArrays.forEach((text, i) => {\r\n var _a;\r\n let lines = textWrapped[i];\r\n const prevBlock = i > 0 ? blocks[i - 1] : undefined;\r\n const prevBlockMarginBottomPx = prevBlock ? prevBlock.marginBottom : 0;\r\n const marginTopPx = text.marginTop;\r\n const effectiveMarginPx = Math.max(prevBlockMarginBottomPx, marginTopPx);\r\n h += effectiveMarginPx;\r\n const dh = text.fontSize * text.lineHeight;\r\n let maxWidth = 0;\r\n // Iterate over lines and handle text overflow based on the height limit if provided\r\n for (let k = 0; k < lines.length; k += 1) {\r\n let line = lines[k];\r\n h += dh;\r\n const lineWithEllipsis = `${line} …`;\r\n const textLengthPx = fastMode\r\n ? estimateStringPixelLength(lineWithEllipsis, text.fontSize, text.fontWidthToHeightRatio)\r\n : getPreciseStringLengthPx(lineWithEllipsis, text.fontFamily, text.fontSize);\r\n maxWidth = Math.max(textLengthPx, maxWidth);\r\n if (height && (h + dh) > height && (k !== lines.length - 1)) {\r\n // Remove hyphen character from the end of the line if it's there\r\n const lastCharacter = line.charAt(line.length - 1);\r\n if (lastCharacter === UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT) {\r\n line = line.substr(0, lines[k].length - 1);\r\n }\r\n if (textLengthPx < width) {\r\n lines[k] = lineWithEllipsis;\r\n }\r\n else {\r\n lines[k] = `${lines[k].substr(0, lines[k].length - 2)}…`;\r\n }\r\n lines = lines.slice(0, k + 1);\r\n break;\r\n }\r\n }\r\n // Create wrapped text block with its calculated properties\r\n blocks.push(Object.assign(Object.assign({}, text), { _lines: lines, _estimatedHeight: h - ((prevBlock === null || prevBlock === void 0 ? void 0 : prevBlock._estimatedHeight) || 0), _maxWidth: Math.max(maxWidth, (_a = prevBlock === null || prevBlock === void 0 ? void 0 : prevBlock._maxWidth) !== null && _a !== void 0 ? _a : 0) }));\r\n });\r\n return blocks;\r\n}\r\n/**\r\n * Renders a text or array of texts to SVG tspan strings.\r\n *\r\n * @param {UnovisWrappedText[]} blocks - The wrapped text blocks.\r\n * @param {number} [x=0] - The x-coordinate for the tspan elements.\r\n * @param {number} [y] - The y-coordinate for the tspan elements.\r\n * @returns {string[]} - The SVG tspan strings.\r\n */\r\nfunction renderTextToTspanStrings(blocks, x = 0, y, dominantBaseline) {\r\n return blocks.map((b, i) => {\r\n const prevBlock = i > 0 ? blocks[i - 1] : undefined;\r\n const prevBlockMarginBottomEm = prevBlock ? prevBlock.marginBottom / prevBlock.fontSize : 0;\r\n const marginTopEm = b.marginTop / b.fontSize;\r\n const marginEm = Math.max(prevBlockMarginBottomEm, marginTopEm);\r\n const attributes = {\r\n fontSize: b.fontSize,\r\n fontFamily: b.fontFamily,\r\n fontWeight: b.fontWeight,\r\n fill: b.color,\r\n y: (i === 0) && y,\r\n };\r\n const attributesString = Object.entries(attributes)\r\n .filter(([_, value]) => value)\r\n .map(([key, value]) => `${kebabCase(key)}=\"${escapeStringKeepHash(value.toString())}\"`)\r\n .join(' ');\r\n return `<tspan xmlns=\"http://www.w3.org/2000/svg\" ${attributesString}>${b._lines.map((line, k) => {\r\n let dy;\r\n if (i === 0 && k === 0)\r\n dy = marginEm;\r\n else if (k === 0)\r\n dy = marginEm + b.lineHeight;\r\n else\r\n dy = b.lineHeight;\r\n return `<tspan x=\"${x}\" dy=\"${dy}em\" dominant-baseline=\"${dominantBaseline !== null && dominantBaseline !== void 0 ? dominantBaseline : 'auto'}\">${line.length ? line : ' '}</tspan>`;\r\n }).join('')}</tspan>`;\r\n });\r\n}\r\n/**\r\n * Estimates the height of wrapped text blocks.\r\n *\r\n * @export\r\n * @param {UnovisWrappedText[]} blocks - The wrapped text blocks.\r\n * @returns {number} - The estimated height of the wrapped text blocks.\r\n */\r\nfunction estimateWrappedTextHeight(blocks) {\r\n return sum(blocks, b => b._estimatedHeight);\r\n}\r\nconst allowedSvgTextTags = ['text', 'tspan', 'textPath', 'altGlyph', 'altGlyphDef', 'altGlyphItem', 'glyphRef', 'textRef', 'textArea'];\r\n/**\r\n * Renders a text or array of texts to an SVG text element.\r\n * Calling this function will replace the contents of the specified SVG text element.\r\n *\r\n * @export\r\n * @param {SVGTextElement} textElement - The SVG text element to render the text into.\r\n * @param {UnovisText | UnovisText[]} text - The text or array of texts to render.\r\n * @param {UnovisTextOptions} options - The text options.\r\n */\r\nfunction renderTextToSvgTextElement(textElement, text, options, \r\n// Dominant baseline sets alignment for a line of text, whereas\r\n// the `options.verticalAlign` property sets alignment for the entire text block\r\n// shifting it vertically, irrespective of the dominant baseline.\r\ndominantBaseline) {\r\n var _a, _b;\r\n const wrappedText = getWrappedText(text, options.width, undefined, options.fastMode, options.separator, options.wordBreak);\r\n const textElementX = (_a = options.x) !== null && _a !== void 0 ? _a : +textElement.getAttribute('x');\r\n const textElementY = (_b = options.y) !== null && _b !== void 0 ? _b : +textElement.getAttribute('y');\r\n const x = textElementX !== null && textElementX !== void 0 ? textElementX : 0;\r\n let y = textElementY !== null && textElementY !== void 0 ? textElementY : 0;\r\n if (options.textAlign) {\r\n textElement.setAttribute('text-anchor', getTextAnchorFromTextAlign(options.textAlign));\r\n }\r\n if (options.verticalAlign && options.verticalAlign !== VerticalAlign.Top) {\r\n const height = estimateWrappedTextHeight(wrappedText);\r\n const dy = options.verticalAlign === VerticalAlign.Middle ? -height / 2\r\n : options.verticalAlign === VerticalAlign.Bottom ? -height : 0;\r\n y += dy;\r\n }\r\n if (options.textRotationAngle) {\r\n textElement.setAttribute('transform', `rotate(${(options.textRotationAngle === 0 || options.textRotationAngle) ? options.textRotationAngle : 0} ${x} ${y})`);\r\n }\r\n else {\r\n textElement.removeAttribute('transform');\r\n }\r\n const parser = new DOMParser();\r\n textElement.textContent = '';\r\n wrappedText.forEach(block => {\r\n const svgCode = renderTextToTspanStrings([block], x, y, dominantBaseline).join('');\r\n const svgCodeSanitized = striptags(svgCode, allowedSvgTextTags);\r\n const parsedSvgCode = parser.parseFromString(svgCodeSanitized, 'image/svg+xml').firstChild;\r\n textElement.appendChild(parsedSvgCode);\r\n });\r\n}\r\n/**\r\n * Renders a text or array of texts into a frame.\r\n * Calling this function will replace the contents of the specified SVG group.\r\n *\r\n * @export\r\n * @param {SVGGElement} group - The SVG group element to render the text into.\r\n * @param {UnovisText | UnovisText[]} text - The text or array of texts to render.\r\n * @param {UnovisTextFrameOptions} frameOptions - The text frame options.\r\n */\r\nfunction renderTextIntoFrame(group, text, frameOptions) {\r\n var _a, _b;\r\n const wrappedText = getWrappedText(text, frameOptions.width, frameOptions.height, frameOptions.fastMode, frameOptions.separator, frameOptions.wordBreak);\r\n const x = frameOptions.textAlign === TextAlign.Center ? frameOptions.width / 2\r\n : frameOptions.textAlign === TextAlign.Right ? frameOptions.width : 0;\r\n let y = 0;\r\n const height = estimateWrappedTextHeight(wrappedText);\r\n // If the frame has height, the text will be vertically aligned within the frame.\r\n // If not, the text will be aligned against the `y` position of the frame.\r\n const dh = frameOptions.height - height;\r\n y = frameOptions.verticalAlign === VerticalAlign.Middle ? dh / 2\r\n : frameOptions.verticalAlign === VerticalAlign.Bottom ? dh : 0;\r\n const translate = (frameOptions.x || frameOptions.y)\r\n ? `transform=\"translate(${(_a = frameOptions.x) !== null && _a !== void 0 ? _a : 0},${(_b = frameOptions.y) !== null && _b !== void 0 ? _b : 0})\"`\r\n : '';\r\n const svgCode = `<text\n xmlns=\"http://www.w3.org/2000/svg\"\n text-anchor=\"${getTextAnchorFromTextAlign(frameOptions.textAlign)}\"\n ${translate}\n >\n ${renderTextToTspanStrings(wrappedText, x, y, 'hanging').join('')}\n </text>`;\r\n const parser = new DOMParser();\r\n const svgCodeSanitized = striptags(svgCode, allowedSvgTextTags);\r\n const parsedSvgCode = parser.parseFromString(svgCodeSanitized, 'image/svg+xml').firstChild;\r\n group.textContent = '';\r\n group.appendChild(parsedSvgCode);\r\n}\n\nexport { allowedSvgTextTags, escapeStringKeepHash, estimateStringPixelLength, estimateTextSize, estimateWrappedTextHeight, getPreciseStringLengthPx, getWrappedText, kebabCase, kebabCaseToCamel, renderTextIntoFrame, renderTextToSvgTextElement, splitString, textAlignToAnchor, trimSVGText, trimString, trimStringEnd, trimStringMiddle, trimStringStart, wrapSVGText };\n//# sourceMappingURL=text.js.map\n","import { XYComponentDefaultConfig } from '../../core/xy-component/config.js';\nimport { FitMode, TrimMode } from '../../types/text.js';\n\nconst AxisDefaultConfig = Object.assign(Object.assign({}, XYComponentDefaultConfig), { position: undefined, type: undefined, label: undefined, labelFontSize: null, labelTextFitMode: FitMode.Wrap, labelTextTrimType: TrimMode.Middle, gridLine: true, tickLine: true, domainLine: true, numTicks: undefined, minMaxTicksOnly: false, minMaxTicksOnlyWhenWidthIsLess: 250, minMaxTicksOnlyShowGridLines: false, tickTextWidth: undefined, tickTextSeparator: undefined, tickTextForceWordBreak: false, tickTextTrimType: TrimMode.Middle, tickTextFitMode: FitMode.Wrap, tickTextFontSize: null, tickTextAlign: undefined, tickTextColor: null, tickTextAngle: undefined, labelMargin: 8, labelColor: null, tickFormat: undefined, tickValues: undefined, fullSize: true, tickPadding: 8, tickTextHideOverlapping: undefined });\n\nexport { AxisDefaultConfig };\n//# sourceMappingURL=config.js.map\n","import { injectGlobal } from '@emotion/css';\nimport { kebabCaseToCamel } from './text.js';\n\nfunction getCssVarNames(cssVarsObject, prefix) {\r\n const defaultPrefix = '--vis-';\r\n const entries = Object.entries(cssVarsObject);\r\n return Object.fromEntries(entries.map(([key]) => [kebabCaseToCamel(key.replace(prefix !== null && prefix !== void 0 ? prefix : defaultPrefix, '')), key]));\r\n}\r\nfunction injectGlobalCssVariables(cssVarsObject, componentRootClassName) {\r\n injectGlobal({\r\n ':root': cssVarsObject,\r\n [`body.theme-dark .${componentRootClassName}`]: Object.keys(cssVarsObject)\r\n .filter(key => key.includes('--vis-dark'))\r\n .map(key => ({\r\n [key.replace('--vis-dark', '--vis')]: `var(${key})`,\r\n })),\r\n });\r\n}\r\nfunction cssvar(name) {\r\n return `var(${name})`;\r\n}\n\nexport { cssvar, getCssVarNames, injectGlobalCssVariables };\n//# sourceMappingURL=style.js.map\n","import { css } from '@emotion/css';\nimport { getCssVarNames, injectGlobalCssVariables } from '../../utils/style.js';\n\nconst root = css `\n label: axis-component;\n`;\r\nconst cssVarDefaults = {\r\n // Undefined by default to allow proper fallback to var(--vis-font-family)\r\n /* --vis-axis-font-family: */\r\n '--vis-axis-tick-color': '#e8e9ef',\r\n /* --vis-axis-domain-color: // Undefined by default to allow fallback to var(--vis-axis-tick-color) */\r\n '--vis-axis-grid-color': '#e8e9ef',\r\n '--vis-axis-grid-line-width': '1px',\r\n '--vis-axis-grid-line-dasharray': 'none',\r\n '--vis-axis-label-font-size': '14px',\r\n '--vis-axis-label-color': '#6c778c',\r\n '--vis-axis-label-weight': '500',\r\n '--vis-axis-tick-label-color': '#6c778c',\r\n '--vis-axis-tick-label-font-size': '12px',\r\n '--vis-axis-tick-label-weight': '500',\r\n '--vis-axis-tick-label-cursor': 'default',\r\n '--vis-axis-tick-label-text-decoration': 'none',\r\n '--vis-axis-tick-line-width': '1px',\r\n '--vis-axis-tick-label-hide-transition': 'opacity 400ms ease-in-out',\r\n /* --vis-axis-domain-line-width: // Undefined by default to allow fallback to var(--vis-axis-grid-line-width) */\r\n '--vis-dark-axis-tick-color': '#6c778c',\r\n /* --vis-dark-axis-domain-color: // Undefined by default to allow fallback to var(--vis-dark-axis-tick-color) */\r\n '--vis-dark-axis-tick-label-color': '#e8e9ef',\r\n '--vis-dark-axis-grid-color': '#6c778c',\r\n '--vis-dark-axis-label-color': '#fefefe',\r\n};\r\nconst variables = getCssVarNames(cssVarDefaults);\r\ninjectGlobalCssVariables(cssVarDefaults, root);\r\nconst hideTickLine = css `\n label: hide-tick-line;\n`;\r\nconst hideDomain = css `\n label: hide-domain;\n`;\r\nconst axis = css `\n label: axis;\n\n user-select: none;\n\n .domain {\n stroke: var(--vis-axis-domain-color, var(--vis-axis-tick-color));\n stroke-width: var(--vis-axis-domain-line-width, var(--vis-axis-grid-line-width));\n stroke-dasharray: var(--vis-axis-domain-line-dasharray, var(--vis-axis-grid-line-dasharray));\n }\n\n &${`.${hideTickLine}`} {\n .tick > line {\n opacity: 0;\n }\n }\n\n &${`.${hideDomain}`} {\n .domain {\n opacity: 0;\n }\n }\n`;\r\nconst grid = css `\n label: grid;\n\n .domain {\n opacity: 0;\n }\n\n line {\n stroke: var(--vis-axis-grid-color);\n stroke-width: var(--vis-axis-grid-line-width);\n stroke-dasharray: var(--vis-axis-grid-line-dasharray);\n }\n`;\r\nconst tick = css `\n label: tick;\n\n stroke: none;\n font-size: var(--vis-axis-tick-label-font-size);\n font-weight: var(--vis-axis-tick-label-weight);\n\n line {\n stroke: var(--vis-axis-tick-color);\n stroke-width: var(--vis-axis-tick-line-width);\n }\n\n text {\n fill: var(--vis-axis-tick-label-color);\n cursor: var(--vis-axis-tick-label-cursor);\n font-family: var(--vis-axis-font-family, var(--vis-font-family));\n text-decoration: var(--vis-axis-tick-label-text-decoration);\n stroke: none;\n }\n`;\r\nconst tickTextExiting = css `\n label: tick-text-exiting;\n`;\r\nconst label = css `\n label: label;\n fill: var(--vis-axis-label-color);\n font-size: var(--vis-axis-label-font-size);\n font-weight: var(--vis-axis-label-weight);\n font-family: var(--vis-axis-font-family, var(--vis-font-family));\n text-anchor: middle;\n`;\r\nconst tickLabel = css `\n label: tick-label;\n`;\r\nconst tickLabelHideable = css `\n label: tick-label-hideable;\n opacity: 0;\n transition: var(--vis-axis-tick-label-hide-transition);\n`;\n\nexport { axis, cssVarDefaults, grid, hideDomain, hideTickLine, label, root, tick, tickLabel, tickLabelHideable, tickTextExiting, variables };\n//# sourceMappingURL=style.js.map\n","import { select } from 'd3-selection';\nimport { interrupt } from 'd3-transition';\nimport { axisLeft, axisRight, axisBottom, axisTop } from 'd3-axis';\nimport { XYComponentCore } from '../../core/xy-component/index.js';\nimport { Position } from '../../types/position.js';\nimport { VerticalAlign, FitMode, TextAlign } from '../../types/text.js';\nimport { smartTransition } from '../../utils/d3.js';\nimport { trimSVGText, renderTextToSvgTextElement, wrapSVGText, textAlignToAnchor } from '../../utils/text.js';\nimport { isEqual } from '../../utils/data.js';\nimport { rectIntersect } from '../../utils/misc.js';\nimport { getFontWidthToHeightRatio } from '../../styles/index.js';\nimport { AxisType } from './types.js';\nimport { AxisDefaultConfig } from './config.js';\nimport * as style from './style.js';\nimport { grid, tick, tickLabel, tickLabelHideable, tickTextExiting, axis, hideTickLine, hideDomain, label } from './style.js';\n\nclass Axis extends XYComponentCore {\r\n constructor(config) {\r\n super();\r\n this._defaultConfig = AxisDefaultConfig;\r\n this.config = this._defaultConfig;\r\n this._defaultNumTicks = 3;\r\n this.events = {};\r\n if (config)\r\n this.setConfig(config);\r\n this.axisGroup = this.g.append('g');\r\n this.gridGroup = this.g.append('g')\r\n .attr('class', grid);\r\n }\r\n /** Renders axis to an invisible grouped to calculate automatic chart margins */\r\n preRender() {\r\n const { config } = this;\r\n const axisRenderHelperGroup = this.g.append('g').attr('opacity', 0);\r\n this._renderAxis(axisRenderHelperGroup, 0);\r\n // Store axis raw BBox (without the label) for further label positioning (see _renderAxisLabel)\r\n this._axisRawBBox = axisRenderHelperGroup.node().getBBox();\r\n // Align tick text\r\n if (config.tickTextAlign)\r\n this._alignTickLabels();\r\n // Render label and store total axis size and required margins\r\n this._renderAxisLabel(axisRenderHelperGroup);\r\n this._axisSizeBBox = this._getAxisSize(axisRenderHelperGroup);\r\n this._requiredMargin = this._getRequiredMargin(this._axisSizeBBox);\r\n axisRenderHelperGroup.remove();\r\n }\r\n getPosition() {\r\n const { config: { type, position } } = this;\r\n return (position !== null && position !== void 0 ? position : ((type === AxisType.X) ? Position.Bottom : Position.Left));\r\n }\r\n _getAxisSize(selection) {\r\n const bBox = selection.node().getBBox();\r\n return bBox;\r\n }\r\n _getRequiredMargin(axisSize = this._axisSizeBBox) {\r\n const { config: { type, position } } = this;\r\n switch (type) {\r\n case AxisType.X: {\r\n const tolerancePx = 1;\r\n const xEnd = this._axisSizeBBox.x + this._axisSizeBBox.width;\r\n const left = this._axisSizeBBox.x < 0 ? Math.abs(this._axisSizeBBox.x) : 0;\r\n const right = (xEnd - this._width) > tolerancePx ? xEnd - this._width : 0;\r\n switch (position) {\r\n case Position.Top: return { top: axisSize.height, left, right };\r\n case Position.Bottom:\r\n default: return { bottom: axisSize.height, left, right };\r\n }\r\n }\r\n case AxisType.Y: {\r\n const bleedY = axisSize.height > this._height ? (axisSize.height - this._height) / 2 : 0;\r\n const top = bleedY;\r\n const bottom = bleedY;\r\n switch (position) {\r\n case Position.Right: return { right: axisSize.width, top, bottom };\r\n case Position.Left:\r\n default: return { left: axisSize.width, top, bottom };\r\n }\r\n }\r\n }\r\n }\r\n getRequiredMargin() {\r\n return this._requiredMargin;\r\n }\r\n /** Calculates axis transform:translate offset based on passed container margins */\r\n getOffset(containerMargin) {\r\n const { config: { type, position } } = this;\r\n switch (type) {\r\n case AxisType.X:\r\n switch (position) {\r\n case Position.Top: return { top: containerMargin.top, left: containerMargin.left };\r\n case Position.Bottom:\r\n default: return { top: containerMargin.top + this._height, left: containerMargin.left };\r\n }\r\n case AxisType.Y:\r\n switch (position) {\r\n case Position.Right: return { top: containerMargin.top, left: containerMargin.left + this._width };\r\n case Position.Left:\r\n default: return { top: containerMargin.top, left: containerMargin.left };\r\n }\r\n }\r\n }\r\n _render(duration = this.config.duration, selection = this.axisGroup) {\r\n const { config } = this;\r\n this._renderAxis(selection, duration);\r\n this._renderAxisLabel(selection);\r\n if (config.gridLine) {\r\n const gridGen = this._buildGrid();\r\n // Interrupting all active transitions first to prevent them from being stuck.\r\n // Somehow we see it happening in Angular apps.\r\n this.gridGroup.selectAll('*').interrupt();\r\n smartTransition(this.gridGroup, duration).call(gridGen).style('opacity', 1);\r\n }\r\n else {\r\n smartTransition(this.gridGroup, duration).style('opacity', 0);\r\n }\r\n if (config.tickTextAlign)\r\n this._alignTickLabels();\r\n this._resolveTickLabelOverlap(selection);\r\n }\r\n _buildAxis() {\r\n const { config: { type, position, tickPadding } } = this;\r\n const ticks = this._getNumTicks();\r\n switch (type) {\r\n case AxisType.X:\r\n switch (position) {\r\n case Position.Top: return axisTop(this.xScale).ticks(ticks).tickPadding(tickPadding);\r\n case Position.Bottom:\r\n default: return axisBottom(this.xScale).ticks(ticks).tickPadding(tickPadding);\r\n }\r\n case AxisType.Y:\r\n switch (position) {\r\n case Position.Right: return axisRight(this.yScale).ticks(ticks).tickPadding(tickPadding);\r\n case Position.Left:\r\n default: return axisLeft(this.yScale).ticks(ticks).tickPadding(tickPadding);\r\n }\r\n }\r\n }\r\n _buildGrid() {\r\n const { config } = this;\r\n let gridGen;\r\n switch (config.type) {\r\n case AxisType.X:\r\n switch (config.position) {\r\n case Position.Top: {\r\n gridGen = axisTop(this.xScale);\r\n break;\r\n }\r\n case Position.Bottom:\r\n default: {\r\n gridGen = axisBottom(this.xScale);\r\n break;\r\n }\r\n }\r\n gridGen.tickSize(-this._height);\r\n break;\r\n case AxisType.Y:\r\n switch (config.position) {\r\n case Position.Right: {\r\n gridGen = axisRight(this.yScale);\r\n break;\r\n }\r\n case Position.Left:\r\n default: {\r\n gridGen = axisLeft(this.yScale);\r\n break;\r\n }\r\n }\r\n gridGen.tickSize(-this._width);\r\n }\r\n gridGen\r\n .tickSizeOuter(0)\r\n .tickFormat(() => '');\r\n const numTicks = this._getNumTicks() * 2;\r\n const gridScale = gridGen.scale();\r\n const scaleDomain = gridScale.domain();\r\n const getGridMinMaxTicksOnlyValues = () => {\r\n if (!config.minMaxTicksOnlyShowGridLines)\r\n return scaleDomain;\r\n const tickValues = gridScale.ticks(numTicks);\r\n if (tickValues.length < 2)\r\n return scaleDomain;\r\n // If the last tick is far enough from the domain max value, we add it to the tick values to draw the grid line\r\n const tickValuesStep = +tickValues[1] - +tickValues[0];\r\n const domainMaxValue = scaleDomain[1];\r\n const diff = +domainMaxValue - +tickValues[tickValues.length - 1];\r\n return diff > tickValuesStep / 2 ? [...tickValues, domainMaxValue] : tickValues;\r\n };\r\n const tickValues = config.tickValues\r\n ? this._getConfiguredTickValues()\r\n : this._shouldRenderMinMaxTicksOnly()\r\n ? getGridMinMaxTicksOnlyValues()\r\n : gridScale.ticks(numTicks);\r\n gridGen.tickValues(tickValues);\r\n return gridGen;\r\n }\r\n _renderAxis(selection = this.axisGroup, duration = this.config.duration) {\r\n const { config } = this;\r\n const axisGen = this._buildAxis();\r\n const axisScale = axisGen.scale();\r\n const tickValues = config.tickValues\r\n ? this._getConfiguredTickValues()\r\n : this._shouldRenderMinMaxTicksOnly()\r\n ? axisScale.domain()\r\n : axisScale.ticks(this._getNumTicks());\r\n const tickCount = tickValues.length;\r\n axisGen.tickValues(tickValues);\r\n // Interrupting all active transitions first to prevent them from being stuck.\r\n // Somehow we see it happening in Angular apps.\r\n selection.selectAll('*').interrupt();\r\n const transition = smartTransition(selection, duration).call(axisGen);\r\n // Unset D3's default y and dy attributes because we're going to set them manually in the renderTextToSvgTextElement function\r\n selection.selectAll('text')\r\n .attr('dy', null)\r\n .attr('y', null);\r\n // Resolving tick label overlap after the animation is over\r\n transition.on('end', () => {\r\n this._resolveTickLabelOverlap(selection);\r\n });\r\n const ticks = selection.selectAll('g.tick');\r\n ticks\r\n .classed(tick, true)\r\n .style('font-size', config.tickTextFontSize);\r\n // Selecting the <text> elements of the ticks to apply formatting. By default, this selection\r\n // will include exiting elements, so we're filtering them out.\r\n const tickText = selection.selectAll('g.tick > text')\r\n .filter(tickValue => tickValues.some((t) => isEqual(tickValue, t))) // We use isEqual to compare Dates\r\n .classed(tickLabel, true)\r\n .classed(tickLabelHideable, Boolean(config.tickTextHideOverlapping))\r\n .style('fill', config.tickTextColor);\r\n // Marking exiting elements\r\n selection.selectAll('g.tick > text')\r\n .filter(tickValue => !tickValues.some((t) => isEqual(tickValue, t)))\r\n .classed(tickTextExiting, true);\r\n // We interrupt the transition on tick's <text> to make it 'wrappable'\r\n tickText.nodes().forEach(node => interrupt(node));\r\n const tickSize = axisGen.tickSize();\r\n const axisPosition = this.getPosition();\r\n const textMaxWidth = config.tickTextWidth || (config.type === AxisType.X ? this._containerWidth / (tickCount + 1) : this._containerWidth / 5);\r\n tickText.each((value, i, elements) => {\r\n var _a, _b;\r\n let text = (_b = (_a = config.tickFormat) === null || _a === void 0 ? void 0 : _a.call(config, value, i, tickValues)) !== null && _b !== void 0 ? _b : `${value}`;\r\n const textElement = elements[i];\r\n // Get and cache the tick text style\r\n if (!this._tickTextStyleCached) {\r\n const styleDeclaration = getComputedStyle(textElement);\r\n this._tickTextStyleCached = {\r\n fontSize: Number.parseFloat(styleDeclaration.fontSize),\r\n fontFamily: styleDeclaration.fontFamily,\r\n fontWidthToHeightRatio: getFontWidthToHeightRatio(),\r\n };\r\n }\r\n // Calculate the text offset based on the axis position and the tick size\r\n const [textOffsetX, textOffsetY] = this._getTickTextOffset(axisPosition, tickSize, this._tickTextStyleCached.fontSize);\r\n // Prepare the Unovis text options\r\n const textOptions = {\r\n verticalAlign: config.type === AxisType.X ? VerticalAlign.Top : VerticalAlign.Middle,\r\n width: textMaxWidth,\r\n textRotationAngle: config.tickTextAngle,\r\n separator: config.tickTextSeparator,\r\n wordBreak: config.tickTextForceWordBreak,\r\n x: textOffsetX,\r\n y: textOffsetY,\r\n };\r\n if (config.tickTextFitMode === FitMode.Trim) {\r\n const textElementSelection = select(textElement).text(text);\r\n trimSVGText(textElementSelection, textMaxWidth, config.tickTextTrimType, true, this._tickTextStyleCached.fontSize, 0.58);\r\n text = select(textElement).text();\r\n }\r\n const textBlock = Object.assign({ text }, this._tickTextStyleCached);\r\n const dominantBaseline = config.type === AxisType.X ? 'central' : 'hanging';\r\n renderTextToSvgTextElement(textElement, textBlock, textOptions, dominantBaseline);\r\n });\r\n selection\r\n .classed(axis, true)\r\n .classed(hideTickLine, !config.tickLine)\r\n .classed(hideDomain, !config.domainLine);\r\n if (config.fullSize) {\r\n const path = this._getFullDomainPath(0);\r\n smartTransition(selection.select('.domain'), duration).attr('d', path);\r\n }\r\n }\r\n _resolveTickLabelOverlap(selection = this.axisGroup) {\r\n const { config } = this;\r\n const tickTextSelection = selection.selectAll(`g.tick > text:not(.${tickTextExiting})`);\r\n if (!config.tickTextHideOverlapping) {\r\n tickTextSelection.style('opacity', null);\r\n return;\r\n }\r\n cancelAnimationFrame(this._collideTickLabelsAnimFrameId);\r\n // Colliding labels in the next frame to prevent forced reflow\r\n this._collideTickLabelsAnimFrameId = requestAnimationFrame(() => {\r\n this._collideTickLabels(tickTextSelection);\r\n });\r\n }\r\n _collideTickLabels(selection) {\r\n // Reset visibility of all labels\r\n selection.each((d, i, elements) => {\r\n const node = elements[i];\r\n node._visible = true;\r\n });\r\n // We do three iterations because not all overlapping labels can be resolved in the first iteration\r\n const numIterations = 3;\r\n for (let i = 0; i < numIterations; i += 1) {\r\n // Run collision detection and set labels visibility\r\n selection.each((d, i, elements) => {\r\n const label1 = elements[i];\r\n const isLabel1Visible = label1._visible;\r\n if (!isLabel1Visible)\r\n return;\r\n // Calculate bounding rect of point's label\r\n const label1BoundingRect = label1.getBoundingClientRect();\r\n for (let j = i + 1; j < elements.length; j += 1) {\r\n if (i === j)\r\n continue;\r\n const label2 = elements[j];\r\n const isLabel2Visible = label2._visible;\r\n if (isLabel2Visible) {\r\n const label2BoundingRect = label2.getBoundingClientRect();\r\n const intersect = rectIntersect(label1BoundingRect, label2BoundingRect, -5);\r\n if (intersect) {\r\n label2._visible = false;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n // Hide the overlapping labels\r\n selection.each((d, i, elements) => {\r\n const label = elements[i];\r\n select(label).style('opacity', label._visible ? 1 : 0);\r\n });\r\n }\r\n _getNumTicks() {\r\n const { config: { type, numTicks } } = this;\r\n if (numTicks)\r\n return numTicks;\r\n if (type === AxisType.X) {\r\n const xRange = this.xScale.range();\r\n const width = xRange[1] - xRange[0];\r\n return Math.floor(width / 175);\r\n }\r\n if (type === AxisType.Y) {\r\n const yRange = this.yScale.range();\r\n const height = Math.abs(yRange[0] - yRange[1]);\r\n return Math.pow(height, 0.85) / 25;\r\n }\r\n return this._defaultNumTicks;\r\n }\r\n _getConfiguredTickValues() {\r\n const { config } = this;\r\n const scale = config.type === AxisType.X ? this.xScale : this.yScale;\r\n const scaleDomain = scale === null || scale === void 0 ? void 0 : scale.domain();\r\n if (config.tickValues) {\r\n return config.tickValues.filter(v => (v >= scaleDomain[0]) && (v <= scaleDomain[1]));\r\n }\r\n return null;\r\n }\r\n _shouldRenderMinMaxTicksOnly() {\r\n const { config } = this;\r\n return config.minMaxTicksOnly || (config.type === AxisType.X && this._width < config.minMaxTicksOnlyWhenWidthIsLess);\r\n }\r\n _getFullDomainPath(tickSize = 0) {\r\n const { config: { type } } = this;\r\n switch (type) {\r\n case AxisType.X: return `M0.5, ${tickSize} V0.5 H${this._width + 0.5} V${tickSize}`;\r\n case AxisType.Y: return `M${-tickSize}, ${this._height + 0.5} H0.5 V0.5 H${-tickSize}`;\r\n }\r\n }\r\n _renderAxisLabel(selection = this.axisGroup) {\r\n var _a;\r\n const { type, label: label$1, labelMargin, labelFontSize, labelTextFitMode } = this.config;\r\n // Remove the old label first to calculate the axis size properly\r\n selection.selectAll(`.${label}`).remove();\r\n if (!label$1)\r\n return;\r\n // Calculate label position and rotation\r\n const axisPosition = this.getPosition();\r\n // We always use this.axisRenderHelperGroup to calculate the size of the axis because\r\n // this.axisGroup will give us incorrect values due to animation\r\n const { width: axisWidth, height: axisHeight } = (_a = this._axisRawBBox) !== null && _a !== void 0 ? _a : selection.node().getBBox();\r\n const rotation = type === AxisType.Y ? -90 : 0;\r\n // Create the text element (without transform first)\r\n const textElement = selection\r\n .append('text')\r\n .attr('class', label)\r\n .attr('dy', `${this._getLabelDY()}em`)\r\n .style('font-size', labelFontSize)\r\n .style('fill', this.config.labelColor);\r\n // Set the text content\r\n textElement.text(label$1);\r\n let isWrapped = false;\r\n if (labelTextFitMode === FitMode.Wrap) {\r\n // For Y-axis, use the chart height as the maximum width before rotation\r\n const maxWidth = type === AxisType.Y ? this._height : this._width;\r\n const currentTextWidth = textElement.node().getComputedTextLength();\r\n if (currentTextWidth > maxWidth) {\r\n wrapSVGText(textElement, maxWidth);\r\n isWrapped = true;\r\n }\r\n }\r\n // Calculate offset after wrapping to get accurate dimensions\r\n let labelWidth = axisWidth;\r\n let labelHeight = axisHeight;\r\n if (labelTextFitMode === FitMode.Wrap) {\r\n const labelBBox = textElement.node().getBBox();\r\n labelWidth = labelBBox.width;\r\n labelHeight = labelBBox.height;\r\n }\r\n else {\r\n const trimWidth = type === AxisType.X ? labelWidth : labelHeight;\r\n const styleDeclaration = getComputedStyle(textElement.node());\r\n const fontSize = Number.parseFloat(styleDeclaration.fontSize);\r\n // Use the default fontWidthToHeightRatio\r\n trimSVGText(textElement, trimWidth, this.config.labelTextTrimType, true, fontSize);\r\n const trimmedBBox = textElement.node().getBBox();\r\n labelWidth = trimmedBBox.width;\r\n labelHeight = trimmedBBox.height;\r\n }\r\n /*\r\n we need to calculate the offset for the label based on the position and the fit mode\r\n for offsetX, applying Y label we need to check if it's wrap or trim, then set the offset accordingly.\r\n Same for offsetY, need to consider x label.\r\n */\r\n const offsetX = type === AxisType.X\r\n ? this._width / 2\r\n : type === AxisType.Y && labelTextFitMode === FitMode.Wrap && isWrapped\r\n ? (axisPosition === Position.Left)\r\n ? -axisWidth - labelHeight / 2 - 10 // there's a 10px gap between tick label and Position.Right Y label, so offset as well in the Position.Left case\r\n : axisWidth\r\n : Math.pow((-1), (+(axisPosition === Position.Left))) * axisWidth;\r\n const offsetY = type === AxisType.Y\r\n ? this._height / 2\r\n : type === AxisType.X && labelTextFitMode === FitMode.Wrap\r\n ? (axisPosition === Position.Top) ? -axisHeight - labelHeight / 2 : axisHeight\r\n : Math.pow((-1), (+(axisPosition === Position.Top))) * axisHeight;\r\n const marginX = type === AxisType.X ? 0 : Math.pow((-1), (+(axisPosition === Position.Left))) * labelMargin;\r\n const marginY = type === AxisType.X ? Math.pow((-1), (+(axisPosition === Position.Top))) * labelMargin : 0;\r\n // Apply transform and rotation after all calculations\r\n textElement.attr('transform', `translate(${offsetX + marginX},${offsetY + marginY}) rotate(${rotation})`);\r\n }\r\n _getLabelDY() {\r\n const { type, position } = this.config;\r\n switch (type) {\r\n case AxisType.X:\r\n switch (position) {\r\n case Position.Top: return 0;\r\n case Position.Bottom:\r\n default: return 0.75;\r\n }\r\n case AxisType.Y:\r\n switch (position) {\r\n case Position.Right: return 0.75;\r\n case Position.Left:\r\n default: return -0.25;\r\n }\r\n }\r\n }\r\n _getTickTextOffset(axisPosition, tickSize, fontSize) {\r\n var _a;\r\n const { config } = this;\r\n const angleRad = ((_a = config.tickTextAngle) !== null && _a !== void 0 ? _a : 0) / 180 * Math.PI;\r\n const baseOffset = tickSize + config.tickPadding;\r\n if (config.type === AxisType.X) {\r\n const direction = axisPosition === Position.Bottom ? 1 : -1;\r\n return [\r\n direction * baseOffset * Math.sin(angleRad),\r\n direction * (baseOffset + fontSize / 2) * Math.cos(angleRad),\r\n ];\r\n }\r\n else {\r\n const direction = axisPosition === Position.Right ? 1 : -1;\r\n return [\r\n direction * baseOffset * Math.cos(angleRad),\r\n direction * baseOffset * Math.sin(angleRad),\r\n ];\r\n }\r\n }\r\n _alignTickLabels() {\r\n const { config: { type, tickTextAlign, tickTextAngle, position } } = this;\r\n const tickText = this.g.selectAll('g.tick > text');\r\n const textAnchor = textAlignToAnchor(tickTextAlign);\r\n const translateX = type === AxisType.X\r\n ? 0\r\n : this._getYTickTextTranslate(tickTextAlign, position);\r\n const translateValue = tickTextAngle ? `translate(${translateX},0) rotate(${tickTextAngle})` : `translate(${translateX},0)`;\r\n tickText\r\n .attr('transform', translateValue)\r\n .attr('text-anchor', textAnchor);\r\n }\r\n _getYTickTextTranslate(textAlign, axisPosition = Position.Left) {\r\n var _a, _b, _c, _d;\r\n /*\r\n Default in D3 is 9, tickPadding is the spacing in pixels between the tick and it's label. Default: `8`\r\n */\r\n const defaultTickTextSpacingPx = this.config.tickPadding + 1;\r\n // this._axisRawBBox will be undefined when autoMargin is undefined\r\n const width = ((_d = (_b = (_a = this._axisRawBBox) === null || _a === void 0 ? void 0 : _a.width) !== null && _b !== void 0 ? _b : (_c = this.axisGroup.node()) === null || _c === void 0 ? void 0 : _c.getBBox().width) !== null && _d !== void 0 ? _d : 0) - defaultTickTextSpacingPx;\r\n switch (textAlign) {\r\n case TextAlign.Left: return axisPosition === Position.Left ? width * -1 : 0;\r\n case TextAlign.Right: return axisPosition === Position.Left ? 0 : width;\r\n case TextAlign.Center: return axisPosition === Position.Left ? width * (-0.5) : width * 0.5;\r\n default: return 0;\r\n }\r\n }\r\n}\r\nAxis.selectors = style;\n\nexport { Axis };\n//# sourceMappingURL=index.js.map\n","import { XYComponentDefaultConfig } from '../../core/xy-component/config.js';\n\nconst CrosshairDefaultConfig = Object.assign(Object.assign({}, XYComponentDefaultConfig), { yStacked: undefined, baseline: null, duration: 100, tooltip: undefined, template: (d, x, data, leftNearestDatumIndex) => '', hideWhenFarFromPointer: true, hideWhenFarFromPointerDistance: 100, snapToData: true, getCircles: undefined, color: undefined, strokeColor: undefined, strokeWidth: undefined, onCrosshairMove: undefined, forceShowAt: undefined, skipRangeCheck: false });\n\nexport { CrosshairDefaultConfig };\n//# sourceMappingURL=config.js.map\n","import { injectGlobal, css } from '@emotion/css';\n\nconst globalStyles = injectGlobal `\n :root {\n --vis-crosshair-line-stroke-color: #888;\n --vis-crosshair-line-stroke-width: 1px;\n --vis-crosshair-line-stroke-opacity: 1;\n --vis-crosshair-circle-stroke-color: #fff;\n --vis-crosshair-circle-stroke-width: 1px;\n --vis-crosshair-circle-stroke-opacity: 0.75;\n }\n`;\r\nconst root = css `\n label: crosshair-component;\n`;\r\nconst line = css `\n stroke: var(--vis-crosshair-line-stroke-color);\n stroke-width: var(--vis-crosshair-line-stroke-width);\n stroke-opacity: var(--vis-crosshair-line-stroke-opacity);\n pointer-events: none;\n`;\r\nconst circle = css `\n stroke: var(--vis-crosshair-circle-stroke-color);\n stroke-width: var(--vis-crosshair-circle-stroke-width);\n stroke-opacity: var(--vis-crosshair-circle-stroke-opacity);\n pointer-events: none;\n`;\n\nexport { circle, globalStyles, line, root };\n//# sourceMappingURL=style.js.map\n","import { pointer } from 'd3-selection';\nimport { easeLinear } from 'd3-ease';\nimport { XYComponentCore } from '../../core/xy-component/index.js';\nimport { isArray, isNumber, getNearest, clamp, getNumber, isFunction, getStackedValues } from '../../utils/data.js';\nimport { smartTransition } from '../../utils/d3.js';\nimport { getColor } from '../../utils/color.js';\nimport { Position } from '../../types/position.js';\nimport { FindNearestDirection } from '../../types/data.js';\nimport { CrosshairDefaultConfig } from './config.js';\nimport * as style from './style.js';\nimport { line, circle } from './style.js';\n\nclass Crosshair extends XYComponentCore {\r\n constructor(config) {\r\n super();\r\n this.clippable = true; // Don't apply clipping path to this component. See XYContainer\r\n this._defaultConfig = CrosshairDefaultConfig;\r\n this.config = this._defaultConfig;\r\n this._xPx = undefined;\r\n this._yPx = undefined;\r\n this._mouseEvent = undefined;\r\n this._animFrameId = null;\r\n /** Accessors passed externally (e.g. from XYContainer) */\r\n this._accessors = {\r\n x: undefined,\r\n y: undefined,\r\n yStacked: undefined,\r\n baseline: undefined,\r\n };\r\n if (config)\r\n this.setConfig(config);\r\n this.g.style('opacity', 0);\r\n this.line = this.g.append('line')\r\n .attr('class', line);\r\n }\r\n set accessors(accessors) { this._accessors = accessors; }\r\n get accessors() {\r\n var _a;\r\n const { config } = this;\r\n const hasConfig = !!(config.x || config.y || config.yStacked);\r\n const x = hasConfig ? config.x : this._accessors.x;\r\n const yAcc = hasConfig ? config.y : this._accessors.y;\r\n const y = yAcc ? (isArray(yAcc) ? yAcc : [yAcc]) : undefined;\r\n const yStacked = hasConfig ? config.yStacked : this._accessors.yStacked;\r\n const baseline = (_a = config.baseline) !== null && _a !== void 0 ? _a : this._accessors.baseline;\r\n return { x, y, yStacked, baseline };\r\n }\r\n _isContainerInViewport() {\r\n var _a;\r\n if (!((_a = this.container) === null || _a === void 0 ? void 0 : _a.node()))\r\n return false;\r\n const containerRect = this.container.node().getBoundingClientRect();\r\n const viewportWidth = window.innerWidth || document.documentElement.clientWidth;\r\n const viewportHeight = window.innerHeight || document.documentElement.clientHeight;\r\n // Calculate the visible area of the container\r\n const visibleWidth = Math.max(0, Math.min(containerRect.right, viewportWidth) - Math.max(containerRect.left, 0));\r\n const visibleHeight = Math.max(0, Math.min(containerRect.bottom, viewportHeight) - Math.max(containerRect.top, 0));\r\n const containerArea = containerRect.width * containerRect.height;\r\n const visibleArea = visibleWidth * visibleHeight;\r\n // Container must be at least 35% visible\r\n return containerArea > 0 && (visibleArea / containerArea) >= 0.35;\r\n }\r\n setContainer(containerSvg) {\r\n if (this.container === containerSvg)\r\n return;\r\n this.container = containerSvg;\r\n this.container.on('mousemove.crosshair', this._onMouseMove.bind(this));\r\n this.container.on('mouseout.crosshair', this._onMouseOut.bind(this));\r\n this.container.on('wheel.crosshair', this._onWheel.bind(this));\r\n }\r\n _render(customDuration) {\r\n var _a, _b, _c, _d, _e;\r\n const { config, datamodel } = this;\r\n const duration = isNumber(customDuration) ? customDuration : config.duration;\r\n const isForceShowAtDefined = config.forceShowAt !== undefined;\r\n const xPx = isForceShowAtDefined ? this.xScale(config.forceShowAt) : this._xPx;\r\n const xValue = this.xScale.invert(xPx);\r\n const leftNearestDatumIndex = (((_a = datamodel.data) === null || _a === void 0 ? void 0 : _a.length) && this.accessors.x)\r\n ? datamodel.data.indexOf(getNearest(datamodel.data, xValue, this.accessors.x, FindNearestDirection.Left)) : undefined;\r\n // If `snapToData` is `true`, we need to find the nearest datum to the crosshair\r\n // It can be from a mouse interaction or from a `forceShowAt` setting\r\n let nearestDatum;\r\n let nearestDatumIndex;\r\n if (config.snapToData) {\r\n if (!this.accessors.y && !this.accessors.yStacked && ((_b = datamodel.data) === null || _b === void 0 ? void 0 : _b.length)) {\r\n console.warn('Unovis | Crosshair: Y accessors have not been configured. Please check if they\\'re present in the configuration object');\r\n }\r\n // Emit a warning if there's no data to snap to.\r\n // To keep the console clean, only emit the warning when there's mouse interaction.\r\n if (!((_c = datamodel.data) === null || _c === void 0 ? void 0 : _c.length) && this._mouseEvent) {\r\n console.warn('Unovis | Crosshair: No data to snap to. Make sure the data has been passed to the container or to the crosshair itself');\r\n }\r\n nearestDatum = getNearest(datamodel.data, xValue, this.accessors.x);\r\n nearestDatumIndex = datamodel.data.indexOf(nearestDatum);\r\n }\r\n const xRange = this.xScale.range();\r\n const yRange = this.yScale.range();\r\n const xClamped = config.snapToData && nearestDatum\r\n ? clamp(Math.round(this.xScale(getNumber(nearestDatum, this.accessors.x, nearestDatumIndex))), 0, this._width)\r\n : clamp(xPx, xRange[0], xRange[1]);\r\n const isCrosshairWithinXRange = (xPx >= xRange[0]) && (xPx <= xRange[1]);\r\n const isCrosshairWithinYRange = (this._yPx >= Math.min(yRange[0], yRange[1])) && (this._yPx <= Math.max(yRange[0], yRange[1]));\r\n let shouldShow = config.skipRangeCheck ? !!this._xPx : (this._xPx ? isCrosshairWithinXRange && isCrosshairWithinYRange : isCrosshairWithinXRange);\r\n // If the crosshair is far from the mouse pointer (usually when `snapToData` is `true` and data resolution is low), hide it\r\n if (config.hideWhenFarFromPointer && ((Math.abs(xClamped - (+xPx)) >= config.hideWhenFarFromPointerDistance))) {\r\n shouldShow = false;\r\n }\r\n const tooltip = (_d = config.tooltip) !== null && _d !== void 0 ? _d : this.tooltip;\r\n if (shouldShow && tooltip && this._isContainerInViewport()) {\r\n const container = tooltip.getContainer() || this.container.node();\r\n const isContainerBody = tooltip.isContainerBody();\r\n const nearestDatumXValue = this.accessors.x ? getNumber(nearestDatum, this.accessors.x, nearestDatumIndex) : undefined;\r\n if (isForceShowAtDefined) {\r\n // Convert SVG coordinates to screen coordinates\r\n const containerRect = this.container.node().getBoundingClientRect();\r\n // Use the actual left margin from the container\r\n const screenX = (isContainerBody ? xPx + containerRect.left : xPx) + this._containerMargin.left;\r\n const screenY = this._height / 2 + (isContainerBody ? containerRect.top : 0);\r\n const pos = [screenX, screenY];\r\n this._showTooltip(nearestDatum, nearestDatumXValue, pos, leftNearestDatumIndex);\r\n }\r\n else if (this._mouseEvent) {\r\n const pos = (isContainerBody ? [this._mouseEvent.clientX, this._mouseEvent.clientY] : pointer(this._mouseEvent, container));\r\n this._showTooltip(nearestDatum, nearestDatumXValue, pos, leftNearestDatumIndex);\r\n }\r\n }\r\n else\r\n this._hideTooltip();\r\n // Trigger `onCrosshairMove` if the render was triggered by a mouse move event\r\n if (this._mouseEvent) {\r\n (_e = config.onCrosshairMove) === null || _e === void 0 ? void 0 : _e.call(config, shouldShow ? this.xScale.invert(this._xPx) : undefined, nearestDatum, nearestDatumIndex, this._mouseEvent);\r\n this._mouseEvent = undefined;\r\n }\r\n smartTransition(this.g, duration)\r\n .style('opacity', shouldShow ? 1 : 0);\r\n // When `config.forceShowAt` becomes `undefined`, the crosshair \"jumps\" to the edge of the chart.\r\n // This looks off, so we stop further rendering when the `xPx` value is not finite.\r\n if (!isFinite(xPx))\r\n return;\r\n this.line\r\n .attr('y1', 0)\r\n .attr('y2', this._height);\r\n smartTransition(this.line, duration, easeLinear)\r\n .attr('x1', xClamped)\r\n .attr('x2', xClamped);\r\n const circleData = isFunction(config.getCircles)\r\n ? config.getCircles(xValue, datamodel.data, this.yScale, leftNearestDatumIndex)\r\n : this.getCircleData(nearestDatum, nearestDatumIndex);\r\n const circles = this.g\r\n .selectAll('circle')\r\n .data(circleData, (d, i) => { var _a; return (_a = d.id) !== null && _a !== void 0 ? _a : i; });\r\n const circlesEnter = circles.enter()\r\n .append('circle')\r\n .attr('class', circle)\r\n .attr('r', 0)\r\n .attr('cx', xClamped)\r\n .attr('cy', d => d.y)\r\n .style('fill', d => d.color)\r\n .style('stroke', d => d.strokeColor)\r\n .style('stroke-width', d => d.strokeWidth);\r\n smartTransition(circlesEnter.merge(circles), duration, easeLinear)\r\n .attr('cx', xClamped)\r\n .attr('cy', d => d.y)\r\n .attr('r', 4)\r\n .style('opacity', d => d.opacity)\r\n .style('fill', d => d.color)\r\n .style('stroke', d => d.strokeColor)\r\n .style('stroke-width', d => d.strokeWidth);\r\n circles.exit().remove();\r\n }\r\n hide(sourceEvent) {\r\n window.cancelAnimationFrame(this._animFrameId);\r\n this._animFrameId = window.requestAnimationFrame(() => {\r\n var _a, _b;\r\n this._xPx = undefined;\r\n this._yPx = undefined;\r\n this._mouseEvent = undefined;\r\n // We call `onCrosshairMove` with all the arguments set to `undefined` because we want\r\n // the users to be able to hide the crosshair easily when using `forceShowAt`\r\n (_b = (_a = this.config).onCrosshairMove) === null || _b === void 0 ? void 0 : _b.call(_a, undefined, undefined, undefined, sourceEvent);\r\n this._render();\r\n });\r\n }\r\n _onMouseMove(event) {\r\n var _a;\r\n const { datamodel, element } = this;\r\n if (!this.accessors.x && ((_a = datamodel.data) === null || _a === void 0 ? void 0 : _a.length)) {\r\n console.warn('Unovis | Crosshair: X accessor function has not been configured. Please check if it\\'s present in the configuration object');\r\n }\r\n const [x, y] = pointer(event, element);\r\n this._xPx = x;\r\n this._yPx = y;\r\n this._mouseEvent = event;\r\n window.cancelAnimationFrame(this._animFrameId);\r\n this._animFrameId = window.requestAnimationFrame(() => {\r\n // We'll call `config.onCrosshairMove` in `_render` with the found `nearestDatum` and `nearestDatumIndex`,\r\n // which can come from the mouse interaction or from the `forceShowAt` setting\r\n this._render();\r\n });\r\n }\r\n _onMouseOut(event) {\r\n var _a;\r\n // Only hide if the mouse actually left the SVG, not just moved to a child\r\n if (!event || !((_a = this.container) === null || _a === void 0 ? void 0 : _a.node().contains(event.relatedTarget))) {\r\n this.hide(event);\r\n }\r\n }\r\n _onWheel(event) {\r\n this.hide(event);\r\n }\r\n _showTooltip(datum, xValue, pos, nearestDatumIndex) {\r\n var _a;\r\n const { config, datamodel } = this;\r\n const tooltip = (_a = config.tooltip) !== null && _a !== void 0 ? _a : this.tooltip;\r\n if (!tooltip || !pos)\r\n return;\r\n const [x, y] = pos;\r\n const content = config.template(datum, xValue, datamodel.data, nearestDatumIndex);\r\n // Force set `followCursor` to `true` because we don't want Crosshair's tooltip to be hoverable\r\n tooltip.config.followCursor = true;\r\n // Set tooltip placement based on Crosshair's position (left / right)\r\n if (!tooltip.config.horizontalPlacement || tooltip.config.horizontalPlacement === Position.Auto) {\r\n const xRelative = tooltip.isContainerBody() ? x - this.container.node().getBoundingClientRect().left : x;\r\n tooltip.overrideHorizontalPlacement(xRelative > this._containerWidth / 2 ? Position.Left : Position.Right);\r\n }\r\n if (content)\r\n tooltip.show(content, { x, y });\r\n }\r\n _hideTooltip() {\r\n var _a;\r\n const { config } = this;\r\n const tooltip = (_a = config.tooltip) !== null && _a !== void 0 ? _a : this.tooltip;\r\n tooltip === null || tooltip === void 0 ? void 0 : tooltip.hide();\r\n }\r\n // We don't want Crosshair to be be taken in to account in domain calculations\r\n getYDataExtent() {\r\n return [undefined, undefined];\r\n }\r\n getCircleData(datum, datumIndex) {\r\n var _a, _b;\r\n const { config } = this;\r\n if (config.snapToData && datum) {\r\n const yAccessors = (_a = this.accessors.y) !== null && _a !== void 0 ? _a : [];\r\n const yStackedAccessors = (_b = this.accessors.yStacked) !== null && _b !== void 0 ? _b : [];\r\n const baselineValue = getNumber(datum, this.accessors.baseline, datumIndex) || 0;\r\n const stackedValues = getStackedValues(datum, datumIndex, ...yStackedAccessors)\r\n .map((value, index) => ({\r\n y: this.yScale(value + baselineValue),\r\n opacity: isNumber(getNumber(datum, yStackedAccessors[index], index)) ? 1 : 0,\r\n color: getColor(datum, config.color, index),\r\n strokeColor: config.strokeColor ? getColor(datum, config.strokeColor, index) : undefined,\r\n strokeWidth: config.strokeWidth ? getNumber(datum, config.strokeWidth, index) : undefined,\r\n }));\r\n const regularValues = yAccessors\r\n .map((a, index) => {\r\n const value = getNumber(datum, a, datumIndex);\r\n return {\r\n y: this.yScale(value),\r\n opacity: isNumber(value) ? 1 : 0,\r\n color: getColor(datum, config.color, stackedValues.length + index),\r\n strokeColor: config.strokeColor ? getColor(datum, config.strokeColor, index) : undefined,\r\n strokeWidth: config.strokeWidth ? getNumber(datum, config.strokeWidth, index) : undefined,\r\n };\r\n });\r\n return stackedValues.concat(regularValues);\r\n }\r\n return [];\r\n }\r\n}\r\nCrosshair.selectors = style;\n\nexport { Crosshair };\n//# sourceMappingURL=index.js.map\n","import { ComponentDefaultConfig } from '../../core/component/config.js';\n\n// Core\r\nconst DonutDefaultConfig = Object.assign(Object.assign({}, ComponentDefaultConfig), { id: (d, i) => { var _a; return (_a = d.id) !== null && _a !== void 0 ? _a : i; }, value: undefined, angleRange: [0, 2 * Math.PI], padAngle: 0, sortFunction: undefined, cornerRadius: 0, color: undefined, radius: undefined, arcWidth: 20, centralLabel: undefined, centralSubLabel: undefined, centralSubLabelWrap: true, showEmptySegments: false, emptySegmentAngle: 0.5 * Math.PI / 180, showBackground: true, backgroundAngleRange: undefined, centralLabelOffsetX: undefined, centralLabelOffsetY: undefined });\n\nexport { DonutDefaultConfig };\n//# sourceMappingURL=config.js.map\n","import { interpolate } from 'd3-interpolate';\nimport { getColor } from '../../../utils/color.js';\nimport { smartTransition } from '../../../utils/d3.js';\n\nfunction createArc(selection, config) {\r\n selection\r\n .style('fill', d => getColor(d.data, config.color, d.index))\r\n .style('opacity', 0)\r\n .each((d, i, els) => {\r\n const arcNode = els[i];\r\n const angleCenter = (d.startAngle + d.endAngle) / 2;\r\n const angleHalfWidth = (d.endAngle - d.startAngle) / 2;\r\n arcNode._animState = {\r\n startAngle: angleCenter - angleHalfWidth,\r\n endAngle: angleCenter + angleHalfWidth,\r\n innerRadius: d.innerRadius,\r\n outerRadius: d.outerRadius,\r\n padAngle: d.padAngle,\r\n };\r\n });\r\n}\r\nfunction updateArc(selection, config, arcGen, duration) {\r\n selection\r\n .style('transition', `fill ${duration}ms`) // Animate color with CSS because we're using CSS-variables\r\n .style('fill', d => getColor(d.data, config.color, d.index));\r\n const setOpacity = (d) => (config.showEmptySegments || d.value) ? 1 : 0;\r\n if (duration) {\r\n const transition = smartTransition(selection, duration)\r\n .style('opacity', setOpacity);\r\n transition.attrTween('d', (d, i, els) => {\r\n const arcNode = els[i];\r\n const nextAnimState = {\r\n startAngle: d.startAngle,\r\n endAngle: d.endAngle,\r\n innerRadius: d.innerRadius,\r\n outerRadius: d.outerRadius,\r\n padAngle: d.padAngle,\r\n };\r\n const datum = interpolate(arcNode._animState, nextAnimState);\r\n return (t) => {\r\n arcNode._animState = datum(t);\r\n return arcGen(arcNode._animState);\r\n };\r\n });\r\n }\r\n else {\r\n selection\r\n .attr('d', arcGen)\r\n .style('opacity', setOpacity);\r\n }\r\n}\r\nfunction removeArc(selection, duration) {\r\n smartTransition(selection, duration)\r\n .style('opacity', 0)\r\n .remove();\r\n}\n\nexport { createArc, removeArc, updateArc };\n//# sourceMappingURL=arc.js.map\n","const DONUT_HALF_ANGLE_RANGES = Array.from({ length: 4 }, (_, i) => {\r\n const offset = -Math.PI / 2 + i * Math.PI / 2;\r\n return [offset, offset + Math.PI];\r\n});\r\nconst [DONUT_HALF_ANGLE_RANGE_TOP, DONUT_HALF_ANGLE_RANGE_RIGHT, DONUT_HALF_ANGLE_RANGE_BOTTOM, DONUT_HALF_ANGLE_RANGE_LEFT,] = DONUT_HALF_ANGLE_RANGES;\n\nexport { DONUT_HALF_ANGLE_RANGES, DONUT_HALF_ANGLE_RANGE_BOTTOM, DONUT_HALF_ANGLE_RANGE_LEFT, DONUT_HALF_ANGLE_RANGE_RIGHT, DONUT_HALF_ANGLE_RANGE_TOP };\n//# sourceMappingURL=constants.js.map\n","import { css, injectGlobal } from '@emotion/css';\n\nconst root = css `\n label: donut-component;\n`;\r\nconst variables = injectGlobal `\n :root {\n --vis-donut-central-label-font-size: 16px;\n --vis-donut-central-label-text-color: #5b5f6d;\n // Undefined by default to allow proper fallback to var(--vis-font-family)\n /* --vis-donut-central-label-font-family: */\n --vis-donut-central-label-font-weight: 600;\n\n --vis-donut-central-sub-label-font-size: 12px;\n --vis-donut-central-sub-label-text-color: #5b5f6d;\n // Undefined by default to allow proper fallback to var(--vis-font-family)\n /* --vis-donut-central-sub-label-font-family: */\n --vis-donut-central-sub-label-font-weight: 500;\n\n --vis-donut-background-color: #E7E9F3;\n --vis-donut-segment-stroke-width: 0;\n // The line segment color variable is not defined by default\n // to allow it to fallback to the donut background color\n /* --vis-donut-segment-stroke-color: none; */\n\n --vis-dark-donut-central-label-text-color: #C2BECE;\n --vis-dark-donut-central-sub-label-text-color: #C2BECE;\n --vis-dark-donut-background-color: #18160C;\n }\n\n body.theme-dark ${`.${root}`} {\n --vis-donut-central-label-text-color: var(--vis-dark-donut-central-label-text-color);\n --vis-donut-central-sub-label-text-color: var(--vis-dark-donut-central-sub-label-text-color);\n --vis-donut-background-color: var(--vis-dark-donut-background-color);\n }\n`;\r\nconst background = css `\n label: background;\n fill: var(--vis-donut-background-color);\n`;\r\nconst segment = css `\n label: segment;\n stroke-width: var(--vis-donut-segment-stroke-width);\n stroke: var(--vis-donut-segment-stroke-color, var(--vis-donut-background-color));\n`;\r\nconst segmentExit = css `\n label: segment-exit;\n`;\r\nconst centralLabel = css `\n label: central-label;\n text-anchor: middle;\n dominant-baseline: middle;\n font-size: var(--vis-donut-central-label-font-size);\n font-family: var(--vis-donut-central-label-font-family, var(--vis-font-family));\n font-weight: var(--vis-donut-central-label-font-weight);\n fill: var(--vis-donut-central-label-text-color);\n`;\r\nconst centralSubLabel = css `\n label: central-label;\n text-anchor: middle;\n dominant-baseline: middle;\n font-size: var(--vis-donut-central-sub-label-font-size);\n font-family: var(--vis-donut-central-sub-label-font-family, var(--vis-font-family));\n font-weight: var(--vis-donut-central-sub-label-font-weight);\n fill: var(--vis-donut-central-sub-label-text-color);\n`;\n\nexport { background, centralLabel, centralSubLabel, root, segment, segmentExit, variables };\n//# sourceMappingURL=style.js.map\n","import { arc, pie } from 'd3-shape';\nimport { ComponentCore } from '../../core/component/index.js';\nimport { SeriesDataModel } from '../../data-models/series.js';\nimport { smartTransition } from '../../utils/d3.js';\nimport { getNumber, isNumber, clamp } from '../../utils/data.js';\nimport { wrapSVGText } from '../../utils/text.js';\nimport { DonutDefaultConfig } from './config.js';\nimport { createArc, updateArc, removeArc } from './modules/arc.js';\nimport { DONUT_HALF_ANGLE_RANGES } from './constants.js';\nimport * as style from './style.js';\nimport { centralLabel, centralSubLabel, segment, segmentExit, background } from './style.js';\n\nclass Donut extends ComponentCore {\r\n constructor(config) {\r\n super();\r\n this._defaultConfig = DonutDefaultConfig;\r\n this.config = this._defaultConfig;\r\n this.datamodel = new SeriesDataModel();\r\n this.arcGen = arc();\r\n this.events = {};\r\n if (config)\r\n this.setConfig(config);\r\n this.arcBackground = this.g.append('path');\r\n this.arcGroup = this.g.append('g');\r\n this.centralLabel = this.g.append('text')\r\n .attr('class', centralLabel);\r\n this.centralSubLabel = this.g.append('text')\r\n .attr('class', centralSubLabel);\r\n }\r\n get bleed() {\r\n return { top: 0, bottom: 0, left: 0, right: 0 };\r\n }\r\n _render(customDuration) {\r\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;\r\n const { config, datamodel, bleed } = this;\r\n // Wrap data to preserve original indices\r\n const data = datamodel.data\r\n .map((d, i) => ({\r\n index: i,\r\n datum: d,\r\n }))\r\n .filter(d => config.showEmptySegments || getNumber(d.datum, config.value, d.index));\r\n const duration = isNumber(customDuration) ? customDuration : config.duration;\r\n // Handle half-donut cases, which adjust the scaling and positioning.\r\n // One of these is true if we are dealing with a half-donut.\r\n const [isHalfDonutTop, isHalfDonutRight, isHalfDonutBottom, isHalfDonutLeft,] = DONUT_HALF_ANGLE_RANGES.map(angleRange => config.angleRange && (config.angleRange[0] === angleRange[0] &&\r\n config.angleRange[1] === angleRange[1]));\r\n const isVerticalHalfDonut = isHalfDonutTop || isHalfDonutBottom;\r\n const isHorizontalHalfDonut = isHalfDonutRight || isHalfDonutLeft;\r\n // Compute the bounding box of the donut,\r\n // considering it may be a half-donut\r\n const width = this._width * (isHorizontalHalfDonut ? 2 : 1);\r\n const height = this._height * (isVerticalHalfDonut ? 2 : 1);\r\n const outerRadius = config.radius || Math.min(width - bleed.left - bleed.right, height - bleed.top - bleed.bottom) / 2;\r\n const innerRadius = config.arcWidth === 0 ? 0 : clamp(outerRadius - config.arcWidth, 0, outerRadius - 1);\r\n const translateY = this._height / 2 + (isHalfDonutTop ? outerRadius / 2 : isHalfDonutBottom ? -outerRadius / 2 : 0);\r\n const translateX = this._width / 2 + (isHalfDonutLeft ? outerRadius / 2 : isHalfDonutRight ? -outerRadius / 2 : 0);\r\n const translate = `translate(${translateX},${translateY})`;\r\n this.arcGroup.attr('transform', translate);\r\n this.arcGen\r\n .startAngle(d => d.startAngle)\r\n .endAngle(d => d.endAngle)\r\n .innerRadius(d => d.innerRadius)\r\n .outerRadius(d => d.outerRadius)\r\n .padAngle(d => d.padAngle)\r\n .cornerRadius(config.cornerRadius);\r\n const pieGen = pie()\r\n .startAngle((_b = (_a = config.angleRange) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : 0)\r\n .endAngle((_d = (_c = config.angleRange) === null || _c === void 0 ? void 0 : _c[1]) !== null && _d !== void 0 ? _d : 2 * Math.PI)\r\n .padAngle(config.padAngle)\r\n .value(d => getNumber(d.datum, config.value, d.index) || 0)\r\n .sort((a, b) => { var _a; return (_a = config.sortFunction) === null || _a === void 0 ? void 0 : _a.call(config, a.datum, b.datum); });\r\n const arcData = pieGen(data).map(d => {\r\n const arc = Object.assign(Object.assign({}, d), { data: d.data.datum, index: d.data.index, innerRadius,\r\n outerRadius });\r\n if (config.showEmptySegments && d.endAngle - d.startAngle - d.padAngle <= Number.EPSILON) {\r\n arc.endAngle = d.startAngle + Math.max(config.emptySegmentAngle, config.padAngle);\r\n arc.padAngle = d.padAngle / 2;\r\n }\r\n return arc;\r\n });\r\n // Arc segments\r\n const arcsSelection = this.arcGroup\r\n .selectAll(`.${segment}`)\r\n .data(arcData, (d) => config.id(d.data, d.index));\r\n const arcsEnter = arcsSelection.enter().append('path')\r\n .attr('class', segment)\r\n .call(createArc, config);\r\n const arcsMerged = arcsSelection.merge(arcsEnter);\r\n arcsMerged.call(updateArc, config, this.arcGen, duration);\r\n arcsMerged.sort((a, b) => b.value - a.value);\r\n arcsSelection.exit()\r\n .attr('class', segmentExit)\r\n .call(removeArc, duration);\r\n // Label\r\n const labelTextAnchor = isHalfDonutRight ? 'start' : isHalfDonutLeft ? 'end' : 'middle';\r\n this.centralLabel\r\n .attr('dy', config.centralSubLabel ? '-0.55em' : null)\r\n .style('text-anchor', labelTextAnchor)\r\n .text((_e = config.centralLabel) !== null && _e !== void 0 ? _e : null);\r\n this.centralSubLabel\r\n .attr('dy', config.centralLabel ? '0.55em' : null)\r\n .style('text-anchor', labelTextAnchor)\r\n .text((_f = config.centralSubLabel) !== null && _f !== void 0 ? _f : null);\r\n if (config.centralSubLabelWrap)\r\n wrapSVGText(this.centralSubLabel, innerRadius * 1.9);\r\n // Label placement\r\n const labelTranslateX = (config.centralLabelOffsetX || 0) + translateX;\r\n let labelTranslateY = (config.centralLabelOffsetY || 0) + translateY;\r\n // Special case label placement for half donut\r\n if (isVerticalHalfDonut && config.centralLabelOffsetX === undefined && config.centralLabelOffsetY === undefined) {\r\n const halfDonutLabelOffsetY = isHalfDonutTop\r\n ? -this.centralSubLabel.node().getBoundingClientRect().height\r\n : isHalfDonutBottom\r\n ? this.centralLabel.node().getBoundingClientRect().height\r\n : 0;\r\n labelTranslateY = halfDonutLabelOffsetY + translateY;\r\n }\r\n const labelTranslate = `translate(${labelTranslateX},${labelTranslateY})`;\r\n this.centralLabel.attr('transform', labelTranslate);\r\n this.centralSubLabel.attr('transform', labelTranslate);\r\n // Background\r\n this.arcBackground.attr('class', background)\r\n .attr('visibility', config.showBackground ? null : 'hidden')\r\n .attr('transform', translate);\r\n smartTransition(this.arcBackground, duration)\r\n .attr('d', this.arcGen({\r\n startAngle: (_k = (_h = (_g = config.backgroundAngleRange) === null || _g === void 0 ? void 0 : _g[0]) !== null && _h !== void 0 ? _h : (_j = config.angleRange) === null || _j === void 0 ? void 0 : _j[0]) !== null && _k !== void 0 ? _k : 0,\r\n endAngle: (_p = (_m = (_l = config.backgroundAngleRange) === null || _l === void 0 ? void 0 : _l[1]) !== null && _m !== void 0 ? _m : (_o = config.angleRange) === null || _o === void 0 ? void 0 : _o[1]) !== null && _p !== void 0 ? _p : 2 * Math.PI,\r\n innerRadius,\r\n outerRadius,\r\n }));\r\n }\r\n}\r\nDonut.selectors = style;\n\nexport { Donut };\n//# sourceMappingURL=index.js.map\n"],"names":["ComponentType","Sizing","FindNearestDirection","isNumber","a","isFunction","isArray","isObject","isAClassInstance","isPlainObject","isEmpty","obj","isEqual","b","skipKeys","visited","i","keysA","key","keysB","flatten","arr","cloneDeep","stack","clone","item","objAsRecord","newObj","merge","obj1","obj2","throttle","f","delay","options","throttle$1","getValue","d","accessor","index","getString","getNumber","clean","data","clamp","min","max","getStackedValues","acs","values","positiveStack","negativeStack","value","getMin","getMax","getExtent","getNearest","direction","dataWithIndexSorted","j","bisectLeft","bisectRight","filterDataByRange","range","includeNeighbors","filteredData","nearestLeft","nearestRight","firstFilteredItem","lastFilteredItem","firstFilteredIndex","lastFilteredIndex","startIndex","endIndex","ResizeObserver","ResizeObserver$1","ContainerDefaultConfig","ContainerCore","element","container","select","config","_a","duration","width","height","containerRect","entries","observer","resizedContainerRect","resizedContainerSize","insertWithoutScoping","cache","serialized","registered","css","className","registeredStyles","rawClassName","getRegisteredStyles","createEmotion","createCache","_len","args","_key","serializeStyles","insertStyles","keyframes","_len2","_key2","animation","injectGlobal","_len3","_key3","cx","_len4","_key4","classnames","ids","cls","arg","toAdd","k","_createEmotion","guid","s4","cssVariableCache","getCSSVariableValue","s","context","variableName","elementCache","rectIntersect","rect1","rect2","tolerancePx","left1","top1","right1","bottom1","left2","top2","right2","bottom2","colors","colorsDark","getCSSColorVariable","suffix","getLighterColor","hex","percentage","c","hsl","getDarkerColor","percentageL","percentageS","PATTERN_SIZE_PX","fills","lines","getPatternVariable","p","maskDef","markerDef","injectSVGDefs","svgDefs","svg","UNOVIS_FONT_WH_RATIO_DEFAULT","UNOVIS_TEXT_SEPARATOR_DEFAULT","UNOVIS_TEXT_HYPHEN_CHARACTER_DEFAULT","UNOVIS_TEXT_DEFAULT","_","getFontWidthToHeightRatio","smartTransition","selection","easing","node","interrupt","transition","SingleContainerDefaultConfig","SingleContainer","preventRender","containerConfig","tooltip","annotations","componentConfig","component","extendedSizeComponent","componentWidth","_b","fitToWidth","componentHeight","scale","currentWidth","currentHeight","scaledWidth","scaledHeight","animated","CoreDataModel","AxisType","Scale","scaleLinear","scalePow","scaleSqrt","scaleLog","scaleSymlog","scaleIdentity","scaleTime","scaleUtc","scaleSequential","scaleDiverging","scaleQuantize","scaleQuantile","scaleThreshold","scaleOrdinal","scaleBand","scalePoint","ScaleDimension","Direction","XYContainerDefaultConfig","XYContainer","highlightFilterId","baseUrl","margin","_c","_d","_e","components","crosshair","componentConfigs","customDuration","_f","clipPathExtension","yAccessors","yStackedAccessors","baselineComponentConfig","baselineAccessor","componentsWithDomain","dimension","_g","_h","extent","configuredDomain","configuredDomainMinConstraint","configuredDomainMaxConstraint","domainMin","domainMax","domain","hasDataProvided","isYDirectionSouth","xRange","yRange","bleed","xAxis","yAxis","axis","offset","numIterations","axisMargin","m","ComponentDefaultConfig","ComponentCore","type","rootClass","containerWidth","containerHeight","ANIMATING_ATTR","attributeMap","attr","events","eventType","event","els","eventFunction","SeriesDataModel","XYComponentDefaultConfig","XYComponentCore","scaleByVisibleData","datamodel","xDomain","Position","PositionStrategy","Arrangement","Orientation","TooltipDefaultConfig","root","variables","positionFixed","show","hidden","nonInteractive","Tooltip","html","pos","tooltipWidth","tooltipHeight","horizontalPlacement","verticalPlacement","translateX","translateY","top","left","hoveredElement","isContainerBody","hoveredElementRect","elementPos","pointer","placement","prevConfig","x","y","paddingX","hitRight","hitLeft","constrainedLeft","paddingY","hitBottom","hitTop","constrainedTop","e","currentConfig","path","template","el","content","attributesMap","style","getColor","dontFallbackToCssVar","CurveType","Curve","curveBasis","curveBasisClosed","curveBasisOpen","curveBundle","curveCardinal","curveCardinalClosed","curveCardinalOpen","curveCatmullRom","curveCatmullRomClosed","curveCatmullRomOpen","curveLinear","curveLinearClosed","curveMonotoneX","curveMonotoneY","curveNatural","curveStep","curveStepAfter","curveStepBefore","LineDefaultConfig","globalStyles","line","linePath","lineSelectionHelper","dim","interpolatedPath","Line","lineWidth","yDomain","isLineThick","isLineVeryThick","lineDataX","lineData","ld","rawValue","defined","def","validGap","gaps","acc","isEndpoint","visible","line$1","linesEnter","linesMerged","elements","group","linePath$1","lineSelectionHelper$1","lineGaps","isLineVisible","dashArray","hasUndefinedSegments","svgPathD","previous","next","interpolatePath","datum","roundedRectPath","w","h","tl","tr","bl","br","roundedR","angularR","GroupedBarDefaultConfig","bar","barGroup","barGroupExit","GroupedBar","isHorizontalAndFlipped","dataDomain","halfGroupWidth","dataScaleValues","firstDataValue","lastDataValue","firstValuePx","lastValuePx","dataDomainRequiredStart","dataDomainRequiredEnd","bleedPxStart","bleedPxEnd","groupWidth","innerBandScaleRange","innerBandScale","barGroups","getBarGroupsTransform","v","barGroupsMerged","barGroupExit$1","barWidth","bars","valueAxisDirection","barsMerged","isNegative","dir","dataScale","xHalfGroupWidth","cornerRadius","cornerRadiusClamped","isNorthDirected","roundedTop","roundedBottom","roundedLeft","roundedRight","isOrdinal","dataSize","TrimMode","VerticalAlign","FitMode","TextAlign","getTextAnchorFromTextAlign","textAlign","textAlignToAnchor","kebabCaseToCamel","str","letter","kebabCase","escapeStringKeepHash","trimStringStart","maxLength","trimStringMiddle","dist","trimStringEnd","trimString","length","result","splitString","text","separators","sep","separated","words","word","wrapSVGText","textElement","separator","tspan","tspanContent","tspanText","trimSVGText","svgTextSelection","maxWidth","trimType","fastMode","fontSize","fontWidthToHeightRatio","textLength","textWidth","maxCharacters","estimateStringPixelLength","getPreciseStringLengthPx","fontFamily","svgNS","breakTextIntoLines","textBlock","wordBreak","minCharactersOnLine","breakIndex","subLine","getWrappedText","textArrays","t","textWrapped","block","firstBlock","blocks","prevBlock","prevBlockMarginBottomPx","marginTopPx","effectiveMarginPx","dh","lineWithEllipsis","textLengthPx","renderTextToTspanStrings","dominantBaseline","prevBlockMarginBottomEm","marginTopEm","marginEm","attributes","dy","estimateWrappedTextHeight","sum","allowedSvgTextTags","renderTextToSvgTextElement","wrappedText","textElementX","textElementY","parser","svgCode","svgCodeSanitized","striptags","parsedSvgCode","AxisDefaultConfig","getCssVarNames","cssVarsObject","prefix","defaultPrefix","injectGlobalCssVariables","componentRootClassName","cssVarDefaults","hideTickLine","hideDomain","grid","tick","tickTextExiting","label","tickLabel","tickLabelHideable","Axis","axisRenderHelperGroup","position","axisSize","xEnd","right","bleedY","bottom","containerMargin","gridGen","tickPadding","ticks","axisTop","axisBottom","axisRight","axisLeft","numTicks","gridScale","scaleDomain","getGridMinMaxTicksOnlyValues","tickValues","tickValuesStep","domainMaxValue","axisGen","axisScale","tickCount","tickText","tickValue","tickSize","axisPosition","textMaxWidth","styleDeclaration","textOffsetX","textOffsetY","textOptions","textElementSelection","tickTextSelection","label1","label1BoundingRect","label2","label2BoundingRect","label$1","labelMargin","labelFontSize","labelTextFitMode","axisWidth","axisHeight","rotation","isWrapped","labelWidth","labelHeight","labelBBox","trimWidth","trimmedBBox","offsetX","offsetY","marginX","marginY","angleRad","baseOffset","tickTextAlign","tickTextAngle","textAnchor","translateValue","defaultTickTextSpacingPx","CrosshairDefaultConfig","leftNearestDatumIndex","circle","Crosshair","accessors","hasConfig","yAcc","yStacked","baseline","viewportWidth","viewportHeight","visibleWidth","visibleHeight","containerArea","visibleArea","containerSvg","isForceShowAtDefined","xPx","xValue","nearestDatum","nearestDatumIndex","xClamped","isCrosshairWithinXRange","isCrosshairWithinYRange","shouldShow","nearestDatumXValue","screenX","screenY","easeLinear","circleData","circles","circlesEnter","sourceEvent","xRelative","datumIndex","baselineValue","stackedValues","regularValues","DonutDefaultConfig","createArc","arcNode","angleCenter","angleHalfWidth","updateArc","arcGen","setOpacity","nextAnimState","interpolate","removeArc","DONUT_HALF_ANGLE_RANGES","DONUT_HALF_ANGLE_RANGE_TOP","DONUT_HALF_ANGLE_RANGE_RIGHT","DONUT_HALF_ANGLE_RANGE_BOTTOM","DONUT_HALF_ANGLE_RANGE_LEFT","background","segment","segmentExit","centralLabel","centralSubLabel","Donut","arc","_j","_k","_l","_m","_o","_p","isHalfDonutTop","isHalfDonutRight","isHalfDonutBottom","isHalfDonutLeft","angleRange","isVerticalHalfDonut","isHorizontalHalfDonut","outerRadius","innerRadius","translate","arcData","pie","arcsSelection","arcsEnter","arcsMerged","labelTextAnchor","labelTranslateX","labelTranslateY","labelTranslate"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53]}
|