@spectrum-charts/vega-spec-builder 1.18.2 → 1.19.0-alpha
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/dist/@types/src/axis/axisReferenceLineUtils.d.ts +1 -1
- package/dist/@types/src/axis/axisReferenceLineUtils.d.ts.map +1 -1
- package/dist/@types/src/axis/axisSpecBuilder.d.ts +3 -3
- package/dist/@types/src/bar/dodgedBarUtils.test.d.ts +2 -2
- package/dist/@types/src/bar/trellisedBarUtils.d.ts +1 -1
- package/dist/@types/src/bar/trellisedBarUtils.d.ts.map +1 -1
- package/dist/@types/src/chartSpecBuilder.d.ts +1 -1
- package/dist/@types/src/chartSpecBuilder.d.ts.map +1 -1
- package/dist/@types/src/chartTooltip/chartTooltipUtils.d.ts +2 -2
- package/dist/@types/src/chartTooltip/chartTooltipUtils.d.ts.map +1 -1
- package/dist/@types/src/marks/markUtils.d.ts +2 -2
- package/dist/@types/src/marks/markUtils.d.ts.map +1 -1
- package/dist/@types/src/specUtils.d.ts.map +1 -1
- package/dist/@types/src/types/axis/referenceLineSpec.types.d.ts +4 -2
- package/dist/@types/src/types/axis/referenceLineSpec.types.d.ts.map +1 -1
- package/dist/@types/src/types/chartSpec.types.d.ts +10 -3
- package/dist/@types/src/types/chartSpec.types.d.ts.map +1 -1
- package/dist/@types/src/types/marks/index.d.ts +1 -0
- package/dist/@types/src/types/marks/index.d.ts.map +1 -1
- package/dist/@types/src/types/marks/vennSpec.types.d.ts +30 -0
- package/dist/@types/src/types/marks/vennSpec.types.d.ts.map +1 -0
- package/dist/@types/src/vegaEmbedUtils.d.ts +2 -2
- package/dist/@types/src/venn/vennSpecBuilder.d.ts +19 -0
- package/dist/@types/src/venn/vennSpecBuilder.d.ts.map +1 -0
- package/dist/@types/src/venn/vennSpecBuilder.test.d.ts +2 -0
- package/dist/@types/src/venn/vennSpecBuilder.test.d.ts.map +1 -0
- package/dist/@types/src/venn/vennTestUtils.d.ts +8 -0
- package/dist/@types/src/venn/vennTestUtils.d.ts.map +1 -0
- package/dist/@types/src/venn/vennUtils.d.ts +35 -0
- package/dist/@types/src/venn/vennUtils.d.ts.map +1 -0
- package/dist/@types/src/venn/vennUtils.test.d.ts +2 -0
- package/dist/@types/src/venn/vennUtils.test.d.ts.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.LICENSE.txt +3 -1
- package/dist/index.js.map +1 -1
- package/package.json +7 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://spectrumChartsVegaSpecBuilder/webpack/universalModuleDefinition","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/deepmerge/dist/cjs.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/immer/dist/cjs/immer.cjs.production.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/immer/dist/cjs/index.js","webpack://spectrumChartsVegaSpecBuilder/./src/area/areaSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/area/areaUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/axis/axisLabelUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/axis/axisReferenceLineUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/axis/axisSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/axis/axisTrellisUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/axis/axisUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/axisAnnotation/axisAnnotationUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bar/barAnnotationUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bar/barSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bar/barUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bar/dodgedBarUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bar/stackedBarUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bar/trellisedBarUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bullet/bulletDataUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bullet/bulletMarkUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bullet/bulletSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/chartPopover/chartPopoverUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/chartSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/chartTooltip/chartTooltipUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/combo/comboSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/data/dataUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/donut/donutSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/donut/donutSummaryUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/donut/donutUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/donut/segmentLabelUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/expressionFunctions/expressionFunctions.ts","webpack://spectrumChartsVegaSpecBuilder/./src/expressionFunctions/index.ts","webpack://spectrumChartsVegaSpecBuilder/./src/index.ts","webpack://spectrumChartsVegaSpecBuilder/./src/legend/legendFacetUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/legend/legendHighlightUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/legend/legendSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/legend/legendUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/line/lineDataUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/line/lineMarkUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/line/linePointUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/line/lineSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/line/lineUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/marks/markUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/metricRange/metricRangeUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/scale/scaleSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/scale/scaleUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/scatter/scatterMarkUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/scatter/scatterSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/scatterPath/index.ts","webpack://spectrumChartsVegaSpecBuilder/./src/scatterPath/scatterPathUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/signal/signalSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/specUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/textUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/title/titleSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/trendline/index.ts","webpack://spectrumChartsVegaSpecBuilder/./src/trendline/trendlineDataTransformUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/trendline/trendlineDataUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/trendline/trendlineMarkUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/trendline/trendlineScaleUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/trendline/trendlineSignalUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/trendline/trendlineUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/trendlineAnnotation/index.ts","webpack://spectrumChartsVegaSpecBuilder/./src/trendlineAnnotation/trendlineAnnotationUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/types/axis/index.ts","webpack://spectrumChartsVegaSpecBuilder/./src/types/dialogs/index.ts","webpack://spectrumChartsVegaSpecBuilder/./src/types/index.ts","webpack://spectrumChartsVegaSpecBuilder/./src/types/marks/index.ts","webpack://spectrumChartsVegaSpecBuilder/./src/types/marks/supplemental/index.ts","webpack://spectrumChartsVegaSpecBuilder/./src/types/specUtil.types.ts","webpack://spectrumChartsVegaSpecBuilder/./src/vegaEmbedUtils.ts","webpack://spectrumChartsVegaSpecBuilder/../locales/dist/index.js","webpack://spectrumChartsVegaSpecBuilder/external commonjs \"vega\"","webpack://spectrumChartsVegaSpecBuilder/external umd \"@spectrum-charts/constants\"","webpack://spectrumChartsVegaSpecBuilder/external umd \"@spectrum-charts/themes\"","webpack://spectrumChartsVegaSpecBuilder/external umd \"@spectrum-charts/utils\"","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/formatDecimal.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/exponent.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/formatSpecifier.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/formatPrefixAuto.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/formatRounded.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/formatTypes.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/identity.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/locale.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/defaultLocale.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/formatGroup.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/formatNumerals.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/formatTrim.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/precisionFixed.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/precisionPrefix.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/precisionRound.js","webpack://spectrumChartsVegaSpecBuilder/webpack/bootstrap","webpack://spectrumChartsVegaSpecBuilder/webpack/runtime/define property getters","webpack://spectrumChartsVegaSpecBuilder/webpack/runtime/hasOwnProperty shorthand","webpack://spectrumChartsVegaSpecBuilder/webpack/runtime/make namespace object","webpack://spectrumChartsVegaSpecBuilder/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@spectrum-charts/constants\"), require(\"@spectrum-charts/themes\"), require(\"@spectrum-charts/utils\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"@spectrum-charts/constants\", \"@spectrum-charts/themes\", \"@spectrum-charts/utils\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"spectrumChartsVegaSpecBuilder\"] = factory(require(\"@spectrum-charts/constants\"), require(\"@spectrum-charts/themes\"), require(\"@spectrum-charts/utils\"));\n\telse\n\t\troot[\"spectrumChartsVegaSpecBuilder\"] = factory(root[\"@spectrum-charts/constants\"], root[\"@spectrum-charts/themes\"], root[\"@spectrum-charts/utils\"]);\n})(this, (__WEBPACK_EXTERNAL_MODULE__9633__, __WEBPACK_EXTERNAL_MODULE__1274__, __WEBPACK_EXTERNAL_MODULE__8365__) => {\nreturn ","'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction getEnumerableOwnPropertySymbols(target) {\n\treturn Object.getOwnPropertySymbols\n\t\t? Object.getOwnPropertySymbols(target).filter(function(symbol) {\n\t\t\treturn Object.propertyIsEnumerable.call(target, symbol)\n\t\t})\n\t\t: []\n}\n\nfunction getKeys(target) {\n\treturn Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))\n}\n\nfunction propertyIsOnObject(object, property) {\n\ttry {\n\t\treturn property in object\n\t} catch(_) {\n\t\treturn false\n\t}\n}\n\n// Protects from prototype poisoning and unexpected merging up the prototype chain.\nfunction propertyIsUnsafe(target, key) {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tgetKeys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tgetKeys(source).forEach(function(key) {\n\t\tif (propertyIsUnsafe(target, key)) {\n\t\t\treturn\n\t\t}\n\n\t\tif (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\t// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()\n\t// implementations can use it. The caller may not replace it.\n\toptions.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n","\"use strict\";var ne=Object.defineProperty;var ge=Object.getOwnPropertyDescriptor;var be=Object.getOwnPropertyNames;var Te=Object.prototype.hasOwnProperty;var Ae=(e,t)=>{for(var r in t)ne(e,r,{get:t[r],enumerable:!0})},Ie=(e,t,r,n)=>{if(t&&typeof t==\"object\"||typeof t==\"function\")for(let i of be(t))!Te.call(e,i)&&i!==r&&ne(e,i,{get:()=>t[i],enumerable:!(n=ge(t,i))||n.enumerable});return e};var De=e=>Ie(ne({},\"__esModule\",{value:!0}),e);var Be={};Ae(Be,{Immer:()=>J,applyPatches:()=>Ce,castDraft:()=>ke,castImmutable:()=>Ke,createDraft:()=>Re,current:()=>re,enableMapSet:()=>xe,enablePatches:()=>Pe,finishDraft:()=>ve,freeze:()=>K,immerable:()=>N,isDraft:()=>O,isDraftable:()=>A,nothing:()=>j,original:()=>le,produce:()=>Fe,produceWithPatches:()=>Ne,setAutoFreeze:()=>ze,setUseStrictShallowCopy:()=>je});module.exports=De(Be);var j=Symbol.for(\"immer-nothing\"),N=Symbol.for(\"immer-draftable\"),u=Symbol.for(\"immer-state\");function h(e,...t){throw new Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var z=Object.getPrototypeOf;function O(e){return!!e&&!!e[u]}function A(e){return e?ye(e)||Array.isArray(e)||!!e[N]||!!e.constructor?.[N]||v(e)||k(e):!1}var Oe=Object.prototype.constructor.toString();function ye(e){if(!e||typeof e!=\"object\")return!1;let t=z(e);if(t===null)return!0;let r=Object.hasOwnProperty.call(t,\"constructor\")&&t.constructor;return r===Object?!0:typeof r==\"function\"&&Function.toString.call(r)===Oe}function le(e){return O(e)||h(15,e),e[u].t}function _(e,t){C(e)===0?Reflect.ownKeys(e).forEach(r=>{t(r,e[r],e)}):e.forEach((r,n)=>t(n,r,e))}function C(e){let t=e[u];return t?t.o:Array.isArray(e)?1:v(e)?2:k(e)?3:0}function R(e,t){return C(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function X(e,t){return C(e)===2?e.get(t):e[t]}function Q(e,t,r){let n=C(e);n===2?e.set(t,r):n===3?e.add(r):e[t]=r}function pe(e,t){return e===t?e!==0||1/e===1/t:e!==e&&t!==t}function v(e){return e instanceof Map}function k(e){return e instanceof Set}function T(e){return e.e||e.t}function L(e,t){if(v(e))return new Map(e);if(k(e))return new Set(e);if(Array.isArray(e))return Array.prototype.slice.call(e);let r=ye(e);if(t===!0||t===\"class_only\"&&!r){let n=Object.getOwnPropertyDescriptors(e);delete n[u];let i=Reflect.ownKeys(n);for(let f=0;f<i.length;f++){let l=i[f],c=n[l];c.writable===!1&&(c.writable=!0,c.configurable=!0),(c.get||c.set)&&(n[l]={configurable:!0,writable:!0,enumerable:c.enumerable,value:e[l]})}return Object.create(z(e),n)}else{let n=z(e);if(n!==null&&r)return{...e};let i=Object.create(n);return Object.assign(i,e)}}function K(e,t=!1){return $(e)||O(e)||!A(e)||(C(e)>1&&(e.set=e.add=e.clear=e.delete=Me),Object.freeze(e),t&&Object.entries(e).forEach(([r,n])=>K(n,!0))),e}function Me(){h(2)}function $(e){return Object.isFrozen(e)}var ae={};function w(e){let t=ae[e];return t||h(0,e),t}function Y(e,t){ae[e]||(ae[e]=t)}var U;function B(){return U}function _e(e,t){return{a:[],i:e,p:t,P:!0,d:0}}function oe(e,t){t&&(w(\"Patches\"),e.f=[],e.h=[],e.b=t)}function V(e){Z(e),e.a.forEach(we),e.a=null}function Z(e){e===U&&(U=e.i)}function ie(e){return U=_e(U,e)}function we(e){let t=e[u];t.o===0||t.o===1?t.x():t.m=!0}function se(e,t){t.d=t.a.length;let r=t.a[0];return e!==void 0&&e!==r?(r[u].s&&(V(t),h(4)),A(e)&&(e=ee(t,e),t.i||te(t,e)),t.f&&w(\"Patches\").T(r[u].t,e,t.f,t.h)):e=ee(t,r,[]),V(t),t.f&&t.b(t.f,t.h),e!==j?e:void 0}function ee(e,t,r){if($(t))return t;let n=t[u];if(!n)return _(t,(i,f)=>de(e,n,t,i,f,r)),t;if(n.n!==e)return t;if(!n.s)return te(e,n.t,!0),n.t;if(!n.c){n.c=!0,n.n.d--;let i=n.e,f=i,l=!1;n.o===3&&(f=new Set(i),i.clear(),l=!0),_(f,(c,b)=>de(e,n,i,c,b,r,l)),te(e,i,!1),r&&e.f&&w(\"Patches\").g(n,r,e.f,e.h)}return n.e}function de(e,t,r,n,i,f,l){if(O(i)){let c=f&&t&&t.o!==3&&!R(t.r,n)?f.concat(n):void 0,b=ee(e,i,c);if(Q(r,n,b),O(b))e.P=!1;else return}else l&&r.add(i);if(A(i)&&!$(i)){if(!e.p.y&&e.d<1)return;ee(e,i),(!t||!t.n.i)&&typeof n!=\"symbol\"&&Object.prototype.propertyIsEnumerable.call(r,n)&&te(e,i)}}function te(e,t,r=!1){!e.i&&e.p.y&&e.P&&K(t,r)}function he(e,t){let r=Array.isArray(e),n={o:r?1:0,n:t?t.n:B(),s:!1,c:!1,r:{},i:t,t:e,u:null,e:null,x:null,l:!1},i=n,f=ue;r&&(i=[n],f=q);let{revoke:l,proxy:c}=Proxy.revocable(i,f);return n.u=c,n.x=l,c}var ue={get(e,t){if(t===u)return e;let r=T(e);if(!R(r,t))return Ee(e,r,t);let n=r[t];return e.c||!A(n)?n:n===ce(e.t,t)?(fe(e),e.e[t]=W(n,e)):n},has(e,t){return t in T(e)},ownKeys(e){return Reflect.ownKeys(T(e))},set(e,t,r){let n=me(T(e),t);if(n?.set)return n.set.call(e.u,r),!0;if(!e.s){let i=ce(T(e),t),f=i?.[u];if(f&&f.t===r)return e.e[t]=r,e.r[t]=!1,!0;if(pe(r,i)&&(r!==void 0||R(e.t,t)))return!0;fe(e),E(e)}return e.e[t]===r&&(r!==void 0||t in e.e)||Number.isNaN(r)&&Number.isNaN(e.e[t])||(e.e[t]=r,e.r[t]=!0),!0},deleteProperty(e,t){return ce(e.t,t)!==void 0||t in e.t?(e.r[t]=!1,fe(e),E(e)):delete e.r[t],e.e&&delete e.e[t],!0},getOwnPropertyDescriptor(e,t){let r=T(e),n=Reflect.getOwnPropertyDescriptor(r,t);return n&&{writable:!0,configurable:e.o!==1||t!==\"length\",enumerable:n.enumerable,value:r[t]}},defineProperty(){h(11)},getPrototypeOf(e){return z(e.t)},setPrototypeOf(){h(12)}},q={};_(ue,(e,t)=>{q[e]=function(){return arguments[0]=arguments[0][0],t.apply(this,arguments)}});q.deleteProperty=function(e,t){return q.set.call(this,e,t,void 0)};q.set=function(e,t,r){return ue.set.call(this,e[0],t,r,e[0])};function ce(e,t){let r=e[u];return(r?T(r):e)[t]}function Ee(e,t,r){let n=me(t,r);return n?\"value\"in n?n.value:n.get?.call(e.u):void 0}function me(e,t){if(!(t in e))return;let r=z(e);for(;r;){let n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=z(r)}}function E(e){e.s||(e.s=!0,e.i&&E(e.i))}function fe(e){e.e||(e.e=L(e.t,e.n.p.S))}var J=class{constructor(t){this.y=!0;this.S=!1;this.produce=(t,r,n)=>{if(typeof t==\"function\"&&typeof r!=\"function\"){let f=r;r=t;let l=this;return function(b=f,...a){return l.produce(b,o=>r.call(this,o,...a))}}typeof r!=\"function\"&&h(6),n!==void 0&&typeof n!=\"function\"&&h(7);let i;if(A(t)){let f=ie(this),l=W(t,void 0),c=!0;try{i=r(l),c=!1}finally{c?V(f):Z(f)}return oe(f,n),se(i,f)}else if(!t||typeof t!=\"object\"){if(i=r(t),i===void 0&&(i=t),i===j&&(i=void 0),this.y&&K(i,!0),n){let f=[],l=[];w(\"Patches\").T(t,i,f,l),n(f,l)}return i}else h(1,t)};this.produceWithPatches=(t,r)=>{if(typeof t==\"function\")return(l,...c)=>this.produceWithPatches(l,b=>t(b,...c));let n,i;return[this.produce(t,r,(l,c)=>{n=l,i=c}),n,i]};typeof t?.autoFreeze==\"boolean\"&&this.setAutoFreeze(t.autoFreeze),typeof t?.useStrictShallowCopy==\"boolean\"&&this.setUseStrictShallowCopy(t.useStrictShallowCopy)}createDraft(t){A(t)||h(8),O(t)&&(t=re(t));let r=ie(this),n=W(t,void 0);return n[u].l=!0,Z(r),n}finishDraft(t,r){let n=t&&t[u];(!n||!n.l)&&h(9);let{n:i}=n;return oe(i,r),se(void 0,i)}setAutoFreeze(t){this.y=t}setUseStrictShallowCopy(t){this.S=t}applyPatches(t,r){let n;for(n=r.length-1;n>=0;n--){let f=r[n];if(f.path.length===0&&f.op===\"replace\"){t=f.value;break}}n>-1&&(r=r.slice(n+1));let i=w(\"Patches\").A;return O(t)?i(t,r):this.produce(t,f=>i(f,r))}};function W(e,t){let r=v(e)?w(\"MapSet\").I(e,t):k(e)?w(\"MapSet\").D(e,t):he(e,t);return(t?t.n:B()).a.push(r),r}function re(e){return O(e)||h(10,e),Se(e)}function Se(e){if(!A(e)||$(e))return e;let t=e[u],r;if(t){if(!t.s)return t.t;t.c=!0,r=L(e,t.n.p.S)}else r=L(e,!0);return _(r,(n,i)=>{Q(r,n,Se(i))}),t&&(t.c=!1),r}function Pe(){let t=\"replace\",r=\"add\",n=\"remove\";function i(s,S,m,x){switch(s.o){case 0:case 2:return l(s,S,m,x);case 1:return f(s,S,m,x);case 3:return c(s,S,m,x)}}function f(s,S,m,x){let{t:I,r:P}=s,g=s.e;g.length<I.length&&([I,g]=[g,I],[m,x]=[x,m]);for(let y=0;y<I.length;y++)if(P[y]&&g[y]!==I[y]){let d=S.concat([y]);m.push({op:t,path:d,value:p(g[y])}),x.push({op:t,path:d,value:p(I[y])})}for(let y=I.length;y<g.length;y++){let d=S.concat([y]);m.push({op:r,path:d,value:p(g[y])})}for(let y=g.length-1;I.length<=y;--y){let d=S.concat([y]);x.push({op:n,path:d})}}function l(s,S,m,x){let{t:I,e:P}=s;_(s.r,(g,y)=>{let d=X(I,g),H=X(P,g),F=y?R(I,g)?t:r:n;if(d===H&&F===t)return;let D=S.concat(g);m.push(F===n?{op:F,path:D}:{op:F,path:D,value:H}),x.push(F===r?{op:n,path:D}:F===n?{op:r,path:D,value:p(d)}:{op:t,path:D,value:p(d)})})}function c(s,S,m,x){let{t:I,e:P}=s,g=0;I.forEach(y=>{if(!P.has(y)){let d=S.concat([g]);m.push({op:n,path:d,value:y}),x.unshift({op:r,path:d,value:y})}g++}),g=0,P.forEach(y=>{if(!I.has(y)){let d=S.concat([g]);m.push({op:r,path:d,value:y}),x.unshift({op:n,path:d,value:y})}g++})}function b(s,S,m,x){m.push({op:t,path:[],value:S===j?void 0:S}),x.push({op:t,path:[],value:s})}function a(s,S){return S.forEach(m=>{let{path:x,op:I}=m,P=s;for(let H=0;H<x.length-1;H++){let F=C(P),D=x[H];typeof D!=\"string\"&&typeof D!=\"number\"&&(D=\"\"+D),(F===0||F===1)&&(D===\"__proto__\"||D===\"constructor\")&&h(16+3),typeof P==\"function\"&&D===\"prototype\"&&h(16+3),P=X(P,D),typeof P!=\"object\"&&h(16+2,x.join(\"/\"))}let g=C(P),y=o(m.value),d=x[x.length-1];switch(I){case t:switch(g){case 2:return P.set(d,y);case 3:h(16);default:return P[d]=y}case r:switch(g){case 1:return d===\"-\"?P.push(y):P.splice(d,0,y);case 2:return P.set(d,y);case 3:return P.add(y);default:return P[d]=y}case n:switch(g){case 1:return P.splice(d,1);case 2:return P.delete(d);case 3:return P.delete(m.value);default:return delete P[d]}default:h(16+1,I)}}),s}function o(s){if(!A(s))return s;if(Array.isArray(s))return s.map(o);if(v(s))return new Map(Array.from(s.entries()).map(([m,x])=>[m,o(x)]));if(k(s))return new Set(Array.from(s).map(o));let S=Object.create(z(s));for(let m in s)S[m]=o(s[m]);return R(s,N)&&(S[N]=s[N]),S}function p(s){return O(s)?o(s):s}Y(\"Patches\",{A:a,g:i,T:b})}function xe(){class e extends Map{constructor(a,o){super();this[u]={o:2,i:o,n:o?o.n:B(),s:!1,c:!1,e:void 0,r:void 0,t:a,u:this,l:!1,m:!1}}get size(){return T(this[u]).size}has(a){return T(this[u]).has(a)}set(a,o){let p=this[u];return l(p),(!T(p).has(a)||T(p).get(a)!==o)&&(r(p),E(p),p.r.set(a,!0),p.e.set(a,o),p.r.set(a,!0)),this}delete(a){if(!this.has(a))return!1;let o=this[u];return l(o),r(o),E(o),o.t.has(a)?o.r.set(a,!1):o.r.delete(a),o.e.delete(a),!0}clear(){let a=this[u];l(a),T(a).size&&(r(a),E(a),a.r=new Map,_(a.t,o=>{a.r.set(o,!1)}),a.e.clear())}forEach(a,o){let p=this[u];T(p).forEach((s,S,m)=>{a.call(o,this.get(S),S,this)})}get(a){let o=this[u];l(o);let p=T(o).get(a);if(o.c||!A(p)||p!==o.t.get(a))return p;let s=W(p,o);return r(o),o.e.set(a,s),s}keys(){return T(this[u]).keys()}values(){let a=this.keys();return{[Symbol.iterator]:()=>this.values(),next:()=>{let o=a.next();return o.done?o:{done:!1,value:this.get(o.value)}}}}entries(){let a=this.keys();return{[Symbol.iterator]:()=>this.entries(),next:()=>{let o=a.next();if(o.done)return o;let p=this.get(o.value);return{done:!1,value:[o.value,p]}}}}[(u,Symbol.iterator)](){return this.entries()}}function t(c,b){return new e(c,b)}function r(c){c.e||(c.r=new Map,c.e=new Map(c.t))}class n extends Set{constructor(a,o){super();this[u]={o:3,i:o,n:o?o.n:B(),s:!1,c:!1,e:void 0,t:a,u:this,a:new Map,m:!1,l:!1}}get size(){return T(this[u]).size}has(a){let o=this[u];return l(o),o.e?!!(o.e.has(a)||o.a.has(a)&&o.e.has(o.a.get(a))):o.t.has(a)}add(a){let o=this[u];return l(o),this.has(a)||(f(o),E(o),o.e.add(a)),this}delete(a){if(!this.has(a))return!1;let o=this[u];return l(o),f(o),E(o),o.e.delete(a)||(o.a.has(a)?o.e.delete(o.a.get(a)):!1)}clear(){let a=this[u];l(a),T(a).size&&(f(a),E(a),a.e.clear())}values(){let a=this[u];return l(a),f(a),a.e.values()}entries(){let a=this[u];return l(a),f(a),a.e.entries()}keys(){return this.values()}[(u,Symbol.iterator)](){return this.values()}forEach(a,o){let p=this.values(),s=p.next();for(;!s.done;)a.call(o,s.value,s.value,this),s=p.next()}}function i(c,b){return new n(c,b)}function f(c){c.e||(c.e=new Set,c.t.forEach(b=>{if(A(b)){let a=W(b,c);c.a.set(b,a),c.e.add(a)}else c.e.add(b)}))}function l(c){c.m&&h(3,JSON.stringify(T(c)))}Y(\"MapSet\",{I:t,D:i})}var M=new J,Fe=M.produce,Ne=M.produceWithPatches.bind(M),ze=M.setAutoFreeze.bind(M),je=M.setUseStrictShallowCopy.bind(M),Ce=M.applyPatches.bind(M),Re=M.createDraft.bind(M),ve=M.finishDraft.bind(M);function ke(e){return e}function Ke(e){return e}0&&(module.exports={Immer,applyPatches,castDraft,castImmutable,createDraft,current,enableMapSet,enablePatches,finishDraft,freeze,immerable,isDraft,isDraftable,nothing,original,produce,produceWithPatches,setAutoFreeze,setUseStrictShallowCopy});\n//# sourceMappingURL=immer.cjs.production.js.map","\n'use strict'\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./immer.cjs.production.js')\n} else {\n module.exports = require('./immer.cjs.development.js')\n}","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Data, Mark, Scale, Signal, SourceData } from 'vega';\n\nimport {\n BACKGROUND_COLOR,\n COLOR_SCALE,\n DEFAULT_COLOR,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_METRIC,\n DEFAULT_TIME_DIMENSION,\n FILTERED_TABLE,\n HIGHLIGHTED_ITEM,\n SELECTED_ITEM,\n SELECTED_SERIES,\n} from '@spectrum-charts/constants';\nimport { spectrumColors } from '@spectrum-charts/themes';\nimport { toCamelCase } from '@spectrum-charts/utils';\n\nimport {\n addTooltipData,\n addTooltipSignals,\n isHighlightedByDimension,\n isHighlightedByGroup,\n} from '../chartTooltip/chartTooltipUtils';\nimport { addTimeTransform, getFilteredTableData, getTableData, getTransformSort } from '../data/dataUtils';\nimport { hasPopover, hasTooltip, isInteractive } from '../marks/markUtils';\nimport { addContinuousDimensionScale, addFieldToFacetScaleDomain, addMetricScale } from '../scale/scaleSpecBuilder';\nimport {\n addHighlightedSeriesSignalEvents,\n getControlledHoveredGroupSignal,\n getControlledHoveredIdSignal,\n} from '../signal/signalSpecBuilder';\nimport {\n AreaOptions,\n AreaSpecOptions,\n ChartPopoverOptions,\n ColorScheme,\n HighlightedItem,\n ScSpec,\n ScaleType,\n} from '../types';\nimport { getAreaMark, getX } from './areaUtils';\n\nexport const addArea = produce<\n ScSpec,\n [AreaOptions & { colorScheme?: ColorScheme; highlightedItem?: HighlightedItem; index?: number; idKey: string }]\n>(\n (\n spec,\n {\n chartPopovers = [],\n chartTooltips = [],\n color = DEFAULT_COLOR,\n colorScheme = DEFAULT_COLOR_SCHEME,\n dimension = DEFAULT_TIME_DIMENSION,\n index = 0,\n metric = DEFAULT_METRIC,\n metricStart,\n metricEnd,\n name,\n opacity = 0.8,\n scaleType = 'time',\n ...options\n }\n ) => {\n // put options back together now that all defaults are set\n const areaOptions: AreaSpecOptions = {\n chartPopovers,\n chartTooltips,\n color,\n colorScheme,\n dimension,\n index,\n metric,\n name: toCamelCase(name || `area${index}`),\n scaleType,\n opacity,\n metricStart,\n metricEnd,\n ...options,\n };\n\n // if either start or end is defined but not both, error to the console and default back to metric\n if ((metricStart || metricEnd) && !(metricStart && metricEnd)) {\n console.error(\n `${metricEnd ? 'metricEnd' : 'metricStart'} is defined but ${\n metricEnd ? 'metricStart' : 'metricEnd'\n } is not. Both must be defined in order to use the \"start and end\" method. Defaulting back to 'metric = ${metric}'`\n );\n areaOptions.metricEnd = undefined;\n areaOptions.metricStart = undefined;\n }\n\n spec.data = addData(spec.data ?? [], areaOptions);\n spec.signals = addSignals(spec.signals ?? [], areaOptions);\n spec.scales = setScales(spec.scales ?? [], areaOptions);\n spec.marks = addAreaMarks(spec.marks ?? [], areaOptions);\n\n return spec;\n }\n);\n\nexport const addData = produce<Data[], [AreaSpecOptions]>((data, areaOptions) => {\n const { color, dimension, highlightedItem, metric, metricEnd, metricStart, name, order, scaleType } = areaOptions;\n if (scaleType === 'time') {\n const tableData = getTableData(data);\n tableData.transform = addTimeTransform(tableData.transform ?? [], dimension);\n }\n\n if (!metricEnd || !metricStart) {\n const filteredTableData = getFilteredTableData(data);\n // if metricEnd and metricStart don't exist, then we are using metric so we will support stacked\n filteredTableData.transform = [\n ...(filteredTableData.transform ?? []),\n {\n type: 'stack',\n groupby: [dimension],\n field: metric,\n sort: getTransformSort(order),\n as: [`${metric}0`, `${metric}1`],\n },\n ];\n }\n\n if (isInteractive(areaOptions) || highlightedItem !== undefined) {\n const areaHasPopover = hasPopover(areaOptions);\n const areaHasTooltip = hasTooltip(areaOptions);\n data.push(\n getAreaHighlightedData(name, areaOptions.idKey, areaHasTooltip, areaHasPopover, isHighlightedByGroup(areaOptions))\n );\n if (areaHasPopover) {\n data.push({\n name: `${name}_selectedDataSeries`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'filter',\n expr: `isValid(${SELECTED_SERIES}) && ${SELECTED_SERIES} === datum.${color}`,\n },\n ],\n });\n }\n }\n addTooltipData(data, areaOptions, false);\n});\n\nexport const getAreaHighlightedData = (\n name: string,\n idKey: string,\n hasTooltip: boolean,\n hasPopover: boolean,\n hasGroupId: boolean\n): SourceData => {\n let expr = '';\n if (hasGroupId) {\n expr += `${name}_controlledHoveredGroup === datum.${name}_highlightGroupId`;\n } else {\n expr += `isArray(${HIGHLIGHTED_ITEM}) && indexof(${HIGHLIGHTED_ITEM}, datum.${idKey}) > -1 || ${HIGHLIGHTED_ITEM} === datum.${idKey}`;\n if (hasTooltip) {\n expr = `${name}_controlledHoveredId === datum.${idKey} || ${expr}`;\n }\n }\n if (hasPopover) {\n expr = `isValid(${SELECTED_ITEM}) && ${SELECTED_ITEM} === datum.${idKey} || !isValid(${SELECTED_ITEM}) && ${expr}`;\n }\n return {\n name: `${name}_highlightedData`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'filter',\n expr,\n },\n ],\n };\n};\n\nexport const addSignals = produce<Signal[], [AreaSpecOptions]>((signals, areaOptions) => {\n const { chartTooltips, name } = areaOptions;\n if (!isInteractive(areaOptions)) return;\n addHighlightedSeriesSignalEvents(signals, name, 1, chartTooltips[0]?.excludeDataKeys);\n if (areaOptions.highlightedItem) {\n addHighlightedItemEvents(signals, name);\n }\n if (!isHighlightedByGroup(areaOptions)) {\n signals.push(getControlledHoveredIdSignal(name));\n } else {\n signals.push(getControlledHoveredGroupSignal(name));\n }\n addTooltipSignals(signals, areaOptions);\n});\n\n/**\n * Adds an on event that clears the controlled highlighted item signal value when the user mouses over the area.\n * @param signals\n * @param areaName\n */\nexport const addHighlightedItemEvents = (signals: Signal[], areaName: string) => {\n const highlightedItemSignal = signals.find((signal) => signal.name === HIGHLIGHTED_ITEM);\n if (highlightedItemSignal) {\n if (highlightedItemSignal.on === undefined) {\n highlightedItemSignal.on = [];\n }\n // as soon as the user mouses over the area, we want to null out the highlighted item\n highlightedItemSignal.on.push(...[{ events: `@${areaName}:mouseover`, update: 'null' }]);\n }\n};\n\nexport const setScales = produce<Scale[], [AreaSpecOptions]>(\n (scales, { metric, metricEnd, metricStart, dimension, color, scaleType, padding }) => {\n // add dimension scale\n addContinuousDimensionScale(scales, { scaleType, dimension, padding });\n // add color to the color domain\n addFieldToFacetScaleDomain(scales, COLOR_SCALE, color);\n // find the linear scale and add our field to it\n if (!metricEnd || !metricStart) {\n metricStart = `${metric}0`;\n metricEnd = `${metric}1`;\n }\n addMetricScale(scales, [metricStart, metricEnd]);\n return scales;\n }\n);\n\nexport const addAreaMarks = produce<Mark[], [AreaSpecOptions]>((marks, areaOptions) => {\n const {\n chartPopovers,\n chartTooltips,\n color,\n colorScheme,\n dimension,\n highlightedItem,\n metric,\n name,\n opacity,\n scaleType,\n } = areaOptions;\n let { metricStart, metricEnd } = areaOptions;\n let isStacked = false;\n if (!metricEnd || !metricStart) {\n isStacked = true;\n metricStart = `${metric}0`;\n metricEnd = `${metric}1`;\n }\n marks.push(\n {\n name: `${name}_group`,\n type: 'group',\n from: {\n facet: {\n name: `${name}_facet`,\n data: FILTERED_TABLE,\n groupby: color,\n },\n },\n marks: [\n getAreaMark({\n chartPopovers,\n chartTooltips,\n color,\n colorScheme,\n dimension,\n isHighlightedByGroup: isHighlightedByGroup(areaOptions),\n isStacked,\n highlightedItem,\n metricStart,\n metricEnd,\n name,\n opacity,\n scaleType,\n }),\n ...getAnchorPointMark(areaOptions),\n ],\n },\n ...getSelectedAreaMarks({ chartPopovers, name, scaleType, color, dimension, metricEnd, metricStart }),\n ...getHoverMarks(areaOptions)\n );\n return marks;\n});\n\n/**\n * returns a transparent point that gets used by the popover to anchor to\n */\nconst getAnchorPointMark = (areaOptions: AreaSpecOptions): Mark[] => {\n const { name, dimension, metric, scaleType } = areaOptions;\n if (!isInteractive(areaOptions)) return [];\n return [\n {\n name: `${name}_anchorPoint`,\n type: 'symbol',\n from: { data: `${name}_highlightedData` },\n interactive: false,\n encode: {\n enter: {\n y: { scale: 'yLinear', field: `${metric}1` },\n stroke: { value: 'transparent' },\n fill: { value: 'transparent' },\n },\n update: {\n x: getX(scaleType, dimension),\n },\n },\n },\n ];\n};\n\n/**\n * returns a circle symbol and a rule on the hovered/selected point\n */\nconst getHoverMarks = (areaOptions: AreaSpecOptions): Mark[] => {\n const { name, dimension, highlightedItem, metric, scaleType, color } = areaOptions;\n if (!isInteractive(areaOptions) && highlightedItem === undefined) return [];\n const highlightMarks: Mark[] = [\n {\n name: `${name}_point`,\n type: 'symbol',\n from: { data: `${name}_highlightedData` },\n interactive: false,\n encode: {\n enter: {\n y: { scale: 'yLinear', field: `${metric}1` },\n stroke: { scale: COLOR_SCALE, field: color },\n fill: { signal: BACKGROUND_COLOR },\n },\n update: {\n x: getX(scaleType, dimension),\n },\n },\n },\n ];\n if (isHighlightedByDimension(areaOptions) || highlightedItem) {\n highlightMarks.unshift({\n name: `${name}_rule`,\n type: 'rule',\n from: { data: `${name}_highlightedData` },\n interactive: false,\n encode: {\n enter: {\n y: { value: 0 },\n y2: { signal: 'height' },\n strokeWidth: { value: 1 },\n },\n update: {\n x: getX(scaleType, dimension),\n },\n },\n });\n }\n return highlightMarks;\n};\n\n/**\n * returns an area mark for the blue border around the selected area.\n */\nconst getSelectedAreaMarks = ({\n chartPopovers,\n name,\n scaleType,\n color,\n dimension,\n metricEnd,\n metricStart,\n}: {\n chartPopovers: ChartPopoverOptions[];\n name: string;\n scaleType: ScaleType;\n color: string;\n dimension: string;\n metricEnd: string;\n metricStart: string;\n}): Mark[] => {\n if (!chartPopovers.length) return [];\n return [\n {\n name: `${name}_selectBorder`,\n type: 'area',\n from: { data: `${name}_selectedDataSeries` },\n interactive: false,\n encode: {\n enter: {\n y: { scale: 'yLinear', field: metricStart },\n y2: { scale: 'yLinear', field: metricEnd },\n // need to fill this so the white border doesn't slightly bleed around the blue select border\n fill: { scale: COLOR_SCALE, field: color },\n stroke: { value: spectrumColors.light['static-blue'] },\n strokeWidth: { value: 2 },\n strokeJoin: { value: 'round' },\n },\n update: {\n // this has to be in update because when you resize the window that doesn't rebuild the spec\n // but it may change the x position if it causes the chart to resize\n x: getX(scaleType, dimension),\n },\n },\n },\n ];\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { AreaMark, NumericValueRef, ProductionRule } from 'vega';\n\nimport {\n DEFAULT_OPACITY_RULE,\n DEFAULT_TRANSFORMED_TIME_DIMENSION,\n HIGHLIGHTED_ITEM,\n HIGHLIGHTED_SERIES,\n HIGHLIGHT_CONTRAST_RATIO,\n SELECTED_SERIES,\n SERIES_ID,\n} from '@spectrum-charts/constants';\n\nimport {\n getBorderStrokeEncodings,\n getColorProductionRule,\n getCursor,\n getTooltip,\n isInteractive,\n} from '../marks/markUtils';\nimport {\n ChartPopoverOptions,\n ChartTooltipOptions,\n ColorFacet,\n ColorScheme,\n HighlightedItem,\n ScaleType,\n} from '../types';\n\nexport interface AreaMarkOptions {\n color: ColorFacet;\n colorScheme: ColorScheme;\n dimension: string;\n displayOnHover?: boolean;\n highlightedItem?: HighlightedItem;\n isHighlightedByGroup?: boolean;\n isMetricRange?: boolean;\n isStacked: boolean;\n metricStart: string;\n metricEnd: string;\n name: string;\n opacity: number;\n parentName?: string; // Optional name of mark that this area is a child of. Used for metric ranges.\n scaleType: ScaleType;\n\n chartPopovers?: ChartPopoverOptions[];\n chartTooltips?: ChartTooltipOptions[];\n}\n\nexport const getAreaMark = (\n areaOptions: AreaMarkOptions,\n dataSource: string = `${areaOptions.name}_facet`\n): AreaMark => {\n const {\n name,\n chartPopovers,\n chartTooltips,\n color,\n colorScheme,\n metricStart,\n metricEnd,\n isStacked,\n scaleType,\n dimension,\n opacity,\n } = areaOptions;\n return {\n name,\n description: name,\n type: 'area',\n from: { data: dataSource },\n interactive: isInteractive(areaOptions),\n encode: {\n enter: {\n y: { scale: 'yLinear', field: metricStart },\n y2: { scale: 'yLinear', field: metricEnd },\n fill: getColorProductionRule(color, colorScheme),\n tooltip: getTooltip(chartTooltips ?? [], name),\n ...getBorderStrokeEncodings(isStacked, true),\n },\n update: {\n // this has to be in update because when you resize the window that doesn't rebuild the spec\n // but it may change the x position if it causes the chart to resize\n x: getX(scaleType, dimension),\n cursor: getCursor(chartPopovers ?? []),\n fillOpacity: { value: opacity },\n opacity: getAreaOpacity(areaOptions),\n },\n },\n };\n};\n\nexport function getAreaOpacity(areaOptions: AreaMarkOptions): ProductionRule<NumericValueRef> | undefined {\n const { chartPopovers, displayOnHover, isHighlightedByGroup, isMetricRange, highlightedItem, name } = areaOptions;\n // if metric ranges only display when hovering, we don't need to include other hover rules for this specific area\n const fadedOpacity = 1 / HIGHLIGHT_CONTRAST_RATIO;\n if (isMetricRange && displayOnHover) {\n return [\n { test: `isValid(${HIGHLIGHTED_SERIES}) && ${HIGHLIGHTED_SERIES} === datum.${SERIES_ID}`, value: 1 },\n {\n test: `isValid(${HIGHLIGHTED_ITEM}) && indexof(pluck(data('${name}_highlightedData'), '${SERIES_ID}'), datum.${SERIES_ID}) > -1`,\n },\n { test: `isValid(${SELECTED_SERIES}) && ${SELECTED_SERIES} === datum.${SERIES_ID}`, value: 1 },\n { value: 0 },\n ];\n }\n\n if (!isInteractive(areaOptions) && !highlightedItem) {\n return [DEFAULT_OPACITY_RULE];\n }\n\n const opacityRules: ProductionRule<NumericValueRef> = [];\n if (isHighlightedByGroup) {\n opacityRules.push({\n test: `indexof(pluck(data('${name}_highlightedData'), '${SERIES_ID}'), datum.${SERIES_ID}) !== -1`,\n value: 1,\n });\n }\n // if an area is hovered or selected, all other areas should have half opacity\n if (!isMetricRange && chartPopovers?.length) {\n return [\n ...opacityRules,\n {\n test: `!isValid(${SELECTED_SERIES}) && isValid(${HIGHLIGHTED_SERIES}) && ${HIGHLIGHTED_SERIES} !== datum.${SERIES_ID}`,\n value: fadedOpacity,\n },\n {\n test: `!isValid(${SELECTED_SERIES}) && length(data('${name}_highlightedData')) > 0 && indexof(pluck(data('${name}_highlightedData'), '${SERIES_ID}'), datum.${SERIES_ID}) === -1`,\n value: fadedOpacity,\n },\n {\n test: `isValid(${SELECTED_SERIES}) && ${SELECTED_SERIES} !== datum.${SERIES_ID}`,\n value: fadedOpacity,\n },\n DEFAULT_OPACITY_RULE,\n ];\n }\n\n return [\n ...opacityRules,\n {\n test: `isValid(${HIGHLIGHTED_SERIES}) && ${HIGHLIGHTED_SERIES} !== datum.${SERIES_ID}`,\n value: fadedOpacity,\n },\n {\n test: `length(data('${name}_highlightedData')) > 0 && indexof(pluck(data('${name}_highlightedData'), '${SERIES_ID}'), datum.${SERIES_ID}) === -1`,\n value: fadedOpacity,\n },\n DEFAULT_OPACITY_RULE,\n ];\n}\n\nexport const getX = (scaleType: ScaleType, dimension: string): ProductionRule<NumericValueRef> => {\n if (scaleType === 'time') {\n return { scale: 'xTime', field: DEFAULT_TRANSFORMED_TIME_DIMENSION };\n } else if (scaleType === 'linear') {\n return { scale: 'xLinear', field: dimension };\n }\n return { scale: 'xPoint', field: dimension };\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {\n Align,\n Baseline,\n EncodeEntry,\n FontWeight,\n GuideEncodeEntry,\n NumberValue,\n ProductionRule,\n TextEncodeEntry,\n TextValueRef,\n TickCount,\n} from 'vega';\n\nimport { getTextNumberFormat } from '../textUtils';\nimport { AxisSpecOptions, Granularity, Label, LabelAlign, Orientation, Position } from '../types';\nimport { isVerticalAxis } from './axisUtils';\n\n/**\n * Gets the display value of the label. If it's an object, it will return the value property, otherwise it will return the label.\n * @param label\n * @returns string | number\n */\nexport const getLabelValue = (label: Label | number | string): string | number => {\n if (typeof label === 'object') {\n return label.value;\n }\n return label;\n};\n\n/**\n * Gets the label format values based on the granularity\n * @param granularity\n * @returns [secondaryFormat, primaryFormat, tickCount]\n */\nexport const getTimeLabelFormats = (\n granularity: Granularity\n): { secondaryLabelFormat: string; primaryLabelFormat: string; tickCount: TickCount } => {\n switch (granularity) {\n case 'second':\n return { secondaryLabelFormat: ':%S', primaryLabelFormat: '%-I:%M %p', tickCount: 'second' };\n case 'minute':\n return { secondaryLabelFormat: '%-I:%M %p', primaryLabelFormat: '%b %-d', tickCount: 'minute' };\n case 'hour':\n return { secondaryLabelFormat: '%-I %p', primaryLabelFormat: '%b %-d', tickCount: 'hour' };\n case 'day':\n return { secondaryLabelFormat: '%-d', primaryLabelFormat: '%b', tickCount: 'day' };\n case 'week':\n return { secondaryLabelFormat: '%-d', primaryLabelFormat: '%b', tickCount: 'week' };\n case 'month':\n return { secondaryLabelFormat: '%b', primaryLabelFormat: '%Y', tickCount: 'month' };\n case 'quarter':\n return { secondaryLabelFormat: 'Q%q', primaryLabelFormat: '%Y', tickCount: { interval: 'month', step: 3 } };\n case 'year':\n return { secondaryLabelFormat: '%Y', primaryLabelFormat: '', tickCount: 'year' };\n default:\n return { secondaryLabelFormat: '%-d', primaryLabelFormat: '%b', tickCount: 'day' };\n }\n};\n\n/**\n * label align can be set in a controlled manner using the `labels` and `subLabels` options\n * This function will return the correct align and baseline encodings based on the labelAlign and position\n * @param position\n * @param labelOrientaion\n * @param labelAlign\n * @returns align and baseline\n */\nexport const getControlledLabelAnchorValues = (\n position: Position,\n labelOrientaion: Orientation,\n labelAlign?: LabelAlign\n): { align: Align | undefined; baseline: Baseline | undefined } => {\n // if there isn't a labelAlign, we don't want to set the align or baseline\n if (!labelAlign) return { align: undefined, baseline: undefined };\n return getLabelAnchor(position, labelOrientaion, labelAlign);\n};\n\n/**\n * gets the values for labelAlign and labelBaseline based on the `labelAlign`, `labelOrientation`, and `position` options\n * vegaLabelAlign and vegaLabelBaseline options can be used to override these values\n * @param position\n * @param labelOrientaion\n * @param labelAlign\n * @param vegaLabelAlign\n * @param vegaLabelBaseline\n * @returns labelAlign and labelBaseline\n */\nexport const getLabelAnchorValues = (\n position: Position,\n labelOrientaion: Orientation,\n labelAlign: LabelAlign,\n vegaLabelAlign?: Align,\n vegaLabelBaseline?: Baseline\n): { labelAlign: Align; labelBaseline: Baseline } => {\n const { align, baseline } = getLabelAnchor(position, labelOrientaion, labelAlign);\n // if vegaLabelAlign or vegaLabelBaseline are set, we want to use those values instead of the calculated values\n return {\n labelAlign: vegaLabelAlign ?? align,\n labelBaseline: vegaLabelBaseline ?? baseline,\n };\n};\n\n/**\n * gets the label align and baseline values based on the `labelAlign`, `labelOrientation`, and `position` options\n * @param position\n * @param labelOrientaion\n * @param labelAlign\n * @returns align and baseline\n */\nexport const getLabelAnchor = (\n position: Position,\n labelOrientaion: Orientation,\n labelAlign: LabelAlign\n): { align: Align; baseline: Baseline } => {\n let align: Align;\n let baseline: Baseline;\n if (labelIsParallelToAxis(position, labelOrientaion)) {\n // label direction is parallel to the axis\n // for these, the align depends on the labelAlign and the baseline depends on the position\n const labelAlignToAlign: { [key in LabelAlign]: Align } = {\n start: 'left',\n center: 'center',\n end: 'right',\n };\n align = labelAlignToAlign[labelAlign];\n if (['top', 'left'].includes(position)) {\n // baseline is bottom for top and left axes\n baseline = 'bottom';\n } else {\n // baseline is top for bottom and right axes\n baseline = 'top';\n }\n } else {\n // label direction is perpendicular to the axis\n // for these, baseline depends on the labelAlign and align depends on the position\n const labelAlignToBaseline: { [key in LabelAlign]: Baseline } = {\n start: 'top',\n center: 'middle',\n end: 'bottom',\n };\n baseline = labelAlignToBaseline[labelAlign];\n if (['bottom', 'left'].includes(position)) {\n // bottom and left will always have the anchor on the right side of the text\n align = 'right';\n } else {\n // top and right will always have the anchor on the left side of the text\n align = 'left';\n }\n }\n return { align, baseline };\n};\n\n/**\n * determines if the label orientation is parallel to the axis direction\n * @param position\n * @param labelOrientaion\n * @returns boolean\n */\nexport const labelIsParallelToAxis = (position: Position, labelOrientaion: Orientation): boolean => {\n const axisOrientation = ['top', 'bottom'].includes(position) ? 'horizontal' : 'vertical';\n return axisOrientation === labelOrientaion;\n};\n\n/**\n * gets the label angle based on the `labelOrientation` prop\n * @param labelOrientaion\n * @returns labelAngle: number\n */\nexport const getLabelAngle = (labelOrientaion: Orientation): number => {\n if (labelOrientaion === 'horizontal') {\n return 0;\n }\n // default vertical label should read from bottom to top\n return 270;\n};\n\n/**\n * gets the vega baseline value based on the labelAlign value\n * @param labelAlign\n * @returns\n */\nexport const getLabelBaseline = (\n labelAlign: LabelAlign | undefined,\n position: Position,\n vegaLabelBaseline?: Baseline\n): Baseline | undefined => {\n if (vegaLabelBaseline) return vegaLabelBaseline;\n if (!labelAlign) return;\n if (isVerticalAxis(position)) {\n switch (labelAlign) {\n case 'start':\n return 'top';\n case 'end':\n return 'bottom';\n case 'center':\n default:\n return 'middle';\n }\n }\n};\n\n/**\n * calculates the label offset for a band scale based on the labelAlign\n * @param labelAlign\n * @param scaleName\n * @returns\n */\nexport const getLabelOffset = (\n labelAlign: LabelAlign,\n scaleName: string,\n vegaLabelOffset?: NumberValue\n): NumberValue | undefined => {\n if (vegaLabelOffset !== undefined) return vegaLabelOffset;\n switch (labelAlign) {\n case 'start':\n return { signal: `bandwidth('${scaleName}') / -2` };\n case 'end':\n return { signal: `bandwidth('${scaleName}') / 2` };\n default:\n return undefined;\n }\n};\n\n/**\n * gets the vega label format based on the labelFormat\n * @param type\n * @returns\n */\nexport const getLabelFormat = (\n {\n labelFormat,\n labelOrientation,\n numberFormat,\n position,\n truncateLabels,\n currencyLocale,\n currencyCode,\n }: AxisSpecOptions,\n scaleName: string\n): ProductionRule<TextValueRef> => {\n if (labelFormat === 'percentage') {\n return [{ test: 'isNumber(datum.value)', signal: \"format(datum.value, '~%')\" }, { signal: 'datum.value' }];\n }\n if (labelFormat === 'duration') {\n return { signal: 'formatTimeDurationLabels(datum)' };\n }\n\n return [\n ...getTextNumberFormat(numberFormat, undefined, currencyLocale, currencyCode),\n ...(truncateLabels && scaleName.includes('Band') && labelIsParallelToAxis(position, labelOrientation)\n ? [{ signal: 'truncateText(datum.value, bandwidth(\"xBand\")/(1- paddingInner), \"normal\", 14)' }]\n : [{ signal: 'datum.value' }]),\n ];\n};\n\n/**\n * Gets the axis label encoding\n * @param labelAlign\n * @param labelFontWeight\n * @param labelKey\n * @param position\n * @param signalName\n * @returns updateEncoding\n */\nexport const getAxisLabelsEncoding = (\n labelAlign: LabelAlign,\n labelFontWeight: FontWeight,\n labelKey: 'label' | 'subLabel',\n labelOrientation: Orientation,\n position: Position,\n signalName: string\n): GuideEncodeEntry<TextEncodeEntry> => ({\n update: {\n text: [\n {\n test: `indexof(pluck(${signalName}, 'value'), datum.value) !== -1`,\n signal: `${signalName}[indexof(pluck(${signalName}, 'value'), datum.value)].${labelKey}`,\n },\n { signal: 'datum.value' },\n ],\n fontWeight: [\n {\n test: `indexof(pluck(${signalName}, 'value'), datum.value) !== -1 && ${signalName}[indexof(pluck(${signalName}, 'value'), datum.value)].fontWeight`,\n signal: `${signalName}[indexof(pluck(${signalName}, 'value'), datum.value)].fontWeight`,\n },\n // default to the primary label font weight\n { value: labelFontWeight },\n ],\n ...getEncodedLabelAnchor(position, signalName, labelOrientation, labelAlign),\n },\n});\n\n/**\n * Will return the label align or baseline based on the position\n * These properties are used within the axis label encoding\n * If this is a vertical axis, it will return the correct baseline property and value\n * Otherwise, it will return the correct align property and value\n * @param position\n * @param signalName\n * @param defaultLabelAlign\n * @returns align | baseline\n */\nexport const getEncodedLabelAnchor = (\n position: Position,\n signalName: string,\n labelOrientation: Orientation,\n defaultLabelAlign: LabelAlign\n): EncodeEntry => {\n const baseTestString = `indexof(pluck(${signalName}, 'value'), datum.value) !== -1 && ${signalName}[indexof(pluck(${signalName}, 'value'), datum.value)]`;\n const baseSignalString = `${signalName}[indexof(pluck(${signalName}, 'value'), datum.value)]`;\n const { align, baseline } = getLabelAnchor(position, labelOrientation, defaultLabelAlign);\n\n return {\n align: [{ test: `${baseTestString}.align`, signal: `${baseSignalString}.align` }, { value: align }],\n baseline: [{ test: `${baseTestString}.baseline`, signal: `${baseSignalString}.baseline` }, { value: baseline }],\n };\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {\n EncodeEntry,\n GuideEncodeEntry,\n Mark,\n NumericValueRef,\n ProductionRule,\n RuleMark,\n ScaleType,\n SignalRef,\n SymbolMark,\n TextEncodeEntry,\n TextMark,\n} from 'vega';\n\nimport { DEFAULT_FONT_COLOR, DEFAULT_LABEL_FONT_WEIGHT } from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { getPathFromIcon } from '../specUtils';\nimport { AxisSpecOptions, Position, ReferenceLineOptions, ReferenceLineSpecOptions } from '../types';\nimport { isVerticalAxis } from './axisUtils';\n\nexport const getReferenceLines = (axisOptions: AxisSpecOptions): ReferenceLineSpecOptions[] => {\n return axisOptions.referenceLines.map((referenceLine, index) =>\n applyReferenceLineOptionDefaults(referenceLine, axisOptions, index)\n );\n};\n\nconst applyReferenceLineOptionDefaults = (\n options: ReferenceLineOptions,\n axisOptions: AxisSpecOptions,\n index: number\n): ReferenceLineSpecOptions => ({\n ...options,\n color: options.color || 'gray-800',\n colorScheme: axisOptions.colorScheme,\n iconColor: options.iconColor || DEFAULT_FONT_COLOR,\n labelColor: options.labelColor || DEFAULT_FONT_COLOR,\n labelFontWeight: options.labelFontWeight ?? DEFAULT_LABEL_FONT_WEIGHT,\n layer: options.layer ?? 'front',\n name: `${axisOptions.name}ReferenceLine${index}`,\n});\n\nexport const scaleTypeSupportsReferenceLines = (scaleType: ScaleType | undefined): boolean => {\n const supportedScaleTypes: ScaleType[] = ['band', 'linear', 'point', 'time', 'utc'];\n return Boolean(scaleType && supportedScaleTypes.includes(scaleType));\n};\n\nexport const getReferenceLineMarks = (\n axisOptions: AxisSpecOptions,\n scaleName: string\n): { back: Mark[]; front: Mark[] } => {\n const referenceLineMarks: { back: Mark[]; front: Mark[] } = { back: [], front: [] };\n const referenceLines = getReferenceLines(axisOptions);\n\n for (const referenceLine of referenceLines) {\n const { layer } = referenceLine;\n const positionEncoding = getPositionEncoding(axisOptions, referenceLine, scaleName);\n referenceLineMarks[layer].push(\n ...[\n getReferenceLineRuleMark(axisOptions, referenceLine, positionEncoding),\n ...getReferenceLineSymbolMark(axisOptions, referenceLine, positionEncoding),\n ...getReferenceLineTextMark(axisOptions, referenceLine, positionEncoding),\n ]\n );\n }\n return referenceLineMarks;\n};\n\nexport const getPositionEncoding = (\n { scaleType }: AxisSpecOptions,\n { value, position }: ReferenceLineSpecOptions,\n scaleName: string\n): ProductionRule<NumericValueRef> | SignalRef => {\n const signalValue = typeof value === 'string' ? `'${value}'` : value;\n const halfInnerPaddingFormula = `paddingInner * bandwidth('${scaleName}') / (2 * (1 - paddingInner))`;\n const beforePositionSignal = `scale('${scaleName}', ${signalValue}) - ${halfInnerPaddingFormula}`;\n const centeredPositionSignal = `scale('${scaleName}', ${signalValue}) + bandwidth('${scaleName}') / 2`;\n const afterPositionSignal = `scale('${scaleName}', ${signalValue}) + bandwidth('${scaleName}') + ${halfInnerPaddingFormula}`;\n if (scaleType === 'band') {\n if (position === 'before') return { signal: beforePositionSignal };\n if (position === 'after') return { signal: afterPositionSignal };\n return { signal: centeredPositionSignal };\n }\n return { scale: scaleName, value };\n};\n\nexport const getReferenceLineRuleMark = (\n { position, ticks }: AxisSpecOptions,\n { color, colorScheme, name }: ReferenceLineSpecOptions,\n positionEncoding: ProductionRule<NumericValueRef> | SignalRef\n): RuleMark => {\n const startOffset = ticks ? 9 : 0;\n\n const positionOptions: { [key in Position]: Partial<EncodeEntry> } = {\n top: {\n x: positionEncoding,\n y: { value: -startOffset },\n y2: { signal: 'height' },\n },\n bottom: {\n x: positionEncoding,\n y: { value: 0 },\n y2: { signal: `height + ${startOffset}` },\n },\n left: {\n x: { value: -startOffset },\n x2: { signal: 'width' },\n y: positionEncoding,\n },\n right: {\n x: { value: 0 },\n x2: { signal: `width + ${startOffset}` },\n y: positionEncoding,\n },\n };\n\n return {\n name,\n type: 'rule',\n interactive: false,\n encode: {\n enter: {\n stroke: { value: getColorValue(color, colorScheme) },\n },\n update: {\n ...positionOptions[position],\n },\n },\n };\n};\n\n/**\n * Gets position values for additional marks for the reference line.\n * @param offset\n * @param positionEncoding\n * @param horizontalOffset\n * @returns SymbolMark\n */\nconst getAdditiveMarkPositionOptions = (\n offset: number,\n positionEncoding: ProductionRule<NumericValueRef> | SignalRef,\n horizontalOffset?: number\n) => ({\n top: {\n x: positionEncoding,\n y: { value: -offset },\n },\n bottom: {\n x: positionEncoding,\n y: { signal: `height + ${offset}` },\n },\n left: {\n x: { value: -offset },\n y: { ...positionEncoding, offset: horizontalOffset },\n },\n right: {\n x: { signal: `width + ${offset}` },\n y: { ...positionEncoding, offset: horizontalOffset },\n },\n});\n\n/**\n * Gets the reference line symbol mark\n * @param AxisSpecOptions\n * @param ReferenceLineSpecOptions\n * @param referenceLineIndex\n * @param positionEncoding\n * @returns SymbolMark\n */\nexport const getReferenceLineSymbolMark = (\n { colorScheme, position }: AxisSpecOptions,\n { icon, iconColor, name }: ReferenceLineSpecOptions,\n positionEncoding: ProductionRule<NumericValueRef> | SignalRef\n): SymbolMark[] => {\n if (!icon) return [];\n\n // offset the icon from the edge of the chart area\n const OFFSET = 24;\n const positionOptions = getAdditiveMarkPositionOptions(OFFSET, positionEncoding);\n\n return [\n {\n name: `${name}_symbol`,\n type: 'symbol',\n encode: {\n enter: {\n shape: {\n value: getPathFromIcon(icon),\n },\n size: { value: 324 },\n fill: { value: getColorValue(iconColor, colorScheme) },\n },\n update: {\n ...positionOptions[position],\n },\n },\n },\n ];\n};\n\n/**\n * Gets the reference line text mark\n * @param AxisSpecOptions\n * @param ReferenceLineSpecOptions\n * @param referenceLineIndex\n * @param positionEncoding\n * @returns TextMark\n */\nexport const getReferenceLineTextMark = (\n axisOptions: AxisSpecOptions,\n referenceLineOptions: ReferenceLineSpecOptions,\n positionEncoding: ProductionRule<NumericValueRef> | SignalRef\n): TextMark[] => {\n const { label, name } = referenceLineOptions;\n if (!label) return [];\n\n return [\n {\n name: `${name}_label`,\n type: 'text',\n encode: {\n ...getReferenceLineLabelsEncoding(axisOptions, { ...referenceLineOptions, label }, positionEncoding),\n },\n },\n ];\n};\n\n/**\n * Calculates the vertical and horizontal offsets for reference line labels based on axis position and icon presence\n * @param position The axis position\n * @param icon Whether an icon is present\n * @returns Object containing verticalOffset and horizontalOffset values\n */\nconst calculateReferenceLineOffsets = (position: Position, icon?: string): { verticalOffset: number; horizontalOffset: number } => {\n const isVertical = isVerticalAxis(position);\n let verticalOffset = isVertical ? 40 : 28;\n let horizontalOffset = isVertical ? 4 : 5;\n \n if (icon) {\n if (isVertical) {\n verticalOffset += 25;\n } else {\n verticalOffset += 20;\n }\n if (!isVertical) {\n horizontalOffset += 25;\n verticalOffset += 2;\n }\n }\n \n return { verticalOffset, horizontalOffset };\n};\n\n/**\n * Gets the reference line label encoding\n * @param labelFontWeight\n * @param label\n * @param position\n * @param positionEncoding\n * @param icon\n * @returns updateEncoding\n */\nexport const getReferenceLineLabelsEncoding = (\n { position }: AxisSpecOptions,\n { colorScheme, icon, label, labelColor, labelFontWeight }: ReferenceLineSpecOptions & { label: string },\n positionEncoding: ProductionRule<NumericValueRef> | SignalRef\n): GuideEncodeEntry<TextEncodeEntry> => {\n const { verticalOffset, horizontalOffset } = calculateReferenceLineOffsets(position, icon);\n const positionOptions = getAdditiveMarkPositionOptions(verticalOffset, positionEncoding, horizontalOffset);\n\n return {\n update: {\n text: [\n {\n value: label,\n },\n ],\n fontWeight: [\n // default to the primary label font weight\n { value: labelFontWeight },\n ],\n fill: { value: getColorValue(labelColor, colorScheme) },\n ...getEncodedLabelBaselineAlign(position),\n ...positionOptions[position],\n },\n };\n};\n\n/**\n * Will return the label align or baseline based on the position\n * These properties are used within the reference line label encoding\n * If this is a vertical axis, it will return the correct baseline property and value\n * Otherwise, it will return the correct align property and value\n * @param position\n * @returns align | baseline\n */\nexport const getEncodedLabelBaselineAlign = (position: Position): EncodeEntry => {\n switch (position) {\n case 'top':\n case 'bottom':\n return {\n align: { value: 'center' },\n };\n case 'left':\n case 'right':\n return {\n baseline: { value: 'center' },\n };\n }\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport deepmerge from 'deepmerge';\nimport { produce } from 'immer';\nimport { Axis, Data, GroupMark, Mark, ScaleType, Signal } from 'vega';\n\nimport {\n COLOR_SCALE,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_FONT_COLOR,\n DEFAULT_GRANULARITY,\n DEFAULT_LABEL_ALIGN,\n DEFAULT_LABEL_FONT_WEIGHT,\n DEFAULT_LABEL_ORIENTATION,\n FIRST_RSC_SERIES_ID,\n HIGHLIGHT_CONTRAST_RATIO,\n LAST_RSC_SERIES_ID,\n MOUSE_OVER_SERIES,\n} from '@spectrum-charts/constants';\nimport { spectrumColors } from '@spectrum-charts/themes';\n\nimport {\n addAxisAnnotationAxis,\n addAxisAnnotationData,\n addAxisAnnotationMarks,\n addAxisAnnotationSignals,\n getAxisAnnotationsFromChildren,\n} from '../axisAnnotation/axisAnnotationUtils';\nimport { getDualAxisScaleNames } from '../scale/scaleUtils';\nimport { getGenericValueSignal } from '../signal/signalSpecBuilder';\nimport { AxisOptions, AxisSpecOptions, ColorScheme, Label, Orientation, Position, ScSpec, UserMeta } from '../types';\nimport { getAxisLabelsEncoding, getControlledLabelAnchorValues, getLabelValue } from './axisLabelUtils';\nimport { getReferenceLineMarks, getReferenceLines, scaleTypeSupportsReferenceLines } from './axisReferenceLineUtils';\nimport { encodeAxisTitle, getTrellisAxisOptions, isTrellisedChart } from './axisTrellisUtils';\nimport {\n getBaselineRule,\n getDefaultAxis,\n getIsMetricAxis,\n getOpposingScaleType,\n getScale,\n getSubLabelAxis,\n getTimeAxes,\n hasSubLabels,\n} from './axisUtils';\n\nexport const addAxis = produce<ScSpec, [AxisOptions & { colorScheme?: ColorScheme; index?: number }]>(\n (\n spec,\n {\n name,\n axisAnnotations = [],\n baseline = false,\n baselineOffset = 0,\n colorScheme = DEFAULT_COLOR_SCHEME,\n granularity = DEFAULT_GRANULARITY,\n grid = false,\n hideDefaultLabels = false,\n index = 0,\n labelAlign = DEFAULT_LABEL_ALIGN,\n labelFontWeight = DEFAULT_LABEL_FONT_WEIGHT,\n labelOrientation = DEFAULT_LABEL_ORIENTATION,\n labels = [],\n numberFormat = 'shortNumber',\n position,\n range,\n referenceLines = [],\n subLabels = [],\n ticks = false,\n ...options\n }\n ) => {\n // get the scale that this axis will be associated with\n const scale = getScale(spec.scales ?? [], position);\n const scaleName = name || scale.name;\n const scaleType = scale.type;\n\n // get the opposing scale\n const opposingScaleType = getOpposingScaleType(spec.scales ?? [], position);\n\n // reconstruct options with defaults\n const axisOptions: AxisSpecOptions = {\n axisAnnotations,\n baseline,\n baselineOffset,\n colorScheme,\n granularity,\n grid,\n hideDefaultLabels,\n index,\n labelAlign,\n labelFontWeight,\n labelOrientation,\n labels,\n name: `axis${index}`,\n numberFormat,\n position,\n range,\n referenceLines,\n subLabels,\n ticks,\n scaleType: scaleType ?? 'linear',\n ...options,\n };\n\n const dualMetricAxis = spec.signals?.some((signal) => signal.name === 'firstRscSeriesId');\n\n spec.data = addAxisData(spec.data ?? [], { ...axisOptions, scaleType: scaleType ?? 'linear' });\n spec.signals = addAxisSignals(spec.signals ?? [], axisOptions);\n\n // set custom range if applicable\n if (range && (scaleType === 'linear' || scaleType === 'time')) {\n scale.domain = range;\n }\n\n const usermeta = spec.usermeta;\n spec.axes = addAxes(spec.axes ?? [], {\n ...axisOptions,\n scaleName,\n opposingScaleType,\n usermeta,\n\n // we don't want to show the grid on top level\n // axes for trellised charts\n grid: axisOptions.grid && !isTrellisedChart(spec),\n dualMetricAxis,\n });\n\n spec.marks = addAxesMarks(spec.marks ?? [], {\n ...axisOptions,\n usermeta,\n scaleName,\n opposingScaleType,\n dualMetricAxis,\n });\n\n return spec;\n }\n);\n\nexport const addAxisData = produce<Data[], [AxisSpecOptions & { scaleType: ScaleType }]>((data, options) => {\n const axisAnnotations = getAxisAnnotationsFromChildren(options);\n axisAnnotations.forEach((annotationOptions) => {\n addAxisAnnotationData(data, annotationOptions);\n });\n});\n\nexport const addAxisSignals = produce<Signal[], [AxisSpecOptions]>((signals, options) => {\n const { name, labels, position, subLabels, labelOrientation } = options;\n if (labels?.length) {\n // add all the label properties to a signal so that the axis encoding can use it to style each label correctly\n signals.push(getGenericValueSignal(`${name}_labels`, getLabelSignalValue(labels, position, labelOrientation)));\n }\n if (hasSubLabels(options)) {\n // add all the sublabel properties to a signal so that the axis encoding can use it to style each sublabel correctly\n signals.push(\n getGenericValueSignal(\n `${name}_subLabels`,\n subLabels.map((label) => ({\n ...label,\n // convert label align to vega align\n ...getControlledLabelAnchorValues(position, labelOrientation, label.align),\n }))\n )\n );\n }\n const axisAnnotations = getAxisAnnotationsFromChildren(options);\n axisAnnotations.forEach((annotationOptions) => {\n addAxisAnnotationSignals(signals, annotationOptions);\n });\n});\n\n/**\n * Gets the labels that have style properties on them and gets the correct alignment value based on axis position\n * @param labels\n * @param position\n * @returns\n */\nexport const getLabelSignalValue = (\n labels: (Label | string | number)[],\n position: Position,\n labelOrientation: Orientation\n) =>\n labels\n .map((label) => {\n // if this label is a string or number, then it doesn't need to be a signal\n if (typeof label !== 'object') {\n return;\n }\n return {\n ...label,\n ...getControlledLabelAnchorValues(position, labelOrientation, label.align),\n };\n })\n .filter(Boolean);\n\n/**\n * Applies fill and opacity encoding rules to the secondary metric axis\n * @param axis Axis to apply encoding rules to\n */\nexport function applySecondaryMetricAxisEncodings(axis: Axis): void {\n const secondaryAxisFillRules = [{ signal: `scale('${COLOR_SCALE}', ${LAST_RSC_SERIES_ID})` }];\n\n const secondaryAxisFillOpacityRules = [\n {\n test: `isValid(${MOUSE_OVER_SERIES}) && ${MOUSE_OVER_SERIES} !== ${LAST_RSC_SERIES_ID}`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n },\n ];\n\n const encodings = {\n labels: {\n enter: {\n fill: secondaryAxisFillRules,\n },\n update: {\n fillOpacity: secondaryAxisFillOpacityRules,\n },\n },\n title: {\n enter: {\n fill: secondaryAxisFillRules,\n },\n update: {\n fillOpacity: secondaryAxisFillOpacityRules,\n },\n },\n };\n\n if (!axis.encode) {\n axis.encode = encodings;\n } else {\n axis.encode = deepmerge(axis.encode, encodings);\n }\n}\n\n/**\n * Applies fill and opacity encoding rules to the primary metric axis\n * @param axis Axis to apply encoding rules to\n * @param colorScheme The color scheme (light or dark)\n */\nexport function applyPrimaryMetricAxisEncodings(axis: Axis, colorScheme: ColorScheme = DEFAULT_COLOR_SCHEME): void {\n // Get the appropriate font color value based on the colorScheme (light/dark theme)\n const defaultFontColor = spectrumColors[colorScheme][DEFAULT_FONT_COLOR];\n\n const primaryAxisFillRules = [\n {\n test: `length(domain('${COLOR_SCALE}')) -1 === 1`,\n signal: `scale('${COLOR_SCALE}', ${FIRST_RSC_SERIES_ID})`,\n },\n { value: defaultFontColor },\n ];\n const primaryAxisFillOpacityRules = [\n {\n test: `${MOUSE_OVER_SERIES} === ${LAST_RSC_SERIES_ID}`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n },\n ];\n\n const encodings = {\n labels: {\n update: {\n fill: primaryAxisFillRules,\n fillOpacity: primaryAxisFillOpacityRules,\n },\n },\n title: {\n update: {\n fill: primaryAxisFillRules,\n fillOpacity: primaryAxisFillOpacityRules,\n },\n },\n };\n\n if (!axis.encode) {\n axis.encode = encodings;\n } else {\n axis.encode = deepmerge(axis.encode, encodings);\n }\n}\n\n/**\n * Handles the dual Y axis logic for axis styling\n * @param axis The axis to process\n * @param usermeta The user metadata\n * @param scaleName The name of the scale\n */\nexport function addDualMetricAxisConfig(\n axis: Axis,\n isPrimaryMetricAxis: boolean,\n scaleName: string,\n colorScheme: ColorScheme = DEFAULT_COLOR_SCHEME\n) {\n const scaleNames = getDualAxisScaleNames(scaleName);\n const { primaryScale, secondaryScale } = scaleNames;\n\n if (isPrimaryMetricAxis) {\n axis.scale = primaryScale;\n applyPrimaryMetricAxisEncodings(axis, colorScheme);\n } else {\n axis.scale = secondaryScale;\n applySecondaryMetricAxisEncodings(axis);\n }\n}\n\nexport interface AxisAddOptions extends AxisSpecOptions {\n scaleName: string;\n opposingScaleType?: ScaleType;\n usermeta?: UserMeta;\n dualMetricAxis?: boolean;\n}\n\n/**\n * Add axes to the spec\n * @param axes The axes to add\n * @param options The axis options\n * @returns The updated axes\n */\nexport const addAxes = produce<\n Axis[],\n [\n AxisSpecOptions & {\n scaleName: string;\n opposingScaleType?: string;\n dualMetricAxis?: boolean;\n usermeta: UserMeta;\n }\n ]\n>((axes, { scaleName, opposingScaleType, dualMetricAxis, ...axisOptions }) => {\n const newAxes: Axis[] = [];\n // adds all the trellis axis options if this is a trellis axis\n axisOptions = { ...axisOptions, ...getTrellisAxisOptions(scaleName) };\n const {\n baseline,\n colorScheme,\n usermeta,\n labelAlign,\n labelFontWeight,\n labelFormat,\n labelOrientation,\n name,\n position,\n } = axisOptions;\n\n if (labelFormat === 'time') {\n // time axis actually needs two axes. A primary and secondary.\n newAxes.push(...getTimeAxes(scaleName, axisOptions));\n } else {\n const axis = getDefaultAxis(axisOptions, scaleName);\n // if labels exist, add them to the axis\n if (axisOptions.labels.length) {\n const labels = axisOptions.labels;\n const signalName = `${name}_labels`;\n axis.values = labels.map((label) => getLabelValue(label));\n axis.encode = {\n labels: getAxisLabelsEncoding(labelAlign, labelFontWeight, 'label', labelOrientation, position, signalName),\n };\n }\n\n // if sublabels exist, create a new axis for the sub labels\n if (hasSubLabels(axisOptions)) {\n axis.titlePadding = 24;\n\n // add sublabel axis\n const subLabelAxis = getSubLabelAxis(axisOptions, scaleName);\n\n handleDualMetricAxisConfig({\n dualMetricAxis,\n axis: subLabelAxis,\n usermeta,\n scaleName,\n colorScheme,\n position,\n incrementMetricAxisCount: false,\n });\n\n newAxes.push(subLabelAxis);\n }\n\n handleDualMetricAxisConfig({\n dualMetricAxis,\n axis,\n usermeta,\n scaleName,\n colorScheme,\n position,\n incrementMetricAxisCount: true,\n });\n\n newAxes.unshift(axis);\n }\n\n // add baseline\n if (opposingScaleType !== 'linear') {\n newAxes[0] = setAxisBaseline(newAxes[0], baseline);\n }\n\n if (scaleTypeSupportsReferenceLines(axisOptions.scaleType)) {\n // encode axis to hide labels that overlap reference line icons\n const referenceLines = getReferenceLines(axisOptions);\n referenceLines.forEach((referenceLineOptions) => {\n const { label: referenceLineLabel, icon, value, position: linePosition } = referenceLineOptions;\n const text = newAxes[0].encode?.labels?.update?.text;\n if ((icon || referenceLineLabel) && text && Array.isArray(text) && (!linePosition || linePosition === 'center')) {\n // if the label is within 30 pixels of the reference line icon, hide it\n text.unshift({\n test: `abs(scale('${scaleName}', ${value}) - scale('${scaleName}', datum.value)) < 30`,\n value: '',\n });\n }\n });\n }\n\n const axisAnnotations = getAxisAnnotationsFromChildren(axisOptions);\n axisAnnotations.forEach((annotationOptions) => {\n addAxisAnnotationAxis(newAxes, annotationOptions, scaleName);\n });\n\n axes.push(...newAxes);\n});\n\n/**\n * Adds dual metric axis configuration to the axis\n * This applies color and opacity encodings based on the series involved\n */\nconst handleDualMetricAxisConfig = ({\n dualMetricAxis,\n axis,\n usermeta,\n scaleName,\n colorScheme,\n position,\n incrementMetricAxisCount,\n}: {\n dualMetricAxis: boolean | undefined;\n axis: Axis;\n usermeta: UserMeta;\n scaleName: string;\n colorScheme: ColorScheme;\n position: Position;\n incrementMetricAxisCount: boolean;\n}) => {\n const chartOrientation = usermeta?.chartOrientation ?? 'vertical';\n if (dualMetricAxis && getIsMetricAxis(position, chartOrientation)) {\n if (!usermeta.metricAxisCount) {\n usermeta.metricAxisCount = 0;\n }\n addDualMetricAxisConfig(axis, usermeta.metricAxisCount === 0, scaleName, colorScheme);\n if (incrementMetricAxisCount) {\n usermeta.metricAxisCount++;\n }\n }\n};\n\nexport const addAxesMarks = produce<\n Mark[],\n [\n AxisSpecOptions & {\n scaleName: string;\n scaleType?: ScaleType;\n opposingScaleType?: string;\n dualMetricAxis?: boolean;\n usermeta: UserMeta;\n }\n ]\n>((marks, options) => {\n const { baseline, baselineOffset, opposingScaleType, position, scaleName, scaleType, usermeta } = options;\n\n // only add reference lines to linear or time scales\n if (scaleTypeSupportsReferenceLines(scaleType)) {\n const { back, front } = getReferenceLineMarks(options, scaleName);\n marks.unshift(...back);\n marks.push(...front);\n }\n\n const trellisGroupMark = marks.find((mark) => mark.name?.includes('Trellis')) as GroupMark;\n const isTrellised = Boolean(trellisGroupMark);\n\n if (baseline && opposingScaleType === 'linear') {\n addBaseline(marks, baselineOffset, position, trellisGroupMark);\n }\n\n if (isTrellised) {\n addAxesToTrellisGroup(options, trellisGroupMark, scaleName, usermeta);\n }\n\n const axisAnnotations = getAxisAnnotationsFromChildren(options);\n axisAnnotations.forEach((annotationOptions) => {\n addAxisAnnotationMarks(marks, annotationOptions, scaleName);\n });\n});\n\nfunction addBaseline(marks: Mark[], baselineOffset: number, position: Position, trellisGroupMark: GroupMark) {\n const baselineRule = getBaselineRule(baselineOffset, position);\n\n // if the chart is trellised, add the baseline to the trellis mark group\n if (trellisGroupMark && 'marks' in trellisGroupMark) {\n if (baselineOffset === 0) {\n trellisGroupMark.marks?.push(baselineRule);\n } else {\n trellisGroupMark.marks?.unshift(baselineRule);\n }\n } else if (baselineOffset === 0) {\n marks.push(baselineRule);\n } else {\n marks.unshift(baselineRule);\n }\n}\n\nfunction addAxesToTrellisGroup(\n options: AxisSpecOptions,\n trellisGroupMark: GroupMark,\n scaleName: string,\n usermeta: UserMeta\n) {\n const trellisOrientation = trellisGroupMark.name?.startsWith('x') ? 'horizontal' : 'vertical';\n const axisOrientation = options.position === 'bottom' || options.position === 'top' ? 'horizontal' : 'vertical';\n\n // hide labels if the axis is not in the same orientation as the trellis\n // for example, we don't want x-axis labels on a vertical trellis\n const hideDefaultLabels = options.hideDefaultLabels || trellisOrientation !== axisOrientation;\n\n let scaleType = options.scaleType;\n // get the scale that this axis will be associated with\n if (trellisOrientation === axisOrientation) {\n const scale = getScale(trellisGroupMark.scales ?? [], options.position);\n scaleName = scale.name;\n scaleType = scale.type ?? 'linear';\n } else {\n // if the axis is not the same orientation as the trellis, then we don't display the title\n // because it will be displayed on the root axis at the spec level\n options.title = undefined;\n }\n\n let newAxes = addAxes([], {\n ...options,\n hideDefaultLabels,\n scaleName,\n scaleType,\n dualMetricAxis: false, // trellis axes don't support dualMetricAxis scaling\n usermeta,\n });\n\n // titles on axes within the trellis group have special encodings so that the title is only shown on the first axis\n newAxes = encodeAxisTitle(newAxes, trellisGroupMark);\n\n trellisGroupMark.axes = [...(trellisGroupMark.axes ?? []), ...newAxes];\n}\n\nexport function setAxisBaseline(axis: Axis, baseline = false): Axis {\n // Vega's property is \"domain\" - we use \"baseline\"\n return { ...axis, domain: baseline, domainWidth: 2 };\n}\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Axis, GroupMark, Spec } from 'vega';\n\nimport { AxisSpecOptions } from '../types';\n\n/**\n * Checks the spec to see if it is a trellised chart\n * @param spec\n * @returns\n */\nexport const isTrellisedChart = (spec: Spec): boolean => {\n return /[xy]TrellisGroup/g.test(JSON.stringify(spec));\n};\n\n/**\n * Gets all the custom options for a trellis axis\n * If this axis is not a trellis axis, it will return an empty object\n * @param scaleName\n * @returns trellisAxisOptions\n */\nexport const getTrellisAxisOptions = (scaleName: string): Partial<AxisSpecOptions> => {\n let trellisAxisOptions: Partial<AxisSpecOptions> = {};\n\n // if 'TrellisBand' is in the scale name then this is a trellis axis\n if (scaleName.includes('TrellisBand')) {\n // shift the labels up/left half the scale bandwidth\n const labelOffsetSignal = `bandwidth('${scaleName}') / -2`;\n const axisType = scaleName.startsWith('x') ? 'x' : 'y';\n trellisAxisOptions = {\n position: axisType === 'x' ? 'top' : 'left',\n labelFontWeight: 'bold',\n labelAlign: undefined, // set this to undefined because we will manually control alignment\n title: undefined,\n vegaLabelAlign: 'left',\n vegaLabelBaseline: 'bottom',\n vegaLabelOffset: axisType === 'x' ? { signal: labelOffsetSignal } : { signal: `${labelOffsetSignal} - 8` }, // y axis needs an extra 8px as vertical padding\n vegaLabelPadding: axisType === 'x' ? 8 : 0, // add vertical padding\n };\n }\n return trellisAxisOptions;\n};\n\n/**\n * Adds title encodings so that only the first title is visible.\n * Does not mutate axes but instead returns a copy with the correct encodings added.\n * @param axes\n * @param trellisGroupMark\n * @returns axes\n */\nexport const encodeAxisTitle = (axes: Axis[], trellisGroupMark: GroupMark) => {\n const { facetName, facetGroupBy, trellisScaleName } = getTrellisGroupProperties(trellisGroupMark);\n\n return axes.map((axis) => {\n if (axis.title) {\n return {\n ...axis,\n encode: {\n ...axis.encode,\n title: {\n update: {\n opacity: [\n {\n test: `info(domain('${trellisScaleName}')[0] === data('${facetName}')[0].${facetGroupBy})`,\n value: 1,\n },\n { value: 0 },\n ],\n },\n },\n },\n };\n }\n return axis;\n });\n};\n\n/**\n * Gets properties of the trellis group mark\n * @param groupMark\n * @returns properties\n */\nexport const getTrellisGroupProperties = (\n groupMark: GroupMark\n): { facetGroupBy: string; facetName: string; trellisScaleName: string } => {\n const trellisScaleName = `${(groupMark.name ?? 'x')[0]}TrellisBand`;\n const fromFacet = groupMark.from as { facet: { name: string; groupby: string } };\n\n return { facetGroupBy: fromFacet.facet.groupby, facetName: fromFacet.facet.name, trellisScaleName };\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Axis, Mark, Scale, SignalRef } from 'vega';\n\nimport { AxisSpecOptions, Granularity, Orientation, Position } from '../types';\nimport {\n getAxisLabelsEncoding,\n getLabelAnchorValues,\n getLabelAngle,\n getLabelFormat,\n getLabelOffset,\n getTimeLabelFormats,\n} from './axisLabelUtils';\n\n/**\n * Generates a default vega axis from the axis options\n * @param axisOptions\n * @param scaleName\n * @returns axis\n */\nexport const getDefaultAxis = (axisOptions: AxisSpecOptions, scaleName: string): Axis => {\n const {\n grid,\n hideDefaultLabels,\n labelAlign,\n labelFontWeight,\n labelOrientation,\n tickCountLimit,\n position,\n scaleType,\n ticks,\n tickMinStep,\n title,\n vegaLabelAlign,\n vegaLabelBaseline,\n vegaLabelOffset,\n vegaLabelPadding,\n } = axisOptions;\n return {\n scale: scaleName,\n orient: position,\n grid,\n ticks,\n tickCount: getTickCount(position, tickCountLimit, grid),\n tickMinStep: scaleType !== 'linear' ? undefined : tickMinStep, //only supported for linear scales\n title,\n labelAngle: getLabelAngle(labelOrientation),\n labelFontWeight,\n labelOffset: getLabelOffset(labelAlign, scaleName, vegaLabelOffset),\n labelPadding: vegaLabelPadding,\n labels: !hideDefaultLabels,\n ...getLabelAnchorValues(position, labelOrientation, labelAlign, vegaLabelAlign, vegaLabelBaseline),\n encode: {\n labels: {\n update: {\n text: getLabelFormat(axisOptions, scaleName),\n },\n },\n },\n };\n};\n\n/**\n * Generates the time axes for a time scale from the axis options\n * @param scaleName\n * @param axisOptions\n * @returns axes\n */\nexport const getTimeAxes = (scaleName: string, axisOptions: AxisSpecOptions): Axis[] => {\n return [getSecondaryTimeAxis(scaleName, axisOptions), ...getPrimaryTimeAxis(scaleName, axisOptions)];\n};\n\n/**\n * Generates the secondary time axis from the axis options\n * This is the axis that shows the smaller granularity\n * If this is a vertical axis, it will also show the larger granularity and will hide repeats of the larger granularity\n * @param scaleName\n * @param axisOptions\n * @returns axis\n */\nconst getSecondaryTimeAxis = (\n scaleName: string,\n {\n granularity,\n grid,\n labelAlign,\n labelOrientation,\n position,\n ticks,\n title,\n vegaLabelAlign,\n vegaLabelBaseline,\n }: AxisSpecOptions\n): Axis => {\n const { tickCount } = getTimeLabelFormats(granularity);\n\n return {\n scale: scaleName,\n orient: position,\n grid,\n ticks,\n tickCount: scaleName.includes('Time') ? tickCount : undefined,\n title,\n formatType: 'time',\n labelAngle: getLabelAngle(labelOrientation),\n labelSeparation: 12,\n ...getSecondaryTimeAxisLabelFormatting(granularity, position),\n ...getLabelAnchorValues(position, labelOrientation, labelAlign, vegaLabelAlign, vegaLabelBaseline),\n };\n};\n\nconst getSecondaryTimeAxisLabelFormatting = (granularity: Granularity, position: Position): Partial<Axis> => {\n const { secondaryLabelFormat, primaryLabelFormat } = getTimeLabelFormats(granularity);\n const isVerticalAxis = ['left', 'right'].includes(position);\n if (isVerticalAxis) {\n return {\n format: `${primaryLabelFormat}\\u2000${secondaryLabelFormat}`,\n encode: {\n labels: {\n update: {\n text: { signal: 'formatVerticalAxisTimeLabels(datum)' },\n },\n },\n },\n };\n }\n\n return {\n format: secondaryLabelFormat,\n };\n};\n\n/**\n * Generates the primary time axis from the axis options\n * This is the axis that shows the larger granularity and hides duplicate labels\n * Only returns an axis for horizontal axes\n * @param scaleName\n * @param axisOptions\n * @returns axis\n */\nconst getPrimaryTimeAxis = (\n scaleName: string,\n {\n granularity,\n labelAlign,\n labelOrientation,\n labelFontWeight,\n position,\n ticks,\n vegaLabelAlign,\n vegaLabelBaseline,\n }: AxisSpecOptions\n): Axis[] => {\n if (['left', 'right'].includes(position)) {\n return [];\n }\n const { primaryLabelFormat, tickCount } = getTimeLabelFormats(granularity);\n return [\n {\n scale: scaleName,\n orient: position,\n format: primaryLabelFormat,\n tickCount: scaleName.includes('Time') ? tickCount : undefined,\n formatType: 'time',\n labelOverlap: 'greedy',\n labelFontWeight,\n labelAngle: getLabelAngle(labelOrientation),\n ...getLabelAnchorValues(position, labelOrientation, labelAlign, vegaLabelAlign, vegaLabelBaseline),\n encode: {\n labels: {\n enter: {\n dy: { value: (ticks ? 28 : 20) * (position === 'top' ? -1 : 1) }, // account for tick height\n },\n update: {\n text: { signal: 'formatHorizontalTimeAxisLabels(datum)' },\n },\n },\n },\n },\n ];\n};\n\n/**\n * Generates an axis for sub labels from the axis options\n * @param axisOptions\n * @param scaleName\n * @returns axis\n */\nexport const getSubLabelAxis = (axisOptions: AxisSpecOptions, scaleName: string): Axis => {\n const { labelAlign, labelFontWeight, labelOrientation, name, position, ticks } = axisOptions;\n const subLabels = axisOptions.subLabels;\n const signalName = `${name}_subLabels`;\n const subLabelValues = subLabels.map((label) => label.value);\n\n let subLabelAxis = getDefaultAxis(axisOptions, scaleName);\n subLabelAxis = {\n ...subLabelAxis,\n domain: false,\n domainWidth: undefined,\n grid: false,\n labelPadding: ticks ? 32 : 24,\n ticks: false,\n title: undefined,\n values: subLabelValues.length ? subLabelValues : undefined,\n encode: {\n labels: {\n ...getAxisLabelsEncoding(labelAlign, labelFontWeight, 'subLabel', labelOrientation, position, signalName),\n },\n },\n };\n return subLabelAxis;\n};\n\n/**\n * Finds and returns the scale that this axis is for\n * If the scale does not exist, it will create a new one\n * @param scales\n * @param position\n * @returns scale\n */\nexport const getScale = (scales: Scale[], position: Position) => {\n const applicableScales = scales.filter((s) => 'range' in s && s.range === getRange(position));\n let scale: Scale | undefined;\n\n if (applicableScales.length > 1) {\n // Is there a better way to find the trellis scale?\n scale = scales.find((s) => s.name.includes('Trellis')) ?? applicableScales[0];\n } else {\n scale = applicableScales[0];\n }\n\n if (scale) {\n return scale;\n }\n\n scale = {\n name: getDefaultScaleNameFromPosition(position),\n type: 'linear',\n range: getRange(position),\n };\n scales.push(scale);\n return scale;\n};\n\n/**\n * Gets the scale range from the position\n * @param position\n * @returns range\n */\nexport const getRange = (position: Position): 'width' | 'height' => {\n if (position === 'left' || position === 'right') {\n return 'height';\n }\n return 'width';\n};\n\n/**\n * Gets the scale type of the opposing scale.\n * For example, if this is an x-axis, it will return the y-scale type\n * @param scales\n * @param position\n * @returns scaleType\n */\nexport const getOpposingScaleType = (scales: Scale[], position: Position) => {\n let scale = scales.find((s) => 'range' in s && s.range === getOpposingRange(position));\n if (scale) {\n return scale.type;\n }\n scale = {\n name: getDefaultOpposingScaleNameFromPosition(position),\n type: 'linear',\n range: getOpposingRange(position),\n };\n scales.push(scale);\n return scale.type;\n};\n\n/**\n * Gets the scale range for the opposing scale\n * @param position\n * @returns\n */\nexport const getOpposingRange = (position: Position): 'width' | 'height' => {\n if (position === 'left' || position === 'right') {\n return 'width';\n }\n return 'height';\n};\n\n/**\n * Returns whether the axis is vertical.\n * @param position\n * @returns boolean\n */\nexport const isVerticalAxis = (position: Position): boolean => {\n return ['left', 'right'].includes(position);\n};\n\n/**\n * Gets the default scale name based on the position\n * @param position\n * @returns scaleName\n */\nconst getDefaultScaleNameFromPosition = (position: Position) => {\n return isVerticalAxis(position) ? 'yLinear' : 'xLinear';\n};\n\n/**\n * Gets the default opposing scale name based on the position\n * @param position\n * @returns scaleName\n */\nconst getDefaultOpposingScaleNameFromPosition = (position: Position) => {\n return isVerticalAxis(position) ? 'xLinear' : 'yLinear';\n};\n\n/**\n * Determines tick count based on axis type and available space.\n * Uses Vega's tickCount parameter which is treated as a suggestion rather than a strict limit.\n * The final number of ticks may vary as Vega optimizes for visually pleasing values and intervals.\n *\n * @param position The position of the axis\n * @param tickCountLimit The upper limit for the number of ticks\n * @param grid Whether grid lines are enabled\n * @returns tickCount production rule for Vega\n */\nexport const getTickCount = (position: Position, tickCountLimit?: number, grid?: boolean): SignalRef | undefined => {\n const range = ['top', 'bottom'].includes(position) ? 'width' : 'height';\n\n // 0 is a valid tickCountLimit value.\n if (tickCountLimit !== undefined) {\n // divide the range by 100 to get the ideal number of ticks (grid lines)\n return {\n signal: `clamp(ceil(${range}/100), 2, ${tickCountLimit})`,\n };\n } else if (grid) {\n // divide the range by 100 to get the ideal number of ticks (grid lines)\n return {\n signal: `clamp(ceil(${range}/100), 2, 10)`,\n };\n }\n return undefined;\n};\n\n/**\n * Gets the baseline rule mark\n * @param baselineOffset\n * @param position\n * @returns baselineMark\n */\nexport const getBaselineRule = (baselineOffset: number, position: Position): Mark => {\n const orientation = isVerticalAxis(position) ? 'y' : 'x';\n\n const positionOptions = {\n x: {\n x: { value: 0 },\n x2: { signal: 'width' },\n y: { scale: 'yLinear', value: baselineOffset },\n },\n y: {\n x: { scale: 'xLinear', value: baselineOffset },\n y: { value: 0 },\n y2: { signal: 'height' },\n },\n };\n\n return {\n name: `${orientation}Baseline`,\n description: `${orientation}Baseline`,\n type: 'rule',\n interactive: false,\n encode: {\n update: {\n ...positionOptions[orientation],\n },\n },\n };\n};\n\nexport const hasSubLabels = ({ subLabels, labelOrientation }: AxisSpecOptions) => {\n // subLabels are only supported for horizontal axis labels\n return Boolean(subLabels.length && labelOrientation === 'horizontal');\n};\n\n/**\n * Determines if an axis is a metric axis based on its position and chart orientation\n * @param position The position of the axis\n * @param chartOrientation The orientation of the chart\n * @returns Whether the axis is a metric axis\n */\nexport function getIsMetricAxis(position: Position, chartOrientation: Orientation): boolean {\n if (chartOrientation === 'vertical') {\n return isVerticalAxis(position);\n }\n return !isVerticalAxis(position);\n}\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Axis, Data, Mark, ScaleType, Signal, SourceData, ValuesData } from 'vega';\n\nimport {\n ANNOTATION_RANGED_ICON_SVG,\n ANNOTATION_SINGLE_ICON_SVG,\n DEFAULT_AXIS_ANNOTATION_COLOR,\n DEFAULT_AXIS_ANNOTATION_OFFSET,\n FILTERED_TABLE,\n} from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { getCursor } from '../marks/markUtils';\nimport { AxisAnnotationOptions, AxisAnnotationSpecOptions, AxisSpecOptions, ColorScheme, Position } from '../types';\n\n/**\n * Adds the required data for axis annotations.\n *\n * NOTE: this function should only be called from within a produce with data as the root state since it directly\n * mutates the data array\n * @param data\n * @param axisAnnotationOptions\n */\nexport const addAxisAnnotationData = (\n data: Data[],\n { name, dataKey, color, colorScheme, options, format }: AxisAnnotationSpecOptions\n) => {\n data.push(getAxisAnnotationDetailData(name, options, colorScheme));\n if (format === 'summary') {\n data.push(getAxisAnnotationSummaryData(name, dataKey, color, colorScheme));\n } else {\n data.push(getAxisAnnotationAggregateData(name, dataKey, color, colorScheme), getAxisAnnotationRangeData(name));\n }\n};\n\nconst getAxisAnnotationDetailData = (name: string, options, colorScheme): ValuesData => {\n const newOptions = options.map((option) => ({ ...option, color: getColorValue(option.color, colorScheme) }));\n return { name: `${name}_details`, values: newOptions };\n};\n\nconst getAxisAnnotationAggregateData = (name, dataKey, color, colorScheme): SourceData => {\n return {\n name: `${name}_aggregate`,\n source: FILTERED_TABLE,\n transform: [\n { type: 'filter', expr: `datum.${dataKey}` },\n {\n type: 'flatten',\n fields: [dataKey],\n as: [`${name}_id`],\n },\n {\n type: 'aggregate',\n groupby: [`${name}_id`],\n fields: ['datetime', 'datetime'],\n ops: ['min', 'max'],\n },\n {\n type: 'formula',\n expr: 'datum.max_datetime - datum.min_datetime',\n as: 'width',\n },\n {\n type: 'formula',\n expr: 'datum.width / 2 + datum.min_datetime',\n as: 'center',\n },\n {\n type: 'aggregate',\n groupby: ['center'],\n fields: ['min_datetime', 'max_datetime', 'width', dataKey, dataKey],\n ops: ['min', 'max', 'max', 'count', 'values'],\n as: ['lower', 'upper', 'width', 'number', 'annotations'],\n },\n {\n type: 'formula',\n expr: `datum.annotations[0].${name}_id`,\n as: 'id',\n },\n {\n type: 'lookup',\n from: `${name}_details`,\n key: `id`,\n values: ['color'],\n fields: [`id`],\n },\n {\n type: 'formula',\n expr: `datum.number > 1 || datum.color == null ? '${getColorValue(color, colorScheme)}' : datum.color`,\n as: 'color',\n },\n ],\n };\n};\n\nconst getAxisAnnotationSummaryData = (name, dataKey, color, colorScheme): SourceData => {\n return {\n name: `${name}_summary`,\n source: FILTERED_TABLE,\n transform: [\n { type: 'filter', expr: `datum.${dataKey}` },\n {\n type: 'flatten',\n fields: [dataKey],\n as: [`${name}_id`],\n },\n {\n type: 'aggregate',\n groupby: [`${name}_id`],\n },\n {\n type: 'aggregate',\n groupby: ['center'],\n fields: [dataKey, dataKey],\n ops: ['count', 'values'],\n as: ['number', 'annotations'],\n },\n {\n type: 'formula',\n expr: `datum.annotations[0].${name}_id`,\n as: 'id',\n },\n {\n type: 'lookup',\n from: `${name}_details`,\n key: `id`,\n values: ['color'],\n fields: [`id`],\n },\n {\n type: 'formula',\n expr: `datum.number > 1 || datum.color == null ? '${getColorValue(color, colorScheme)}' : datum.color`,\n as: 'color',\n },\n ],\n };\n};\n\nconst getAxisAnnotationRangeData = (name: string): SourceData => {\n return {\n name: `${name}_range`,\n source: `${name}_aggregate`,\n transform: [\n {\n type: 'filter',\n expr: `${name}_highlighted && datum.center == ${name}_highlighted.center && ${name}_highlighted.width > 0`,\n },\n ],\n };\n};\n\n/**\n * Adds the required signals for axis annotations.\n *\n * NOTE: this function should only be called from within a produce with signals as the root state since it directly\n * mutates the signals array\n * @param signals\n * @param param1\n */\nexport const addAxisAnnotationSignals = (signals: Signal[], { name, format }: AxisAnnotationSpecOptions) => {\n if (format === 'span') {\n signals.push(\n getHighlightAxisAnnotationSignal(name),\n getClickAxisAnnotationSignal(name),\n getSelectAxisAnnotationSignal(name)\n );\n }\n};\n\n/**\n * Returns the highlighted axis annotation signal\n */\nconst getHighlightAxisAnnotationSignal = (name: string): Signal => {\n return {\n name: `${name}_highlighted`,\n value: null,\n on: [\n { events: `@${name}_icon:mouseover`, update: `datum` },\n { events: `@${name}_icon:mouseout`, update: `${name}_clicked` },\n ],\n };\n};\n\n/**\n * Returns the selected axis annotation signal\n */\nconst getClickAxisAnnotationSignal = (name: string): Signal => {\n return {\n name: `${name}_clicked`,\n value: {},\n on: [\n {\n events: {\n markname: `${name}_icon`,\n type: 'mousedown',\n between: [{ type: 'mousedown' }, { type: 'mouseup' }],\n },\n update: 'datum',\n },\n { events: 'window:mouseup', update: '{}' },\n ],\n };\n};\n\n/**\n * Returns the selected axis annotation static signal\n */\nconst getSelectAxisAnnotationSignal = (name: string): Signal => {\n return {\n name: `${name}_selected`,\n update: `${name}_clicked.center`,\n };\n};\n\n/**\n * Adds the required marks for axis annotations.\n *\n * NOTE: this function should only be called from within a produce with marks as the root state since it directly\n * mutates the marks array\n * @param marks\n * @param param1\n */\nexport const addAxisAnnotationMarks = (\n marks: Mark[],\n axisAnnotationOptions: AxisAnnotationSpecOptions,\n scaleName: string\n) => {\n const { format } = axisAnnotationOptions;\n if (format === 'summary') {\n marks.push(getAxisAnnotationSummaryMarks(axisAnnotationOptions));\n } else {\n marks.push(getAxisAnnotationSpanMarks(axisAnnotationOptions, scaleName));\n }\n};\n\n/**\n * NOTE: this function should only be called from within a produce with marks as the root state since it directly\n * mutates the marks array\n * @param marks\n * @param param1\n */\nexport const getAxisAnnotationSummaryMarks = ({ chartPopovers, name, offset }: AxisAnnotationSpecOptions): Mark => {\n return {\n name: `${name}_group`,\n type: 'group',\n from: {\n data: `${name}_summary`,\n },\n marks: [\n {\n name: `${name}_icon`,\n type: 'path',\n from: {\n data: `${name}_summary`,\n },\n zindex: 2,\n encode: {\n enter: {\n // adding a 2px transparent border increases the area of the icon so it's easier to hover\n stroke: { value: 'transparent' },\n strokeWidth: { value: 2 },\n cursor: getCursor(chartPopovers),\n },\n update: {\n path: {\n signal: `'${ANNOTATION_SINGLE_ICON_SVG}'`,\n },\n fill: {\n field: 'color',\n },\n xc: {\n signal: `width - 12`,\n },\n yc: {\n signal: `height + ${offset}`,\n },\n },\n },\n },\n ],\n };\n};\n\n/**\n * Adds the required marks for axis annotations that support time series axis.\n * @param marks\n * @param param1\n */\nexport const getAxisAnnotationSpanMarks = (\n { chartPopovers, name, offset }: AxisAnnotationSpecOptions,\n scaleName: string\n): Mark => {\n return {\n name: `${name}_group`,\n type: 'group',\n marks: [\n {\n name: `${name}_range`,\n type: 'group',\n marks: [\n {\n type: 'rect',\n from: {\n data: `${name}_range`,\n },\n encode: {\n update: {\n x: {\n scale: scaleName,\n field: 'lower',\n band: 0.5,\n },\n y: { signal: `height + ${offset}` },\n width: { value: 2 },\n height: { value: -4 },\n fill: { field: 'color' },\n fillOpacity: {\n signal: `${name}_selected ? 1.0 : 0.2`,\n },\n },\n },\n },\n {\n type: 'rect',\n from: {\n data: `${name}_range`,\n },\n encode: {\n update: {\n x: {\n scale: scaleName,\n field: 'lower',\n band: 0.5,\n },\n y: { signal: `height + ${offset}` },\n x2: {\n scale: scaleName,\n field: 'upper',\n band: 0.5,\n },\n height: { value: 2 },\n fill: { field: 'color' },\n fillOpacity: {\n signal: `${name}_selected ? 1.0 : 0.2`,\n },\n },\n },\n },\n {\n type: 'rect',\n from: {\n data: `${name}_range`,\n },\n encode: {\n update: {\n x: {\n scale: scaleName,\n field: 'upper',\n band: 0.5,\n },\n y: { signal: `height + ${offset} + 2` },\n width: { value: 2 },\n height: { value: -6 },\n fill: { field: 'color' },\n fillOpacity: {\n signal: `${name}_selected ? 1.0 : 0.2`,\n },\n },\n },\n },\n ],\n },\n {\n name: `${name}_icon`,\n type: 'path',\n from: {\n data: `${name}_aggregate`,\n },\n encode: {\n enter: {\n // adding a 2px transparent border increases the area of the icon so it's easier to hover\n stroke: { value: 'transparent' },\n strokeWidth: { value: 2 },\n cursor: getCursor(chartPopovers),\n },\n update: {\n path: {\n signal: `datum.width > 0 ? '${ANNOTATION_RANGED_ICON_SVG}' : '${ANNOTATION_SINGLE_ICON_SVG}'`,\n },\n fill: {\n field: 'color',\n },\n xc: {\n scale: scaleName,\n field: 'center',\n band: 0.5,\n },\n yc: {\n signal: `height + ${offset}`,\n },\n fillOpacity: {\n signal: `(${name}_selected && ${name}_selected != datum.center) ? 0.0 : 1.0`,\n },\n },\n },\n },\n ],\n };\n};\n\n/**\n * Adds the required axis for axis annotations.\n *\n * NOTE: this function should only be called from within a produce with axes as the root state since it directly\n * mutates the axes array\n * @param axes\n * @param param1\n */\nexport const addAxisAnnotationAxis = (axes: Axis[], { offset }: AxisAnnotationSpecOptions, scaleName) => {\n axes.push({\n scale: scaleName,\n orient: 'bottom',\n values: [],\n offset: offset,\n });\n};\n\nexport const getAxisAnnotationsFromChildren = ({\n axisAnnotations,\n colorScheme,\n name: axisName,\n position,\n scaleType,\n}: AxisSpecOptions & { scaleType: ScaleType }): AxisAnnotationSpecOptions[] => {\n if (position !== 'bottom') return [];\n return axisAnnotations.map((annotation, annotationIndex) => {\n return applyDefaultAxisAnnotationOptions(annotation, annotationIndex, axisName, colorScheme, scaleType);\n });\n};\n\nexport const applyDefaultAxisAnnotationOptions = (\n {\n chartPopovers = [],\n chartTooltips = [],\n name,\n format,\n offset = DEFAULT_AXIS_ANNOTATION_OFFSET,\n color = DEFAULT_AXIS_ANNOTATION_COLOR,\n dataKey = 'annotations',\n options = [],\n }: AxisAnnotationOptions,\n annotationIndex: number,\n axisName: string,\n colorScheme: ColorScheme,\n scaleType: ScaleType\n): AxisAnnotationSpecOptions => {\n return {\n chartPopovers,\n chartTooltips,\n color,\n colorScheme,\n dataKey,\n name: name ?? `${axisName}Annotation${annotationIndex}`,\n offset,\n options,\n axisName,\n format: format ?? (scaleType === 'time' ? 'span' : 'summary'),\n };\n};\n\nexport const axisTypeSupportsAxisAnnotations = (position: Position | undefined): boolean => {\n const supportedAxisPositions: Position[] = ['bottom'];\n return Boolean(position && supportedAxisPositions.includes(position));\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { GroupMark, NumericValueRef, ProductionRule, RectEncodeEntry, RectMark, TextMark } from 'vega';\n\nimport {\n ANNOTATION_FONT_SIZE,\n ANNOTATION_FONT_WEIGHT,\n ANNOTATION_PADDING,\n BACKGROUND_COLOR,\n} from '@spectrum-charts/constants';\n\nimport {\n BarAnnotationOptions,\n BarAnnotationSpecOptions,\n BarAnnotationStyleOptions,\n BarSpecOptions,\n Orientation,\n} from '../types';\nimport { getOrientationProperties, isDodgedAndStacked } from './barUtils';\n\ntype AnnotationWidth = { value: number } | { signal: string };\n\n/**\n * Gets the Annotation component from the children if one exists and applies default options, returning the BarAnnotationSpecOptions\n * @param barOptions\n * @returns BarAnnotationSpecOptions | undefined\n */\nconst getAnnotation = (\n options: BarSpecOptions,\n dataName: string,\n dimensionScaleName: string,\n dimensionField: string\n): BarAnnotationSpecOptions | undefined => {\n const annotation = options.barAnnotations[0];\n\n if (!annotation) {\n return;\n }\n return applyAnnotationPropDefaults(annotation, options, dataName, dimensionScaleName, dimensionField);\n};\n\n/**\n * Applies all default options, converting BarAnnotationOptions into BarAnnotationSpecOptions\n * @param annotationOptions\n * @param barOptions\n * @returns BarAnnotationSpecOptions\n */\nconst applyAnnotationPropDefaults = (\n { textKey, ...options }: BarAnnotationOptions,\n barOptions: BarSpecOptions,\n dataName: string,\n dimensionScaleName: string,\n dimensionField: string\n): BarAnnotationSpecOptions => ({\n barOptions,\n textKey: textKey || barOptions.metric,\n dataName,\n dimensionScaleName,\n dimensionField,\n ...options,\n});\n\n/**\n * Gets the annotation marks for the bar chart. Returns an empty array if no annotation is provided on the bar children.\n * @param barOptions\n * @param dataName\n * @param dimensionScaleName\n * @param dimensionName\n * @returns GroupMark[]\n */\nexport const getAnnotationMarks = (\n barOptions: BarSpecOptions,\n\n // These have to be local fields because it could be used in a group,\n // in which case we don't want to use the \"global\" (full table) values.\n dataName: string,\n dimensionScaleName: string,\n dimensionName: string\n): GroupMark[] => {\n const annotationOptions = getAnnotation(barOptions, dataName, dimensionScaleName, dimensionName);\n if (!annotationOptions) {\n return [];\n }\n\n return [\n {\n type: 'group',\n name: `${barOptions.name}_annotationGroup`,\n marks: [getAnnotationTextMark(annotationOptions), getAnnotationBackgroundMark(annotationOptions)],\n },\n ];\n};\n\n/**\n * Gets the annotation text mark for the bar chart\n * @param annotationOptions\n * @returns TextMark\n */\nconst getAnnotationTextMark = ({\n barOptions,\n dataName,\n dimensionField,\n dimensionScaleName,\n textKey,\n style,\n}: BarAnnotationSpecOptions): TextMark => {\n const { metricAxis, dimensionAxis } = getOrientationProperties(barOptions.orientation);\n const annotationWidth = getAnnotationWidth(textKey, style);\n const annotationPosition = getAnnotationMetricAxisPosition(barOptions, annotationWidth);\n\n return {\n name: `${barOptions.name}_annotationText`,\n type: 'text',\n from: { data: dataName },\n interactive: false,\n zindex: 1,\n encode: {\n enter: {\n [dimensionAxis]: {\n scale: dimensionScaleName,\n field: dimensionField,\n band: 0.5,\n },\n [metricAxis]: annotationPosition,\n text: [\n {\n test: `bandwidth('${dimensionScaleName}') > ${getMinBandwidth(barOptions.orientation)}`,\n field: textKey,\n },\n ],\n fontSize: { value: ANNOTATION_FONT_SIZE },\n fontWeight: { value: ANNOTATION_FONT_WEIGHT },\n baseline: { value: 'middle' },\n align: { value: 'center' },\n },\n },\n };\n};\n\n/**\n * Gets the annotation background mark\n * @param annotationOptions\n * @returns RectMark\n */\nconst getAnnotationBackgroundMark = ({\n barOptions,\n dimensionScaleName,\n textKey,\n style,\n}: BarAnnotationSpecOptions): RectMark => ({\n name: `${barOptions.name}_annotationBackground`,\n description: `${barOptions.name}_annotationBackground`,\n type: 'rect',\n from: { data: `${barOptions.name}_annotationText` },\n interactive: false,\n encode: {\n enter: {\n ...getAnnotationXEncode(style?.width),\n y: { signal: `datum.bounds.y1 - ${ANNOTATION_PADDING}` },\n y2: { signal: `datum.bounds.y2 + ${ANNOTATION_PADDING}` },\n cornerRadius: { value: 4 },\n fill: [\n {\n test: `datum.datum.${textKey} && bandwidth('${dimensionScaleName}') > ${getMinBandwidth(\n barOptions.orientation\n )}`,\n signal: BACKGROUND_COLOR,\n },\n ],\n },\n },\n});\n\n/**\n * Gets the minimum band width needed to display the annotations based on the bar orientation\n * @param orientation\n * @returns number\n */\nexport const getMinBandwidth = (orientation: Orientation): number =>\n orientation === 'vertical' ? 48 : ANNOTATION_FONT_SIZE + 2 * ANNOTATION_PADDING;\n\n/**\n * Gets the x position encoding for the annotation background\n * @param width\n * @returns RectEncodeEntry\n */\nexport const getAnnotationXEncode = (width?: number): RectEncodeEntry => {\n if (width) {\n return {\n xc: { signal: '(datum.bounds.x1 + datum.bounds.x2) / 2' },\n width: { value: width },\n };\n }\n return {\n x: { signal: `datum.bounds.x1 - ${ANNOTATION_PADDING}` },\n x2: { signal: `datum.bounds.x2 + ${ANNOTATION_PADDING}` },\n };\n};\n\nexport const getAnnotationWidth = (textKey: string, style?: BarAnnotationStyleOptions): AnnotationWidth => {\n if (style?.width) return { value: style.width };\n return {\n signal: `getLabelWidth(datum.${textKey}, '${ANNOTATION_FONT_WEIGHT}', ${ANNOTATION_FONT_SIZE}) + ${\n 2 * ANNOTATION_PADDING\n }`,\n };\n};\n\n/**\n * Offset calculation to make sure the annotation does not overlap the baseline\n * @param barOptions\n * @param annotationWidth\n * @returns string\n */\nexport const getAnnotationPositionOffset = (\n { orientation }: BarSpecOptions,\n annotationWidth: AnnotationWidth\n): string => {\n const pixelGapFromBaseline = 2.5;\n\n if (orientation === 'vertical') {\n return `${(2 * ANNOTATION_PADDING + ANNOTATION_FONT_SIZE) / 2 + pixelGapFromBaseline}`;\n }\n\n if ('value' in annotationWidth) {\n return `${annotationWidth.value / 2 + pixelGapFromBaseline}`;\n }\n\n // Need parens for order of operations\n // Evaluate signal expression first, then divide by 2, then add extra offset\n return `((${annotationWidth.signal}) / 2 + ${pixelGapFromBaseline})`;\n};\n\n/**\n * Gets the metric position for the annotation text.\n * This ensures that the annotation does not overlap the baseline.\n * @param barOptions\n * @param annotationWidth\n * @returns NumericValueref\n */\nexport const getAnnotationMetricAxisPosition = (\n options: BarSpecOptions,\n annotationWidth: AnnotationWidth\n): ProductionRule<NumericValueRef> => {\n const { type, metric, orientation } = options;\n const field = type === 'stacked' || isDodgedAndStacked(options) ? `${metric}1` : metric;\n const { metricScaleKey: scaleKey } = getOrientationProperties(orientation);\n const positionOffset = getAnnotationPositionOffset(options, annotationWidth);\n\n if (orientation === 'vertical') {\n return [\n {\n test: `datum.${field} < 0`,\n signal: `max(scale('${scaleKey}', datum.${field}), scale('${scaleKey}', 0) + ${positionOffset})`,\n },\n {\n signal: `min(scale('${scaleKey}', datum.${field}), scale('${scaleKey}', 0) - ${positionOffset})`,\n },\n ];\n }\n\n return [\n {\n test: `datum.${field} < 0`,\n signal: `min(scale('${scaleKey}', datum.${field}), scale('${scaleKey}', 0) - ${positionOffset})`,\n },\n {\n signal: `max(scale('${scaleKey}', datum.${field}), scale('${scaleKey}', 0) + ${positionOffset})`,\n },\n ];\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { BandScale, Data, FormulaTransform, Mark, OrdinalScale, Scale, Signal } from 'vega';\n\nimport {\n COLOR_SCALE,\n DEFAULT_CATEGORICAL_DIMENSION,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_METRIC,\n FILTERED_TABLE,\n LAST_RSC_SERIES_ID,\n LINE_TYPE_SCALE,\n OPACITY_SCALE,\n PADDING_RATIO,\n SERIES_ID,\n STACK_ID,\n TIME,\n TRELLIS_PADDING,\n} from '@spectrum-charts/constants';\nimport { toCamelCase } from '@spectrum-charts/utils';\n\nimport { addPopoverData, getPopovers } from '../chartPopover/chartPopoverUtils';\nimport { addTooltipData, addTooltipSignals } from '../chartTooltip/chartTooltipUtils';\nimport { addTimeTransform, getTableData, getTransformSort } from '../data/dataUtils';\nimport { getInteractiveMarkName } from '../marks/markUtils';\nimport {\n addDomainFields,\n addFieldToFacetScaleDomain,\n addMetricScale,\n getDefaultScale,\n getMetricScale,\n getScaleIndexByName,\n getScaleIndexByType,\n} from '../scale/scaleSpecBuilder';\nimport { getDualAxisScaleNames } from '../scale/scaleUtils';\nimport {\n addHighlightedItemSignalEvents,\n getFirstRscSeriesIdSignal,\n getGenericValueSignal,\n getLastRscSeriesIdSignal,\n getMouseOverSeriesSignal,\n} from '../signal/signalSpecBuilder';\nimport { getFacetsFromOptions } from '../specUtils';\nimport { addTrendlineData, getTrendlineMarks, setTrendlineSignals } from '../trendline';\nimport { BarOptions, BarSpecOptions, ColorScheme, HighlightedItem, ScSpec } from '../types';\nimport {\n getBarPadding,\n getBaseScaleName,\n getDimensionSelectionRing,\n getOrientationProperties,\n getScaleValues,\n isDodgedAndStacked,\n isDualMetricAxis,\n} from './barUtils';\nimport { getDodgedMark } from './dodgedBarUtils';\nimport { getDodgedAndStackedBarMark, getStackedBarMarks } from './stackedBarUtils';\nimport { addTrellisScale, getTrellisGroupMark, isTrellised } from './trellisedBarUtils';\n\nexport const addBar = produce<\n ScSpec,\n [BarOptions & { colorScheme?: ColorScheme; highlightedItem?: HighlightedItem; index?: number; idKey: string }]\n>(\n (\n spec,\n {\n barAnnotations = [],\n chartPopovers = [],\n chartTooltips = [],\n color = { value: 'categorical-100' },\n colorScheme = DEFAULT_COLOR_SCHEME,\n dimension = DEFAULT_CATEGORICAL_DIMENSION,\n dualMetricAxis = false,\n hasOnClick = false,\n hasSquareCorners = false,\n index = 0,\n lineType = { value: 'solid' },\n lineWidth = 0,\n metric = DEFAULT_METRIC,\n metricAxis,\n name,\n opacity = { value: 1 },\n orientation = 'vertical',\n paddingRatio = PADDING_RATIO,\n trellisOrientation = 'horizontal',\n trellisPadding = TRELLIS_PADDING,\n type = 'stacked',\n trendlines = [],\n ...options\n }\n ) => {\n const barName = toCamelCase(name || `bar${index}`);\n // put options back together now that all defaults are set\n const barOptions: BarSpecOptions = {\n barAnnotations,\n chartPopovers,\n chartTooltips,\n dimensionScaleType: 'band',\n dualMetricAxis,\n orientation,\n color,\n colorScheme,\n dimension,\n hasOnClick,\n hasSquareCorners,\n index,\n interactiveMarkName: getInteractiveMarkName(\n { chartPopovers, chartTooltips, hasOnClick, highlightedItem: options.highlightedItem, trendlines },\n barName\n ),\n lineType,\n lineWidth,\n metric,\n metricAxis,\n name: barName,\n opacity,\n paddingRatio,\n trellisOrientation,\n trellisPadding,\n trendlines,\n type,\n ...options,\n };\n\n spec.usermeta = {\n chartOrientation: barOptions.orientation,\n };\n\n spec.data = addData(spec.data ?? [], barOptions);\n spec.signals = addSignals(spec.signals ?? [], barOptions);\n spec.scales = addScales(spec.scales ?? [], barOptions);\n spec.marks = addMarks(spec.marks ?? [], barOptions);\n }\n);\n\nexport const addSignals = produce<Signal[], [BarSpecOptions]>((signals, options) => {\n const {\n barAnnotations,\n chartTooltips,\n chartPopovers,\n idKey,\n name,\n paddingRatio,\n paddingOuter: barPaddingOuter,\n trendlines,\n } = options;\n // We use this value to calculate ReferenceLine positions.\n const { paddingInner } = getBarPadding(paddingRatio, barPaddingOuter);\n signals.push(getGenericValueSignal('paddingInner', paddingInner));\n\n if (isDualMetricAxis(options)) {\n signals.push(getFirstRscSeriesIdSignal(), getLastRscSeriesIdSignal(), getMouseOverSeriesSignal(name));\n }\n\n if (!barAnnotations.length && !chartPopovers.length && !chartTooltips.length && !trendlines.length) {\n return;\n }\n addHighlightedItemSignalEvents(signals, name, idKey, 1, chartTooltips[0]?.excludeDataKeys);\n addTooltipSignals(signals, options);\n setTrendlineSignals(signals, options);\n});\n\nexport const addData = produce<Data[], [BarSpecOptions]>((data, options) => {\n const { dimension, dimensionDataType, metric, order, type } = options;\n if (dimensionDataType === TIME) {\n const tableData = getTableData(data);\n tableData.transform = addTimeTransform(tableData.transform ?? [], dimension);\n }\n\n const index = data.findIndex((d) => d.name === FILTERED_TABLE);\n data[index].transform = data[index].transform ?? [];\n if (type === 'stacked' || isDodgedAndStacked(options)) {\n data[index].transform?.push({\n type: 'stack',\n groupby: getStackFields(options),\n field: metric,\n sort: getTransformSort(order),\n as: [`${metric}0`, `${metric}1`],\n });\n\n data[index].transform?.push(getStackIdTransform(options));\n data.push(getStackAggregateData(options));\n }\n if (type === 'dodged' || isDodgedAndStacked(options)) {\n data[index].transform?.push(getDodgeGroupTransform(options));\n }\n\n addDualMetricAxisData(data, options);\n addTrendlineData(data, options);\n addTooltipData(data, options);\n addPopoverData(data, options);\n});\n\n/**\n * data aggregate used to calculate the min and max of the stack\n * used to figure out the corner radius of the bars\n * @param facets\n * @param barSpecOptions\n * @returns vega Data object\n */\nexport const getStackAggregateData = (options: BarSpecOptions): Data => {\n const { metric, name } = options;\n return {\n name: `${name}_stacks`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'aggregate',\n groupby: getStackFields(options),\n fields: [`${metric}1`, `${metric}1`],\n ops: ['min', 'max'],\n },\n getStackIdTransform(options),\n ],\n };\n};\n\nexport const getStackIdTransform = (options: BarSpecOptions): FormulaTransform => {\n return {\n type: 'formula',\n as: STACK_ID,\n expr: getStackFields(options)\n .map((facet) => `datum.${facet}`)\n .join(' + \",\" + '),\n } as FormulaTransform;\n};\n\nconst getStackFields = ({ trellis, color, dimension, lineType, opacity, type }: BarSpecOptions): string[] => {\n const { facets, secondaryFacets } = getFacetsFromOptions({ color, lineType, opacity });\n return [\n ...(trellis ? [trellis] : []),\n dimension,\n ...(type === 'dodged' ? facets : []),\n ...(type === 'stacked' ? secondaryFacets : []),\n ];\n};\n\nexport const getDodgeGroupTransform = ({ color, lineType, name, opacity, type }: BarSpecOptions): FormulaTransform => {\n const { facets, secondaryFacets } = getFacetsFromOptions({ color, lineType, opacity });\n return {\n type: 'formula',\n as: `${name}_dodgeGroup`,\n expr: (type === 'dodged' ? facets : secondaryFacets).map((facet) => `datum.${facet}`).join(' + \",\" + '),\n };\n};\n\nexport const addDualMetricAxisData = (data: Data[], options: BarSpecOptions) => {\n if (isDualMetricAxis(options)) {\n const baseScaleName = getBaseScaleName(options);\n const scaleNames = getDualAxisScaleNames(baseScaleName);\n\n if (scaleNames.primaryDomain && scaleNames.secondaryDomain) {\n data.push({\n name: scaleNames.primaryDomain,\n source: FILTERED_TABLE,\n transform: [{ type: 'filter', expr: `datum.${SERIES_ID} !== ${LAST_RSC_SERIES_ID}` }],\n });\n\n data.push({\n name: scaleNames.secondaryDomain,\n source: FILTERED_TABLE,\n transform: [{ type: 'filter', expr: `datum.${SERIES_ID} === ${LAST_RSC_SERIES_ID}` }],\n });\n }\n }\n};\n\nexport const addScales = produce<Scale[], [BarSpecOptions]>((scales, options) => {\n const { color, lineType, opacity, metricAxis } = options;\n const { metricAxis: axisType } = getOrientationProperties(options.orientation);\n\n addMetricScale(scales, getScaleValues(options), axisType);\n\n if (metricAxis) {\n addMetricScale(scales, getScaleValues(options), axisType, metricAxis);\n }\n\n if (isDualMetricAxis(options)) {\n const baseScaleName = getBaseScaleName(options);\n const scaleNames = getDualAxisScaleNames(baseScaleName);\n addMetricScale(scales, getScaleValues(options), axisType, scaleNames.primaryScale, scaleNames.primaryDomain);\n addMetricScale(scales, getScaleValues(options), axisType, scaleNames.secondaryScale, scaleNames.secondaryDomain);\n }\n addDimensionScale(scales, options);\n addTrellisScale(scales, options);\n addFieldToFacetScaleDomain(scales, COLOR_SCALE, color);\n addFieldToFacetScaleDomain(scales, LINE_TYPE_SCALE, lineType);\n addFieldToFacetScaleDomain(scales, OPACITY_SCALE, opacity);\n addSecondaryScales(scales, options);\n});\n\nexport const addDimensionScale = (\n scales: Scale[],\n { dimension, paddingRatio, paddingOuter: barPaddingOuter, orientation }: BarSpecOptions\n) => {\n const { dimensionAxis } = getOrientationProperties(orientation);\n const index = getScaleIndexByType(scales, 'band', dimensionAxis);\n scales[index] = addDomainFields(scales[index], [dimension]);\n const { paddingInner, paddingOuter } = getBarPadding(paddingRatio, barPaddingOuter);\n\n scales[index] = { ...scales[index], paddingInner, paddingOuter } as BandScale;\n};\n\n/**\n * adds scales for the secondary dimensions\n * If a bar is stacked and dodged,\n * @param scales\n * @param param1\n */\nexport const addSecondaryScales = (scales: Scale[], options: BarSpecOptions) => {\n const { color, lineType, opacity } = options;\n if (isDodgedAndStacked(options)) {\n [\n {\n value: color,\n scaleName: 'colors',\n secondaryScaleName: 'secondaryColor',\n },\n {\n value: lineType,\n scaleName: 'lineTypes',\n secondaryScaleName: 'secondaryLineType',\n },\n {\n value: opacity,\n scaleName: 'opacities',\n secondaryScaleName: 'secondaryOpacity',\n },\n ].forEach(({ value, scaleName, secondaryScaleName }) => {\n if (Array.isArray(value) && value.length === 2) {\n // secondary value scale used for 2D scales\n const secondaryIndex = getScaleIndexByName(scales, secondaryScaleName, 'ordinal');\n scales[secondaryIndex] = addDomainFields(scales[secondaryIndex], [value[1]]);\n\n const primaryIndex = getScaleIndexByName(scales, scaleName, 'ordinal');\n const primaryScale = scales[primaryIndex] as OrdinalScale;\n primaryScale.range = { signal: scaleName };\n scales[primaryIndex] = addDomainFields(primaryScale, [value[0]]);\n }\n });\n }\n};\n\nexport const addMarks = produce<Mark[], [BarSpecOptions]>((marks, options) => {\n const { chartPopovers, name, type } = options;\n const barMarks: Mark[] = [];\n if (isDodgedAndStacked(options)) {\n barMarks.push(getDodgedAndStackedBarMark(options));\n } else if (type === 'stacked') {\n barMarks.push(...getStackedBarMarks(options));\n } else {\n barMarks.push(getDodgedMark(options));\n }\n\n const popovers = getPopovers(chartPopovers, name);\n if (popovers.some((popover) => popover.UNSAFE_highlightBy === 'dimension')) {\n barMarks.push(getDimensionSelectionRing(options));\n }\n\n // if this is a trellis plot, we add the bars and the repeated scale to the trellis group\n if (isTrellised(options)) {\n const repeatedScale = getRepeatedScale(options);\n marks.push(getTrellisGroupMark(options, barMarks, repeatedScale));\n } else {\n marks.push(...barMarks);\n }\n\n marks.push(...getTrendlineMarks(options));\n});\n\nexport const getRepeatedScale = (options: BarSpecOptions): Scale => {\n const { orientation, trellisOrientation } = options;\n // if the orientations match then the metric scale is repeated, otherwise the dimension scale is repeated\n // ex. vertical bar in a vertical trellis will have multiple copies of the metric scale\n if (orientation === trellisOrientation) {\n const { metricAxis } = getOrientationProperties(orientation);\n return getMetricScale(getScaleValues(options), metricAxis, orientation);\n } else {\n return getDimensionScale(options);\n }\n};\n\n/**\n * Generates a dimension scale and returns it\n * NOTE: does not check if the dimension scale already exists\n * @param param0\n * @returns\n */\nconst getDimensionScale = ({\n dimension,\n orientation,\n paddingRatio,\n paddingOuter: barPaddingOuter,\n}: BarSpecOptions): BandScale => {\n const { dimensionAxis } = getOrientationProperties(orientation);\n let scale = getDefaultScale('band', dimensionAxis, orientation);\n scale = addDomainFields(scale, [dimension]);\n const { paddingInner, paddingOuter } = getBarPadding(paddingRatio, barPaddingOuter);\n return { ...scale, paddingInner, paddingOuter } as BandScale;\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {\n ArrayValueRef,\n ColorValueRef,\n EncodeEntry,\n GroupMark,\n NumericValueRef,\n ProductionRule,\n RectEncodeEntry,\n RectMark,\n} from 'vega';\n\nimport {\n CORNER_RADIUS,\n FILTERED_TABLE,\n LAST_RSC_SERIES_ID,\n SELECTED_GROUP,\n SELECTED_ITEM,\n SERIES_ID,\n STACK_ID,\n} from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { getPopovers } from '../chartPopover/chartPopoverUtils';\nimport {\n getColorProductionRule,\n getCursor,\n getMarkOpacity,\n getOpacityProductionRule,\n getStrokeDashProductionRule,\n getTooltip,\n hasPopover,\n} from '../marks/markUtils';\nimport { getBandPadding } from '../scale/scaleSpecBuilder';\nimport { getLineWidthPixelsFromLineWidth } from '../specUtils';\nimport { BarSpecOptions, Orientation } from '../types';\nimport { getTrellisProperties, isTrellised } from './trellisedBarUtils';\n\n/**\n * checks to see if the bar is faceted in the stacked and dodged dimensions\n * @param color\n */\nexport const isDodgedAndStacked = ({ color, lineType, opacity }: BarSpecOptions): boolean => {\n return [color, lineType, opacity].some((facet) => Array.isArray(facet) && facet.length === 2);\n};\n\n/**\n * Checks if the bar chart is a dual metric axis chart\n * @param options - The bar chart options\n * @returns True if the bar chart is a dual metric axis chart, false otherwise\n */\nexport const isDualMetricAxis = (options: BarSpecOptions) => {\n const { dualMetricAxis, type } = options;\n return Boolean(dualMetricAxis && !isTrellised(options) && type === 'dodged' && !isDodgedAndStacked(options));\n};\n\nexport const getDodgedGroupMark = (options: BarSpecOptions): GroupMark => {\n const { dimension, groupedPadding, orientation, name, paddingRatio } = options;\n\n const { dimensionScaleKey, dimensionAxis, rangeScale } = getOrientationProperties(orientation);\n\n return {\n name: `${name}_group`,\n type: 'group',\n from: {\n facet: {\n data: isTrellised(options) ? getTrellisProperties(options).facetName : FILTERED_TABLE,\n name: `${name}_facet`,\n groupby: dimension,\n },\n },\n encode: {\n enter: {\n [dimensionAxis]: {\n scale: dimensionScaleKey,\n field: dimension,\n },\n },\n },\n signals: [{ name: rangeScale, update: `bandwidth(\"${dimensionScaleKey}\")` }],\n scales: [\n {\n name: `${name}_position`,\n type: 'band',\n range: rangeScale,\n // want to reference the FILTERED_TABLE and not the facet table because we want the bar widths and positioning to be consistent across facets\n // if we don't do this, the bar widths could be different for the different groups if one of the groups is missing a value\n domain: { data: FILTERED_TABLE, field: `${name}_dodgeGroup` },\n paddingInner: groupedPadding ?? paddingRatio,\n },\n ],\n };\n};\n\nexport const getDodgedDimensionEncodings = (options: BarSpecOptions): RectEncodeEntry => {\n const { dimensionAxis, rangeScale } = getOrientationProperties(options.orientation);\n\n const scale = `${options.name}_position`;\n const field = `${options.name}_dodgeGroup`;\n\n return {\n [dimensionAxis]: { scale, field },\n [rangeScale]: { scale, band: 1 },\n };\n};\n\nexport const getTrellisedDimensionEncodings = (options: BarSpecOptions): RectEncodeEntry => {\n const { dimensionAxis, rangeScale, dimensionScaleKey } = getOrientationProperties(options.orientation);\n\n return {\n [dimensionAxis]: { scale: dimensionScaleKey, field: options.dimension },\n [rangeScale]: { scale: dimensionScaleKey, band: 1 },\n };\n};\n\nexport const getMetricEncodings = (options: BarSpecOptions): RectEncodeEntry => {\n const { metric, type } = options;\n const { metricAxis: startKey, metricScaleKey: scaleKey } = getOrientationProperties(\n options.orientation,\n options.metricAxis\n );\n const endKey = `${startKey}2`;\n\n if (type === 'stacked' || isDodgedAndStacked(options)) {\n return getStackedMetricEncodings(options);\n }\n\n if (isDualMetricAxis(options)) {\n return {\n [startKey]: [\n {\n test: `datum.${SERIES_ID} === ${LAST_RSC_SERIES_ID}`,\n scale: `${scaleKey}Secondary`,\n value: 0,\n },\n {\n scale: `${scaleKey}Primary`,\n value: 0,\n },\n ],\n [endKey]: [\n {\n test: `datum.${SERIES_ID} === ${LAST_RSC_SERIES_ID}`,\n scale: `${scaleKey}Secondary`,\n field: metric,\n },\n {\n scale: `${scaleKey}Primary`,\n field: metric,\n },\n ],\n };\n }\n\n return {\n [startKey]: { scale: scaleKey, value: 0 },\n [endKey]: { scale: scaleKey, field: metric },\n };\n};\n\nexport const getStackedMetricEncodings = (options: BarSpecOptions): RectEncodeEntry => {\n const { metric, orientation } = options;\n const { metricAxis: startKey, metricScaleKey: scaleKey } = getOrientationProperties(\n options.orientation,\n options.metricAxis\n );\n const endKey = `${startKey}2`;\n\n const startValue = `datum.${metric}0`;\n const endValue = `datum.${metric}1`;\n\n const pixelGapBetweenBars = 1.5;\n\n if (orientation === 'vertical') {\n return {\n [startKey]: [\n // if the bar starts at 0, no need to calculate any shifts\n { test: `${startValue} === 0`, signal: `scale('${scaleKey}', ${startValue})` },\n // if the bar is positive, shift the start up by 1.5px gap\n {\n test: `${endValue} > 0`,\n signal: `max(scale('${scaleKey}', ${startValue}) - ${pixelGapBetweenBars}, scale('${scaleKey}', ${endValue}))`,\n },\n // if the bar is negative, shift the start down by 1.5px gap\n {\n signal: `min(scale('${scaleKey}', ${startValue}) + ${pixelGapBetweenBars}, scale('${scaleKey}', ${endValue}))`,\n },\n ],\n [endKey]: { scale: scaleKey, field: `${metric}1` },\n };\n }\n\n return {\n [startKey]: [\n // if the bar starts at 0, no need to calculate any shifts\n { test: `${startValue} === 0`, signal: `scale('${scaleKey}', ${startValue})` },\n // if the bar is positive, shift the start right by 1.5px gap\n {\n test: `${endValue} > 0`,\n signal: `min(scale('${scaleKey}', ${startValue}) + ${pixelGapBetweenBars}, scale('${scaleKey}', ${endValue}))`,\n },\n // if the bar is negative, shift the start left by 1.5px gap\n {\n signal: `max(scale('${scaleKey}', ${startValue}) - ${pixelGapBetweenBars}, scale('${scaleKey}', ${endValue}))`,\n },\n ],\n [endKey]: { scale: scaleKey, field: `${metric}1` },\n };\n};\n\nexport const getCornerRadiusEncodings = (options: BarSpecOptions): RectEncodeEntry => {\n const { type, lineWidth, metric, hasSquareCorners } = options;\n const value = hasSquareCorners ? 0 : Math.max(1, CORNER_RADIUS - getLineWidthPixelsFromLineWidth(lineWidth) / 2);\n\n let rectEncodeEntry: RectEncodeEntry;\n\n if (type === 'dodged' && !isDodgedAndStacked(options)) {\n rectEncodeEntry = {\n cornerRadiusTopLeft: [{ test: `datum.${metric} > 0`, value }, { value: 0 }],\n cornerRadiusTopRight: [{ test: `datum.${metric} > 0`, value }, { value: 0 }],\n cornerRadiusBottomLeft: [{ test: `datum.${metric} < 0`, value }, { value: 0 }],\n cornerRadiusBottomRight: [{ test: `datum.${metric} < 0`, value }, { value: 0 }],\n };\n } else {\n rectEncodeEntry = getStackedCornerRadiusEncodings(options);\n }\n\n return rotateRectClockwiseIfNeeded(rectEncodeEntry, options);\n};\n\nexport const getStackedCornerRadiusEncodings = ({\n name,\n metric,\n lineWidth,\n hasSquareCorners,\n}: BarSpecOptions): RectEncodeEntry => {\n const topTestString = `datum.${metric}1 > 0 && data('${name}_stacks')[indexof(pluck(data('${name}_stacks'), '${STACK_ID}'), datum.${STACK_ID})].max_${metric}1 === datum.${metric}1`;\n const bottomTestString = `datum.${metric}1 < 0 && data('${name}_stacks')[indexof(pluck(data('${name}_stacks'), '${STACK_ID}'), datum.${STACK_ID})].min_${metric}1 === datum.${metric}1`;\n const value = hasSquareCorners ? 0 : Math.max(1, CORNER_RADIUS - getLineWidthPixelsFromLineWidth(lineWidth) / 2);\n\n return {\n cornerRadiusTopLeft: [{ test: topTestString, value }, { value: 0 }],\n cornerRadiusTopRight: [{ test: topTestString, value }, { value: 0 }],\n cornerRadiusBottomLeft: [{ test: bottomTestString, value }, { value: 0 }],\n cornerRadiusBottomRight: [{ test: bottomTestString, value }, { value: 0 }],\n };\n};\n\nexport const rotateRectClockwiseIfNeeded = (\n rectEncodeEntry: RectEncodeEntry,\n { orientation }: BarSpecOptions\n): RectEncodeEntry => {\n if (orientation === 'vertical') return rectEncodeEntry;\n return {\n cornerRadiusTopLeft: rectEncodeEntry.cornerRadiusBottomLeft,\n cornerRadiusTopRight: rectEncodeEntry.cornerRadiusTopLeft,\n cornerRadiusBottomLeft: rectEncodeEntry.cornerRadiusBottomRight,\n cornerRadiusBottomRight: rectEncodeEntry.cornerRadiusTopRight,\n };\n};\n\nexport const getBaseBarEnterEncodings = (options: BarSpecOptions): EncodeEntry => ({\n ...getMetricEncodings(options),\n ...getCornerRadiusEncodings(options),\n});\n\nexport const getBarEnterEncodings = ({\n chartTooltips,\n color,\n colorScheme,\n name,\n opacity,\n}: BarSpecOptions): EncodeEntry => ({\n fill: getColorProductionRule(color, colorScheme),\n fillOpacity: getOpacityProductionRule(opacity),\n tooltip: getTooltip(chartTooltips, name),\n});\n\nexport const getBarUpdateEncodings = (options: BarSpecOptions): EncodeEntry => ({\n cursor: getCursor(options.chartPopovers, options.hasOnClick),\n opacity: getMarkOpacity(options),\n stroke: getStroke(options),\n strokeDash: getStrokeDash(options),\n strokeWidth: getStrokeWidth(options),\n});\n\nexport const getStroke = ({\n name,\n chartPopovers,\n color,\n colorScheme,\n idKey,\n}: BarSpecOptions): ProductionRule<ColorValueRef> => {\n const defaultProductionRule = getColorProductionRule(color, colorScheme);\n if (!hasPopover({ chartPopovers })) {\n return [defaultProductionRule];\n }\n\n return [\n {\n test: `(${SELECTED_ITEM} && ${SELECTED_ITEM} === datum.${idKey}) || (${SELECTED_GROUP} && ${SELECTED_GROUP} === datum.${name}_selectedGroupId)`,\n value: getColorValue('static-blue', colorScheme),\n },\n defaultProductionRule,\n ];\n};\n\nexport const getDimensionSelectionRing = (options: BarSpecOptions): RectMark => {\n const { name, colorScheme, paddingRatio, orientation } = options;\n\n const update =\n orientation === 'vertical'\n ? {\n y: { value: 0 },\n y2: { signal: 'height' },\n xc: { signal: `scale('xBand', datum.${name}_selectedGroupId) + bandwidth('xBand')/2` },\n width: { signal: `bandwidth('xBand')/(1 - ${paddingRatio} / 2)` },\n }\n : {\n x: { value: 0 },\n x2: { signal: 'width' },\n yc: { signal: `scale('yBand', datum.${name}_selectedGroupId) + bandwidth('yBand')/2` },\n height: { signal: `bandwidth('yBand')/(1 - ${paddingRatio} / 2)` },\n };\n\n return {\n name: `${name}_selectionRing`,\n type: 'rect',\n from: {\n data: `${name}_selectedData`,\n },\n interactive: false,\n encode: {\n enter: {\n fill: { value: 'transparent' },\n strokeWidth: { value: 2 },\n stroke: { value: getColorValue('static-blue', colorScheme) },\n cornerRadius: { value: 6 },\n },\n update,\n },\n };\n};\n\nexport const getStrokeDash = ({ chartPopovers, idKey, lineType }: BarSpecOptions): ProductionRule<ArrayValueRef> => {\n const defaultProductionRule = getStrokeDashProductionRule(lineType);\n if (!hasPopover({ chartPopovers })) {\n return [defaultProductionRule];\n }\n\n return [\n { test: `isValid(${SELECTED_ITEM}) && ${SELECTED_ITEM} === datum.${idKey}`, value: [] },\n defaultProductionRule,\n ];\n};\n\nexport const getStrokeWidth = ({\n chartPopovers,\n idKey,\n lineWidth,\n name,\n}: BarSpecOptions): ProductionRule<NumericValueRef> => {\n const lineWidthValue = getLineWidthPixelsFromLineWidth(lineWidth);\n const defaultProductionRule = { value: lineWidthValue };\n const popovers = getPopovers(chartPopovers, name);\n const popoverWithDimensionHighlightExists = popovers.some(\n ({ UNSAFE_highlightBy }) => UNSAFE_highlightBy === 'dimension'\n );\n\n if (popovers.length === 0 || popoverWithDimensionHighlightExists) {\n return [defaultProductionRule];\n }\n\n return [\n {\n test: `(isValid(${SELECTED_ITEM}) && ${SELECTED_ITEM} === datum.${idKey}) || (isValid(${SELECTED_GROUP}) && ${SELECTED_GROUP} === datum.${name}_selectedGroupId)`,\n value: Math.max(lineWidthValue, 2),\n },\n defaultProductionRule,\n ];\n};\n\nexport const getBarPadding = (paddingRatio: number, paddingOuter?: number) => {\n return getBandPadding(paddingRatio, paddingOuter);\n};\n\nexport const getScaleValues = (options: BarSpecOptions) => {\n return options.type === 'stacked' || isDodgedAndStacked(options) ? [`${options.metric}1`] : [options.metric];\n};\n\nexport interface BarOrientationProperties {\n metricAxis: 'x' | 'y';\n dimensionAxis: 'x' | 'y';\n metricScaleKey: string;\n dimensionScaleKey: 'xBand' | 'yBand';\n rangeScale: 'width' | 'height';\n}\n\nexport const getOrientationProperties = (orientation: Orientation, scaleName?: string): BarOrientationProperties =>\n orientation === 'vertical'\n ? {\n metricAxis: 'y',\n dimensionAxis: 'x',\n metricScaleKey: scaleName || 'yLinear',\n dimensionScaleKey: 'xBand',\n rangeScale: 'width',\n }\n : {\n metricAxis: 'x',\n dimensionAxis: 'y',\n metricScaleKey: scaleName || 'xLinear',\n dimensionScaleKey: 'yBand',\n rangeScale: 'height',\n };\n\nexport const getBaseScaleName = (options: BarSpecOptions) => {\n const { metricAxis, orientation } = options;\n const { metricScaleKey } = getOrientationProperties(orientation);\n return metricAxis || metricScaleKey;\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { GroupMark } from 'vega';\n\nimport { BACKGROUND_COLOR } from '@spectrum-charts/constants';\n\nimport { isInteractive } from '../marks/markUtils';\nimport { BarSpecOptions } from '../types';\nimport { getAnnotationMarks } from './barAnnotationUtils';\nimport {\n getBarEnterEncodings,\n getBarUpdateEncodings,\n getBaseBarEnterEncodings,\n getDodgedDimensionEncodings,\n getDodgedGroupMark,\n} from './barUtils';\n\nexport const getDodgedMark = (options: BarSpecOptions): GroupMark => {\n const { name } = options;\n\n return {\n ...getDodgedGroupMark(options),\n marks: [\n // background bars\n {\n name: `${name}_background`,\n from: { data: `${name}_facet` },\n type: 'rect',\n interactive: false,\n encode: {\n enter: {\n ...getBaseBarEnterEncodings(options),\n fill: { signal: BACKGROUND_COLOR },\n },\n update: {\n ...getDodgedDimensionEncodings(options),\n },\n },\n },\n // bars\n {\n name,\n from: { data: `${name}_facet` },\n type: 'rect',\n interactive: isInteractive(options),\n encode: {\n enter: {\n ...getBaseBarEnterEncodings(options),\n ...getBarEnterEncodings(options),\n },\n update: {\n ...getDodgedDimensionEncodings(options),\n ...getBarUpdateEncodings(options),\n },\n },\n },\n ...getAnnotationMarks(options, `${name}_facet`, `${name}_position`, `${name}_dodgeGroup`),\n ],\n };\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { GroupMark, Mark, RectEncodeEntry, RectMark } from 'vega';\n\nimport { BACKGROUND_COLOR, FILTERED_TABLE } from '@spectrum-charts/constants';\n\nimport { isInteractive } from '../marks/markUtils';\nimport { BarSpecOptions } from '../types';\nimport { getAnnotationMarks } from './barAnnotationUtils';\nimport {\n getBarEnterEncodings,\n getBarUpdateEncodings,\n getBaseBarEnterEncodings,\n getDodgedDimensionEncodings,\n getDodgedGroupMark,\n getOrientationProperties,\n isDodgedAndStacked,\n} from './barUtils';\nimport { getTrellisProperties, isTrellised } from './trellisedBarUtils';\n\nexport const getStackedBarMarks = (options: BarSpecOptions): Mark[] => {\n const marks: Mark[] = [];\n // add background marks\n // these marks make it so that when the opacity of a bar is lowered (like on hover), you can't see the grid lines behind the bars\n marks.push(getStackedBackgroundBar(options));\n\n // bar mark\n marks.push(getStackedBar(options));\n\n // add annotation marks\n marks.push(\n ...getAnnotationMarks(\n options,\n getBaseDataSourceName(options),\n getOrientationProperties(options.orientation).dimensionScaleKey,\n options.dimension\n )\n );\n\n return marks;\n};\n\nexport const getDodgedAndStackedBarMark = (options: BarSpecOptions): GroupMark => {\n const marks: Mark[] = [];\n // add background marks\n marks.push(getStackedBackgroundBar(options));\n\n // bar mark\n marks.push(getStackedBar(options));\n\n // add annotation marks\n marks.push(\n ...getAnnotationMarks(options, `${options.name}_facet`, `${options.name}_position`, `${options.name}_dodgeGroup`)\n );\n\n return { ...getDodgedGroupMark(options), marks };\n};\n\nexport const getStackedBackgroundBar = (options: BarSpecOptions): RectMark => {\n const { name } = options;\n\n return {\n name: `${name}_background`,\n description: `${name}_background`,\n type: 'rect',\n from: { data: isDodgedAndStacked(options) ? `${name}_facet` : getBaseDataSourceName(options) },\n interactive: false,\n encode: {\n enter: {\n ...getBaseBarEnterEncodings(options),\n fill: { signal: BACKGROUND_COLOR },\n },\n update: {\n ...getStackedDimensionEncodings(options),\n },\n },\n };\n};\n\nexport const getStackedBar = (options: BarSpecOptions): RectMark => {\n const { name } = options;\n return {\n name,\n description: name,\n type: 'rect',\n from: { data: isDodgedAndStacked(options) ? `${name}_facet` : getBaseDataSourceName(options) },\n interactive: isInteractive(options),\n encode: {\n enter: {\n ...getBaseBarEnterEncodings(options),\n ...getBarEnterEncodings(options),\n },\n update: {\n ...getStackedDimensionEncodings(options),\n ...getBarUpdateEncodings(options),\n },\n },\n };\n};\n\nexport const getStackedDimensionEncodings = (options: BarSpecOptions): RectEncodeEntry => {\n const { dimension, orientation } = options;\n if (isDodgedAndStacked(options)) {\n return getDodgedDimensionEncodings(options);\n }\n\n const { dimensionAxis, rangeScale, dimensionScaleKey } = getOrientationProperties(orientation);\n\n return {\n [dimensionAxis]: { scale: dimensionScaleKey, field: dimension },\n [rangeScale]: { scale: dimensionScaleKey, band: 1 },\n };\n};\n\nconst getBaseDataSourceName = (options: BarSpecOptions) => {\n if (isTrellised(options)) return getTrellisProperties(options).facetName;\n return FILTERED_TABLE;\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { GroupMark, Mark, Scale } from 'vega';\n\nimport { FILTERED_TABLE } from '@spectrum-charts/constants';\n\nimport { addDomainFields, getScaleIndexByName } from '../scale/scaleSpecBuilder';\nimport { BarSpecOptions } from '../types';\nimport { getDodgedDimensionEncodings, getTrellisedDimensionEncodings, isDodgedAndStacked } from './barUtils';\n\n/**\n * Generates the trellis group mark\n * @param options\n * @param marks visualization marks (bar, line, etc)\n * @param repeatedScale this is the scale that is repeated for each trellis, for example: y scale for vertical trellis, x scale for horizontal trellis\n * @returns\n */\nexport const getTrellisGroupMark = (options: BarSpecOptions, marks: Mark[], repeatedScale: Scale): GroupMark => {\n const { trellisOrientation } = options;\n const trellis = options.trellis as string;\n const {\n markName,\n facetName,\n scaleName,\n axis: trellisAxis,\n rangeScale: trellisRangeScale,\n } = getTrellisProperties(options);\n\n return {\n name: markName,\n type: 'group',\n\n // Define data source for this trellis\n from: {\n facet: {\n data: FILTERED_TABLE,\n name: facetName,\n groupby: trellis,\n },\n },\n\n // Override the default 'height' or 'width' signal with the trellis scale bandwidth\n signals: [{ name: trellisRangeScale, update: `bandwidth('${scaleName}')` }],\n\n // Encode the trellis on its axis\n encode: {\n enter: {\n [trellisAxis]: { scale: scaleName, field: trellis },\n height: { signal: trellisOrientation === 'vertical' ? `bandwidth('${scaleName}')` : 'height' },\n width: { signal: trellisOrientation === 'horizontal' ? `bandwidth('${scaleName}')` : 'width' },\n },\n },\n\n scales: [repeatedScale],\n marks,\n };\n};\n\nexport const addTrellisScale = (scales: Scale[], options: BarSpecOptions) => {\n if (!options.trellis) {\n return;\n }\n const { scaleName, rangeScale, paddingInner } = getTrellisProperties(options);\n const trellisScaleIndex = getScaleIndexByName(scales, scaleName, 'band');\n scales[trellisScaleIndex] = addDomainFields(scales[trellisScaleIndex], [options.trellis]);\n scales[trellisScaleIndex] = {\n ...scales[trellisScaleIndex],\n range: rangeScale,\n paddingInner,\n } as Scale;\n};\n\nexport const getTrellisedEncodeEntries = (options: BarSpecOptions) => {\n if (options.type === 'dodged' || isDodgedAndStacked(options)) {\n return getDodgedDimensionEncodings(options);\n }\n\n return getTrellisedDimensionEncodings(options);\n};\n\nexport interface BarTrellisProperties {\n facetName: string;\n scaleName: 'xTrellisBand' | 'yTrellisBand';\n markName: 'xTrellisGroup' | 'yTrellisGroup';\n rangeScale: 'width' | 'height';\n axis: 'x' | 'y';\n paddingInner: number;\n}\n\nexport const getTrellisProperties = ({\n trellisOrientation,\n name,\n trellisPadding,\n}: BarSpecOptions): BarTrellisProperties => {\n const axis = trellisOrientation === 'horizontal' ? 'x' : 'y';\n\n return {\n facetName: `${name}_trellis`,\n scaleName: `${axis}TrellisBand`,\n markName: `${axis}TrellisGroup`,\n rangeScale: axis === 'x' ? 'width' : 'height',\n axis,\n paddingInner: trellisPadding,\n };\n};\n\nexport const isTrellised = (options: BarSpecOptions) => Boolean(options.trellis);\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Data, FormulaTransform, ValuesData } from 'vega';\n\nimport { TABLE } from '@spectrum-charts/constants';\n\nimport { getTableData } from '../data/dataUtils';\nimport { BulletSpecOptions, ThresholdBackground } from '../types';\n\n/**\n * Retrieves the bullet table data from the provided data array.\n * If it doesn't exist, creates and pushes a new one.\n * @param data The data array.\n * @returns The bullet table data.\n */\nexport const getBulletTableData = (data: Data[]): ValuesData => {\n let tableData = getTableData(data);\n if (!tableData) {\n tableData = {\n name: TABLE,\n values: [],\n transform: [],\n };\n data.push(tableData);\n }\n return tableData;\n};\n\n/**\n * Generates the necessary formula transforms for the bullet chart.\n * It calculates the xPaddingForTarget and, if in flexible scale mode, adds the flexibleScaleValue.\n * It also generates a color expression for the threshold bars if applicable.\n * @param bulletOptions The bullet spec properties.\n * @returns An array of formula transforms.\n */\nexport const getBulletTransforms = (bulletOptions: BulletSpecOptions): FormulaTransform[] => {\n const transforms: FormulaTransform[] = [\n {\n type: 'formula',\n expr: `isValid(datum.${bulletOptions.target}) ? round(datum.${bulletOptions.target} * 1.05) : 0`,\n as: 'xPaddingForTarget',\n },\n ];\n\n if (bulletOptions.scaleType === 'flexible') {\n transforms.push({\n type: 'formula',\n expr: `${bulletOptions.maxScaleValue}`,\n as: 'flexibleScaleValue',\n });\n }\n\n if (bulletOptions.thresholdBarColor && (bulletOptions.thresholds?.length ?? 0) > 0) {\n transforms.push({\n type: 'formula',\n expr: generateThresholdColorExpr(bulletOptions.thresholds ?? [], bulletOptions.metric, bulletOptions.color),\n as: 'barColor',\n });\n }\n\n return transforms;\n};\n\n/**\n * Generates a Vega expression for the color of the bullet chart based on the provided thresholds.\n * The expression checks the value of the metric field against the thresholds and assigns the appropriate color.\n * @param thresholds An array of threshold objects.\n * @param metricField The name of the metric field in the data.\n * @param defaultColor The default color to use if no thresholds are met.\n * @returns A string representing the Vega expression for the color.\n */\nexport function generateThresholdColorExpr(\n thresholds: ThresholdBackground[],\n metricField: string,\n defaultColor: string\n): string {\n if (!thresholds || thresholds.length === 0) return `'${defaultColor}'`;\n\n const sorted: ThresholdBackground[] = thresholds.slice().sort((a, b) => {\n const aMin = a.thresholdMin !== undefined ? a.thresholdMin : -1e12;\n const bMin = b.thresholdMin !== undefined ? b.thresholdMin : -1e12;\n return aMin - bMin;\n });\n\n const exprParts: string[] = [];\n\n // For values below the first threshold's lower bound, use the default color.\n exprParts.push(\n `(datum.${metricField} < ${\n sorted[0].thresholdMin !== undefined ? sorted[0].thresholdMin : -1e12\n }) ? '${defaultColor}' : `\n );\n\n // For each threshold, check if the metric field is within the range defined by the thresholdMin and thresholdMax values.\n // If it is, use the corresponding fill color.\n for (let i = 0; i < sorted.length - 1; i++) {\n const nextLower = sorted[i + 1].thresholdMin !== undefined ? sorted[i + 1].thresholdMin : -1e12;\n exprParts.push(`(datum.${metricField} < ${nextLower}) ? '${sorted[i].fill}' : `);\n }\n\n // For values above the last threshold's upper bound, use the last threshold's fill color.\n exprParts.push(`'${sorted[sorted.length - 1].fill}'`);\n\n const expr = exprParts.join('');\n return expr;\n}\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Axis, GroupMark, Mark } from 'vega';\n\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { BulletSpecOptions } from '../types';\n\nexport const addMarks = produce<Mark[], [BulletSpecOptions]>((marks, bulletOptions) => {\n const markGroupEncodeUpdateDirection = bulletOptions.direction === 'column' ? 'y' : 'x';\n const bulletGroupWidth = bulletOptions.direction === 'column' ? 'width' : 'bulletGroupWidth';\n\n const bulletMark: GroupMark = {\n name: 'bulletGroup',\n type: 'group',\n from: {\n facet: { data: 'table', name: 'bulletGroups', groupby: `${bulletOptions.dimension}` },\n },\n encode: {\n update: {\n [markGroupEncodeUpdateDirection]: { scale: 'groupScale', field: `${bulletOptions.dimension}` },\n height: { signal: 'bulletGroupHeight' },\n width: { signal: bulletGroupWidth },\n },\n },\n marks: [],\n };\n\n const thresholds = bulletOptions.thresholds;\n\n if (Array.isArray(thresholds) && thresholds.length > 0) {\n bulletMark.data = [\n {\n name: 'thresholds',\n values: thresholds,\n transform: [{ type: 'identifier', as: 'id' }],\n },\n ];\n bulletMark.marks?.push(getBulletMarkThreshold(bulletOptions));\n } else if (bulletOptions.track) {\n bulletMark.marks?.push(getBulletTrack(bulletOptions));\n }\n\n bulletMark.marks?.push(getBulletMarkRect(bulletOptions));\n if (bulletOptions.target && bulletOptions.showTarget !== false) {\n bulletMark.marks?.push(getBulletMarkTarget(bulletOptions));\n if (bulletOptions.showTargetValue) {\n bulletMark.marks?.push(getBulletMarkTargetValueLabel(bulletOptions));\n }\n }\n\n if (bulletOptions.labelPosition === 'top' || bulletOptions.direction === 'row') {\n bulletMark.marks?.push(getBulletMarkLabel(bulletOptions));\n bulletMark.marks?.push(getBulletMarkValueLabel(bulletOptions));\n }\n\n marks.push(bulletMark);\n});\n\nexport function getBulletMarkRect(bulletOptions: BulletSpecOptions): Mark {\n //The vertical positioning is calculated starting at the bulletgroupheight\n //and then subtracting two times the bullet height to center the bullet bar\n //in the middle of the threshold. The 3 is subtracted because the bulletgroup height\n //starts the bullet below the threshold area.\n //Additionally, the value of the targetValueLabelHeight is subtracted if the target value label is shown\n //to make sure that the bullet bar is not drawn over the target value label.\n const bulletMarkRectEncodeUpdateYSignal =\n bulletOptions.showTarget && bulletOptions.showTargetValue\n ? 'bulletGroupHeight - targetValueLabelHeight - 3 - 2 * bulletHeight'\n : 'bulletGroupHeight - 3 - 2 * bulletHeight';\n\n const fillColor =\n bulletOptions.thresholdBarColor && (bulletOptions.thresholds?.length ?? 0) > 0\n ? [{ field: 'barColor' }]\n : [{ value: bulletOptions.color }];\n\n const bulletMarkRect: Mark = {\n name: `${bulletOptions.name}Rect`,\n description: `${bulletOptions.name}Rect`,\n type: 'rect',\n from: { data: 'bulletGroups' },\n encode: {\n enter: {\n cornerRadiusTopLeft: [{ test: `datum.${bulletOptions.metric} < 0`, value: 3 }],\n cornerRadiusBottomLeft: [{ test: `datum.${bulletOptions.metric} < 0`, value: 3 }],\n cornerRadiusTopRight: [{ test: `datum.${bulletOptions.metric} > 0`, value: 3 }],\n cornerRadiusBottomRight: [{ test: `datum.${bulletOptions.metric} > 0`, value: 3 }],\n fill: fillColor,\n },\n update: {\n x: { scale: 'xscale', value: 0 },\n x2: { scale: 'xscale', field: `${bulletOptions.metric}` },\n height: { signal: 'bulletHeight' },\n y: { signal: bulletMarkRectEncodeUpdateYSignal },\n },\n },\n };\n\n return bulletMarkRect;\n}\n\nexport function getBulletMarkTarget(bulletOptions: BulletSpecOptions): Mark {\n const solidColor = getColorValue('gray-900', bulletOptions.colorScheme);\n\n //When the target value label is shown, we must subtract the height of the target value label\n //to make sure that the target line is not drawn over the target value label\n const bulletMarkTargetEncodeUpdateY =\n bulletOptions.showTarget && bulletOptions.showTargetValue\n ? 'bulletGroupHeight - targetValueLabelHeight - targetHeight'\n : 'bulletGroupHeight - targetHeight';\n const bulletMarkTargetEncodeUpdateY2 =\n bulletOptions.showTarget && bulletOptions.showTargetValue\n ? 'bulletGroupHeight - targetValueLabelHeight'\n : 'bulletGroupHeight';\n\n const bulletMarkTarget: Mark = {\n name: `${bulletOptions.name}Target`,\n description: `${bulletOptions.name}Target`,\n type: 'rule',\n from: { data: 'bulletGroups' },\n encode: {\n enter: {\n stroke: { value: `${solidColor}` },\n strokeWidth: { value: 2 },\n },\n update: {\n x: { scale: 'xscale', field: `${bulletOptions.target}` },\n y: { signal: bulletMarkTargetEncodeUpdateY },\n y2: { signal: bulletMarkTargetEncodeUpdateY2 },\n },\n },\n };\n\n return bulletMarkTarget;\n}\n\nexport function getBulletMarkLabel(bulletOptions: BulletSpecOptions): Mark {\n const barLabelColor = getColorValue('gray-600', bulletOptions.colorScheme);\n\n const bulletMarkLabel: Mark = {\n name: `${bulletOptions.name}Label`,\n description: `${bulletOptions.name}Label`,\n type: 'text',\n from: { data: 'bulletGroups' },\n encode: {\n enter: {\n text: { signal: `datum.${bulletOptions.dimension}` },\n align: { value: 'left' },\n baseline: { value: 'top' },\n fill: { value: `${barLabelColor}` },\n },\n update: { x: { value: 0 }, y: { value: 0 } },\n },\n };\n\n return bulletMarkLabel;\n}\n\nexport function getBulletMarkValueLabel(bulletOptions: BulletSpecOptions): Mark {\n const defaultColor = getColorValue(bulletOptions.color, bulletOptions.colorScheme);\n const solidColor = getColorValue('gray-900', bulletOptions.colorScheme);\n const encodeUpdateSignalWidth = bulletOptions.direction === 'column' ? 'width' : 'bulletGroupWidth';\n const fillExpr =\n bulletOptions.thresholdBarColor && (bulletOptions.thresholds?.length ?? 0) > 0\n ? `datum.barColor === '${defaultColor}' ? '${solidColor}' : datum.barColor`\n : `'${solidColor}'`;\n\n const bulletMarkValueLabel: Mark = {\n name: `${bulletOptions.name}ValueLabel`,\n description: `${bulletOptions.name}ValueLabel`,\n type: 'text',\n from: { data: 'bulletGroups' },\n encode: {\n enter: {\n text: {\n signal: `datum.${bulletOptions.metric} != null ? format(datum.${bulletOptions.metric}, '${\n bulletOptions.numberFormat || ''\n }') : ''`,\n },\n align: { value: 'right' },\n baseline: { value: 'top' },\n fill: { signal: fillExpr },\n },\n update: { x: { signal: encodeUpdateSignalWidth }, y: { value: 0 } },\n },\n };\n\n return bulletMarkValueLabel;\n}\n\nexport function getBulletMarkTargetValueLabel(bulletOptions: BulletSpecOptions): Mark {\n const solidColor = getColorValue('gray-900', bulletOptions.colorScheme);\n\n const bulletMarkTargetValueLabel: Mark = {\n name: `${bulletOptions.name}TargetValueLabel`,\n description: `${bulletOptions.name}TargetValueLabel`,\n type: 'text',\n from: { data: 'bulletGroups' },\n encode: {\n enter: {\n text: {\n signal: `datum.${bulletOptions.target} != null ? 'Target: ' + format(datum.${bulletOptions.target}, '$,.2f') : 'No Target'`,\n },\n align: { value: 'center' },\n baseline: { value: 'top' },\n fill: { value: `${solidColor}` },\n },\n update: {\n x: { scale: 'xscale', field: `${bulletOptions.target}` },\n y: { signal: 'bulletGroupHeight - targetValueLabelHeight + 6' },\n },\n },\n };\n\n return bulletMarkTargetValueLabel;\n}\n\nexport function getBulletMarkThreshold(bulletOptions: BulletSpecOptions): Mark {\n // Vertically center the threshold bar by offsetting from bulletGroupHeight.\n // Subtract 3 for alignment and targetValueLabelHeight if the label is shown.\n const baseHeightSignal = 'bulletGroupHeight - 3 - bulletThresholdHeight';\n const encodeUpdateYSignal =\n bulletOptions.showTarget && bulletOptions.showTargetValue\n ? `${baseHeightSignal} - targetValueLabelHeight`\n : baseHeightSignal;\n\n const bulletMarkThreshold: Mark = {\n name: `${bulletOptions.name}Threshold`,\n description: `${bulletOptions.name}Threshold`,\n type: 'rect',\n from: { data: 'thresholds' },\n clip: true,\n encode: {\n enter: {\n cornerRadiusTopLeft: [{ test: `!isDefined(datum.thresholdMin) && domain('xscale')[0] !== 0`, value: 3 }],\n cornerRadiusBottomLeft: [{ test: `!isDefined(datum.thresholdMin) && domain('xscale')[0] !== 0`, value: 3 }],\n cornerRadiusTopRight: [{ test: `!isDefined(datum.thresholdMax) && domain('xscale')[1] !== 0`, value: 3 }],\n cornerRadiusBottomRight: [{ test: `!isDefined(datum.thresholdMax) && domain('xscale')[1] !== 0`, value: 3 }],\n fill: { field: 'fill' },\n fillOpacity: { value: 0.2 },\n },\n update: {\n x: {\n signal: \"isDefined(datum.thresholdMin) ? scale('xscale', datum.thresholdMin) : 0\",\n },\n x2: {\n signal: \"isDefined(datum.thresholdMax) ? scale('xscale', datum.thresholdMax) : width\",\n },\n height: { signal: 'bulletThresholdHeight' },\n y: { signal: encodeUpdateYSignal },\n },\n },\n };\n return bulletMarkThreshold;\n}\n\nexport function getBulletTrack(bulletOptions: BulletSpecOptions): Mark {\n const trackColor = getColorValue('gray-200', bulletOptions.colorScheme);\n const trackWidth = bulletOptions.direction === 'column' ? 'width' : 'bulletGroupWidth';\n // Subtracting 20 accounts for the space used by the target value label\n const trackY =\n bulletOptions.showTarget && bulletOptions.showTargetValue\n ? 'bulletGroupHeight - 3 - 2 * bulletHeight - 20'\n : 'bulletGroupHeight - 3 - 2 * bulletHeight';\n\n const bulletTrack: Mark = {\n name: `${bulletOptions.name}Track`,\n description: `${bulletOptions.name}Track`,\n type: 'rect',\n from: { data: 'bulletGroups' },\n encode: {\n enter: {\n fill: { value: trackColor },\n cornerRadiusTopRight: [{ test: \"domain('xscale')[1] !== 0\", value: 3 }],\n cornerRadiusBottomRight: [{ test: \"domain('xscale')[1] !== 0\", value: 3 }],\n cornerRadiusTopLeft: [{ test: \"domain('xscale')[0] !== 0\", value: 3 }],\n cornerRadiusBottomLeft: [{ test: \"domain('xscale')[0] !== 0\", value: 3 }],\n },\n update: {\n x: { value: 0 },\n width: { signal: trackWidth },\n height: { signal: 'bulletHeight' },\n y: { signal: trackY },\n },\n },\n };\n\n return bulletTrack;\n}\n\nexport function getBulletLabelAxesLeft(labelOffset): Axis {\n return {\n scale: 'groupScale',\n orient: 'left',\n tickSize: 0,\n labelOffset: labelOffset,\n labelPadding: 10,\n labelColor: '#797979',\n domain: false,\n };\n}\n\nexport function getBulletLabelAxesRight(bulletOptions: BulletSpecOptions, labelOffset): Axis {\n return {\n scale: 'groupScale',\n orient: 'right',\n tickSize: 0,\n labelOffset: labelOffset,\n labelPadding: 10,\n domain: false,\n encode: {\n labels: {\n update: {\n text: {\n signal: `info(data('table')[datum.index * (length(data('table')) - 1)].${\n bulletOptions.metric\n }) != null ? format(info(data('table')[datum.index * (length(data('table')) - 1)].${\n bulletOptions.metric\n }), '${bulletOptions.numberFormat || ''}') : ''`,\n },\n },\n },\n },\n };\n}\n\nexport function getBulletScaleAxes(): Axis {\n return {\n labelOffset: 2,\n scale: 'xscale',\n orient: 'bottom',\n ticks: false,\n labelColor: 'gray',\n domain: false,\n tickCount: 5,\n offset: { signal: 'axisOffset' },\n };\n}\n\nexport const addAxes = produce<Axis[], [BulletSpecOptions]>((axes, bulletOptions) => {\n if (bulletOptions.metricAxis && bulletOptions.direction === 'column' && !bulletOptions.showTargetValue) {\n axes.push(getBulletScaleAxes());\n }\n\n if (bulletOptions.labelPosition === 'side' && bulletOptions.direction === 'column') {\n const labelOffset = bulletOptions.showTargetValue && bulletOptions.showTarget ? -8 : 2;\n axes.push(getBulletLabelAxesLeft(labelOffset));\n axes.push(getBulletLabelAxesRight(bulletOptions, labelOffset));\n }\n});\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Data, Scale, Signal } from 'vega';\n\nimport {\n DEFAULT_BULLET_DIRECTION,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_LABEL_POSITION,\n DEFAULT_SCALE_TYPE,\n DEFAULT_SCALE_VALUE,\n} from '@spectrum-charts/constants';\nimport { getColorValue, spectrumColors } from '@spectrum-charts/themes';\nimport { toCamelCase } from '@spectrum-charts/utils';\n\nimport { BulletOptions, BulletSpecOptions, ColorScheme, ScSpec } from '../types';\nimport { getBulletTableData, getBulletTransforms } from './bulletDataUtils';\nimport { addAxes, addMarks } from './bulletMarkUtils';\n\nconst DEFAULT_COLOR = spectrumColors.light['static-blue'];\n\nexport const addBullet = produce<\n ScSpec,\n [BulletOptions & { colorScheme?: ColorScheme; index?: number; idKey: string }]\n>(\n (\n spec,\n {\n colorScheme = DEFAULT_COLOR_SCHEME,\n index = 0,\n name,\n metric,\n dimension,\n target,\n color = DEFAULT_COLOR,\n direction = DEFAULT_BULLET_DIRECTION,\n numberFormat,\n showTarget = true,\n showTargetValue = false,\n labelPosition = DEFAULT_LABEL_POSITION,\n scaleType = DEFAULT_SCALE_TYPE,\n maxScaleValue = DEFAULT_SCALE_VALUE,\n thresholds = [],\n track = false,\n thresholdBarColor = false,\n metricAxis = false,\n ...options\n }\n ) => {\n const bulletOptions: BulletSpecOptions = {\n colorScheme: colorScheme,\n index,\n color: getColorValue(color, colorScheme),\n metric: metric ?? 'currentAmount',\n dimension: dimension ?? 'graphLabel',\n target: target ?? 'target',\n name: toCamelCase(name ?? `bullet${index}`),\n direction: direction,\n numberFormat: numberFormat ?? '',\n showTarget: showTarget,\n showTargetValue: showTargetValue,\n labelPosition: labelPosition,\n scaleType: scaleType,\n maxScaleValue: maxScaleValue,\n track: track,\n thresholds: thresholds,\n thresholdBarColor: thresholdBarColor,\n metricAxis: metricAxis,\n ...options,\n };\n\n spec.data = addData(spec.data ?? [], bulletOptions);\n spec.marks = addMarks(spec.marks ?? [], bulletOptions);\n spec.scales = addScales(spec.scales ?? [], bulletOptions);\n spec.signals = addSignals(spec.signals ?? [], bulletOptions);\n spec.axes = addAxes(spec.axes ?? [], bulletOptions);\n }\n);\n\nexport const addScales = produce<Scale[], [BulletSpecOptions]>((scales, options) => {\n const groupScaleRangeSignal = options.direction === 'column' ? 'bulletChartHeight' : 'width';\n const xRange = options.direction === 'column' ? 'width' : [0, { signal: 'bulletGroupWidth' }];\n let domainFields;\n\n if (options.scaleType === 'flexible' && options.maxScaleValue > 0) {\n domainFields = { data: 'table', fields: ['xPaddingForTarget', options.metric, 'flexibleScaleValue'] };\n } else if (options.scaleType === 'fixed' && options.maxScaleValue > 0) {\n domainFields = [0, `${options.maxScaleValue}`];\n } else {\n domainFields = { data: 'table', fields: ['xPaddingForTarget', options.metric] };\n }\n\n scales.push(\n {\n name: 'groupScale',\n type: 'band',\n domain: { data: 'table', field: options.dimension },\n range: [0, { signal: groupScaleRangeSignal }],\n paddingInner: { signal: 'paddingRatio' },\n },\n {\n name: 'xscale',\n type: 'linear',\n domain: domainFields,\n range: xRange,\n round: true,\n clamp: true,\n zero: true,\n }\n );\n});\n\nexport const addSignals = produce<Signal[], [BulletSpecOptions]>((signals, options) => {\n signals.push({ name: 'gap', value: 12 });\n signals.push({ name: 'bulletHeight', value: 8 });\n signals.push({ name: 'bulletThresholdHeight', update: 'bulletHeight * 3' });\n signals.push({ name: 'targetHeight', update: 'bulletThresholdHeight + 6' });\n\n if (options.showTargetValue && options.showTarget) {\n signals.push({ name: 'targetValueLabelHeight', update: '20' });\n }\n\n signals.push({\n name: 'bulletGroupHeight',\n update: getBulletGroupHeightExpression(options),\n });\n\n if (options.direction === 'column') {\n signals.push({ name: 'paddingRatio', update: 'gap / (gap + bulletGroupHeight)' });\n\n if (options.metricAxis && !options.showTargetValue) {\n signals.push({\n name: 'bulletChartHeight',\n update: \"length(data('table')) * bulletGroupHeight + (length(data('table')) - 1) * gap + 10\",\n });\n signals.push({\n name: 'axisOffset',\n update: 'bulletChartHeight - height - 10',\n });\n } else {\n signals.push({\n name: 'bulletChartHeight',\n update: \"length(data('table')) * bulletGroupHeight + (length(data('table')) - 1) * gap\",\n });\n }\n } else {\n signals.push({ name: 'bulletGroupWidth', update: \"(width / length(data('table'))) - gap\" });\n signals.push({ name: 'paddingRatio', update: 'gap / (gap + bulletGroupWidth)' });\n signals.push({ name: 'bulletChartHeight', update: 'bulletGroupHeight' });\n }\n});\n\n/**\n * Returns the height of the bullet group based on the options\n * @param options the bullet spec options\n * @returns the height of the bullet group\n */\nfunction getBulletGroupHeightExpression(options: BulletSpecOptions): string {\n if (options.showTargetValue && options.showTarget) {\n return options.labelPosition === 'side' && options.direction === 'column'\n ? 'bulletThresholdHeight + targetValueLabelHeight + 10'\n : 'bulletThresholdHeight + targetValueLabelHeight + 24';\n } else if (options.labelPosition === 'side' && options.direction === 'column') {\n return 'bulletThresholdHeight + 10';\n }\n return 'bulletThresholdHeight + 24';\n}\n\nexport const addData = produce<Data[], [BulletSpecOptions]>((data, options) => {\n const tableData = getBulletTableData(data);\n tableData.transform = getBulletTransforms(options);\n});\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Data, FormulaTransform, SourceData } from 'vega';\n\nimport { FILTERED_TABLE, SELECTED_GROUP, SERIES_ID } from '@spectrum-charts/constants';\n\nimport { getFilteredTableData } from '../data/dataUtils';\nimport {\n AreaSpecOptions,\n BarSpecOptions,\n ChartPopoverOptions,\n ChartPopoverSpecOptions,\n DonutSpecOptions,\n LineSpecOptions,\n ScatterSpecOptions,\n} from '../types';\n\ntype PopoverParentOptions = AreaSpecOptions | BarSpecOptions | DonutSpecOptions | LineSpecOptions | ScatterSpecOptions;\n\n/**\n * gets all the popovers\n * @param markOptions\n * @returns\n */\nexport const getPopovers = (chartPopovers: ChartPopoverOptions[], markName: string): ChartPopoverSpecOptions[] => {\n return chartPopovers.map((chartPopover) => applyPopoverPropDefaults(chartPopover, markName));\n};\n\n/**\n * Applies all defaults to ChartPopoverOptions\n * @param chartPopoverOptions\n * @returns ChartPopoverSpecOptions\n */\nexport const applyPopoverPropDefaults = (\n { UNSAFE_highlightBy = 'item', ...options }: ChartPopoverOptions,\n markName: string\n): ChartPopoverSpecOptions => {\n return {\n UNSAFE_highlightBy,\n markName,\n ...options,\n };\n};\n\n/**\n * Sets all the data needed for popovers\n *\n * NOTE: this function mutates the data object so it should only be called from a produce function\n * @param data\n * @param markOptions\n */\nexport const addPopoverData = (data: Data[], markOptions: PopoverParentOptions, addHighlightedData = true) => {\n const popovers = getPopovers(markOptions.chartPopovers, markOptions.name);\n\n for (const { UNSAFE_highlightBy, markName } of popovers) {\n const filteredTable = getFilteredTableData(data);\n if (!filteredTable.transform) {\n filteredTable.transform = [];\n }\n if (UNSAFE_highlightBy === 'dimension' && markOptions.markType !== 'donut') {\n filteredTable.transform.push(getGroupIdTransform([markOptions.dimension], markName));\n } else if (UNSAFE_highlightBy === 'series') {\n filteredTable.transform.push(getGroupIdTransform([SERIES_ID], markName));\n } else if (Array.isArray(UNSAFE_highlightBy)) {\n filteredTable.transform.push(getGroupIdTransform(UNSAFE_highlightBy, markName));\n } else {\n filteredTable.transform.push(getGroupIdTransform([markOptions.idKey], markName));\n }\n\n if (addHighlightedData) {\n data.push(getMarkSelectedData(markName));\n }\n }\n};\n\n/**\n * Gets the group id transform\n * @param highlightBy\n * @param markName\n * @returns FormulaTransform\n */\nexport const getGroupIdTransform = (highlightBy: string[], markName: string): FormulaTransform => {\n return {\n type: 'formula',\n as: `${markName}_selectedGroupId`,\n expr: highlightBy.map((facet) => `datum.${facet}`).join(' + \" | \" + '),\n };\n};\n\n/**\n * Gets the selected data for a mark\n * @param markName\n * @returns\n */\nconst getMarkSelectedData = (markName: string): SourceData => ({\n name: `${markName}_selectedData`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'filter',\n expr: `${SELECTED_GROUP} === datum.${markName}_selectedGroupId`,\n },\n ],\n});\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Data, LinearScale, OrdinalScale, PointScale, Scale, Signal } from 'vega';\n\nimport {\n BACKGROUND_COLOR,\n DEFAULT_BACKGROUND_COLOR,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_LINE_TYPES,\n FILTERED_TABLE,\n HIGHLIGHTED_GROUP,\n HIGHLIGHTED_ITEM,\n HIGHLIGHTED_SERIES,\n LINEAR_COLOR_SCALE,\n LINE_TYPE_SCALE,\n LINE_WIDTH_SCALE,\n MARK_ID,\n OPACITY_SCALE,\n SELECTED_GROUP,\n SELECTED_ITEM,\n SELECTED_SERIES,\n SERIES_ID,\n SYMBOL_PATH_WIDTH_SCALE,\n SYMBOL_SHAPE_SCALE,\n SYMBOL_SIZE_SCALE,\n TABLE,\n} from '@spectrum-charts/constants';\nimport { colorSchemes, getColorValue } from '@spectrum-charts/themes';\n\nimport { addArea } from './area/areaSpecBuilder';\nimport { addAxis } from './axis/axisSpecBuilder';\nimport { addBar } from './bar/barSpecBuilder';\nimport { addBullet } from './bullet/bulletSpecBuilder';\nimport { addCombo } from './combo/comboSpecBuilder';\nimport { getSeriesIdTransform } from './data/dataUtils';\nimport { addDonut } from './donut/donutSpecBuilder';\nimport { setHoverOpacityForMarks } from './legend/legendHighlightUtils';\nimport { addLegend } from './legend/legendSpecBuilder';\nimport { addLine } from './line/lineSpecBuilder';\nimport { getOrdinalScale } from './scale/scaleSpecBuilder';\nimport { addScatter } from './scatter/scatterSpecBuilder';\nimport { getGenericValueSignal } from './signal/signalSpecBuilder';\nimport {\n getFacetsFromScales,\n getLineWidthPixelsFromLineWidth,\n getPathFromSymbolShape,\n getStrokeDashFromLineType,\n getSymbolWidthFromRscSymbolSize,\n getVegaSymbolSizeFromRscSymbolSize,\n initializeSpec,\n} from './specUtils';\nimport { addTitle } from './title/titleSpecBuilder';\nimport {\n ChartColors,\n ChartOptions,\n ChartSpecOptions,\n ChartSymbolShape,\n ColorScale,\n ColorScheme,\n Colors,\n LineType,\n LineTypes,\n LineWidth,\n Opacities,\n ScSpec,\n SymbolShapes,\n SymbolSize,\n} from './types';\n\nexport function buildSpec({\n axes = [],\n backgroundColor = DEFAULT_BACKGROUND_COLOR,\n colors = 'categorical12',\n colorScheme = DEFAULT_COLOR_SCHEME,\n description,\n hiddenSeries = [],\n highlightedItem,\n highlightedSeries,\n idKey = MARK_ID,\n legends = [],\n lineTypes = DEFAULT_LINE_TYPES as LineType[],\n lineWidths = ['M'],\n marks = [],\n opacities,\n symbolShapes = ['rounded-square'],\n symbolSizes = ['XS', 'XL'],\n title,\n titles = [],\n}: ChartOptions) {\n const options: ChartSpecOptions = {\n axes,\n backgroundColor,\n colors,\n colorScheme,\n description,\n hiddenSeries,\n highlightedItem,\n highlightedSeries,\n idKey,\n legends,\n lineTypes,\n lineWidths,\n marks,\n opacities,\n symbolShapes,\n symbolSizes,\n title,\n titles,\n };\n let spec = initializeSpec(null, { backgroundColor, colorScheme, description, title });\n spec.signals = getDefaultSignals(options);\n spec.scales = getDefaultScales(colors, colorScheme, lineTypes, lineWidths, opacities, symbolShapes, symbolSizes);\n\n let { areaCount, barCount, bulletCount, comboCount, donutCount, lineCount, scatterCount } =\n initializeComponentCounts();\n const specOptions = { colorScheme, idKey, highlightedItem };\n spec = [...marks].reduce((acc: ScSpec, mark) => {\n switch (mark.markType) {\n case 'area':\n areaCount++;\n return addArea(acc, { ...mark, ...specOptions, index: areaCount });\n case 'bar':\n barCount++;\n return addBar(acc, { ...mark, ...specOptions, index: barCount });\n case 'bullet':\n bulletCount++;\n return addBullet(acc, { ...mark, ...specOptions, index: bulletCount });\n case 'combo':\n comboCount++;\n return addCombo(acc, { ...mark, ...specOptions, index: comboCount });\n case 'donut':\n donutCount++;\n return addDonut(acc, { ...mark, ...specOptions, index: donutCount });\n case 'line':\n lineCount++;\n return addLine(acc, { ...mark, ...specOptions, index: lineCount });\n case 'scatter':\n scatterCount++;\n return addScatter(acc, { ...mark, ...specOptions, index: scatterCount });\n case 'bigNumber':\n // Do nothing and do not throw an error\n return acc;\n default:\n console.error(`Invalid component type: ${mark} is not a supported chart mark option child`);\n return acc;\n }\n }, spec);\n\n spec = [...legends].reduce((acc: ScSpec, legend, index) => {\n return addLegend(acc, {\n ...legend,\n ...specOptions,\n index,\n hiddenSeries,\n highlightedSeries,\n });\n }, spec);\n\n spec = [...axes].reduce((acc: ScSpec, axis, index) => {\n return addAxis(acc, {\n ...axis,\n ...specOptions,\n index,\n });\n }, spec);\n\n if (titles.length) {\n spec = addTitle(spec, titles[0]);\n }\n\n // copy the spec so we don't mutate the original\n spec = JSON.parse(JSON.stringify(spec));\n spec.data = addData(spec.data ?? [], { facets: getFacetsFromScales(spec.scales) });\n\n // add signals and update marks for controlled highlighting if there isn't a legend with highlight enabled\n if (highlightedSeries) {\n setHoverOpacityForMarks(spec.marks ?? []);\n }\n\n // clear out all scales that don't have any fields on the domain\n spec = removeUnusedScales(spec);\n\n return safeClone(spec);\n}\n\nexport const removeUnusedScales = produce<ScSpec>((spec) => {\n spec.scales = spec.scales?.filter((scale) => {\n return !('domain' in scale && scale.domain && 'fields' in scale.domain && scale.domain.fields.length === 0);\n });\n});\n\nconst initializeComponentCounts = () => {\n return {\n areaCount: -1,\n barCount: -1,\n comboCount: -1,\n donutCount: -1,\n bulletCount: -1,\n lineCount: -1,\n scatterCount: -1,\n };\n};\n\nexport const getDefaultSignals = ({\n backgroundColor,\n colors,\n colorScheme,\n lineTypes,\n opacities,\n hiddenSeries,\n highlightedItem,\n highlightedSeries,\n}: ChartSpecOptions): Signal[] => {\n // if the background color is transparent, then we want to set the signal background color to gray-50\n // if the signal background color were transparent then backgroundMarks and annotation fill would also be transparent\n const signalBackgroundColor = backgroundColor === 'transparent' ? 'gray-50' : backgroundColor;\n return [\n getGenericValueSignal(BACKGROUND_COLOR, getColorValue(signalBackgroundColor, colorScheme)),\n getGenericValueSignal('colors', getTwoDimensionalColorScheme(colors, colorScheme)),\n getGenericValueSignal('lineTypes', getTwoDimensionalLineTypes(lineTypes)),\n getGenericValueSignal('opacities', getTwoDimensionalOpacities(opacities)),\n getGenericValueSignal('hiddenSeries', hiddenSeries ?? []),\n getGenericValueSignal(HIGHLIGHTED_ITEM, highlightedItem),\n getGenericValueSignal(HIGHLIGHTED_GROUP),\n getGenericValueSignal(HIGHLIGHTED_SERIES, highlightedSeries),\n getGenericValueSignal(SELECTED_ITEM),\n getGenericValueSignal(SELECTED_SERIES),\n getGenericValueSignal(SELECTED_GROUP),\n ];\n};\n\nexport const getTwoDimensionalColorScheme = (colors: ChartColors, colorScheme: ColorScheme): string[][] => {\n if (isColors(colors)) {\n return getColors(colors, colorScheme).map((color) => [color]);\n }\n return colors.map((color) => getColors(color, colorScheme));\n};\n\nexport const getTwoDimensionalLineTypes = (lineTypes: LineTypes): number[][][] => {\n // 1D array of line types\n if (isLineTypeArray(lineTypes)) {\n return getStrokeDashesFromLineTypes(lineTypes).map((strokeDash) => [strokeDash]);\n }\n // 2D array of line types\n return lineTypes.map((lineTypeArray) => getStrokeDashesFromLineTypes(lineTypeArray));\n};\n\nexport const getTwoDimensionalOpacities = (opacities: Opacities | undefined): number[][] => {\n if (!opacities) return [[1]];\n // 1D array of line types\n if (isNumberArray(opacities)) {\n return opacities.map((opacity) => [opacity]);\n }\n // 2D array of line types\n return opacities;\n};\n\nconst getDefaultScales = (\n colors: ChartColors,\n colorScheme: ColorScheme,\n lineTypes: LineTypes,\n lineWidths: LineWidth[],\n opacities: Opacities | undefined,\n symbolShapes: SymbolShapes,\n symbolSizes: [SymbolSize, SymbolSize]\n): Scale[] => [\n getColorScale(colors, colorScheme),\n getLinearColorScale(colors, colorScheme),\n getLineTypeScale(lineTypes),\n getLineWidthScale(lineWidths),\n getOpacityScale(opacities),\n getSymbolShapeScale(symbolShapes),\n getSymbolSizeScale(symbolSizes),\n getSymbolPathWidthScale(symbolSizes),\n];\n\nexport const getColorScale = (colors: ChartColors, colorScheme: ColorScheme): OrdinalScale => {\n // if a two dimensional scale was provided, then just grab the first color in each scale and set that as the scale range\n const range = isColors(colors) ? getColors(colors, colorScheme) : colors.map((c) => getColors(c, colorScheme)[0]);\n return getOrdinalScale('color', range);\n};\n\nexport const getLinearColorScale = (colors: ChartColors, colorScheme: ColorScheme): LinearScale => {\n // if a two dimensional scale was provided, then just grab the first color in each scale and set that as the scale range\n const range = isColors(colors) ? getColors(colors, colorScheme) : colors.map((c) => getColors(c, colorScheme)[0]);\n return {\n name: LINEAR_COLOR_SCALE,\n type: 'linear',\n range,\n domain: { data: TABLE, fields: [] },\n };\n};\n\nexport const getLineTypeScale = (lineTypes: LineTypes): OrdinalScale => {\n // if a two dimensional scale was provided, then just grab the first color in each scale and set that as the scale range\n const range = isLineTypeArray(lineTypes)\n ? getStrokeDashesFromLineTypes(lineTypes)\n : lineTypes.map((lineTypesArray) => getStrokeDashFromLineType(lineTypesArray[0]));\n return getOrdinalScale(LINE_TYPE_SCALE, range);\n};\n\nexport const getSymbolShapeScale = (symbolShapes: SymbolShapes): OrdinalScale => {\n // if a two dimensional scale was provided, then just grab the first color in each scale and set that as the scale range\n const range = isSymbolShapeArray(symbolShapes)\n ? getPathsFromSymbolShapes(symbolShapes)\n : symbolShapes.map((symbolShape) => getPathFromSymbolShape(symbolShape[0]));\n return getOrdinalScale(SYMBOL_SHAPE_SCALE, range);\n};\n\n/**\n * returns the symbol size scale\n * @param symbolSizes\n * @returns LinearScale\n */\nexport const getSymbolSizeScale = (symbolSizes: [SymbolSize, SymbolSize]): LinearScale => ({\n name: SYMBOL_SIZE_SCALE,\n type: 'linear',\n zero: false,\n range: symbolSizes.map((symbolSize) => getVegaSymbolSizeFromRscSymbolSize(symbolSize)),\n domain: { data: TABLE, fields: [] },\n});\n\n/**\n * returns the path width scale\n * @param symbolSizes\n * @returns LinearScale\n */\nexport const getSymbolPathWidthScale = (symbolSizes: [SymbolSize, SymbolSize]): LinearScale => ({\n name: SYMBOL_PATH_WIDTH_SCALE,\n type: 'linear',\n zero: false,\n range: symbolSizes.map((symbolSize) => getSymbolWidthFromRscSymbolSize(symbolSize)),\n domain: { data: TABLE, fields: [] },\n});\n\nexport const getLineWidthScale = (lineWidths: LineWidth[]): OrdinalScale => {\n const range = lineWidths.map((lineWidth) => getLineWidthPixelsFromLineWidth(lineWidth));\n return getOrdinalScale(LINE_WIDTH_SCALE, range);\n};\n\nexport const getOpacityScale = (opacities?: Opacities): OrdinalScale | PointScale => {\n if (opacities?.length) {\n const range = isNumberArray(opacities) ? opacities : opacities.map((opacityArray) => opacityArray[0]);\n return getOrdinalScale(OPACITY_SCALE, range);\n }\n return {\n name: OPACITY_SCALE,\n type: 'point',\n range: [1, 0],\n padding: 1,\n align: 1,\n domain: { data: TABLE, fields: [] },\n };\n};\n\nfunction getColors(colors: Colors, colorScheme: ColorScheme): string[] {\n if (Array.isArray(colors)) {\n return colors.map((color: string) => getColorValue(color, colorScheme));\n }\n return colorSchemes[colors];\n}\n\nfunction getStrokeDashesFromLineTypes(lineTypes: LineType[]): number[][] {\n return lineTypes.map((lineType) => getStrokeDashFromLineType(lineType));\n}\n\nfunction getPathsFromSymbolShapes(symbolShapes: ChartSymbolShape[]) {\n return symbolShapes.map((symbolShape) => getPathFromSymbolShape(symbolShape));\n}\n\n/**\n * Adds a formula transform to the TABLE data that combines all the facets into a single key\n */\nexport const addData = produce<Data[], [{ facets: string[] }]>((data, { facets }) => {\n if (facets.length === 0) return;\n data[0]?.transform?.push(...getSeriesIdTransform(facets));\n\n // add a filter transform to the TABLE data that filters out any hidden series\n const index = data.findIndex((datum) => datum.name === FILTERED_TABLE);\n if (index !== -1) {\n data[index].transform = [\n { type: 'filter', expr: `indexof(hiddenSeries, datum.${SERIES_ID}) === -1` },\n ...(data[index].transform ?? []),\n ];\n }\n});\n\nexport const isColorScale = (colors: ChartColors): colors is ColorScale => {\n return Boolean(!Array.isArray(colors) && colors in colorSchemes);\n};\n\nexport const isColors = (colors: ChartColors): colors is Colors => {\n return isColorScale(colors) || colors.some((color) => !isColorScale(color) && typeof color === 'string');\n};\n\nexport const isLineTypeArray = (lineTypes: LineTypes): lineTypes is LineType[] => {\n return lineTypes.some((lineType) => typeof lineType === 'string' || isStrokeDashArray(lineType));\n};\n\nexport const isStrokeDashArray = (lineType: LineType | LineType[]): lineType is number[] => {\n return Array.isArray(lineType) && !lineType.some((value) => typeof value !== 'number');\n};\n\nexport const isNumberArray = (opacities: Opacities): opacities is number[] => {\n return !opacities.some((opacity) => Array.isArray(opacity));\n};\n\nexport const isSymbolShapeArray = (symbolShapes: SymbolShapes): symbolShapes is ChartSymbolShape[] => {\n return !symbolShapes.some((symbolShape) => Array.isArray(symbolShape));\n};\n\nconst safeClone = <T>(obj: T): T => {\n if (typeof structuredClone === 'function') {\n return structuredClone(obj);\n }\n return JSON.parse(JSON.stringify(obj));\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Data, FormulaTransform, NumericValueRef, Signal, SourceData } from 'vega';\n\nimport {\n DEFAULT_OPACITY_RULE,\n FILTERED_TABLE,\n HIGHLIGHTED_GROUP,\n HIGHLIGHTED_ITEM,\n HIGHLIGHT_CONTRAST_RATIO,\n INTERACTION_MODE,\n SERIES_ID,\n} from '@spectrum-charts/constants';\n\nimport { getFilteredTableData } from '../data/dataUtils';\nimport { getHoverMarkNames } from '../marks/markUtils';\nimport {\n AreaSpecOptions,\n BarSpecOptions,\n ChartTooltipOptions,\n ChartTooltipSpecOptions,\n DonutSpecOptions,\n LineSpecOptions,\n ScatterSpecOptions,\n} from '../types';\n\ntype TooltipParentOptions = AreaSpecOptions | BarSpecOptions | DonutSpecOptions | LineSpecOptions | ScatterSpecOptions;\n\n/**\n * gets all the tooltips\n * @param markOptions\n * @returns\n */\nexport const getTooltips = (markOptions: TooltipParentOptions): ChartTooltipSpecOptions[] => {\n return markOptions.chartTooltips.map((chartTooltip) => applyTooltipPropDefaults(chartTooltip, markOptions.name));\n};\n\n/**\n * Applies all defaults to ChartTooltipOptions\n * @param chartTooltipOptions\n * @returns ChartTooltipSpecOptions\n */\nexport const applyTooltipPropDefaults = (\n { highlightBy = 'item', ...options }: ChartTooltipOptions,\n markName: string\n): ChartTooltipSpecOptions => {\n return {\n highlightBy,\n markName,\n ...options,\n };\n};\n\n/**\n * Sets all the data needed for tooltips\n *\n * NOTE: this function mutates the data object so it should only be called from a produce function\n * @param data\n * @param chartTooltipOptions\n */\nexport const addTooltipData = (data: Data[], markOptions: TooltipParentOptions, addHighlightedData = true) => {\n const tooltips = getTooltips(markOptions);\n for (const { highlightBy, markName } of tooltips) {\n if (highlightBy === 'item') return;\n const filteredTable = getFilteredTableData(data);\n if (!filteredTable.transform) {\n filteredTable.transform = [];\n }\n if (highlightBy === 'dimension' && markOptions.markType !== 'donut') {\n filteredTable.transform.push(getGroupIdTransform([markOptions.dimension], markName));\n } else if (highlightBy === 'series') {\n filteredTable.transform.push(getGroupIdTransform([SERIES_ID], markName));\n } else if (Array.isArray(highlightBy)) {\n filteredTable.transform.push(getGroupIdTransform(highlightBy, markName));\n }\n\n if (addHighlightedData) {\n data.push(getMarkHighlightedData(markName));\n }\n }\n};\n\n/**\n * Gets the group id transform\n * @param highlightBy\n * @param markName\n * @returns FormulaTransform\n */\nexport const getGroupIdTransform = (highlightBy: string[], markName: string): FormulaTransform => {\n return {\n type: 'formula',\n as: `${markName}_highlightGroupId`,\n expr: highlightBy.map((facet) => `datum.${facet}`).join(' + \" | \" + '),\n };\n};\n\n/**\n * Gets the highlighted data for a mark\n * @param markName\n * @returns\n */\nconst getMarkHighlightedData = (markName: string): SourceData => ({\n name: `${markName}_highlightedData`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'filter',\n expr: `${HIGHLIGHTED_GROUP} === datum.${markName}_highlightGroupId`,\n },\n ],\n});\n\nexport const isHighlightedByGroup = (markOptions: TooltipParentOptions) => {\n const tooltips = getTooltips(markOptions);\n return tooltips.some(({ highlightBy }) => highlightBy && highlightBy !== 'item');\n};\n\n/**\n * Tooltip highlights by item or dimension\n * @param markOptions\n * @returns\n */\nexport const isHighlightedByDimension = (markOptions: TooltipParentOptions) => {\n const tooltips = getTooltips(markOptions);\n return tooltips.some(\n ({ highlightBy }) => typeof highlightBy === 'string' && ['dimension', 'item'].includes(highlightBy)\n );\n};\n\n/**\n * adds the appropriate signals for tooltips\n *\n * NOTE: this function mutates the signals array so it should only be called from a produce function\n * @param signals\n * @param markOptions\n */\nexport const addTooltipSignals = (signals: Signal[], markOptions: TooltipParentOptions) => {\n if (isHighlightedByGroup(markOptions)) {\n const highlightedGroupSignal = signals.find((signal) => signal.name === HIGHLIGHTED_GROUP) as Signal;\n\n let markName = markOptions.name;\n let update = `datum.${markName}_highlightGroupId`;\n\n if ('interactionMode' in markOptions && markOptions.interactionMode === INTERACTION_MODE.ITEM) {\n getHoverMarkNames(markName).forEach((name) => {\n addMouseEvents(highlightedGroupSignal, name, update);\n });\n }\n\n if (['scatter', 'line'].includes(markOptions.markType)) {\n update = `datum.${update}`;\n markName += '_voronoi';\n }\n\n addMouseEvents(highlightedGroupSignal, markName, update);\n }\n};\n\nconst addMouseEvents = (highlightedGroupSignal: Signal, markName: string, update: string) => {\n if (highlightedGroupSignal.on === undefined) {\n highlightedGroupSignal.on = [];\n }\n highlightedGroupSignal.on.push(\n ...[\n {\n events: `@${markName}:mouseover`,\n update,\n },\n { events: `@${markName}:mouseout`, update: 'null' },\n ]\n );\n};\n\n/**\n * Adds the appropriate opacity rules to the beginning of the opacityRules array\n *\n * NOTE: this function mutates the opacityRules array so it should only be called from a produce function\n * @param opacityRules\n * @param markOptions\n */\nexport const addHighlightMarkOpacityRules = (\n opacityRules: ({ test?: string } & NumericValueRef)[],\n markOptions: TooltipParentOptions\n) => {\n opacityRules.unshift(\n {\n test: `isArray(${HIGHLIGHTED_ITEM}) && length(${HIGHLIGHTED_ITEM}) > 0 && indexof(${HIGHLIGHTED_ITEM}, datum.${markOptions.idKey}) === -1`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n },\n {\n test: `!isArray(${HIGHLIGHTED_ITEM}) && isValid(${HIGHLIGHTED_ITEM}) && ${HIGHLIGHTED_ITEM} !== datum.${markOptions.idKey}`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n }\n );\n if (isHighlightedByGroup(markOptions)) {\n const { name: markName } = markOptions;\n opacityRules.unshift({\n test: `${HIGHLIGHTED_GROUP} === datum.${markName}_highlightGroupId`,\n ...DEFAULT_OPACITY_RULE,\n });\n }\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\n\nimport { DEFAULT_COLOR_SCHEME, DEFAULT_TIME_DIMENSION } from '@spectrum-charts/constants';\nimport { combineNames, toCamelCase } from '@spectrum-charts/utils';\n\nimport { addBar } from '../bar/barSpecBuilder';\nimport { addLine } from '../line/lineSpecBuilder';\nimport { BarOptions, ColorScheme, ComboOptions, HighlightedItem, LineOptions, ScSpec } from '../types';\n\nexport const addCombo = produce<\n ScSpec,\n [ComboOptions & { colorScheme?: ColorScheme; highlightedItem?: HighlightedItem; index?: number; idKey: string }]\n>(\n (\n spec,\n {\n colorScheme = DEFAULT_COLOR_SCHEME,\n highlightedItem,\n idKey,\n index = 0,\n name,\n marks = [],\n dimension = DEFAULT_TIME_DIMENSION,\n }\n ) => {\n let { barCount, lineCount } = initializeComponentCounts();\n const comboName = toCamelCase(name || `combo${index}`);\n\n spec = [...marks].reduce((acc: ScSpec, mark) => {\n switch (mark.markType) {\n case 'bar':\n barCount++;\n return addBar(acc, {\n ...mark,\n colorScheme,\n highlightedItem,\n idKey,\n index: barCount,\n name: getComboMarkName(mark, comboName, barCount),\n dimension: getDimension(mark, dimension),\n });\n case 'line':\n default:\n lineCount++;\n return addLine(acc, {\n ...mark,\n colorScheme,\n highlightedItem,\n idKey,\n index: lineCount,\n name: getComboMarkName(mark, comboName, lineCount),\n dimension: getDimension(mark, dimension),\n });\n }\n }, spec);\n\n return spec;\n }\n);\n\nconst initializeComponentCounts = () => {\n return { barCount: -1, lineCount: -1 };\n};\n\nexport const getComboMarkName = (mark: BarOptions | LineOptions, comboName: string, index: number) => {\n if (mark.name) {\n return mark.name;\n }\n const displayName = getDisplayName(mark.markType);\n return combineNames(comboName, `${displayName}${index}`);\n};\n\nconst getDisplayName = (markType: string): string => {\n if (!markType) return '';\n return markType.charAt(0).toUpperCase() + markType.slice(1);\n};\n\nconst getDimension = (mark: BarOptions | LineOptions, dimension?: string) => mark.dimension ?? dimension;\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Compare, Data, FormulaTransform, SourceData, Transforms, ValuesData } from 'vega';\n\nimport {\n DEFAULT_TIME_DIMENSION,\n DEFAULT_TRANSFORMED_TIME_DIMENSION,\n FILTERED_TABLE,\n SERIES_ID,\n TABLE,\n} from '@spectrum-charts/constants';\n\nimport { ChartTooltipOptions } from '../types';\n\nexport const addTimeTransform = produce<Transforms[], [string]>((transforms, dimension) => {\n if (transforms.findIndex((transform) => transform.type === 'timeunit') === -1) {\n transforms.push({\n type: 'formula',\n expr: `toDate(datum[\"${dimension}\"])`,\n as: dimension,\n });\n transforms.push({\n type: 'timeunit',\n field: dimension,\n units: ['year', 'month', 'date', 'hours', 'minutes', 'seconds'],\n as: [DEFAULT_TRANSFORMED_TIME_DIMENSION, `${DEFAULT_TIME_DIMENSION}1`],\n });\n }\n});\n\nexport const getTransformSort = (order?: string): Compare | undefined => {\n if (order) {\n return { field: order };\n }\n};\n\n/**\n * gets the table data from the data array\n * @param data\n * @returns\n */\nexport const getTableData = (data: Data[]): ValuesData => {\n // ok to cast this here because we know that the data array will always have table data of type ValuesData\n return data.find((d) => d.name === TABLE) as ValuesData;\n};\n/**\n * gets the filtered table data from the data array\n * @param data\n * @returns\n */\nexport const getFilteredTableData = (data: Data[]): SourceData => {\n // ok to cast this here because we know that the data array will always have table data of type SourceData\n return data.find((d) => d.name === FILTERED_TABLE) as SourceData;\n};\n\nexport const getSeriesIdTransform = (facets: string[]): FormulaTransform[] => {\n if (facets.length === 0) return [];\n const expr = facets.map((facet) => `datum.${facet}`).join(' + \" | \" + ');\n return [\n {\n type: 'formula',\n as: SERIES_ID,\n expr,\n },\n ];\n};\n\n/**\n * @param children\n * @returns spec data that filters out items where the `excludeDataKey` is true\n */\nexport const getFilteredTooltipData = (chartTooltips: ChartTooltipOptions[]) => {\n const excludeDataKeys = chartTooltips[0]?.excludeDataKeys;\n const transform: { type: 'filter'; expr: string }[] | undefined = excludeDataKeys?.map((excludeDataKey) => ({\n type: 'filter',\n expr: `!datum.${excludeDataKey}`,\n }));\n\n return {\n name: `${FILTERED_TABLE}ForTooltip`,\n source: FILTERED_TABLE,\n transform,\n };\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Data, FormulaTransform, Mark, PieTransform, Scale, Signal } from 'vega';\n\nimport {\n COLOR_SCALE,\n DEFAULT_COLOR,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_METRIC,\n FILTERED_TABLE,\n} from '@spectrum-charts/constants';\nimport { toCamelCase } from '@spectrum-charts/utils';\n\nimport { isInteractive } from '../marks/markUtils';\nimport { addFieldToFacetScaleDomain } from '../scale/scaleSpecBuilder';\nimport { addHighlightedItemSignalEvents } from '../signal/signalSpecBuilder';\nimport { ColorScheme, DonutOptions, DonutSpecOptions, HighlightedItem, ScSpec } from '../types';\nimport {\n getDonutSummaryData,\n getDonutSummaryMarks,\n getDonutSummaryScales,\n getDonutSummarySignals,\n} from './donutSummaryUtils';\nimport { getArcMark } from './donutUtils';\nimport { getSegmentLabelMarks } from './segmentLabelUtils';\n\nexport const addDonut = produce<\n ScSpec,\n [DonutOptions & { colorScheme?: ColorScheme; highlightedItem?: HighlightedItem; index?: number; idKey: string }]\n>(\n (\n spec,\n {\n chartPopovers = [],\n chartTooltips = [],\n color = DEFAULT_COLOR,\n colorScheme = DEFAULT_COLOR_SCHEME,\n donutSummaries = [],\n index = 0,\n metric = DEFAULT_METRIC,\n name,\n startAngle = 0,\n holeRatio = 0.85,\n isBoolean = false,\n segmentLabels = [],\n ...options\n }\n ) => {\n // put options back together now that all defaults are set\n const donutOptions: DonutSpecOptions = {\n chartPopovers,\n chartTooltips,\n color,\n colorScheme,\n donutSummaries,\n holeRatio,\n index,\n isBoolean,\n metric,\n name: toCamelCase(name ?? `donut${index}`),\n segmentLabels,\n startAngle,\n ...options,\n };\n\n spec.data = addData(spec.data ?? [], donutOptions);\n spec.scales = addScales(spec.scales ?? [], donutOptions);\n spec.marks = addMarks(spec.marks ?? [], donutOptions);\n spec.signals = addSignals(spec.signals ?? [], donutOptions);\n }\n);\n\nexport const addData = produce<Data[], [DonutSpecOptions]>((data, options) => {\n const { name, isBoolean } = options;\n const filteredTableIndex = data.findIndex((d) => d.name === FILTERED_TABLE);\n\n //set up transform\n data[filteredTableIndex].transform = data[filteredTableIndex].transform ?? [];\n data[filteredTableIndex].transform?.push(...getPieTransforms(options));\n\n if (isBoolean) {\n //select first data point for our boolean value\n data.push({\n name: `${name}_booleanData`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'window',\n ops: ['row_number'],\n as: [`${name}_rscRowIndex`],\n },\n {\n type: 'filter',\n expr: `datum.${name}_rscRowIndex === 1`, // Keep only the first row\n },\n ],\n });\n }\n data.push(...getDonutSummaryData(options));\n});\n\nconst getPieTransforms = ({ startAngle, metric, name }: DonutSpecOptions): (FormulaTransform | PieTransform)[] => [\n {\n type: 'pie',\n field: metric,\n startAngle,\n endAngle: { signal: `${startAngle} + 2 * PI` },\n as: [`${name}_startAngle`, `${name}_endAngle`],\n },\n {\n type: 'formula',\n as: `${name}_arcTheta`,\n expr: `(datum['${name}_startAngle'] + datum['${name}_endAngle']) / 2`,\n },\n {\n type: 'formula',\n as: `${name}_arcLength`,\n expr: `datum['${name}_endAngle'] - datum['${name}_startAngle']`,\n },\n {\n type: 'formula',\n as: `${name}_arcPercent`,\n expr: `datum['${name}_arcLength'] / (2 * PI)`,\n },\n];\n\nexport const addScales = produce<Scale[], [DonutSpecOptions]>((scales, options) => {\n const { color } = options;\n addFieldToFacetScaleDomain(scales, COLOR_SCALE, color);\n scales.push(...getDonutSummaryScales(options));\n});\n\nexport const addMarks = produce<Mark[], [DonutSpecOptions]>((marks, options) => {\n marks.push(getArcMark(options));\n marks.push(...getDonutSummaryMarks(options));\n marks.push(...getSegmentLabelMarks(options));\n});\n\nexport const addSignals = produce<Signal[], [DonutSpecOptions]>((signals, options) => {\n const { chartTooltips, idKey, name } = options;\n signals.push(...getDonutSummarySignals(options));\n if (!isInteractive(options)) return;\n addHighlightedItemSignalEvents(signals, name, idKey, 1, chartTooltips[0]?.excludeDataKeys);\n});\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {\n EncodeEntryName,\n GroupMark,\n Mark,\n NumericValueRef,\n ProductionRule,\n Signal,\n SourceData,\n TextBaselineValueRef,\n TextEncodeEntry,\n TextValueRef,\n ThresholdScale,\n} from 'vega';\n\nimport {\n DONUT_RADIUS,\n DONUT_SUMMARY_FONT_SIZE_RATIO,\n DONUT_SUMMARY_MIN_RADIUS,\n FILTERED_TABLE,\n} from '@spectrum-charts/constants';\n\nimport { getTextNumberFormat } from '../textUtils';\nimport { DonutSpecOptions, DonutSummaryOptions, DonutSummarySpecOptions } from '../types';\n\n/**\n * Gets the DonutSummary component from the children if one exists\n * @param donutOptions\n * @returns\n */\nconst getDonutSummary = (options: DonutSpecOptions): DonutSummarySpecOptions | undefined => {\n if (!options.donutSummaries.length) {\n return;\n }\n return applyDonutSummaryPropDefaults(options.donutSummaries[0], options);\n};\n\n/**\n * Applies all default options, converting DonutSummaryOptions into DonutSummarySpecOptions\n * @param donutSummaryOptions\n * @param donutOptions\n * @returns\n */\nconst applyDonutSummaryPropDefaults = (\n { numberFormat = 'shortNumber', ...options }: DonutSummaryOptions,\n donutOptions: DonutSpecOptions\n): DonutSummarySpecOptions => ({\n donutOptions,\n numberFormat,\n ...options,\n});\n\n/**\n * Gets the data for the donut summary\n * @param donutOptions\n * @returns SourceData[]\n */\nexport const getDonutSummaryData = (donutOptions: DonutSpecOptions): SourceData[] => {\n const donutSummary = getDonutSummary(donutOptions);\n if (!donutSummary || donutOptions.isBoolean) {\n return [];\n }\n return [\n {\n name: `${donutOptions.name}_summaryData`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'aggregate',\n fields: [donutOptions.metric],\n ops: ['sum'],\n as: ['sum'],\n },\n ],\n },\n ];\n};\n\n/**\n * Gets the required scales for the donut summary\n * @param donutOptions\n * @returns ThresholdScale[]\n */\nexport const getDonutSummaryScales = (donutOptions: DonutSpecOptions): ThresholdScale[] => {\n const donutSummary = getDonutSummary(donutOptions);\n if (!donutSummary) {\n return [];\n }\n return [\n // This scale will snap the fontsize to the spectrum font sizes L - XXXXL\n // 28 is the min, 60 is the max.\n {\n name: `${donutOptions.name}_summaryFontSizeScale`,\n type: 'threshold',\n domain: [32, 36, 40, 45, 50, 60],\n range: [28, 32, 36, 40, 45, 50, 60],\n },\n ];\n};\n\n/**\n * Gets the signals for the donut summary\n * @param donutOptions\n * @returns Signal[]\n */\nexport const getDonutSummarySignals = (donutOptions: DonutSpecOptions): Signal[] => {\n const donutSummary = getDonutSummary(donutOptions);\n if (!donutSummary) {\n return [];\n }\n const { name: donutName, holeRatio } = donutOptions;\n return [\n {\n name: `${donutName}_summaryFontSize`,\n update: `scale('${donutName}_summaryFontSizeScale', ${DONUT_RADIUS} * ${holeRatio} * ${DONUT_SUMMARY_FONT_SIZE_RATIO})`,\n },\n ];\n};\n\n/**\n * Gets all the marks for the donut summary\n * @param donutOptions\n * @returns GroupMark[]\n */\nexport const getDonutSummaryMarks = (options: DonutSpecOptions): GroupMark[] => {\n const donutSummary = getDonutSummary(options);\n if (!donutSummary) {\n return [];\n }\n const marks: GroupMark[] = [];\n if (options.isBoolean) {\n marks.push(getBooleanDonutSummaryGroupMark(donutSummary));\n } else {\n marks.push(getDonutSummaryGroupMark(donutSummary));\n }\n return marks;\n};\n\n/**\n * Gets the group mark for the donut summary\n * @param donutSummaryOptions\n * @returns GorupMark\n */\nexport const getDonutSummaryGroupMark = (options: DonutSummarySpecOptions): GroupMark => {\n const { donutOptions, label } = options;\n const groupMark: Mark = {\n type: 'group',\n name: `${donutOptions.name}_summaryGroup`,\n marks: [\n {\n type: 'text',\n name: `${donutOptions.name}_summaryValue`,\n from: { data: `${donutOptions.name}_summaryData` },\n encode: getSummaryValueEncode(options),\n },\n ],\n };\n if (label) {\n groupMark.marks?.push({\n type: 'text',\n name: `${donutOptions.name}_summaryLabel`,\n from: { data: `${donutOptions.name}_summaryData` },\n encode: getSummaryLabelEncode({ ...options, label }),\n });\n }\n return groupMark;\n};\n\n/**\n * Gets the group mark for a boolean donut summary\n * @param donutSummaryOptions\n * @returns GroupMark\n */\nexport const getBooleanDonutSummaryGroupMark = (options: DonutSummarySpecOptions): GroupMark => {\n const { donutOptions, label } = options;\n const groupMark: Mark = {\n type: 'group',\n name: `${donutOptions.name}_percentText`,\n marks: [\n {\n type: 'text',\n name: `${donutOptions.name}_booleanSummaryValue`,\n from: { data: `${donutOptions.name}_booleanData` },\n encode: getSummaryValueEncode(options),\n },\n ],\n };\n if (label) {\n groupMark.marks?.push({\n type: 'text',\n name: `${donutOptions.name}_booleanSummaryLabel`,\n from: { data: `${donutOptions.name}_booleanData` },\n encode: getSummaryLabelEncode({ ...options, label }),\n });\n }\n return groupMark;\n};\n\n/**\n * Gets the encode for the summary value\n * @param donutSummaryOptions\n * @returns encode\n */\nconst getSummaryValueEncode = (options: DonutSummarySpecOptions): Partial<Record<EncodeEntryName, TextEncodeEntry>> => {\n const { donutOptions, label } = options;\n return {\n update: {\n x: { signal: 'width / 2' },\n y: { signal: 'height / 2' },\n text: getSummaryValueText(options),\n fontSize: [\n { test: `${DONUT_RADIUS} * ${donutOptions.holeRatio} < ${DONUT_SUMMARY_MIN_RADIUS}`, value: 0 },\n { signal: `${donutOptions.name}_summaryFontSize` },\n ],\n align: { value: 'center' },\n baseline: getSummaryValueBaseline(label),\n limit: getSummaryValueLimit(options),\n },\n };\n};\n\n/**\n * Gets the text value for the summary value\n * @param donutSummaryOptions\n * @returns TextValueref\n */\nexport const getSummaryValueText = ({\n donutOptions,\n numberFormat,\n}: DonutSummarySpecOptions): ProductionRule<TextValueRef> => {\n if (donutOptions.isBoolean) {\n return { signal: `format(datum['${donutOptions.metric}'], '.0%')` };\n }\n return [...getTextNumberFormat(numberFormat, 'sum'), { field: 'sum' }];\n};\n\n/**\n * Gets the baseline for the summary value\n * @param label\n * @returns TextBaselineValueRef\n */\nexport const getSummaryValueBaseline = (label?: string): TextBaselineValueRef => {\n if (label) {\n return { value: 'alphabetic' };\n }\n // If there isn't a label, the text should be vertically centered\n return { value: 'middle' };\n};\n\n/**\n * Gets the limit for the summary value\n * @param donutSummaryOptions\n * @returns NumericValueRef\n */\nexport const getSummaryValueLimit = ({ donutOptions, label }: DonutSummarySpecOptions): NumericValueRef => {\n const { holeRatio, name } = donutOptions;\n // if there isn't a label, the height of the font from the center of the donut is 1/2 the font size\n const fontHeight = label ? `${name}_summaryFontSize` : `${name}_summaryFontSize * 0.5`;\n const donutInnerRadius = `${DONUT_RADIUS} * ${holeRatio}`;\n\n return {\n // This is the max length of the text that can be displayed in the donut summary\n // If the text is longer than this, it will be truncated\n // It is calculated using the Pythagorean theorem\n signal: `2 * sqrt(pow(${donutInnerRadius}, 2) - pow(${fontHeight}, 2))`,\n };\n};\n\n/**\n * Gets the encode for the metric label\n * @param donutSummaryOptions\n * @returns encode\n */\nexport const getSummaryLabelEncode = ({\n donutOptions,\n label,\n}: DonutSummarySpecOptions & { label: string }): Partial<Record<EncodeEntryName, TextEncodeEntry>> => {\n return {\n update: {\n x: { signal: 'width / 2' },\n y: { signal: 'height / 2' },\n dy: { signal: `ceil(${donutOptions.name}_summaryFontSize * 0.25)` },\n text: { value: label },\n fontSize: [\n { test: `${DONUT_RADIUS} * ${donutOptions.holeRatio} < ${DONUT_SUMMARY_MIN_RADIUS}`, value: 0 },\n { signal: `ceil(${donutOptions.name}_summaryFontSize * 0.5)` },\n ],\n align: { value: 'center' },\n baseline: { value: 'top' },\n limit: {\n signal: `2 * sqrt(pow(${DONUT_RADIUS} * ${donutOptions.holeRatio}, 2) - pow(${donutOptions.name}_summaryFontSize * 0.75, 2))`,\n },\n },\n };\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { ArcMark } from 'vega';\n\nimport { DONUT_RADIUS, FILTERED_TABLE, SELECTED_ITEM } from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { getColorProductionRule, getCursor, getMarkOpacity, getTooltip } from '../marks/markUtils';\nimport { DonutSpecOptions } from '../types';\n\nexport const getArcMark = (options: DonutSpecOptions): ArcMark => {\n const { chartPopovers, chartTooltips, color, colorScheme, holeRatio, idKey, name } = options;\n return {\n type: 'arc',\n name,\n description: name,\n from: { data: FILTERED_TABLE },\n encode: {\n enter: {\n fill: getColorProductionRule(color, colorScheme),\n x: { signal: 'width / 2' },\n y: { signal: 'height / 2' },\n tooltip: getTooltip(chartTooltips, name),\n stroke: { value: getColorValue('static-blue', colorScheme) },\n },\n update: {\n startAngle: { field: `${name}_startAngle` },\n endAngle: { field: `${name}_endAngle` },\n padAngle: { value: 0.01 },\n innerRadius: { signal: `${holeRatio} * ${DONUT_RADIUS}` },\n outerRadius: { signal: DONUT_RADIUS },\n opacity: getMarkOpacity(options),\n cursor: getCursor(chartPopovers),\n strokeWidth: [{ test: `${SELECTED_ITEM} === datum.${idKey}`, value: 2 }, { value: 0 }],\n },\n },\n };\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { GroupMark, NumericValueRef, ProductionRule, TextEncodeEntry, TextMark, TextValueRef } from 'vega';\n\nimport { DONUT_RADIUS, DONUT_SEGMENT_LABEL_MIN_ANGLE, FILTERED_TABLE } from '@spectrum-charts/constants';\n\nimport { getTextNumberFormat } from '../textUtils';\nimport { DonutSpecOptions, SegmentLabelOptions, SegmentLabelSpecOptions } from '../types';\n\n/**\n * Gets the SegmentLabel component from the children if one exists\n * @param donutOptions\n * @returns segmentLabelOptions\n */\nconst getSegmentLabel = (options: DonutSpecOptions): SegmentLabelSpecOptions | undefined => {\n if (!options.segmentLabels.length) {\n return;\n }\n return applySegmentLabelPropDefaults(options.segmentLabels[0], options);\n};\n\n/**\n * Applies all default options, converting SegmentLabelOptions into SegmentLabelSpecOptions\n * @param segmentLabelOptions\n * @param donutOptions\n * @returns SegmentLabelSpecOptions\n */\nconst applySegmentLabelPropDefaults = (\n { percent = false, value = false, valueFormat = 'standardNumber', ...options }: SegmentLabelOptions,\n donutOptions: DonutSpecOptions\n): SegmentLabelSpecOptions => ({\n donutOptions,\n percent,\n value,\n valueFormat,\n ...options,\n});\n\n/**\n * Gets the marks for the segment label. If there isn't a segment label, an empty array is returned.\n * @param donutOptions\n * @returns GroupMark[]\n */\nexport const getSegmentLabelMarks = (donutOptions: DonutSpecOptions): GroupMark[] => {\n const { isBoolean, name } = donutOptions;\n // segment labels are not supported for boolean variants\n if (isBoolean) return [];\n\n const segmentLabel = getSegmentLabel(donutOptions);\n // if there isn't a segment label, we don't need to do anything\n if (!segmentLabel) return [];\n\n return [\n {\n name: `${name}_segmentLabelGroup`,\n type: 'group',\n marks: [getSegmentLabelTextMark(segmentLabel), ...getSegmentLabelValueTextMark(segmentLabel)],\n },\n ];\n};\n\n/**\n * Gets the text mark for the segment label\n * @param segmentLabelOptions\n * @returns TextMark\n */\nexport const getSegmentLabelTextMark = ({\n labelKey,\n value,\n percent,\n donutOptions,\n}: SegmentLabelSpecOptions): TextMark => {\n const { name, color } = donutOptions;\n return {\n type: 'text',\n name: `${name}_segmentLabel`,\n from: { data: FILTERED_TABLE },\n encode: {\n enter: {\n ...getBaseSegmentLabelEnterEncode(name),\n text: { field: labelKey ?? color },\n fontWeight: { value: 'bold' },\n dy:\n value || percent\n ? {\n signal: `datum['${name}_arcTheta'] <= 0.5 * PI || datum['${name}_arcTheta'] >= 1.5 * PI ? -16 : 0`,\n }\n : undefined,\n },\n update: positionEncodings,\n },\n };\n};\n\n/**\n * Gets the text mark for the segment label values (percent and/or value)\n * @param segmentLabelOptions\n * @returns TextMark[]\n */\nexport const getSegmentLabelValueTextMark = (options: SegmentLabelSpecOptions): TextMark[] => {\n if (!options.value && !options.percent) return [];\n const { donutOptions } = options;\n\n return [\n {\n type: 'text',\n name: `${donutOptions.name}_segmentLabelValue`,\n from: { data: FILTERED_TABLE },\n encode: {\n enter: {\n ...getBaseSegmentLabelEnterEncode(donutOptions.name),\n text: getSegmentLabelValueText(options),\n dy: {\n signal: `datum['${donutOptions.name}_arcTheta'] <= 0.5 * PI || datum['${donutOptions.name}_arcTheta'] >= 1.5 * PI ? 0 : 16`,\n },\n },\n update: positionEncodings,\n },\n },\n ];\n};\n\n/**\n * Gets all the standard entry encodes for segment label text marks\n * @param name\n * @returns TextEncodeEntry\n */\nconst getBaseSegmentLabelEnterEncode = (name: string): TextEncodeEntry => ({\n radius: { signal: `${DONUT_RADIUS} + 6` },\n theta: { field: `${name}_arcTheta` },\n fontSize: getSegmentLabelFontSize(name),\n align: {\n signal: `datum['${name}_arcTheta'] <= PI ? 'left' : 'right'`,\n },\n baseline: {\n // if the center of the arc is in the top half of the donut, the text baseline should be bottom, else top\n signal: `datum['${name}_arcTheta'] <= 0.5 * PI || datum['${name}_arcTheta'] >= 1.5 * PI ? 'bottom' : 'top'`,\n },\n});\n/**\n * position encodings\n */\nconst positionEncodings: TextEncodeEntry = {\n x: { signal: 'width / 2' },\n y: { signal: 'height / 2' },\n};\n\n/**\n * Gets the text value ref for the segment label values (percent and/or value)\n * @param segmentLabelOptions\n * @returns TextValueRef\n */\nexport const getSegmentLabelValueText = ({\n donutOptions,\n percent,\n value,\n valueFormat,\n}: SegmentLabelSpecOptions): ProductionRule<TextValueRef> | undefined => {\n const percentSignal = `format(datum['${donutOptions.name}_arcPercent'], '.0%')`;\n if (value) {\n // to support `shortNumber` and `shortCurrency` we need to use the consistent logic\n const rules = getTextNumberFormat(valueFormat, donutOptions.metric) as { test?: string; signal: string }[];\n if (percent) {\n // rules will be an array so we need to add the percent to each signal\n return rules.map((rule) => ({\n ...rule,\n signal: `${percentSignal} + \"\\\\u00a0\\\\u00a0\" + ${rule.signal}`,\n }));\n }\n return rules;\n }\n\n if (percent) {\n return { signal: percentSignal };\n }\n};\n\n/**\n * Gets the font size for the segment label based on the arc length\n * If the arc length is less than 0.3 radians, the font size is 0\n * @param name\n * @returns NumericValueRef\n */\nconst getSegmentLabelFontSize = (name: string): ProductionRule<NumericValueRef> => {\n // need to use radians for this. 0.3 radians is about 17 degrees\n // if we used arc length, then showing a label could shrink the overall donut size which could make the arc to small\n // that would hide the label which would make the arc bigger which would show the label and so on\n return [{ test: `datum['${name}_arcLength'] < ${DONUT_SEGMENT_LABEL_MIN_ANGLE}`, value: 0 }, { value: 14 }];\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { FormatLocaleDefinition, formatLocale } from 'd3-format';\nimport { FontWeight, Locale, NumberLocale, TimeLocale } from 'vega';\n\nimport { LocaleCode, NumberLocaleCode, TimeLocaleCode, getLocale, numberLocales } from '@spectrum-charts/locales';\nimport { ADOBE_CLEAN_FONT } from '@spectrum-charts/themes';\n\nimport { NumberFormat } from '../types';\n\nexport interface LabelDatum {\n index: number;\n label: string;\n value: string | number;\n}\n\nexport const getExpressionFunctions = (\n locale:\n | Locale\n | LocaleCode\n | { number?: NumberLocaleCode | NumberLocale; time?: TimeLocaleCode | TimeLocale } = 'en-US'\n) => {\n const { number: numberLocale } = getLocale(locale);\n const localeCode = typeof locale === 'string' ? locale : locale?.number;\n return {\n formatTimeDurationLabels: formatTimeDurationLabels(numberLocale),\n formatLocaleCurrency: formatLocaleCurrency(numberLocale),\n formatShortNumber: formatShortNumber(localeCode),\n consoleLog,\n formatHorizontalTimeAxisLabels: formatHorizontalTimeAxisLabels(),\n formatVerticalAxisTimeLabels: formatVerticalAxisTimeLabels(),\n getLabelWidth,\n truncateText,\n };\n};\n\n/**\n * Formats a number using the compact notation.\n * @param numberLocale\n * @returns formatted string\n */\nexport const formatShortNumber = (numberLocale?: string | FormatLocaleDefinition) => {\n const locale = typeof numberLocale === 'string' ? numberLocale : navigator.language;\n const customDecimalSymbol = typeof numberLocale === 'object' ? numberLocale.decimal : undefined;\n return (value: number) => {\n // get the decimal symbol for the locale by formatting a number with decimals\n const decimalSymbol = new Intl.NumberFormat(locale, { minimumFractionDigits: 1, maximumFractionDigits: 1 })\n .format(1.1)\n .replace(/\\d/g, '');\n\n const shortNumber = Intl.NumberFormat(locale, { notation: 'compact' }).format(value);\n if (customDecimalSymbol) {\n return shortNumber.replace(decimalSymbol, customDecimalSymbol);\n }\n return shortNumber;\n };\n};\n\n/**\n * Formats currency values using a currency specific locale and currency code for the position and\n * type of currency symbol.\n * Applies thousands and decimal separators based on the numberFormat.\n * @returns string\n */\nexport const formatLocaleCurrency = (numberLocale: FormatLocaleDefinition = numberLocales['en-US']) => {\n return ({ value }: LabelDatum, currencyLocale: string, currencyCode: string, numberFormat: NumberFormat) => {\n if (typeof value === 'string') return value;\n\n try {\n const formatOptions: Intl.NumberFormatOptions = {\n style: 'currency',\n currency: currencyCode,\n maximumFractionDigits: 0,\n };\n // Get currency template with positioning and symbol based on currencyLocale and currencyCode.\n const currencyTemplate = new Intl.NumberFormat(currencyLocale, formatOptions).format(0);\n\n let precision = 2;\n // Parse the precision if numberFormat is a format string.\n if (numberFormat !== 'currency') {\n precision = parseInt(numberFormat.split('.')[1].replace('f', ''));\n }\n\n // Format the value using the chart locale and the precision, then swap it into the currency template.\n const d3Formatter = formatLocale(numberLocale);\n return currencyTemplate.replace('0', d3Formatter.format(`,.${precision}f`)(value));\n } catch (error) {\n console.error('Error formatting currency: ', error);\n // Fallback to chart locale formatting.\n return formatLocale(numberLocale).format('$,.2f')(value);\n }\n };\n};\n\n/**\n * Hides labels that are the same as the previous label\n * @returns string\n */\nexport const formatHorizontalTimeAxisLabels = () => {\n let prevLabel: string;\n return (datum: LabelDatum) => {\n const showLabel = datum.index === 0 || prevLabel !== datum.label;\n prevLabel = datum.label;\n return showLabel ? datum.label : '';\n };\n};\n\n/**\n * Hides the larger granularity instead of repeating it for each tick\n * @returns string\n */\nexport const formatVerticalAxisTimeLabels = () => {\n let prevLabel: string;\n return (datum: LabelDatum) => {\n const labels = datum.label.split('\\u2000');\n const label = labels[0];\n\n const showLabel = datum.index === 0 || prevLabel !== label;\n prevLabel = label;\n return showLabel ? datum.label : labels[1];\n };\n};\n\n/**\n * Formats a duration in seconds as HH:MM:SS.\n * Function is initialized with a number locale. This ensures that the thousands separator is correct for the locale\n * @param numberLocale\n * @returns formatted sting (HH:MM:SS)\n */\nexport const formatTimeDurationLabels = (numberLocale: FormatLocaleDefinition = numberLocales['en-US']) => {\n const d3 = formatLocale(numberLocale);\n // 0 padded, minimum 2 digits, thousands separator, integer format\n const zeroPaddedFormat = d3.format('02,d');\n // Thousands separator, integer format\n const format = d3.format(',d');\n return ({ value }: LabelDatum) => {\n if (typeof value === 'string') return value;\n\n const sign = value < 0 ? '-' : '';\n const absoluteValue = Math.abs(value);\n const seconds = zeroPaddedFormat(Math.floor(absoluteValue % 60));\n\n // If the duration is less than an hour, only show minutes and seconds\n if (absoluteValue < 3600) {\n const minutes = format(Math.floor(absoluteValue / 60));\n return `${sign}${minutes}:${seconds}`;\n }\n\n const hours = format(Math.floor(absoluteValue / 60 / 60));\n const minutes = zeroPaddedFormat(Math.floor((absoluteValue / 60) % 60));\n return `${sign}${hours}:${minutes}:${seconds}`;\n };\n};\n\n/**\n * Utility function that will log the value to the console and return it\n * @param value\n * @returns\n */\nconst consoleLog = (value) => {\n console.log(value);\n return value;\n};\n\n/**\n * Figures out the rendered width of text by drawing it on a canvas\n * @param text\n * @param fontWeight\n * @param fontSize\n * @returns width in pixels\n */\nconst getLabelWidth = (text: string, fontWeight: FontWeight = 'bold', fontSize: number = 12) => {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (context === null) return 0;\n\n context.font = `${fontWeight} ${fontSize}px ${ADOBE_CLEAN_FONT}`;\n return context.measureText(text).width;\n};\n\nconst truncateText = (text: string, maxWidth: number, fontWeight: FontWeight = 'normal', fontSize: number = 12) => {\n maxWidth = maxWidth - 4;\n const textWidth = getLabelWidth(text, fontWeight, fontSize);\n const elipsisWidth = getLabelWidth('\\u2026', fontWeight, fontSize);\n if (textWidth <= maxWidth) return text;\n\n let truncatedText = text.slice(0, text.length - 1).trim();\n\n for (let i = truncatedText.length; i > 0; i--) {\n truncatedText = truncatedText.slice(0, truncatedText.length - 1).trim();\n if (getLabelWidth(truncatedText, fontWeight, fontSize) + elipsisWidth <= maxWidth) break;\n }\n\n if (truncatedText.length === 0) return text;\n return truncatedText + '\\u2026';\n};\n\nexport const expressionFunctions = {\n consoleLog,\n formatHorizontalTimeAxisLabels: formatHorizontalTimeAxisLabels(),\n formatVerticalAxisTimeLabels: formatVerticalAxisTimeLabels(),\n getLabelWidth,\n truncateText,\n};\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nexport * from './expressionFunctions';\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nexport * from './chartSpecBuilder';\nexport * from './specUtils';\nexport * from './types';\nexport * from './expressionFunctions';\nexport * from './vegaEmbedUtils';\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Scale, ScaleMultiFieldsRef } from 'vega';\n\nimport {\n COLOR_SCALE,\n LINEAR_COLOR_SCALE,\n LINE_TYPE_SCALE,\n OPACITY_SCALE,\n SYMBOL_SHAPE_SCALE,\n SYMBOL_SIZE_SCALE,\n} from '@spectrum-charts/constants';\n\nimport { FacetType, SecondaryFacetType } from '../types';\nimport { Facet } from './legendUtils';\n\n/**\n * These are all the scale names that are used for facets\n */\nconst facetScaleNames: (FacetType | SecondaryFacetType)[] = [\n COLOR_SCALE,\n LINE_TYPE_SCALE,\n LINEAR_COLOR_SCALE,\n OPACITY_SCALE,\n 'secondaryColor',\n 'secondaryLineType',\n 'secondaryOpacity',\n 'secondarySymbolShape',\n SYMBOL_SHAPE_SCALE,\n SYMBOL_SIZE_SCALE,\n];\n\n/**\n * Goes through all the scales and finds all the facets that are used\n * A facet is a key in the data that is used to differentiate the data\n * Examples are color based on 'operatingSystem', size based on 'weight', lineType based on 'timePeriod' etc.\n * @param scales\n * @returns Factes\n */\nexport const getFacets = (scales: Scale[]): { ordinalFacets: Facet[]; continuousFacets: Facet[] } => {\n const ordinalFacets: Facet[] = [];\n const continuousFacets: Facet[] = [];\n\n scales.forEach((scale) => {\n if (\n facetScaleNames.includes(scale.name as FacetType) &&\n isScaleWithMultiFields(scale) &&\n scale.domain.fields.length\n ) {\n if (scale.type === 'ordinal' || scale.type === 'point') {\n ordinalFacets.push({\n facetType: scale.name as FacetType,\n field: scale.domain.fields[0].toString(),\n });\n } else {\n continuousFacets.push({ facetType: scale.name as FacetType, field: scale.domain.fields[0].toString() });\n }\n }\n });\n return { ordinalFacets, continuousFacets };\n};\n\n/**\n * This function goes through all the scales and finds the scales that use the provided keys\n * Example: if the keys are ['segment', 'event'], this function will find all the scales that use either of those fields so that they can be used to generate the legend\n * @param keys\n * @param scales\n * @returns\n */\nexport const getFacetsFromKeys = (\n keys: string[],\n scales: Scale[]\n): { ordinalFacets: Facet[]; continuousFacets: Facet[] } => {\n const ordinalFacets: Facet[] = [];\n const continuousFacets: Facet[] = [];\n scales.forEach((scale) => {\n if (isScaleWithMultiFields(scale) && scaleHasKey(scale, keys)) {\n if (scale.type === 'ordinal' || scale.type === 'point') {\n ordinalFacets.push({\n facetType: scale.name as FacetType,\n field: scale.domain.fields.find((field) => keys.includes(field.toString()))?.toString() as string,\n });\n } else {\n continuousFacets.push({\n facetType: scale.name as FacetType,\n field: scale.domain.fields.find((field) => keys.includes(field.toString()))?.toString() as string,\n });\n }\n }\n });\n return { ordinalFacets, continuousFacets };\n};\n\n/**\n * Checks if the scale has any of the provided keys\n * @param scale\n * @param keys\n * @returns boolean\n */\nconst scaleHasKey = (scale: ScaleWithMultiFields, keys: string[]): boolean =>\n scale.domain.fields.some((field) => keys.includes(field.toString()));\n\ntype ScaleWithMultiFields = Scale & { domain: ScaleMultiFieldsRef };\n\n/**\n * Checks that the scale has a domain with a fields array\n * @param scale\n * @returns\n */\nconst isScaleWithMultiFields = (scale: Scale): scale is ScaleWithMultiFields => {\n return Boolean('domain' in scale && scale.domain && 'fields' in scale.domain);\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { GroupMark, Mark, NumericValueRef } from 'vega';\n\nimport {\n COLOR_SCALE,\n HIGHLIGHTED_GROUP,\n HIGHLIGHTED_SERIES,\n HIGHLIGHT_CONTRAST_RATIO,\n SERIES_ID,\n} from '@spectrum-charts/constants';\n\n/**\n * Adds opacity tests for the fill and stroke of marks that use the color scale to set the fill or stroke value.\n */\nexport const setHoverOpacityForMarks = (marks: Mark[], keys?: string[], name?: string) => {\n if (!marks.length) return;\n const flatMarks = flattenMarks(marks);\n const seriesMarks = flatMarks.filter(markUsesSeriesColorScale);\n seriesMarks.forEach((mark) => {\n // need to drill down to the prop we need to set and add missing properties if needed\n if (!mark.encode) {\n mark.encode = { update: {} };\n }\n if (!mark.encode.update) {\n mark.encode.update = {};\n }\n const { update } = mark.encode;\n const { opacity } = update;\n\n if (opacity !== undefined) {\n // the new production rule for highlighting\n const highlightOpacityRule = getHighlightOpacityRule(keys, name);\n\n if (!Array.isArray(update.opacity)) {\n update.opacity = [];\n }\n // need to insert the new test in the second to last slot\n const opacityRuleInsertIndex = Math.max(update.opacity.length - 1, 0);\n update.opacity.splice(opacityRuleInsertIndex, 0, highlightOpacityRule);\n }\n });\n};\n\nexport const getHighlightOpacityRule = (keys?: string[], name?: string): { test?: string } & NumericValueRef => {\n let test = `isValid(${HIGHLIGHTED_SERIES}) && ${HIGHLIGHTED_SERIES} !== datum.${SERIES_ID}`;\n if (keys?.length) {\n test = `isValid(${HIGHLIGHTED_GROUP}) && ${HIGHLIGHTED_GROUP} !== datum.${name}_highlightGroupId`;\n }\n return { test, value: 1 / HIGHLIGHT_CONTRAST_RATIO };\n};\n\n/**\n * Determines if the supplied mark uses the color scale to set the fill or stroke value.\n * This is used to determine if we need to set the opacity for the mark when it is hovered\n * @param mark\n * @returns boolean\n */\nexport const markUsesSeriesColorScale = (mark: Mark): boolean => {\n const enter = mark.encode?.enter;\n if (!enter) return false;\n const { fill, stroke } = enter;\n if (fill && 'scale' in fill && fill.scale === COLOR_SCALE) {\n return true;\n }\n // some marks use a 2d color scale, these will use a signal expression to get the color for that series\n if (fill && 'signal' in fill && fill.signal.includes(\"scale('colors',\")) {\n return true;\n }\n if (stroke && 'scale' in stroke && stroke.scale === COLOR_SCALE) {\n return true;\n }\n return false;\n};\n\n/**\n * Recursively flattens all nested marks into a flat array\n * @param marks\n * @returns\n */\nexport const flattenMarks = (marks: Mark[]): Mark[] => {\n let result = marks;\n for (const mark of marks) {\n if (isGroupMark(mark) && mark.marks) {\n result = [...result, ...flattenMarks(mark.marks)];\n }\n }\n return result;\n};\n\nconst isGroupMark = (mark: Mark): mark is GroupMark => {\n return mark.type === 'group';\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Data, Legend, Mark, Scale, Signal } from 'vega';\n\nimport {\n COLOR_SCALE,\n DEFAULT_COLOR_SCHEME,\n LINEAR_COLOR_SCALE,\n LINE_TYPE_SCALE,\n OPACITY_SCALE,\n SYMBOL_SHAPE_SCALE,\n SYMBOL_SIZE_SCALE,\n} from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { getTableData } from '../data/dataUtils';\nimport { addFieldToFacetScaleDomain } from '../scale/scaleSpecBuilder';\nimport { addHighlighSignalLegendHoverEvents, getGenericValueSignal } from '../signal/signalSpecBuilder';\nimport { getLineWidthPixelsFromLineWidth, getPathFromSymbolShape, getStrokeDashFromLineType } from '../specUtils';\nimport {\n ColorFacet,\n ColorScheme,\n FacetRef,\n LegendOptions,\n LegendSpecOptions,\n LineTypeFacet,\n LineWidthFacet,\n ScSpec,\n SymbolShapeFacet,\n} from '../types';\nimport { getFacets, getFacetsFromKeys } from './legendFacetUtils';\nimport { setHoverOpacityForMarks } from './legendHighlightUtils';\nimport { Facet, getColumns, getEncodings, getHiddenEntriesFilter, getSymbolType } from './legendUtils';\n\nexport const addLegend = produce<\n ScSpec,\n [\n LegendOptions & {\n colorScheme?: ColorScheme;\n index?: number;\n hiddenSeries?: string[];\n highlightedSeries?: string | number;\n }\n ]\n>(\n (\n spec,\n {\n color,\n hasMouseInteraction = false,\n hasOnClick = false,\n hiddenEntries = [],\n hiddenSeries = [],\n highlight = false,\n highlightedSeries,\n index = 0,\n isToggleable = false,\n lineType,\n lineWidth,\n position = 'bottom',\n symbolShape,\n title,\n colorScheme = DEFAULT_COLOR_SCHEME,\n ...options\n }\n ) => {\n const { formattedColor, formattedLineType, formattedLineWidth, formattedSymbolShape } = formatFacetRefsWithPresets(\n color,\n lineType,\n lineWidth,\n symbolShape,\n colorScheme\n );\n\n const name = `legend${index}`;\n\n // put options back together now that all defaults are set\n const legendOptions: LegendSpecOptions = {\n color: formattedColor,\n hasMouseInteraction,\n hasOnClick,\n hiddenEntries,\n hiddenSeries,\n highlight,\n highlightedSeries,\n index,\n isToggleable,\n lineType: formattedLineType,\n lineWidth: formattedLineWidth,\n name,\n position,\n symbolShape: formattedSymbolShape,\n title,\n colorScheme,\n ...options,\n };\n\n // Order matters here. Facets rely on the scales being set up.\n spec.scales = addScales(spec.scales ?? [], legendOptions);\n\n // get the keys and facet types that are used to divide the data for this visualization\n const { ordinalFacets, continuousFacets } = options.keys\n ? getFacetsFromKeys(options.keys, spec.scales ?? [])\n : getFacets(spec.scales ?? []);\n\n const legends: Legend[] = [];\n\n // if there are any categorical facets, add the legend and supporting data, signals and marks\n if (ordinalFacets.length) {\n // add the legendEntries scale\n // this scale is used to generate every combination of the catergorical facets\n spec.scales.push({\n name: `${name}Entries`,\n type: 'ordinal',\n domain: { data: `${name}Aggregate`, field: `${name}Entries` },\n });\n\n // just want the unique fields\n const uniqueFacetFields = [...new Set(ordinalFacets.map((facet) => facet.field))];\n\n spec.data = addData(spec.data ?? [], { ...legendOptions, facets: uniqueFacetFields });\n spec.signals = addSignals(spec.signals ?? [], legendOptions);\n spec.marks = addMarks(spec.marks ?? [], legendOptions);\n\n // add the legend\n legends.push(getCategoricalLegend(ordinalFacets, legendOptions));\n }\n\n // continuous legends cannot be combined with any other legends\n continuousFacets.forEach((facet) => {\n // add the legend\n legends.push(getContinuousLegend(facet, legendOptions));\n });\n\n // if legends is undefined, initialize it as an empty array\n if (typeof spec.legends === 'undefined') {\n spec.legends = [];\n }\n spec.legends.push(...legends);\n }\n);\n\n/**\n * converts facets that could reference preset values to the actual vega supported value\n * Example {value: 'L'} => {value: 3}\n * @param color\n * @param lineType\n * @param lineWidth\n * @param colorScheme\n */\nexport const formatFacetRefsWithPresets = (\n color: ColorFacet | undefined,\n lineType: LineTypeFacet | undefined,\n lineWidth: LineWidthFacet | undefined,\n symbolShape: SymbolShapeFacet | undefined,\n colorScheme: ColorScheme\n) => {\n let formattedColor: FacetRef<string> | undefined;\n if (color && typeof color === 'object') {\n formattedColor = { value: getColorValue(color.value, colorScheme) };\n } else {\n formattedColor = color;\n }\n\n let formattedLineType: FacetRef<number[]> | undefined;\n if (lineType && typeof lineType === 'object') {\n formattedLineType = { value: getStrokeDashFromLineType(lineType.value) };\n } else {\n formattedLineType = lineType;\n }\n\n let formattedLineWidth: FacetRef<number> | undefined;\n if (lineWidth && typeof lineWidth === 'object') {\n formattedLineWidth = { value: getLineWidthPixelsFromLineWidth(lineWidth.value) };\n } else {\n formattedLineWidth = lineWidth;\n }\n\n let formattedSymbolShape: FacetRef<string> | undefined;\n if (symbolShape && typeof symbolShape === 'object') {\n formattedSymbolShape = { value: getPathFromSymbolShape(symbolShape.value) };\n } else {\n formattedSymbolShape = symbolShape;\n }\n return { formattedColor, formattedLineType, formattedLineWidth, formattedSymbolShape };\n};\n\n/**\n * gets the legend for all the categorical facets\n * @param facets\n * @param options\n * @returns\n */\nconst getCategoricalLegend = (facets: Facet[], options: LegendSpecOptions): Legend => {\n const { name, position, title, labelLimit, titleLimit } = options;\n const legend: Legend = {\n fill: `${name}Entries`,\n direction: ['top', 'bottom'].includes(position) ? 'horizontal' : 'vertical',\n orient: position,\n title,\n encode: getEncodings(facets, options),\n columns: getColumns(position),\n labelLimit,\n };\n if (titleLimit !== undefined) legend.titleLimit = titleLimit;\n return legend;\n};\n\n/**\n * gets the legend for a continuous facet\n * currently just setup to handle symbolSize since that is the only supported continuous facet\n * @param _facet\n * @param options\n * @returns\n */\nexport const getContinuousLegend = (facet: Facet, options: LegendSpecOptions): Legend => {\n const { symbolShape } = options;\n // add a switch statement here for the different types of continuous legends\n if (facet.facetType === SYMBOL_SIZE_SCALE) {\n return {\n size: SYMBOL_SIZE_SCALE,\n ...getLegendLayout(options),\n symbolType: getSymbolType(symbolShape),\n };\n }\n return {\n fill: LINEAR_COLOR_SCALE,\n gradientThickness: 10,\n ...getLegendLayout(options),\n };\n};\n\nconst getLegendLayout = ({ position, title, titleLimit }: LegendSpecOptions): Partial<Legend> => {\n const layout: Partial<Legend> = {\n direction: ['top', 'bottom'].includes(position) ? 'horizontal' : 'vertical',\n orient: position,\n title,\n };\n if (titleLimit !== undefined) layout.titleLimit = titleLimit;\n return layout;\n};\n\n/**\n * Adds a new scale that is used to create the legend entries\n */\nconst addScales = produce<Scale[], [LegendSpecOptions]>((scales, { color, lineType, opacity, symbolShape }) => {\n // it is possible to define fields to facet the data off of on the legend\n // if these fields are not already defined on the scales, we need to add them\n addFieldToFacetScaleDomain(scales, COLOR_SCALE, color);\n addFieldToFacetScaleDomain(scales, LINE_TYPE_SCALE, lineType);\n addFieldToFacetScaleDomain(scales, OPACITY_SCALE, opacity);\n addFieldToFacetScaleDomain(scales, SYMBOL_SHAPE_SCALE, symbolShape);\n});\n\nconst addMarks = produce<Mark[], [LegendSpecOptions]>((marks, { highlight, keys, name }) => {\n if (highlight) {\n setHoverOpacityForMarks(marks, keys, name);\n }\n});\n\n/**\n * Adds a new data set that aggregates the data off of the facet fields\n * This creates a row for every unique combination of the facets in the data\n * Each unique combination gets joined with a pipe to create a single string to use as legend entries\n */\nexport const addData = produce<Data[], [LegendSpecOptions & { facets: string[] }]>(\n (data, { facets, hiddenEntries, keys, name }) => {\n // expression for combining all the facets into a single key\n const expr = facets.map((facet) => `datum.${facet}`).join(' + \" | \" + ');\n data.push({\n name: `${name}Aggregate`,\n source: 'table',\n transform: [\n {\n type: 'aggregate',\n groupby: facets,\n },\n {\n type: 'formula',\n as: `${name}Entries`,\n expr,\n },\n ...getHiddenEntriesFilter(hiddenEntries, name),\n ],\n });\n\n if (keys?.length) {\n const tableData = getTableData(data);\n if (!tableData.transform) {\n tableData.transform = [];\n }\n tableData.transform.push({\n type: 'formula',\n as: `${name}_highlightGroupId`,\n expr: keys.map((key) => `datum.${key}`).join(' + \" | \" + '),\n });\n }\n }\n);\n\nexport const addSignals = produce<Signal[], [LegendSpecOptions]>(\n (signals, { hiddenSeries, highlight, isToggleable, keys, legendLabels, name }) => {\n if (highlight) {\n addHighlighSignalLegendHoverEvents(signals, name, Boolean(isToggleable || hiddenSeries), keys);\n }\n\n if (legendLabels) {\n signals.push(getGenericValueSignal(`${name}_labels`, legendLabels));\n }\n }\n);\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport merge from 'deepmerge';\nimport {\n BaseValueRef,\n Color,\n ColorValueRef,\n FilterTransform,\n GuideEncodeEntry,\n LegendEncode,\n NumericValueRef,\n ProductionRule,\n SignalRef,\n SymbolEncodeEntry,\n} from 'vega';\n\nimport {\n COLOR_SCALE,\n COMPONENT_NAME,\n DEFAULT_OPACITY_RULE,\n FILTERED_TABLE,\n HIGHLIGHTED_GROUP,\n HIGHLIGHTED_SERIES,\n HIGHLIGHT_CONTRAST_RATIO,\n LINE_TYPE_SCALE,\n LINE_WIDTH_SCALE,\n OPACITY_SCALE,\n SELECTED_GROUP,\n SELECTED_SERIES,\n SYMBOL_SHAPE_SCALE,\n SYMBOL_SIZE_SCALE,\n} from '@spectrum-charts/constants';\nimport { getColorValue, spectrumColors } from '@spectrum-charts/themes';\n\nimport { getPathFromSymbolShape } from '../specUtils';\nimport {\n ColorValueV6,\n FacetRef,\n FacetType,\n LegendDescription,\n LegendLabel,\n LegendSpecOptions,\n Position,\n SecondaryFacetType,\n} from '../types';\n\nexport interface Facet {\n facetType: FacetType | SecondaryFacetType;\n field: string;\n}\n\n/**\n * Get the number of columns for the legend\n * @param position\n * @returns\n */\nexport const getColumns = (position: Position): SignalRef | undefined => {\n if (['left', 'right'].includes(position)) return;\n return { signal: 'floor(width / 220)' };\n};\n\n/**\n * Gets the filter transform for hidden entries\n * @param hiddenEntries\n * @returns\n */\nexport const getHiddenEntriesFilter = (hiddenEntries: string[], name: string): FilterTransform[] => {\n if (!hiddenEntries.length) return [];\n return [\n {\n type: 'filter',\n expr: `indexof(${JSON.stringify(hiddenEntries)}, datum.${name}Entries) === -1`,\n },\n ];\n};\n\n/**\n * Get the legend encodings\n * @param facets\n * @param legendOptions\n * @returns\n */\nexport const getEncodings = (facets: Facet[], legendOptions: LegendSpecOptions): LegendEncode => {\n const symbolEncodings = getSymbolEncodings(facets, legendOptions);\n const hoverEncodings = getHoverEncodings(legendOptions);\n const legendLabelsEncodings = getLegendLabelsEncodings(legendOptions.name, legendOptions.legendLabels);\n const showHideEncodings = getShowHideEncodings(legendOptions);\n const clickEncodings = getClickEncodings(legendOptions);\n // merge the encodings together\n return mergeLegendEncodings([\n symbolEncodings,\n legendLabelsEncodings,\n hoverEncodings,\n showHideEncodings,\n clickEncodings,\n ]);\n};\n\nconst getLegendLabelsEncodings = (name: string, legendLabels: LegendLabel[] | undefined): LegendEncode => {\n if (legendLabels) {\n return {\n labels: {\n update: {\n text: [\n {\n // Test whether a legendLabel exists for the seriesName, if not use the seriesName\n test: `indexof(pluck(${name}_labels, 'seriesName'), datum.value) > -1`,\n signal: `${name}_labels[indexof(pluck(${name}_labels, 'seriesName'), datum.value)].label`,\n },\n { signal: 'datum.value' },\n ],\n },\n },\n };\n }\n return {};\n};\n\nconst getHoverEncodings = (options: LegendSpecOptions): LegendEncode => {\n const { highlight, highlightedSeries, name, hasMouseInteraction, descriptions, chartPopovers } = options;\n if (highlight || highlightedSeries || descriptions || chartPopovers?.length) {\n return {\n entries: {\n name: `${name}_legendEntry`,\n interactive: true,\n enter: {\n tooltip: getTooltip(descriptions, name), // only add tooltip if descriptions exist\n },\n update: {\n fill: { value: 'transparent' }, // need something here to trigger the tooltip\n },\n },\n labels: {\n update: {\n opacity: getOpacityEncoding(options),\n },\n },\n symbols: {\n update: {\n opacity: getOpacityEncoding(options),\n },\n },\n };\n } else if (hasMouseInteraction) {\n return {\n entries: {\n name: `${name}_legendEntry`,\n interactive: true,\n enter: {\n fill: { value: 'transparent' },\n },\n },\n };\n }\n\n return {};\n};\n\nconst getTooltip = (descriptions: LegendDescription[] | undefined, name: string) => {\n if (descriptions?.length) {\n return { signal: `merge(datum, {'${COMPONENT_NAME}': '${name}'})` };\n }\n return undefined;\n};\n\n/**\n * simple opacity encoding for legend labels and the symbol stroke opacity\n * @param legendOptions\n * @returns opactiy encoding\n */\nexport const getOpacityEncoding = ({\n highlight,\n highlightedSeries,\n keys,\n chartPopovers,\n}: LegendSpecOptions): ProductionRule<NumericValueRef> | undefined => {\n const highlightSignalName = keys?.length ? HIGHLIGHTED_GROUP : HIGHLIGHTED_SERIES;\n const selectedSignalName = keys?.length ? SELECTED_GROUP : SELECTED_SERIES;\n // only add symbol opacity if highlight is true or highlightedSeries is defined\n if (highlight || highlightedSeries || chartPopovers?.length) {\n return [\n {\n test: `isValid(${highlightSignalName}) && datum.value !== ${highlightSignalName}`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n },\n {\n test: `isValid(${selectedSignalName}) && datum.value !== ${selectedSignalName}`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n },\n DEFAULT_OPACITY_RULE,\n ];\n }\n return undefined;\n};\n\nexport const getSymbolEncodings = (facets: Facet[], options: LegendSpecOptions): LegendEncode => {\n const { color, lineType, lineWidth, name, opacity, symbolShape, colorScheme } = options;\n const enter: SymbolEncodeEntry = {\n fillOpacity: getSymbolFacetEncoding<number>({ facets, facetType: OPACITY_SCALE, customValue: opacity, name }),\n shape: getSymbolFacetEncoding<string>({\n facets,\n facetType: SYMBOL_SHAPE_SCALE,\n customValue: symbolShape,\n name,\n }),\n size: getSymbolFacetEncoding<number>({ facets, facetType: SYMBOL_SIZE_SCALE, name }),\n strokeDash: getSymbolFacetEncoding<number[]>({\n facets,\n facetType: LINE_TYPE_SCALE,\n customValue: lineType,\n name,\n }),\n strokeWidth: getSymbolFacetEncoding<number>({\n facets,\n facetType: LINE_WIDTH_SCALE,\n customValue: lineWidth,\n name,\n }),\n };\n const update: SymbolEncodeEntry = {\n fill: [\n ...getHiddenSeriesColorRule(options, 'gray-300'),\n getSymbolFacetEncoding<Color>({ facets, facetType: COLOR_SCALE, customValue: color, name }) ?? {\n value: spectrumColors[colorScheme]['categorical-100'],\n },\n ],\n stroke: [\n ...getHiddenSeriesColorRule(options, 'gray-300'),\n getSymbolFacetEncoding<Color>({ facets, facetType: COLOR_SCALE, customValue: color, name }) ?? {\n value: spectrumColors[colorScheme]['categorical-100'],\n },\n ],\n };\n // Remove undefined values\n const symbols: GuideEncodeEntry<SymbolEncodeEntry> = JSON.parse(JSON.stringify({ enter, update }));\n return {\n entries: {\n name: `${name}_legendEntry`,\n },\n symbols,\n };\n};\n\nconst getSymbolFacetEncoding = <T>({\n customValue,\n facets,\n facetType,\n name,\n}: {\n customValue?: FacetRef<T>;\n facets?: Facet[];\n facetType: FacetType;\n name: string;\n}): BaseValueRef<T> | undefined => {\n if (customValue) {\n if (typeof customValue === 'string') {\n return { signal: `scale('${facetType}', data('${name}Aggregate')[datum.index].${customValue})` };\n }\n return { value: customValue.value };\n }\n\n if (!facets) return;\n\n const secondaryFacetMapping: { [key in FacetType]: { scale: SecondaryFacetType; signal: string } } = {\n color: { scale: 'secondaryColor', signal: 'colors' },\n linearColor: { scale: 'secondaryColor', signal: 'colors' },\n lineType: { scale: 'secondaryLineType', signal: 'lineTypes' },\n lineWidth: { scale: 'secondaryLineWidth', signal: 'lineWidths' },\n opacity: { scale: 'secondaryOpacity', signal: 'opacities' },\n symbolShape: { scale: 'secondarySymbolShape', signal: 'symbolShapes' },\n symbolSize: { scale: 'secondarySymbolSize', signal: 'symbolSizes' },\n symbolPathWidth: { scale: 'secondarySymbolPathWidth', signal: 'symbolPathWidths' },\n };\n\n const facet = facets.find((f) => f.facetType === facetType);\n if (!facet) return;\n const secondaryFacet = facets.find((f) => f.facetType === secondaryFacetMapping[facetType].scale);\n if (secondaryFacet) {\n const { scale, signal } = secondaryFacetMapping[facetType];\n return {\n signal: `scale('${signal}', data('${name}Aggregate')[datum.index].${facet.field})[indexof(domain('${scale}'), data('${name}Aggregate')[datum.index].${secondaryFacet.field})% length(scale('${signal}', data('${name}Aggregate')[datum.index].${facet.field}))]`,\n };\n }\n\n return { signal: `scale('${facetType}', data('${name}Aggregate')[datum.index].${facet.field})` };\n};\n\nexport const getHiddenSeriesColorRule = (\n { colorScheme, hiddenSeries, isToggleable, keys, name }: LegendSpecOptions,\n colorValue: ColorValueV6\n): ({\n test?: string;\n} & ColorValueRef)[] => {\n if (!isToggleable && !hiddenSeries.length) return [];\n if (keys?.length) {\n return [\n {\n test: `indexof(pluck(data('${FILTERED_TABLE}'), '${name}_highlightGroupId'), datum.value) === -1`,\n value: getColorValue(colorValue, colorScheme),\n },\n ];\n }\n return [{ test: 'indexof(hiddenSeries, datum.value) !== -1', value: getColorValue(colorValue, colorScheme) }];\n};\n\n/**\n * Gets the required encondings for show/hide toggleable legends\n * @param isToggleable\n * @returns\n */\nexport const getShowHideEncodings = (options: LegendSpecOptions): LegendEncode => {\n const { colorScheme } = options;\n const hiddenSeriesEncode: LegendEncode = {\n labels: {\n update: {\n fill: [...getHiddenSeriesColorRule(options, 'gray-500'), { value: getColorValue('gray-700', colorScheme) }],\n },\n },\n };\n\n return hiddenSeriesEncode;\n};\n\n/**\n * Gets the required encondings for clickable legends\n * @param options\n * @returns\n */\nexport const getClickEncodings = (options: LegendSpecOptions): LegendEncode => {\n const { isToggleable, keys, name, hasOnClick, chartPopovers } = options;\n\n let clickEncode: LegendEncode = {};\n if ((isToggleable && !keys) || hasOnClick || chartPopovers?.length) {\n clickEncode = {\n entries: {\n name: `${name}_legendEntry`,\n interactive: true,\n enter: {\n fill: { value: 'transparent' },\n cursor: { value: 'pointer' },\n },\n },\n };\n }\n return clickEncode;\n};\n\n/**\n * Merge multiple vega spec legend encodings\n * @param encodings\n * @returns\n */\nexport const mergeLegendEncodings = (encodings: LegendEncode[]): LegendEncode => {\n let mergedEncodings = {};\n for (const encoding of encodings) {\n mergedEncodings = merge(mergedEncodings, encoding);\n }\n return mergedEncodings;\n};\n\n/**\n * Gets the symbol type (shape) for the legend\n * @param symbolShape\n * @returns symbolShape\n */\nexport const getSymbolType = (symbolShape: FacetRef<string> | undefined): string => {\n if (symbolShape && typeof symbolShape === 'object' && 'value' in symbolShape)\n return getPathFromSymbolShape(symbolShape.value);\n return 'circle';\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { SourceData } from 'vega';\n\nimport { HIGHLIGHTED_GROUP, HIGHLIGHTED_ITEM, SELECTED_ITEM } from '@spectrum-charts/constants';\n\n/**\n * gets the data used for highlighting hovered data points\n * @param name\n * @param source\n * @returns\n */\nexport const getLineHighlightedData = (\n name: string,\n idKey: string,\n source: string,\n hasPopover: boolean,\n hasGroupId: boolean\n): SourceData => {\n const highlightedExpr = hasGroupId\n ? `${HIGHLIGHTED_GROUP} === datum.${name}_highlightGroupId`\n : `isArray(${HIGHLIGHTED_ITEM}) && indexof(${HIGHLIGHTED_ITEM}, datum.${idKey}) > -1 || ${HIGHLIGHTED_ITEM} === datum.${idKey}`;\n const expr = hasPopover\n ? `${SELECTED_ITEM} && ${SELECTED_ITEM} === datum.${idKey} || !${SELECTED_ITEM} && ${highlightedExpr}`\n : highlightedExpr;\n return {\n name: `${name}_highlightedData`,\n source,\n transform: [\n {\n type: 'filter',\n expr,\n },\n ],\n };\n};\n\n/**\n * gets the data used for displaying points\n * @param name\n * @param staticPoint\n * @param source\n * @param isSparkline\n * @param isMethodLast\n * @returns\n */\nexport const getLineStaticPointData = (\n name: string,\n staticPoint: string | undefined,\n source: string,\n isSparkline: boolean | undefined,\n isMethodLast: boolean | undefined\n): SourceData => {\n const expr =\n isSparkline && isMethodLast ? \"datum === data('table')[data('table').length - 1]\" : `datum.${staticPoint} === true`;\n return {\n name: `${name}_staticPointData`,\n source,\n transform: [\n {\n type: 'filter',\n expr,\n },\n ],\n };\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { LineMark, Mark, NumericValueRef, ProductionRule, RuleMark } from 'vega';\n\nimport {\n DEFAULT_INTERACTION_MODE,\n DEFAULT_OPACITY_RULE,\n HIGHLIGHTED_SERIES,\n HIGHLIGHT_CONTRAST_RATIO,\n SELECTED_SERIES,\n SERIES_ID,\n} from '@spectrum-charts/constants';\n\nimport { getPopovers } from '../chartPopover/chartPopoverUtils';\nimport {\n getColorProductionRule,\n getItemHoverArea,\n getLineWidthProductionRule,\n getOpacityProductionRule,\n getPointsForVoronoi,\n getStrokeDashProductionRule,\n getVoronoiPath,\n getXProductionRule,\n getYProductionRule,\n hasPopover,\n} from '../marks/markUtils';\nimport { ScaleType } from '../types';\nimport {\n getHighlightBackgroundPoint,\n getHighlightPoint,\n getSecondaryHighlightPoint,\n getSelectRingPoint,\n getSelectionPoint,\n} from './linePointUtils';\nimport { LineMarkOptions } from './lineUtils';\n\n/**\n * generates a line mark\n * @param lineOptions\n * @param dataSource\n * @returns LineMark\n */\nexport const getLineMark = (lineMarkOptions: LineMarkOptions, dataSource: string): LineMark => {\n const {\n chartPopovers,\n color,\n colorScheme,\n dimension,\n lineType,\n lineWidth,\n metric,\n metricAxis,\n name,\n opacity,\n scaleType,\n } = lineMarkOptions;\n const popovers = getPopovers(chartPopovers ?? [], name);\n const popoverWithDimensionHighlightExists = popovers.some(\n ({ UNSAFE_highlightBy }) => UNSAFE_highlightBy === 'dimension'\n );\n\n return {\n name,\n description: name,\n type: 'line',\n from: { data: dataSource },\n interactive: false,\n encode: {\n enter: {\n y: getYProductionRule(metricAxis, metric),\n stroke: getColorProductionRule(color, colorScheme),\n strokeDash: getStrokeDashProductionRule(lineType),\n strokeOpacity: getOpacityProductionRule(opacity),\n strokeWidth: getLineWidthProductionRule(lineWidth),\n },\n update: {\n // this has to be in update because when you resize the window that doesn't rebuild the spec\n // but it may change the x position if it causes the chart to resize\n x: getXProductionRule(scaleType, dimension),\n ...(popoverWithDimensionHighlightExists ? {} : { opacity: getLineOpacity(lineMarkOptions) }),\n },\n },\n };\n};\n\nexport const getLineOpacity = ({\n displayOnHover,\n interactiveMarkName,\n popoverMarkName,\n isHighlightedByGroup,\n highlightedItem,\n}: LineMarkOptions): ProductionRule<NumericValueRef> => {\n if ((!interactiveMarkName || displayOnHover) && highlightedItem === undefined) return [DEFAULT_OPACITY_RULE];\n const strokeOpacityRules: ProductionRule<NumericValueRef> = [];\n\n if (isHighlightedByGroup) {\n strokeOpacityRules.push({\n test: `indexof(pluck(data('${interactiveMarkName}_highlightedData'), '${SERIES_ID}'), datum.${SERIES_ID}) !== -1`,\n value: 1,\n });\n }\n\n // add a rule that will lower the opacity of the line if there is a hovered series, but this line is not the one hovered\n strokeOpacityRules.push(\n {\n test: `isValid(${HIGHLIGHTED_SERIES}) && ${HIGHLIGHTED_SERIES} !== datum.${SERIES_ID}`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n },\n {\n test: `length(data('${interactiveMarkName}_highlightedData')) > 0 && indexof(pluck(data('${interactiveMarkName}_highlightedData'), '${SERIES_ID}'), datum.${SERIES_ID}) === -1`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n }\n );\n\n if (popoverMarkName) {\n strokeOpacityRules.push({\n test: `isValid(${SELECTED_SERIES}) && ${SELECTED_SERIES} !== datum.${SERIES_ID}`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n });\n }\n // This allows us to only show the metric range when hovering over the parent line component.\n strokeOpacityRules.push(DEFAULT_OPACITY_RULE);\n\n return strokeOpacityRules;\n};\n\n/**\n * All the marks that get displayed when hovering or selecting a point on a line\n * @param lineMarkOptions\n * @param dataSource\n * @param secondaryHighlightedMetric\n * @returns\n */\nexport const getLineHoverMarks = (\n lineOptions: LineMarkOptions,\n dataSource: string,\n secondaryHighlightedMetric?: string\n): Mark[] => {\n const { dimension, name, scaleType } = lineOptions;\n return [\n // vertical rule shown for the hovered or selected point\n getHoverRule(dimension, name, scaleType),\n // point behind the hovered or selected point used to prevent bacgorund elements from being visible through low opacity point\n getHighlightBackgroundPoint(lineOptions),\n // if has popover, add selection ring and selection point\n ...(hasPopover(lineOptions) ? [getSelectRingPoint(lineOptions), getSelectionPoint(lineOptions)] : []),\n // hover or select point\n getHighlightPoint(lineOptions),\n // additional point that gets highlighted like the trendline or raw line point\n ...(secondaryHighlightedMetric ? [getSecondaryHighlightPoint(lineOptions, secondaryHighlightedMetric)] : []),\n // get interactive marks for the line\n ...getInteractiveMarks(dataSource, lineOptions),\n ];\n};\n\nconst getHoverRule = (dimension: string, name: string, scaleType: ScaleType): RuleMark => {\n return {\n name: `${name}_hoverRule`,\n description: `${name}_hoverRule`,\n type: 'rule',\n from: { data: `${name}_highlightedData` },\n interactive: false,\n encode: {\n enter: {\n y: { value: 0 },\n y2: { signal: 'height' },\n strokeWidth: { value: 1 },\n },\n update: {\n x: getXProductionRule(scaleType, dimension),\n opacity: { signal: `length(data('${name}_selectedData')) > 0 ? 0 : 1` },\n },\n },\n };\n};\n\nconst getInteractiveMarks = (dataSource: string, lineOptions: LineMarkOptions): Mark[] => {\n const { interactionMode = DEFAULT_INTERACTION_MODE } = lineOptions;\n\n const tooltipMarks = {\n nearest: getVoronoiMarks,\n item: getItemHoverMarks,\n };\n\n return tooltipMarks[interactionMode](lineOptions, dataSource);\n};\n\nconst getVoronoiMarks = (lineOptions: LineMarkOptions, dataSource: string): Mark[] => {\n const { dimension, metric, metricAxis, name, scaleType } = lineOptions;\n\n return [\n // points used for the voronoi transform\n getPointsForVoronoi(dataSource, dimension, metric, name, scaleType, metricAxis),\n // voronoi transform used to get nearest point paths\n getVoronoiPath(lineOptions, `${name}_pointsForVoronoi`),\n ];\n};\n\nconst getItemHoverMarks = (lineOptions: LineMarkOptions, dataSource: string): Mark[] => {\n const { chartTooltips = [], dimension, metric, metricAxis, name, scaleType } = lineOptions;\n\n return [\n // area around item that triggers hover\n getItemHoverArea(chartTooltips, dataSource, dimension, metric, name, scaleType, metricAxis),\n ];\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { ColorValueRef, NumericValueRef, SymbolMark } from 'vega';\n\nimport {\n BACKGROUND_COLOR,\n DEFAULT_SYMBOL_SIZE,\n DEFAULT_SYMBOL_STROKE_WIDTH,\n SELECTED_GROUP,\n SELECTED_ITEM,\n} from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport {\n getColorProductionRule,\n getHighlightOpacityValue,\n getOpacityProductionRule,\n getXProductionRule,\n getYProductionRule,\n hasPopover,\n} from '../marks/markUtils';\nimport { LineSpecOptions, ProductionRuleTests } from '../types';\nimport { LineMarkOptions } from './lineUtils';\n\nconst staticPointTest = (staticPoint: string) => `datum.${staticPoint} && datum.${staticPoint} === true`;\nconst getSelectedTest = (name: string, idKey: string) =>\n `(${SELECTED_ITEM} && ${SELECTED_ITEM} === datum.${idKey}) || (${SELECTED_GROUP} && ${SELECTED_GROUP} === datum.${name}_selectedGroupId)`;\n\n/**\n * Gets the point mark for static points on a line chart.\n * @param lineMarkOptions\n * @returns SymbolMark\n */\nexport const getLineStaticPoint = ({\n name,\n metric,\n metricAxis,\n color,\n colorScheme,\n scaleType,\n dimension,\n isSparkline,\n pointSize = 125,\n}: LineSpecOptions): SymbolMark => {\n return {\n name: `${name}_staticPoints`,\n description: `${name}_staticPoints`,\n type: 'symbol',\n from: { data: `${name}_staticPointData` },\n interactive: false,\n encode: {\n enter: {\n size: { value: pointSize },\n fill: isSparkline ? { signal: BACKGROUND_COLOR } : getColorProductionRule(color, colorScheme),\n stroke: isSparkline ? getColorProductionRule(color, colorScheme) : { signal: BACKGROUND_COLOR },\n y: getYProductionRule(metricAxis, metric),\n },\n update: {\n x: getXProductionRule(scaleType, dimension),\n },\n },\n };\n};\n\n/**\n * Gets a background to points to prevent opacity from displaying elements behind the point.\n * @param lineMarkOptions\n * @returns SymbolMark\n */\nexport const getHighlightBackgroundPoint = (lineOptions: LineMarkOptions): SymbolMark => {\n const { dimension, metric, metricAxis, name, scaleType } = lineOptions;\n return {\n name: `${name}_pointBackground`,\n description: `${name}_pointBackground`,\n type: 'symbol',\n from: { data: `${name}_highlightedData` },\n interactive: false,\n encode: {\n enter: {\n y: getYProductionRule(metricAxis, metric),\n fill: { signal: BACKGROUND_COLOR },\n stroke: { signal: BACKGROUND_COLOR },\n },\n update: {\n size: getHighlightPointSize(lineOptions),\n strokeWidth: getHighlightPointStrokeWidth(lineOptions),\n x: getXProductionRule(scaleType, dimension),\n },\n },\n };\n};\n\nconst getHighlightOrSelectionPoint = (lineOptions: LineMarkOptions, useHighlightedData = true): SymbolMark => {\n const { color, colorScheme, dimension, metric, metricAxis, name, scaleType } = lineOptions;\n return {\n name: `${name}_point_${useHighlightedData ? 'highlight' : 'select'}`,\n type: 'symbol',\n from: { data: `${name}${useHighlightedData ? '_highlightedData' : '_selectedData'}` },\n interactive: false,\n encode: {\n enter: {\n y: getYProductionRule(metricAxis, metric),\n stroke: getColorProductionRule(color, colorScheme),\n },\n update: {\n fill: getHighlightPointFill(lineOptions),\n size: getHighlightPointSize(lineOptions),\n stroke: getHighlightPointStroke(lineOptions),\n strokeOpacity: getHighlightPointStrokeOpacity(lineOptions),\n strokeWidth: getHighlightPointStrokeWidth(lineOptions),\n x: getXProductionRule(scaleType, dimension),\n },\n },\n };\n};\n\n/**\n * Displays a point on hover on the line.\n * @param lineMarkOptions\n * @returns SymbolMark\n */\nexport const getHighlightPoint = (lineOptions: LineMarkOptions): SymbolMark => {\n return getHighlightOrSelectionPoint(lineOptions, true);\n};\n\n/**\n * Displays a point on select on the line.\n * @param lineMarkOptions\n * @returns SymbolMark\n */\nexport const getSelectionPoint = (lineOptions: LineMarkOptions): SymbolMark => {\n return getHighlightOrSelectionPoint(lineOptions, false);\n};\n\n/**\n * Displays a secondary highlight point on hover or select on the line.\n * @param lineMarkOptions\n * @param secondaryHighlightedMetric\n * @returns SymbolMark\n */\nexport const getSecondaryHighlightPoint = (\n lineOptions: LineMarkOptions,\n secondaryHighlightedMetric: string\n): SymbolMark => {\n const { color, colorScheme, dimension, metricAxis, name, scaleType } = lineOptions;\n return {\n name: `${name}_secondaryPoint`,\n type: 'symbol',\n from: { data: `${name}_highlightedData` },\n interactive: false,\n encode: {\n enter: {\n y: getYProductionRule(metricAxis, secondaryHighlightedMetric),\n fill: { signal: BACKGROUND_COLOR },\n stroke: getColorProductionRule(color, colorScheme),\n },\n update: {\n x: getXProductionRule(scaleType, dimension),\n },\n },\n };\n};\n\n/**\n * gets the fill color for the highlighted point\n * @param lineMarkOptions\n * @returns fill rule\n */\nexport const getHighlightPointFill = (markOptions: LineMarkOptions): ProductionRuleTests<ColorValueRef> => {\n const { color, colorScheme, idKey, name, staticPoint } = markOptions;\n const fillRules: ProductionRuleTests<ColorValueRef> = [];\n const selectedTest = getSelectedTest(name, idKey);\n\n if (staticPoint) {\n fillRules.push({ test: staticPointTest(staticPoint), ...getColorProductionRule(color, colorScheme) });\n }\n if (hasPopover(markOptions)) {\n fillRules.push({ test: selectedTest, ...getColorProductionRule(color, colorScheme) });\n }\n return [...fillRules, { signal: BACKGROUND_COLOR }];\n};\n\n/**\n * gets the stroke color for the highlighted point\n * @param lineMarkOptions\n * @returns stroke rule\n */\nexport const getHighlightPointStroke = (markOptions: LineMarkOptions): ProductionRuleTests<ColorValueRef> => {\n const { color, colorScheme, idKey, name, staticPoint } = markOptions;\n const strokeRules: ProductionRuleTests<ColorValueRef> = [];\n const selectedTest = getSelectedTest(name, idKey);\n\n if (staticPoint) {\n strokeRules.push({ test: staticPointTest(staticPoint), ...getColorProductionRule(color, colorScheme) });\n }\n if (hasPopover(markOptions)) {\n strokeRules.push({ test: selectedTest, signal: BACKGROUND_COLOR });\n }\n\n return [...strokeRules, getColorProductionRule(color, colorScheme)];\n};\n\n/**\n * gets the stroke opacity for the highlighted point\n * @param lineMarkOptions\n * @returns stroke opacity rule\n */\nexport const getHighlightPointStrokeOpacity = ({\n opacity,\n staticPoint,\n}: LineMarkOptions): ProductionRuleTests<NumericValueRef> => {\n const baseOpacityRule = getOpacityProductionRule(opacity);\n const strokeOpacityRules: ProductionRuleTests<NumericValueRef> = [];\n if (staticPoint) {\n strokeOpacityRules.push({\n test: staticPointTest(staticPoint),\n ...getHighlightOpacityValue(baseOpacityRule),\n });\n }\n return [...strokeOpacityRules, baseOpacityRule];\n};\n\n/**\n * gets the size for the highlighted point\n * @param lineMarkOptions\n * @returns size rule\n */\nexport const getHighlightPointSize = ({ staticPoint }: LineMarkOptions): ProductionRuleTests<NumericValueRef> => {\n const sizeRules: ProductionRuleTests<NumericValueRef> = [];\n if (staticPoint) {\n sizeRules.push({\n // if this is a static point, reduce the size since we are increasing the stroke width\n test: staticPointTest(staticPoint),\n value: 64,\n });\n }\n return [...sizeRules, { value: DEFAULT_SYMBOL_SIZE }];\n};\n\n/**\n * gets the stroke width for the highlighted point\n * @param lineMarkOptions\n * @returns stroke width rule\n */\nexport const getHighlightPointStrokeWidth = ({\n staticPoint,\n}: LineMarkOptions): ProductionRuleTests<NumericValueRef> => {\n const strokeWidthRules: ProductionRuleTests<NumericValueRef> = [];\n if (staticPoint) {\n strokeWidthRules.push({\n // if the point is static, increase the stroke width\n test: staticPointTest(staticPoint),\n value: 6,\n });\n }\n return [...strokeWidthRules, { value: DEFAULT_SYMBOL_STROKE_WIDTH }];\n};\n\n/**\n * Gets point that is used for the selection ring.\n * @param lineMarkOptions\n * @returns SymbolMark\n */\nexport const getSelectRingPoint = (lineOptions: LineMarkOptions): SymbolMark => {\n const { colorScheme, dimension, idKey, metric, metricAxis, name, scaleType } = lineOptions;\n const selectedTest = getSelectedTest(name, idKey);\n\n return {\n name: `${name}_pointSelectRing`,\n type: 'symbol',\n from: { data: `${name}_selectedData` },\n interactive: false,\n encode: {\n enter: {\n y: getYProductionRule(metricAxis, metric),\n fill: { signal: BACKGROUND_COLOR },\n stroke: { value: getColorValue('static-blue', colorScheme) },\n },\n update: {\n size: [{ test: selectedTest, value: 196 }, { value: 0 }],\n strokeWidth: [{ test: selectedTest, value: DEFAULT_SYMBOL_STROKE_WIDTH }, { value: 0 }],\n x: getXProductionRule(scaleType, dimension),\n },\n },\n };\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Data, Mark, Scale, Signal } from 'vega';\n\nimport {\n COLOR_SCALE,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_METRIC,\n DEFAULT_TIME_DIMENSION,\n FILTERED_TABLE,\n INTERACTION_MODE,\n LINE_TYPE_SCALE,\n OPACITY_SCALE,\n} from '@spectrum-charts/constants';\nimport { toCamelCase } from '@spectrum-charts/utils';\n\nimport { addPopoverData } from '../chartPopover/chartPopoverUtils';\nimport { addTooltipData, addTooltipSignals, isHighlightedByGroup } from '../chartTooltip/chartTooltipUtils';\nimport { addTimeTransform, getFilteredTooltipData, getTableData } from '../data/dataUtils';\nimport { getHoverMarkNames, getInteractiveMarkName, hasPopover, isInteractive } from '../marks/markUtils';\nimport {\n getMetricRangeData,\n getMetricRangeGroupMarks,\n getMetricRangeSignals,\n getMetricRanges,\n} from '../metricRange/metricRangeUtils';\nimport { addContinuousDimensionScale, addFieldToFacetScaleDomain, addMetricScale } from '../scale/scaleSpecBuilder';\nimport { addHighlightedItemSignalEvents, addHighlightedSeriesSignalEvents } from '../signal/signalSpecBuilder';\nimport { getFacetsFromOptions } from '../specUtils';\nimport { addTrendlineData, getTrendlineMarks, getTrendlineScales, setTrendlineSignals } from '../trendline';\nimport { ColorScheme, HighlightedItem, LineOptions, LineSpecOptions, ScSpec } from '../types';\nimport { getLineHighlightedData, getLineStaticPointData } from './lineDataUtils';\nimport { getLineHoverMarks, getLineMark } from './lineMarkUtils';\nimport { getLineStaticPoint } from './linePointUtils';\nimport { getPopoverMarkName } from './lineUtils';\n\nexport const addLine = produce<\n ScSpec,\n [LineOptions & { colorScheme?: ColorScheme; highlightedItem?: HighlightedItem; index?: number; idKey: string }]\n>(\n (\n spec,\n {\n chartPopovers = [],\n chartTooltips = [],\n color = { value: 'categorical-100' },\n colorScheme = DEFAULT_COLOR_SCHEME,\n dimension = DEFAULT_TIME_DIMENSION,\n hasOnClick = false,\n index = 0,\n lineType = { value: 'solid' },\n metric = DEFAULT_METRIC,\n metricAxis,\n metricRanges = [],\n name,\n opacity = { value: 1 },\n scaleType = 'time',\n trendlines = [],\n ...options\n }\n ) => {\n const lineName = toCamelCase(name || `line${index}`);\n // put options back together now that all defaults are set\n const lineOptions: LineSpecOptions = {\n chartPopovers,\n chartTooltips,\n color,\n colorScheme,\n dimension,\n hasOnClick,\n index,\n interactiveMarkName: getInteractiveMarkName(\n {\n chartPopovers,\n chartTooltips,\n hasOnClick,\n highlightedItem: options.highlightedItem,\n metricRanges,\n trendlines,\n },\n lineName\n ),\n lineType,\n metric,\n metricAxis,\n metricRanges,\n name: lineName,\n opacity,\n popoverMarkName: getPopoverMarkName(chartPopovers, lineName),\n scaleType,\n trendlines,\n ...options,\n };\n lineOptions.isHighlightedByGroup = isHighlightedByGroup(lineOptions);\n\n spec.data = addData(spec.data ?? [], lineOptions);\n spec.signals = addSignals(spec.signals ?? [], lineOptions);\n spec.scales = setScales(spec.scales ?? [], lineOptions);\n spec.marks = addLineMarks(spec.marks ?? [], lineOptions);\n\n return spec;\n }\n);\n\nexport const addData = produce<Data[], [LineSpecOptions]>((data, options) => {\n const { chartTooltips, dimension, highlightedItem, isSparkline, isMethodLast, name, scaleType, staticPoint } =\n options;\n if (scaleType === 'time') {\n const tableData = getTableData(data);\n tableData.transform = addTimeTransform(tableData.transform ?? [], dimension);\n }\n if (isInteractive(options) || highlightedItem !== undefined) {\n data.push(\n getLineHighlightedData(name, options.idKey, FILTERED_TABLE, hasPopover(options), isHighlightedByGroup(options))\n );\n data.push(getFilteredTooltipData(chartTooltips));\n }\n if (staticPoint || isSparkline)\n data.push(getLineStaticPointData(name, staticPoint, FILTERED_TABLE, isSparkline, isMethodLast));\n addTrendlineData(data, options);\n addTooltipData(data, options, false);\n addPopoverData(data, options);\n data.push(...getMetricRangeData(options));\n});\n\nexport const addSignals = produce<Signal[], [LineSpecOptions]>((signals, options) => {\n const { idKey, name } = options;\n setTrendlineSignals(signals, options);\n signals.push(...getMetricRangeSignals(options));\n\n if (!isInteractive(options)) return;\n addHighlightedItemSignalEvents(signals, `${name}_voronoi`, idKey, 2);\n addHighlightedSeriesSignalEvents(signals, `${name}_voronoi`, 2);\n addHoverSignals(signals, options);\n addTooltipSignals(signals, options);\n});\n\nexport const setScales = produce<Scale[], [LineSpecOptions]>((scales, options) => {\n const { metricAxis, dimension, color, lineType, opacity, padding, scaleType } = options;\n // add dimension scale\n addContinuousDimensionScale(scales, { scaleType, dimension, padding });\n // add color to the color domain\n addFieldToFacetScaleDomain(scales, COLOR_SCALE, color);\n // add lineType to the lineType domain\n addFieldToFacetScaleDomain(scales, LINE_TYPE_SCALE, lineType);\n // add opacity to the opacity domain\n addFieldToFacetScaleDomain(scales, OPACITY_SCALE, opacity);\n // find the linear scale and add our fields to it\n addMetricScale(scales, getMetricKeys(options));\n // add linear scale with custom name\n if (metricAxis) {\n addMetricScale(scales, getMetricKeys(options), 'y', metricAxis);\n }\n // add trendline scales\n scales.push(...getTrendlineScales(options));\n return scales;\n});\n\n// The order that marks are added is important since it determines the draw order.\nexport const addLineMarks = produce<Mark[], [LineSpecOptions]>((marks, options) => {\n const { color, highlightedItem, isSparkline, lineType, name, opacity, staticPoint } = options;\n\n const { facets } = getFacetsFromOptions({ color, lineType, opacity });\n\n marks.push({\n name: `${name}_group`,\n type: 'group',\n from: {\n facet: {\n name: `${name}_facet`,\n data: FILTERED_TABLE,\n groupby: facets,\n },\n },\n marks: [getLineMark(options, `${name}_facet`)],\n });\n if (staticPoint || isSparkline) marks.push(getLineStaticPoint(options));\n marks.push(...getMetricRangeGroupMarks(options));\n if (isInteractive(options) || highlightedItem !== undefined) {\n marks.push(...getLineHoverMarks(options, `${FILTERED_TABLE}ForTooltip`));\n }\n marks.push(...getTrendlineMarks(options));\n});\n\nconst getMetricKeys = (lineOptions: LineSpecOptions) => {\n const metricKeys = [lineOptions.metric];\n\n // metric range fields should be added if metric-axis will be scaled to fit\n const metricRanges = getMetricRanges(lineOptions);\n metricRanges.forEach((metricRange) => {\n if (metricRange.scaleAxisToFit) metricKeys.push(metricRange.metricStart, metricRange.metricEnd);\n });\n\n return metricKeys;\n};\n\nconst addHoverSignals = (signals: Signal[], options: LineSpecOptions) => {\n const { idKey, interactionMode, name } = options;\n if (interactionMode !== INTERACTION_MODE.ITEM) return;\n getHoverMarkNames(name).forEach((hoverMarkName) => {\n addHighlightedItemSignalEvents(signals, hoverMarkName, idKey, 1);\n addHighlightedSeriesSignalEvents(signals, hoverMarkName, 1);\n });\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {\n BarAnnotationOptions,\n ChartPopoverOptions,\n ChartTooltipOptions,\n ColorFacet,\n ColorScheme,\n DonutSummaryOptions,\n HighlightedItem,\n InteractionMode,\n LineTypeFacet,\n LineWidthFacet,\n MetricRangeOptions,\n OpacityFacet,\n ScaleType,\n ScatterPathOptions,\n SegmentLabelOptions,\n TrendlineOptions,\n} from '../types';\n\nexport const getPopoverMarkName = (chartPopovers: ChartPopoverOptions[], lineName: string): string | undefined => {\n // if the line has a popover, this line is the target for the popover\n if (chartPopovers.length) {\n return lineName;\n }\n};\n\nexport interface LineMarkOptions {\n barAnnotations?: BarAnnotationOptions[];\n chartPopovers?: ChartPopoverOptions[];\n chartTooltips?: ChartTooltipOptions[];\n color: ColorFacet;\n colorScheme: ColorScheme;\n dimension: string;\n displayOnHover?: boolean;\n donutSummaries?: DonutSummaryOptions[];\n hasOnClick?: boolean;\n highlightedItem?: HighlightedItem;\n idKey: string;\n interactiveMarkName?: string; // optional name of the mark that is used for hover and click interactions\n interactionMode?: InteractionMode;\n isHighlightedByDimension?: boolean;\n isHighlightedByGroup?: boolean;\n lineType: LineTypeFacet;\n lineWidth?: LineWidthFacet;\n metric: string;\n metricAxis?: string;\n metricRanges?: MetricRangeOptions[];\n name: string;\n opacity: OpacityFacet;\n popoverMarkName?: string;\n scaleType: ScaleType;\n scatterPaths?: ScatterPathOptions[];\n segmentLabels?: SegmentLabelOptions[];\n staticPoint?: string;\n trendlines?: TrendlineOptions[];\n}\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {\n AreaEncodeEntry,\n ArrayValueRef,\n ColorValueRef,\n EncodeEntry,\n GroupMark,\n NumericValueRef,\n PathMark,\n SignalRef,\n SymbolMark,\n} from 'vega';\n\nimport {\n BACKGROUND_COLOR,\n COLOR_SCALE,\n COMPONENT_NAME,\n DEFAULT_OPACITY_RULE,\n DEFAULT_TRANSFORMED_TIME_DIMENSION,\n HIGHLIGHT_CONTRAST_RATIO,\n HOVER_SHAPE,\n HOVER_SHAPE_COUNT,\n HOVER_SIZE,\n LINEAR_COLOR_SCALE,\n LINE_TYPE_SCALE,\n LINE_WIDTH_SCALE,\n OPACITY_SCALE,\n SELECTED_GROUP,\n SELECTED_ITEM,\n SYMBOL_SIZE_SCALE,\n} from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { addHighlightMarkOpacityRules } from '../chartTooltip/chartTooltipUtils';\nimport { LineMarkOptions } from '../line/lineUtils';\nimport { getScaleName } from '../scale/scaleSpecBuilder';\nimport {\n getLineWidthPixelsFromLineWidth,\n getStrokeDashFromLineType,\n getVegaSymbolSizeFromRscSymbolSize,\n} from '../specUtils';\nimport {\n BarSpecOptions,\n ChartPopoverOptions,\n ChartTooltipOptions,\n ColorFacet,\n ColorScheme,\n DonutSpecOptions,\n DualFacet,\n HighlightedItem,\n LineTypeFacet,\n LineWidthFacet,\n MetricRangeOptions,\n OpacityFacet,\n ProductionRuleTests,\n ScaleType,\n ScatterSpecOptions,\n SymbolSizeFacet,\n TrendlineOptions,\n} from '../types';\n\n/**\n * If a popover or hasOnClick exists on the mark, then set the cursor to a pointer.\n * @param chartPopovers\n * @param hasOnClick\n * @returns cursor encoding\n */\nexport const getCursor = (chartPopovers: ChartPopoverOptions[], hasOnClick?: boolean): EncodeEntry['cursor'] => {\n if (hasOnClick || chartPopovers.length) {\n return { value: 'pointer' };\n }\n};\n\n/**\n * If a tooltip exists on the mark, then set tooltip to true.\n */\nexport function getTooltip(\n chartTooltips: ChartTooltipOptions[],\n name: string,\n nestedDatum?: boolean\n): ProductionRuleTests<SignalRef> | SignalRef | undefined {\n // skip annotations\n if (chartTooltips.length) {\n const defaultTooltip = {\n signal: `merge(datum${nestedDatum ? '.datum' : ''}, {'${COMPONENT_NAME}': '${name}'})`,\n };\n // if the tooltip has an excludeDataKey option, then disable the tooltip where that key is present\n const excludeDataKeys = chartTooltips[0].excludeDataKeys;\n if (excludeDataKeys?.length) {\n return [\n ...excludeDataKeys.map((excludeDataKey) => ({ test: `datum.${excludeDataKey}`, signal: 'false' })),\n defaultTooltip,\n ];\n }\n\n return defaultTooltip;\n }\n}\n\n/**\n * returns the border stroke encodings for stacked bar/area\n */\nexport const getBorderStrokeEncodings = (isStacked: boolean, isArea = false): AreaEncodeEntry => {\n if (isStacked)\n return {\n stroke: { signal: BACKGROUND_COLOR },\n strokeWidth: { value: isArea ? 1.5 : 1 },\n strokeJoin: { value: 'round' },\n };\n return {};\n};\n\n/**\n * Checks if there are any tooltips or popovers on the mark\n * @param children\n * @returns\n */\nexport const isInteractive = (options: {\n chartPopovers?: ChartPopoverOptions[];\n chartTooltips?: ChartTooltipOptions[];\n hasOnClick?: boolean;\n metricRanges?: MetricRangeOptions[];\n trendlines?: TrendlineOptions[];\n}): boolean => {\n const hasOnClick = 'hasOnClick' in options && options.hasOnClick;\n const metricRanges = ('metricRanges' in options && options.metricRanges) || [];\n const trendlines = ('trendlines' in options && options.trendlines) || [];\n\n return (\n hasOnClick ||\n hasPopover(options) ||\n hasTooltip(options) ||\n trendlines.some((trendline) => trendline.displayOnHover) ||\n metricRanges.some((metricRange) => metricRange.displayOnHover)\n );\n};\n\nexport const hasPopover = (options: { chartPopovers?: ChartPopoverOptions[] }): boolean =>\n Boolean('chartPopovers' in options && options.chartPopovers?.length);\n\nexport const hasTooltip = (options: { chartTooltips?: ChartTooltipOptions[] }): boolean =>\n Boolean('chartTooltips' in options && options.chartTooltips?.length);\n\n/**\n * Gets the color encoding\n * @param color\n * @param colorScheme\n * @param colorScaleType\n * @returns ColorValueRef\n */\nexport const getColorProductionRule = (\n color: ColorFacet | DualFacet,\n colorScheme: ColorScheme,\n colorScaleType: 'linear' | 'ordinal' = 'ordinal'\n): ColorValueRef => {\n const colorScaleName = colorScaleType === 'linear' ? LINEAR_COLOR_SCALE : COLOR_SCALE;\n if (Array.isArray(color)) {\n return {\n signal: `scale('colors', datum.${color[0]})[indexof(domain('secondaryColor'), datum.${color[1]})% length(scale('colors', datum.${color[0]}))]`,\n };\n }\n if (typeof color === 'string') {\n return { scale: colorScaleName, field: color };\n }\n return { value: getColorValue(color.value, colorScheme) };\n};\n\n/**\n * gets the color encoding in a signal string format\n * @param color\n * @param colorScheme\n * @param colorScaleType\n * @returns string\n */\nexport const getColorProductionRuleSignalString = (\n color: ColorFacet | DualFacet,\n colorScheme: ColorScheme,\n colorScaleType: 'linear' | 'ordinal' = 'ordinal'\n): string => {\n const colorRule = getColorProductionRule(color, colorScheme, colorScaleType);\n if ('signal' in colorRule) {\n return colorRule.signal;\n }\n if ('scale' in colorRule && 'field' in colorRule) {\n return `scale('${colorRule.scale}', datum.${colorRule.field})`;\n }\n if ('value' in colorRule && colorRule.value) {\n return `'${colorRule.value}'`;\n }\n return '';\n};\n\nexport const getLineWidthProductionRule = (\n lineWidth: LineWidthFacet | DualFacet | undefined\n): NumericValueRef | undefined => {\n if (!lineWidth) return;\n if (Array.isArray(lineWidth)) {\n // 2d key reference for setting line width\n return {\n signal: `scale('lineWidths', datum.${lineWidth[0]})[indexof(domain('secondaryLineWidth'), datum.${lineWidth[1]})% length(scale('lineWidths', datum.${lineWidth[0]}))]`,\n };\n }\n // key reference for setting line width\n if (typeof lineWidth === 'string') {\n return { scale: LINE_WIDTH_SCALE, field: lineWidth };\n }\n // static value for setting line width\n return { value: getLineWidthPixelsFromLineWidth(lineWidth.value) };\n};\n\nexport const getOpacityProductionRule = (opacity: OpacityFacet | DualFacet): { signal: string } | { value: number } => {\n if (Array.isArray(opacity)) {\n return {\n signal: `scale('opacities', datum.${opacity[0]})[indexof(domain('secondaryOpacity'), datum.${opacity[1]})% length(scale('opacities', datum.${opacity[0]}))]`,\n };\n }\n if (typeof opacity === 'string') {\n return { signal: `scale('${OPACITY_SCALE}', datum.${opacity})` };\n }\n return { value: opacity.value };\n};\n\nexport const getSymbolSizeProductionRule = (symbolSize: SymbolSizeFacet): NumericValueRef => {\n // key reference for setting symbol size\n if (typeof symbolSize === 'string') {\n return { scale: SYMBOL_SIZE_SCALE, field: symbolSize };\n }\n // static value for setting symbol size\n return { value: getVegaSymbolSizeFromRscSymbolSize(symbolSize.value) };\n};\n\nexport const getStrokeDashProductionRule = (lineType: LineTypeFacet | DualFacet): ArrayValueRef => {\n if (Array.isArray(lineType)) {\n return {\n signal: `scale('lineTypes', datum.${lineType[0]})[indexof(domain('secondaryLineType'), datum.${lineType[1]})% length(scale('lineTypes', datum.${lineType[0]}))]`,\n };\n }\n if (typeof lineType === 'string') {\n return { scale: LINE_TYPE_SCALE, field: lineType };\n }\n return { value: getStrokeDashFromLineType(lineType.value) };\n};\n\nexport const getHighlightOpacityValue = (\n opacityValue: { signal: string } | { value: number } = DEFAULT_OPACITY_RULE\n): NumericValueRef => {\n if ('signal' in opacityValue) {\n return { signal: `${opacityValue.signal} / ${HIGHLIGHT_CONTRAST_RATIO}` };\n }\n return { value: opacityValue.value / HIGHLIGHT_CONTRAST_RATIO };\n};\n\n/**\n * gets the correct x encoding for marks that support scaleType\n * @param scaleType\n * @param dimension\n * @returns x encoding\n */\nexport const getXProductionRule = (scaleType: ScaleType, dimension: string): NumericValueRef => {\n const scale = getScaleName('x', scaleType);\n if (scaleType === 'time') {\n return { scale, field: DEFAULT_TRANSFORMED_TIME_DIMENSION };\n }\n return { scale, field: dimension };\n};\n\n/**\n * Gets the y encoding for marks\n * @param metricAxis\n * @param metric\n * @returns y encoding\n */\nexport const getYProductionRule = (metricAxis: string | undefined, metric: string): NumericValueRef => {\n return { scale: metricAxis || 'yLinear', field: metric };\n};\n\n/**\n * Gets the points used for the voronoi calculation\n * @param dataSource the name of the data source that will be used in the voronoi calculation\n * @param dimension the dimension for the x encoding\n * @param metric the metric for the y encoding\n * @param name the name of the component the voronoi is associated with, i.e. `scatter0`\n * @param scaleType the scale type for the x encoding\n * @returns SymbolMark\n */\nexport const getPointsForVoronoi = (\n dataSource: string,\n dimension: string,\n metric: string,\n name: string,\n scaleType: ScaleType,\n metricAxis?: string\n): SymbolMark => {\n return {\n name: `${name}_pointsForVoronoi`,\n description: `${name}_pointsForVoronoi`,\n type: 'symbol',\n from: { data: dataSource },\n interactive: false,\n encode: {\n enter: {\n y: getYProductionRule(metricAxis, metric),\n fill: { value: 'transparent' },\n stroke: { value: 'transparent' },\n },\n update: {\n x: getXProductionRule(scaleType, dimension),\n },\n },\n };\n};\n\n/**\n * Gets the voronoi path used for tooltips and popovers\n * @param markOptions\n * @param dataSource name of the point data source the voronoi is based on\n * @returns PathMark\n */\nexport const getVoronoiPath = (markOptions: LineMarkOptions | ScatterSpecOptions, dataSource: string): PathMark => {\n const { chartPopovers, chartTooltips, name: markName } = markOptions;\n const hasOnClick = 'hasOnClick' in markOptions && markOptions.hasOnClick;\n return {\n name: `${markName}_voronoi`,\n description: `${markName}_voronoi`,\n type: 'path',\n from: { data: dataSource },\n encode: {\n enter: {\n fill: { value: 'transparent' },\n stroke: { value: 'transparent' },\n isVoronoi: { value: true },\n tooltip: getTooltip(chartTooltips ?? [], markName, true),\n },\n update: {\n cursor: getCursor(chartPopovers ?? [], hasOnClick),\n },\n },\n transform: [\n {\n type: 'voronoi',\n x: `datum.x`,\n y: `datum.y`,\n // on initial render, width/height could be 0 which causes problems\n size: [{ signal: 'max(width, 1)' }, { signal: 'max(height, 1)' }],\n },\n ],\n };\n};\n\n/**\n * Gets the hover area for the mark\n * @param chartTooltips\n * @param dataSource the name of the data source that will be used in the hover area calculation\n * @param dimension the dimension for the x encoding\n * @param metric the metric for the y encoding\n * @param name the name of the component the hover area is associated with, i.e. `scatter0`\n * @param scaleType the scale type for the x encoding\n * @returns GroupMark\n */\nexport const getItemHoverArea = (\n chartTooltips: ChartTooltipOptions[],\n dataSource: string,\n dimension: string,\n metric: string,\n name: string,\n scaleType: ScaleType,\n metricAxis?: string\n): GroupMark => {\n return {\n name: `${name}_hoverGroup`,\n type: 'group',\n marks: getHoverSizes().map((size, i) => ({\n name: getHoverMarkName(name, i),\n type: 'symbol',\n from: { data: dataSource },\n encode: {\n enter: {\n shape: { value: HOVER_SHAPE },\n y: getYProductionRule(metricAxis, metric),\n fill: { value: 'transparent' },\n stroke: { value: 'transparent' },\n tooltip: getTooltip(chartTooltips, name, false),\n size: getHoverSizeSignal(size),\n },\n update: {\n x: getXProductionRule(scaleType, dimension),\n },\n },\n })),\n };\n};\n\nexport const getHoverMarkName = (name: string, index: number): string => `${name}_hover${index}`;\n\nexport const getHoverSizes = (): number[] => [...new Array(HOVER_SHAPE_COUNT)].map((_, i) => HOVER_SIZE / 2 ** i);\n\nexport const getHoverMarkNames = (markName: string): string[] =>\n [...new Array(HOVER_SHAPE_COUNT)].map((_, i) => getHoverMarkName(markName, i));\n\nconst getHoverSizeSignal = (size: number): SignalRef => ({\n signal: `${size} * max(width, 1) / 1000`,\n});\n\n/**\n * Gets the opacity for the mark (used to highlight marks).\n * This will take into account if there are any tooltips or popovers on the mark.\n * @param options\n * @returns\n */\nexport const getMarkOpacity = (options: BarSpecOptions | DonutSpecOptions): ({ test?: string } & NumericValueRef)[] => {\n const { highlightedItem, idKey, name: markName } = options;\n const rules: ({ test?: string } & NumericValueRef)[] = [DEFAULT_OPACITY_RULE];\n // if there aren't any interactive components, then we don't need to add special opacity rules\n if (!isInteractive(options) && highlightedItem === undefined) {\n return rules;\n }\n\n // if a bar is hovered/selected, all other bars should have reduced opacity\n addHighlightMarkOpacityRules(rules, options);\n if (hasPopover(options)) {\n return [\n {\n test: `!isValid(${SELECTED_GROUP}) && ${SELECTED_ITEM} && ${SELECTED_ITEM} !== datum.${idKey}`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n },\n { test: `isValid(${SELECTED_ITEM}) && ${SELECTED_ITEM} === datum.${idKey}`, ...DEFAULT_OPACITY_RULE },\n {\n test: `isValid(${SELECTED_GROUP}) && ${SELECTED_GROUP} === datum.${markName}_selectedGroupId`,\n value: 1,\n },\n {\n test: `isValid(${SELECTED_GROUP}) && ${SELECTED_GROUP} !== datum.${markName}_selectedGroupId`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n },\n ...rules,\n ];\n }\n return rules;\n};\n\nexport const getInteractiveMarkName = (\n options: {\n chartPopovers?: ChartPopoverOptions[];\n chartTooltips?: ChartTooltipOptions[];\n hasOnClick?: boolean;\n highlightedItem?: HighlightedItem;\n metricRanges?: MetricRangeOptions[];\n trendlines?: TrendlineOptions[];\n },\n name: string\n): string | undefined => {\n // if the line has an interactive component, this line is the target for the interactive component\n if (isInteractive(options) || options.highlightedItem !== undefined) {\n return name;\n }\n // if there is a trendline with an interactive component on the line, then the trendline is the target for the interactive component\n if ('trendlines' in options && options.trendlines?.some((trendline) => isInteractive(trendline))) {\n return `${name}Trendline`;\n }\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { AreaMark, GroupMark, LineMark, Signal, SourceData } from 'vega';\n\nimport {\n DEFAULT_METRIC,\n FILTERED_TABLE,\n HIGHLIGHTED_SERIES,\n SELECTED_SERIES,\n SERIES_ID,\n} from '@spectrum-charts/constants';\n\nimport { AreaMarkOptions, getAreaMark } from '../area/areaUtils';\nimport { getLineMark } from '../line/lineMarkUtils';\nimport { LineMarkOptions } from '../line/lineUtils';\nimport { addHighlightedSeriesSignalEvents } from '../signal/signalSpecBuilder';\nimport { getFacetsFromOptions } from '../specUtils';\nimport { LineSpecOptions, MetricRangeOptions, MetricRangeSpecOptions } from '../types';\n\nexport type MetricRangeParentOptions = LineSpecOptions;\n\nexport const getMetricRanges = (markOptions: MetricRangeParentOptions): MetricRangeSpecOptions[] => {\n return markOptions.metricRanges.map((metricRange, index) =>\n applyMetricRangeOptionDefaults(metricRange, markOptions.name, index)\n );\n};\n\nexport const applyMetricRangeOptionDefaults = (\n {\n chartTooltips = [],\n lineType = 'dashed',\n lineWidth = 'S',\n rangeOpacity = 0.2,\n metric = DEFAULT_METRIC,\n displayOnHover = false,\n ...options\n }: MetricRangeOptions,\n markName: string,\n index: number\n): MetricRangeSpecOptions => ({\n chartTooltips,\n lineType,\n lineWidth,\n name: `${markName}MetricRange${index}`,\n rangeOpacity,\n metric,\n displayOnHover,\n ...options,\n});\n\n/**\n * gets the metric range group mark including the metric range line and area marks.\n * @param lineMarkOptions\n */\nexport const getMetricRangeGroupMarks = (lineMarkOptions: LineSpecOptions): GroupMark[] => {\n const { color, lineType } = lineMarkOptions;\n const { facets } = getFacetsFromOptions({ color, lineType });\n\n const marks: GroupMark[] = [];\n const metricRanges = getMetricRanges(lineMarkOptions);\n\n for (const metricRangeOptions of metricRanges) {\n const { displayOnHover, name } = metricRangeOptions;\n // if displayOnHover is true, use the highlightedData source, otherwise use the filtered table\n const data = displayOnHover ? `${name}_highlightedData` : FILTERED_TABLE;\n marks.push({\n name: `${name}_group`,\n type: 'group',\n clip: true,\n from: {\n facet: {\n name: `${name}_facet`,\n data,\n groupby: facets,\n },\n },\n marks: getMetricRangeMark(lineMarkOptions, metricRangeOptions),\n });\n }\n\n return marks;\n};\n\n/**\n * gets the area and line marks for the metric range by combining line and metric range options.\n * @param lineMarkOptions\n * @param metricRangeOptions\n */\nexport const getMetricRangeMark = (\n lineMarkOptions: LineSpecOptions,\n metricRangeOptions: MetricRangeSpecOptions\n): (LineMark | AreaMark)[] => {\n const areaOptions: AreaMarkOptions = {\n name: `${metricRangeOptions.name}_area`,\n color: lineMarkOptions.color,\n colorScheme: lineMarkOptions.colorScheme,\n opacity: metricRangeOptions.rangeOpacity,\n metricStart: metricRangeOptions.metricStart,\n metricEnd: metricRangeOptions.metricEnd,\n isStacked: false,\n scaleType: 'time',\n dimension: lineMarkOptions.dimension,\n isMetricRange: true,\n parentName: lineMarkOptions.name,\n displayOnHover: metricRangeOptions.displayOnHover,\n };\n const lineOptions: LineMarkOptions = {\n ...lineMarkOptions,\n name: `${metricRangeOptions.name}_line`,\n color: metricRangeOptions.color ? { value: metricRangeOptions.color } : lineMarkOptions.color,\n metric: metricRangeOptions.metric,\n lineType: { value: metricRangeOptions.lineType },\n lineWidth: { value: metricRangeOptions.lineWidth },\n displayOnHover: metricRangeOptions.displayOnHover,\n };\n\n const dataSource = `${metricRangeOptions.name}_facet`;\n const lineMark = getLineMark(lineOptions, dataSource);\n const areaMark = getAreaMark(areaOptions, dataSource);\n\n return [lineMark, areaMark];\n};\n\n/**\n * gets the data source for the metricRange\n * @param markOptions\n */\nexport const getMetricRangeData = (markOptions: LineSpecOptions): SourceData[] => {\n const data: SourceData[] = [];\n const metricRanges = getMetricRanges(markOptions);\n\n for (const metricRangeOptions of metricRanges) {\n const { displayOnHover, name } = metricRangeOptions;\n // if displayOnHover is true, add a data source for the highlighted data\n if (displayOnHover) {\n data.push({\n name: `${name}_highlightedData`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'filter',\n expr: `isValid(${HIGHLIGHTED_SERIES}) && ${HIGHLIGHTED_SERIES} === datum.${SERIES_ID} || isValid(${SELECTED_SERIES}) && ${SELECTED_SERIES} === datum.${SERIES_ID}`,\n },\n ],\n });\n }\n }\n\n return data;\n};\n\n/**\n * gets the signals for the metricRange\n * @param markOptions\n */\nexport const getMetricRangeSignals = (markOptions: LineSpecOptions): Signal[] => {\n const signals: Signal[] = [];\n const { name: markName } = markOptions;\n const metricRanges = getMetricRanges(markOptions);\n\n if (metricRanges.length) {\n addHighlightedSeriesSignalEvents(signals, `${markName}_voronoi`, 2);\n }\n\n return signals;\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { OrdinalScale, Scale, ScaleData, ScaleMultiFieldsRef, SignalRef } from 'vega';\n\nimport { DISCRETE_PADDING, FILTERED_TABLE, LINEAR_PADDING, PADDING_RATIO, TABLE } from '@spectrum-charts/constants';\nimport { toCamelCase } from '@spectrum-charts/utils';\n\nimport { getDimensionField } from '../specUtils';\nimport { DualFacet, FacetRef, FacetType, Orientation } from '../types';\n\ntype AxisType = 'x' | 'y';\ntype SupportedScaleType = 'linear' | 'point' | 'band' | 'time' | 'ordinal';\n\n/**\n * Gets the first index for the given scale type and axis.\n *\n * If the scale doesn't exist, it gets created and the index of the new scale is returned.\n *\n * NOTE: this should only be called from a 'produce' function since it mutates the scales\n */\nexport const getScaleIndexByType = (\n scales: Scale[],\n type: SupportedScaleType,\n axis: AxisType,\n scaleName?: string,\n domainDataKey?: string\n): number => {\n const name = scaleName || toCamelCase(`${axis} ${type}`);\n let index = scales.findIndex((scale) => scale.name === name);\n if (index === -1) {\n index = scales.length;\n scales.push(\n generateScale(type, axis, {\n name,\n ...(domainDataKey ? { domain: { data: domainDataKey, fields: [] } } : {}),\n })\n );\n }\n return index;\n};\n\n/**\n * Gets the first index for the given scale name.\n *\n * If the scale doesn't exist, it gets created and the index of the new scale is returned.\n *\n * NOTE: this should only be called from a 'produce' function since it mutates the scales\n */\nexport const getScaleIndexByName = (scales: Scale[], name: string, type?: SupportedScaleType): number => {\n let index = scales.findIndex((scale) => scale.name === name);\n if (index === -1) {\n index = scales.length;\n scales.push({ name, type });\n }\n return index;\n};\n\nexport const addDomainFields = produce<Scale, [string[]]>((scale, values) => {\n values.forEach((value) => {\n if (isScaleMultiFieldsRef(scale.domain)) {\n // if a fields already exist but not this value field, push the value field onto it\n if (!scale.domain.fields.includes(value)) {\n scale.domain.fields.push(value);\n }\n } else {\n // if there isn't a domain yet, set it up\n scale.domain = {\n data: TABLE,\n fields: [value],\n };\n }\n });\n return scale;\n});\n\nexport const addContinuousDimensionScale = (\n scales: Scale[],\n { scaleType, dimension, padding }: { scaleType: SupportedScaleType; dimension: string; padding?: number }\n) => {\n const index = getScaleIndexByType(scales, scaleType, 'x');\n const fields = [getDimensionField(dimension, scaleType)];\n scales[index] = addDomainFields(scales[index], fields);\n if (padding !== undefined) {\n scales[index] = overridePadding(scales[index], padding);\n }\n};\n\nconst overridePadding = produce<Scale, [number]>((scale, padding) => {\n if ('padding' in scale) {\n scale.padding = padding;\n }\n if ('paddingOuter' in scale) {\n scale.paddingOuter = padding;\n }\n});\n\n/**\n * Checks if the metric scale already exists\n * If it does, it adds the new metricKeys to the domain\n * If it doesn't, it creates a new scale and adds the metricKeys to the domain\n * @param scales\n * @param values\n * @param metricAxis\n * @param scaleName\n * @param domainDataKey\n */\nexport const addMetricScale = (\n scales: Scale[],\n metricKeys: string[],\n metricAxis: AxisType = 'y',\n scaleName?: string,\n domainDataKey?: string\n) => {\n const index = getScaleIndexByType(scales, 'linear', metricAxis, scaleName, domainDataKey);\n scales[index] = addDomainFields(scales[index], metricKeys);\n};\n\n/**\n * Generates a metric scale and returns it\n * NOTE: Does not check if the metric scale already exists\n * @param metricKeys\n * @param metricAxis\n * @returns\n */\nexport const getMetricScale = (metricKeys: string[], metricAxis: AxisType, chartOrientation: Orientation): Scale => {\n let scale = getDefaultScale('linear', metricAxis, chartOrientation);\n scale = addDomainFields(scale, metricKeys);\n return scale;\n};\n\n/**\n * adds the field to the facet scale domain if it isn't a static value\n * @param scales\n * @param facetType\n * @param facetValue\n */\nexport const addFieldToFacetScaleDomain = (\n scales: Scale[],\n facetType: FacetType,\n facetValue: FacetRef<string | number | number[]> | DualFacet | undefined\n) => {\n // if facetValue is a string or an array of strings, it is a field reference and should be added the facet scale domain\n if (typeof facetValue === 'string' || (Array.isArray(facetValue) && facetValue.length)) {\n const index = getScaleIndexByName(scales, facetType);\n const facetField = Array.isArray(facetValue) ? facetValue[0] : facetValue;\n scales[index] = addDomainFields(scales[index], [facetField]);\n }\n};\n\nexport const generateScale = (type: SupportedScaleType, axis: AxisType, options?: Partial<Scale>): Scale => {\n return {\n ...getDefaultScale(type, axis),\n ...options,\n } as unknown as Scale;\n};\n\nexport const getDefaultScale = (\n scaleType: SupportedScaleType,\n axis: AxisType,\n chartOrientation: Orientation = 'vertical'\n): Scale => {\n const orientationToAxis: { [key in Orientation]: AxisType } = {\n vertical: 'x',\n horizontal: 'y',\n };\n const isDimensionAxis = axis === orientationToAxis[chartOrientation];\n\n const scale: Scale = {\n name: toCamelCase(`${axis} ${scaleType}`),\n type: scaleType,\n range: axis === 'x' ? 'width' : 'height',\n domain: { data: FILTERED_TABLE, fields: [] },\n // if this is the dimension axis, add padding\n ...(isDimensionAxis ? getPadding(scaleType) : {}),\n };\n if (scale.type === 'ordinal') {\n const { name, type, domain } = scale;\n return { name, type, domain };\n }\n // metric axis properties\n if (scale.type === 'linear' && !isDimensionAxis) {\n return { ...scale, nice: true, zero: true };\n }\n return scale;\n};\n\n/**\n * Sets the appropriate axis padding based on type.\n *\n * Discrete scales use a relative value where padding is step size * padding [0-1].\n * Continuous scales use a pixel value for padding.\n */\nexport const getPadding = (type: SupportedScaleType | 'band') => {\n switch (type) {\n case 'band': {\n const { paddingInner, paddingOuter } = getBandPadding(PADDING_RATIO);\n return { paddingInner, paddingOuter };\n }\n case 'linear':\n case 'time':\n return { padding: LINEAR_PADDING };\n case 'point':\n return { paddingOuter: DISCRETE_PADDING };\n default:\n return {};\n }\n};\n\nexport const getBandPadding = (paddingRatio: number, paddingOuter?: number) => {\n const paddingInner = paddingRatio;\n return {\n paddingInner,\n paddingOuter: paddingOuter === undefined ? DISCRETE_PADDING - (1 - paddingInner) / 2 : paddingOuter,\n };\n};\n\n/**\n * Gets the name of the scale based on the axis and type\n * @param axis\n * @param type\n * @returns scale name\n */\nexport const getScaleName = (axis: AxisType, type: SupportedScaleType) => toCamelCase(`${axis} ${type}`);\n\nexport const getOrdinalScale = (name: string, range: OrdinalScale['range']): OrdinalScale => ({\n name,\n type: 'ordinal',\n range,\n domain: { data: TABLE, fields: [] },\n});\n\nconst isScaleMultiFieldsRef = (\n domain: (null | string | number | boolean | SignalRef)[] | ScaleData | SignalRef | undefined\n): domain is ScaleMultiFieldsRef => {\n return Boolean(domain && !Array.isArray(domain) && 'data' in domain && 'fields' in domain);\n};\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n * Generates consistent scale names for dual-axis charts\n * @param baseScaleName The base scale name (e.g. 'xLinear', 'yLinear', 'customAxis')\n * @param isDualAxis Whether this is a dual axis chart\n * @returns Object containing all scale names needed for dual axis configuration\n */\nexport function getDualAxisScaleNames(baseScaleName: string) {\n const primaryScaleName = `${baseScaleName}Primary`;\n const secondaryScaleName = `${baseScaleName}Secondary`;\n return {\n primaryScale: primaryScaleName,\n secondaryScale: secondaryScaleName,\n primaryDomain: `${primaryScaleName}Domain`,\n secondaryDomain: `${secondaryScaleName}Domain`,\n };\n}\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { GroupMark, Mark, NumericValueRef, SymbolMark } from 'vega';\n\nimport {\n DEFAULT_OPACITY_RULE,\n FILTERED_TABLE,\n HIGHLIGHT_CONTRAST_RATIO,\n SELECTED_ITEM,\n} from '@spectrum-charts/constants';\nimport { spectrumColors } from '@spectrum-charts/themes';\n\nimport { addHighlightMarkOpacityRules } from '../chartTooltip/chartTooltipUtils';\nimport {\n getColorProductionRule,\n getLineWidthProductionRule,\n getOpacityProductionRule,\n getPointsForVoronoi,\n getStrokeDashProductionRule,\n getSymbolSizeProductionRule,\n getVoronoiPath,\n getXProductionRule,\n hasPopover,\n isInteractive,\n} from '../marks/markUtils';\nimport { getScatterPathMarks } from '../scatterPath/scatterPathUtils';\nimport { getTrendlineMarks } from '../trendline';\nimport { ScatterSpecOptions, SymbolSizeFacet } from '../types';\n\nexport const addScatterMarks = produce<Mark[], [ScatterSpecOptions]>((marks, options) => {\n const { name } = options;\n\n const scatterGroup: GroupMark = {\n name: `${name}_group`,\n type: 'group',\n marks: [getScatterMark(options), ...getScatterHoverMarks(options), ...getScatterSelectMarks(options)],\n };\n\n marks.push(...getScatterPathMarks(options));\n marks.push(scatterGroup);\n marks.push(...getTrendlineMarks(options));\n});\n\n/**\n * Gets the primary scatter mark\n * @param scatterOptions scatterSpecOptions\n * @returns SymbolMark\n */\nexport const getScatterMark = (options: ScatterSpecOptions): SymbolMark => {\n const {\n color,\n colorScaleType,\n colorScheme,\n dimension,\n dimensionScaleType,\n lineType,\n lineWidth,\n metric,\n name,\n opacity,\n size,\n } = options;\n return {\n name,\n description: name,\n type: 'symbol',\n from: {\n data: FILTERED_TABLE,\n },\n encode: {\n enter: {\n /**\n * the blend mode makes it possible to tell when there are overlapping points\n * in light mode, the points are darker when they overlap (multiply)\n * in dark mode, the points are lighter when they overlap (screen)\n */\n blend: { value: colorScheme === 'light' ? 'multiply' : 'screen' },\n fill: getColorProductionRule(color, colorScheme, colorScaleType),\n fillOpacity: getOpacityProductionRule(opacity),\n shape: { value: 'circle' },\n size: getSymbolSizeProductionRule(size),\n strokeDash: getStrokeDashProductionRule(lineType),\n strokeWidth: getLineWidthProductionRule(lineWidth),\n stroke: getColorProductionRule(color, colorScheme, colorScaleType),\n },\n update: {\n opacity: getOpacity(options),\n x: getXProductionRule(dimensionScaleType, dimension),\n y: { scale: 'yLinear', field: metric },\n },\n },\n };\n};\n\n/**\n * Gets the opacity production rule for the scatter mark.\n * This is used for highlighting points on hover and selection.\n * @param scatterOptions ScatterSpecOptions\n * @returns opacity production rule\n */\nexport const getOpacity = (scatterOptions: ScatterSpecOptions): ({ test?: string } & NumericValueRef)[] => {\n const { highlightedItem, idKey } = scatterOptions;\n if (!isInteractive(scatterOptions) && highlightedItem === undefined) {\n return [DEFAULT_OPACITY_RULE];\n }\n // if a point is hovered or selected, all other points should be reduced opacity\n const fadedValue = 1 / HIGHLIGHT_CONTRAST_RATIO;\n\n const rules: ({ test?: string } & NumericValueRef)[] = [];\n addHighlightMarkOpacityRules(rules, scatterOptions);\n if (hasPopover(scatterOptions)) {\n rules.push({\n test: `isValid(${SELECTED_ITEM}) && ${SELECTED_ITEM} !== datum.${idKey}`,\n value: fadedValue,\n });\n }\n\n return [...rules, DEFAULT_OPACITY_RULE];\n};\n\n/**\n * Gets the vornoi path mark if there are any interactive children\n * @param scatterOptions ScatterSpecOptions\n * @returns Mark[]\n */\nexport const getScatterHoverMarks = (scatterOptions: ScatterSpecOptions): Mark[] => {\n const { dimension, dimensionScaleType, highlightedItem, metric, name } = scatterOptions;\n if (!isInteractive(scatterOptions) && highlightedItem === undefined) {\n return [];\n }\n\n return [\n getPointsForVoronoi(`${FILTERED_TABLE}ForTooltip`, dimension, metric, name, dimensionScaleType),\n getVoronoiPath(scatterOptions, `${name}_pointsForVoronoi`),\n ];\n};\n\nconst getScatterSelectMarks = (scatterOptions: ScatterSpecOptions): SymbolMark[] => {\n const { dimension, dimensionScaleType, metric, name, size } = scatterOptions;\n if (!hasPopover(scatterOptions)) {\n return [];\n }\n return [\n {\n name: `${name}_selectRing`,\n type: 'symbol',\n from: {\n data: `${name}_selectedData`,\n },\n encode: {\n enter: {\n fill: { value: 'transparent' },\n shape: { value: 'circle' },\n size: getSelectRingSize(size),\n strokeWidth: { value: 2 },\n stroke: { value: spectrumColors.light['static-blue'] },\n },\n update: {\n x: getXProductionRule(dimensionScaleType, dimension),\n y: { scale: 'yLinear', field: metric },\n },\n },\n },\n ];\n};\n\n/**\n * Gets the size of the select ring based on the size of the scatter points\n * @param size SymbolSizeFacet\n * @returns NumericValueRef\n */\nexport const getSelectRingSize = (size: SymbolSizeFacet): NumericValueRef => {\n const baseSize = getSymbolSizeProductionRule(size);\n if ('value' in baseSize && typeof baseSize.value === 'number') {\n // the select ring is 4px widr and taller\n // to calculate: (sqrt(baseSize) + 4)^2\n return { value: Math.pow(Math.sqrt(baseSize.value) + 4, 2) };\n }\n if ('scale' in baseSize && 'field' in baseSize) {\n return { signal: `pow(sqrt(scale('${baseSize.scale}', datum.${baseSize.field})) + 4, 2)` };\n }\n return baseSize;\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Data, Scale, Signal } from 'vega';\n\nimport {\n COLOR_SCALE,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_DIMENSION_SCALE_TYPE,\n DEFAULT_LINEAR_DIMENSION,\n DEFAULT_METRIC,\n FILTERED_TABLE,\n LINEAR_COLOR_SCALE,\n LINE_TYPE_SCALE,\n LINE_WIDTH_SCALE,\n OPACITY_SCALE,\n SELECTED_ITEM,\n SYMBOL_SIZE_SCALE,\n} from '@spectrum-charts/constants';\nimport { toCamelCase } from '@spectrum-charts/utils';\n\nimport { addTooltipData, addTooltipSignals } from '../chartTooltip/chartTooltipUtils';\nimport { addTimeTransform, getFilteredTooltipData, getTableData } from '../data/dataUtils';\nimport { getInteractiveMarkName, hasPopover, isInteractive } from '../marks/markUtils';\nimport { addContinuousDimensionScale, addFieldToFacetScaleDomain, addMetricScale } from '../scale/scaleSpecBuilder';\nimport { setScatterPathScales } from '../scatterPath';\nimport { addHighlightedItemSignalEvents } from '../signal/signalSpecBuilder';\nimport { addTrendlineData, getTrendlineScales, setTrendlineSignals } from '../trendline';\nimport { ColorScheme, HighlightedItem, ScSpec, ScatterOptions, ScatterSpecOptions } from '../types';\nimport { addScatterMarks } from './scatterMarkUtils';\n\n/**\n * Adds all the necessary parts of a scatter to the spec\n * @param spec Spec\n * @param scatterOptions ScatterOptions\n */\nexport const addScatter = produce<\n ScSpec,\n [ScatterOptions & { colorScheme?: ColorScheme; highlightedItem?: HighlightedItem; index?: number; idKey: string }]\n>(\n (\n spec,\n {\n chartPopovers = [],\n chartTooltips = [],\n color = { value: 'categorical-100' },\n colorScaleType = 'ordinal',\n colorScheme = DEFAULT_COLOR_SCHEME,\n dimension = DEFAULT_LINEAR_DIMENSION,\n dimensionScaleType = DEFAULT_DIMENSION_SCALE_TYPE,\n index = 0,\n lineType = { value: 'solid' },\n lineWidth = { value: 0 },\n metric = DEFAULT_METRIC,\n name,\n opacity = { value: 1 },\n scatterPaths = [],\n size = { value: 'M' },\n trendlines = [],\n ...options\n }\n ) => {\n const scatterName = toCamelCase(name || `scatter${index}`);\n // put options back together now that all the defaults have been set\n\n const scatterOptions: ScatterSpecOptions = {\n chartPopovers,\n chartTooltips,\n color,\n colorScaleType,\n colorScheme,\n dimension,\n dimensionScaleType,\n index,\n interactiveMarkName: getInteractiveMarkName(\n { chartPopovers, chartTooltips, highlightedItem: options.highlightedItem, trendlines },\n scatterName\n ),\n lineType,\n lineWidth,\n metric,\n name: scatterName,\n opacity,\n scatterPaths,\n size,\n trendlines,\n ...options,\n };\n\n spec.data = addData(spec.data ?? [], scatterOptions);\n spec.signals = addSignals(spec.signals ?? [], scatterOptions);\n spec.scales = setScales(spec.scales ?? [], scatterOptions);\n spec.marks = addScatterMarks(spec.marks ?? [], scatterOptions);\n }\n);\n\nexport const addData = produce<Data[], [ScatterSpecOptions]>((data, scatterOptions) => {\n const { chartTooltips, dimension, dimensionScaleType, highlightedItem, idKey, name } = scatterOptions;\n if (dimensionScaleType === 'time') {\n const tableData = getTableData(data);\n tableData.transform = addTimeTransform(tableData.transform ?? [], dimension);\n }\n\n if (isInteractive(scatterOptions) || highlightedItem !== undefined) {\n data.push(getFilteredTooltipData(chartTooltips));\n }\n\n if (hasPopover(scatterOptions)) {\n data.push({\n name: `${name}_selectedData`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'filter',\n expr: `${SELECTED_ITEM} === datum.${idKey}`,\n },\n ],\n });\n }\n addTooltipData(data, scatterOptions);\n addTrendlineData(data, scatterOptions);\n});\n\n/**\n * Adds the signals for scatter to the signals array\n * @param signals Signal[]\n * @param scatterOptions ScatterSpecOptions\n */\nexport const addSignals = produce<Signal[], [ScatterSpecOptions]>((signals, scatterOptions) => {\n const { idKey, name } = scatterOptions;\n // trendline signals\n setTrendlineSignals(signals, scatterOptions);\n\n if (!isInteractive(scatterOptions)) return;\n // interactive signals\n addHighlightedItemSignalEvents(signals, `${name}_voronoi`, idKey, 2);\n addTooltipSignals(signals, scatterOptions);\n});\n\n/**\n * Sets up all the scales for scatter on the scales array\n * @param scales Scale[]\n * @param scatterOptions ScatterSpecOptions\n */\nexport const setScales = produce<Scale[], [ScatterSpecOptions]>((scales, scatterOptions) => {\n const { color, colorScaleType, dimension, dimensionScaleType, lineType, lineWidth, metric, opacity, size } =\n scatterOptions;\n // add dimension scale\n addContinuousDimensionScale(scales, { scaleType: dimensionScaleType, dimension });\n // add metric scale\n addMetricScale(scales, [metric]);\n if (colorScaleType === 'linear') {\n // add color to the color domain\n addFieldToFacetScaleDomain(scales, LINEAR_COLOR_SCALE, color);\n } else {\n // add color to the color domain\n addFieldToFacetScaleDomain(scales, COLOR_SCALE, color);\n }\n // add lineType to the lineType domain\n addFieldToFacetScaleDomain(scales, LINE_TYPE_SCALE, lineType);\n // add lineWidth to the lineWidth domain\n addFieldToFacetScaleDomain(scales, LINE_WIDTH_SCALE, lineWidth);\n // add opacity to the opacity domain\n addFieldToFacetScaleDomain(scales, OPACITY_SCALE, opacity);\n // add size to the size domain\n addFieldToFacetScaleDomain(scales, SYMBOL_SIZE_SCALE, size);\n\n setScatterPathScales(scales, scatterOptions);\n scales.push(...getTrendlineScales(scatterOptions));\n});\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nexport * from './scatterPathUtils';\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { GroupMark, NumericValueRef, Scale, TrailMark } from 'vega';\n\nimport {\n DEFAULT_OPACITY_RULE,\n FILTERED_TABLE,\n HIGHLIGHTED_ITEM,\n HIGHLIGHTED_SERIES,\n HIGHLIGHT_CONTRAST_RATIO,\n SELECTED_ITEM,\n SELECTED_SERIES,\n SYMBOL_PATH_WIDTH_SCALE,\n} from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { getXProductionRule } from '../marks/markUtils';\nimport { addFieldToFacetScaleDomain } from '../scale/scaleSpecBuilder';\nimport { getFacetsFromOptions, getLineWidthPixelsFromLineWidth } from '../specUtils';\nimport { LineWidthFacet, ScatterPathOptions, ScatterPathSpecOptions, ScatterSpecOptions } from '../types';\n\n/**\n * Gets the path spec options, applying defaults.\n * @param scatterPathOptions\n * @param index\n * @param markName\n * @param colorScheme\n * @returns ScatterPathSpecOptions\n */\nexport const getScatterPathSpecOptions = (\n { color = 'gray-500', groupBy, pathWidth = { value: 'M' }, opacity = 0.5, ...scatterPathOptions }: ScatterPathOptions,\n index: number,\n {\n color: scatterColor,\n colorScheme,\n dimension,\n dimensionScaleType,\n lineType,\n metric,\n name: scatterName,\n opacity: scatterOpacity,\n size,\n }: ScatterSpecOptions\n): ScatterPathSpecOptions => {\n const { facets } = getFacetsFromOptions({ color: scatterColor, lineType, size, opacity: scatterOpacity });\n return {\n color,\n colorScheme,\n dimension,\n dimensionScaleType,\n groupBy: groupBy ?? facets,\n metric,\n index,\n pathWidth,\n name: `${scatterName}Path${index}`,\n opacity,\n ...scatterPathOptions,\n };\n};\n\n/**\n * Gets all the paths on a scatter\n * @param scatterOptions\n * @returns ScatterPathSpecOptions[]\n */\nexport const getScatterPaths = (scatterOptions: ScatterSpecOptions): ScatterPathSpecOptions[] => {\n return scatterOptions.scatterPaths.map((path, index) => getScatterPathSpecOptions(path, index, scatterOptions));\n};\n\n/**\n * Sets the scales up for the scatter path marks\n * Note: This mutates the scales array so it should only be called from an immer produce function\n * @param scales\n * @param scatterOptions\n */\nexport const setScatterPathScales = (scales: Scale[], scatterOptions: ScatterSpecOptions) => {\n const paths = getScatterPaths(scatterOptions);\n\n paths.forEach((path) => {\n addFieldToFacetScaleDomain(scales, SYMBOL_PATH_WIDTH_SCALE, path.pathWidth);\n });\n};\n\nexport const getScatterPathMarks = (scatterOptions: ScatterSpecOptions): GroupMark[] => {\n const marks: GroupMark[] = [];\n const paths = getScatterPaths(scatterOptions);\n\n paths.forEach((path) => {\n const { groupBy, name } = path;\n marks.push({\n name: `${name}_group`,\n type: 'group',\n from: {\n facet: {\n name: `${name}_facet`,\n data: FILTERED_TABLE,\n groupby: groupBy,\n },\n },\n marks: [getScatterPathTrailMark(path)],\n });\n });\n\n return marks;\n};\n\nexport const getScatterPathTrailMark = ({\n color,\n colorScheme,\n dimension,\n dimensionScaleType,\n pathWidth,\n metric,\n name,\n opacity,\n}: ScatterPathSpecOptions): TrailMark => {\n return {\n name,\n type: 'trail',\n from: { data: `${name}_facet` },\n encode: {\n enter: {\n fill: {\n value: getColorValue(color, colorScheme),\n },\n fillOpacity: { value: opacity },\n size: getPathWidth(pathWidth),\n },\n update: {\n opacity: getOpacity(),\n x: getXProductionRule(dimensionScaleType, dimension),\n y: { scale: 'yLinear', field: metric },\n },\n },\n };\n};\n\n/**\n * Gets the opacity production rule for the scatterPath trail marks.\n * This is used for highlighting trails on hover and selection.\n * @param scatterOptions ScatterSpecOptions\n * @returns opacity production rule\n */\nexport const getOpacity = (): ({ test?: string } & NumericValueRef)[] => {\n // if a point is hovered or selected, all other points should be reduced opacity\n const fadedValue = 1 / HIGHLIGHT_CONTRAST_RATIO;\n\n return [\n {\n test: `isValid(${HIGHLIGHTED_SERIES}) || isValid(${HIGHLIGHTED_ITEM}) || isValid(${SELECTED_SERIES}) || isValid(${SELECTED_ITEM})`,\n value: fadedValue,\n },\n DEFAULT_OPACITY_RULE,\n ];\n};\n\nexport const getPathWidth = (pathWidth: LineWidthFacet): NumericValueRef => {\n if (typeof pathWidth === 'string') {\n return { scale: SYMBOL_PATH_WIDTH_SCALE, field: pathWidth };\n }\n return { value: getLineWidthPixelsFromLineWidth(pathWidth.value) };\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Signal } from 'vega';\n\nimport {\n COLOR_SCALE,\n FILTERED_TABLE,\n FIRST_RSC_SERIES_ID,\n HIGHLIGHTED_GROUP,\n HIGHLIGHTED_ITEM,\n HIGHLIGHTED_SERIES,\n LAST_RSC_SERIES_ID,\n MOUSE_OVER_SERIES,\n SERIES_ID,\n} from '@spectrum-charts/constants';\n\n/**\n * Does signal with given name exist?\n */\nexport const hasSignalByName = (signals: Signal[], name: string) => {\n return signals.some((signal) => signal.name === name);\n};\n\n/**\n * Returns a controlled hover signal.\n * Controlled hover signals get manually updated via the view in Chart.tsx\n */\nexport const getControlledHoveredIdSignal = (name: string): Signal => {\n return {\n name: `${name}_controlledHoveredId`,\n value: null,\n on: [{ events: `@${name}:mouseout`, update: 'null' }],\n };\n};\n\n/**\n * Returns a controlled hover signal.\n * Controlled hover signals get manually updated via the view in Chart.tsx\n */\nexport const getControlledHoveredGroupSignal = (name: string): Signal => {\n return {\n name: `${name}_controlledHoveredGroup`,\n value: null,\n on: [{ events: `@${name}:mouseout`, update: 'null' }],\n };\n};\n\n/**\n * Returns the highlighted series signal\n */\nexport const addHighlighSignalLegendHoverEvents = (\n signals: Signal[],\n legendName: string,\n includeHiddenSeries: boolean,\n keys?: string[]\n) => {\n const signalName = keys?.length ? HIGHLIGHTED_GROUP : HIGHLIGHTED_SERIES;\n const highlightedItemSignal = signals.find((signal) => signal.name === signalName);\n if (highlightedItemSignal) {\n if (highlightedItemSignal.on === undefined) {\n highlightedItemSignal.on = [];\n }\n highlightedItemSignal.on.push(\n ...[\n {\n events: `@${legendName}_legendEntry:mouseover`,\n update: getHighlightSignalUpdateExpression(legendName, includeHiddenSeries, keys),\n },\n { events: `@${legendName}_legendEntry:mouseout`, update: 'null' },\n ]\n );\n }\n};\n\nexport const getHighlightSignalUpdateExpression = (\n legendName: string,\n includeHiddenSeries: boolean,\n keys?: string[]\n) => {\n const hoveredSeriesExpression = `domain(\"${legendName}Entries\")[datum.index]`;\n if (!includeHiddenSeries) return hoveredSeriesExpression;\n if (keys?.length) {\n return `indexof(pluck(data(\"${FILTERED_TABLE}\"),\"${legendName}_highlightGroupId\"), ${hoveredSeriesExpression}) !== -1 ? ${hoveredSeriesExpression} : null`;\n }\n return `indexof(hiddenSeries, ${hoveredSeriesExpression}) === -1 ? ${hoveredSeriesExpression} : null`;\n};\n\n/**\n * Returns the legendLabels series signal\n */\nexport const getLegendLabelsSeriesSignal = (value: unknown = null): Signal => {\n return {\n name: 'legendLabels',\n value,\n };\n};\n\n/**\n * Returns a basic value based signal\n */\nexport const getGenericValueSignal = (name: string, value: unknown = null): Signal => {\n return { name, value };\n};\n\n/**\n * Returns a basic value based signal\n */\nexport const getGenericUpdateSignal = (name: string, update: string): Signal => {\n return { name, update };\n};\n\n/**\n * Returns a signal that tracks which series is being moused over for dual Y-axis charts\n */\nexport const getMouseOverSeriesSignal = (markName: string): Signal => ({\n name: `${MOUSE_OVER_SERIES}`,\n value: null,\n on: [\n { events: `@${markName}:mouseover`, update: `datum.${SERIES_ID}` },\n { events: `@${markName}:mouseout`, update: 'null' },\n ],\n});\n\n/**\n * Returns a signal that tracks the first series in the series order for dual Y-axis charts\n */\nexport const getFirstRscSeriesIdSignal = (): Signal => ({\n name: `${FIRST_RSC_SERIES_ID}`,\n value: null,\n update: `length(domain(\"${COLOR_SCALE}\")) > 0 ? domain(\"${COLOR_SCALE}\")[0] : null`,\n});\n\n/**\n * Returns a signal that tracks the last series in the series order for dual Y-axis charts\n */\nexport const getLastRscSeriesIdSignal = (): Signal => ({\n name: `${LAST_RSC_SERIES_ID}`,\n value: null,\n update: `length(domain(\"${COLOR_SCALE}\")) > 0 ? peek(domain(\"${COLOR_SCALE}\")) : null`,\n});\n\n/**\n * adds on events to the highlighted item signal\n * @param signals\n * @param markName\n * @param datumOrder how deep the datum is nested (i.e. 1 becomes datum.rscMarkId, 2 becomes datum.datum.rscMarkId, etc.)\n * @param excludeDataKey data items with a truthy value for this key will be excluded from the signal\n */\nexport const addHighlightedItemSignalEvents = (\n signals: Signal[],\n markName: string,\n idKey: string,\n datumOrder = 1,\n excludeDataKeys?: string[]\n) => {\n const highlightedItemSignal = signals.find((signal) => signal.name === HIGHLIGHTED_ITEM);\n if (highlightedItemSignal) {\n if (highlightedItemSignal.on === undefined) {\n highlightedItemSignal.on = [];\n }\n const datum = new Array(datumOrder).fill('datum.').join('');\n\n const excludeDataKeysCondition = excludeDataKeys?.map((excludeDataKey) => `${datum}${excludeDataKey}`).join(' || ');\n highlightedItemSignal.on.push(\n ...[\n {\n events: `@${markName}:mouseover`,\n update: excludeDataKeys?.length\n ? `(${excludeDataKeysCondition}) ? null : ${datum}${idKey}`\n : `${datum}${idKey}`,\n },\n { events: `@${markName}:mouseout`, update: 'null' },\n ]\n );\n }\n};\n\n/**\n * adds on events to the highlighted series signal\n * @param signals\n * @param markName\n * @param datumOrder how deep the datum is nested (i.e. 1 becomes datum.rscMarkId, 2 becomes datum.datum.rscMarkId, etc.)\n * @param excludeDataKey data items with a truthy value for this key will be excluded from the signal\n */\nexport const addHighlightedSeriesSignalEvents = (\n signals: Signal[],\n markName: string,\n datumOrder = 1,\n excludeDataKeys?: string[]\n) => {\n const highlightedSeriesSignal = signals.find((signal) => signal.name === HIGHLIGHTED_SERIES);\n if (highlightedSeriesSignal) {\n if (highlightedSeriesSignal.on === undefined) {\n highlightedSeriesSignal.on = [];\n }\n const datum = new Array(datumOrder).fill('datum.').join('');\n\n const excludeDataKeysCondition = excludeDataKeys?.map((excludeDataKey) => `${datum}${excludeDataKey}`).join(' || ');\n highlightedSeriesSignal.on.push(\n ...[\n {\n events: `@${markName}:mouseover`,\n update: excludeDataKeys?.length\n ? `(${excludeDataKeysCondition}) ? null : ${datum}${SERIES_ID}`\n : `${datum}${SERIES_ID}`,\n },\n { events: `@${markName}:mouseout`, update: 'null' },\n ]\n );\n }\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Config, Data, Scale, ScaleType, Spec, mergeConfig } from 'vega';\n\nimport {\n COLOR_SCALE,\n DATE_PATH,\n DEFAULT_TRANSFORMED_TIME_DIMENSION,\n FILTERED_TABLE,\n LINE_TYPE_SCALE,\n MARK_ID,\n OPACITY_SCALE,\n ROUNDED_SQUARE_PATH,\n SENTIMENT_NEGATIVE_PATH,\n SENTIMENT_NEUTRAL_PATH,\n SENTIMENT_POSITIVE_PATH,\n TABLE,\n} from '@spectrum-charts/constants';\nimport { getColorValue, getSpectrumVegaConfig } from '@spectrum-charts/themes';\n\nimport {\n ChartSpecOptions,\n ChartSymbolShape,\n ColorFacet,\n ColorScheme,\n DualFacet,\n Icon,\n LineType,\n LineTypeFacet,\n LineWidth,\n NumberFormat,\n OpacityFacet,\n ScSpec,\n SymbolSize,\n SymbolSizeFacet,\n} from './types';\n\n/**\n * gets all the keys that are used to facet by\n * @param facetOptions\n * @returns facets\n */\nexport const getFacetsFromOptions = ({\n color,\n lineType,\n opacity,\n size,\n}: {\n color?: ColorFacet | DualFacet;\n lineType?: LineTypeFacet | DualFacet;\n opacity?: OpacityFacet | DualFacet;\n size?: SymbolSizeFacet;\n}): { facets: string[]; secondaryFacets: string[] } => {\n // get all the keys that we need to facet by\n // filter out the ones that use static values instead of fields\n let facets = [color, lineType, opacity, size]\n .map((facet) => (Array.isArray(facet) ? facet[0] : facet))\n .filter((facet): facet is string => typeof facet === 'string');\n // remove duplicates\n facets = [...new Set(facets)];\n\n let secondaryFacets = [color, lineType, opacity]\n .map((facet) => (Array.isArray(facet) ? facet[1] : undefined))\n .filter((facet): facet is string => typeof facet === 'string');\n // remove duplicates\n secondaryFacets = [...new Set(secondaryFacets)];\n\n return { facets, secondaryFacets };\n};\n\n/**\n * gets all the keys that have been used to facet the data into series from the scales\n * @param scales\n * @returns\n */\nexport const getFacetsFromScales = (scales: Scale[] = []): string[] => {\n const facets = [\n COLOR_SCALE,\n LINE_TYPE_SCALE,\n OPACITY_SCALE,\n 'secondaryColor',\n 'secondaryLineType',\n 'secondaryOpacity',\n ].reduce((acc, cur) => {\n const scale = scales.find((scale) => scale.name === cur);\n if (scale?.domain && 'fields' in scale.domain && scale.domain.fields.length) {\n return [...acc, scale.domain.fields[0].toString()];\n }\n return acc;\n }, [] as string[]);\n\n // only want the unique facets\n return [...new Set(facets)];\n};\n\n/**\n * gets the strokeDash array from the lineType\n * @param lineType\n * @returns strokeDash array\n */\nexport const getStrokeDashFromLineType = (lineType: LineType): number[] => {\n if (Array.isArray(lineType)) {\n return lineType;\n }\n switch (lineType) {\n case 'dashed':\n return [7, 4];\n case 'dotted':\n return [2, 3];\n case 'dotDash':\n return [2, 3, 7, 4];\n case 'shortDash':\n return [3, 4];\n case 'longDash':\n return [11, 4];\n case 'twoDash':\n return [5, 2, 11, 2];\n case 'solid':\n default:\n return [];\n }\n};\n\n/**\n * gets the line width pixel value from the lineWidth\n * @param lineWidth\n * @returns line width pixel value\n */\nexport const getLineWidthPixelsFromLineWidth = (lineWidth: LineWidth): number => {\n if (typeof lineWidth === 'number') {\n return lineWidth;\n }\n\n switch (lineWidth) {\n case 'XS':\n return 1;\n case 'S':\n return 1.5;\n case 'L':\n return 3;\n case 'XL':\n return 4;\n case 'M':\n default:\n return 2;\n }\n};\n\n/**\n * get the SVG path for the symbol shape\n * @param symbolShape supported shape name or custom SVG path\n * @returns SVG path\n */\nexport const getPathFromSymbolShape = (symbolShape: ChartSymbolShape): string => {\n if (symbolShape === 'rounded-square') return ROUNDED_SQUARE_PATH;\n return symbolShape;\n};\n\n/**\n * gets the strokeDash array from the lineType\n * @param icon\n * @returns strokeDash array\n */\nexport const getPathFromIcon = (icon: Icon | string): string => {\n const supportedIcons: { [key in Icon]: string } = {\n date: DATE_PATH,\n sentimentNegative: SENTIMENT_NEGATIVE_PATH,\n sentimentNeutral: SENTIMENT_NEUTRAL_PATH,\n sentimentPositive: SENTIMENT_POSITIVE_PATH,\n };\n return supportedIcons[icon] || icon;\n};\n\n/**\n * Converts a symbolSize to the vega size\n * RSC uses the width of the symbol to determine the size\n * Vega uses the area of the symbol to determine the size\n * @param symbolSize\n * @returns size in square pixels\n */\nexport const getVegaSymbolSizeFromRscSymbolSize = (symbolSize: SymbolSize): number => {\n return Math.pow(getSymbolWidthFromRscSymbolSize(symbolSize), 2);\n};\n\n/**\n * Gets the width of the symbol or trail from the symbolSize\n * @param symbolSize\n * @returns width in pixels\n */\nexport const getSymbolWidthFromRscSymbolSize = (symbolSize: SymbolSize): number => {\n if (typeof symbolSize === 'number') {\n return symbolSize;\n }\n\n switch (symbolSize) {\n case 'XS':\n return 6;\n case 'S':\n return 8;\n case 'L':\n return 12;\n case 'XL':\n return 16;\n case 'M':\n default:\n return 10;\n }\n};\n\n/**\n * base data that gets initialized with every uncontrolled spec\n */\nexport const baseData: Data[] = [\n { name: TABLE, values: [], transform: [{ type: 'identifier', as: MARK_ID }] },\n { name: FILTERED_TABLE, source: TABLE },\n];\n\n/**\n * Merges an optionally supplied spec with Chart options and default values.\n *\n * @param spec - The spec to merge with the base spec. If none is supplied, the base spec is returned.\n * @param chartOptions - A partial set of chart options to spread on to the spec.\n * @returns Spec with default values\n */\nexport const initializeSpec = (spec: Spec | null = {}, chartOptions: Partial<ChartSpecOptions> = {}): ScSpec => {\n const { backgroundColor, colorScheme = 'light', description, title } = chartOptions;\n\n const baseSpec: ScSpec = {\n usermeta: {},\n title: title || undefined,\n description,\n autosize: { type: 'fit', contains: 'padding', resize: true },\n data: baseData,\n background: backgroundColor ? getColorValue(backgroundColor, colorScheme) : undefined,\n };\n\n return { ...baseSpec, ...(spec || {}) };\n};\n\n/**\n * The inverse of `extractValues`. Given an array of Vega datasets and an object of key/value pairs\n * merge the values into the datasets.\n * @param data An array of Vega datasets\n * @param values An object of key/value pairs where the key is the dataset name and the value is\n * the array of values\n * @returns An array of Vega datasets with the values from the values object merged in\n */\nexport const mergeValuesIntoData = (data, values) => {\n return data.map((dataset) => {\n const datasetValues = values[dataset.name];\n if (datasetValues) {\n dataset.values = datasetValues;\n }\n return dataset;\n });\n};\n\n/**\n * returns the correct data field to use as the dimension\n * @param dimension\n * @param scaleType\n * @returns string\n */\nexport const getDimensionField = (dimension: string, scaleType?: ScaleType) => {\n return scaleType === 'time' ? DEFAULT_TRANSFORMED_TIME_DIMENSION : dimension;\n};\n\n/**\n * Gets the d3 format specifier for named number formats.\n * shortNumber and shortCurrency are not included since these require additional logic\n * @param numberFormat\n * @returns\n */\nexport const getD3FormatSpecifierFromNumberFormat = (numberFormat: NumberFormat | string): string => {\n switch (numberFormat) {\n case 'currency':\n return '$,.2f'; // currency format\n case 'standardNumber':\n return ','; // standard number format\n default:\n return numberFormat;\n }\n};\n\n/**\n * Merges the provided config with the Spectrum Vega config\n * @param config\n * @param colorScheme\n * @returns Vega config\n */\nexport function getChartConfig(config: Config | undefined, colorScheme: ColorScheme): Config {\n const defaultConfig = getSpectrumVegaConfig(colorScheme);\n if (config) {\n return mergeConfig(defaultConfig, config);\n }\n return defaultConfig;\n}\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { TextValueRef } from 'vega';\n\nimport { getD3FormatSpecifierFromNumberFormat } from './specUtils';\nimport { NumberFormat } from './types';\n\n/**\n * gets the number format tests and signals based on the numberFormat\n * @param numberFormat\n * @returns\n */\nexport const getTextNumberFormat = (\n numberFormat: NumberFormat | string,\n datumProperty: string = 'value',\n currencyLocale?: string,\n currencyCode?: string\n): ({\n test?: string;\n} & TextValueRef)[] => {\n const test = `isNumber(datum['${datumProperty}'])`;\n if (numberFormat === 'shortNumber') {\n return [{ test, signal: `formatShortNumber(datum['${datumProperty}'])` }];\n }\n if (numberFormat === 'shortCurrency') {\n return [\n {\n test: `${test} && abs(datum['${datumProperty}']) >= 1000`,\n signal: `upper(replace(format(datum['${datumProperty}'], '$.3~s'), /(\\\\d+)G/, '$1B'))`,\n },\n {\n test,\n signal: `format(datum['${datumProperty}'], '$')`,\n },\n ];\n }\n if (currencyCode && currencyLocale) {\n return [{ test, signal: `formatLocaleCurrency(datum, \"${currencyLocale}\", \"${currencyCode}\", \"${numberFormat}\")` }];\n }\n const d3FormatSpecifier = getD3FormatSpecifierFromNumberFormat(numberFormat);\n return [{ test, signal: `format(datum['${datumProperty}'], '${d3FormatSpecifier}')` }];\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\n\nimport { DEFAULT_TITLE_FONT_WEIGHT } from '@spectrum-charts/constants';\n\nimport { ScSpec, TitleOptions } from '../types';\n\nexport const addTitle = produce<ScSpec, [TitleOptions]>(\n (spec, { text, fontWeight = DEFAULT_TITLE_FONT_WEIGHT, position = 'middle', orient = 'top' }) => {\n spec.title = {\n text,\n fontWeight,\n anchor: position,\n frame: 'group',\n orient,\n };\n\n return spec;\n }\n);\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nexport * from './trendlineDataUtils';\nexport * from './trendlineMarkUtils';\nexport * from './trendlineScaleUtils';\nexport * from './trendlineSignalUtils';\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {\n AggregateOp,\n AggregateTransform,\n CollectTransform,\n ExtentTransform,\n FilterTransform,\n FormulaTransform,\n JoinAggregateTransform,\n LookupTransform,\n RegressionMethod,\n RegressionTransform,\n Transforms,\n WindowTransform,\n} from 'vega';\n\nimport { MS_PER_DAY, TRENDLINE_VALUE } from '@spectrum-charts/constants';\n\nimport { getFacetsFromOptions } from '../specUtils';\nimport { AggregateMethod, TrendlineMethod, TrendlineSpecOptions } from '../types';\nimport { TrendlineParentOptions, getPolynomialOrder, getRegressionExtent, isPolynomialMethod } from './trendlineUtils';\n\n/**\n * Gets the aggreagate transform used for calculating the average trendline\n * @param markOptions\n * @param trendlineSpecOptions\n * @param isHighResolutionData\n * @returns transform\n */\nexport const getAggregateTransform = (\n markOptions: TrendlineParentOptions,\n { method, trendlineDimension, trendlineMetric }: TrendlineSpecOptions,\n isHighResolutionData: boolean\n): AggregateTransform | JoinAggregateTransform => {\n const { color, lineType } = markOptions;\n const { facets } = getFacetsFromOptions({ color, lineType });\n const operations: Record<AggregateMethod, AggregateOp> = {\n average: 'mean',\n median: 'median',\n };\n if (isHighResolutionData) {\n return {\n type: 'aggregate',\n groupby: facets,\n ops: [operations[method], 'min', 'max'],\n fields: [trendlineMetric, trendlineDimension, trendlineDimension],\n as: [TRENDLINE_VALUE, `${trendlineDimension}Min`, `${trendlineDimension}Max`],\n };\n }\n return {\n type: 'joinaggregate',\n groupby: facets,\n ops: [operations[method]],\n fields: [trendlineMetric],\n as: [TRENDLINE_VALUE],\n };\n};\n\n/**\n * Gets the regression transform used for calculating the regression trendline.\n * Regression trendlines are ones that use the x value as a parameter\n * @see https://vega.github.io/vega/docs/transforms/regression/\n * @param markOptions\n * @param method\n * @param isHighResolutionData\n * @returns\n */\nexport const getRegressionTransform = (\n markOptions: TrendlineParentOptions,\n trendlineOptions: TrendlineSpecOptions,\n isHighResolutionData: boolean\n): RegressionTransform => {\n const { color, lineType } = markOptions;\n const { dimensionExtent, isDimensionNormalized, method, name, trendlineDimension, trendlineMetric } =\n trendlineOptions;\n const { facets } = getFacetsFromOptions({ color, lineType });\n\n let regressionMethod: RegressionMethod | undefined;\n let order: number | undefined;\n\n switch (method) {\n case 'exponential':\n regressionMethod = 'exp';\n break;\n case 'logarithmic':\n regressionMethod = 'log';\n break;\n case 'power':\n regressionMethod = 'pow';\n break;\n default:\n order = getPolynomialOrder(method);\n regressionMethod = 'poly';\n break;\n }\n\n return {\n type: 'regression',\n method: regressionMethod,\n order,\n groupby: facets,\n x: trendlineDimension,\n y: trendlineMetric,\n as: isHighResolutionData ? [trendlineDimension, TRENDLINE_VALUE] : undefined,\n params: !isHighResolutionData,\n extent: isHighResolutionData ? getRegressionExtent(dimensionExtent, name, isDimensionNormalized) : undefined,\n };\n};\n\n/**\n * Gets the window transform used for calculating the moving average trendline.\n * @param markOptions\n * @param method\n * @returns\n */\nexport const getWindowTransform = (\n markOptions: TrendlineParentOptions,\n { method, trendlineMetric }: TrendlineSpecOptions\n): WindowTransform => {\n const frameWidth = parseInt(method.split('-')[1]);\n\n const { color, lineType } = markOptions;\n const { facets } = getFacetsFromOptions({ color, lineType });\n\n if (isNaN(frameWidth) || frameWidth < 1) {\n throw new Error(`Invalid moving average frame width: ${frameWidth}, frame width must be an integer greater than 0`);\n }\n\n return {\n type: 'window',\n ops: ['mean'],\n groupby: facets,\n fields: [trendlineMetric],\n as: [TRENDLINE_VALUE],\n frame: [frameWidth - 1, 0],\n };\n};\n\n/**\n * Gets the transforms that will normalize the dimension.\n * The dimension gets normalized for time scales on regression methods. This makes the regression calculations far more accurate than using the raw time values\n * @param dimension\n * @returns\n */\nexport const getNormalizedDimensionTransform = (dimension: string): Transforms[] => [\n {\n type: 'joinaggregate',\n fields: [dimension],\n as: [`${dimension}Min`],\n ops: ['min'],\n },\n {\n type: 'formula',\n expr: `(datum.${dimension} - datum.${dimension}Min + ${MS_PER_DAY}) / ${MS_PER_DAY}`,\n as: `${dimension}Normalized`,\n },\n];\n\n/**\n * Gets an extent transform.\n * This is used to calculate the min and max of the dimension so that it can be used to set the extent of the regression trendline\n * @param dimension\n * @param name\n * @returns\n */\nexport const getRegressionExtentTransform = (dimension: string, name: string): ExtentTransform => ({\n type: 'extent',\n field: dimension,\n signal: `${name}_extent`,\n});\n\n/**\n * Gets the sort transform for the provided dimension.\n * This is used to sort window methods so they are calculated and drawn in the correct order\n * @param dimension\n * @returns CollectTransform\n */\nexport const getSortTransform = (dimension: string): CollectTransform => ({\n type: 'collect',\n sort: {\n field: dimension,\n },\n});\n\n/**\n * gets the filter transforms that will restrict the data to the dimension range\n * @param dimension\n * @param dimensionRange\n * @returns filterTansforms\n */\nexport const getTrendlineDimensionRangeTransforms = (\n dimension: string,\n dimensionRange: [number | null, number | null]\n): FilterTransform[] => {\n const filterExpressions: string[] = [];\n if (dimensionRange[0] !== null) {\n filterExpressions.push(`datum.${dimension} >= ${dimensionRange[0]}`);\n }\n if (dimensionRange[1] !== null) {\n filterExpressions.push(`datum.${dimension} <= ${dimensionRange[1]}`);\n }\n if (filterExpressions.length) {\n return [\n {\n type: 'filter',\n expr: filterExpressions.join(' && '),\n },\n ];\n }\n return [];\n};\n\n/**\n * This transform is used to calculate the value of the trendline using the coef and the dimension\n * @param trendlineDimension mark dimension\n * @param method trenline method\n * @returns formula transorfm\n */\nexport const getTrendlineParamFormulaTransforms = (\n trendlineDimension: string,\n method: TrendlineMethod\n): FormulaTransform[] => {\n let expr = '';\n if (isPolynomialMethod(method)) {\n const order = getPolynomialOrder(method);\n expr = [\n 'datum.coef[0]',\n ...Array(order)\n .fill(0)\n .map((_e, i) => `datum.coef[${i + 1}] * pow(datum.${trendlineDimension}, ${i + 1})`),\n ].join(' + ');\n } else if (method === 'exponential') {\n expr = `datum.coef[0] + exp(datum.coef[1] * datum.${trendlineDimension})`;\n } else if (method === 'logarithmic') {\n expr = `datum.coef[0] + datum.coef[1] * log(datum.${trendlineDimension})`;\n } else if (method === 'power') {\n expr = `datum.coef[0] * pow(datum.${trendlineDimension}, datum.coef[1])`;\n }\n\n if (!expr) return [];\n return [\n {\n type: 'formula',\n expr,\n as: TRENDLINE_VALUE,\n },\n ];\n};\n\n/**\n * Gets the lookup transform that will be used to lookup the coef for regression trendlines\n * @param markOptions\n * @param trendlineOptions\n * @returns LookupTransform\n */\nexport const getTrendlineParamLookupTransform = (\n { color, lineType }: TrendlineParentOptions,\n { name }: TrendlineSpecOptions\n): LookupTransform => {\n const { facets } = getFacetsFromOptions({ color, lineType });\n return {\n type: 'lookup',\n from: `${name}_params`,\n key: 'keys',\n fields: facets,\n values: ['coef'],\n };\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Data, SourceData, Transforms } from 'vega';\n\nimport {\n FILTERED_TABLE,\n HIGHLIGHTED_ITEM,\n HIGHLIGHTED_SERIES,\n SELECTED_ITEM,\n SELECTED_SERIES,\n SERIES_ID,\n} from '@spectrum-charts/constants';\n\nimport { getSeriesIdTransform, getTableData } from '../data/dataUtils';\nimport { isInteractive } from '../marks/markUtils';\nimport { getFacetsFromOptions } from '../specUtils';\nimport { TrendlineMethod, TrendlineSpecOptions } from '../types';\nimport {\n getAggregateTransform,\n getNormalizedDimensionTransform,\n getRegressionExtentTransform,\n getRegressionTransform,\n getSortTransform,\n getTrendlineDimensionRangeTransforms,\n getTrendlineParamFormulaTransforms,\n getTrendlineParamLookupTransform,\n getWindowTransform,\n} from './trendlineDataTransformUtils';\nimport {\n TrendlineParentOptions,\n getTrendlineDimensionMetric,\n getTrendlines,\n isAggregateMethod,\n isRegressionMethod,\n isWindowMethod,\n} from './trendlineUtils';\n\n/**\n * Adds the necessary data sources and transforms for the trendlines\n * NOTE: this function mutates the data array because it gets called from within a data produce function\n * @param data\n * @param markOptions\n */\nexport const addTrendlineData = (data: Data[], markOptions: TrendlineParentOptions) => {\n data.push(...getTrendlineData(markOptions));\n\n const tableData = getTableData(data);\n tableData.transform = addTableDataTransforms(tableData.transform ?? [], markOptions);\n};\n\n/**\n * Gets all the data sources and transforms for all trendlines\n * @param data\n * @param markOptions\n * @returns Data[]\n */\nexport const getTrendlineData = (markOptions: TrendlineParentOptions): SourceData[] => {\n const data: SourceData[] = [];\n const { color, idKey, lineType, name: markName } = markOptions;\n const trendlines = getTrendlines(markOptions);\n\n const concatenatedTrendlineData: { name: string; source: string[] } = {\n name: `${markName}_allTrendlineData`,\n source: [],\n };\n\n for (const trendlineOptions of trendlines) {\n const { displayOnHover, method, name } = trendlineOptions;\n const { facets } = getFacetsFromOptions({ color, lineType });\n\n if (isRegressionMethod(method)) {\n data.push(...getRegressionTrendlineData(markOptions, trendlineOptions, facets));\n } else if (isAggregateMethod(method)) {\n data.push(...getAggregateTrendlineData(markOptions, trendlineOptions, facets));\n } else if (isWindowMethod(method)) {\n data.push(getWindowTrendlineData(markOptions, trendlineOptions));\n }\n if (displayOnHover) {\n data.push(getTrendlineDisplayOnHoverData(name, method));\n }\n if (isInteractive(trendlineOptions)) {\n concatenatedTrendlineData.source.push(`${name}_data`);\n }\n }\n\n if (trendlines.some((trendline) => isInteractive(trendline))) {\n data.push(concatenatedTrendlineData);\n data.push(getHighlightTrendlineData(markName, idKey));\n }\n\n return data;\n};\n\n/**\n * Gets the data sources and transforms for aggregate trendlines (average, median)\n * @param markOptions\n * @param trendlineOptions\n * @param facets\n * @returns Data[]\n */\nexport const getAggregateTrendlineData = (\n markOptions: TrendlineParentOptions,\n trendlineOptions: TrendlineSpecOptions,\n facets: string[]\n) => {\n const data: SourceData[] = [];\n const { dimensionRange, name, trendlineDimension } = trendlineOptions;\n const dimensionRangeTransforms = getTrendlineDimensionRangeTransforms(trendlineDimension, dimensionRange);\n // high resolution data used for drawing the rule marks\n data.push({\n name: `${name}_highResolutionData`,\n source: FILTERED_TABLE,\n transform: [\n ...getExcludeDataKeyTransforms(trendlineOptions.excludeDataKeys),\n ...dimensionRangeTransforms,\n ...getTrendlineStatisticalTransforms(markOptions, trendlineOptions, true),\n ...getSeriesIdTransform(facets),\n ],\n });\n if (isInteractive(trendlineOptions)) {\n // data used for each of the trendline points\n data.push({\n name: `${name}_data`,\n source: FILTERED_TABLE,\n transform: [\n ...dimensionRangeTransforms,\n ...getTrendlineStatisticalTransforms(markOptions, trendlineOptions, false),\n ],\n });\n }\n return data;\n};\n\n/**\n * Gets the data sources and transforms for regression trendlines (linear, power, polynomial-x, etc.)\n * @param markOptions\n * @param trendlineOptions\n * @param facets\n * @returns Data[]\n */\nexport const getRegressionTrendlineData = (\n markOptions: TrendlineParentOptions,\n trendlineOptions: TrendlineSpecOptions,\n facets: string[]\n) => {\n const data: SourceData[] = [];\n const { dimension, metric } = markOptions;\n const { dimensionRange, method, name, orientation, trendlineDimension } = trendlineOptions;\n const { trendlineDimension: standardTrendlineDimension } = getTrendlineDimensionMetric(\n dimension,\n metric,\n orientation,\n false\n );\n const dimensionRangeTransforms = getTrendlineDimensionRangeTransforms(standardTrendlineDimension, dimensionRange);\n // high resolution data used for drawing the smooth trendline\n data.push({\n name: `${name}_highResolutionData`,\n source: FILTERED_TABLE,\n transform: [\n ...getExcludeDataKeyTransforms(trendlineOptions.excludeDataKeys),\n ...dimensionRangeTransforms,\n ...getTrendlineStatisticalTransforms(markOptions, trendlineOptions, true),\n ...getSeriesIdTransform(facets),\n ],\n });\n if (isInteractive(trendlineOptions)) {\n // params and data used for each of the trendline data points\n // the high resolution data has too much detail and we don't want a tooltip at each high resolution point\n data.push(\n {\n name: `${name}_params`,\n source: FILTERED_TABLE,\n transform: [\n ...dimensionRangeTransforms,\n ...getTrendlineStatisticalTransforms(markOptions, trendlineOptions, false),\n ],\n },\n {\n name: `${name}_data`,\n source: FILTERED_TABLE,\n transform: [\n ...dimensionRangeTransforms,\n getTrendlineParamLookupTransform(markOptions, trendlineOptions),\n ...getTrendlineParamFormulaTransforms(trendlineDimension, method),\n ],\n }\n );\n }\n return data;\n};\n\n/**\n * Gets the data source and transforms for window trendlines (movingAverage-x)\n * @param markOptions\n * @param trendlineOptions\n * @returns Data\n */\nconst getWindowTrendlineData = (\n markOptions: TrendlineParentOptions,\n trendlineOptions: TrendlineSpecOptions\n): SourceData => ({\n name: `${trendlineOptions.name}_data`,\n source: FILTERED_TABLE,\n transform: [\n ...getExcludeDataKeyTransforms(trendlineOptions.excludeDataKeys),\n ...getTrendlineStatisticalTransforms(markOptions, trendlineOptions, false),\n ...getTrendlineDimensionRangeTransforms(markOptions.dimension, trendlineOptions.dimensionRange),\n ],\n});\n\n/**\n * gets the data source and transforms for highlighting trendlines\n * @param markName\n * @param trendlines\n * @returns Data\n */\nconst getHighlightTrendlineData = (markName: string, idKey: string): SourceData => {\n const expr = `${SELECTED_ITEM} === datum.${idKey} || !isValid(${SELECTED_ITEM}) && (isArray(${HIGHLIGHTED_ITEM}) && indexof(${HIGHLIGHTED_ITEM}, datum.${idKey}) || ${HIGHLIGHTED_ITEM} === datum.${idKey})`;\n return {\n name: `${markName}Trendline_highlightedData`,\n source: `${markName}_allTrendlineData`,\n transform: [\n {\n type: 'filter',\n expr,\n },\n ],\n };\n};\n\n/**\n * Gets the statistical transforms that will calculate the trendline values\n * @param markOptions\n * @param trendlineOptions\n * @returns dataTransforms\n */\nexport const getTrendlineStatisticalTransforms = (\n markOptions: TrendlineParentOptions,\n trendlineOptions: TrendlineSpecOptions,\n isHighResolutionData: boolean\n): Transforms[] => {\n const { method, trendlineDimension } = trendlineOptions;\n\n if (isAggregateMethod(method)) {\n return [getAggregateTransform(markOptions, trendlineOptions, isHighResolutionData)];\n }\n if (isRegressionMethod(method)) {\n return [getRegressionTransform(markOptions, trendlineOptions, isHighResolutionData)];\n }\n if (isWindowMethod(method)) {\n return [getSortTransform(trendlineDimension), getWindowTransform(markOptions, trendlineOptions)];\n }\n\n return [];\n};\n\n/**\n * Adds the table data transforms needed for trendlines\n * @param transforms\n * @param markOptions\n */\nexport const addTableDataTransforms = produce<Transforms[], [TrendlineParentOptions]>((transforms, markOptions) => {\n const { dimension, metric } = markOptions;\n\n const trendlines = getTrendlines(markOptions);\n for (const { isDimensionNormalized, method, name, orientation, trendlineDimension } of trendlines) {\n if (isRegressionMethod(method)) {\n // time scales need to be normalized for regression trendlines\n const { trendlineDimension: standardTrendlinDimension } = getTrendlineDimensionMetric(\n dimension,\n metric,\n orientation,\n false\n );\n\n if (isDimensionNormalized) {\n if (\n !transforms.some(\n (transform) => 'as' in transform && transform.as === `${standardTrendlinDimension}Normalized`\n )\n ) {\n transforms.push(...getNormalizedDimensionTransform(standardTrendlinDimension));\n }\n }\n // add the extent transform\n transforms.push(getRegressionExtentTransform(trendlineDimension, name));\n }\n }\n});\n\n/**\n * Gets the data source and transforms for displaying the trendline on hover\n * @param trendlineName\n * @param method\n * @returns SourceData\n */\nexport const getTrendlineDisplayOnHoverData = (trendlineName: string, method: TrendlineMethod): SourceData => {\n const source = isWindowMethod(method) ? `${trendlineName}_data` : `${trendlineName}_highResolutionData`;\n return {\n name: `${trendlineName}_highlightedData`,\n source,\n transform: [\n {\n type: 'filter',\n expr: `datum.${SERIES_ID} === ${HIGHLIGHTED_SERIES} || datum.${SERIES_ID} === ${SELECTED_SERIES}`,\n },\n ],\n };\n};\n\nconst getExcludeDataKeyTransforms = (excludeDataKeys?: string[]): Transforms[] =>\n excludeDataKeys?.map((excludeDataKey) => ({\n type: 'filter',\n expr: `!datum.${excludeDataKey}`,\n })) ?? [];\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { EncodeEntry, GroupMark, LineMark, NumericValueRef, RuleMark } from 'vega';\n\nimport { TRENDLINE_VALUE } from '@spectrum-charts/constants';\n\nimport { getLineHoverMarks, getLineOpacity } from '../line/lineMarkUtils';\nimport { LineMarkOptions } from '../line/lineUtils';\nimport {\n getColorProductionRule,\n getLineWidthProductionRule,\n getOpacityProductionRule,\n getStrokeDashProductionRule,\n hasTooltip,\n} from '../marks/markUtils';\nimport { getScaleName } from '../scale/scaleSpecBuilder';\nimport { getFacetsFromOptions } from '../specUtils';\nimport { getTrendlineAnnotationMarks } from '../trendlineAnnotation';\nimport { Orientation, ScaleType, TrendlineMethod, TrendlineSpecOptions } from '../types';\nimport {\n TrendlineParentOptions,\n getTrendlineColorFromMarkOptions,\n getTrendlineLineTypeFromMarkOptions,\n getTrendlines,\n isAggregateMethod,\n isRegressionMethod,\n} from './trendlineUtils';\n\nexport const getTrendlineMarks = (markOptions: TrendlineParentOptions): (GroupMark | RuleMark)[] => {\n const { color, lineType } = markOptions;\n const { facets } = getFacetsFromOptions({ color, lineType });\n\n const marks: (GroupMark | RuleMark)[] = [];\n const trendlines = getTrendlines(markOptions);\n for (const trendlineOptions of trendlines) {\n const { displayOnHover, method, name } = trendlineOptions;\n if (isAggregateMethod(method)) {\n marks.push(getTrendlineRuleMark(markOptions, trendlineOptions));\n } else {\n const data = getDataSourceName(name, method, displayOnHover);\n marks.push({\n name: `${name}_group`,\n type: 'group',\n clip: true,\n from: {\n facet: {\n name: `${name}_facet`,\n data,\n groupby: facets,\n },\n },\n marks: [getTrendlineLineMark(markOptions, trendlineOptions)],\n });\n }\n marks.push(...getTrendlineAnnotationMarks(trendlineOptions, markOptions.name));\n }\n\n if (trendlines.some((trendline) => hasTooltip(trendline))) {\n marks.push(\n getTrendlineHoverMarks(\n markOptions,\n trendlines.some((trendlineOptions) => trendlineOptions.highlightRawPoint)\n )\n );\n }\n\n return marks;\n};\n\nconst getDataSourceName = (trendlineName: string, method: TrendlineMethod, displayOnHover: boolean): string => {\n if (displayOnHover) return `${trendlineName}_highlightedData`;\n if (isRegressionMethod(method)) return `${trendlineName}_highResolutionData`;\n return `${trendlineName}_data`;\n};\n\n/**\n * gets the trendline rule mark used for aggregate methods (mean, median)\n * @param markOptions\n * @param trendlineOptions\n * @returns rule mark\n */\nexport const getTrendlineRuleMark = (\n markOptions: TrendlineParentOptions,\n trendlineOptions: TrendlineSpecOptions\n): RuleMark => {\n const { colorScheme } = markOptions;\n const {\n dimensionExtent,\n dimensionScaleType,\n displayOnHover,\n lineType,\n lineWidth,\n name,\n orientation,\n trendlineColor,\n trendlineDimension,\n } = trendlineOptions;\n\n const data = displayOnHover ? `${name}_highlightedData` : `${name}_highResolutionData`;\n\n return {\n name,\n type: 'rule',\n clip: true,\n from: {\n data,\n },\n interactive: false,\n encode: {\n enter: {\n ...getRuleYEncodings(dimensionExtent, trendlineDimension, orientation),\n stroke: getColorProductionRule(trendlineColor, colorScheme),\n strokeDash: getStrokeDashProductionRule({ value: lineType }),\n strokeOpacity: getOpacityProductionRule({ value: trendlineOptions.opacity }),\n strokeWidth: getLineWidthProductionRule({ value: lineWidth }),\n },\n update: {\n ...getRuleXEncodings(dimensionExtent, trendlineDimension, dimensionScaleType, orientation),\n opacity: getLineOpacity(getLineMarkOptions(markOptions, trendlineOptions)),\n },\n },\n };\n};\n\n/**\n * gets the production rules for the y and y2 encoding of a rule mark\n * @param dimensionExtent\n * @param dimension\n * @param orientation\n * @returns x production rules\n */\nexport const getRuleYEncodings = (\n dimensionExtent: TrendlineSpecOptions['dimensionExtent'],\n dimension: string,\n orientation: Orientation\n): EncodeEntry => {\n if (orientation === 'horizontal') {\n return { y: { scale: 'yLinear', field: TRENDLINE_VALUE } };\n }\n return {\n y: getStartDimensionExtentProductionRule(dimensionExtent[0], dimension, 'yLinear', 'y'),\n y2: getEndDimensionExtentProductionRule(dimensionExtent[1], dimension, 'yLinear', 'y'),\n };\n};\n\n/**\n * gets the production rules for the x and x2 encoding of a rule mark\n * @param dimensionExtent\n * @param dimension\n * @param scaleType\n * @param orientation\n * @returns x production rules\n */\nexport const getRuleXEncodings = (\n dimensionExtent: TrendlineSpecOptions['dimensionExtent'],\n dimension: string,\n scaleType: ScaleType,\n orientation: Orientation\n): EncodeEntry => {\n const scale = getScaleName('x', scaleType);\n if (orientation === 'vertical') {\n return { x: { scale, field: TRENDLINE_VALUE } };\n }\n return {\n x: getStartDimensionExtentProductionRule(dimensionExtent[0], dimension, scale, 'x'),\n x2: getEndDimensionExtentProductionRule(dimensionExtent[1], dimension, scale, 'x'),\n };\n};\n\n/**\n * Gets the production rule for the start dimension extent of a trendline\n * @param startDimensionExtent\n * @param dimension\n * @param scale\n * @param axis\n * @returns\n */\nexport const getStartDimensionExtentProductionRule = (\n startDimensionExtent: number | 'domain' | null,\n dimension: string,\n scale: string,\n axis: 'x' | 'y'\n): NumericValueRef => {\n switch (startDimensionExtent) {\n case null:\n return { scale, field: `${dimension}Min` };\n case 'domain':\n if (axis === 'x') return { value: 0 };\n return { signal: 'height' };\n default:\n return { scale, value: startDimensionExtent };\n }\n};\n\n/**\n * gets the production rule for the end dimension extent of a trendline\n * @param endDimensionExtent\n * @param dimension\n * @param scale\n * @param axis\n * @returns\n */\nexport const getEndDimensionExtentProductionRule = (\n endDimensionExtent: number | 'domain' | null,\n dimension: string,\n scale: string,\n axis: 'x' | 'y'\n): NumericValueRef => {\n switch (endDimensionExtent) {\n case null:\n return { scale, field: `${dimension}Max` };\n case 'domain':\n if (axis === 'x') return { signal: 'width' };\n return { value: 0 };\n default:\n return { scale, value: endDimensionExtent };\n }\n};\n\n/**\n * gets the trendline line mark used for regression and window methods\n * @param markOptions\n * @param trendlineOptions\n * @returns\n */\nexport const getTrendlineLineMark = (\n markOptions: TrendlineParentOptions,\n trendlineOptions: TrendlineSpecOptions\n): LineMark => {\n const { colorScheme } = markOptions;\n const {\n dimensionScaleType,\n isDimensionNormalized,\n lineType,\n lineWidth,\n name,\n orientation,\n trendlineColor,\n trendlineDimension,\n } = trendlineOptions;\n\n return {\n name,\n type: 'line',\n from: { data: `${name}_facet` },\n interactive: false,\n encode: {\n enter: {\n y: getLineYProductionRule(trendlineDimension, orientation),\n stroke: getColorProductionRule(trendlineColor, colorScheme),\n strokeDash: getStrokeDashProductionRule({ value: lineType }),\n strokeOpacity: getOpacityProductionRule({ value: trendlineOptions.opacity }),\n strokeWidth: getLineWidthProductionRule({ value: lineWidth }),\n },\n update: {\n x: getLineXProductionRule(trendlineDimension, dimensionScaleType, orientation, isDimensionNormalized),\n opacity: getLineOpacity(getLineMarkOptions(markOptions, trendlineOptions)),\n },\n },\n };\n};\n\n/**\n * gets the production rule for the y encoding of a line mark\n * @param trendlineDimension\n * @param orientation\n * @returns\n */\nexport const getLineYProductionRule = (trendlineDimension: string, orientation: Orientation): NumericValueRef => {\n const scale = 'yLinear';\n if (orientation === 'horizontal') {\n return { scale, field: TRENDLINE_VALUE };\n }\n return { scale, field: trendlineDimension };\n};\n\n/**\n * gets the production rule for the x encoding of a line mark\n * @param trendlineDimension\n * @param scaleType\n * @param orientation\n * @param isDimensionNormalized\n * @returns\n */\nexport const getLineXProductionRule = (\n trendlineDimension: string,\n scaleType: ScaleType,\n orientation: Orientation,\n isDimensionNormalized: boolean\n): NumericValueRef => {\n const scale = getScaleName('x', scaleType);\n if (orientation === 'vertical') {\n return { scale, field: TRENDLINE_VALUE };\n }\n return isDimensionNormalized\n ? { scale: 'xTrendline', field: trendlineDimension }\n : { scale, field: trendlineDimension };\n};\n\nconst getTrendlineHoverMarks = (markOptions: TrendlineParentOptions, highlightRawPoint: boolean): GroupMark => {\n const { metric, name } = markOptions;\n const trendlines = getTrendlines(markOptions);\n const trendlineHoverOptions = getLineMarkOptions(markOptions, trendlines[0], {\n name: `${name}Trendline`,\n chartTooltips: trendlines.map((trendline) => trendline.chartTooltips).flat(),\n metric: TRENDLINE_VALUE,\n });\n\n return {\n name: `${name}Trendline_hoverGroup`,\n type: 'group',\n clip: true,\n marks: getLineHoverMarks(trendlineHoverOptions, `${name}_allTrendlineData`, highlightRawPoint ? metric : undefined),\n };\n};\n\nconst getLineMarkOptions = (\n markOptions: TrendlineParentOptions,\n { dimensionScaleType, displayOnHover, lineWidth, metric, name, opacity }: TrendlineSpecOptions,\n override?: Partial<LineMarkOptions>\n): LineMarkOptions => {\n const { color, lineType } = markOptions;\n const popoverMarkName = 'popoverMarkName' in markOptions ? markOptions.popoverMarkName : undefined;\n const staticPoint = 'staticPoint' in markOptions ? markOptions.staticPoint : undefined;\n return {\n ...markOptions,\n color: getTrendlineColorFromMarkOptions(color),\n displayOnHover,\n lineType: getTrendlineLineTypeFromMarkOptions(lineType),\n lineWidth: { value: lineWidth },\n metric,\n name,\n opacity: { value: opacity },\n popoverMarkName,\n scaleType: dimensionScaleType,\n staticPoint,\n\n ...override,\n };\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Scale } from 'vega';\n\nimport { FILTERED_TABLE, LINEAR_PADDING } from '@spectrum-charts/constants';\n\nimport { TrendlineParentOptions, hasTrendlineWithNormalizedDimension } from './trendlineUtils';\n\n/**\n * Gets all the scales used for trendlines\n * @param options\n * @returns Scale[]\n */\nexport const getTrendlineScales = (options: TrendlineParentOptions): Scale[] => {\n const { dimension } = options;\n\n // if there is a trendline that requires a normalized dimension, add the scale\n if (hasTrendlineWithNormalizedDimension(options)) {\n return [\n {\n name: 'xTrendline',\n type: 'linear',\n range: 'width',\n domain: { data: FILTERED_TABLE, fields: [`${dimension}Normalized`] },\n padding: LINEAR_PADDING,\n zero: false,\n nice: false,\n },\n ];\n }\n return [];\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Signal } from 'vega';\n\nimport { hasTooltip } from '../marks/markUtils';\nimport { addHighlightedItemSignalEvents, addHighlightedSeriesSignalEvents } from '../signal/signalSpecBuilder';\nimport { TrendlineParentOptions, getTrendlines } from './trendlineUtils';\n\nexport const setTrendlineSignals = (signals: Signal[], markOptions: TrendlineParentOptions): void => {\n const { idKey, name: markName } = markOptions;\n const trendlines = getTrendlines(markOptions);\n\n if (trendlines.some((trendline) => hasTooltip(trendline))) {\n addHighlightedItemSignalEvents(signals, `${markName}Trendline_voronoi`, idKey, 2);\n addHighlightedSeriesSignalEvents(signals, `${markName}Trendline_voronoi`, 2);\n }\n\n if (trendlines.some((trendline) => trendline.displayOnHover)) {\n addHighlightedSeriesSignalEvents(signals, `${markName}_voronoi`, 2);\n }\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { SignalRef } from 'vega';\n\nimport { FILTERED_TABLE, MS_PER_DAY, TRENDLINE_VALUE } from '@spectrum-charts/constants';\n\nimport {\n AggregateMethod,\n BarSpecOptions,\n ColorFacet,\n LineSpecOptions,\n LineTypeFacet,\n Orientation,\n RegressionMethod as RscRegressionMethod,\n ScaleType,\n ScatterSpecOptions,\n TrendlineMethod,\n TrendlineOptions,\n TrendlineSpecOptions,\n WindowMethod,\n} from '../types';\n\n/** These are all the spec options that currently support trendlines */\nexport type TrendlineParentOptions = LineSpecOptions | ScatterSpecOptions | BarSpecOptions;\n\n/**\n * gets all the trendlines from the children and applies all the default trendline options\n * @param children\n * @param markName\n * @returns TrendlineSpecOptions[]\n */\nexport const getTrendlines = (markOptions: TrendlineParentOptions): TrendlineSpecOptions[] => {\n return markOptions.trendlines.map((trendline, index) => applyTrendlinePropDefaults(markOptions, trendline, index));\n};\n\n/**\n * applies all the default trendline options\n * @param param0\n * @param markName\n * @param index\n * @returns TrendlineSpecOptions\n */\nexport const applyTrendlinePropDefaults = (\n markOptions: TrendlineParentOptions,\n {\n chartTooltips = [],\n color,\n dimensionExtent,\n dimensionRange = [null, null],\n displayOnHover = false,\n highlightRawPoint = false,\n lineType = 'dashed',\n lineWidth = 'M',\n method = 'linear',\n opacity = 1,\n orientation = 'horizontal',\n trendlineAnnotations = [],\n ...opts\n }: TrendlineOptions,\n index: number\n): TrendlineSpecOptions => {\n const dimensionScaleType = getTrendlineScaleType(markOptions, orientation);\n const isDimensionNormalized =\n dimensionScaleType === 'time' && isRegressionMethod(method) && orientation === 'horizontal';\n const { trendlineDimension, trendlineMetric } = getTrendlineDimensionMetric(\n markOptions.dimension,\n markOptions.metric,\n orientation,\n isDimensionNormalized\n );\n const trendlineColor = color ? { value: color } : getTrendlineColorFromMarkOptions(markOptions.color);\n return {\n chartTooltips,\n colorScheme: markOptions.colorScheme,\n displayOnHover,\n dimensionExtent: dimensionExtent ?? dimensionRange,\n dimensionRange,\n dimensionScaleType,\n highlightRawPoint,\n isDimensionNormalized,\n lineType,\n lineWidth,\n method,\n metric: TRENDLINE_VALUE,\n name: `${markOptions.name}Trendline${index}`,\n opacity,\n orientation,\n trendlineAnnotations,\n trendlineColor,\n trendlineDimension,\n trendlineMetric,\n ...opts,\n };\n};\n\n/**\n * Gets the color from the parent options.\n * Simplifies dual facet colors into a single facet\n * @param color\n * @returns color\n */\nexport const getTrendlineColorFromMarkOptions = (color: TrendlineParentOptions['color']): ColorFacet => {\n return Array.isArray(color) ? color[0] : color;\n};\n\n/**\n * Gets the color from the parent options.\n * Simplifies dual facet colors into a single facet\n * @param lineType\n * @returns color\n */\nexport const getTrendlineLineTypeFromMarkOptions = (lineType: TrendlineParentOptions['lineType']): LineTypeFacet => {\n return Array.isArray(lineType) ? lineType[0] : lineType;\n};\n\n/**\n * Gets the metric and dimension for the trendline, taking into account the orientation.\n * if isDimensionNormalized is true, the trendlineDimension will have `Normalized` appended to it\n * @param dimension\n * @param metric\n * @param orientation\n * @param isDimensionNormalized\n * @returns \\{trendlineDimension: string, trendlineMetric: string}\n */\nexport const getTrendlineDimensionMetric = (\n dimension: string,\n metric: string,\n orientation: Orientation,\n isDimensionNormalized: boolean\n): { trendlineDimension: string; trendlineMetric: string } => {\n return orientation === 'horizontal'\n ? {\n trendlineDimension: normalizeTrendlineDimensionName(dimension, isDimensionNormalized),\n trendlineMetric: metric,\n }\n : {\n trendlineDimension: metric,\n trendlineMetric: dimension,\n };\n};\n\n/**\n * If the dimension should be normalized, returns the normalized dimension name, otherwise returns the original dimension\n * @param dimension\n * @param method\n * @param scaleType\n * @returns dimension name\n */\nexport const normalizeTrendlineDimensionName = (dimension: string, isDimensionNormalized: boolean) =>\n isDimensionNormalized ? `${dimension}Normalized` : dimension;\n\n/**\n * determines if the supplied method is an aggregate method (average, median)\n * @see https://vega.github.io/vega/docs/transforms/aggregate/\n * @param method\n * @returns boolean\n */\nexport const isAggregateMethod = (method: TrendlineMethod): method is AggregateMethod =>\n ['average', 'median'].includes(method);\n\n/**\n * determines if the supplied method is a regression method\n * @see https://vega.github.io/vega/docs/transforms/regression/\n * @param method\n * @returns boolean\n */\nexport const isRegressionMethod = (method: TrendlineMethod): method is RscRegressionMethod =>\n isPolynomialMethod(method) || ['exponential', 'logarithmic', 'power'].includes(method);\n\n/**\n * determines if the supplied method is a windowing method\n * @see https://vega.github.io/vega/docs/transforms/window/\n * @param method\n * @returns boolean\n */\nexport const isWindowMethod = (method: TrendlineMethod): method is WindowMethod => method.startsWith('movingAverage-');\n\n/**\n * determines if the supplied method is a polynomial method\n * @see https://vega.github.io/vega/docs/transforms/regression/\n * @param method\n * @returns boolean\n */\nexport const isPolynomialMethod = (method: TrendlineMethod): boolean =>\n method.startsWith('polynomial-') || ['linear', 'quadratic'].includes(method);\n\n/**\n * determines if any trendlines use the normalized dimension\n * @param markOptions\n * @returns boolean\n */\nexport const hasTrendlineWithNormalizedDimension = (markOptions: TrendlineParentOptions): boolean => {\n const trendlines = getTrendlines(markOptions);\n\n // only need to add the normalized dimension transform if there is a regression trendline and the dimension scale type is time\n return trendlines.some(\n ({ dimensionScaleType, method }) => isRegressionMethod(method) && dimensionScaleType === 'time'\n );\n};\n\n/**\n * gets the order of the polynomial\n * y = a + b * x + … + k * pow(x, order)\n * @see https://vega.github.io/vega/docs/transforms/regression/\n * @param method trendline method\n * @returns order\n */\nexport const getPolynomialOrder = (method: TrendlineMethod): number => {\n // method is one of the named polynomial methods\n switch (method) {\n case 'linear':\n return 1;\n case 'quadratic':\n return 2;\n }\n\n // method is of the form polynomial-<order>\n const order = parseInt(method.split('-')[1]);\n if (order < 1) {\n throw new Error(`Invalid polynomial order: ${order}, order must be an interger greater than 0`);\n }\n return order;\n};\n\n/**\n * gets the extent used in the regression transform\n * @param dimensionExtent\n * @param name\n * @param isNormalized\n * @returns\n */\nexport const getRegressionExtent = (\n dimensionExtent: TrendlineSpecOptions['dimensionExtent'],\n name: string,\n isNormalized: boolean\n): SignalRef => {\n const extentName = `${name}_extent`;\n const extentSignal = dimensionExtent\n .map((value, i) => {\n switch (value) {\n case null:\n return `${extentName}[${i}]`;\n case 'domain':\n return `${extentName}[${i}] ${i === 0 ? '-' : '+'} (${extentName}[1] - ${extentName}[0]) * 0.3`;\n default:\n // if this is a normalized date, we need to normalize the value\n if (isNormalized) {\n return `(${value} - data('${FILTERED_TABLE}')[0].datetimeMin + ${MS_PER_DAY}) / ${MS_PER_DAY}`;\n }\n return value;\n }\n })\n .join(', ');\n\n return { signal: `[${extentSignal}]` };\n};\n\nexport const getTrendlineScaleType = (\n markOptions: TrendlineParentOptions,\n trendlineOrientation: Orientation\n): ScaleType => {\n // y axis only support linear... for now...\n if (trendlineOrientation === 'vertical') return 'linear';\n return 'scaleType' in markOptions ? markOptions.scaleType : markOptions.dimensionScaleType;\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nexport * from './trendlineAnnotationUtils';\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { ColorValueRef, GroupMark, NumericValueRef, ProductionRule, RectMark, SymbolMark, TextMark } from 'vega';\n\nimport { TRENDLINE_VALUE } from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { getColorProductionRule, getColorProductionRuleSignalString } from '../marks/markUtils';\nimport { getScaleName } from '../scale/scaleSpecBuilder';\nimport { getLineWidthPixelsFromLineWidth } from '../specUtils';\nimport {\n getEndDimensionExtentProductionRule,\n getStartDimensionExtentProductionRule,\n} from '../trendline/trendlineMarkUtils';\nimport { ColorFacet, TrendlineAnnotationOptions, TrendlineAnnotationSpecOptions, TrendlineSpecOptions } from '../types';\n\n/**\n * Applies all trendline annotation defaults\n * @param trenlineAnnotationOptions\n * @param index\n * @param trendlineOptions\n * @param markName\n * @returns TrendlineAnnotationSpecOptions\n */\nexport const getTrendlineAnnotationSpecOptions = (\n { badge = false, dimensionValue = 'end', numberFormat = '', prefix = '' }: TrendlineAnnotationOptions,\n index: number,\n {\n colorScheme,\n dimensionExtent,\n dimensionScaleType,\n displayOnHover,\n lineWidth,\n orientation,\n trendlineColor,\n trendlineDimension,\n name: trendlineName,\n }: TrendlineSpecOptions,\n markName: string\n): TrendlineAnnotationSpecOptions => ({\n badge,\n colorScheme,\n dimensionValue,\n displayOnHover,\n markName,\n name: `${trendlineName}Annotation${index}`,\n numberFormat,\n prefix,\n trendlineColor,\n trendlineDimension,\n trendlineDimensionExtent: dimensionExtent,\n trendlineDimensionScaleType: dimensionScaleType,\n trendlineName: trendlineName,\n trendlineOrientation: orientation,\n trendlineWidth: getLineWidthPixelsFromLineWidth(lineWidth),\n});\n\n/**\n * Gets all the annotations on a trendline\n * @param trendlineOptions\n * @param markName\n * @returns TrendlineAnnotationSpecOptions[]\n */\nexport const getTrendlineAnnotations = (\n trendlineOptions: TrendlineSpecOptions,\n markName: string\n): TrendlineAnnotationSpecOptions[] => {\n return trendlineOptions.trendlineAnnotations.map((annotationOptions, index) =>\n getTrendlineAnnotationSpecOptions(annotationOptions, index, trendlineOptions, markName)\n );\n};\n\n/**\n * Gets all the trendline annotation marks\n * @param trendlineOptions\n * @param markName\n * @returns GroupMark[]\n */\nexport const getTrendlineAnnotationMarks = (trendlineOptions: TrendlineSpecOptions, markName: string): GroupMark[] => {\n const marks: GroupMark[] = [];\n const annotations = getTrendlineAnnotations(trendlineOptions, markName);\n\n annotations.forEach((annotation) => {\n marks.push({\n name: `${annotation.name}_group`,\n type: 'group',\n interactive: false,\n marks: [\n getTrendlineAnnotationPoints(annotation),\n getTrendlineAnnotationTextMark(annotation),\n ...getTrendlineAnnotationBadgeMark(annotation),\n ],\n });\n });\n return marks;\n};\n\n/**\n * Gets the annotation points\n * @param trendlineAnnotationOptions\n * @returns SymbolMark\n */\nconst getTrendlineAnnotationPoints = (annotationOptions: TrendlineAnnotationSpecOptions): SymbolMark => {\n const { name, trendlineName, trendlineWidth, displayOnHover } = annotationOptions;\n const data = displayOnHover ? `${trendlineName}_highlightedData` : `${trendlineName}_highResolutionData`;\n return {\n name: `${name}_points`,\n type: 'symbol',\n from: { data },\n interactive: false,\n encode: {\n enter: {\n opacity: { value: 0 },\n size: { value: Math.pow(trendlineWidth, 2) },\n x: getTrendlineAnnotationPointX(annotationOptions),\n y: getTrendlineAnnotationPointY(annotationOptions),\n },\n },\n };\n};\n\n/**\n * Gets the correct x rule for the annotation point\n * @param trendlineAnnotationOptions\n * @returns NumericValueRef\n */\nexport const getTrendlineAnnotationPointX = ({\n dimensionValue,\n trendlineDimension,\n trendlineDimensionExtent,\n trendlineDimensionScaleType,\n trendlineOrientation,\n}: TrendlineAnnotationSpecOptions): NumericValueRef => {\n const scale = getScaleName('x', trendlineDimensionScaleType);\n if (trendlineOrientation === 'vertical') {\n return { scale, field: TRENDLINE_VALUE };\n }\n switch (dimensionValue) {\n case 'start':\n return getStartDimensionExtentProductionRule(trendlineDimensionExtent[0], trendlineDimension, scale, 'x');\n case 'end':\n return getEndDimensionExtentProductionRule(trendlineDimensionExtent[1], trendlineDimension, scale, 'x');\n default:\n return { scale, value: dimensionValue };\n }\n};\n\n/**\n * Gets the correct y rule for the annotation point\n * @param trendlineAnnotationOptions\n * @returns NumericValueRef\n */\nexport const getTrendlineAnnotationPointY = ({\n dimensionValue,\n trendlineDimension,\n trendlineDimensionExtent,\n trendlineOrientation,\n}: TrendlineAnnotationSpecOptions): NumericValueRef => {\n const scale = 'yLinear';\n if (trendlineOrientation === 'horizontal') {\n return { scale, field: TRENDLINE_VALUE };\n }\n switch (dimensionValue) {\n case 'start':\n return getStartDimensionExtentProductionRule(trendlineDimensionExtent[0], trendlineDimension, scale, 'y');\n case 'end':\n return getEndDimensionExtentProductionRule(trendlineDimensionExtent[1], trendlineDimension, scale, 'y');\n default:\n return { scale, value: dimensionValue };\n }\n};\n\n/**\n * Gets the annotation text mark\n * @param trendlineAnnotationOptions\n * @returns TextMark\n */\nexport const getTrendlineAnnotationTextMark = (annotation: TrendlineAnnotationSpecOptions): TextMark => {\n const { name, numberFormat, prefix, trendlineName, markName } = annotation;\n const textPrefix = prefix ? `'${prefix} ' + ` : '';\n const fill = getTextFill({ ...annotation });\n return {\n name,\n type: 'text',\n from: { data: `${name}_points` },\n zindex: 1, // this will draw the text in front of the badge\n interactive: false,\n encode: {\n enter: {\n text: { signal: `${textPrefix}format(datum.datum.${TRENDLINE_VALUE}, '${numberFormat}')` },\n fill,\n },\n },\n transform: [\n {\n type: 'label',\n size: { signal: '[width, height]' },\n avoidMarks: [trendlineName, `${markName}_group`],\n offset: [6, 6, 6, 6, 8.49, 8.49, 8.49, 8.49],\n anchor: ['top', 'bottom', 'right', 'left', 'top-right', 'top-left', 'bottom-right', 'bottom-left'],\n },\n ],\n };\n};\n\n/**\n * Get's the encoding for the annotation text fill.\n * Includes a color contrast check to ensure the text is visually a11y.\n * @param trendlineAnnotationOptions\n * @returns fill ProductionRule\n */\nexport const getTextFill = ({\n badge,\n colorScheme,\n trendlineColor,\n}: TrendlineAnnotationSpecOptions): ProductionRule<ColorValueRef> | undefined => {\n if (!badge) {\n // by returning undefined, the rsc config will be used\n return undefined;\n }\n const color = getColorKey(trendlineColor);\n const colorString = getColorProductionRuleSignalString(color, colorScheme);\n const textColors = [getColorValue('gray-50', colorScheme), getColorValue('gray-900', colorScheme)];\n return [\n { test: `contrast(${colorString}, '${textColors[0]}') >= 4.5`, value: textColors[0] },\n { value: textColors[1] },\n ];\n};\n\nexport const getTrendlineAnnotationBadgeMark = ({\n badge,\n colorScheme,\n name,\n trendlineColor,\n}: TrendlineAnnotationSpecOptions): RectMark[] => {\n if (!badge) {\n return [];\n }\n const color = getColorKey(trendlineColor, 2);\n return [\n {\n name: `${name}_badge`,\n description: `${name}_badge`,\n type: 'rect',\n from: { data: `${name}` },\n interactive: false,\n encode: {\n enter: {\n cornerRadius: { value: 2 },\n fill: getColorProductionRule(color, colorScheme),\n opacity: { field: 'opacity' },\n x: { signal: 'datum.bounds.x1 - 3' },\n x2: { signal: 'datum.bounds.x2 + 3' },\n y: { signal: 'datum.bounds.y1 - 3' },\n y2: { signal: 'datum.bounds.y2 + 3' },\n },\n },\n },\n ];\n};\n\n/**\n * Gets the key used for color.\n * Since some of the marks base their data off of previous marks, the datum might be nested.\n * @param trendlineColor\n * @param datumOrder how many levels deep the datum is (ex. 1 becomes datum.color, 2 becomes datum.datum.color, etc.)\n * @returns\n */\nexport const getColorKey = (trendlineColor: ColorFacet, datumOrder: number = 1): ColorFacet => {\n if (typeof trendlineColor === 'string') {\n return `${new Array(datumOrder).fill('datum.').join('')}${trendlineColor}`;\n }\n return trendlineColor;\n};\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nexport * from './axisSpec.types';\nexport * from './axisAnnotationSpec.types';\nexport * from './referenceLineSpec.types';\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nexport * from './chartPopoverSpec.types';\nexport * from './chartTooltipSpec.types';\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nexport * from './chartSpec.types';\nexport * from './legendSpec.types';\nexport * from './spectrumVizColor.types';\nexport * from './titleSpec.types';\nexport * from './specUtil.types';\n\nexport * from './axis';\nexport * from './dialogs';\nexport * from './marks';\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nexport * from './areaSpec.types';\nexport * from './barSpec.types';\nexport * from './bigNumberSpec.types';\nexport * from './bulletSpec.types';\nexport * from './comboSpec.types';\nexport * from './donutSpec.types';\nexport * from './lineSpec.types';\nexport * from './scatterSpec.types';\n\nexport * from './supplemental';\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nexport * from './barAnnotationSpec.types';\nexport * from './dountSummarySpec.types';\nexport * from './metricRangeSpec.types';\nexport * from './scatterPathSpec.types';\nexport * from './segmentLabelSpec.types';\nexport * from './trendlineSpec.types';\nexport * from './trendlineAnnotationSpec.types';\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Spec, SymbolShape } from 'vega';\n\nimport { GROUP_DATA, MARK_ID, SERIES_ID, TRENDLINE_VALUE } from '@spectrum-charts/constants';\n\nimport { SpectrumVizColor } from './spectrumVizColor.types';\n\nexport type PartiallyRequired<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;\n\n// For overloading Spec typing when more strict typing is needed.\nexport interface ScSpec extends Spec {\n /*\n * Strict typing for usermeta makes it clear what meta information can be accessed during spec creation.\n *\n * Usage:\n * Add properties to usermeta when it's necessary to provide information from one builder\n * to another during spec creation.\n * This should only be used when sibling components have tight coupling and there isn't a\n * reasonable alternative approach using the spec options.\n *\n * Example:\n * A chart element like bar needs to communicate information about its orientation to the axes elements.\n * However, axis elements are built within their own axisSpecBuilder, which is independant from the barSpecBuilder.\n * Parsing the spec for information about the bar is brittle, since implementation details may change.\n * A preferred approach would be to add the needed information to usermeta { orientation: 'vertical' }.\n */\n usermeta: UserMeta;\n}\n\nexport type UserMeta = {\n chartOrientation?: Orientation;\n metricAxisCount?: number;\n};\n\nexport interface MarkBounds {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nconst DatumPredefinedKey = {\n markId: MARK_ID,\n seriesId: SERIES_ID,\n trendlineValue: TRENDLINE_VALUE,\n groupData: GROUP_DATA,\n} as const;\n\nexport type Datum = object & {\n [DatumPredefinedKey.markId]: number;\n [DatumPredefinedKey.seriesId]: string;\n [DatumPredefinedKey.trendlineValue]?: number;\n [DatumPredefinedKey.groupData]?: Datum[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n};\n\nexport type NumberFormat = 'currency' | 'shortCurrency' | 'shortNumber' | 'standardNumber' | string;\nexport type Orientation = 'vertical' | 'horizontal';\nexport type Position = 'left' | 'right' | 'top' | 'bottom';\nexport type ScaleType = 'linear' | 'point' | 'time' | 'band';\nexport type ChartSymbolShape = 'rounded-square' | SymbolShape | string;\n\n/**\n * Stroke dasharray for the line.\n *\n * solid: null,\n * dashed: 7 4,\n * dotted: 2 3,\n * dotDash: 2 3 7 4,\n * shortDash: 3 4,\n * longDash: 11 4,\n * twoDash: 5 2 11 2\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n */\nexport type LineType = 'solid' | 'dashed' | 'dotted' | 'dotDash' | 'shortDash' | 'longDash' | 'twoDash' | number[];\n\n/**\n * Width of line in pixels\n *\n * XS: 1px,\n * S: 1.5px,\n * M: 2px,\n * L: 3px,\n * XL: 4px\n * */\nexport type LineWidth = 'XS' | 'S' | 'M' | 'L' | 'XL' | number;\n\n/**\n * Width of the trail in pixels\n *\n * XS: 6px,\n * S: 8px,\n * M: 10px,\n * L: 12px,\n * XL: 16px\n * */\nexport type PathWidth = 'XS' | 'S' | 'M' | 'L' | 'XL' | number;\n\n/**\n * Width of the symbol in pixels\n *\n * XS: 6px,\n * S: 8px,\n * M: 10px,\n * L: 12px,\n * XL: 16px\n * */\nexport type SymbolSize = 'XS' | 'S' | 'M' | 'L' | 'XL' | number;\n\nexport type StaticValue<T> = { value: T };\nexport type FacetRef<T> = string | StaticValue<T>;\n\nexport type ColorFacet = FacetRef<SpectrumVizColor | string>;\nexport type LineTypeFacet = FacetRef<LineType>;\nexport type LineWidthFacet = FacetRef<LineWidth>;\nexport type OpacityFacet = FacetRef<number>;\nexport type PathWidthFacet = FacetRef<PathWidth>;\nexport type SymbolSizeFacet = FacetRef<SymbolSize>;\nexport type SymbolShapeFacet = FacetRef<ChartSymbolShape>;\n\nexport type FacetType =\n | 'color'\n | 'linearColor'\n | 'lineType'\n | 'lineWidth'\n | 'opacity'\n | 'symbolShape'\n | 'symbolSize'\n | 'symbolPathWidth';\n\nexport type SecondaryFacetType =\n | 'secondaryColor'\n | 'secondaryLineType'\n | 'secondaryLineWidth'\n | 'secondaryOpacity'\n | 'secondarySymbolShape'\n | 'secondarySymbolSize'\n | 'secondarySymbolPathWidth';\n\n// vega production rule type\nexport type ProductionRuleTests<T> = ({\n test?: string;\n} & T)[];\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Config, Locale, NumberLocale, Padding, Renderers, TimeLocale } from 'vega';\n\nimport { DEFAULT_COLOR_SCHEME } from '@spectrum-charts/constants';\nimport { LocaleCode, NumberLocaleCode, TimeLocaleCode, getLocale } from '@spectrum-charts/locales';\n\nimport { getExpressionFunctions } from './expressionFunctions';\nimport { getChartConfig } from './specUtils';\n\nexport const getVegaEmbedOptions = ({\n locale = 'en-US',\n height = 400,\n width = 600,\n padding = 0,\n renderer = 'svg',\n config,\n colorScheme = DEFAULT_COLOR_SCHEME,\n}: {\n locale?: Locale | LocaleCode | { number?: NumberLocaleCode | NumberLocale; time?: TimeLocaleCode | TimeLocale };\n height?: number;\n width?: number;\n padding?: Padding;\n renderer?: Renderers;\n config?: Config;\n colorScheme?: 'light' | 'dark';\n}) => {\n const expressionFunctions = getExpressionFunctions(locale);\n const { number: numberLocale, time: timeLocale } = getLocale(locale);\n const chartConfig = config ?? getChartConfig(undefined, colorScheme);\n\n return {\n actions: false,\n ast: true,\n expressionFunctions,\n formatLocale: numberLocale as unknown as Record<string, unknown>, // these are poorly typed by vega-embed\n height,\n width,\n padding,\n renderer,\n timeFormatLocale: timeLocale as unknown as Record<string, unknown>, // these are poorly typed by vega-embed\n config: chartConfig,\n };\n};\n","/*! For license information please see index.js.LICENSE.txt */\n!function(e,r){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=r():\"function\"==typeof define&&define.amd?define([],r):\"object\"==typeof exports?exports.spectrumChartsLocales=r():e.spectrumChartsLocales=r()}(this,(()=>(()=>{\"use strict\";var e={938:function(e,r,a){var t=this&&this.__createBinding||(Object.create?function(e,r,a,t){void 0===t&&(t=a);var s=Object.getOwnPropertyDescriptor(r,a);s&&!(\"get\"in s?!r.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return r[a]}}),Object.defineProperty(e,t,s)}:function(e,r,a,t){void 0===t&&(t=a),e[t]=r[a]}),s=this&&this.__exportStar||function(e,r){for(var a in e)\"default\"===a||Object.prototype.hasOwnProperty.call(r,a)||t(r,e,a)};Object.defineProperty(r,\"__esModule\",{value:!0}),s(a(7783),r)},7783:function(e,r,a){var t=this&&this.__createBinding||(Object.create?function(e,r,a,t){void 0===t&&(t=a);var s=Object.getOwnPropertyDescriptor(r,a);s&&!(\"get\"in s?!r.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return r[a]}}),Object.defineProperty(e,t,s)}:function(e,r,a,t){void 0===t&&(t=a),e[t]=r[a]}),s=this&&this.__exportStar||function(e,r){for(var a in e)\"default\"===a||Object.prototype.hasOwnProperty.call(r,a)||t(r,e,a)};Object.defineProperty(r,\"__esModule\",{value:!0}),s(a(1981),r),s(a(6838),r),s(a(2544),r),s(a(988),r)},1981:(e,r,a)=>{Object.defineProperty(r,\"__esModule\",{value:!0}),r.getLocale=void 0;const t=a(2544),s=a(988);r.getLocale=(e=\"en-US\")=>{var r,a;return\"string\"==typeof e?{number:null!==(r=t.numberLocales[e])&&void 0!==r?r:t.numberLocales[\"en-US\"],time:null!==(a=s.timeLocales[e])&&void 0!==a?a:s.timeLocales[\"en-US\"]}:{number:o(e.number),time:d(e.time)}};const o=e=>{var r;return\"string\"==typeof e?null!==(r=t.numberLocales[e])&&void 0!==r?r:t.numberLocales[\"en-US\"]:e},d=e=>{var r;return\"string\"==typeof e?null!==(r=s.timeLocales[e])&&void 0!==r?r:s.timeLocales[\"en-US\"]:e}},6838:(e,r)=>{Object.defineProperty(r,\"__esModule\",{value:!0})},2544:function(e,r,a){var t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,\"__esModule\",{value:!0}),r.numberLocales=void 0;const s=t(a(7252)),o=t(a(1960)),d=t(a(7616)),u=t(a(3344)),n=t(a(5250)),i=t(a(6615)),m=t(a(7376)),p=t(a(1769)),l=t(a(3966)),c=t(a(5796)),h=t(a(9568)),g=t(a(4725)),S=t(a(4532)),y=t(a(9770)),M=t(a(3655)),b=t(a(1720)),f=t(a(2434)),J=t(a(4985)),O=t(a(3044)),N=t(a(624)),j=t(a(7994)),v=t(a(7734)),x=t(a(5996)),A=t(a(1628)),D=t(a(7567)),k=t(a(4156)),T=t(a(2543)),Y=t(a(637)),z=t(a(6569)),P=t(a(3522)),L=t(a(2199)),H=t(a(6012)),F=t(a(9793)),X=t(a(5662)),B=t(a(9580)),_=t(a(7619)),C=t(a(530)),E=t(a(8721)),w=t(a(3615)),K=t(a(6299)),I=t(a(4211)),U=t(a(249)),R=t(a(6433)),G=t(a(3782)),W=t(a(9e3)),Q=t(a(2339)),V=t(a(943)),$=t(a(7591)),Z=t(a(9667)),q=t(a(8935)),ee=t(a(8881)),re=t(a(5286)),ae=t(a(3700)),te=t(a(8421)),se=t(a(2900));r.numberLocales={\"ar-AE\":s.default,\"ar-BH\":o.default,\"ar-DJ\":d.default,\"ar-DZ\":u.default,\"ar-EG\":n.default,\"ar-IL\":i.default,\"ar-IQ\":m.default,\"ar-JO\":p.default,\"ar-KM\":l.default,\"ar-KW\":c.default,\"ar-LB\":h.default,\"ar-LY\":g.default,\"ar-MA\":S.default,\"ar-OM\":y.default,\"ar-PS\":M.default,\"ar-QA\":b.default,\"ar-SA\":f.default,\"ar-SD\":J.default,\"ar-SO\":O.default,\"ar-SS\":N.default,\"ar-SY\":j.default,\"ar-TD\":v.default,\"ar-TN\":x.default,\"ar-YE\":A.default,\"ca-ES\":D.default,\"cs-CZ\":k.default,\"da-DK\":T.default,\"de-CH\":Y.default,\"de-DE\":z.default,\"en-CA\":P.default,\"en-GB\":L.default,\"en-IE\":H.default,\"en-IN\":F.default,\"en-US\":X.default,\"es-BO\":B.default,\"es-ES\":_.default,\"es-MX\":C.default,\"fi-FI\":E.default,\"fr-CA\":w.default,\"fr-FR\":K.default,\"he-IL\":I.default,\"hu-HU\":U.default,\"it-IT\":R.default,\"ja-JP\":G.default,\"ko-KR\":W.default,\"mk-MK\":Q.default,\"nl-NL\":V.default,\"pl-PL\":$.default,\"pt-BR\":Z.default,\"pt-PT\":q.default,\"ru-RU\":ee.default,\"sl-SI\":re.default,\"sv-SE\":ae.default,\"uk-UA\":te.default,\"zh-CN\":se.default}},988:function(e,r,a){var t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,\"__esModule\",{value:!0}),r.timeLocales=void 0;const s=t(a(7014)),o=t(a(8862)),d=t(a(1243)),u=t(a(4048)),n=t(a(2275)),i=t(a(6977)),m=t(a(5005)),p=t(a(4454)),l=t(a(1859)),c=t(a(9418)),h=t(a(1975)),g=t(a(3766)),S=t(a(3563)),y=t(a(3333)),M=t(a(5771)),b=t(a(1567)),f=t(a(5863)),J=t(a(2783)),O=t(a(6109)),N=t(a(6965)),j=t(a(746)),v=t(a(9092)),x=t(a(8647)),A=t(a(2584)),D=t(a(2628)),k=t(a(6211)),T=t(a(5147)),Y=t(a(6911)),z=t(a(7733)),P=t(a(600)),L=t(a(7359)),H=t(a(3081)),F=t(a(7552)),X=t(a(9256));r.timeLocales={\"ar-EG\":s.default,\"ar-SY\":o.default,\"ca-ES\":d.default,\"cs-CZ\":u.default,\"da-DK\":n.default,\"de-CH\":i.default,\"de-DE\":m.default,\"en-CA\":p.default,\"en-GB\":l.default,\"en-US\":c.default,\"es-ES\":h.default,\"es-MX\":g.default,\"fa-IR\":S.default,\"fi-FI\":y.default,\"fr-CA\":M.default,\"fr-FR\":b.default,\"he-IL\":f.default,\"hr-HR\":J.default,\"hu-HU\":O.default,\"it-IT\":N.default,\"ja-JP\":j.default,\"ko-KR\":v.default,\"mk-MK\":x.default,\"nb-NO\":A.default,\"nl-BE\":D.default,\"nl-NL\":k.default,\"pl-PL\":T.default,\"pt-BR\":Y.default,\"ru-RU\":z.default,\"sv-SE\":P.default,\"tr-TR\":L.default,\"uk-UA\":H.default,\"zh-CN\":F.default,\"zh-TW\":X.default}},7252:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" د.إ.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},1960:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" د.ب.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},7616:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"Fdj \",\"\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},3344:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"د.ج. \",\"\"]}')},5250:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ج.م.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},6615:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"₪ \",\"\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},7376:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" د.ع.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},1769:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" د.أ.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},3966:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ف.ج.ق.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},5796:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" د.ك.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},9568:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ل.ل.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},4725:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"د.ل. \",\"\"]}')},4532:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"د.م. \",\"\"]}')},9770:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ر.ع.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},3655:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"₪ \",\"\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},1720:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ر.ق.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},2434:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ر.س.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},4985:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ج.س.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},3044:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"S \",\"\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},624:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"£ \",\"\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},7994:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ل.س.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},7734:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"FCFA \",\"\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},5996:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"د.ت. \",\"\"]}')},1628:e=>{e.exports=JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ر.ى.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}')},7567:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"\",\" €\"]}')},4156:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\" Kč\"]}')},2543:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"\",\" kr\"]}')},637:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\"\\'\",\"grouping\":[3],\"currency\":[\"\",\" CHF\"]}')},6569:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"\",\" €\"]}')},3522:e=>{e.exports=JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"$\",\"\"]}')},2199:e=>{e.exports=JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"£\",\"\"]}')},6012:e=>{e.exports=JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"€\",\"\"]}')},9793:e=>{e.exports=JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3,2,2,2,2,2,2,2,2,2],\"currency\":[\"₹\",\"\"]}')},5662:e=>{e.exports=JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"$\",\"\"]}')},9580:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"Bs \",\"\"],\"percent\":\" %\"}')},7619:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"\",\" €\"]}')},530:e=>{e.exports=JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"$\",\"\"]}')},8721:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\" €\"]}')},3615:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\"$\"]}')},6299:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\" €\"],\"percent\":\" %\"}')},4211:e=>{e.exports=JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"₪\",\"\"]}')},249:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\" Ft\"]}')},6433:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"€\",\"\"]}')},3782:e=>{e.exports=JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"\",\"円\"]}')},9e3:e=>{e.exports=JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"₩\",\"\"]}')},2339:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"\",\" ден.\"]}')},943:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"€ \",\"\"]}')},7591:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"\",\"zł\"]}')},9667:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"R$\",\"\"]}')},8935:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\" €\"]}')},8881:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\" ₽\"]}')},5286:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"\",\" €\"]}')},3700:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\" kr\"]}')},8421:e=>{e.exports=JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\" ₴.\"]}')},2900:e=>{e.exports=JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"¥\",\"\"]}')},7014:e=>{e.exports=JSON.parse('{\"dateTime\":\"%x, %X\",\"date\":\"%-d/%-m/%Y\",\"time\":\"%-I:%M:%S %p\",\"periods\":[\"ص\",\"م\"],\"days\":[\"الأحد\",\"الإثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],\"shortDays\":[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"],\"months\":[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],\"shortMonths\":[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"]}')},8862:e=>{e.exports=JSON.parse('{\"dateTime\":\"%x, %X\",\"date\":\"%-d/%-m/%Y\",\"time\":\"%-I:%M:%S %p\",\"periods\":[\"ص\",\"م\"],\"days\":[\"الأحد\",\"الإثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],\"shortDays\":[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"],\"months\":[\"كانون الثاني\",\"شباط\",\"آذار\",\"نيسان\",\"أيار\",\"حزيران\",\"تموز\",\"آب\",\"أيلول\",\"تشرين الأول\",\"تشرين الثاني\",\"كانون الأول\"],\"shortMonths\":[\"ك٢\",\"شباط\",\"آذار\",\"نيسان\",\"أيار\",\"حزيران\",\"تموز\",\"آب\",\"أيلول\",\"ت١\",\"ت٢\",\"ك١\"]}')},1243:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A, %e de %B de %Y, %X\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"diumenge\",\"dilluns\",\"dimarts\",\"dimecres\",\"dijous\",\"divendres\",\"dissabte\"],\"shortDays\":[\"dg.\",\"dl.\",\"dt.\",\"dc.\",\"dj.\",\"dv.\",\"ds.\"],\"months\":[\"gener\",\"febrer\",\"març\",\"abril\",\"maig\",\"juny\",\"juliol\",\"agost\",\"setembre\",\"octubre\",\"novembre\",\"desembre\"],\"shortMonths\":[\"gen.\",\"febr.\",\"març\",\"abr.\",\"maig\",\"juny\",\"jul.\",\"ag.\",\"set.\",\"oct.\",\"nov.\",\"des.\"]}')},4048:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A,%e.%B %Y, %X\",\"date\":\"%-d.%-m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"neděle\",\"pondělí\",\"úterý\",\"středa\",\"čvrtek\",\"pátek\",\"sobota\"],\"shortDays\":[\"ne.\",\"po.\",\"út.\",\"st.\",\"čt.\",\"pá.\",\"so.\"],\"months\":[\"leden\",\"únor\",\"březen\",\"duben\",\"květen\",\"červen\",\"červenec\",\"srpen\",\"září\",\"říjen\",\"listopad\",\"prosinec\"],\"shortMonths\":[\"led\",\"úno\",\"břez\",\"dub\",\"kvě\",\"čer\",\"červ\",\"srp\",\"zář\",\"říj\",\"list\",\"pros\"]}')},2275:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A den %d %B %Y %X\",\"date\":\"%d-%m-%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"søndag\",\"mandag\",\"tirsdag\",\"onsdag\",\"torsdag\",\"fredag\",\"lørdag\"],\"shortDays\":[\"søn\",\"man\",\"tir\",\"ons\",\"tor\",\"fre\",\"lør\"],\"months\":[\"januar\",\"februar\",\"marts\",\"april\",\"maj\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"december\"],\"shortMonths\":[\"jan\",\"feb\",\"mar\",\"apr\",\"maj\",\"jun\",\"jul\",\"aug\",\"sep\",\"okt\",\"nov\",\"dec\"]}')},6977:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A, der %e. %B %Y, %X\",\"date\":\"%d.%m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],\"shortDays\":[\"So\",\"Mo\",\"Di\",\"Mi\",\"Do\",\"Fr\",\"Sa\"],\"months\":[\"Januar\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Juli\",\"August\",\"September\",\"Oktober\",\"November\",\"Dezember\"],\"shortMonths\":[\"Jan\",\"Feb\",\"Mrz\",\"Apr\",\"Mai\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Okt\",\"Nov\",\"Dez\"]}')},5005:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A, der %e. %B %Y, %X\",\"date\":\"%d.%m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],\"shortDays\":[\"So\",\"Mo\",\"Di\",\"Mi\",\"Do\",\"Fr\",\"Sa\"],\"months\":[\"Januar\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Juli\",\"August\",\"September\",\"Oktober\",\"November\",\"Dezember\"],\"shortMonths\":[\"Jan\",\"Feb\",\"Mrz\",\"Apr\",\"Mai\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Okt\",\"Nov\",\"Dez\"]}')},4454:e=>{e.exports=JSON.parse('{\"dateTime\":\"%a %b %e %X %Y\",\"date\":\"%Y-%m-%d\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"shortDays\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"months\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],\"shortMonths\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"]}')},1859:e=>{e.exports=JSON.parse('{\"dateTime\":\"%a %e %b %X %Y\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"shortDays\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"months\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],\"shortMonths\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"]}')},9418:e=>{e.exports=JSON.parse('{\"dateTime\":\"%x, %X\",\"date\":\"%-m/%-d/%Y\",\"time\":\"%-I:%M:%S %p\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"shortDays\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"months\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],\"shortMonths\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"]}')},1975:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A, %e de %B de %Y, %X\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],\"shortDays\":[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],\"months\":[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"],\"shortMonths\":[\"ene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sep\",\"oct\",\"nov\",\"dic\"]}')},3766:e=>{e.exports=JSON.parse('{\"dateTime\":\"%x, %X\",\"date\":\"%d/%m/%Y\",\"time\":\"%-I:%M:%S %p\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],\"shortDays\":[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],\"months\":[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"],\"shortMonths\":[\"ene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sep\",\"oct\",\"nov\",\"dic\"]}')},3563:e=>{e.exports=JSON.parse('{\"dateTime\":\"%x, %X\",\"date\":\"%-d/%-m/%Y\",\"time\":\"%-I:%M:%S %p\",\"periods\":[\"صبح\",\"عصر\"],\"days\":[\"یکشنبه\",\"دوشنبه\",\"سه شنبه\",\"چهارشنبه\",\"پنجشنبه\",\"جمعه\",\"شنبه\"],\"shortDays\":[\"یکشنبه\",\"دوشنبه\",\"سه شنبه\",\"چهارشنبه\",\"پنجشنبه\",\"جمعه\",\"شنبه\"],\"months\":[\"ژانویه\",\"فوریه\",\"مارس\",\"آوریل\",\"مه\",\"ژوئن\",\"ژوئیه\",\"اوت\",\"سپتامبر\",\"اکتبر\",\"نوامبر\",\"دسامبر\"],\"shortMonths\":[\"ژانویه\",\"فوریه\",\"مارس\",\"آوریل\",\"مه\",\"ژوئن\",\"ژوئیه\",\"اوت\",\"سپتامبر\",\"اکتبر\",\"نوامبر\",\"دسامبر\"]}')},3333:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A, %-d. %Bta %Y klo %X\",\"date\":\"%-d.%-m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"a.m.\",\"p.m.\"],\"days\":[\"sunnuntai\",\"maanantai\",\"tiistai\",\"keskiviikko\",\"torstai\",\"perjantai\",\"lauantai\"],\"shortDays\":[\"Su\",\"Ma\",\"Ti\",\"Ke\",\"To\",\"Pe\",\"La\"],\"months\":[\"tammikuu\",\"helmikuu\",\"maaliskuu\",\"huhtikuu\",\"toukokuu\",\"kesäkuu\",\"heinäkuu\",\"elokuu\",\"syyskuu\",\"lokakuu\",\"marraskuu\",\"joulukuu\"],\"shortMonths\":[\"Tammi\",\"Helmi\",\"Maalis\",\"Huhti\",\"Touko\",\"Kesä\",\"Heinä\",\"Elo\",\"Syys\",\"Loka\",\"Marras\",\"Joulu\"]}')},5771:e=>{e.exports=JSON.parse('{\"dateTime\":\"%a %e %b %Y %X\",\"date\":\"%Y-%m-%d\",\"time\":\"%H:%M:%S\",\"periods\":[\"\",\"\"],\"days\":[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],\"shortDays\":[\"dim\",\"lun\",\"mar\",\"mer\",\"jeu\",\"ven\",\"sam\"],\"months\":[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"],\"shortMonths\":[\"jan\",\"fév\",\"mar\",\"avr\",\"mai\",\"jui\",\"jul\",\"aoû\",\"sep\",\"oct\",\"nov\",\"déc\"]}')},1567:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A %e %B %Y à %X\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],\"shortDays\":[\"dim.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],\"months\":[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"],\"shortMonths\":[\"janv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"]}')},5863:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A, %e ב%B %Y %X\",\"date\":\"%d.%m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"ראשון\",\"שני\",\"שלישי\",\"רביעי\",\"חמישי\",\"שישי\",\"שבת\"],\"shortDays\":[\"א׳\",\"ב׳\",\"ג׳\",\"ד׳\",\"ה׳\",\"ו׳\",\"ש׳\"],\"months\":[\"ינואר\",\"פברואר\",\"מרץ\",\"אפריל\",\"מאי\",\"יוני\",\"יולי\",\"אוגוסט\",\"ספטמבר\",\"אוקטובר\",\"נובמבר\",\"דצמבר\"],\"shortMonths\":[\"ינו׳\",\"פבר׳\",\"מרץ\",\"אפר׳\",\"מאי\",\"יוני\",\"יולי\",\"אוג׳\",\"ספט׳\",\"אוק׳\",\"נוב׳\",\"דצמ׳\"]}')},2783:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A, %e. %B %Y., %X\",\"date\":\"%d. %m. %Y.\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Nedjelja\",\"Ponedjeljak\",\"Utorak\",\"Srijeda\",\"Četvtrak\",\"Petak\",\"Subota\"],\"shortDays\":[\"Ne\",\"Po\",\"Ut\",\"Sr\",\"Če\",\"Pe\",\"Su\"],\"months\":[\"Siječanj\",\"Veljača\",\"Ožujak\",\"Travanj\",\"Svibanj\",\"Lipanj\",\"Srpanj\",\"Kolovoz\",\"Rujan\",\"Listopad\",\"Studeni\",\"Prosinac\"],\"shortMonths\":[\"Sij\",\"Velj\",\"Ožu\",\"Tra\",\"Svi\",\"Lip\",\"Srp\",\"Kol\",\"Ruj\",\"Lis\",\"Stu\",\"Pro\"]}')},6109:e=>{e.exports=JSON.parse('{\"dateTime\":\"%Y. %B %-e., %A %X\",\"date\":\"%Y. %m. %d.\",\"time\":\"%H:%M:%S\",\"periods\":[\"de.\",\"du.\"],\"days\":[\"vasárnap\",\"hétfő\",\"kedd\",\"szerda\",\"csütörtök\",\"péntek\",\"szombat\"],\"shortDays\":[\"V\",\"H\",\"K\",\"Sze\",\"Cs\",\"P\",\"Szo\"],\"months\":[\"január\",\"február\",\"március\",\"április\",\"május\",\"június\",\"július\",\"augusztus\",\"szeptember\",\"október\",\"november\",\"december\"],\"shortMonths\":[\"jan.\",\"feb.\",\"már.\",\"ápr.\",\"máj.\",\"jún.\",\"júl.\",\"aug.\",\"szept.\",\"okt.\",\"nov.\",\"dec.\"]}')},6965:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A %e %B %Y, %X\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Domenica\",\"Lunedì\",\"Martedì\",\"Mercoledì\",\"Giovedì\",\"Venerdì\",\"Sabato\"],\"shortDays\":[\"Dom\",\"Lun\",\"Mar\",\"Mer\",\"Gio\",\"Ven\",\"Sab\"],\"months\":[\"Gennaio\",\"Febbraio\",\"Marzo\",\"Aprile\",\"Maggio\",\"Giugno\",\"Luglio\",\"Agosto\",\"Settembre\",\"Ottobre\",\"Novembre\",\"Dicembre\"],\"shortMonths\":[\"Gen\",\"Feb\",\"Mar\",\"Apr\",\"Mag\",\"Giu\",\"Lug\",\"Ago\",\"Set\",\"Ott\",\"Nov\",\"Dic\"]}')},746:e=>{e.exports=JSON.parse('{\"dateTime\":\"%x %a %X\",\"date\":\"%Y/%m/%d\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"日曜日\",\"月曜日\",\"火曜日\",\"水曜日\",\"木曜日\",\"金曜日\",\"土曜日\"],\"shortDays\":[\"日\",\"月\",\"火\",\"水\",\"木\",\"金\",\"土\"],\"months\":[\"1月\",\"2月\",\"3月\",\"4月\",\"5月\",\"6月\",\"7月\",\"8月\",\"9月\",\"10月\",\"11月\",\"12月\"],\"shortMonths\":[\"1月\",\"2月\",\"3月\",\"4月\",\"5月\",\"6月\",\"7月\",\"8月\",\"9月\",\"10月\",\"11月\",\"12月\"]}')},9092:e=>{e.exports=JSON.parse('{\"dateTime\":\"%Y/%m/%d %a %X\",\"date\":\"%Y/%m/%d\",\"time\":\"%H:%M:%S\",\"periods\":[\"오전\",\"오후\"],\"days\":[\"일요일\",\"월요일\",\"화요일\",\"수요일\",\"목요일\",\"금요일\",\"토요일\"],\"shortDays\":[\"일\",\"월\",\"화\",\"수\",\"목\",\"금\",\"토\"],\"months\":[\"1월\",\"2월\",\"3월\",\"4월\",\"5월\",\"6월\",\"7월\",\"8월\",\"9월\",\"10월\",\"11월\",\"12월\"],\"shortMonths\":[\"1월\",\"2월\",\"3월\",\"4월\",\"5월\",\"6월\",\"7월\",\"8월\",\"9월\",\"10월\",\"11월\",\"12월\"]}')},8647:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A, %e %B %Y г. %X\",\"date\":\"%d.%m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"недела\",\"понеделник\",\"вторник\",\"среда\",\"четврток\",\"петок\",\"сабота\"],\"shortDays\":[\"нед\",\"пон\",\"вто\",\"сре\",\"чет\",\"пет\",\"саб\"],\"months\":[\"јануари\",\"февруари\",\"март\",\"април\",\"мај\",\"јуни\",\"јули\",\"август\",\"септември\",\"октомври\",\"ноември\",\"декември\"],\"shortMonths\":[\"јан\",\"фев\",\"мар\",\"апр\",\"мај\",\"јун\",\"јул\",\"авг\",\"сеп\",\"окт\",\"ное\",\"дек\"]}')},2584:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A den %d. %B %Y %X\",\"date\":\"%d.%m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"søndag\",\"mandag\",\"tirsdag\",\"onsdag\",\"torsdag\",\"fredag\",\"lørdag\"],\"shortDays\":[\"søn\",\"man\",\"tir\",\"ons\",\"tor\",\"fre\",\"lør\"],\"months\":[\"januar\",\"februar\",\"mars\",\"april\",\"mai\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"desember\"],\"shortMonths\":[\"jan\",\"feb\",\"mars\",\"apr\",\"mai\",\"juni\",\"juli\",\"aug\",\"sep\",\"okt\",\"nov\",\"des\"]}')},2628:e=>{e.exports=JSON.parse('{\"dateTime\":\"%a %e %B %Y %X\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"zondag\",\"maandag\",\"dinsdag\",\"woensdag\",\"donderdag\",\"vrijdag\",\"zaterdag\"],\"shortDays\":[\"zo\",\"ma\",\"di\",\"wo\",\"do\",\"vr\",\"za\"],\"months\":[\"januari\",\"februari\",\"maart\",\"april\",\"mei\",\"juni\",\"juli\",\"augustus\",\"september\",\"oktober\",\"november\",\"december\"],\"shortMonths\":[\"jan\",\"feb\",\"mrt\",\"apr\",\"mei\",\"jun\",\"jul\",\"aug\",\"sep\",\"okt\",\"nov\",\"dec\"]}')},6211:e=>{e.exports=JSON.parse('{\"dateTime\":\"%a %e %B %Y %X\",\"date\":\"%d-%m-%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"zondag\",\"maandag\",\"dinsdag\",\"woensdag\",\"donderdag\",\"vrijdag\",\"zaterdag\"],\"shortDays\":[\"zo\",\"ma\",\"di\",\"wo\",\"do\",\"vr\",\"za\"],\"months\":[\"januari\",\"februari\",\"maart\",\"april\",\"mei\",\"juni\",\"juli\",\"augustus\",\"september\",\"oktober\",\"november\",\"december\"],\"shortMonths\":[\"jan\",\"feb\",\"mrt\",\"apr\",\"mei\",\"jun\",\"jul\",\"aug\",\"sep\",\"okt\",\"nov\",\"dec\"]}')},5147:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A, %e %B %Y, %X\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Niedziela\",\"Poniedziałek\",\"Wtorek\",\"Środa\",\"Czwartek\",\"Piątek\",\"Sobota\"],\"shortDays\":[\"Niedz.\",\"Pon.\",\"Wt.\",\"Śr.\",\"Czw.\",\"Pt.\",\"Sob.\"],\"months\":[\"Styczeń\",\"Luty\",\"Marzec\",\"Kwiecień\",\"Maj\",\"Czerwiec\",\"Lipiec\",\"Sierpień\",\"Wrzesień\",\"Październik\",\"Listopad\",\"Grudzień\"],\"shortMonths\":[\"Stycz.\",\"Luty\",\"Marz.\",\"Kwie.\",\"Maj\",\"Czerw.\",\"Lipc.\",\"Sierp.\",\"Wrz.\",\"Paźdz.\",\"Listop.\",\"Grudz.\"]}')},6911:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A, %e de %B de %Y. %X\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Domingo\",\"Segunda\",\"Terça\",\"Quarta\",\"Quinta\",\"Sexta\",\"Sábado\"],\"shortDays\":[\"Dom\",\"Seg\",\"Ter\",\"Qua\",\"Qui\",\"Sex\",\"Sáb\"],\"months\":[\"Janeiro\",\"Fevereiro\",\"Março\",\"Abril\",\"Maio\",\"Junho\",\"Julho\",\"Agosto\",\"Setembro\",\"Outubro\",\"Novembro\",\"Dezembro\"],\"shortMonths\":[\"Jan\",\"Fev\",\"Mar\",\"Abr\",\"Mai\",\"Jun\",\"Jul\",\"Ago\",\"Set\",\"Out\",\"Nov\",\"Dez\"]}')},7733:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A, %e %B %Y г. %X\",\"date\":\"%d.%m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"воскресенье\",\"понедельник\",\"вторник\",\"среда\",\"четверг\",\"пятница\",\"суббота\"],\"shortDays\":[\"вс\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"],\"months\":[\"января\",\"февраля\",\"марта\",\"апреля\",\"мая\",\"июня\",\"июля\",\"августа\",\"сентября\",\"октября\",\"ноября\",\"декабря\"],\"shortMonths\":[\"янв\",\"фев\",\"мар\",\"апр\",\"май\",\"июн\",\"июл\",\"авг\",\"сен\",\"окт\",\"ноя\",\"дек\"]}')},600:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A den %d %B %Y %X\",\"date\":\"%Y-%m-%d\",\"time\":\"%H:%M:%S\",\"periods\":[\"fm\",\"em\"],\"days\":[\"Söndag\",\"Måndag\",\"Tisdag\",\"Onsdag\",\"Torsdag\",\"Fredag\",\"Lördag\"],\"shortDays\":[\"Sön\",\"Mån\",\"Tis\",\"Ons\",\"Tor\",\"Fre\",\"Lör\"],\"months\":[\"Januari\",\"Februari\",\"Mars\",\"April\",\"Maj\",\"Juni\",\"Juli\",\"Augusti\",\"September\",\"Oktober\",\"November\",\"December\"],\"shortMonths\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"Maj\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Okt\",\"Nov\",\"Dec\"]}')},7359:e=>{e.exports=JSON.parse('{\"dateTime\":\"%a %e %b %X %Y\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Pazar\",\"Pazartesi\",\"Salı\",\"Çarşamba\",\"Perşembe\",\"Cuma\",\"Cumartesi\"],\"shortDays\":[\"Paz\",\"Pzt\",\"Sal\",\"Çar\",\"Per\",\"Cum\",\"Cmt\"],\"months\":[\"Ocak\",\"Şubat\",\"Mart\",\"Nisan\",\"Mayıs\",\"Haziran\",\"Temmuz\",\"Ağustos\",\"Eylül\",\"Ekim\",\"Kasım\",\"Aralık\"],\"shortMonths\":[\"Oca\",\"Şub\",\"Mar\",\"Nis\",\"May\",\"Haz\",\"Tem\",\"Ağu\",\"Eyl\",\"Eki\",\"Kas\",\"Ara\"]}')},3081:e=>{e.exports=JSON.parse('{\"dateTime\":\"%A, %e %B %Y р. %X\",\"date\":\"%d.%m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"дп\",\"пп\"],\"days\":[\"неділя\",\"понеділок\",\"вівторок\",\"середа\",\"четвер\",\"п\\'ятниця\",\"субота\"],\"shortDays\":[\"нд\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"],\"months\":[\"січня\",\"лютого\",\"березня\",\"квітня\",\"травня\",\"червня\",\"липня\",\"серпня\",\"вересня\",\"жовтня\",\"листопада\",\"грудня\"],\"shortMonths\":[\"січ.\",\"лют.\",\"бер.\",\"квіт.\",\"трав.\",\"черв.\",\"лип.\",\"серп.\",\"вер.\",\"жовт.\",\"лист.\",\"груд.\"]}')},7552:e=>{e.exports=JSON.parse('{\"dateTime\":\"%x %A %X\",\"date\":\"%Y年%-m月%-d日\",\"time\":\"%H:%M:%S\",\"periods\":[\"上午\",\"下午\"],\"days\":[\"星期日\",\"星期一\",\"星期二\",\"星期三\",\"星期四\",\"星期五\",\"星期六\"],\"shortDays\":[\"周日\",\"周一\",\"周二\",\"周三\",\"周四\",\"周五\",\"周六\"],\"months\":[\"一月\",\"二月\",\"三月\",\"四月\",\"五月\",\"六月\",\"七月\",\"八月\",\"九月\",\"十月\",\"十一月\",\"十二月\"],\"shortMonths\":[\"一月\",\"二月\",\"三月\",\"四月\",\"五月\",\"六月\",\"七月\",\"八月\",\"九月\",\"十月\",\"十一月\",\"十二月\"]}')},9256:e=>{e.exports=JSON.parse('{\"dateTime\":\"%x %A %X\",\"date\":\"%Y年%-m月%-d日\",\"time\":\"%H:%M:%S\",\"periods\":[\"上午\",\"下午\"],\"days\":[\"星期日\",\"星期一\",\"星期二\",\"星期三\",\"星期四\",\"星期五\",\"星期六\"],\"shortDays\":[\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六\"],\"months\":[\"一月\",\"二月\",\"三月\",\"四月\",\"五月\",\"六月\",\"七月\",\"八月\",\"九月\",\"十月\",\"十一月\",\"十二月\"],\"shortMonths\":[\"1月\",\"2月\",\"3月\",\"4月\",\"5月\",\"6月\",\"7月\",\"8月\",\"9月\",\"10月\",\"11月\",\"12月\"]}')}},r={};return function a(t){var s=r[t];if(void 0!==s)return s.exports;var o=r[t]={exports:{}};return e[t].call(o.exports,o,o.exports,a),o.exports}(938)})()));\n//# sourceMappingURL=index.js.map","module.exports = require(\"vega\");","module.exports = __WEBPACK_EXTERNAL_MODULE__9633__;","module.exports = __WEBPACK_EXTERNAL_MODULE__1274__;","module.exports = __WEBPACK_EXTERNAL_MODULE__8365__;","export default function(x) {\n return Math.abs(x = Math.round(x)) >= 1e21\n ? x.toLocaleString(\"en\").replace(/,/g, \"\")\n : x.toString(10);\n}\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nexport function formatDecimalParts(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x) {\n return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n}\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n return new FormatSpecifier({\n fill: match[1],\n align: match[2],\n sign: match[3],\n symbol: match[4],\n zero: match[5],\n width: match[6],\n comma: match[7],\n precision: match[8] && match[8].slice(1),\n trim: match[9],\n type: match[10]\n });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n this.zero = !!specifier.zero;\n this.width = specifier.width === undefined ? undefined : +specifier.width;\n this.comma = !!specifier.comma;\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n this.trim = !!specifier.trim;\n this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatDecimal from \"./formatDecimal.js\";\nimport formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\n\nexport default {\n \"%\": (x, p) => (x * 100).toFixed(p),\n \"b\": (x) => Math.round(x).toString(2),\n \"c\": (x) => x + \"\",\n \"d\": formatDecimal,\n \"e\": (x, p) => x.toExponential(p),\n \"f\": (x, p) => x.toFixed(p),\n \"g\": (x, p) => x.toPrecision(p),\n \"o\": (x) => Math.round(x).toString(8),\n \"p\": (x, p) => formatRounded(x * 100, p),\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": (x) => Math.round(x).toString(16).toUpperCase(),\n \"x\": (x) => Math.round(x).toString(16)\n};\n","export default function(x) {\n return x;\n}\n","import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport {prefixExponent} from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\n\nvar map = Array.prototype.map,\n prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n minus = locale.minus === undefined ? \"−\" : locale.minus + \"\",\n nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision === undefined ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n var valueNegative = value < 0 || 1 / value < 0;\n\n // Perform the initial formatting.\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n","import formatLocale from \"./locale.js\";\n\nvar locale;\nexport var format;\nexport var formatPrefix;\n\ndefaultLocale({\n thousands: \",\",\n grouping: [3],\n currency: [\"$\", \"\"]\n});\n\nexport default function defaultLocale(definition) {\n locale = formatLocale(definition);\n format = locale.format;\n formatPrefix = locale.formatPrefix;\n return locale;\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step) {\n return Math.max(0, -exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, value) {\n return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step)));\n}\n","import exponent from \"./exponent.js\";\n\nexport default function(step, max) {\n step = Math.abs(step), max = Math.abs(max) - step;\n return Math.max(0, exponent(max) - exponent(step)) + 1;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(7783);\n"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE__9633__","__WEBPACK_EXTERNAL_MODULE__1274__","__WEBPACK_EXTERNAL_MODULE__8365__","isMergeableObject","value","isNonNullObject","stringValue","Object","prototype","toString","call","$$typeof","REACT_ELEMENT_TYPE","isReactElement","isSpecial","Symbol","for","cloneUnlessOtherwiseSpecified","options","clone","deepmerge","val","Array","isArray","defaultArrayMerge","target","source","concat","map","element","getKeys","keys","getOwnPropertySymbols","filter","symbol","propertyIsEnumerable","getEnumerableOwnPropertySymbols","propertyIsOnObject","object","property","_","arrayMerge","sourceIsArray","destination","forEach","key","hasOwnProperty","propertyIsUnsafe","customMerge","getMergeFunction","mergeObject","all","array","Error","reduce","prev","next","deepmerge_1","e","ne","defineProperty","ge","getOwnPropertyDescriptor","be","getOwnPropertyNames","Te","Be","t","r","get","enumerable","Ae","Immer","J","applyPatches","Ce","castDraft","ke","castImmutable","Ke","createDraft","Re","current","re","enableMapSet","xe","enablePatches","Pe","finishDraft","ve","freeze","K","immerable","N","isDraft","O","isDraftable","A","nothing","j","original","le","produce","Fe","produceWithPatches","Ne","setAutoFreeze","ze","setUseStrictShallowCopy","je","n","i","Ie","u","h","z","getPrototypeOf","ye","constructor","v","k","Oe","Function","C","Reflect","ownKeys","o","R","has","X","Q","set","add","Map","Set","T","L","slice","getOwnPropertyDescriptors","f","length","l","c","writable","configurable","create","assign","$","clear","delete","Me","entries","isFrozen","U","ae","w","Y","B","oe","b","V","Z","a","we","ie","p","P","d","_e","x","m","se","s","ee","te","de","g","y","ue","me","Ee","ce","fe","W","pe","E","Number","isNaN","deleteProperty","setPrototypeOf","q","S","arguments","apply","autoFreeze","useStrictShallowCopy","path","op","I","D","revoke","proxy","Proxy","revocable","he","push","Se","from","H","F","join","splice","unshift","super","size","values","iterator","done","JSON","stringify","M","bind","addArea","spec","chartPopovers","chartTooltips","color","DEFAULT_COLOR","colorScheme","DEFAULT_COLOR_SCHEME","dimension","DEFAULT_TIME_DIMENSION","index","metric","DEFAULT_METRIC","metricStart","metricEnd","name","opacity","scaleType","areaOptions","toCamelCase","console","error","undefined","data","addData","signals","addSignals","scales","setScales","marks","addAreaMarks","highlightedItem","order","tableData","getTableData","transform","addTimeTransform","filteredTableData","getFilteredTableData","type","groupby","field","sort","getTransformSort","as","isInteractive","areaHasPopover","hasPopover","areaHasTooltip","hasTooltip","getAreaHighlightedData","idKey","isHighlightedByGroup","FILTERED_TABLE","expr","SELECTED_SERIES","addTooltipData","hasGroupId","HIGHLIGHTED_ITEM","SELECTED_ITEM","addHighlightedSeriesSignalEvents","excludeDataKeys","addHighlightedItemEvents","getControlledHoveredGroupSignal","getControlledHoveredIdSignal","addTooltipSignals","areaName","highlightedItemSignal","find","signal","on","events","update","padding","addContinuousDimensionScale","addFieldToFacetScaleDomain","COLOR_SCALE","addMetricScale","isStacked","facet","getAreaMark","getAnchorPointMark","getSelectedAreaMarks","getHoverMarks","interactive","encode","enter","scale","stroke","fill","getX","highlightMarks","BACKGROUND_COLOR","isHighlightedByDimension","y2","strokeWidth","spectrumColors","light","strokeJoin","getAreaOpacity","displayOnHover","isMetricRange","fadedOpacity","HIGHLIGHT_CONTRAST_RATIO","test","HIGHLIGHTED_SERIES","SERIES_ID","DEFAULT_OPACITY_RULE","opacityRules","dataSource","description","getColorProductionRule","tooltip","getTooltip","getBorderStrokeEncodings","cursor","getCursor","fillOpacity","DEFAULT_TRANSFORMED_TIME_DIMENSION","getLabelValue","label","getTimeLabelFormats","granularity","secondaryLabelFormat","primaryLabelFormat","tickCount","interval","step","getControlledLabelAnchorValues","position","labelOrientaion","labelAlign","getLabelAnchor","align","baseline","getLabelAnchorValues","vegaLabelAlign","vegaLabelBaseline","labelBaseline","labelIsParallelToAxis","start","center","end","includes","getLabelAngle","getLabelBaseline","isVerticalAxis","getLabelOffset","scaleName","vegaLabelOffset","getLabelFormat","labelFormat","labelOrientation","numberFormat","truncateLabels","currencyLocale","currencyCode","getTextNumberFormat","getAxisLabelsEncoding","labelFontWeight","labelKey","signalName","text","fontWeight","getEncodedLabelAnchor","defaultLabelAlign","baseTestString","baseSignalString","getReferenceLines","axisOptions","referenceLines","referenceLine","applyReferenceLineOptionDefaults","iconColor","DEFAULT_FONT_COLOR","labelColor","DEFAULT_LABEL_FONT_WEIGHT","layer","scaleTypeSupportsReferenceLines","Boolean","getReferenceLineMarks","referenceLineMarks","back","front","positionEncoding","getPositionEncoding","getReferenceLineRuleMark","getReferenceLineSymbolMark","getReferenceLineTextMark","signalValue","halfInnerPaddingFormula","ticks","startOffset","positionOptions","top","bottom","left","x2","right","getColorValue","getAdditiveMarkPositionOptions","offset","horizontalOffset","icon","shape","getPathFromIcon","referenceLineOptions","getReferenceLineLabelsEncoding","verticalOffset","isVertical","calculateReferenceLineOffsets","getEncodedLabelBaselineAlign","applySecondaryMetricAxisEncodings","axis","secondaryAxisFillRules","LAST_RSC_SERIES_ID","secondaryAxisFillOpacityRules","MOUSE_OVER_SERIES","encodings","labels","title","applyPrimaryMetricAxisEncodings","defaultFontColor","primaryAxisFillRules","FIRST_RSC_SERIES_ID","primaryAxisFillOpacityRules","addDualMetricAxisConfig","isPrimaryMetricAxis","scaleNames","getDualAxisScaleNames","primaryScale","secondaryScale","addAxis","axisAnnotations","baselineOffset","DEFAULT_GRANULARITY","grid","hideDefaultLabels","DEFAULT_LABEL_ALIGN","DEFAULT_LABEL_ORIENTATION","range","subLabels","getScale","opposingScaleType","getOpposingScaleType","dualMetricAxis","some","addAxisData","addAxisSignals","domain","usermeta","axes","addAxes","isTrellisedChart","addAxesMarks","getAxisAnnotationsFromChildren","annotationOptions","addAxisAnnotationData","getGenericValueSignal","getLabelSignalValue","hasSubLabels","addAxisAnnotationSignals","newAxes","getTrellisAxisOptions","getTimeAxes","getDefaultAxis","titlePadding","subLabelAxis","getSubLabelAxis","handleDualMetricAxisConfig","incrementMetricAxisCount","setAxisBaseline","referenceLineLabel","linePosition","addAxisAnnotationAxis","chartOrientation","getIsMetricAxis","metricAxisCount","domainWidth","trellisGroupMark","mark","isTrellised","baselineRule","getBaselineRule","addBaseline","trellisOrientation","startsWith","axisOrientation","encodeAxisTitle","addAxesToTrellisGroup","addAxisAnnotationMarks","trellisAxisOptions","labelOffsetSignal","axisType","vegaLabelPadding","facetName","facetGroupBy","trellisScaleName","getTrellisGroupProperties","groupMark","fromFacet","tickCountLimit","tickMinStep","orient","getTickCount","labelAngle","labelOffset","labelPadding","getSecondaryTimeAxis","getPrimaryTimeAxis","formatType","labelSeparation","getSecondaryTimeAxisLabelFormatting","format","labelOverlap","dy","subLabelValues","applicableScales","getRange","getDefaultScaleNameFromPosition","getOpposingRange","getDefaultOpposingScaleNameFromPosition","orientation","dataKey","getAxisAnnotationDetailData","getAxisAnnotationSummaryData","getAxisAnnotationAggregateData","getAxisAnnotationRangeData","option","fields","ops","getHighlightAxisAnnotationSignal","getClickAxisAnnotationSignal","getSelectAxisAnnotationSignal","markname","between","axisAnnotationOptions","getAxisAnnotationSummaryMarks","getAxisAnnotationSpanMarks","zindex","ANNOTATION_SINGLE_ICON_SVG","xc","yc","band","width","height","ANNOTATION_RANGED_ICON_SVG","axisName","annotation","annotationIndex","applyDefaultAxisAnnotationOptions","DEFAULT_AXIS_ANNOTATION_OFFSET","DEFAULT_AXIS_ANNOTATION_COLOR","axisTypeSupportsAxisAnnotations","getAnnotationMarks","barOptions","dataName","dimensionScaleName","dimensionName","dimensionField","barAnnotations","textKey","applyAnnotationPropDefaults","getAnnotation","getAnnotationTextMark","getAnnotationBackgroundMark","style","metricAxis","dimensionAxis","getOrientationProperties","annotationWidth","getAnnotationWidth","annotationPosition","getAnnotationMetricAxisPosition","getMinBandwidth","fontSize","ANNOTATION_FONT_SIZE","ANNOTATION_FONT_WEIGHT","getAnnotationXEncode","ANNOTATION_PADDING","cornerRadius","getAnnotationPositionOffset","isDodgedAndStacked","metricScaleKey","scaleKey","positionOffset","addBar","DEFAULT_CATEGORICAL_DIMENSION","hasOnClick","hasSquareCorners","lineType","lineWidth","paddingRatio","PADDING_RATIO","trellisPadding","TRELLIS_PADDING","trendlines","barName","dimensionScaleType","interactiveMarkName","getInteractiveMarkName","addScales","addMarks","paddingOuter","barPaddingOuter","paddingInner","getBarPadding","isDualMetricAxis","getFirstRscSeriesIdSignal","getLastRscSeriesIdSignal","getMouseOverSeriesSignal","addHighlightedItemSignalEvents","setTrendlineSignals","dimensionDataType","TIME","findIndex","getStackFields","getStackIdTransform","getStackAggregateData","getDodgeGroupTransform","addDualMetricAxisData","addTrendlineData","addPopoverData","STACK_ID","trellis","facets","secondaryFacets","getFacetsFromOptions","baseScaleName","getBaseScaleName","primaryDomain","secondaryDomain","getScaleValues","addDimensionScale","addTrellisScale","LINE_TYPE_SCALE","OPACITY_SCALE","addSecondaryScales","getScaleIndexByType","addDomainFields","secondaryScaleName","secondaryIndex","getScaleIndexByName","primaryIndex","barMarks","getDodgedAndStackedBarMark","getStackedBarMarks","getDodgedMark","getPopovers","popover","UNSAFE_highlightBy","getDimensionSelectionRing","repeatedScale","getRepeatedScale","getTrellisGroupMark","getTrendlineMarks","getMetricScale","getDimensionScale","getDefaultScale","getDodgedGroupMark","groupedPadding","dimensionScaleKey","rangeScale","getTrellisProperties","getDodgedDimensionEncodings","getTrellisedDimensionEncodings","getMetricEncodings","startKey","endKey","getStackedMetricEncodings","startValue","endValue","getCornerRadiusEncodings","Math","max","CORNER_RADIUS","getLineWidthPixelsFromLineWidth","rectEncodeEntry","getStackedCornerRadiusEncodings","cornerRadiusTopLeft","cornerRadiusTopRight","cornerRadiusBottomLeft","cornerRadiusBottomRight","rotateRectClockwiseIfNeeded","topTestString","bottomTestString","getBaseBarEnterEncodings","getBarEnterEncodings","getOpacityProductionRule","getBarUpdateEncodings","getMarkOpacity","getStroke","strokeDash","getStrokeDash","getStrokeWidth","defaultProductionRule","SELECTED_GROUP","getStrokeDashProductionRule","lineWidthValue","popovers","popoverWithDimensionHighlightExists","getBandPadding","getStackedBackgroundBar","getStackedBar","getBaseDataSourceName","getStackedDimensionEncodings","markName","trellisAxis","trellisRangeScale","trellisScaleIndex","getTrellisedEncodeEntries","generateThresholdColorExpr","thresholds","metricField","defaultColor","sorted","thresholdMin","exprParts","nextLower","getBulletTableData","TABLE","getBulletTransforms","bulletOptions","transforms","maxScaleValue","thresholdBarColor","getBulletMarkRect","bulletMarkRectEncodeUpdateYSignal","showTarget","showTargetValue","fillColor","getBulletMarkTarget","solidColor","bulletMarkTargetEncodeUpdateY","bulletMarkTargetEncodeUpdateY2","getBulletMarkLabel","barLabelColor","getBulletMarkValueLabel","encodeUpdateSignalWidth","direction","fillExpr","getBulletMarkTargetValueLabel","getBulletMarkThreshold","baseHeightSignal","encodeUpdateYSignal","clip","getBulletTrack","trackColor","trackWidth","trackY","getBulletLabelAxesLeft","tickSize","getBulletLabelAxesRight","markGroupEncodeUpdateDirection","bulletGroupWidth","bulletMark","track","labelPosition","getBulletGroupHeightExpression","addBullet","DEFAULT_BULLET_DIRECTION","DEFAULT_LABEL_POSITION","DEFAULT_SCALE_TYPE","DEFAULT_SCALE_VALUE","groupScaleRangeSignal","xRange","domainFields","round","clamp","zero","chartPopover","applyPopoverPropDefaults","markOptions","addHighlightedData","filteredTable","markType","getGroupIdTransform","getMarkSelectedData","highlightBy","backgroundColor","DEFAULT_BACKGROUND_COLOR","colors","hiddenSeries","highlightedSeries","MARK_ID","legends","lineTypes","DEFAULT_LINE_TYPES","lineWidths","opacities","symbolShapes","symbolSizes","titles","initializeSpec","getDefaultSignals","getDefaultScales","areaCount","barCount","bulletCount","comboCount","donutCount","lineCount","scatterCount","initializeComponentCounts","specOptions","acc","addCombo","addDonut","addLine","addScatter","legend","addLegend","addTitle","parse","getFacetsFromScales","setHoverOpacityForMarks","removeUnusedScales","safeClone","signalBackgroundColor","getTwoDimensionalColorScheme","getTwoDimensionalLineTypes","getTwoDimensionalOpacities","HIGHLIGHTED_GROUP","isColors","getColors","isLineTypeArray","getStrokeDashesFromLineTypes","lineTypeArray","isNumberArray","getColorScale","getLinearColorScale","getLineTypeScale","getLineWidthScale","getOpacityScale","getSymbolShapeScale","getSymbolSizeScale","getSymbolPathWidthScale","colorSchemes","getStrokeDashFromLineType","getOrdinalScale","LINEAR_COLOR_SCALE","lineTypesArray","isSymbolShapeArray","symbolShape","getPathFromSymbolShape","getPathsFromSymbolShapes","SYMBOL_SHAPE_SCALE","SYMBOL_SIZE_SCALE","symbolSize","getVegaSymbolSizeFromRscSymbolSize","SYMBOL_PATH_WIDTH_SCALE","getSymbolWidthFromRscSymbolSize","LINE_WIDTH_SCALE","opacityArray","getSeriesIdTransform","datum","isColorScale","isStrokeDashArray","obj","structuredClone","getTooltips","chartTooltip","applyTooltipPropDefaults","tooltips","getMarkHighlightedData","highlightedGroupSignal","interactionMode","INTERACTION_MODE","ITEM","getHoverMarkNames","addMouseEvents","addHighlightMarkOpacityRules","comboName","getComboMarkName","getDimension","displayName","getDisplayName","combineNames","charAt","toUpperCase","units","getFilteredTooltipData","excludeDataKey","donutSummaries","startAngle","holeRatio","isBoolean","segmentLabels","donutOptions","filteredTableIndex","getPieTransforms","getDonutSummaryData","endAngle","getDonutSummaryScales","getArcMark","getDonutSummaryMarks","getSegmentLabelMarks","getDonutSummarySignals","getDonutSummary","applyDonutSummaryPropDefaults","donutName","DONUT_RADIUS","DONUT_SUMMARY_FONT_SIZE_RATIO","donutSummary","getBooleanDonutSummaryGroupMark","getDonutSummaryGroupMark","getSummaryValueEncode","getSummaryLabelEncode","getSummaryValueText","DONUT_SUMMARY_MIN_RADIUS","getSummaryValueBaseline","limit","getSummaryValueLimit","fontHeight","padAngle","innerRadius","outerRadius","segmentLabel","percent","valueFormat","applySegmentLabelPropDefaults","getSegmentLabel","getSegmentLabelTextMark","getSegmentLabelValueTextMark","getBaseSegmentLabelEnterEncode","positionEncodings","getSegmentLabelValueText","radius","theta","getSegmentLabelFontSize","percentSignal","rules","rule","DONUT_SEGMENT_LABEL_MIN_ANGLE","getExpressionFunctions","locale","number","numberLocale","getLocale","localeCode","formatTimeDurationLabels","formatLocaleCurrency","formatShortNumber","consoleLog","formatHorizontalTimeAxisLabels","formatVerticalAxisTimeLabels","getLabelWidth","truncateText","navigator","language","customDecimalSymbol","decimal","decimalSymbol","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","replace","shortNumber","notation","numberLocales","formatOptions","currency","currencyTemplate","precision","parseInt","split","d3Formatter","formatLocale","prevLabel","showLabel","d3","zeroPaddedFormat","sign","absoluteValue","abs","seconds","floor","log","context","document","createElement","getContext","font","ADOBE_CLEAN_FONT","measureText","maxWidth","textWidth","elipsisWidth","truncatedText","trim","expressionFunctions","facetScaleNames","getFacets","ordinalFacets","continuousFacets","isScaleWithMultiFields","facetType","getFacetsFromKeys","scaleHasKey","flattenMarks","markUsesSeriesColorScale","highlightOpacityRule","getHighlightOpacityRule","opacityRuleInsertIndex","result","isGroupMark","hasMouseInteraction","hiddenEntries","highlight","isToggleable","formattedColor","formattedLineType","formattedLineWidth","formattedSymbolShape","formatFacetRefsWithPresets","legendOptions","uniqueFacetFields","getCategoricalLegend","getContinuousLegend","labelLimit","titleLimit","getEncodings","columns","getColumns","getLegendLayout","symbolType","getSymbolType","gradientThickness","layout","getHiddenEntriesFilter","legendLabels","addHighlighSignalLegendHoverEvents","symbolEncodings","getSymbolEncodings","hoverEncodings","getHoverEncodings","legendLabelsEncodings","getLegendLabelsEncodings","showHideEncodings","getShowHideEncodings","clickEncodings","getClickEncodings","mergeLegendEncodings","descriptions","getOpacityEncoding","symbols","COMPONENT_NAME","highlightSignalName","selectedSignalName","getSymbolFacetEncoding","customValue","getHiddenSeriesColorRule","secondaryFacetMapping","linearColor","symbolPathWidth","secondaryFacet","colorValue","clickEncode","mergedEncodings","encoding","getLineHighlightedData","highlightedExpr","getLineStaticPointData","staticPoint","isSparkline","isMethodLast","getLineMark","lineMarkOptions","getYProductionRule","strokeOpacity","getLineWidthProductionRule","getXProductionRule","getLineOpacity","popoverMarkName","strokeOpacityRules","getLineHoverMarks","lineOptions","secondaryHighlightedMetric","getHoverRule","getHighlightBackgroundPoint","getSelectRingPoint","getSelectionPoint","getHighlightPoint","getSecondaryHighlightPoint","getInteractiveMarks","DEFAULT_INTERACTION_MODE","nearest","getVoronoiMarks","item","getItemHoverMarks","getPointsForVoronoi","getVoronoiPath","getItemHoverArea","staticPointTest","getSelectedTest","getLineStaticPoint","pointSize","getHighlightPointSize","getHighlightPointStrokeWidth","getHighlightOrSelectionPoint","useHighlightedData","getHighlightPointFill","getHighlightPointStroke","getHighlightPointStrokeOpacity","fillRules","selectedTest","strokeRules","baseOpacityRule","getHighlightOpacityValue","sizeRules","DEFAULT_SYMBOL_SIZE","strokeWidthRules","DEFAULT_SYMBOL_STROKE_WIDTH","metricRanges","lineName","getPopoverMarkName","addLineMarks","getMetricRangeData","getMetricRangeSignals","addHoverSignals","getMetricKeys","getTrendlineScales","getMetricRangeGroupMarks","metricKeys","getMetricRanges","metricRange","scaleAxisToFit","hoverMarkName","nestedDatum","defaultTooltip","isArea","trendline","colorScaleType","colorScaleName","getColorProductionRuleSignalString","colorRule","getSymbolSizeProductionRule","opacityValue","getScaleName","isVoronoi","getHoverSizes","getHoverMarkName","HOVER_SHAPE","getHoverSizeSignal","HOVER_SHAPE_COUNT","HOVER_SIZE","applyMetricRangeOptionDefaults","rangeOpacity","metricRangeOptions","getMetricRangeMark","parentName","domainDataKey","generateScale","isScaleMultiFieldsRef","getDimensionField","overridePadding","facetValue","facetField","isDimensionAxis","vertical","horizontal","getPadding","nice","LINEAR_PADDING","DISCRETE_PADDING","primaryScaleName","addScatterMarks","scatterGroup","getScatterMark","getScatterHoverMarks","getScatterSelectMarks","getScatterPathMarks","blend","getOpacity","scatterOptions","fadedValue","getSelectRingSize","baseSize","pow","sqrt","DEFAULT_LINEAR_DIMENSION","DEFAULT_DIMENSION_SCALE_TYPE","scatterPaths","scatterName","setScatterPathScales","getScatterPathSpecOptions","groupBy","pathWidth","scatterPathOptions","scatterColor","scatterOpacity","getScatterPaths","getScatterPathTrailMark","getPathWidth","hasSignalByName","legendName","includeHiddenSeries","getHighlightSignalUpdateExpression","hoveredSeriesExpression","getLegendLabelsSeriesSignal","getGenericUpdateSignal","datumOrder","excludeDataKeysCondition","highlightedSeriesSignal","cur","ROUNDED_SQUARE_PATH","date","DATE_PATH","sentimentNegative","SENTIMENT_NEGATIVE_PATH","sentimentNeutral","SENTIMENT_NEUTRAL_PATH","sentimentPositive","SENTIMENT_POSITIVE_PATH","baseData","chartOptions","baseSpec","autosize","contains","resize","background","mergeValuesIntoData","dataset","datasetValues","getD3FormatSpecifierFromNumberFormat","config","defaultConfig","getSpectrumVegaConfig","mergeConfig","datumProperty","DEFAULT_TITLE_FONT_WEIGHT","anchor","frame","getAggregateTransform","method","trendlineDimension","trendlineMetric","isHighResolutionData","operations","average","median","TRENDLINE_VALUE","getRegressionTransform","trendlineOptions","dimensionExtent","isDimensionNormalized","regressionMethod","getPolynomialOrder","params","extent","getRegressionExtent","getWindowTransform","frameWidth","getNormalizedDimensionTransform","MS_PER_DAY","getRegressionExtentTransform","getSortTransform","getTrendlineDimensionRangeTransforms","dimensionRange","filterExpressions","getTrendlineParamFormulaTransforms","isPolynomialMethod","getTrendlineParamLookupTransform","getTrendlineData","addTableDataTransforms","getTrendlines","concatenatedTrendlineData","isRegressionMethod","getRegressionTrendlineData","isAggregateMethod","getAggregateTrendlineData","isWindowMethod","getWindowTrendlineData","getTrendlineDisplayOnHoverData","getHighlightTrendlineData","dimensionRangeTransforms","getExcludeDataKeyTransforms","getTrendlineStatisticalTransforms","standardTrendlineDimension","getTrendlineDimensionMetric","standardTrendlinDimension","trendlineName","getTrendlineRuleMark","getDataSourceName","getTrendlineLineMark","getTrendlineAnnotationMarks","getTrendlineHoverMarks","highlightRawPoint","trendlineColor","getRuleYEncodings","getRuleXEncodings","getLineMarkOptions","getStartDimensionExtentProductionRule","getEndDimensionExtentProductionRule","startDimensionExtent","endDimensionExtent","getLineYProductionRule","getLineXProductionRule","trendlineHoverOptions","flat","override","getTrendlineColorFromMarkOptions","getTrendlineLineTypeFromMarkOptions","hasTrendlineWithNormalizedDimension","applyTrendlinePropDefaults","trendlineAnnotations","opts","getTrendlineScaleType","normalizeTrendlineDimensionName","isNormalized","extentName","trendlineOrientation","getTrendlineAnnotationSpecOptions","badge","dimensionValue","prefix","trendlineDimensionExtent","trendlineDimensionScaleType","trendlineWidth","getTrendlineAnnotations","getTrendlineAnnotationPoints","getTrendlineAnnotationTextMark","getTrendlineAnnotationBadgeMark","getTrendlineAnnotationPointX","getTrendlineAnnotationPointY","textPrefix","getTextFill","avoidMarks","getColorKey","colorString","textColors","GROUP_DATA","getVegaEmbedOptions","renderer","time","timeLocale","actions","ast","timeFormatLocale","getChartConfig","__createBinding","__esModule","__exportStar","timeLocales","__importDefault","default","G","formatDecimalParts","toExponential","indexOf","coefficient","NaN","prefixExponent","formatSpecifier","specifier","match","exec","FormatSpecifier","comma","exponent","toFixed","toLocaleString","toPrecision","formatRounded","min","formatPrefix","prefixes","grouping","thousands","group","identity","substring","reverse","currencyPrefix","currencySuffix","numerals","formatNumerals","String","minus","nan","newFormat","formatTypes","toLowerCase","suffix","maybeSuffix","valuePrefix","valueSuffix","valueNegative","out","i1","i0","formatTrim","charCodeAt","Infinity","defaultLocale","definition","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","prop","toStringTag"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://spectrumChartsVegaSpecBuilder/webpack/universalModuleDefinition","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/deepmerge/dist/cjs.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/fmin/build/fmin.js","webpack://spectrumChartsVegaSpecBuilder/../locales/dist/index.js","webpack://spectrumChartsVegaSpecBuilder/external umd \"@spectrum-charts/constants\"","webpack://spectrumChartsVegaSpecBuilder/external umd \"@spectrum-charts/themes\"","webpack://spectrumChartsVegaSpecBuilder/external umd \"@spectrum-charts/utils\"","webpack://spectrumChartsVegaSpecBuilder/webpack/bootstrap","webpack://spectrumChartsVegaSpecBuilder/webpack/runtime/compat get default export","webpack://spectrumChartsVegaSpecBuilder/webpack/runtime/define property getters","webpack://spectrumChartsVegaSpecBuilder/webpack/runtime/hasOwnProperty shorthand","webpack://spectrumChartsVegaSpecBuilder/webpack/runtime/make namespace object","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/immer/dist/immer.mjs","webpack://spectrumChartsVegaSpecBuilder/./src/data/dataUtils.ts","webpack://spectrumChartsVegaSpecBuilder/external commonjs \"vega\"","webpack://spectrumChartsVegaSpecBuilder/./src/specUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/scale/scaleSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/marks/markUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/chartTooltip/chartTooltipUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/signal/signalSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/area/areaUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/area/areaSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/axisAnnotation/axisAnnotationUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/scale/scaleUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/textUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/axis/axisUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/axis/axisLabelUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/axis/axisReferenceLineUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/axis/axisTrellisUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/axis/axisSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/chartPopover/chartPopoverUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/trendline/trendlineUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/trendline/trendlineDataTransformUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/trendline/trendlineDataUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/line/linePointUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/line/lineMarkUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/trendlineAnnotation/trendlineAnnotationUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/trendline/trendlineMarkUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/trendline/trendlineScaleUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/trendline/trendlineSignalUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bar/trellisedBarUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bar/barUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bar/barAnnotationUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bar/stackedBarUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bar/barSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bar/dodgedBarUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bullet/bulletDataUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bullet/bulletMarkUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/bullet/bulletSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/metricRange/metricRangeUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/line/lineUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/line/lineSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/line/lineDataUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/combo/comboSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/donut/donutSummaryUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/donut/segmentLabelUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/donut/donutSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/donut/donutUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/legend/legendHighlightUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/legend/legendFacetUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/legend/legendUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/legend/legendSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/scatterPath/scatterPathUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/scatter/scatterMarkUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/scatter/scatterSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/title/titleSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/venn-helper/dist/index.js","webpack://spectrumChartsVegaSpecBuilder/./src/venn/vennUtils.ts","webpack://spectrumChartsVegaSpecBuilder/./src/venn/vennSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/./src/chartSpecBuilder.ts","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/formatDecimal.js","webpack://spectrumChartsVegaSpecBuilder/./src/types/specUtil.types.ts","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/formatSpecifier.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/formatPrefixAuto.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/formatRounded.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/formatTypes.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/identity.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/locale.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/formatGroup.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/formatNumerals.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/formatTrim.js","webpack://spectrumChartsVegaSpecBuilder/../../node_modules/d3-format/src/exponent.js","webpack://spectrumChartsVegaSpecBuilder/./src/expressionFunctions/expressionFunctions.ts","webpack://spectrumChartsVegaSpecBuilder/./src/vegaEmbedUtils.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@spectrum-charts/constants\"), require(\"@spectrum-charts/themes\"), require(\"@spectrum-charts/utils\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"@spectrum-charts/constants\", \"@spectrum-charts/themes\", \"@spectrum-charts/utils\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"spectrumChartsVegaSpecBuilder\"] = factory(require(\"@spectrum-charts/constants\"), require(\"@spectrum-charts/themes\"), require(\"@spectrum-charts/utils\"));\n\telse\n\t\troot[\"spectrumChartsVegaSpecBuilder\"] = factory(root[\"@spectrum-charts/constants\"], root[\"@spectrum-charts/themes\"], root[\"@spectrum-charts/utils\"]);\n})(this, (__WEBPACK_EXTERNAL_MODULE__633__, __WEBPACK_EXTERNAL_MODULE__274__, __WEBPACK_EXTERNAL_MODULE__365__) => {\nreturn ","'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction getEnumerableOwnPropertySymbols(target) {\n\treturn Object.getOwnPropertySymbols\n\t\t? Object.getOwnPropertySymbols(target).filter(function(symbol) {\n\t\t\treturn Object.propertyIsEnumerable.call(target, symbol)\n\t\t})\n\t\t: []\n}\n\nfunction getKeys(target) {\n\treturn Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))\n}\n\nfunction propertyIsOnObject(object, property) {\n\ttry {\n\t\treturn property in object\n\t} catch(_) {\n\t\treturn false\n\t}\n}\n\n// Protects from prototype poisoning and unexpected merging up the prototype chain.\nfunction propertyIsUnsafe(target, key) {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tgetKeys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tgetKeys(source).forEach(function(key) {\n\t\tif (propertyIsUnsafe(target, key)) {\n\t\t\treturn\n\t\t}\n\n\t\tif (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\t// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()\n\t// implementations can use it. The caller may not replace it.\n\toptions.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (factory((global.fmin = global.fmin || {})));\n}(this, function (exports) { 'use strict';\n\n /** finds the zeros of a function, given two starting points (which must\n * have opposite signs */\n function bisect(f, a, b, parameters) {\n parameters = parameters || {};\n var maxIterations = parameters.maxIterations || 100,\n tolerance = parameters.tolerance || 1e-10,\n fA = f(a),\n fB = f(b),\n delta = b - a;\n\n if (fA * fB > 0) {\n throw \"Initial bisect points must have opposite signs\";\n }\n\n if (fA === 0) return a;\n if (fB === 0) return b;\n\n for (var i = 0; i < maxIterations; ++i) {\n delta /= 2;\n var mid = a + delta,\n fMid = f(mid);\n\n if (fMid * fA >= 0) {\n a = mid;\n }\n\n if ((Math.abs(delta) < tolerance) || (fMid === 0)) {\n return mid;\n }\n }\n return a + delta;\n }\n\n // need some basic operations on vectors, rather than adding a dependency,\n // just define here\n function zeros(x) { var r = new Array(x); for (var i = 0; i < x; ++i) { r[i] = 0; } return r; }\n function zerosM(x,y) { return zeros(x).map(function() { return zeros(y); }); }\n\n function dot(a, b) {\n var ret = 0;\n for (var i = 0; i < a.length; ++i) {\n ret += a[i] * b[i];\n }\n return ret;\n }\n\n function norm2(a) {\n return Math.sqrt(dot(a, a));\n }\n\n function scale(ret, value, c) {\n for (var i = 0; i < value.length; ++i) {\n ret[i] = value[i] * c;\n }\n }\n\n function weightedSum(ret, w1, v1, w2, v2) {\n for (var j = 0; j < ret.length; ++j) {\n ret[j] = w1 * v1[j] + w2 * v2[j];\n }\n }\n\n /** minimizes a function using the downhill simplex method */\n function nelderMead(f, x0, parameters) {\n parameters = parameters || {};\n\n var maxIterations = parameters.maxIterations || x0.length * 200,\n nonZeroDelta = parameters.nonZeroDelta || 1.05,\n zeroDelta = parameters.zeroDelta || 0.001,\n minErrorDelta = parameters.minErrorDelta || 1e-6,\n minTolerance = parameters.minErrorDelta || 1e-5,\n rho = (parameters.rho !== undefined) ? parameters.rho : 1,\n chi = (parameters.chi !== undefined) ? parameters.chi : 2,\n psi = (parameters.psi !== undefined) ? parameters.psi : -0.5,\n sigma = (parameters.sigma !== undefined) ? parameters.sigma : 0.5,\n maxDiff;\n\n // initialize simplex.\n var N = x0.length,\n simplex = new Array(N + 1);\n simplex[0] = x0;\n simplex[0].fx = f(x0);\n simplex[0].id = 0;\n for (var i = 0; i < N; ++i) {\n var point = x0.slice();\n point[i] = point[i] ? point[i] * nonZeroDelta : zeroDelta;\n simplex[i+1] = point;\n simplex[i+1].fx = f(point);\n simplex[i+1].id = i+1;\n }\n\n function updateSimplex(value) {\n for (var i = 0; i < value.length; i++) {\n simplex[N][i] = value[i];\n }\n simplex[N].fx = value.fx;\n }\n\n var sortOrder = function(a, b) { return a.fx - b.fx; };\n\n var centroid = x0.slice(),\n reflected = x0.slice(),\n contracted = x0.slice(),\n expanded = x0.slice();\n\n for (var iteration = 0; iteration < maxIterations; ++iteration) {\n simplex.sort(sortOrder);\n\n if (parameters.history) {\n // copy the simplex (since later iterations will mutate) and\n // sort it to have a consistent order between iterations\n var sortedSimplex = simplex.map(function (x) {\n var state = x.slice();\n state.fx = x.fx;\n state.id = x.id;\n return state;\n });\n sortedSimplex.sort(function(a,b) { return a.id - b.id; });\n\n parameters.history.push({x: simplex[0].slice(),\n fx: simplex[0].fx,\n simplex: sortedSimplex});\n }\n\n maxDiff = 0;\n for (i = 0; i < N; ++i) {\n maxDiff = Math.max(maxDiff, Math.abs(simplex[0][i] - simplex[1][i]));\n }\n\n if ((Math.abs(simplex[0].fx - simplex[N].fx) < minErrorDelta) &&\n (maxDiff < minTolerance)) {\n break;\n }\n\n // compute the centroid of all but the worst point in the simplex\n for (i = 0; i < N; ++i) {\n centroid[i] = 0;\n for (var j = 0; j < N; ++j) {\n centroid[i] += simplex[j][i];\n }\n centroid[i] /= N;\n }\n\n // reflect the worst point past the centroid and compute loss at reflected\n // point\n var worst = simplex[N];\n weightedSum(reflected, 1+rho, centroid, -rho, worst);\n reflected.fx = f(reflected);\n\n // if the reflected point is the best seen, then possibly expand\n if (reflected.fx < simplex[0].fx) {\n weightedSum(expanded, 1+chi, centroid, -chi, worst);\n expanded.fx = f(expanded);\n if (expanded.fx < reflected.fx) {\n updateSimplex(expanded);\n } else {\n updateSimplex(reflected);\n }\n }\n\n // if the reflected point is worse than the second worst, we need to\n // contract\n else if (reflected.fx >= simplex[N-1].fx) {\n var shouldReduce = false;\n\n if (reflected.fx > worst.fx) {\n // do an inside contraction\n weightedSum(contracted, 1+psi, centroid, -psi, worst);\n contracted.fx = f(contracted);\n if (contracted.fx < worst.fx) {\n updateSimplex(contracted);\n } else {\n shouldReduce = true;\n }\n } else {\n // do an outside contraction\n weightedSum(contracted, 1-psi * rho, centroid, psi*rho, worst);\n contracted.fx = f(contracted);\n if (contracted.fx < reflected.fx) {\n updateSimplex(contracted);\n } else {\n shouldReduce = true;\n }\n }\n\n if (shouldReduce) {\n // if we don't contract here, we're done\n if (sigma >= 1) break;\n\n // do a reduction\n for (i = 1; i < simplex.length; ++i) {\n weightedSum(simplex[i], 1 - sigma, simplex[0], sigma, simplex[i]);\n simplex[i].fx = f(simplex[i]);\n }\n }\n } else {\n updateSimplex(reflected);\n }\n }\n\n simplex.sort(sortOrder);\n return {fx : simplex[0].fx,\n x : simplex[0]};\n }\n\n /// searches along line 'pk' for a point that satifies the wolfe conditions\n /// See 'Numerical Optimization' by Nocedal and Wright p59-60\n /// f : objective function\n /// pk : search direction\n /// current: object containing current gradient/loss\n /// next: output: contains next gradient/loss\n /// returns a: step size taken\n function wolfeLineSearch(f, pk, current, next, a, c1, c2) {\n var phi0 = current.fx, phiPrime0 = dot(current.fxprime, pk),\n phi = phi0, phi_old = phi0,\n phiPrime = phiPrime0,\n a0 = 0;\n\n a = a || 1;\n c1 = c1 || 1e-6;\n c2 = c2 || 0.1;\n\n function zoom(a_lo, a_high, phi_lo) {\n for (var iteration = 0; iteration < 16; ++iteration) {\n a = (a_lo + a_high)/2;\n weightedSum(next.x, 1.0, current.x, a, pk);\n phi = next.fx = f(next.x, next.fxprime);\n phiPrime = dot(next.fxprime, pk);\n\n if ((phi > (phi0 + c1 * a * phiPrime0)) ||\n (phi >= phi_lo)) {\n a_high = a;\n\n } else {\n if (Math.abs(phiPrime) <= -c2 * phiPrime0) {\n return a;\n }\n\n if (phiPrime * (a_high - a_lo) >=0) {\n a_high = a_lo;\n }\n\n a_lo = a;\n phi_lo = phi;\n }\n }\n\n return 0;\n }\n\n for (var iteration = 0; iteration < 10; ++iteration) {\n weightedSum(next.x, 1.0, current.x, a, pk);\n phi = next.fx = f(next.x, next.fxprime);\n phiPrime = dot(next.fxprime, pk);\n if ((phi > (phi0 + c1 * a * phiPrime0)) ||\n (iteration && (phi >= phi_old))) {\n return zoom(a0, a, phi_old);\n }\n\n if (Math.abs(phiPrime) <= -c2 * phiPrime0) {\n return a;\n }\n\n if (phiPrime >= 0 ) {\n return zoom(a, a0, phi);\n }\n\n phi_old = phi;\n a0 = a;\n a *= 2;\n }\n\n return a;\n }\n\n function conjugateGradient(f, initial, params) {\n // allocate all memory up front here, keep out of the loop for perfomance\n // reasons\n var current = {x: initial.slice(), fx: 0, fxprime: initial.slice()},\n next = {x: initial.slice(), fx: 0, fxprime: initial.slice()},\n yk = initial.slice(),\n pk, temp,\n a = 1,\n maxIterations;\n\n params = params || {};\n maxIterations = params.maxIterations || initial.length * 20;\n\n current.fx = f(current.x, current.fxprime);\n pk = current.fxprime.slice();\n scale(pk, current.fxprime,-1);\n\n for (var i = 0; i < maxIterations; ++i) {\n a = wolfeLineSearch(f, pk, current, next, a);\n\n // todo: history in wrong spot?\n if (params.history) {\n params.history.push({x: current.x.slice(),\n fx: current.fx,\n fxprime: current.fxprime.slice(),\n alpha: a});\n }\n\n if (!a) {\n // faiiled to find point that satifies wolfe conditions.\n // reset direction for next iteration\n scale(pk, current.fxprime, -1);\n\n } else {\n // update direction using Polak–Ribiere CG method\n weightedSum(yk, 1, next.fxprime, -1, current.fxprime);\n\n var delta_k = dot(current.fxprime, current.fxprime),\n beta_k = Math.max(0, dot(yk, next.fxprime) / delta_k);\n\n weightedSum(pk, beta_k, pk, -1, next.fxprime);\n\n temp = current;\n current = next;\n next = temp;\n }\n\n if (norm2(current.fxprime) <= 1e-5) {\n break;\n }\n }\n\n if (params.history) {\n params.history.push({x: current.x.slice(),\n fx: current.fx,\n fxprime: current.fxprime.slice(),\n alpha: a});\n }\n\n return current;\n }\n\n function gradientDescent(f, initial, params) {\n params = params || {};\n var maxIterations = params.maxIterations || initial.length * 100,\n learnRate = params.learnRate || 0.001,\n current = {x: initial.slice(), fx: 0, fxprime: initial.slice()};\n\n for (var i = 0; i < maxIterations; ++i) {\n current.fx = f(current.x, current.fxprime);\n if (params.history) {\n params.history.push({x: current.x.slice(),\n fx: current.fx,\n fxprime: current.fxprime.slice()});\n }\n\n weightedSum(current.x, 1, current.x, -learnRate, current.fxprime);\n if (norm2(current.fxprime) <= 1e-5) {\n break;\n }\n }\n\n return current;\n }\n\n function gradientDescentLineSearch(f, initial, params) {\n params = params || {};\n var current = {x: initial.slice(), fx: 0, fxprime: initial.slice()},\n next = {x: initial.slice(), fx: 0, fxprime: initial.slice()},\n maxIterations = params.maxIterations || initial.length * 100,\n learnRate = params.learnRate || 1,\n pk = initial.slice(),\n c1 = params.c1 || 1e-3,\n c2 = params.c2 || 0.1,\n temp,\n functionCalls = [];\n\n if (params.history) {\n // wrap the function call to track linesearch samples\n var inner = f;\n f = function(x, fxprime) {\n functionCalls.push(x.slice());\n return inner(x, fxprime);\n };\n }\n\n current.fx = f(current.x, current.fxprime);\n for (var i = 0; i < maxIterations; ++i) {\n scale(pk, current.fxprime, -1);\n learnRate = wolfeLineSearch(f, pk, current, next, learnRate, c1, c2);\n\n if (params.history) {\n params.history.push({x: current.x.slice(),\n fx: current.fx,\n fxprime: current.fxprime.slice(),\n functionCalls: functionCalls,\n learnRate: learnRate,\n alpha: learnRate});\n functionCalls = [];\n }\n\n\n temp = current;\n current = next;\n next = temp;\n\n if ((learnRate === 0) || (norm2(current.fxprime) < 1e-5)) break;\n }\n\n return current;\n }\n\n exports.bisect = bisect;\n exports.nelderMead = nelderMead;\n exports.conjugateGradient = conjugateGradient;\n exports.gradientDescent = gradientDescent;\n exports.gradientDescentLineSearch = gradientDescentLineSearch;\n exports.zeros = zeros;\n exports.zerosM = zerosM;\n exports.norm2 = norm2;\n exports.weightedSum = weightedSum;\n exports.scale = scale;\n\n}));","/*! For license information please see index.js.LICENSE.txt */\n!function(e,r){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=r():\"function\"==typeof define&&define.amd?define([],r):\"object\"==typeof exports?exports.spectrumChartsLocales=r():e.spectrumChartsLocales=r()}(this,(()=>(()=>{\"use strict\";var e={d:(r,a)=>{for(var s in a)e.o(a,s)&&!e.o(r,s)&&Object.defineProperty(r,s,{enumerable:!0,get:a[s]})},o:(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r:e=>{\"undefined\"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})}},r={};e.r(r),e.d(r,{getLocale:()=>o,numberLocales:()=>a,timeLocales:()=>s});const a={\"ar-AE\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" د.إ.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-BH\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" د.ب.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-DJ\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"Fdj \",\"\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-DZ\":JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"د.ج. \",\"\"]}'),\"ar-EG\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ج.م.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-IL\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"₪ \",\"\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-IQ\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" د.ع.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-JO\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" د.أ.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-KM\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ف.ج.ق.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-KW\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" د.ك.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-LB\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ل.ل.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-LY\":JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"د.ل. \",\"\"]}'),\"ar-MA\":JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"د.م. \",\"\"]}'),\"ar-OM\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ر.ع.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-PS\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"₪ \",\"\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-QA\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ر.ق.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-SA\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ر.س.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-SD\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ج.س.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-SO\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"S \",\"\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-SS\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"£ \",\"\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-SY\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ل.س.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-TD\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"FCFA \",\"\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ar-TN\":JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"د.ت. \",\"\"]}'),\"ar-YE\":JSON.parse('{\"decimal\":\"٫\",\"thousands\":\"٬\",\"grouping\":[3],\"currency\":[\"\",\" ر.ى.\"],\"numerals\":[\"٠\",\"١\",\"٢\",\"٣\",\"٤\",\"٥\",\"٦\",\"٧\",\"٨\",\"٩\"]}'),\"ca-ES\":JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"\",\" €\"]}'),\"cs-CZ\":JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\" Kč\"]}'),\"da-DK\":JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"\",\" kr\"]}'),\"de-CH\":JSON.parse('{\"decimal\":\",\",\"thousands\":\"\\'\",\"grouping\":[3],\"currency\":[\"\",\" CHF\"]}'),\"de-DE\":JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"\",\" €\"]}'),\"en-CA\":JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"$\",\"\"]}'),\"en-GB\":JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"£\",\"\"]}'),\"en-IE\":JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"€\",\"\"]}'),\"en-IN\":JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3,2,2,2,2,2,2,2,2,2],\"currency\":[\"₹\",\"\"]}'),\"en-US\":JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"$\",\"\"]}'),\"es-BO\":JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"Bs \",\"\"],\"percent\":\" %\"}'),\"es-ES\":JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"\",\" €\"]}'),\"es-MX\":JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"$\",\"\"]}'),\"fi-FI\":JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\" €\"]}'),\"fr-CA\":JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\"$\"]}'),\"fr-FR\":JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\" €\"],\"percent\":\" %\"}'),\"he-IL\":JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"₪\",\"\"]}'),\"hu-HU\":JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\" Ft\"]}'),\"it-IT\":JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"€\",\"\"]}'),\"ja-JP\":JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"\",\"円\"]}'),\"ko-KR\":JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"₩\",\"\"]}'),\"mk-MK\":JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"\",\" ден.\"]}'),\"nl-NL\":JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"€ \",\"\"]}'),\"pl-PL\":JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"\",\"zł\"]}'),\"pt-BR\":JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"R$\",\"\"]}'),\"pt-PT\":JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\" €\"]}'),\"ru-RU\":JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\" ₽\"]}'),\"sl-SI\":JSON.parse('{\"decimal\":\",\",\"thousands\":\".\",\"grouping\":[3],\"currency\":[\"\",\" €\"]}'),\"sv-SE\":JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\" kr\"]}'),\"uk-UA\":JSON.parse('{\"decimal\":\",\",\"thousands\":\" \",\"grouping\":[3],\"currency\":[\"\",\" ₴.\"]}'),\"zh-CN\":JSON.parse('{\"decimal\":\".\",\"thousands\":\",\",\"grouping\":[3],\"currency\":[\"¥\",\"\"]}')},s={\"ar-EG\":JSON.parse('{\"dateTime\":\"%x, %X\",\"date\":\"%-d/%-m/%Y\",\"time\":\"%-I:%M:%S %p\",\"periods\":[\"ص\",\"م\"],\"days\":[\"الأحد\",\"الإثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],\"shortDays\":[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"],\"months\":[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"],\"shortMonths\":[\"يناير\",\"فبراير\",\"مارس\",\"أبريل\",\"مايو\",\"يونيو\",\"يوليو\",\"أغسطس\",\"سبتمبر\",\"أكتوبر\",\"نوفمبر\",\"ديسمبر\"]}'),\"ar-SY\":JSON.parse('{\"dateTime\":\"%x, %X\",\"date\":\"%-d/%-m/%Y\",\"time\":\"%-I:%M:%S %p\",\"periods\":[\"ص\",\"م\"],\"days\":[\"الأحد\",\"الإثنين\",\"الثلاثاء\",\"الأربعاء\",\"الخميس\",\"الجمعة\",\"السبت\"],\"shortDays\":[\"أحد\",\"إثنين\",\"ثلاثاء\",\"أربعاء\",\"خميس\",\"جمعة\",\"سبت\"],\"months\":[\"كانون الثاني\",\"شباط\",\"آذار\",\"نيسان\",\"أيار\",\"حزيران\",\"تموز\",\"آب\",\"أيلول\",\"تشرين الأول\",\"تشرين الثاني\",\"كانون الأول\"],\"shortMonths\":[\"ك٢\",\"شباط\",\"آذار\",\"نيسان\",\"أيار\",\"حزيران\",\"تموز\",\"آب\",\"أيلول\",\"ت١\",\"ت٢\",\"ك١\"]}'),\"ca-ES\":JSON.parse('{\"dateTime\":\"%A, %e de %B de %Y, %X\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"diumenge\",\"dilluns\",\"dimarts\",\"dimecres\",\"dijous\",\"divendres\",\"dissabte\"],\"shortDays\":[\"dg.\",\"dl.\",\"dt.\",\"dc.\",\"dj.\",\"dv.\",\"ds.\"],\"months\":[\"gener\",\"febrer\",\"març\",\"abril\",\"maig\",\"juny\",\"juliol\",\"agost\",\"setembre\",\"octubre\",\"novembre\",\"desembre\"],\"shortMonths\":[\"gen.\",\"febr.\",\"març\",\"abr.\",\"maig\",\"juny\",\"jul.\",\"ag.\",\"set.\",\"oct.\",\"nov.\",\"des.\"]}'),\"cs-CZ\":JSON.parse('{\"dateTime\":\"%A,%e.%B %Y, %X\",\"date\":\"%-d.%-m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"neděle\",\"pondělí\",\"úterý\",\"středa\",\"čvrtek\",\"pátek\",\"sobota\"],\"shortDays\":[\"ne.\",\"po.\",\"út.\",\"st.\",\"čt.\",\"pá.\",\"so.\"],\"months\":[\"leden\",\"únor\",\"březen\",\"duben\",\"květen\",\"červen\",\"červenec\",\"srpen\",\"září\",\"říjen\",\"listopad\",\"prosinec\"],\"shortMonths\":[\"led\",\"úno\",\"břez\",\"dub\",\"kvě\",\"čer\",\"červ\",\"srp\",\"zář\",\"říj\",\"list\",\"pros\"]}'),\"da-DK\":JSON.parse('{\"dateTime\":\"%A den %d %B %Y %X\",\"date\":\"%d-%m-%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"søndag\",\"mandag\",\"tirsdag\",\"onsdag\",\"torsdag\",\"fredag\",\"lørdag\"],\"shortDays\":[\"søn\",\"man\",\"tir\",\"ons\",\"tor\",\"fre\",\"lør\"],\"months\":[\"januar\",\"februar\",\"marts\",\"april\",\"maj\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"december\"],\"shortMonths\":[\"jan\",\"feb\",\"mar\",\"apr\",\"maj\",\"jun\",\"jul\",\"aug\",\"sep\",\"okt\",\"nov\",\"dec\"]}'),\"de-CH\":JSON.parse('{\"dateTime\":\"%A, der %e. %B %Y, %X\",\"date\":\"%d.%m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],\"shortDays\":[\"So\",\"Mo\",\"Di\",\"Mi\",\"Do\",\"Fr\",\"Sa\"],\"months\":[\"Januar\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Juli\",\"August\",\"September\",\"Oktober\",\"November\",\"Dezember\"],\"shortMonths\":[\"Jan\",\"Feb\",\"Mrz\",\"Apr\",\"Mai\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Okt\",\"Nov\",\"Dez\"]}'),\"de-DE\":JSON.parse('{\"dateTime\":\"%A, der %e. %B %Y, %X\",\"date\":\"%d.%m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Sonntag\",\"Montag\",\"Dienstag\",\"Mittwoch\",\"Donnerstag\",\"Freitag\",\"Samstag\"],\"shortDays\":[\"So\",\"Mo\",\"Di\",\"Mi\",\"Do\",\"Fr\",\"Sa\"],\"months\":[\"Januar\",\"Februar\",\"März\",\"April\",\"Mai\",\"Juni\",\"Juli\",\"August\",\"September\",\"Oktober\",\"November\",\"Dezember\"],\"shortMonths\":[\"Jan\",\"Feb\",\"Mrz\",\"Apr\",\"Mai\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Okt\",\"Nov\",\"Dez\"]}'),\"en-CA\":JSON.parse('{\"dateTime\":\"%a %b %e %X %Y\",\"date\":\"%Y-%m-%d\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"shortDays\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"months\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],\"shortMonths\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"]}'),\"en-GB\":JSON.parse('{\"dateTime\":\"%a %e %b %X %Y\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"shortDays\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"months\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],\"shortMonths\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"]}'),\"en-US\":JSON.parse('{\"dateTime\":\"%x, %X\",\"date\":\"%-m/%-d/%Y\",\"time\":\"%-I:%M:%S %p\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\"shortDays\":[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\"months\":[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],\"shortMonths\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"]}'),\"es-ES\":JSON.parse('{\"dateTime\":\"%A, %e de %B de %Y, %X\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],\"shortDays\":[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],\"months\":[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"],\"shortMonths\":[\"ene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sep\",\"oct\",\"nov\",\"dic\"]}'),\"es-MX\":JSON.parse('{\"dateTime\":\"%x, %X\",\"date\":\"%d/%m/%Y\",\"time\":\"%-I:%M:%S %p\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"domingo\",\"lunes\",\"martes\",\"miércoles\",\"jueves\",\"viernes\",\"sábado\"],\"shortDays\":[\"dom\",\"lun\",\"mar\",\"mié\",\"jue\",\"vie\",\"sáb\"],\"months\":[\"enero\",\"febrero\",\"marzo\",\"abril\",\"mayo\",\"junio\",\"julio\",\"agosto\",\"septiembre\",\"octubre\",\"noviembre\",\"diciembre\"],\"shortMonths\":[\"ene\",\"feb\",\"mar\",\"abr\",\"may\",\"jun\",\"jul\",\"ago\",\"sep\",\"oct\",\"nov\",\"dic\"]}'),\"fa-IR\":JSON.parse('{\"dateTime\":\"%x, %X\",\"date\":\"%-d/%-m/%Y\",\"time\":\"%-I:%M:%S %p\",\"periods\":[\"صبح\",\"عصر\"],\"days\":[\"یکشنبه\",\"دوشنبه\",\"سه شنبه\",\"چهارشنبه\",\"پنجشنبه\",\"جمعه\",\"شنبه\"],\"shortDays\":[\"یکشنبه\",\"دوشنبه\",\"سه شنبه\",\"چهارشنبه\",\"پنجشنبه\",\"جمعه\",\"شنبه\"],\"months\":[\"ژانویه\",\"فوریه\",\"مارس\",\"آوریل\",\"مه\",\"ژوئن\",\"ژوئیه\",\"اوت\",\"سپتامبر\",\"اکتبر\",\"نوامبر\",\"دسامبر\"],\"shortMonths\":[\"ژانویه\",\"فوریه\",\"مارس\",\"آوریل\",\"مه\",\"ژوئن\",\"ژوئیه\",\"اوت\",\"سپتامبر\",\"اکتبر\",\"نوامبر\",\"دسامبر\"]}'),\"fi-FI\":JSON.parse('{\"dateTime\":\"%A, %-d. %Bta %Y klo %X\",\"date\":\"%-d.%-m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"a.m.\",\"p.m.\"],\"days\":[\"sunnuntai\",\"maanantai\",\"tiistai\",\"keskiviikko\",\"torstai\",\"perjantai\",\"lauantai\"],\"shortDays\":[\"Su\",\"Ma\",\"Ti\",\"Ke\",\"To\",\"Pe\",\"La\"],\"months\":[\"tammikuu\",\"helmikuu\",\"maaliskuu\",\"huhtikuu\",\"toukokuu\",\"kesäkuu\",\"heinäkuu\",\"elokuu\",\"syyskuu\",\"lokakuu\",\"marraskuu\",\"joulukuu\"],\"shortMonths\":[\"Tammi\",\"Helmi\",\"Maalis\",\"Huhti\",\"Touko\",\"Kesä\",\"Heinä\",\"Elo\",\"Syys\",\"Loka\",\"Marras\",\"Joulu\"]}'),\"fr-CA\":JSON.parse('{\"dateTime\":\"%a %e %b %Y %X\",\"date\":\"%Y-%m-%d\",\"time\":\"%H:%M:%S\",\"periods\":[\"\",\"\"],\"days\":[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],\"shortDays\":[\"dim\",\"lun\",\"mar\",\"mer\",\"jeu\",\"ven\",\"sam\"],\"months\":[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"],\"shortMonths\":[\"jan\",\"fév\",\"mar\",\"avr\",\"mai\",\"jui\",\"jul\",\"aoû\",\"sep\",\"oct\",\"nov\",\"déc\"]}'),\"fr-FR\":JSON.parse('{\"dateTime\":\"%A %e %B %Y à %X\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"dimanche\",\"lundi\",\"mardi\",\"mercredi\",\"jeudi\",\"vendredi\",\"samedi\"],\"shortDays\":[\"dim.\",\"lun.\",\"mar.\",\"mer.\",\"jeu.\",\"ven.\",\"sam.\"],\"months\":[\"janvier\",\"février\",\"mars\",\"avril\",\"mai\",\"juin\",\"juillet\",\"août\",\"septembre\",\"octobre\",\"novembre\",\"décembre\"],\"shortMonths\":[\"janv.\",\"févr.\",\"mars\",\"avr.\",\"mai\",\"juin\",\"juil.\",\"août\",\"sept.\",\"oct.\",\"nov.\",\"déc.\"]}'),\"he-IL\":JSON.parse('{\"dateTime\":\"%A, %e ב%B %Y %X\",\"date\":\"%d.%m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"ראשון\",\"שני\",\"שלישי\",\"רביעי\",\"חמישי\",\"שישי\",\"שבת\"],\"shortDays\":[\"א׳\",\"ב׳\",\"ג׳\",\"ד׳\",\"ה׳\",\"ו׳\",\"ש׳\"],\"months\":[\"ינואר\",\"פברואר\",\"מרץ\",\"אפריל\",\"מאי\",\"יוני\",\"יולי\",\"אוגוסט\",\"ספטמבר\",\"אוקטובר\",\"נובמבר\",\"דצמבר\"],\"shortMonths\":[\"ינו׳\",\"פבר׳\",\"מרץ\",\"אפר׳\",\"מאי\",\"יוני\",\"יולי\",\"אוג׳\",\"ספט׳\",\"אוק׳\",\"נוב׳\",\"דצמ׳\"]}'),\"hr-HR\":JSON.parse('{\"dateTime\":\"%A, %e. %B %Y., %X\",\"date\":\"%d. %m. %Y.\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Nedjelja\",\"Ponedjeljak\",\"Utorak\",\"Srijeda\",\"Četvtrak\",\"Petak\",\"Subota\"],\"shortDays\":[\"Ne\",\"Po\",\"Ut\",\"Sr\",\"Če\",\"Pe\",\"Su\"],\"months\":[\"Siječanj\",\"Veljača\",\"Ožujak\",\"Travanj\",\"Svibanj\",\"Lipanj\",\"Srpanj\",\"Kolovoz\",\"Rujan\",\"Listopad\",\"Studeni\",\"Prosinac\"],\"shortMonths\":[\"Sij\",\"Velj\",\"Ožu\",\"Tra\",\"Svi\",\"Lip\",\"Srp\",\"Kol\",\"Ruj\",\"Lis\",\"Stu\",\"Pro\"]}'),\"hu-HU\":JSON.parse('{\"dateTime\":\"%Y. %B %-e., %A %X\",\"date\":\"%Y. %m. %d.\",\"time\":\"%H:%M:%S\",\"periods\":[\"de.\",\"du.\"],\"days\":[\"vasárnap\",\"hétfő\",\"kedd\",\"szerda\",\"csütörtök\",\"péntek\",\"szombat\"],\"shortDays\":[\"V\",\"H\",\"K\",\"Sze\",\"Cs\",\"P\",\"Szo\"],\"months\":[\"január\",\"február\",\"március\",\"április\",\"május\",\"június\",\"július\",\"augusztus\",\"szeptember\",\"október\",\"november\",\"december\"],\"shortMonths\":[\"jan.\",\"feb.\",\"már.\",\"ápr.\",\"máj.\",\"jún.\",\"júl.\",\"aug.\",\"szept.\",\"okt.\",\"nov.\",\"dec.\"]}'),\"it-IT\":JSON.parse('{\"dateTime\":\"%A %e %B %Y, %X\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Domenica\",\"Lunedì\",\"Martedì\",\"Mercoledì\",\"Giovedì\",\"Venerdì\",\"Sabato\"],\"shortDays\":[\"Dom\",\"Lun\",\"Mar\",\"Mer\",\"Gio\",\"Ven\",\"Sab\"],\"months\":[\"Gennaio\",\"Febbraio\",\"Marzo\",\"Aprile\",\"Maggio\",\"Giugno\",\"Luglio\",\"Agosto\",\"Settembre\",\"Ottobre\",\"Novembre\",\"Dicembre\"],\"shortMonths\":[\"Gen\",\"Feb\",\"Mar\",\"Apr\",\"Mag\",\"Giu\",\"Lug\",\"Ago\",\"Set\",\"Ott\",\"Nov\",\"Dic\"]}'),\"ja-JP\":JSON.parse('{\"dateTime\":\"%x %a %X\",\"date\":\"%Y/%m/%d\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"日曜日\",\"月曜日\",\"火曜日\",\"水曜日\",\"木曜日\",\"金曜日\",\"土曜日\"],\"shortDays\":[\"日\",\"月\",\"火\",\"水\",\"木\",\"金\",\"土\"],\"months\":[\"1月\",\"2月\",\"3月\",\"4月\",\"5月\",\"6月\",\"7月\",\"8月\",\"9月\",\"10月\",\"11月\",\"12月\"],\"shortMonths\":[\"1月\",\"2月\",\"3月\",\"4月\",\"5月\",\"6月\",\"7月\",\"8月\",\"9月\",\"10月\",\"11月\",\"12月\"]}'),\"ko-KR\":JSON.parse('{\"dateTime\":\"%Y/%m/%d %a %X\",\"date\":\"%Y/%m/%d\",\"time\":\"%H:%M:%S\",\"periods\":[\"오전\",\"오후\"],\"days\":[\"일요일\",\"월요일\",\"화요일\",\"수요일\",\"목요일\",\"금요일\",\"토요일\"],\"shortDays\":[\"일\",\"월\",\"화\",\"수\",\"목\",\"금\",\"토\"],\"months\":[\"1월\",\"2월\",\"3월\",\"4월\",\"5월\",\"6월\",\"7월\",\"8월\",\"9월\",\"10월\",\"11월\",\"12월\"],\"shortMonths\":[\"1월\",\"2월\",\"3월\",\"4월\",\"5월\",\"6월\",\"7월\",\"8월\",\"9월\",\"10월\",\"11월\",\"12월\"]}'),\"mk-MK\":JSON.parse('{\"dateTime\":\"%A, %e %B %Y г. %X\",\"date\":\"%d.%m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"недела\",\"понеделник\",\"вторник\",\"среда\",\"четврток\",\"петок\",\"сабота\"],\"shortDays\":[\"нед\",\"пон\",\"вто\",\"сре\",\"чет\",\"пет\",\"саб\"],\"months\":[\"јануари\",\"февруари\",\"март\",\"април\",\"мај\",\"јуни\",\"јули\",\"август\",\"септември\",\"октомври\",\"ноември\",\"декември\"],\"shortMonths\":[\"јан\",\"фев\",\"мар\",\"апр\",\"мај\",\"јун\",\"јул\",\"авг\",\"сеп\",\"окт\",\"ное\",\"дек\"]}'),\"nb-NO\":JSON.parse('{\"dateTime\":\"%A den %d. %B %Y %X\",\"date\":\"%d.%m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"søndag\",\"mandag\",\"tirsdag\",\"onsdag\",\"torsdag\",\"fredag\",\"lørdag\"],\"shortDays\":[\"søn\",\"man\",\"tir\",\"ons\",\"tor\",\"fre\",\"lør\"],\"months\":[\"januar\",\"februar\",\"mars\",\"april\",\"mai\",\"juni\",\"juli\",\"august\",\"september\",\"oktober\",\"november\",\"desember\"],\"shortMonths\":[\"jan\",\"feb\",\"mars\",\"apr\",\"mai\",\"juni\",\"juli\",\"aug\",\"sep\",\"okt\",\"nov\",\"des\"]}'),\"nl-BE\":JSON.parse('{\"dateTime\":\"%a %e %B %Y %X\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"zondag\",\"maandag\",\"dinsdag\",\"woensdag\",\"donderdag\",\"vrijdag\",\"zaterdag\"],\"shortDays\":[\"zo\",\"ma\",\"di\",\"wo\",\"do\",\"vr\",\"za\"],\"months\":[\"januari\",\"februari\",\"maart\",\"april\",\"mei\",\"juni\",\"juli\",\"augustus\",\"september\",\"oktober\",\"november\",\"december\"],\"shortMonths\":[\"jan\",\"feb\",\"mrt\",\"apr\",\"mei\",\"jun\",\"jul\",\"aug\",\"sep\",\"okt\",\"nov\",\"dec\"]}'),\"nl-NL\":JSON.parse('{\"dateTime\":\"%a %e %B %Y %X\",\"date\":\"%d-%m-%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"zondag\",\"maandag\",\"dinsdag\",\"woensdag\",\"donderdag\",\"vrijdag\",\"zaterdag\"],\"shortDays\":[\"zo\",\"ma\",\"di\",\"wo\",\"do\",\"vr\",\"za\"],\"months\":[\"januari\",\"februari\",\"maart\",\"april\",\"mei\",\"juni\",\"juli\",\"augustus\",\"september\",\"oktober\",\"november\",\"december\"],\"shortMonths\":[\"jan\",\"feb\",\"mrt\",\"apr\",\"mei\",\"jun\",\"jul\",\"aug\",\"sep\",\"okt\",\"nov\",\"dec\"]}'),\"pl-PL\":JSON.parse('{\"dateTime\":\"%A, %e %B %Y, %X\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Niedziela\",\"Poniedziałek\",\"Wtorek\",\"Środa\",\"Czwartek\",\"Piątek\",\"Sobota\"],\"shortDays\":[\"Niedz.\",\"Pon.\",\"Wt.\",\"Śr.\",\"Czw.\",\"Pt.\",\"Sob.\"],\"months\":[\"Styczeń\",\"Luty\",\"Marzec\",\"Kwiecień\",\"Maj\",\"Czerwiec\",\"Lipiec\",\"Sierpień\",\"Wrzesień\",\"Październik\",\"Listopad\",\"Grudzień\"],\"shortMonths\":[\"Stycz.\",\"Luty\",\"Marz.\",\"Kwie.\",\"Maj\",\"Czerw.\",\"Lipc.\",\"Sierp.\",\"Wrz.\",\"Paźdz.\",\"Listop.\",\"Grudz.\"]}'),\"pt-BR\":JSON.parse('{\"dateTime\":\"%A, %e de %B de %Y. %X\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Domingo\",\"Segunda\",\"Terça\",\"Quarta\",\"Quinta\",\"Sexta\",\"Sábado\"],\"shortDays\":[\"Dom\",\"Seg\",\"Ter\",\"Qua\",\"Qui\",\"Sex\",\"Sáb\"],\"months\":[\"Janeiro\",\"Fevereiro\",\"Março\",\"Abril\",\"Maio\",\"Junho\",\"Julho\",\"Agosto\",\"Setembro\",\"Outubro\",\"Novembro\",\"Dezembro\"],\"shortMonths\":[\"Jan\",\"Fev\",\"Mar\",\"Abr\",\"Mai\",\"Jun\",\"Jul\",\"Ago\",\"Set\",\"Out\",\"Nov\",\"Dez\"]}'),\"ru-RU\":JSON.parse('{\"dateTime\":\"%A, %e %B %Y г. %X\",\"date\":\"%d.%m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"воскресенье\",\"понедельник\",\"вторник\",\"среда\",\"четверг\",\"пятница\",\"суббота\"],\"shortDays\":[\"вс\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"],\"months\":[\"января\",\"февраля\",\"марта\",\"апреля\",\"мая\",\"июня\",\"июля\",\"августа\",\"сентября\",\"октября\",\"ноября\",\"декабря\"],\"shortMonths\":[\"янв\",\"фев\",\"мар\",\"апр\",\"май\",\"июн\",\"июл\",\"авг\",\"сен\",\"окт\",\"ноя\",\"дек\"]}'),\"sv-SE\":JSON.parse('{\"dateTime\":\"%A den %d %B %Y %X\",\"date\":\"%Y-%m-%d\",\"time\":\"%H:%M:%S\",\"periods\":[\"fm\",\"em\"],\"days\":[\"Söndag\",\"Måndag\",\"Tisdag\",\"Onsdag\",\"Torsdag\",\"Fredag\",\"Lördag\"],\"shortDays\":[\"Sön\",\"Mån\",\"Tis\",\"Ons\",\"Tor\",\"Fre\",\"Lör\"],\"months\":[\"Januari\",\"Februari\",\"Mars\",\"April\",\"Maj\",\"Juni\",\"Juli\",\"Augusti\",\"September\",\"Oktober\",\"November\",\"December\"],\"shortMonths\":[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"Maj\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Okt\",\"Nov\",\"Dec\"]}'),\"tr-TR\":JSON.parse('{\"dateTime\":\"%a %e %b %X %Y\",\"date\":\"%d/%m/%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"AM\",\"PM\"],\"days\":[\"Pazar\",\"Pazartesi\",\"Salı\",\"Çarşamba\",\"Perşembe\",\"Cuma\",\"Cumartesi\"],\"shortDays\":[\"Paz\",\"Pzt\",\"Sal\",\"Çar\",\"Per\",\"Cum\",\"Cmt\"],\"months\":[\"Ocak\",\"Şubat\",\"Mart\",\"Nisan\",\"Mayıs\",\"Haziran\",\"Temmuz\",\"Ağustos\",\"Eylül\",\"Ekim\",\"Kasım\",\"Aralık\"],\"shortMonths\":[\"Oca\",\"Şub\",\"Mar\",\"Nis\",\"May\",\"Haz\",\"Tem\",\"Ağu\",\"Eyl\",\"Eki\",\"Kas\",\"Ara\"]}'),\"uk-UA\":JSON.parse('{\"dateTime\":\"%A, %e %B %Y р. %X\",\"date\":\"%d.%m.%Y\",\"time\":\"%H:%M:%S\",\"periods\":[\"дп\",\"пп\"],\"days\":[\"неділя\",\"понеділок\",\"вівторок\",\"середа\",\"четвер\",\"п\\'ятниця\",\"субота\"],\"shortDays\":[\"нд\",\"пн\",\"вт\",\"ср\",\"чт\",\"пт\",\"сб\"],\"months\":[\"січня\",\"лютого\",\"березня\",\"квітня\",\"травня\",\"червня\",\"липня\",\"серпня\",\"вересня\",\"жовтня\",\"листопада\",\"грудня\"],\"shortMonths\":[\"січ.\",\"лют.\",\"бер.\",\"квіт.\",\"трав.\",\"черв.\",\"лип.\",\"серп.\",\"вер.\",\"жовт.\",\"лист.\",\"груд.\"]}'),\"zh-CN\":JSON.parse('{\"dateTime\":\"%x %A %X\",\"date\":\"%Y年%-m月%-d日\",\"time\":\"%H:%M:%S\",\"periods\":[\"上午\",\"下午\"],\"days\":[\"星期日\",\"星期一\",\"星期二\",\"星期三\",\"星期四\",\"星期五\",\"星期六\"],\"shortDays\":[\"周日\",\"周一\",\"周二\",\"周三\",\"周四\",\"周五\",\"周六\"],\"months\":[\"一月\",\"二月\",\"三月\",\"四月\",\"五月\",\"六月\",\"七月\",\"八月\",\"九月\",\"十月\",\"十一月\",\"十二月\"],\"shortMonths\":[\"一月\",\"二月\",\"三月\",\"四月\",\"五月\",\"六月\",\"七月\",\"八月\",\"九月\",\"十月\",\"十一月\",\"十二月\"]}'),\"zh-TW\":JSON.parse('{\"dateTime\":\"%x %A %X\",\"date\":\"%Y年%-m月%-d日\",\"time\":\"%H:%M:%S\",\"periods\":[\"上午\",\"下午\"],\"days\":[\"星期日\",\"星期一\",\"星期二\",\"星期三\",\"星期四\",\"星期五\",\"星期六\"],\"shortDays\":[\"日\",\"一\",\"二\",\"三\",\"四\",\"五\",\"六\"],\"months\":[\"一月\",\"二月\",\"三月\",\"四月\",\"五月\",\"六月\",\"七月\",\"八月\",\"九月\",\"十月\",\"十一月\",\"十二月\"],\"shortMonths\":[\"1月\",\"2月\",\"3月\",\"4月\",\"5月\",\"6月\",\"7月\",\"8月\",\"9月\",\"10月\",\"11月\",\"12月\"]}')},o=(e=\"en-US\")=>{var r,o;return\"string\"==typeof e?{number:null!==(r=a[e])&&void 0!==r?r:a[\"en-US\"],time:null!==(o=s[e])&&void 0!==o?o:s[\"en-US\"]}:{number:t(e.number),time:n(e.time)}},t=e=>{var r;return\"string\"==typeof e?null!==(r=a[e])&&void 0!==r?r:a[\"en-US\"]:e},n=e=>{var r;return\"string\"==typeof e?null!==(r=s[e])&&void 0!==r?r:s[\"en-US\"]:e};return r})()));\n//# sourceMappingURL=index.js.map","module.exports = __WEBPACK_EXTERNAL_MODULE__633__;","module.exports = __WEBPACK_EXTERNAL_MODULE__274__;","module.exports = __WEBPACK_EXTERNAL_MODULE__365__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// src/utils/env.ts\nvar NOTHING = Symbol.for(\"immer-nothing\");\nvar DRAFTABLE = Symbol.for(\"immer-draftable\");\nvar DRAFT_STATE = Symbol.for(\"immer-state\");\n\n// src/utils/errors.ts\nvar errors = process.env.NODE_ENV !== \"production\" ? [\n // All error codes, starting by 0:\n function(plugin) {\n return `The plugin for '${plugin}' has not been loaded into Immer. To enable the plugin, import and call \\`enable${plugin}()\\` when initializing your application.`;\n },\n function(thing) {\n return `produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${thing}'`;\n },\n \"This object has been frozen and should not be mutated\",\n function(data) {\n return \"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? \" + data;\n },\n \"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.\",\n \"Immer forbids circular references\",\n \"The first or second argument to `produce` must be a function\",\n \"The third argument to `produce` must be a function or undefined\",\n \"First argument to `createDraft` must be a plain object, an array, or an immerable object\",\n \"First argument to `finishDraft` must be a draft returned by `createDraft`\",\n function(thing) {\n return `'current' expects a draft, got: ${thing}`;\n },\n \"Object.defineProperty() cannot be used on an Immer draft\",\n \"Object.setPrototypeOf() cannot be used on an Immer draft\",\n \"Immer only supports deleting array indices\",\n \"Immer only supports setting array indices and the 'length' property\",\n function(thing) {\n return `'original' expects a draft, got: ${thing}`;\n }\n // Note: if more errors are added, the errorOffset in Patches.ts should be increased\n // See Patches.ts for additional errors\n] : [];\nfunction die(error, ...args) {\n if (process.env.NODE_ENV !== \"production\") {\n const e = errors[error];\n const msg = typeof e === \"function\" ? e.apply(null, args) : e;\n throw new Error(`[Immer] ${msg}`);\n }\n throw new Error(\n `[Immer] minified error nr: ${error}. Full error at: https://bit.ly/3cXEKWf`\n );\n}\n\n// src/utils/common.ts\nvar getPrototypeOf = Object.getPrototypeOf;\nfunction isDraft(value) {\n return !!value && !!value[DRAFT_STATE];\n}\nfunction isDraftable(value) {\n if (!value)\n return false;\n return isPlainObject(value) || Array.isArray(value) || !!value[DRAFTABLE] || !!value.constructor?.[DRAFTABLE] || isMap(value) || isSet(value);\n}\nvar objectCtorString = Object.prototype.constructor.toString();\nfunction isPlainObject(value) {\n if (!value || typeof value !== \"object\")\n return false;\n const proto = getPrototypeOf(value);\n if (proto === null) {\n return true;\n }\n const Ctor = Object.hasOwnProperty.call(proto, \"constructor\") && proto.constructor;\n if (Ctor === Object)\n return true;\n return typeof Ctor == \"function\" && Function.toString.call(Ctor) === objectCtorString;\n}\nfunction original(value) {\n if (!isDraft(value))\n die(15, value);\n return value[DRAFT_STATE].base_;\n}\nfunction each(obj, iter) {\n if (getArchtype(obj) === 0 /* Object */) {\n Reflect.ownKeys(obj).forEach((key) => {\n iter(key, obj[key], obj);\n });\n } else {\n obj.forEach((entry, index) => iter(index, entry, obj));\n }\n}\nfunction getArchtype(thing) {\n const state = thing[DRAFT_STATE];\n return state ? state.type_ : Array.isArray(thing) ? 1 /* Array */ : isMap(thing) ? 2 /* Map */ : isSet(thing) ? 3 /* Set */ : 0 /* Object */;\n}\nfunction has(thing, prop) {\n return getArchtype(thing) === 2 /* Map */ ? thing.has(prop) : Object.prototype.hasOwnProperty.call(thing, prop);\n}\nfunction get(thing, prop) {\n return getArchtype(thing) === 2 /* Map */ ? thing.get(prop) : thing[prop];\n}\nfunction set(thing, propOrOldValue, value) {\n const t = getArchtype(thing);\n if (t === 2 /* Map */)\n thing.set(propOrOldValue, value);\n else if (t === 3 /* Set */) {\n thing.add(value);\n } else\n thing[propOrOldValue] = value;\n}\nfunction is(x, y) {\n if (x === y) {\n return x !== 0 || 1 / x === 1 / y;\n } else {\n return x !== x && y !== y;\n }\n}\nfunction isMap(target) {\n return target instanceof Map;\n}\nfunction isSet(target) {\n return target instanceof Set;\n}\nfunction latest(state) {\n return state.copy_ || state.base_;\n}\nfunction shallowCopy(base, strict) {\n if (isMap(base)) {\n return new Map(base);\n }\n if (isSet(base)) {\n return new Set(base);\n }\n if (Array.isArray(base))\n return Array.prototype.slice.call(base);\n const isPlain = isPlainObject(base);\n if (strict === true || strict === \"class_only\" && !isPlain) {\n const descriptors = Object.getOwnPropertyDescriptors(base);\n delete descriptors[DRAFT_STATE];\n let keys = Reflect.ownKeys(descriptors);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const desc = descriptors[key];\n if (desc.writable === false) {\n desc.writable = true;\n desc.configurable = true;\n }\n if (desc.get || desc.set)\n descriptors[key] = {\n configurable: true,\n writable: true,\n // could live with !!desc.set as well here...\n enumerable: desc.enumerable,\n value: base[key]\n };\n }\n return Object.create(getPrototypeOf(base), descriptors);\n } else {\n const proto = getPrototypeOf(base);\n if (proto !== null && isPlain) {\n return { ...base };\n }\n const obj = Object.create(proto);\n return Object.assign(obj, base);\n }\n}\nfunction freeze(obj, deep = false) {\n if (isFrozen(obj) || isDraft(obj) || !isDraftable(obj))\n return obj;\n if (getArchtype(obj) > 1) {\n obj.set = obj.add = obj.clear = obj.delete = dontMutateFrozenCollections;\n }\n Object.freeze(obj);\n if (deep)\n Object.entries(obj).forEach(([key, value]) => freeze(value, true));\n return obj;\n}\nfunction dontMutateFrozenCollections() {\n die(2);\n}\nfunction isFrozen(obj) {\n return Object.isFrozen(obj);\n}\n\n// src/utils/plugins.ts\nvar plugins = {};\nfunction getPlugin(pluginKey) {\n const plugin = plugins[pluginKey];\n if (!plugin) {\n die(0, pluginKey);\n }\n return plugin;\n}\nfunction loadPlugin(pluginKey, implementation) {\n if (!plugins[pluginKey])\n plugins[pluginKey] = implementation;\n}\n\n// src/core/scope.ts\nvar currentScope;\nfunction getCurrentScope() {\n return currentScope;\n}\nfunction createScope(parent_, immer_) {\n return {\n drafts_: [],\n parent_,\n immer_,\n // Whenever the modified draft contains a draft from another scope, we\n // need to prevent auto-freezing so the unowned draft can be finalized.\n canAutoFreeze_: true,\n unfinalizedDrafts_: 0\n };\n}\nfunction usePatchesInScope(scope, patchListener) {\n if (patchListener) {\n getPlugin(\"Patches\");\n scope.patches_ = [];\n scope.inversePatches_ = [];\n scope.patchListener_ = patchListener;\n }\n}\nfunction revokeScope(scope) {\n leaveScope(scope);\n scope.drafts_.forEach(revokeDraft);\n scope.drafts_ = null;\n}\nfunction leaveScope(scope) {\n if (scope === currentScope) {\n currentScope = scope.parent_;\n }\n}\nfunction enterScope(immer2) {\n return currentScope = createScope(currentScope, immer2);\n}\nfunction revokeDraft(draft) {\n const state = draft[DRAFT_STATE];\n if (state.type_ === 0 /* Object */ || state.type_ === 1 /* Array */)\n state.revoke_();\n else\n state.revoked_ = true;\n}\n\n// src/core/finalize.ts\nfunction processResult(result, scope) {\n scope.unfinalizedDrafts_ = scope.drafts_.length;\n const baseDraft = scope.drafts_[0];\n const isReplaced = result !== void 0 && result !== baseDraft;\n if (isReplaced) {\n if (baseDraft[DRAFT_STATE].modified_) {\n revokeScope(scope);\n die(4);\n }\n if (isDraftable(result)) {\n result = finalize(scope, result);\n if (!scope.parent_)\n maybeFreeze(scope, result);\n }\n if (scope.patches_) {\n getPlugin(\"Patches\").generateReplacementPatches_(\n baseDraft[DRAFT_STATE].base_,\n result,\n scope.patches_,\n scope.inversePatches_\n );\n }\n } else {\n result = finalize(scope, baseDraft, []);\n }\n revokeScope(scope);\n if (scope.patches_) {\n scope.patchListener_(scope.patches_, scope.inversePatches_);\n }\n return result !== NOTHING ? result : void 0;\n}\nfunction finalize(rootScope, value, path) {\n if (isFrozen(value))\n return value;\n const state = value[DRAFT_STATE];\n if (!state) {\n each(\n value,\n (key, childValue) => finalizeProperty(rootScope, state, value, key, childValue, path)\n );\n return value;\n }\n if (state.scope_ !== rootScope)\n return value;\n if (!state.modified_) {\n maybeFreeze(rootScope, state.base_, true);\n return state.base_;\n }\n if (!state.finalized_) {\n state.finalized_ = true;\n state.scope_.unfinalizedDrafts_--;\n const result = state.copy_;\n let resultEach = result;\n let isSet2 = false;\n if (state.type_ === 3 /* Set */) {\n resultEach = new Set(result);\n result.clear();\n isSet2 = true;\n }\n each(\n resultEach,\n (key, childValue) => finalizeProperty(rootScope, state, result, key, childValue, path, isSet2)\n );\n maybeFreeze(rootScope, result, false);\n if (path && rootScope.patches_) {\n getPlugin(\"Patches\").generatePatches_(\n state,\n path,\n rootScope.patches_,\n rootScope.inversePatches_\n );\n }\n }\n return state.copy_;\n}\nfunction finalizeProperty(rootScope, parentState, targetObject, prop, childValue, rootPath, targetIsSet) {\n if (process.env.NODE_ENV !== \"production\" && childValue === targetObject)\n die(5);\n if (isDraft(childValue)) {\n const path = rootPath && parentState && parentState.type_ !== 3 /* Set */ && // Set objects are atomic since they have no keys.\n !has(parentState.assigned_, prop) ? rootPath.concat(prop) : void 0;\n const res = finalize(rootScope, childValue, path);\n set(targetObject, prop, res);\n if (isDraft(res)) {\n rootScope.canAutoFreeze_ = false;\n } else\n return;\n } else if (targetIsSet) {\n targetObject.add(childValue);\n }\n if (isDraftable(childValue) && !isFrozen(childValue)) {\n if (!rootScope.immer_.autoFreeze_ && rootScope.unfinalizedDrafts_ < 1) {\n return;\n }\n finalize(rootScope, childValue);\n if ((!parentState || !parentState.scope_.parent_) && typeof prop !== \"symbol\" && Object.prototype.propertyIsEnumerable.call(targetObject, prop))\n maybeFreeze(rootScope, childValue);\n }\n}\nfunction maybeFreeze(scope, value, deep = false) {\n if (!scope.parent_ && scope.immer_.autoFreeze_ && scope.canAutoFreeze_) {\n freeze(value, deep);\n }\n}\n\n// src/core/proxy.ts\nfunction createProxyProxy(base, parent) {\n const isArray = Array.isArray(base);\n const state = {\n type_: isArray ? 1 /* Array */ : 0 /* Object */,\n // Track which produce call this is associated with.\n scope_: parent ? parent.scope_ : getCurrentScope(),\n // True for both shallow and deep changes.\n modified_: false,\n // Used during finalization.\n finalized_: false,\n // Track which properties have been assigned (true) or deleted (false).\n assigned_: {},\n // The parent draft state.\n parent_: parent,\n // The base state.\n base_: base,\n // The base proxy.\n draft_: null,\n // set below\n // The base copy with any updated values.\n copy_: null,\n // Called by the `produce` function.\n revoke_: null,\n isManual_: false\n };\n let target = state;\n let traps = objectTraps;\n if (isArray) {\n target = [state];\n traps = arrayTraps;\n }\n const { revoke, proxy } = Proxy.revocable(target, traps);\n state.draft_ = proxy;\n state.revoke_ = revoke;\n return proxy;\n}\nvar objectTraps = {\n get(state, prop) {\n if (prop === DRAFT_STATE)\n return state;\n const source = latest(state);\n if (!has(source, prop)) {\n return readPropFromProto(state, source, prop);\n }\n const value = source[prop];\n if (state.finalized_ || !isDraftable(value)) {\n return value;\n }\n if (value === peek(state.base_, prop)) {\n prepareCopy(state);\n return state.copy_[prop] = createProxy(value, state);\n }\n return value;\n },\n has(state, prop) {\n return prop in latest(state);\n },\n ownKeys(state) {\n return Reflect.ownKeys(latest(state));\n },\n set(state, prop, value) {\n const desc = getDescriptorFromProto(latest(state), prop);\n if (desc?.set) {\n desc.set.call(state.draft_, value);\n return true;\n }\n if (!state.modified_) {\n const current2 = peek(latest(state), prop);\n const currentState = current2?.[DRAFT_STATE];\n if (currentState && currentState.base_ === value) {\n state.copy_[prop] = value;\n state.assigned_[prop] = false;\n return true;\n }\n if (is(value, current2) && (value !== void 0 || has(state.base_, prop)))\n return true;\n prepareCopy(state);\n markChanged(state);\n }\n if (state.copy_[prop] === value && // special case: handle new props with value 'undefined'\n (value !== void 0 || prop in state.copy_) || // special case: NaN\n Number.isNaN(value) && Number.isNaN(state.copy_[prop]))\n return true;\n state.copy_[prop] = value;\n state.assigned_[prop] = true;\n return true;\n },\n deleteProperty(state, prop) {\n if (peek(state.base_, prop) !== void 0 || prop in state.base_) {\n state.assigned_[prop] = false;\n prepareCopy(state);\n markChanged(state);\n } else {\n delete state.assigned_[prop];\n }\n if (state.copy_) {\n delete state.copy_[prop];\n }\n return true;\n },\n // Note: We never coerce `desc.value` into an Immer draft, because we can't make\n // the same guarantee in ES5 mode.\n getOwnPropertyDescriptor(state, prop) {\n const owner = latest(state);\n const desc = Reflect.getOwnPropertyDescriptor(owner, prop);\n if (!desc)\n return desc;\n return {\n writable: true,\n configurable: state.type_ !== 1 /* Array */ || prop !== \"length\",\n enumerable: desc.enumerable,\n value: owner[prop]\n };\n },\n defineProperty() {\n die(11);\n },\n getPrototypeOf(state) {\n return getPrototypeOf(state.base_);\n },\n setPrototypeOf() {\n die(12);\n }\n};\nvar arrayTraps = {};\neach(objectTraps, (key, fn) => {\n arrayTraps[key] = function() {\n arguments[0] = arguments[0][0];\n return fn.apply(this, arguments);\n };\n});\narrayTraps.deleteProperty = function(state, prop) {\n if (process.env.NODE_ENV !== \"production\" && isNaN(parseInt(prop)))\n die(13);\n return arrayTraps.set.call(this, state, prop, void 0);\n};\narrayTraps.set = function(state, prop, value) {\n if (process.env.NODE_ENV !== \"production\" && prop !== \"length\" && isNaN(parseInt(prop)))\n die(14);\n return objectTraps.set.call(this, state[0], prop, value, state[0]);\n};\nfunction peek(draft, prop) {\n const state = draft[DRAFT_STATE];\n const source = state ? latest(state) : draft;\n return source[prop];\n}\nfunction readPropFromProto(state, source, prop) {\n const desc = getDescriptorFromProto(source, prop);\n return desc ? `value` in desc ? desc.value : (\n // This is a very special case, if the prop is a getter defined by the\n // prototype, we should invoke it with the draft as context!\n desc.get?.call(state.draft_)\n ) : void 0;\n}\nfunction getDescriptorFromProto(source, prop) {\n if (!(prop in source))\n return void 0;\n let proto = getPrototypeOf(source);\n while (proto) {\n const desc = Object.getOwnPropertyDescriptor(proto, prop);\n if (desc)\n return desc;\n proto = getPrototypeOf(proto);\n }\n return void 0;\n}\nfunction markChanged(state) {\n if (!state.modified_) {\n state.modified_ = true;\n if (state.parent_) {\n markChanged(state.parent_);\n }\n }\n}\nfunction prepareCopy(state) {\n if (!state.copy_) {\n state.copy_ = shallowCopy(\n state.base_,\n state.scope_.immer_.useStrictShallowCopy_\n );\n }\n}\n\n// src/core/immerClass.ts\nvar Immer2 = class {\n constructor(config) {\n this.autoFreeze_ = true;\n this.useStrictShallowCopy_ = false;\n /**\n * The `produce` function takes a value and a \"recipe function\" (whose\n * return value often depends on the base state). The recipe function is\n * free to mutate its first argument however it wants. All mutations are\n * only ever applied to a __copy__ of the base state.\n *\n * Pass only a function to create a \"curried producer\" which relieves you\n * from passing the recipe function every time.\n *\n * Only plain objects and arrays are made mutable. All other objects are\n * considered uncopyable.\n *\n * Note: This function is __bound__ to its `Immer` instance.\n *\n * @param {any} base - the initial state\n * @param {Function} recipe - function that receives a proxy of the base state as first argument and which can be freely modified\n * @param {Function} patchListener - optional function that will be called with all the patches produced here\n * @returns {any} a new state, or the initial state if nothing was modified\n */\n this.produce = (base, recipe, patchListener) => {\n if (typeof base === \"function\" && typeof recipe !== \"function\") {\n const defaultBase = recipe;\n recipe = base;\n const self = this;\n return function curriedProduce(base2 = defaultBase, ...args) {\n return self.produce(base2, (draft) => recipe.call(this, draft, ...args));\n };\n }\n if (typeof recipe !== \"function\")\n die(6);\n if (patchListener !== void 0 && typeof patchListener !== \"function\")\n die(7);\n let result;\n if (isDraftable(base)) {\n const scope = enterScope(this);\n const proxy = createProxy(base, void 0);\n let hasError = true;\n try {\n result = recipe(proxy);\n hasError = false;\n } finally {\n if (hasError)\n revokeScope(scope);\n else\n leaveScope(scope);\n }\n usePatchesInScope(scope, patchListener);\n return processResult(result, scope);\n } else if (!base || typeof base !== \"object\") {\n result = recipe(base);\n if (result === void 0)\n result = base;\n if (result === NOTHING)\n result = void 0;\n if (this.autoFreeze_)\n freeze(result, true);\n if (patchListener) {\n const p = [];\n const ip = [];\n getPlugin(\"Patches\").generateReplacementPatches_(base, result, p, ip);\n patchListener(p, ip);\n }\n return result;\n } else\n die(1, base);\n };\n this.produceWithPatches = (base, recipe) => {\n if (typeof base === \"function\") {\n return (state, ...args) => this.produceWithPatches(state, (draft) => base(draft, ...args));\n }\n let patches, inversePatches;\n const result = this.produce(base, recipe, (p, ip) => {\n patches = p;\n inversePatches = ip;\n });\n return [result, patches, inversePatches];\n };\n if (typeof config?.autoFreeze === \"boolean\")\n this.setAutoFreeze(config.autoFreeze);\n if (typeof config?.useStrictShallowCopy === \"boolean\")\n this.setUseStrictShallowCopy(config.useStrictShallowCopy);\n }\n createDraft(base) {\n if (!isDraftable(base))\n die(8);\n if (isDraft(base))\n base = current(base);\n const scope = enterScope(this);\n const proxy = createProxy(base, void 0);\n proxy[DRAFT_STATE].isManual_ = true;\n leaveScope(scope);\n return proxy;\n }\n finishDraft(draft, patchListener) {\n const state = draft && draft[DRAFT_STATE];\n if (!state || !state.isManual_)\n die(9);\n const { scope_: scope } = state;\n usePatchesInScope(scope, patchListener);\n return processResult(void 0, scope);\n }\n /**\n * Pass true to automatically freeze all copies created by Immer.\n *\n * By default, auto-freezing is enabled.\n */\n setAutoFreeze(value) {\n this.autoFreeze_ = value;\n }\n /**\n * Pass true to enable strict shallow copy.\n *\n * By default, immer does not copy the object descriptors such as getter, setter and non-enumrable properties.\n */\n setUseStrictShallowCopy(value) {\n this.useStrictShallowCopy_ = value;\n }\n applyPatches(base, patches) {\n let i;\n for (i = patches.length - 1; i >= 0; i--) {\n const patch = patches[i];\n if (patch.path.length === 0 && patch.op === \"replace\") {\n base = patch.value;\n break;\n }\n }\n if (i > -1) {\n patches = patches.slice(i + 1);\n }\n const applyPatchesImpl = getPlugin(\"Patches\").applyPatches_;\n if (isDraft(base)) {\n return applyPatchesImpl(base, patches);\n }\n return this.produce(\n base,\n (draft) => applyPatchesImpl(draft, patches)\n );\n }\n};\nfunction createProxy(value, parent) {\n const draft = isMap(value) ? getPlugin(\"MapSet\").proxyMap_(value, parent) : isSet(value) ? getPlugin(\"MapSet\").proxySet_(value, parent) : createProxyProxy(value, parent);\n const scope = parent ? parent.scope_ : getCurrentScope();\n scope.drafts_.push(draft);\n return draft;\n}\n\n// src/core/current.ts\nfunction current(value) {\n if (!isDraft(value))\n die(10, value);\n return currentImpl(value);\n}\nfunction currentImpl(value) {\n if (!isDraftable(value) || isFrozen(value))\n return value;\n const state = value[DRAFT_STATE];\n let copy;\n if (state) {\n if (!state.modified_)\n return state.base_;\n state.finalized_ = true;\n copy = shallowCopy(value, state.scope_.immer_.useStrictShallowCopy_);\n } else {\n copy = shallowCopy(value, true);\n }\n each(copy, (key, childValue) => {\n set(copy, key, currentImpl(childValue));\n });\n if (state) {\n state.finalized_ = false;\n }\n return copy;\n}\n\n// src/plugins/patches.ts\nfunction enablePatches() {\n const errorOffset = 16;\n if (process.env.NODE_ENV !== \"production\") {\n errors.push(\n 'Sets cannot have \"replace\" patches.',\n function(op) {\n return \"Unsupported patch operation: \" + op;\n },\n function(path) {\n return \"Cannot apply patch, path doesn't resolve: \" + path;\n },\n \"Patching reserved attributes like __proto__, prototype and constructor is not allowed\"\n );\n }\n const REPLACE = \"replace\";\n const ADD = \"add\";\n const REMOVE = \"remove\";\n function generatePatches_(state, basePath, patches, inversePatches) {\n switch (state.type_) {\n case 0 /* Object */:\n case 2 /* Map */:\n return generatePatchesFromAssigned(\n state,\n basePath,\n patches,\n inversePatches\n );\n case 1 /* Array */:\n return generateArrayPatches(state, basePath, patches, inversePatches);\n case 3 /* Set */:\n return generateSetPatches(\n state,\n basePath,\n patches,\n inversePatches\n );\n }\n }\n function generateArrayPatches(state, basePath, patches, inversePatches) {\n let { base_, assigned_ } = state;\n let copy_ = state.copy_;\n if (copy_.length < base_.length) {\n ;\n [base_, copy_] = [copy_, base_];\n [patches, inversePatches] = [inversePatches, patches];\n }\n for (let i = 0; i < base_.length; i++) {\n if (assigned_[i] && copy_[i] !== base_[i]) {\n const path = basePath.concat([i]);\n patches.push({\n op: REPLACE,\n path,\n // Need to maybe clone it, as it can in fact be the original value\n // due to the base/copy inversion at the start of this function\n value: clonePatchValueIfNeeded(copy_[i])\n });\n inversePatches.push({\n op: REPLACE,\n path,\n value: clonePatchValueIfNeeded(base_[i])\n });\n }\n }\n for (let i = base_.length; i < copy_.length; i++) {\n const path = basePath.concat([i]);\n patches.push({\n op: ADD,\n path,\n // Need to maybe clone it, as it can in fact be the original value\n // due to the base/copy inversion at the start of this function\n value: clonePatchValueIfNeeded(copy_[i])\n });\n }\n for (let i = copy_.length - 1; base_.length <= i; --i) {\n const path = basePath.concat([i]);\n inversePatches.push({\n op: REMOVE,\n path\n });\n }\n }\n function generatePatchesFromAssigned(state, basePath, patches, inversePatches) {\n const { base_, copy_ } = state;\n each(state.assigned_, (key, assignedValue) => {\n const origValue = get(base_, key);\n const value = get(copy_, key);\n const op = !assignedValue ? REMOVE : has(base_, key) ? REPLACE : ADD;\n if (origValue === value && op === REPLACE)\n return;\n const path = basePath.concat(key);\n patches.push(op === REMOVE ? { op, path } : { op, path, value });\n inversePatches.push(\n op === ADD ? { op: REMOVE, path } : op === REMOVE ? { op: ADD, path, value: clonePatchValueIfNeeded(origValue) } : { op: REPLACE, path, value: clonePatchValueIfNeeded(origValue) }\n );\n });\n }\n function generateSetPatches(state, basePath, patches, inversePatches) {\n let { base_, copy_ } = state;\n let i = 0;\n base_.forEach((value) => {\n if (!copy_.has(value)) {\n const path = basePath.concat([i]);\n patches.push({\n op: REMOVE,\n path,\n value\n });\n inversePatches.unshift({\n op: ADD,\n path,\n value\n });\n }\n i++;\n });\n i = 0;\n copy_.forEach((value) => {\n if (!base_.has(value)) {\n const path = basePath.concat([i]);\n patches.push({\n op: ADD,\n path,\n value\n });\n inversePatches.unshift({\n op: REMOVE,\n path,\n value\n });\n }\n i++;\n });\n }\n function generateReplacementPatches_(baseValue, replacement, patches, inversePatches) {\n patches.push({\n op: REPLACE,\n path: [],\n value: replacement === NOTHING ? void 0 : replacement\n });\n inversePatches.push({\n op: REPLACE,\n path: [],\n value: baseValue\n });\n }\n function applyPatches_(draft, patches) {\n patches.forEach((patch) => {\n const { path, op } = patch;\n let base = draft;\n for (let i = 0; i < path.length - 1; i++) {\n const parentType = getArchtype(base);\n let p = path[i];\n if (typeof p !== \"string\" && typeof p !== \"number\") {\n p = \"\" + p;\n }\n if ((parentType === 0 /* Object */ || parentType === 1 /* Array */) && (p === \"__proto__\" || p === \"constructor\"))\n die(errorOffset + 3);\n if (typeof base === \"function\" && p === \"prototype\")\n die(errorOffset + 3);\n base = get(base, p);\n if (typeof base !== \"object\")\n die(errorOffset + 2, path.join(\"/\"));\n }\n const type = getArchtype(base);\n const value = deepClonePatchValue(patch.value);\n const key = path[path.length - 1];\n switch (op) {\n case REPLACE:\n switch (type) {\n case 2 /* Map */:\n return base.set(key, value);\n case 3 /* Set */:\n die(errorOffset);\n default:\n return base[key] = value;\n }\n case ADD:\n switch (type) {\n case 1 /* Array */:\n return key === \"-\" ? base.push(value) : base.splice(key, 0, value);\n case 2 /* Map */:\n return base.set(key, value);\n case 3 /* Set */:\n return base.add(value);\n default:\n return base[key] = value;\n }\n case REMOVE:\n switch (type) {\n case 1 /* Array */:\n return base.splice(key, 1);\n case 2 /* Map */:\n return base.delete(key);\n case 3 /* Set */:\n return base.delete(patch.value);\n default:\n return delete base[key];\n }\n default:\n die(errorOffset + 1, op);\n }\n });\n return draft;\n }\n function deepClonePatchValue(obj) {\n if (!isDraftable(obj))\n return obj;\n if (Array.isArray(obj))\n return obj.map(deepClonePatchValue);\n if (isMap(obj))\n return new Map(\n Array.from(obj.entries()).map(([k, v]) => [k, deepClonePatchValue(v)])\n );\n if (isSet(obj))\n return new Set(Array.from(obj).map(deepClonePatchValue));\n const cloned = Object.create(getPrototypeOf(obj));\n for (const key in obj)\n cloned[key] = deepClonePatchValue(obj[key]);\n if (has(obj, DRAFTABLE))\n cloned[DRAFTABLE] = obj[DRAFTABLE];\n return cloned;\n }\n function clonePatchValueIfNeeded(obj) {\n if (isDraft(obj)) {\n return deepClonePatchValue(obj);\n } else\n return obj;\n }\n loadPlugin(\"Patches\", {\n applyPatches_,\n generatePatches_,\n generateReplacementPatches_\n });\n}\n\n// src/plugins/mapset.ts\nfunction enableMapSet() {\n class DraftMap extends Map {\n constructor(target, parent) {\n super();\n this[DRAFT_STATE] = {\n type_: 2 /* Map */,\n parent_: parent,\n scope_: parent ? parent.scope_ : getCurrentScope(),\n modified_: false,\n finalized_: false,\n copy_: void 0,\n assigned_: void 0,\n base_: target,\n draft_: this,\n isManual_: false,\n revoked_: false\n };\n }\n get size() {\n return latest(this[DRAFT_STATE]).size;\n }\n has(key) {\n return latest(this[DRAFT_STATE]).has(key);\n }\n set(key, value) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (!latest(state).has(key) || latest(state).get(key) !== value) {\n prepareMapCopy(state);\n markChanged(state);\n state.assigned_.set(key, true);\n state.copy_.set(key, value);\n state.assigned_.set(key, true);\n }\n return this;\n }\n delete(key) {\n if (!this.has(key)) {\n return false;\n }\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareMapCopy(state);\n markChanged(state);\n if (state.base_.has(key)) {\n state.assigned_.set(key, false);\n } else {\n state.assigned_.delete(key);\n }\n state.copy_.delete(key);\n return true;\n }\n clear() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (latest(state).size) {\n prepareMapCopy(state);\n markChanged(state);\n state.assigned_ = /* @__PURE__ */ new Map();\n each(state.base_, (key) => {\n state.assigned_.set(key, false);\n });\n state.copy_.clear();\n }\n }\n forEach(cb, thisArg) {\n const state = this[DRAFT_STATE];\n latest(state).forEach((_value, key, _map) => {\n cb.call(thisArg, this.get(key), key, this);\n });\n }\n get(key) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n const value = latest(state).get(key);\n if (state.finalized_ || !isDraftable(value)) {\n return value;\n }\n if (value !== state.base_.get(key)) {\n return value;\n }\n const draft = createProxy(value, state);\n prepareMapCopy(state);\n state.copy_.set(key, draft);\n return draft;\n }\n keys() {\n return latest(this[DRAFT_STATE]).keys();\n }\n values() {\n const iterator = this.keys();\n return {\n [Symbol.iterator]: () => this.values(),\n next: () => {\n const r = iterator.next();\n if (r.done)\n return r;\n const value = this.get(r.value);\n return {\n done: false,\n value\n };\n }\n };\n }\n entries() {\n const iterator = this.keys();\n return {\n [Symbol.iterator]: () => this.entries(),\n next: () => {\n const r = iterator.next();\n if (r.done)\n return r;\n const value = this.get(r.value);\n return {\n done: false,\n value: [r.value, value]\n };\n }\n };\n }\n [(DRAFT_STATE, Symbol.iterator)]() {\n return this.entries();\n }\n }\n function proxyMap_(target, parent) {\n return new DraftMap(target, parent);\n }\n function prepareMapCopy(state) {\n if (!state.copy_) {\n state.assigned_ = /* @__PURE__ */ new Map();\n state.copy_ = new Map(state.base_);\n }\n }\n class DraftSet extends Set {\n constructor(target, parent) {\n super();\n this[DRAFT_STATE] = {\n type_: 3 /* Set */,\n parent_: parent,\n scope_: parent ? parent.scope_ : getCurrentScope(),\n modified_: false,\n finalized_: false,\n copy_: void 0,\n base_: target,\n draft_: this,\n drafts_: /* @__PURE__ */ new Map(),\n revoked_: false,\n isManual_: false\n };\n }\n get size() {\n return latest(this[DRAFT_STATE]).size;\n }\n has(value) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (!state.copy_) {\n return state.base_.has(value);\n }\n if (state.copy_.has(value))\n return true;\n if (state.drafts_.has(value) && state.copy_.has(state.drafts_.get(value)))\n return true;\n return false;\n }\n add(value) {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (!this.has(value)) {\n prepareSetCopy(state);\n markChanged(state);\n state.copy_.add(value);\n }\n return this;\n }\n delete(value) {\n if (!this.has(value)) {\n return false;\n }\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareSetCopy(state);\n markChanged(state);\n return state.copy_.delete(value) || (state.drafts_.has(value) ? state.copy_.delete(state.drafts_.get(value)) : (\n /* istanbul ignore next */\n false\n ));\n }\n clear() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n if (latest(state).size) {\n prepareSetCopy(state);\n markChanged(state);\n state.copy_.clear();\n }\n }\n values() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareSetCopy(state);\n return state.copy_.values();\n }\n entries() {\n const state = this[DRAFT_STATE];\n assertUnrevoked(state);\n prepareSetCopy(state);\n return state.copy_.entries();\n }\n keys() {\n return this.values();\n }\n [(DRAFT_STATE, Symbol.iterator)]() {\n return this.values();\n }\n forEach(cb, thisArg) {\n const iterator = this.values();\n let result = iterator.next();\n while (!result.done) {\n cb.call(thisArg, result.value, result.value, this);\n result = iterator.next();\n }\n }\n }\n function proxySet_(target, parent) {\n return new DraftSet(target, parent);\n }\n function prepareSetCopy(state) {\n if (!state.copy_) {\n state.copy_ = /* @__PURE__ */ new Set();\n state.base_.forEach((value) => {\n if (isDraftable(value)) {\n const draft = createProxy(value, state);\n state.drafts_.set(value, draft);\n state.copy_.add(draft);\n } else {\n state.copy_.add(value);\n }\n });\n }\n }\n function assertUnrevoked(state) {\n if (state.revoked_)\n die(3, JSON.stringify(latest(state)));\n }\n loadPlugin(\"MapSet\", { proxyMap_, proxySet_ });\n}\n\n// src/immer.ts\nvar immer = new Immer2();\nvar produce = immer.produce;\nvar produceWithPatches = immer.produceWithPatches.bind(\n immer\n);\nvar setAutoFreeze = immer.setAutoFreeze.bind(immer);\nvar setUseStrictShallowCopy = immer.setUseStrictShallowCopy.bind(immer);\nvar applyPatches = immer.applyPatches.bind(immer);\nvar createDraft = immer.createDraft.bind(immer);\nvar finishDraft = immer.finishDraft.bind(immer);\nfunction castDraft(value) {\n return value;\n}\nfunction castImmutable(value) {\n return value;\n}\nexport {\n Immer2 as Immer,\n applyPatches,\n castDraft,\n castImmutable,\n createDraft,\n current,\n enableMapSet,\n enablePatches,\n finishDraft,\n freeze,\n DRAFTABLE as immerable,\n isDraft,\n isDraftable,\n NOTHING as nothing,\n original,\n produce,\n produceWithPatches,\n setAutoFreeze,\n setUseStrictShallowCopy\n};\n//# sourceMappingURL=immer.mjs.map","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Compare, Data, FormulaTransform, SourceData, Transforms, ValuesData } from 'vega';\n\nimport {\n DEFAULT_TIME_DIMENSION,\n DEFAULT_TRANSFORMED_TIME_DIMENSION,\n FILTERED_TABLE,\n SERIES_ID,\n TABLE,\n} from '@spectrum-charts/constants';\n\nimport { ChartTooltipOptions } from '../types';\n\nexport const addTimeTransform = produce<Transforms[], [string]>((transforms, dimension) => {\n if (transforms.findIndex((transform) => transform.type === 'timeunit') === -1) {\n transforms.push({\n type: 'formula',\n expr: `toDate(datum[\"${dimension}\"])`,\n as: dimension,\n });\n transforms.push({\n type: 'timeunit',\n field: dimension,\n units: ['year', 'month', 'date', 'hours', 'minutes', 'seconds'],\n as: [DEFAULT_TRANSFORMED_TIME_DIMENSION, `${DEFAULT_TIME_DIMENSION}1`],\n });\n }\n});\n\nexport const getTransformSort = (order?: string): Compare | undefined => {\n if (order) {\n return { field: order };\n }\n};\n\n/**\n * gets the table data from the data array\n * @param data\n * @returns\n */\nexport const getTableData = (data: Data[]): ValuesData => {\n // ok to cast this here because we know that the data array will always have table data of type ValuesData\n return data.find((d) => d.name === TABLE) as ValuesData;\n};\n/**\n * gets the filtered table data from the data array\n * @param data\n * @returns\n */\nexport const getFilteredTableData = (data: Data[]): SourceData => {\n // ok to cast this here because we know that the data array will always have table data of type SourceData\n return data.find((d) => d.name === FILTERED_TABLE) as SourceData;\n};\n\nexport const getSeriesIdTransform = (facets: string[]): FormulaTransform[] => {\n if (facets.length === 0) return [];\n const expr = facets.map((facet) => `datum.${facet}`).join(' + \" | \" + ');\n return [\n {\n type: 'formula',\n as: SERIES_ID,\n expr,\n },\n ];\n};\n\n/**\n * @param children\n * @returns spec data that filters out items where the `excludeDataKey` is true\n */\nexport const getFilteredTooltipData = (chartTooltips: ChartTooltipOptions[]) => {\n const excludeDataKeys = chartTooltips[0]?.excludeDataKeys;\n const transform: { type: 'filter'; expr: string }[] | undefined = excludeDataKeys?.map((excludeDataKey) => ({\n type: 'filter',\n expr: `!datum.${excludeDataKey}`,\n }));\n\n return {\n name: `${FILTERED_TABLE}ForTooltip`,\n source: FILTERED_TABLE,\n transform,\n };\n};\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"vega\");","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Config, Data, Scale, ScaleType, Spec, mergeConfig } from 'vega';\n\nimport {\n COLOR_SCALE,\n DATE_PATH,\n DEFAULT_TRANSFORMED_TIME_DIMENSION,\n FILTERED_TABLE,\n LINE_TYPE_SCALE,\n MARK_ID,\n OPACITY_SCALE,\n ROUNDED_SQUARE_PATH,\n SENTIMENT_NEGATIVE_PATH,\n SENTIMENT_NEUTRAL_PATH,\n SENTIMENT_POSITIVE_PATH,\n TABLE,\n} from '@spectrum-charts/constants';\nimport { getColorValue, getSpectrumVegaConfig } from '@spectrum-charts/themes';\n\nimport {\n ChartSpecOptions,\n ChartSymbolShape,\n ColorFacet,\n ColorScheme,\n DualFacet,\n Icon,\n LineType,\n LineTypeFacet,\n LineWidth,\n NumberFormat,\n OpacityFacet,\n ScSpec,\n SymbolSize,\n SymbolSizeFacet,\n} from './types';\n\n/**\n * gets all the keys that are used to facet by\n * @param facetOptions\n * @returns facets\n */\nexport const getFacetsFromOptions = ({\n color,\n lineType,\n opacity,\n size,\n}: {\n color?: ColorFacet | DualFacet;\n lineType?: LineTypeFacet | DualFacet;\n opacity?: OpacityFacet | DualFacet;\n size?: SymbolSizeFacet;\n}): { facets: string[]; secondaryFacets: string[] } => {\n // get all the keys that we need to facet by\n // filter out the ones that use static values instead of fields\n let facets = [color, lineType, opacity, size]\n .map((facet) => (Array.isArray(facet) ? facet[0] : facet))\n .filter((facet): facet is string => typeof facet === 'string');\n // remove duplicates\n facets = [...new Set(facets)];\n\n let secondaryFacets = [color, lineType, opacity]\n .map((facet) => (Array.isArray(facet) ? facet[1] : undefined))\n .filter((facet): facet is string => typeof facet === 'string');\n // remove duplicates\n secondaryFacets = [...new Set(secondaryFacets)];\n\n return { facets, secondaryFacets };\n};\n\n/**\n * gets all the keys that have been used to facet the data into series from the scales\n * @param scales\n * @returns\n */\nexport const getFacetsFromScales = (scales: Scale[] = []): string[] => {\n const facets = [\n COLOR_SCALE,\n LINE_TYPE_SCALE,\n OPACITY_SCALE,\n 'secondaryColor',\n 'secondaryLineType',\n 'secondaryOpacity',\n ].reduce((acc, cur) => {\n const scale = scales.find((scale) => scale.name === cur);\n if (scale?.domain && 'fields' in scale.domain && scale.domain.fields.length) {\n return [...acc, scale.domain.fields[0].toString()];\n }\n return acc;\n }, [] as string[]);\n\n // only want the unique facets\n return [...new Set(facets)];\n};\n\n/**\n * gets the strokeDash array from the lineType\n * @param lineType\n * @returns strokeDash array\n */\nexport const getStrokeDashFromLineType = (lineType: LineType): number[] => {\n if (Array.isArray(lineType)) {\n return lineType;\n }\n switch (lineType) {\n case 'dashed':\n return [7, 4];\n case 'dotted':\n return [2, 3];\n case 'dotDash':\n return [2, 3, 7, 4];\n case 'shortDash':\n return [3, 4];\n case 'longDash':\n return [11, 4];\n case 'twoDash':\n return [5, 2, 11, 2];\n case 'solid':\n default:\n return [];\n }\n};\n\n/**\n * gets the line width pixel value from the lineWidth\n * @param lineWidth\n * @returns line width pixel value\n */\nexport const getLineWidthPixelsFromLineWidth = (lineWidth: LineWidth): number => {\n if (typeof lineWidth === 'number') {\n return lineWidth;\n }\n\n switch (lineWidth) {\n case 'XS':\n return 1;\n case 'S':\n return 1.5;\n case 'L':\n return 3;\n case 'XL':\n return 4;\n case 'M':\n default:\n return 2;\n }\n};\n\n/**\n * get the SVG path for the symbol shape\n * @param symbolShape supported shape name or custom SVG path\n * @returns SVG path\n */\nexport const getPathFromSymbolShape = (symbolShape: ChartSymbolShape): string => {\n if (symbolShape === 'rounded-square') return ROUNDED_SQUARE_PATH;\n return symbolShape;\n};\n\n/**\n * gets the strokeDash array from the lineType\n * @param icon\n * @returns strokeDash array\n */\nexport const getPathFromIcon = (icon: Icon | string): string => {\n const supportedIcons: { [key in Icon]: string } = {\n date: DATE_PATH,\n sentimentNegative: SENTIMENT_NEGATIVE_PATH,\n sentimentNeutral: SENTIMENT_NEUTRAL_PATH,\n sentimentPositive: SENTIMENT_POSITIVE_PATH,\n };\n return supportedIcons[icon] || icon;\n};\n\n/**\n * Converts a symbolSize to the vega size\n * RSC uses the width of the symbol to determine the size\n * Vega uses the area of the symbol to determine the size\n * @param symbolSize\n * @returns size in square pixels\n */\nexport const getVegaSymbolSizeFromRscSymbolSize = (symbolSize: SymbolSize): number => {\n return Math.pow(getSymbolWidthFromRscSymbolSize(symbolSize), 2);\n};\n\n/**\n * Gets the width of the symbol or trail from the symbolSize\n * @param symbolSize\n * @returns width in pixels\n */\nexport const getSymbolWidthFromRscSymbolSize = (symbolSize: SymbolSize): number => {\n if (typeof symbolSize === 'number') {\n return symbolSize;\n }\n\n switch (symbolSize) {\n case 'XS':\n return 6;\n case 'S':\n return 8;\n case 'L':\n return 12;\n case 'XL':\n return 16;\n case 'M':\n default:\n return 10;\n }\n};\n\n/**\n * base data that gets initialized with every uncontrolled spec\n */\nexport const baseData: Data[] = [\n { name: TABLE, values: [], transform: [{ type: 'identifier', as: MARK_ID }] },\n { name: FILTERED_TABLE, source: TABLE },\n];\n\n/**\n * Merges an optionally supplied spec with Chart options and default values.\n *\n * @param spec - The spec to merge with the base spec. If none is supplied, the base spec is returned.\n * @param chartOptions - A partial set of chart options to spread on to the spec.\n * @returns Spec with default values\n */\nexport const initializeSpec = (spec: Spec | null = {}, chartOptions: Partial<ChartSpecOptions> = {}): ScSpec => {\n const { backgroundColor, colorScheme = 'light', description, title } = chartOptions;\n\n const baseSpec: ScSpec = {\n usermeta: {},\n title: title || undefined,\n description,\n data: baseData,\n background: backgroundColor ? getColorValue(backgroundColor, colorScheme) : undefined,\n };\n\n return { ...baseSpec, ...(spec || {}) };\n};\n\n/**\n * The inverse of `extractValues`. Given an array of Vega datasets and an object of key/value pairs\n * merge the values into the datasets.\n * @param data An array of Vega datasets\n * @param values An object of key/value pairs where the key is the dataset name and the value is\n * the array of values\n * @returns An array of Vega datasets with the values from the values object merged in\n */\nexport const mergeValuesIntoData = (data, values) => {\n return data.map((dataset) => {\n const datasetValues = values[dataset.name];\n if (datasetValues) {\n dataset.values = datasetValues;\n }\n return dataset;\n });\n};\n\n/**\n * returns the correct data field to use as the dimension\n * @param dimension\n * @param scaleType\n * @returns string\n */\nexport const getDimensionField = (dimension: string, scaleType?: ScaleType) => {\n return scaleType === 'time' ? DEFAULT_TRANSFORMED_TIME_DIMENSION : dimension;\n};\n\n/**\n * Gets the d3 format specifier for named number formats.\n * shortNumber and shortCurrency are not included since these require additional logic\n * @param numberFormat\n * @returns\n */\nexport const getD3FormatSpecifierFromNumberFormat = (numberFormat: NumberFormat | string): string => {\n switch (numberFormat) {\n case 'currency':\n return '$,.2f'; // currency format\n case 'standardNumber':\n return ','; // standard number format\n default:\n return numberFormat;\n }\n};\n\n/**\n * Merges the provided config with the Spectrum Vega config\n * @param config\n * @param colorScheme\n * @returns Vega config\n */\nexport function getChartConfig(config: Config | undefined, colorScheme: ColorScheme): Config {\n const defaultConfig = getSpectrumVegaConfig(colorScheme);\n if (config) {\n return mergeConfig(defaultConfig, config);\n }\n return defaultConfig;\n}\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { OrdinalScale, Scale, ScaleData, ScaleMultiFieldsRef, SignalRef } from 'vega';\n\nimport { DISCRETE_PADDING, FILTERED_TABLE, LINEAR_PADDING, PADDING_RATIO, TABLE } from '@spectrum-charts/constants';\nimport { toCamelCase } from '@spectrum-charts/utils';\n\nimport { getDimensionField } from '../specUtils';\nimport { DualFacet, FacetRef, FacetType, Orientation } from '../types';\n\ntype AxisType = 'x' | 'y';\ntype SupportedScaleType = 'linear' | 'point' | 'band' | 'time' | 'ordinal';\n\n/**\n * Gets the first index for the given scale type and axis.\n *\n * If the scale doesn't exist, it gets created and the index of the new scale is returned.\n *\n * NOTE: this should only be called from a 'produce' function since it mutates the scales\n */\nexport const getScaleIndexByType = (\n scales: Scale[],\n type: SupportedScaleType,\n axis: AxisType,\n scaleName?: string,\n domainDataKey?: string\n): number => {\n const name = scaleName || toCamelCase(`${axis} ${type}`);\n let index = scales.findIndex((scale) => scale.name === name);\n if (index === -1) {\n index = scales.length;\n scales.push(\n generateScale(type, axis, {\n name,\n ...(domainDataKey ? { domain: { data: domainDataKey, fields: [] } } : {}),\n })\n );\n }\n return index;\n};\n\n/**\n * Gets the first index for the given scale name.\n *\n * If the scale doesn't exist, it gets created and the index of the new scale is returned.\n *\n * NOTE: this should only be called from a 'produce' function since it mutates the scales\n */\nexport const getScaleIndexByName = (scales: Scale[], name: string, type?: SupportedScaleType): number => {\n let index = scales.findIndex((scale) => scale.name === name);\n if (index === -1) {\n index = scales.length;\n scales.push({ name, type });\n }\n return index;\n};\n\nexport const addDomainFields = produce<Scale, [string[]]>((scale, values) => {\n values.forEach((value) => {\n if (isScaleMultiFieldsRef(scale.domain)) {\n // if a fields already exist but not this value field, push the value field onto it\n if (!scale.domain.fields.includes(value)) {\n scale.domain.fields.push(value);\n }\n } else {\n // if there isn't a domain yet, set it up\n scale.domain = {\n data: TABLE,\n fields: [value],\n };\n }\n });\n return scale;\n});\n\nexport const addContinuousDimensionScale = (\n scales: Scale[],\n { scaleType, dimension, padding }: { scaleType: SupportedScaleType; dimension: string; padding?: number }\n) => {\n const index = getScaleIndexByType(scales, scaleType, 'x');\n const fields = [getDimensionField(dimension, scaleType)];\n scales[index] = addDomainFields(scales[index], fields);\n if (padding !== undefined) {\n scales[index] = overridePadding(scales[index], padding);\n }\n};\n\nconst overridePadding = produce<Scale, [number]>((scale, padding) => {\n if ('padding' in scale) {\n scale.padding = padding;\n }\n if ('paddingOuter' in scale) {\n scale.paddingOuter = padding;\n }\n});\n\n/**\n * Checks if the metric scale already exists\n * If it does, it adds the new metricKeys to the domain\n * If it doesn't, it creates a new scale and adds the metricKeys to the domain\n * @param scales\n * @param values\n * @param metricAxis\n * @param scaleName\n * @param domainDataKey\n */\nexport const addMetricScale = (\n scales: Scale[],\n metricKeys: string[],\n metricAxis: AxisType = 'y',\n scaleName?: string,\n domainDataKey?: string\n) => {\n const index = getScaleIndexByType(scales, 'linear', metricAxis, scaleName, domainDataKey);\n scales[index] = addDomainFields(scales[index], metricKeys);\n};\n\n/**\n * Generates a metric scale and returns it\n * NOTE: Does not check if the metric scale already exists\n * @param metricKeys\n * @param metricAxis\n * @returns\n */\nexport const getMetricScale = (metricKeys: string[], metricAxis: AxisType, chartOrientation: Orientation): Scale => {\n let scale = getDefaultScale('linear', metricAxis, chartOrientation);\n scale = addDomainFields(scale, metricKeys);\n return scale;\n};\n\n/**\n * adds the field to the facet scale domain if it isn't a static value\n * @param scales\n * @param facetType\n * @param facetValue\n */\nexport const addFieldToFacetScaleDomain = (\n scales: Scale[],\n facetType: FacetType,\n facetValue: FacetRef<string | number | number[]> | DualFacet | undefined\n) => {\n // if facetValue is a string or an array of strings, it is a field reference and should be added the facet scale domain\n if (typeof facetValue === 'string' || (Array.isArray(facetValue) && facetValue.length)) {\n const index = getScaleIndexByName(scales, facetType);\n const facetField = Array.isArray(facetValue) ? facetValue[0] : facetValue;\n scales[index] = addDomainFields(scales[index], [facetField]);\n }\n};\n\nexport const generateScale = (type: SupportedScaleType, axis: AxisType, options?: Partial<Scale>): Scale => {\n return {\n ...getDefaultScale(type, axis),\n ...options,\n } as unknown as Scale;\n};\n\nexport const getDefaultScale = (\n scaleType: SupportedScaleType,\n axis: AxisType,\n chartOrientation: Orientation = 'vertical'\n): Scale => {\n const orientationToAxis: { [key in Orientation]: AxisType } = {\n vertical: 'x',\n horizontal: 'y',\n };\n const isDimensionAxis = axis === orientationToAxis[chartOrientation];\n\n const scale: Scale = {\n name: toCamelCase(`${axis} ${scaleType}`),\n type: scaleType,\n range: axis === 'x' ? 'width' : 'height',\n domain: { data: FILTERED_TABLE, fields: [] },\n // if this is the dimension axis, add padding\n ...(isDimensionAxis ? getPadding(scaleType) : {}),\n };\n if (scale.type === 'ordinal') {\n const { name, type, domain } = scale;\n return { name, type, domain };\n }\n // metric axis properties\n if (scale.type === 'linear' && !isDimensionAxis) {\n return { ...scale, nice: true, zero: true };\n }\n return scale;\n};\n\n/**\n * Sets the appropriate axis padding based on type.\n *\n * Discrete scales use a relative value where padding is step size * padding [0-1].\n * Continuous scales use a pixel value for padding.\n */\nexport const getPadding = (type: SupportedScaleType | 'band') => {\n switch (type) {\n case 'band': {\n const { paddingInner, paddingOuter } = getBandPadding(PADDING_RATIO);\n return { paddingInner, paddingOuter };\n }\n case 'linear':\n case 'time':\n return { padding: LINEAR_PADDING };\n case 'point':\n return { paddingOuter: DISCRETE_PADDING };\n default:\n return {};\n }\n};\n\nexport const getBandPadding = (paddingRatio: number, paddingOuter?: number) => {\n const paddingInner = paddingRatio;\n return {\n paddingInner,\n paddingOuter: paddingOuter === undefined ? DISCRETE_PADDING - (1 - paddingInner) / 2 : paddingOuter,\n };\n};\n\n/**\n * Gets the name of the scale based on the axis and type\n * @param axis\n * @param type\n * @returns scale name\n */\nexport const getScaleName = (axis: AxisType, type: SupportedScaleType) => toCamelCase(`${axis} ${type}`);\n\nexport const getOrdinalScale = (name: string, range: OrdinalScale['range']): OrdinalScale => ({\n name,\n type: 'ordinal',\n range,\n domain: { data: TABLE, fields: [] },\n});\n\nconst isScaleMultiFieldsRef = (\n domain: (null | string | number | boolean | SignalRef)[] | ScaleData | SignalRef | undefined\n): domain is ScaleMultiFieldsRef => {\n return Boolean(domain && !Array.isArray(domain) && 'data' in domain && 'fields' in domain);\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {\n AreaEncodeEntry,\n ArrayValueRef,\n ColorValueRef,\n EncodeEntry,\n GroupMark,\n NumericValueRef,\n PathMark,\n SignalRef,\n SymbolMark,\n} from 'vega';\n\nimport {\n BACKGROUND_COLOR,\n COLOR_SCALE,\n COMPONENT_NAME,\n DEFAULT_OPACITY_RULE,\n DEFAULT_TRANSFORMED_TIME_DIMENSION,\n HIGHLIGHT_CONTRAST_RATIO,\n HOVER_SHAPE,\n HOVER_SHAPE_COUNT,\n HOVER_SIZE,\n LINEAR_COLOR_SCALE,\n LINE_TYPE_SCALE,\n LINE_WIDTH_SCALE,\n OPACITY_SCALE,\n SELECTED_GROUP,\n SELECTED_ITEM,\n SYMBOL_SIZE_SCALE,\n} from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { addHighlightMarkOpacityRules } from '../chartTooltip/chartTooltipUtils';\nimport { LineMarkOptions } from '../line/lineUtils';\nimport { getScaleName } from '../scale/scaleSpecBuilder';\nimport {\n getLineWidthPixelsFromLineWidth,\n getStrokeDashFromLineType,\n getVegaSymbolSizeFromRscSymbolSize,\n} from '../specUtils';\nimport {\n BarSpecOptions,\n ChartPopoverOptions,\n ChartTooltipOptions,\n ColorFacet,\n ColorScheme,\n DonutSpecOptions,\n DualFacet,\n HighlightedItem,\n LineTypeFacet,\n LineWidthFacet,\n MetricRangeOptions,\n OpacityFacet,\n ProductionRuleTests,\n ScaleType,\n ScatterSpecOptions,\n SymbolSizeFacet,\n TrendlineOptions,\n VennSpecOptions,\n} from '../types';\n\n/**\n * If a popover or hasOnClick exists on the mark, then set the cursor to a pointer.\n * @param chartPopovers\n * @param hasOnClick\n * @returns cursor encoding\n */\nexport const getCursor = (chartPopovers: ChartPopoverOptions[], hasOnClick?: boolean): EncodeEntry['cursor'] => {\n if (hasOnClick || chartPopovers.length) {\n return { value: 'pointer' };\n }\n};\n\n/**\n * If a tooltip exists on the mark, then set tooltip to true.\n */\nexport function getTooltip(\n chartTooltips: ChartTooltipOptions[],\n name: string,\n nestedDatum?: boolean\n): ProductionRuleTests<SignalRef> | SignalRef | undefined {\n // skip annotations\n if (chartTooltips.length) {\n const defaultTooltip = {\n signal: `merge(datum${nestedDatum ? '.datum' : ''}, {'${COMPONENT_NAME}': '${name}'})`,\n };\n // if the tooltip has an excludeDataKey option, then disable the tooltip where that key is present\n const excludeDataKeys = chartTooltips[0].excludeDataKeys;\n if (excludeDataKeys?.length) {\n return [\n ...excludeDataKeys.map((excludeDataKey) => ({ test: `datum.${excludeDataKey}`, signal: 'false' })),\n defaultTooltip,\n ];\n }\n\n return defaultTooltip;\n }\n}\n\n/**\n * returns the border stroke encodings for stacked bar/area\n */\nexport const getBorderStrokeEncodings = (isStacked: boolean, isArea = false): AreaEncodeEntry => {\n if (isStacked)\n return {\n stroke: { signal: BACKGROUND_COLOR },\n strokeWidth: { value: isArea ? 1.5 : 1 },\n strokeJoin: { value: 'round' },\n };\n return {};\n};\n\n/**\n * Checks if there are any tooltips or popovers on the mark\n * @param children\n * @returns\n */\nexport const isInteractive = (options: {\n chartPopovers?: ChartPopoverOptions[];\n chartTooltips?: ChartTooltipOptions[];\n hasOnClick?: boolean;\n metricRanges?: MetricRangeOptions[];\n trendlines?: TrendlineOptions[];\n}): boolean => {\n const hasOnClick = 'hasOnClick' in options && options.hasOnClick;\n const metricRanges = ('metricRanges' in options && options.metricRanges) || [];\n const trendlines = ('trendlines' in options && options.trendlines) || [];\n\n return (\n hasOnClick ||\n hasPopover(options) ||\n hasTooltip(options) ||\n trendlines.some((trendline) => trendline.displayOnHover) ||\n metricRanges.some((metricRange) => metricRange.displayOnHover)\n );\n};\n\nexport const hasPopover = (options: { chartPopovers?: ChartPopoverOptions[] }): boolean =>\n Boolean('chartPopovers' in options && options.chartPopovers?.length);\n\nexport const hasTooltip = (options: { chartTooltips?: ChartTooltipOptions[] }): boolean =>\n Boolean('chartTooltips' in options && options.chartTooltips?.length);\n\n/**\n * Gets the color encoding\n * @param color\n * @param colorScheme\n * @param colorScaleType\n * @returns ColorValueRef\n */\nexport const getColorProductionRule = (\n color: ColorFacet | DualFacet,\n colorScheme: ColorScheme,\n colorScaleType: 'linear' | 'ordinal' = 'ordinal'\n): ColorValueRef => {\n const colorScaleName = colorScaleType === 'linear' ? LINEAR_COLOR_SCALE : COLOR_SCALE;\n if (Array.isArray(color)) {\n return {\n signal: `scale('colors', datum.${color[0]})[indexof(domain('secondaryColor'), datum.${color[1]})% length(scale('colors', datum.${color[0]}))]`,\n };\n }\n if (typeof color === 'string') {\n return { scale: colorScaleName, field: color };\n }\n return { value: getColorValue(color.value, colorScheme) };\n};\n\n/**\n * gets the color encoding in a signal string format\n * @param color\n * @param colorScheme\n * @param colorScaleType\n * @returns string\n */\nexport const getColorProductionRuleSignalString = (\n color: ColorFacet | DualFacet,\n colorScheme: ColorScheme,\n colorScaleType: 'linear' | 'ordinal' = 'ordinal'\n): string => {\n const colorRule = getColorProductionRule(color, colorScheme, colorScaleType);\n if ('signal' in colorRule) {\n return colorRule.signal;\n }\n if ('scale' in colorRule && 'field' in colorRule) {\n return `scale('${colorRule.scale as string}', datum.${colorRule.field as string})`;\n }\n if ('value' in colorRule && colorRule.value) {\n return `'${colorRule.value as string}'`;\n }\n return '';\n};\n\nexport const getLineWidthProductionRule = (\n lineWidth: LineWidthFacet | DualFacet | undefined\n): NumericValueRef | undefined => {\n if (!lineWidth) return;\n if (Array.isArray(lineWidth)) {\n // 2d key reference for setting line width\n return {\n signal: `scale('lineWidths', datum.${lineWidth[0]})[indexof(domain('secondaryLineWidth'), datum.${lineWidth[1]})% length(scale('lineWidths', datum.${lineWidth[0]}))]`,\n };\n }\n // key reference for setting line width\n if (typeof lineWidth === 'string') {\n return { scale: LINE_WIDTH_SCALE, field: lineWidth };\n }\n // static value for setting line width\n return { value: getLineWidthPixelsFromLineWidth(lineWidth.value) };\n};\n\nexport const getOpacityProductionRule = (opacity: OpacityFacet | DualFacet): { signal: string } | { value: number } => {\n if (Array.isArray(opacity)) {\n return {\n signal: `scale('opacities', datum.${opacity[0]})[indexof(domain('secondaryOpacity'), datum.${opacity[1]})% length(scale('opacities', datum.${opacity[0]}))]`,\n };\n }\n if (typeof opacity === 'string') {\n return { signal: `scale('${OPACITY_SCALE}', datum.${opacity})` };\n }\n return { value: opacity.value };\n};\n\nexport const getSymbolSizeProductionRule = (symbolSize: SymbolSizeFacet): NumericValueRef => {\n // key reference for setting symbol size\n if (typeof symbolSize === 'string') {\n return { scale: SYMBOL_SIZE_SCALE, field: symbolSize };\n }\n // static value for setting symbol size\n return { value: getVegaSymbolSizeFromRscSymbolSize(symbolSize.value) };\n};\n\nexport const getStrokeDashProductionRule = (lineType: LineTypeFacet | DualFacet): ArrayValueRef => {\n if (Array.isArray(lineType)) {\n return {\n signal: `scale('lineTypes', datum.${lineType[0]})[indexof(domain('secondaryLineType'), datum.${lineType[1]})% length(scale('lineTypes', datum.${lineType[0]}))]`,\n };\n }\n if (typeof lineType === 'string') {\n return { scale: LINE_TYPE_SCALE, field: lineType };\n }\n return { value: getStrokeDashFromLineType(lineType.value) };\n};\n\nexport const getHighlightOpacityValue = (\n opacityValue: { signal: string } | { value: number } = DEFAULT_OPACITY_RULE\n): NumericValueRef => {\n if ('signal' in opacityValue) {\n return { signal: `${opacityValue.signal} / ${HIGHLIGHT_CONTRAST_RATIO}` };\n }\n return { value: opacityValue.value / HIGHLIGHT_CONTRAST_RATIO };\n};\n\n/**\n * gets the correct x encoding for marks that support scaleType\n * @param scaleType\n * @param dimension\n * @returns x encoding\n */\nexport const getXProductionRule = (scaleType: ScaleType, dimension: string): NumericValueRef => {\n const scale = getScaleName('x', scaleType);\n if (scaleType === 'time') {\n return { scale, field: DEFAULT_TRANSFORMED_TIME_DIMENSION };\n }\n return { scale, field: dimension };\n};\n\n/**\n * Gets the y encoding for marks\n * @param metricAxis\n * @param metric\n * @returns y encoding\n */\nexport const getYProductionRule = (metricAxis: string | undefined, metric: string): NumericValueRef => {\n return { scale: metricAxis || 'yLinear', field: metric };\n};\n\n/**\n * Gets the points used for the voronoi calculation\n * @param dataSource the name of the data source that will be used in the voronoi calculation\n * @param dimension the dimension for the x encoding\n * @param metric the metric for the y encoding\n * @param name the name of the component the voronoi is associated with, i.e. `scatter0`\n * @param scaleType the scale type for the x encoding\n * @returns SymbolMark\n */\nexport const getPointsForVoronoi = (\n dataSource: string,\n dimension: string,\n metric: string,\n name: string,\n scaleType: ScaleType,\n metricAxis?: string\n): SymbolMark => {\n return {\n name: `${name}_pointsForVoronoi`,\n description: `${name}_pointsForVoronoi`,\n type: 'symbol',\n from: { data: dataSource },\n interactive: false,\n encode: {\n enter: {\n y: getYProductionRule(metricAxis, metric),\n fill: { value: 'transparent' },\n stroke: { value: 'transparent' },\n },\n update: {\n x: getXProductionRule(scaleType, dimension),\n },\n },\n };\n};\n\n/**\n * Gets the voronoi path used for tooltips and popovers\n * @param markOptions\n * @param dataSource name of the point data source the voronoi is based on\n * @returns PathMark\n */\nexport const getVoronoiPath = (markOptions: LineMarkOptions | ScatterSpecOptions, dataSource: string): PathMark => {\n const { chartPopovers, chartTooltips, name: markName } = markOptions;\n const hasOnClick = 'hasOnClick' in markOptions && markOptions.hasOnClick;\n return {\n name: `${markName}_voronoi`,\n description: `${markName}_voronoi`,\n type: 'path',\n from: { data: dataSource },\n encode: {\n enter: {\n fill: { value: 'transparent' },\n stroke: { value: 'transparent' },\n isVoronoi: { value: true },\n tooltip: getTooltip(chartTooltips ?? [], markName, true),\n },\n update: {\n cursor: getCursor(chartPopovers ?? [], hasOnClick),\n },\n },\n transform: [\n {\n type: 'voronoi',\n x: `datum.x`,\n y: `datum.y`,\n // on initial render, width/height could be 0 which causes problems\n size: [{ signal: 'max(width, 1)' }, { signal: 'max(height, 1)' }],\n },\n ],\n };\n};\n\n/**\n * Gets the hover area for the mark\n * @param chartTooltips\n * @param dataSource the name of the data source that will be used in the hover area calculation\n * @param dimension the dimension for the x encoding\n * @param metric the metric for the y encoding\n * @param name the name of the component the hover area is associated with, i.e. `scatter0`\n * @param scaleType the scale type for the x encoding\n * @returns GroupMark\n */\nexport const getItemHoverArea = (\n chartTooltips: ChartTooltipOptions[],\n dataSource: string,\n dimension: string,\n metric: string,\n name: string,\n scaleType: ScaleType,\n metricAxis?: string\n): GroupMark => {\n return {\n name: `${name}_hoverGroup`,\n type: 'group',\n marks: getHoverSizes().map((size, i) => ({\n name: getHoverMarkName(name, i),\n type: 'symbol',\n from: { data: dataSource },\n encode: {\n enter: {\n shape: { value: HOVER_SHAPE },\n y: getYProductionRule(metricAxis, metric),\n fill: { value: 'transparent' },\n stroke: { value: 'transparent' },\n tooltip: getTooltip(chartTooltips, name, false),\n size: getHoverSizeSignal(size),\n },\n update: {\n x: getXProductionRule(scaleType, dimension),\n },\n },\n })),\n };\n};\n\nexport const getHoverMarkName = (name: string, index: number): string => `${name}_hover${index}`;\n\nexport const getHoverSizes = (): number[] => [...new Array(HOVER_SHAPE_COUNT)].map((_, i) => HOVER_SIZE / 2 ** i);\n\nexport const getHoverMarkNames = (markName: string): string[] =>\n [...new Array(HOVER_SHAPE_COUNT)].map((_, i) => getHoverMarkName(markName, i));\n\nconst getHoverSizeSignal = (size: number): SignalRef => ({\n signal: `${size} * max(width, 1) / 1000`,\n});\n\n/**\n * Gets the opacity for the mark (used to highlight marks).\n * This will take into account if there are any tooltips or popovers on the mark.\n * @param options\n * @returns\n */\nexport const getMarkOpacity = (\n options: BarSpecOptions | DonutSpecOptions | VennSpecOptions\n): ({ test?: string } & NumericValueRef)[] => {\n const { highlightedItem, idKey, name: markName } = options;\n const rules: ({ test?: string } & NumericValueRef)[] = [DEFAULT_OPACITY_RULE];\n\n // if there aren't any interactive components, then we don't need to add special opacity rules\n if (!isInteractive(options) && highlightedItem === undefined) {\n return rules;\n }\n\n addHighlightMarkOpacityRules(rules, options);\n\n // if a bar is hovered/selected, all other bars should have reduced opacity\n if (hasPopover(options)) {\n return [\n {\n test: `!isValid(${SELECTED_GROUP}) && ${SELECTED_ITEM} && ${SELECTED_ITEM} !== datum.${idKey}`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n },\n { test: `isValid(${SELECTED_ITEM}) && ${SELECTED_ITEM} === datum.${idKey}`, ...DEFAULT_OPACITY_RULE },\n {\n test: `isValid(${SELECTED_GROUP}) && ${SELECTED_GROUP} === datum.${markName}_selectedGroupId`,\n value: 1,\n },\n {\n test: `isValid(${SELECTED_GROUP}) && ${SELECTED_GROUP} !== datum.${markName}_selectedGroupId`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n },\n ...rules,\n ];\n }\n return rules;\n};\n\nexport const getInteractiveMarkName = (\n options: {\n chartPopovers?: ChartPopoverOptions[];\n chartTooltips?: ChartTooltipOptions[];\n hasOnClick?: boolean;\n highlightedItem?: HighlightedItem;\n metricRanges?: MetricRangeOptions[];\n trendlines?: TrendlineOptions[];\n },\n name: string\n): string | undefined => {\n // if the line has an interactive component, this line is the target for the interactive component\n if (isInteractive(options) || options.highlightedItem !== undefined) {\n return name;\n }\n // if there is a trendline with an interactive component on the line, then the trendline is the target for the interactive component\n if ('trendlines' in options && options.trendlines?.some((trendline) => isInteractive(trendline))) {\n return `${name}Trendline`;\n }\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Data, FormulaTransform, NumericValueRef, Signal, SourceData } from 'vega';\n\nimport {\n DEFAULT_OPACITY_RULE,\n FILTERED_TABLE,\n HIGHLIGHTED_GROUP,\n HIGHLIGHTED_ITEM,\n HIGHLIGHT_CONTRAST_RATIO,\n INTERACTION_MODE,\n SERIES_ID,\n} from '@spectrum-charts/constants';\n\nimport { getFilteredTableData } from '../data/dataUtils';\nimport { getHoverMarkNames } from '../marks/markUtils';\nimport {\n AreaSpecOptions,\n BarSpecOptions,\n ChartTooltipOptions,\n ChartTooltipSpecOptions,\n DonutSpecOptions,\n LineSpecOptions,\n ScatterSpecOptions,\n VennSpecOptions,\n} from '../types';\n\ntype TooltipParentOptions =\n | AreaSpecOptions\n | BarSpecOptions\n | DonutSpecOptions\n | LineSpecOptions\n | ScatterSpecOptions\n | VennSpecOptions;\n\n/**\n * gets all the tooltips\n * @param markOptions\n * @returns\n */\nexport const getTooltips = (markOptions: TooltipParentOptions): ChartTooltipSpecOptions[] => {\n return markOptions.chartTooltips.map((chartTooltip) => applyTooltipPropDefaults(chartTooltip, markOptions.name));\n};\n\n/**\n * Applies all defaults to ChartTooltipOptions\n * @param chartTooltipOptions\n * @returns ChartTooltipSpecOptions\n */\nexport const applyTooltipPropDefaults = (\n { highlightBy = 'item', ...options }: ChartTooltipOptions,\n markName: string\n): ChartTooltipSpecOptions => {\n return {\n highlightBy,\n markName,\n ...options,\n };\n};\n\n/**\n * Sets all the data needed for tooltips\n *\n * NOTE: this function mutates the data object so it should only be called from a produce function\n * @param data\n * @param chartTooltipOptions\n */\nexport const addTooltipData = (data: Data[], markOptions: TooltipParentOptions, addHighlightedData = true) => {\n const tooltips = getTooltips(markOptions);\n for (const { highlightBy, markName } of tooltips) {\n if (highlightBy === 'item') return;\n const filteredTable = getFilteredTableData(data);\n if (!filteredTable.transform) {\n filteredTable.transform = [];\n }\n if (highlightBy === 'dimension' && markOptions.markType !== 'donut' && markOptions.markType !== 'venn') {\n filteredTable.transform.push(getGroupIdTransform([markOptions.dimension], markName));\n } else if (highlightBy === 'series') {\n filteredTable.transform.push(getGroupIdTransform([SERIES_ID], markName));\n } else if (Array.isArray(highlightBy)) {\n filteredTable.transform.push(getGroupIdTransform(highlightBy, markName));\n }\n\n if (addHighlightedData) {\n data.push(getMarkHighlightedData(markName));\n }\n }\n};\n\n/**\n * Gets the group id transform\n * @param highlightBy\n * @param markName\n * @returns FormulaTransform\n */\nexport const getGroupIdTransform = (highlightBy: string[], markName: string): FormulaTransform => {\n return {\n type: 'formula',\n as: `${markName}_highlightGroupId`,\n expr: highlightBy.map((facet) => `datum.${facet}`).join(' + \" | \" + '),\n };\n};\n\n/**\n * Gets the highlighted data for a mark\n * @param markName\n * @returns\n */\nconst getMarkHighlightedData = (markName: string): SourceData => ({\n name: `${markName}_highlightedData`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'filter',\n expr: `${HIGHLIGHTED_GROUP} === datum.${markName}_highlightGroupId`,\n },\n ],\n});\n\nexport const isHighlightedByGroup = (markOptions: TooltipParentOptions) => {\n const tooltips = getTooltips(markOptions);\n return tooltips.some(({ highlightBy }) => highlightBy && highlightBy !== 'item');\n};\n\n/**\n * Tooltip highlights by item or dimension\n * @param markOptions\n * @returns\n */\nexport const isHighlightedByDimension = (markOptions: TooltipParentOptions) => {\n const tooltips = getTooltips(markOptions);\n return tooltips.some(\n ({ highlightBy }) => typeof highlightBy === 'string' && ['dimension', 'item'].includes(highlightBy)\n );\n};\n\n/**\n * adds the appropriate signals for tooltips\n *\n * NOTE: this function mutates the signals array so it should only be called from a produce function\n * @param signals\n * @param markOptions\n */\nexport const addTooltipSignals = (signals: Signal[], markOptions: TooltipParentOptions) => {\n if (isHighlightedByGroup(markOptions)) {\n const highlightedGroupSignal = signals.find((signal) => signal.name === HIGHLIGHTED_GROUP) as Signal;\n\n let markName = markOptions.name;\n let update = `datum.${markName}_highlightGroupId`;\n\n if ('interactionMode' in markOptions && markOptions.interactionMode === INTERACTION_MODE.ITEM) {\n getHoverMarkNames(markName).forEach((name) => {\n addMouseEvents(highlightedGroupSignal, name, update);\n });\n }\n\n if (['scatter', 'line'].includes(markOptions.markType)) {\n update = `datum.${update}`;\n markName += '_voronoi';\n }\n\n addMouseEvents(highlightedGroupSignal, markName, update);\n }\n};\n\nconst addMouseEvents = (highlightedGroupSignal: Signal, markName: string, update: string) => {\n if (highlightedGroupSignal.on === undefined) {\n highlightedGroupSignal.on = [];\n }\n highlightedGroupSignal.on.push(\n ...[\n {\n events: `@${markName}:mouseover`,\n update,\n },\n { events: `@${markName}:mouseout`, update: 'null' },\n ]\n );\n};\n\n/**\n * Adds the appropriate opacity rules to the beginning of the opacityRules array\n *\n * NOTE: this function mutates the opacityRules array so it should only be called from a produce function\n * @param opacityRules\n * @param markOptions\n */\nexport const addHighlightMarkOpacityRules = (\n opacityRules: ({ test?: string } & NumericValueRef)[],\n markOptions: TooltipParentOptions\n) => {\n opacityRules.unshift(\n {\n test: `isArray(${HIGHLIGHTED_ITEM}) && length(${HIGHLIGHTED_ITEM}) > 0 && indexof(${HIGHLIGHTED_ITEM}, datum.${markOptions.idKey}) === -1`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n },\n {\n test: `!isArray(${HIGHLIGHTED_ITEM}) && isValid(${HIGHLIGHTED_ITEM}) && ${HIGHLIGHTED_ITEM} !== datum.${markOptions.idKey}`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n }\n );\n if (isHighlightedByGroup(markOptions)) {\n const { name: markName } = markOptions;\n opacityRules.unshift({\n test: `${HIGHLIGHTED_GROUP} === datum.${markName}_highlightGroupId`,\n ...DEFAULT_OPACITY_RULE,\n });\n }\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Signal } from 'vega';\n\nimport {\n COLOR_SCALE,\n FILTERED_TABLE,\n FIRST_RSC_SERIES_ID,\n HIGHLIGHTED_GROUP,\n HIGHLIGHTED_ITEM,\n HIGHLIGHTED_SERIES,\n LAST_RSC_SERIES_ID,\n MOUSE_OVER_SERIES,\n SERIES_ID,\n} from '@spectrum-charts/constants';\n\n/**\n * Does signal with given name exist?\n */\nexport const hasSignalByName = (signals: Signal[], name: string) => {\n return signals.some((signal) => signal.name === name);\n};\n\n/**\n * Returns a controlled hover signal.\n * Controlled hover signals get manually updated via the view in Chart.tsx\n */\nexport const getControlledHoveredIdSignal = (name: string): Signal => {\n return {\n name: `${name}_controlledHoveredId`,\n value: null,\n on: [{ events: `@${name}:mouseout`, update: 'null' }],\n };\n};\n\n/**\n * Returns a controlled hover signal.\n * Controlled hover signals get manually updated via the view in Chart.tsx\n */\nexport const getControlledHoveredGroupSignal = (name: string): Signal => {\n return {\n name: `${name}_controlledHoveredGroup`,\n value: null,\n on: [{ events: `@${name}:mouseout`, update: 'null' }],\n };\n};\n\n/**\n * Returns the highlighted series signal\n */\nexport const addHighlighSignalLegendHoverEvents = (\n signals: Signal[],\n legendName: string,\n includeHiddenSeries: boolean,\n keys?: string[]\n) => {\n const signalName = keys?.length ? HIGHLIGHTED_GROUP : HIGHLIGHTED_SERIES;\n const highlightedItemSignal = signals.find((signal) => signal.name === signalName);\n if (highlightedItemSignal) {\n if (highlightedItemSignal.on === undefined) {\n highlightedItemSignal.on = [];\n }\n highlightedItemSignal.on.push(\n ...[\n {\n events: `@${legendName}_legendEntry:mouseover`,\n update: getHighlightSignalUpdateExpression(legendName, includeHiddenSeries, keys),\n },\n { events: `@${legendName}_legendEntry:mouseout`, update: 'null' },\n ]\n );\n }\n};\n\nexport const getHighlightSignalUpdateExpression = (\n legendName: string,\n includeHiddenSeries: boolean,\n keys?: string[]\n) => {\n const hoveredSeriesExpression = `domain(\"${legendName}Entries\")[datum.index]`;\n if (!includeHiddenSeries) return hoveredSeriesExpression;\n if (keys?.length) {\n return `indexof(pluck(data(\"${FILTERED_TABLE}\"),\"${legendName}_highlightGroupId\"), ${hoveredSeriesExpression}) !== -1 ? ${hoveredSeriesExpression} : null`;\n }\n return `indexof(hiddenSeries, ${hoveredSeriesExpression}) === -1 ? ${hoveredSeriesExpression} : null`;\n};\n\n/**\n * Returns the legendLabels series signal\n */\nexport const getLegendLabelsSeriesSignal = (value: unknown = null): Signal => {\n return {\n name: 'legendLabels',\n value,\n };\n};\n\n/**\n * Returns a basic value based signal\n */\nexport const getGenericValueSignal = (name: string, value: unknown = null): Signal => {\n return { name, value };\n};\n\n/**\n * Returns a basic value based signal\n */\nexport const getGenericUpdateSignal = (name: string, update: string): Signal => {\n return { name, update };\n};\n\n/**\n * Returns a signal that tracks which series is being moused over for dual Y-axis charts\n */\nexport const getMouseOverSeriesSignal = (markName: string): Signal => ({\n name: `${MOUSE_OVER_SERIES}`,\n value: null,\n on: [\n { events: `@${markName}:mouseover`, update: `datum.${SERIES_ID}` },\n { events: `@${markName}:mouseout`, update: 'null' },\n ],\n});\n\n/**\n * Returns a signal that tracks the first series in the series order for dual Y-axis charts\n */\nexport const getFirstRscSeriesIdSignal = (): Signal => ({\n name: `${FIRST_RSC_SERIES_ID}`,\n value: null,\n update: `length(domain(\"${COLOR_SCALE}\")) > 0 ? domain(\"${COLOR_SCALE}\")[0] : null`,\n});\n\n/**\n * Returns a signal that tracks the last series in the series order for dual Y-axis charts\n */\nexport const getLastRscSeriesIdSignal = (): Signal => ({\n name: `${LAST_RSC_SERIES_ID}`,\n value: null,\n update: `length(domain(\"${COLOR_SCALE}\")) > 0 ? peek(domain(\"${COLOR_SCALE}\")) : null`,\n});\n\n/**\n * adds on events to the highlighted item signal\n * @param signals\n * @param markName\n * @param datumOrder how deep the datum is nested (i.e. 1 becomes datum.rscMarkId, 2 becomes datum.datum.rscMarkId, etc.)\n * @param excludeDataKey data items with a truthy value for this key will be excluded from the signal\n */\nexport const addHighlightedItemSignalEvents = (\n signals: Signal[],\n markName: string,\n idKey: string,\n datumOrder = 1,\n excludeDataKeys?: string[]\n) => {\n const highlightedItemSignal = signals.find((signal) => signal.name === HIGHLIGHTED_ITEM);\n if (highlightedItemSignal) {\n if (highlightedItemSignal.on === undefined) {\n highlightedItemSignal.on = [];\n }\n const datum = new Array(datumOrder).fill('datum.').join('');\n\n const excludeDataKeysCondition = excludeDataKeys?.map((excludeDataKey) => `${datum}${excludeDataKey}`).join(' || ');\n highlightedItemSignal.on.push(\n ...[\n {\n events: `@${markName}:mouseover`,\n update: excludeDataKeys?.length\n ? `(${excludeDataKeysCondition}) ? null : ${datum}${idKey}`\n : `${datum}${idKey}`,\n },\n { events: `@${markName}:mouseout`, update: 'null' },\n ]\n );\n }\n};\n\n/**\n * adds on events to the highlighted series signal\n * @param signals\n * @param markName\n * @param datumOrder how deep the datum is nested (i.e. 1 becomes datum.rscMarkId, 2 becomes datum.datum.rscMarkId, etc.)\n * @param excludeDataKey data items with a truthy value for this key will be excluded from the signal\n */\nexport const addHighlightedSeriesSignalEvents = (\n signals: Signal[],\n markName: string,\n datumOrder = 1,\n excludeDataKeys?: string[]\n) => {\n const highlightedSeriesSignal = signals.find((signal) => signal.name === HIGHLIGHTED_SERIES);\n if (highlightedSeriesSignal) {\n if (highlightedSeriesSignal.on === undefined) {\n highlightedSeriesSignal.on = [];\n }\n const datum = new Array(datumOrder).fill('datum.').join('');\n\n const excludeDataKeysCondition = excludeDataKeys?.map((excludeDataKey) => `${datum}${excludeDataKey}`).join(' || ');\n highlightedSeriesSignal.on.push(\n ...[\n {\n events: `@${markName}:mouseover`,\n update: excludeDataKeys?.length\n ? `(${excludeDataKeysCondition}) ? null : ${datum}${SERIES_ID}`\n : `${datum}${SERIES_ID}`,\n },\n { events: `@${markName}:mouseout`, update: 'null' },\n ]\n );\n }\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { AreaMark, NumericValueRef, ProductionRule } from 'vega';\n\nimport {\n DEFAULT_OPACITY_RULE,\n DEFAULT_TRANSFORMED_TIME_DIMENSION,\n HIGHLIGHTED_ITEM,\n HIGHLIGHTED_SERIES,\n HIGHLIGHT_CONTRAST_RATIO,\n SELECTED_SERIES,\n SERIES_ID,\n} from '@spectrum-charts/constants';\n\nimport {\n getBorderStrokeEncodings,\n getColorProductionRule,\n getCursor,\n getTooltip,\n isInteractive,\n} from '../marks/markUtils';\nimport {\n ChartPopoverOptions,\n ChartTooltipOptions,\n ColorFacet,\n ColorScheme,\n HighlightedItem,\n ScaleType,\n} from '../types';\n\nexport interface AreaMarkOptions {\n color: ColorFacet;\n colorScheme: ColorScheme;\n dimension: string;\n displayOnHover?: boolean;\n highlightedItem?: HighlightedItem;\n isHighlightedByGroup?: boolean;\n isMetricRange?: boolean;\n isStacked: boolean;\n metricStart: string;\n metricEnd: string;\n name: string;\n opacity: number;\n parentName?: string; // Optional name of mark that this area is a child of. Used for metric ranges.\n scaleType: ScaleType;\n\n chartPopovers?: ChartPopoverOptions[];\n chartTooltips?: ChartTooltipOptions[];\n}\n\nexport const getAreaMark = (\n areaOptions: AreaMarkOptions,\n dataSource: string = `${areaOptions.name}_facet`\n): AreaMark => {\n const {\n name,\n chartPopovers,\n chartTooltips,\n color,\n colorScheme,\n metricStart,\n metricEnd,\n isStacked,\n scaleType,\n dimension,\n opacity,\n } = areaOptions;\n return {\n name,\n description: name,\n type: 'area',\n from: { data: dataSource },\n interactive: isInteractive(areaOptions),\n encode: {\n enter: {\n y: { scale: 'yLinear', field: metricStart },\n y2: { scale: 'yLinear', field: metricEnd },\n fill: getColorProductionRule(color, colorScheme),\n tooltip: getTooltip(chartTooltips ?? [], name),\n ...getBorderStrokeEncodings(isStacked, true),\n },\n update: {\n // this has to be in update because when you resize the window that doesn't rebuild the spec\n // but it may change the x position if it causes the chart to resize\n x: getX(scaleType, dimension),\n cursor: getCursor(chartPopovers ?? []),\n fillOpacity: { value: opacity },\n opacity: getAreaOpacity(areaOptions),\n },\n },\n };\n};\n\nexport function getAreaOpacity(areaOptions: AreaMarkOptions): ProductionRule<NumericValueRef> | undefined {\n const { chartPopovers, displayOnHover, isHighlightedByGroup, isMetricRange, highlightedItem, name } = areaOptions;\n // if metric ranges only display when hovering, we don't need to include other hover rules for this specific area\n const fadedOpacity = 1 / HIGHLIGHT_CONTRAST_RATIO;\n if (isMetricRange && displayOnHover) {\n return [\n { test: `isValid(${HIGHLIGHTED_SERIES}) && ${HIGHLIGHTED_SERIES} === datum.${SERIES_ID}`, value: 1 },\n {\n test: `isValid(${HIGHLIGHTED_ITEM}) && indexof(pluck(data('${name}_highlightedData'), '${SERIES_ID}'), datum.${SERIES_ID}) > -1`,\n },\n { test: `isValid(${SELECTED_SERIES}) && ${SELECTED_SERIES} === datum.${SERIES_ID}`, value: 1 },\n { value: 0 },\n ];\n }\n\n if (!isInteractive(areaOptions) && !highlightedItem) {\n return [DEFAULT_OPACITY_RULE];\n }\n\n const opacityRules: ProductionRule<NumericValueRef> = [];\n if (isHighlightedByGroup) {\n opacityRules.push({\n test: `indexof(pluck(data('${name}_highlightedData'), '${SERIES_ID}'), datum.${SERIES_ID}) !== -1`,\n value: 1,\n });\n }\n // if an area is hovered or selected, all other areas should have half opacity\n if (!isMetricRange && chartPopovers?.length) {\n return [\n ...opacityRules,\n {\n test: `!isValid(${SELECTED_SERIES}) && isValid(${HIGHLIGHTED_SERIES}) && ${HIGHLIGHTED_SERIES} !== datum.${SERIES_ID}`,\n value: fadedOpacity,\n },\n {\n test: `!isValid(${SELECTED_SERIES}) && length(data('${name}_highlightedData')) > 0 && indexof(pluck(data('${name}_highlightedData'), '${SERIES_ID}'), datum.${SERIES_ID}) === -1`,\n value: fadedOpacity,\n },\n {\n test: `isValid(${SELECTED_SERIES}) && ${SELECTED_SERIES} !== datum.${SERIES_ID}`,\n value: fadedOpacity,\n },\n DEFAULT_OPACITY_RULE,\n ];\n }\n\n return [\n ...opacityRules,\n {\n test: `isValid(${HIGHLIGHTED_SERIES}) && ${HIGHLIGHTED_SERIES} !== datum.${SERIES_ID}`,\n value: fadedOpacity,\n },\n {\n test: `length(data('${name}_highlightedData')) > 0 && indexof(pluck(data('${name}_highlightedData'), '${SERIES_ID}'), datum.${SERIES_ID}) === -1`,\n value: fadedOpacity,\n },\n DEFAULT_OPACITY_RULE,\n ];\n}\n\nexport const getX = (scaleType: ScaleType, dimension: string): ProductionRule<NumericValueRef> => {\n if (scaleType === 'time') {\n return { scale: 'xTime', field: DEFAULT_TRANSFORMED_TIME_DIMENSION };\n } else if (scaleType === 'linear') {\n return { scale: 'xLinear', field: dimension };\n }\n return { scale: 'xPoint', field: dimension };\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Data, Mark, Scale, Signal, SourceData } from 'vega';\n\nimport {\n BACKGROUND_COLOR,\n COLOR_SCALE,\n DEFAULT_COLOR,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_METRIC,\n DEFAULT_TIME_DIMENSION,\n FILTERED_TABLE,\n HIGHLIGHTED_ITEM,\n SELECTED_ITEM,\n SELECTED_SERIES,\n} from '@spectrum-charts/constants';\nimport { spectrumColors } from '@spectrum-charts/themes';\nimport { toCamelCase } from '@spectrum-charts/utils';\n\nimport {\n addTooltipData,\n addTooltipSignals,\n isHighlightedByDimension,\n isHighlightedByGroup,\n} from '../chartTooltip/chartTooltipUtils';\nimport { addTimeTransform, getFilteredTableData, getTableData, getTransformSort } from '../data/dataUtils';\nimport { hasPopover, hasTooltip, isInteractive } from '../marks/markUtils';\nimport { addContinuousDimensionScale, addFieldToFacetScaleDomain, addMetricScale } from '../scale/scaleSpecBuilder';\nimport {\n addHighlightedSeriesSignalEvents,\n getControlledHoveredGroupSignal,\n getControlledHoveredIdSignal,\n} from '../signal/signalSpecBuilder';\nimport {\n AreaOptions,\n AreaSpecOptions,\n ChartPopoverOptions,\n ColorScheme,\n HighlightedItem,\n ScSpec,\n ScaleType,\n} from '../types';\nimport { getAreaMark, getX } from './areaUtils';\n\nexport const addArea = produce<\n ScSpec,\n [AreaOptions & { colorScheme?: ColorScheme; highlightedItem?: HighlightedItem; index?: number; idKey: string }]\n>(\n (\n spec,\n {\n chartPopovers = [],\n chartTooltips = [],\n color = DEFAULT_COLOR,\n colorScheme = DEFAULT_COLOR_SCHEME,\n dimension = DEFAULT_TIME_DIMENSION,\n index = 0,\n metric = DEFAULT_METRIC,\n metricStart,\n metricEnd,\n name,\n opacity = 0.8,\n scaleType = 'time',\n ...options\n }\n ) => {\n // put options back together now that all defaults are set\n const areaOptions: AreaSpecOptions = {\n chartPopovers,\n chartTooltips,\n color,\n colorScheme,\n dimension,\n index,\n metric,\n name: toCamelCase(name || `area${index}`),\n scaleType,\n opacity,\n metricStart,\n metricEnd,\n ...options,\n };\n\n // if either start or end is defined but not both, error to the console and default back to metric\n if ((metricStart || metricEnd) && !(metricStart && metricEnd)) {\n console.error(\n `${metricEnd ? 'metricEnd' : 'metricStart'} is defined but ${\n metricEnd ? 'metricStart' : 'metricEnd'\n } is not. Both must be defined in order to use the \"start and end\" method. Defaulting back to 'metric = ${metric}'`\n );\n areaOptions.metricEnd = undefined;\n areaOptions.metricStart = undefined;\n }\n\n spec.data = addData(spec.data ?? [], areaOptions);\n spec.signals = addSignals(spec.signals ?? [], areaOptions);\n spec.scales = setScales(spec.scales ?? [], areaOptions);\n spec.marks = addAreaMarks(spec.marks ?? [], areaOptions);\n\n return spec;\n }\n);\n\nexport const addData = produce<Data[], [AreaSpecOptions]>((data, areaOptions) => {\n const { color, dimension, highlightedItem, metric, metricEnd, metricStart, name, order, scaleType } = areaOptions;\n if (scaleType === 'time') {\n const tableData = getTableData(data);\n tableData.transform = addTimeTransform(tableData.transform ?? [], dimension);\n }\n\n if (!metricEnd || !metricStart) {\n const filteredTableData = getFilteredTableData(data);\n // if metricEnd and metricStart don't exist, then we are using metric so we will support stacked\n filteredTableData.transform = [\n ...(filteredTableData.transform ?? []),\n {\n type: 'stack',\n groupby: [dimension],\n field: metric,\n sort: getTransformSort(order),\n as: [`${metric}0`, `${metric}1`],\n },\n ];\n }\n\n if (isInteractive(areaOptions) || highlightedItem !== undefined) {\n const areaHasPopover = hasPopover(areaOptions);\n const areaHasTooltip = hasTooltip(areaOptions);\n data.push(\n getAreaHighlightedData(name, areaOptions.idKey, areaHasTooltip, areaHasPopover, isHighlightedByGroup(areaOptions))\n );\n if (areaHasPopover) {\n data.push({\n name: `${name}_selectedDataSeries`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'filter',\n expr: `isValid(${SELECTED_SERIES}) && ${SELECTED_SERIES} === datum.${color}`,\n },\n ],\n });\n }\n }\n addTooltipData(data, areaOptions, false);\n});\n\nexport const getAreaHighlightedData = (\n name: string,\n idKey: string,\n hasTooltip: boolean,\n hasPopover: boolean,\n hasGroupId: boolean\n): SourceData => {\n let expr = '';\n if (hasGroupId) {\n expr += `${name}_controlledHoveredGroup === datum.${name}_highlightGroupId`;\n } else {\n expr += `isArray(${HIGHLIGHTED_ITEM}) && indexof(${HIGHLIGHTED_ITEM}, datum.${idKey}) > -1 || ${HIGHLIGHTED_ITEM} === datum.${idKey}`;\n if (hasTooltip) {\n expr = `${name}_controlledHoveredId === datum.${idKey} || ${expr}`;\n }\n }\n if (hasPopover) {\n expr = `isValid(${SELECTED_ITEM}) && ${SELECTED_ITEM} === datum.${idKey} || !isValid(${SELECTED_ITEM}) && ${expr}`;\n }\n return {\n name: `${name}_highlightedData`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'filter',\n expr,\n },\n ],\n };\n};\n\nexport const addSignals = produce<Signal[], [AreaSpecOptions]>((signals, areaOptions) => {\n const { chartTooltips, name } = areaOptions;\n if (!isInteractive(areaOptions)) return;\n addHighlightedSeriesSignalEvents(signals, name, 1, chartTooltips[0]?.excludeDataKeys);\n if (areaOptions.highlightedItem) {\n addHighlightedItemEvents(signals, name);\n }\n if (!isHighlightedByGroup(areaOptions)) {\n signals.push(getControlledHoveredIdSignal(name));\n } else {\n signals.push(getControlledHoveredGroupSignal(name));\n }\n addTooltipSignals(signals, areaOptions);\n});\n\n/**\n * Adds an on event that clears the controlled highlighted item signal value when the user mouses over the area.\n * @param signals\n * @param areaName\n */\nexport const addHighlightedItemEvents = (signals: Signal[], areaName: string) => {\n const highlightedItemSignal = signals.find((signal) => signal.name === HIGHLIGHTED_ITEM);\n if (highlightedItemSignal) {\n if (highlightedItemSignal.on === undefined) {\n highlightedItemSignal.on = [];\n }\n // as soon as the user mouses over the area, we want to null out the highlighted item\n highlightedItemSignal.on.push(...[{ events: `@${areaName}:mouseover`, update: 'null' }]);\n }\n};\n\nexport const setScales = produce<Scale[], [AreaSpecOptions]>(\n (scales, { metric, metricEnd, metricStart, dimension, color, scaleType, padding }) => {\n // add dimension scale\n addContinuousDimensionScale(scales, { scaleType, dimension, padding });\n // add color to the color domain\n addFieldToFacetScaleDomain(scales, COLOR_SCALE, color);\n // find the linear scale and add our field to it\n if (!metricEnd || !metricStart) {\n metricStart = `${metric}0`;\n metricEnd = `${metric}1`;\n }\n addMetricScale(scales, [metricStart, metricEnd]);\n return scales;\n }\n);\n\nexport const addAreaMarks = produce<Mark[], [AreaSpecOptions]>((marks, areaOptions) => {\n const {\n chartPopovers,\n chartTooltips,\n color,\n colorScheme,\n dimension,\n highlightedItem,\n metric,\n name,\n opacity,\n scaleType,\n } = areaOptions;\n let { metricStart, metricEnd } = areaOptions;\n let isStacked = false;\n if (!metricEnd || !metricStart) {\n isStacked = true;\n metricStart = `${metric}0`;\n metricEnd = `${metric}1`;\n }\n marks.push(\n {\n name: `${name}_group`,\n type: 'group',\n from: {\n facet: {\n name: `${name}_facet`,\n data: FILTERED_TABLE,\n groupby: color,\n },\n },\n marks: [\n getAreaMark({\n chartPopovers,\n chartTooltips,\n color,\n colorScheme,\n dimension,\n isHighlightedByGroup: isHighlightedByGroup(areaOptions),\n isStacked,\n highlightedItem,\n metricStart,\n metricEnd,\n name,\n opacity,\n scaleType,\n }),\n ...getAnchorPointMark(areaOptions),\n ],\n },\n ...getSelectedAreaMarks({ chartPopovers, name, scaleType, color, dimension, metricEnd, metricStart }),\n ...getHoverMarks(areaOptions)\n );\n return marks;\n});\n\n/**\n * returns a transparent point that gets used by the popover to anchor to\n */\nconst getAnchorPointMark = (areaOptions: AreaSpecOptions): Mark[] => {\n const { name, dimension, metric, scaleType } = areaOptions;\n if (!isInteractive(areaOptions)) return [];\n return [\n {\n name: `${name}_anchorPoint`,\n type: 'symbol',\n from: { data: `${name}_highlightedData` },\n interactive: false,\n encode: {\n enter: {\n y: { scale: 'yLinear', field: `${metric}1` },\n stroke: { value: 'transparent' },\n fill: { value: 'transparent' },\n },\n update: {\n x: getX(scaleType, dimension),\n },\n },\n },\n ];\n};\n\n/**\n * returns a circle symbol and a rule on the hovered/selected point\n */\nconst getHoverMarks = (areaOptions: AreaSpecOptions): Mark[] => {\n const { name, dimension, highlightedItem, metric, scaleType, color } = areaOptions;\n if (!isInteractive(areaOptions) && highlightedItem === undefined) return [];\n const highlightMarks: Mark[] = [\n {\n name: `${name}_point`,\n type: 'symbol',\n from: { data: `${name}_highlightedData` },\n interactive: false,\n encode: {\n enter: {\n y: { scale: 'yLinear', field: `${metric}1` },\n stroke: { scale: COLOR_SCALE, field: color },\n fill: { signal: BACKGROUND_COLOR },\n },\n update: {\n x: getX(scaleType, dimension),\n },\n },\n },\n ];\n if (isHighlightedByDimension(areaOptions) || highlightedItem) {\n highlightMarks.unshift({\n name: `${name}_rule`,\n type: 'rule',\n from: { data: `${name}_highlightedData` },\n interactive: false,\n encode: {\n enter: {\n y: { value: 0 },\n y2: { signal: 'height' },\n strokeWidth: { value: 1 },\n },\n update: {\n x: getX(scaleType, dimension),\n },\n },\n });\n }\n return highlightMarks;\n};\n\n/**\n * returns an area mark for the blue border around the selected area.\n */\nconst getSelectedAreaMarks = ({\n chartPopovers,\n name,\n scaleType,\n color,\n dimension,\n metricEnd,\n metricStart,\n}: {\n chartPopovers: ChartPopoverOptions[];\n name: string;\n scaleType: ScaleType;\n color: string;\n dimension: string;\n metricEnd: string;\n metricStart: string;\n}): Mark[] => {\n if (!chartPopovers.length) return [];\n return [\n {\n name: `${name}_selectBorder`,\n type: 'area',\n from: { data: `${name}_selectedDataSeries` },\n interactive: false,\n encode: {\n enter: {\n y: { scale: 'yLinear', field: metricStart },\n y2: { scale: 'yLinear', field: metricEnd },\n // need to fill this so the white border doesn't slightly bleed around the blue select border\n fill: { scale: COLOR_SCALE, field: color },\n stroke: { value: spectrumColors.light['static-blue'] },\n strokeWidth: { value: 2 },\n strokeJoin: { value: 'round' },\n },\n update: {\n // this has to be in update because when you resize the window that doesn't rebuild the spec\n // but it may change the x position if it causes the chart to resize\n x: getX(scaleType, dimension),\n },\n },\n },\n ];\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Axis, Data, Mark, ScaleType, Signal, SourceData, ValuesData } from 'vega';\n\nimport {\n ANNOTATION_RANGED_ICON_SVG,\n ANNOTATION_SINGLE_ICON_SVG,\n DEFAULT_AXIS_ANNOTATION_COLOR,\n DEFAULT_AXIS_ANNOTATION_OFFSET,\n FILTERED_TABLE,\n} from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { getCursor } from '../marks/markUtils';\nimport { AxisAnnotationOptions, AxisAnnotationSpecOptions, AxisSpecOptions, ColorScheme, Position } from '../types';\n\n/**\n * Adds the required data for axis annotations.\n *\n * NOTE: this function should only be called from within a produce with data as the root state since it directly\n * mutates the data array\n * @param data\n * @param axisAnnotationOptions\n */\nexport const addAxisAnnotationData = (\n data: Data[],\n { name, dataKey, color, colorScheme, options, format }: AxisAnnotationSpecOptions\n) => {\n data.push(getAxisAnnotationDetailData(name, options, colorScheme));\n if (format === 'summary') {\n data.push(getAxisAnnotationSummaryData(name, dataKey, color, colorScheme));\n } else {\n data.push(getAxisAnnotationAggregateData(name, dataKey, color, colorScheme), getAxisAnnotationRangeData(name));\n }\n};\n\nconst getAxisAnnotationDetailData = (name: string, options, colorScheme): ValuesData => {\n const newOptions = options.map((option) => ({ ...option, color: getColorValue(option.color, colorScheme) }));\n return { name: `${name}_details`, values: newOptions };\n};\n\nconst getAxisAnnotationAggregateData = (name, dataKey, color, colorScheme): SourceData => {\n return {\n name: `${name}_aggregate`,\n source: FILTERED_TABLE,\n transform: [\n { type: 'filter', expr: `datum.${dataKey}` },\n {\n type: 'flatten',\n fields: [dataKey],\n as: [`${name}_id`],\n },\n {\n type: 'aggregate',\n groupby: [`${name}_id`],\n fields: ['datetime', 'datetime'],\n ops: ['min', 'max'],\n },\n {\n type: 'formula',\n expr: 'datum.max_datetime - datum.min_datetime',\n as: 'width',\n },\n {\n type: 'formula',\n expr: 'datum.width / 2 + datum.min_datetime',\n as: 'center',\n },\n {\n type: 'aggregate',\n groupby: ['center'],\n fields: ['min_datetime', 'max_datetime', 'width', dataKey, dataKey],\n ops: ['min', 'max', 'max', 'count', 'values'],\n as: ['lower', 'upper', 'width', 'number', 'annotations'],\n },\n {\n type: 'formula',\n expr: `datum.annotations[0].${name}_id`,\n as: 'id',\n },\n {\n type: 'lookup',\n from: `${name}_details`,\n key: `id`,\n values: ['color'],\n fields: [`id`],\n },\n {\n type: 'formula',\n expr: `datum.number > 1 || datum.color == null ? '${getColorValue(color, colorScheme)}' : datum.color`,\n as: 'color',\n },\n ],\n };\n};\n\nconst getAxisAnnotationSummaryData = (name, dataKey, color, colorScheme): SourceData => {\n return {\n name: `${name}_summary`,\n source: FILTERED_TABLE,\n transform: [\n { type: 'filter', expr: `datum.${dataKey}` },\n {\n type: 'flatten',\n fields: [dataKey],\n as: [`${name}_id`],\n },\n {\n type: 'aggregate',\n groupby: [`${name}_id`],\n },\n {\n type: 'aggregate',\n groupby: ['center'],\n fields: [dataKey, dataKey],\n ops: ['count', 'values'],\n as: ['number', 'annotations'],\n },\n {\n type: 'formula',\n expr: `datum.annotations[0].${name}_id`,\n as: 'id',\n },\n {\n type: 'lookup',\n from: `${name}_details`,\n key: `id`,\n values: ['color'],\n fields: [`id`],\n },\n {\n type: 'formula',\n expr: `datum.number > 1 || datum.color == null ? '${getColorValue(color, colorScheme)}' : datum.color`,\n as: 'color',\n },\n ],\n };\n};\n\nconst getAxisAnnotationRangeData = (name: string): SourceData => {\n return {\n name: `${name}_range`,\n source: `${name}_aggregate`,\n transform: [\n {\n type: 'filter',\n expr: `${name}_highlighted && datum.center == ${name}_highlighted.center && ${name}_highlighted.width > 0`,\n },\n ],\n };\n};\n\n/**\n * Adds the required signals for axis annotations.\n *\n * NOTE: this function should only be called from within a produce with signals as the root state since it directly\n * mutates the signals array\n * @param signals\n * @param param1\n */\nexport const addAxisAnnotationSignals = (signals: Signal[], { name, format }: AxisAnnotationSpecOptions) => {\n if (format === 'span') {\n signals.push(\n getHighlightAxisAnnotationSignal(name),\n getClickAxisAnnotationSignal(name),\n getSelectAxisAnnotationSignal(name)\n );\n }\n};\n\n/**\n * Returns the highlighted axis annotation signal\n */\nconst getHighlightAxisAnnotationSignal = (name: string): Signal => {\n return {\n name: `${name}_highlighted`,\n value: null,\n on: [\n { events: `@${name}_icon:mouseover`, update: `datum` },\n { events: `@${name}_icon:mouseout`, update: `${name}_clicked` },\n ],\n };\n};\n\n/**\n * Returns the selected axis annotation signal\n */\nconst getClickAxisAnnotationSignal = (name: string): Signal => {\n return {\n name: `${name}_clicked`,\n value: {},\n on: [\n {\n events: {\n markname: `${name}_icon`,\n type: 'mousedown',\n between: [{ type: 'mousedown' }, { type: 'mouseup' }],\n },\n update: 'datum',\n },\n { events: 'window:mouseup', update: '{}' },\n ],\n };\n};\n\n/**\n * Returns the selected axis annotation static signal\n */\nconst getSelectAxisAnnotationSignal = (name: string): Signal => {\n return {\n name: `${name}_selected`,\n update: `${name}_clicked.center`,\n };\n};\n\n/**\n * Adds the required marks for axis annotations.\n *\n * NOTE: this function should only be called from within a produce with marks as the root state since it directly\n * mutates the marks array\n * @param marks\n * @param param1\n */\nexport const addAxisAnnotationMarks = (\n marks: Mark[],\n axisAnnotationOptions: AxisAnnotationSpecOptions,\n scaleName: string\n) => {\n const { format } = axisAnnotationOptions;\n if (format === 'summary') {\n marks.push(getAxisAnnotationSummaryMarks(axisAnnotationOptions));\n } else {\n marks.push(getAxisAnnotationSpanMarks(axisAnnotationOptions, scaleName));\n }\n};\n\n/**\n * NOTE: this function should only be called from within a produce with marks as the root state since it directly\n * mutates the marks array\n * @param marks\n * @param param1\n */\nexport const getAxisAnnotationSummaryMarks = ({ chartPopovers, name, offset }: AxisAnnotationSpecOptions): Mark => {\n return {\n name: `${name}_group`,\n type: 'group',\n from: {\n data: `${name}_summary`,\n },\n marks: [\n {\n name: `${name}_icon`,\n type: 'path',\n from: {\n data: `${name}_summary`,\n },\n zindex: 2,\n encode: {\n enter: {\n // adding a 2px transparent border increases the area of the icon so it's easier to hover\n stroke: { value: 'transparent' },\n strokeWidth: { value: 2 },\n cursor: getCursor(chartPopovers),\n },\n update: {\n path: {\n signal: `'${ANNOTATION_SINGLE_ICON_SVG}'`,\n },\n fill: {\n field: 'color',\n },\n xc: {\n signal: `width - 12`,\n },\n yc: {\n signal: `height + ${offset}`,\n },\n },\n },\n },\n ],\n };\n};\n\n/**\n * Adds the required marks for axis annotations that support time series axis.\n * @param marks\n * @param param1\n */\nexport const getAxisAnnotationSpanMarks = (\n { chartPopovers, name, offset }: AxisAnnotationSpecOptions,\n scaleName: string\n): Mark => {\n return {\n name: `${name}_group`,\n type: 'group',\n marks: [\n {\n name: `${name}_range`,\n type: 'group',\n marks: [\n {\n type: 'rect',\n from: {\n data: `${name}_range`,\n },\n encode: {\n update: {\n x: {\n scale: scaleName,\n field: 'lower',\n band: 0.5,\n },\n y: { signal: `height + ${offset}` },\n width: { value: 2 },\n height: { value: -4 },\n fill: { field: 'color' },\n fillOpacity: {\n signal: `${name}_selected ? 1.0 : 0.2`,\n },\n },\n },\n },\n {\n type: 'rect',\n from: {\n data: `${name}_range`,\n },\n encode: {\n update: {\n x: {\n scale: scaleName,\n field: 'lower',\n band: 0.5,\n },\n y: { signal: `height + ${offset}` },\n x2: {\n scale: scaleName,\n field: 'upper',\n band: 0.5,\n },\n height: { value: 2 },\n fill: { field: 'color' },\n fillOpacity: {\n signal: `${name}_selected ? 1.0 : 0.2`,\n },\n },\n },\n },\n {\n type: 'rect',\n from: {\n data: `${name}_range`,\n },\n encode: {\n update: {\n x: {\n scale: scaleName,\n field: 'upper',\n band: 0.5,\n },\n y: { signal: `height + ${offset} + 2` },\n width: { value: 2 },\n height: { value: -6 },\n fill: { field: 'color' },\n fillOpacity: {\n signal: `${name}_selected ? 1.0 : 0.2`,\n },\n },\n },\n },\n ],\n },\n {\n name: `${name}_icon`,\n type: 'path',\n from: {\n data: `${name}_aggregate`,\n },\n encode: {\n enter: {\n // adding a 2px transparent border increases the area of the icon so it's easier to hover\n stroke: { value: 'transparent' },\n strokeWidth: { value: 2 },\n cursor: getCursor(chartPopovers),\n },\n update: {\n path: {\n signal: `datum.width > 0 ? '${ANNOTATION_RANGED_ICON_SVG}' : '${ANNOTATION_SINGLE_ICON_SVG}'`,\n },\n fill: {\n field: 'color',\n },\n xc: {\n scale: scaleName,\n field: 'center',\n band: 0.5,\n },\n yc: {\n signal: `height + ${offset}`,\n },\n fillOpacity: {\n signal: `(${name}_selected && ${name}_selected != datum.center) ? 0.0 : 1.0`,\n },\n },\n },\n },\n ],\n };\n};\n\n/**\n * Adds the required axis for axis annotations.\n *\n * NOTE: this function should only be called from within a produce with axes as the root state since it directly\n * mutates the axes array\n * @param axes\n * @param param1\n */\nexport const addAxisAnnotationAxis = (axes: Axis[], { offset }: AxisAnnotationSpecOptions, scaleName) => {\n axes.push({\n scale: scaleName,\n orient: 'bottom',\n values: [],\n offset: offset,\n });\n};\n\nexport const getAxisAnnotationsFromChildren = ({\n axisAnnotations,\n colorScheme,\n name: axisName,\n position,\n scaleType,\n}: AxisSpecOptions & { scaleType: ScaleType }): AxisAnnotationSpecOptions[] => {\n if (position !== 'bottom') return [];\n return axisAnnotations.map((annotation, annotationIndex) => {\n return applyDefaultAxisAnnotationOptions(annotation, annotationIndex, axisName, colorScheme, scaleType);\n });\n};\n\nexport const applyDefaultAxisAnnotationOptions = (\n {\n chartPopovers = [],\n chartTooltips = [],\n name,\n format,\n offset = DEFAULT_AXIS_ANNOTATION_OFFSET,\n color = DEFAULT_AXIS_ANNOTATION_COLOR,\n dataKey = 'annotations',\n options = [],\n }: AxisAnnotationOptions,\n annotationIndex: number,\n axisName: string,\n colorScheme: ColorScheme,\n scaleType: ScaleType\n): AxisAnnotationSpecOptions => {\n return {\n chartPopovers,\n chartTooltips,\n color,\n colorScheme,\n dataKey,\n name: name ?? `${axisName}Annotation${annotationIndex}`,\n offset,\n options,\n axisName,\n format: format ?? (scaleType === 'time' ? 'span' : 'summary'),\n };\n};\n\nexport const axisTypeSupportsAxisAnnotations = (position: Position | undefined): boolean => {\n const supportedAxisPositions: Position[] = ['bottom'];\n return Boolean(position && supportedAxisPositions.includes(position));\n};\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n * Generates consistent scale names for dual-axis charts\n * @param baseScaleName The base scale name (e.g. 'xLinear', 'yLinear', 'customAxis')\n * @param isDualAxis Whether this is a dual axis chart\n * @returns Object containing all scale names needed for dual axis configuration\n */\nexport function getDualAxisScaleNames(baseScaleName: string) {\n const primaryScaleName = `${baseScaleName}Primary`;\n const secondaryScaleName = `${baseScaleName}Secondary`;\n return {\n primaryScale: primaryScaleName,\n secondaryScale: secondaryScaleName,\n primaryDomain: `${primaryScaleName}Domain`,\n secondaryDomain: `${secondaryScaleName}Domain`,\n };\n}\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { TextValueRef } from 'vega';\n\nimport { getD3FormatSpecifierFromNumberFormat } from './specUtils';\nimport { NumberFormat } from './types';\n\n/**\n * gets the number format tests and signals based on the numberFormat\n * @param numberFormat\n * @returns\n */\nexport const getTextNumberFormat = (\n numberFormat: NumberFormat | string,\n datumProperty: string = 'value',\n currencyLocale?: string,\n currencyCode?: string\n): ({\n test?: string;\n} & TextValueRef)[] => {\n const test = `isNumber(datum['${datumProperty}'])`;\n if (numberFormat === 'shortNumber') {\n return [{ test, signal: `formatShortNumber(datum['${datumProperty}'])` }];\n }\n if (numberFormat === 'shortCurrency') {\n return [\n {\n test: `${test} && abs(datum['${datumProperty}']) >= 1000`,\n signal: `upper(replace(format(datum['${datumProperty}'], '$.3~s'), /(\\\\d+)G/, '$1B'))`,\n },\n {\n test,\n signal: `format(datum['${datumProperty}'], '$')`,\n },\n ];\n }\n if (currencyCode && currencyLocale) {\n return [{ test, signal: `formatLocaleCurrency(datum, \"${currencyLocale}\", \"${currencyCode}\", \"${numberFormat}\")` }];\n }\n const d3FormatSpecifier = getD3FormatSpecifierFromNumberFormat(numberFormat);\n return [{ test, signal: `format(datum['${datumProperty}'], '${d3FormatSpecifier}')` }];\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Axis, Mark, Scale, SignalRef } from 'vega';\n\nimport { AxisSpecOptions, Granularity, Orientation, Position } from '../types';\nimport {\n getAxisLabelsEncoding,\n getLabelAnchorValues,\n getLabelAngle,\n getLabelFormat,\n getLabelOffset,\n getTimeLabelFormats,\n} from './axisLabelUtils';\n\n/**\n * Generates a default vega axis from the axis options\n * @param axisOptions\n * @param scaleName\n * @returns axis\n */\nexport const getDefaultAxis = (axisOptions: AxisSpecOptions, scaleName: string): Axis => {\n const {\n grid,\n hideDefaultLabels,\n labelAlign,\n labelFontWeight,\n labelOrientation,\n tickCountLimit,\n position,\n scaleType,\n ticks,\n tickMinStep,\n title,\n vegaLabelAlign,\n vegaLabelBaseline,\n vegaLabelOffset,\n vegaLabelPadding,\n } = axisOptions;\n return {\n scale: scaleName,\n orient: position,\n grid,\n ticks,\n tickCount: getTickCount(position, tickCountLimit, grid),\n tickMinStep: scaleType !== 'linear' ? undefined : tickMinStep, //only supported for linear scales\n title,\n labelAngle: getLabelAngle(labelOrientation),\n labelFontWeight,\n labelOffset: getLabelOffset(labelAlign, scaleName, vegaLabelOffset),\n labelPadding: vegaLabelPadding,\n labels: !hideDefaultLabels,\n ...getLabelAnchorValues(position, labelOrientation, labelAlign, vegaLabelAlign, vegaLabelBaseline),\n encode: {\n labels: {\n update: {\n text: getLabelFormat(axisOptions, scaleName),\n },\n },\n },\n };\n};\n\n/**\n * Generates the time axes for a time scale from the axis options\n * @param scaleName\n * @param axisOptions\n * @returns axes\n */\nexport const getTimeAxes = (scaleName: string, axisOptions: AxisSpecOptions): Axis[] => {\n return [getSecondaryTimeAxis(scaleName, axisOptions), ...getPrimaryTimeAxis(scaleName, axisOptions)];\n};\n\n/**\n * Generates the secondary time axis from the axis options\n * This is the axis that shows the smaller granularity\n * If this is a vertical axis, it will also show the larger granularity and will hide repeats of the larger granularity\n * @param scaleName\n * @param axisOptions\n * @returns axis\n */\nconst getSecondaryTimeAxis = (\n scaleName: string,\n {\n granularity,\n grid,\n labelAlign,\n labelOrientation,\n position,\n ticks,\n title,\n vegaLabelAlign,\n vegaLabelBaseline,\n }: AxisSpecOptions\n): Axis => {\n const { tickCount } = getTimeLabelFormats(granularity);\n\n return {\n scale: scaleName,\n orient: position,\n grid,\n ticks,\n tickCount: scaleName.includes('Time') ? tickCount : undefined,\n title,\n formatType: 'time',\n labelAngle: getLabelAngle(labelOrientation),\n labelSeparation: 12,\n ...getSecondaryTimeAxisLabelFormatting(granularity, position),\n ...getLabelAnchorValues(position, labelOrientation, labelAlign, vegaLabelAlign, vegaLabelBaseline),\n };\n};\n\nconst getSecondaryTimeAxisLabelFormatting = (granularity: Granularity, position: Position): Partial<Axis> => {\n const { secondaryLabelFormat, primaryLabelFormat } = getTimeLabelFormats(granularity);\n const isVerticalAxis = ['left', 'right'].includes(position);\n if (isVerticalAxis) {\n return {\n format: `${primaryLabelFormat}\\u2000${secondaryLabelFormat}`,\n encode: {\n labels: {\n update: {\n text: { signal: 'formatVerticalAxisTimeLabels(datum)' },\n },\n },\n },\n };\n }\n\n return {\n format: secondaryLabelFormat,\n };\n};\n\n/**\n * Generates the primary time axis from the axis options\n * This is the axis that shows the larger granularity and hides duplicate labels\n * Only returns an axis for horizontal axes\n * @param scaleName\n * @param axisOptions\n * @returns axis\n */\nconst getPrimaryTimeAxis = (\n scaleName: string,\n {\n granularity,\n labelAlign,\n labelOrientation,\n labelFontWeight,\n position,\n ticks,\n vegaLabelAlign,\n vegaLabelBaseline,\n }: AxisSpecOptions\n): Axis[] => {\n if (['left', 'right'].includes(position)) {\n return [];\n }\n const { primaryLabelFormat, tickCount } = getTimeLabelFormats(granularity);\n return [\n {\n scale: scaleName,\n orient: position,\n format: primaryLabelFormat,\n tickCount: scaleName.includes('Time') ? tickCount : undefined,\n formatType: 'time',\n labelOverlap: 'greedy',\n labelFontWeight,\n labelAngle: getLabelAngle(labelOrientation),\n ...getLabelAnchorValues(position, labelOrientation, labelAlign, vegaLabelAlign, vegaLabelBaseline),\n encode: {\n labels: {\n enter: {\n dy: { value: (ticks ? 28 : 20) * (position === 'top' ? -1 : 1) }, // account for tick height\n },\n update: {\n text: { signal: 'formatHorizontalTimeAxisLabels(datum)' },\n },\n },\n },\n },\n ];\n};\n\n/**\n * Generates an axis for sub labels from the axis options\n * @param axisOptions\n * @param scaleName\n * @returns axis\n */\nexport const getSubLabelAxis = (axisOptions: AxisSpecOptions, scaleName: string): Axis => {\n const { labelAlign, labelFontWeight, labelOrientation, name, position, ticks } = axisOptions;\n const subLabels = axisOptions.subLabels;\n const signalName = `${name}_subLabels`;\n const subLabelValues = subLabels.map((label) => label.value);\n\n let subLabelAxis = getDefaultAxis(axisOptions, scaleName);\n subLabelAxis = {\n ...subLabelAxis,\n domain: false,\n domainWidth: undefined,\n grid: false,\n labelPadding: ticks ? 32 : 24,\n ticks: false,\n title: undefined,\n values: subLabelValues.length ? subLabelValues : undefined,\n encode: {\n labels: {\n ...getAxisLabelsEncoding(labelAlign, labelFontWeight, 'subLabel', labelOrientation, position, signalName),\n },\n },\n };\n return subLabelAxis;\n};\n\n/**\n * Finds and returns the scale that this axis is for\n * If the scale does not exist, it will create a new one\n * @param scales\n * @param position\n * @returns scale\n */\nexport const getScale = (scales: Scale[], position: Position) => {\n const applicableScales = scales.filter((s) => 'range' in s && s.range === getRange(position));\n let scale: Scale | undefined;\n\n if (applicableScales.length > 1) {\n // Is there a better way to find the trellis scale?\n scale = scales.find((s) => s.name.includes('Trellis')) ?? applicableScales[0];\n } else {\n scale = applicableScales[0];\n }\n\n if (scale) {\n return scale;\n }\n\n scale = {\n name: getDefaultScaleNameFromPosition(position),\n type: 'linear',\n range: getRange(position),\n };\n scales.push(scale);\n return scale;\n};\n\n/**\n * Gets the scale range from the position\n * @param position\n * @returns range\n */\nexport const getRange = (position: Position): 'width' | 'height' => {\n if (position === 'left' || position === 'right') {\n return 'height';\n }\n return 'width';\n};\n\n/**\n * Gets the scale type of the opposing scale.\n * For example, if this is an x-axis, it will return the y-scale type\n * @param scales\n * @param position\n * @returns scaleType\n */\nexport const getOpposingScaleType = (scales: Scale[], position: Position) => {\n let scale = scales.find((s) => 'range' in s && s.range === getOpposingRange(position));\n if (scale) {\n return scale.type;\n }\n scale = {\n name: getDefaultOpposingScaleNameFromPosition(position),\n type: 'linear',\n range: getOpposingRange(position),\n };\n scales.push(scale);\n return scale.type;\n};\n\n/**\n * Gets the scale range for the opposing scale\n * @param position\n * @returns\n */\nexport const getOpposingRange = (position: Position): 'width' | 'height' => {\n if (position === 'left' || position === 'right') {\n return 'width';\n }\n return 'height';\n};\n\n/**\n * Returns whether the axis is vertical.\n * @param position\n * @returns boolean\n */\nexport const isVerticalAxis = (position: Position): boolean => {\n return ['left', 'right'].includes(position);\n};\n\n/**\n * Gets the default scale name based on the position\n * @param position\n * @returns scaleName\n */\nconst getDefaultScaleNameFromPosition = (position: Position) => {\n return isVerticalAxis(position) ? 'yLinear' : 'xLinear';\n};\n\n/**\n * Gets the default opposing scale name based on the position\n * @param position\n * @returns scaleName\n */\nconst getDefaultOpposingScaleNameFromPosition = (position: Position) => {\n return isVerticalAxis(position) ? 'xLinear' : 'yLinear';\n};\n\n/**\n * Determines tick count based on axis type and available space.\n * Uses Vega's tickCount parameter which is treated as a suggestion rather than a strict limit.\n * The final number of ticks may vary as Vega optimizes for visually pleasing values and intervals.\n *\n * @param position The position of the axis\n * @param tickCountLimit The upper limit for the number of ticks\n * @param grid Whether grid lines are enabled\n * @returns tickCount production rule for Vega\n */\nexport const getTickCount = (position: Position, tickCountLimit?: number, grid?: boolean): SignalRef | undefined => {\n const range = ['top', 'bottom'].includes(position) ? 'width' : 'height';\n\n // 0 is a valid tickCountLimit value.\n if (tickCountLimit !== undefined) {\n // divide the range by 100 to get the ideal number of ticks (grid lines)\n return {\n signal: `clamp(ceil(${range}/100), 2, ${tickCountLimit})`,\n };\n } else if (grid) {\n // divide the range by 100 to get the ideal number of ticks (grid lines)\n return {\n signal: `clamp(ceil(${range}/100), 2, 10)`,\n };\n }\n return undefined;\n};\n\n/**\n * Gets the baseline rule mark\n * @param baselineOffset\n * @param position\n * @returns baselineMark\n */\nexport const getBaselineRule = (baselineOffset: number, position: Position): Mark => {\n const orientation = isVerticalAxis(position) ? 'y' : 'x';\n\n const positionOptions = {\n x: {\n x: { value: 0 },\n x2: { signal: 'width' },\n y: { scale: 'yLinear', value: baselineOffset },\n },\n y: {\n x: { scale: 'xLinear', value: baselineOffset },\n y: { value: 0 },\n y2: { signal: 'height' },\n },\n };\n\n return {\n name: `${orientation}Baseline`,\n description: `${orientation}Baseline`,\n type: 'rule',\n interactive: false,\n encode: {\n update: {\n ...positionOptions[orientation],\n },\n },\n };\n};\n\nexport const hasSubLabels = ({ subLabels, labelOrientation }: AxisSpecOptions) => {\n // subLabels are only supported for horizontal axis labels\n return Boolean(subLabels.length && labelOrientation === 'horizontal');\n};\n\n/**\n * Determines if an axis is a metric axis based on its position and chart orientation\n * @param position The position of the axis\n * @param chartOrientation The orientation of the chart\n * @returns Whether the axis is a metric axis\n */\nexport function getIsMetricAxis(position: Position, chartOrientation: Orientation): boolean {\n if (chartOrientation === 'vertical') {\n return isVerticalAxis(position);\n }\n return !isVerticalAxis(position);\n}\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {\n Align,\n Baseline,\n EncodeEntry,\n FontWeight,\n GuideEncodeEntry,\n NumberValue,\n ProductionRule,\n TextEncodeEntry,\n TextValueRef,\n TickCount,\n} from 'vega';\n\nimport { getTextNumberFormat } from '../textUtils';\nimport { AxisSpecOptions, Granularity, Label, LabelAlign, Orientation, Position } from '../types';\nimport { isVerticalAxis } from './axisUtils';\n\n/**\n * Gets the display value of the label. If it's an object, it will return the value property, otherwise it will return the label.\n * @param label\n * @returns string | number\n */\nexport const getLabelValue = (label: Label | number | string): string | number => {\n if (typeof label === 'object') {\n return label.value;\n }\n return label;\n};\n\n/**\n * Gets the label format values based on the granularity\n * @param granularity\n * @returns [secondaryFormat, primaryFormat, tickCount]\n */\nexport const getTimeLabelFormats = (\n granularity: Granularity\n): { secondaryLabelFormat: string; primaryLabelFormat: string; tickCount: TickCount } => {\n switch (granularity) {\n case 'second':\n return { secondaryLabelFormat: ':%S', primaryLabelFormat: '%-I:%M %p', tickCount: 'second' };\n case 'minute':\n return { secondaryLabelFormat: '%-I:%M %p', primaryLabelFormat: '%b %-d', tickCount: 'minute' };\n case 'hour':\n return { secondaryLabelFormat: '%-I %p', primaryLabelFormat: '%b %-d', tickCount: 'hour' };\n case 'day':\n return { secondaryLabelFormat: '%-d', primaryLabelFormat: '%b', tickCount: 'day' };\n case 'week':\n return { secondaryLabelFormat: '%-d', primaryLabelFormat: '%b', tickCount: 'week' };\n case 'month':\n return { secondaryLabelFormat: '%b', primaryLabelFormat: '%Y', tickCount: 'month' };\n case 'quarter':\n return { secondaryLabelFormat: 'Q%q', primaryLabelFormat: '%Y', tickCount: { interval: 'month', step: 3 } };\n case 'year':\n return { secondaryLabelFormat: '%Y', primaryLabelFormat: '', tickCount: 'year' };\n default:\n return { secondaryLabelFormat: '%-d', primaryLabelFormat: '%b', tickCount: 'day' };\n }\n};\n\n/**\n * label align can be set in a controlled manner using the `labels` and `subLabels` options\n * This function will return the correct align and baseline encodings based on the labelAlign and position\n * @param position\n * @param labelOrientaion\n * @param labelAlign\n * @returns align and baseline\n */\nexport const getControlledLabelAnchorValues = (\n position: Position,\n labelOrientaion: Orientation,\n labelAlign?: LabelAlign\n): { align: Align | undefined; baseline: Baseline | undefined } => {\n // if there isn't a labelAlign, we don't want to set the align or baseline\n if (!labelAlign) return { align: undefined, baseline: undefined };\n return getLabelAnchor(position, labelOrientaion, labelAlign);\n};\n\n/**\n * gets the values for labelAlign and labelBaseline based on the `labelAlign`, `labelOrientation`, and `position` options\n * vegaLabelAlign and vegaLabelBaseline options can be used to override these values\n * @param position\n * @param labelOrientaion\n * @param labelAlign\n * @param vegaLabelAlign\n * @param vegaLabelBaseline\n * @returns labelAlign and labelBaseline\n */\nexport const getLabelAnchorValues = (\n position: Position,\n labelOrientaion: Orientation,\n labelAlign: LabelAlign,\n vegaLabelAlign?: Align,\n vegaLabelBaseline?: Baseline\n): { labelAlign: Align; labelBaseline: Baseline } => {\n const { align, baseline } = getLabelAnchor(position, labelOrientaion, labelAlign);\n // if vegaLabelAlign or vegaLabelBaseline are set, we want to use those values instead of the calculated values\n return {\n labelAlign: vegaLabelAlign ?? align,\n labelBaseline: vegaLabelBaseline ?? baseline,\n };\n};\n\n/**\n * gets the label align and baseline values based on the `labelAlign`, `labelOrientation`, and `position` options\n * @param position\n * @param labelOrientaion\n * @param labelAlign\n * @returns align and baseline\n */\nexport const getLabelAnchor = (\n position: Position,\n labelOrientaion: Orientation,\n labelAlign: LabelAlign\n): { align: Align; baseline: Baseline } => {\n let align: Align;\n let baseline: Baseline;\n if (labelIsParallelToAxis(position, labelOrientaion)) {\n // label direction is parallel to the axis\n // for these, the align depends on the labelAlign and the baseline depends on the position\n const labelAlignToAlign: { [key in LabelAlign]: Align } = {\n start: 'left',\n center: 'center',\n end: 'right',\n };\n align = labelAlignToAlign[labelAlign];\n if (['top', 'left'].includes(position)) {\n // baseline is bottom for top and left axes\n baseline = 'bottom';\n } else {\n // baseline is top for bottom and right axes\n baseline = 'top';\n }\n } else {\n // label direction is perpendicular to the axis\n // for these, baseline depends on the labelAlign and align depends on the position\n const labelAlignToBaseline: { [key in LabelAlign]: Baseline } = {\n start: 'top',\n center: 'middle',\n end: 'bottom',\n };\n baseline = labelAlignToBaseline[labelAlign];\n if (['bottom', 'left'].includes(position)) {\n // bottom and left will always have the anchor on the right side of the text\n align = 'right';\n } else {\n // top and right will always have the anchor on the left side of the text\n align = 'left';\n }\n }\n return { align, baseline };\n};\n\n/**\n * determines if the label orientation is parallel to the axis direction\n * @param position\n * @param labelOrientaion\n * @returns boolean\n */\nexport const labelIsParallelToAxis = (position: Position, labelOrientaion: Orientation): boolean => {\n const axisOrientation = ['top', 'bottom'].includes(position) ? 'horizontal' : 'vertical';\n return axisOrientation === labelOrientaion;\n};\n\n/**\n * gets the label angle based on the `labelOrientation` prop\n * @param labelOrientaion\n * @returns labelAngle: number\n */\nexport const getLabelAngle = (labelOrientaion: Orientation): number => {\n if (labelOrientaion === 'horizontal') {\n return 0;\n }\n // default vertical label should read from bottom to top\n return 270;\n};\n\n/**\n * gets the vega baseline value based on the labelAlign value\n * @param labelAlign\n * @returns\n */\nexport const getLabelBaseline = (\n labelAlign: LabelAlign | undefined,\n position: Position,\n vegaLabelBaseline?: Baseline\n): Baseline | undefined => {\n if (vegaLabelBaseline) return vegaLabelBaseline;\n if (!labelAlign) return;\n if (isVerticalAxis(position)) {\n switch (labelAlign) {\n case 'start':\n return 'top';\n case 'end':\n return 'bottom';\n case 'center':\n default:\n return 'middle';\n }\n }\n};\n\n/**\n * calculates the label offset for a band scale based on the labelAlign\n * @param labelAlign\n * @param scaleName\n * @returns\n */\nexport const getLabelOffset = (\n labelAlign: LabelAlign,\n scaleName: string,\n vegaLabelOffset?: NumberValue\n): NumberValue | undefined => {\n if (vegaLabelOffset !== undefined) return vegaLabelOffset;\n switch (labelAlign) {\n case 'start':\n return { signal: `bandwidth('${scaleName}') / -2` };\n case 'end':\n return { signal: `bandwidth('${scaleName}') / 2` };\n default:\n return undefined;\n }\n};\n\n/**\n * gets the vega label format based on the labelFormat\n * @param type\n * @returns\n */\nexport const getLabelFormat = (\n {\n labelFormat,\n labelOrientation,\n numberFormat,\n position,\n truncateLabels,\n currencyLocale,\n currencyCode,\n }: AxisSpecOptions,\n scaleName: string\n): ProductionRule<TextValueRef> => {\n if (labelFormat === 'percentage') {\n return [{ test: 'isNumber(datum.value)', signal: \"format(datum.value, '~%')\" }, { signal: 'datum.value' }];\n }\n if (labelFormat === 'duration') {\n return { signal: 'formatTimeDurationLabels(datum)' };\n }\n\n return [\n ...getTextNumberFormat(numberFormat, undefined, currencyLocale, currencyCode),\n ...(truncateLabels && scaleName.includes('Band') && labelIsParallelToAxis(position, labelOrientation)\n ? [{ signal: 'truncateText(datum.value, bandwidth(\"xBand\")/(1- paddingInner), \"normal\", 14)' }]\n : [{ signal: 'datum.value' }]),\n ];\n};\n\n/**\n * Gets the axis label encoding\n * @param labelAlign\n * @param labelFontWeight\n * @param labelKey\n * @param position\n * @param signalName\n * @returns updateEncoding\n */\nexport const getAxisLabelsEncoding = (\n labelAlign: LabelAlign,\n labelFontWeight: FontWeight,\n labelKey: 'label' | 'subLabel',\n labelOrientation: Orientation,\n position: Position,\n signalName: string\n): GuideEncodeEntry<TextEncodeEntry> => ({\n update: {\n text: [\n {\n test: `indexof(pluck(${signalName}, 'value'), datum.value) !== -1`,\n signal: `${signalName}[indexof(pluck(${signalName}, 'value'), datum.value)].${labelKey}`,\n },\n { signal: 'datum.value' },\n ],\n fontWeight: [\n {\n test: `indexof(pluck(${signalName}, 'value'), datum.value) !== -1 && ${signalName}[indexof(pluck(${signalName}, 'value'), datum.value)].fontWeight`,\n signal: `${signalName}[indexof(pluck(${signalName}, 'value'), datum.value)].fontWeight`,\n },\n // default to the primary label font weight\n { value: labelFontWeight },\n ],\n ...getEncodedLabelAnchor(position, signalName, labelOrientation, labelAlign),\n },\n});\n\n/**\n * Will return the label align or baseline based on the position\n * These properties are used within the axis label encoding\n * If this is a vertical axis, it will return the correct baseline property and value\n * Otherwise, it will return the correct align property and value\n * @param position\n * @param signalName\n * @param defaultLabelAlign\n * @returns align | baseline\n */\nexport const getEncodedLabelAnchor = (\n position: Position,\n signalName: string,\n labelOrientation: Orientation,\n defaultLabelAlign: LabelAlign\n): EncodeEntry => {\n const baseTestString = `indexof(pluck(${signalName}, 'value'), datum.value) !== -1 && ${signalName}[indexof(pluck(${signalName}, 'value'), datum.value)]`;\n const baseSignalString = `${signalName}[indexof(pluck(${signalName}, 'value'), datum.value)]`;\n const { align, baseline } = getLabelAnchor(position, labelOrientation, defaultLabelAlign);\n\n return {\n align: [{ test: `${baseTestString}.align`, signal: `${baseSignalString}.align` }, { value: align }],\n baseline: [{ test: `${baseTestString}.baseline`, signal: `${baseSignalString}.baseline` }, { value: baseline }],\n };\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {\n EncodeEntry,\n GuideEncodeEntry,\n Mark,\n NumericValueRef,\n ProductionRule,\n RuleMark,\n ScaleType,\n SignalRef,\n SymbolMark,\n TextEncodeEntry,\n TextMark,\n} from 'vega';\n\nimport { DEFAULT_FONT_COLOR, DEFAULT_LABEL_FONT_WEIGHT } from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { getPathFromIcon, getStrokeDashFromLineType } from '../specUtils';\nimport { AxisSpecOptions, Position, ReferenceLineOptions, ReferenceLineSpecOptions } from '../types';\nimport { isVerticalAxis } from './axisUtils';\n\nexport const getReferenceLines = (axisOptions: AxisSpecOptions): ReferenceLineSpecOptions[] => {\n return axisOptions.referenceLines.map((referenceLine, index) =>\n applyReferenceLineOptionDefaults(referenceLine, axisOptions, index)\n );\n};\n\nconst applyReferenceLineOptionDefaults = (\n options: ReferenceLineOptions,\n axisOptions: AxisSpecOptions,\n index: number\n): ReferenceLineSpecOptions => ({\n ...options,\n color: options.color || 'gray-800',\n colorScheme: axisOptions.colorScheme,\n iconColor: options.iconColor || DEFAULT_FONT_COLOR,\n labelColor: options.labelColor || DEFAULT_FONT_COLOR,\n labelFontWeight: options.labelFontWeight ?? DEFAULT_LABEL_FONT_WEIGHT,\n layer: options.layer ?? 'front',\n name: `${axisOptions.name}ReferenceLine${index}`,\n lineType: options.lineType ?? 'solid',\n});\n\nexport const scaleTypeSupportsReferenceLines = (scaleType: ScaleType | undefined): boolean => {\n const supportedScaleTypes: ScaleType[] = ['band', 'linear', 'point', 'time', 'utc'];\n return Boolean(scaleType && supportedScaleTypes.includes(scaleType));\n};\n\nexport const getReferenceLineMarks = (\n axisOptions: AxisSpecOptions,\n scaleName: string\n): { back: Mark[]; front: Mark[] } => {\n const referenceLineMarks: { back: Mark[]; front: Mark[] } = { back: [], front: [] };\n const referenceLines = getReferenceLines(axisOptions);\n\n for (const referenceLine of referenceLines) {\n const { layer } = referenceLine;\n const positionEncoding = getPositionEncoding(axisOptions, referenceLine, scaleName);\n referenceLineMarks[layer].push(\n ...[\n getReferenceLineRuleMark(axisOptions, referenceLine, positionEncoding),\n ...getReferenceLineSymbolMark(axisOptions, referenceLine, positionEncoding),\n ...getReferenceLineTextMark(axisOptions, referenceLine, positionEncoding),\n ]\n );\n }\n return referenceLineMarks;\n};\n\nexport const getPositionEncoding = (\n { scaleType }: AxisSpecOptions,\n { value, position }: ReferenceLineSpecOptions,\n scaleName: string\n): ProductionRule<NumericValueRef> | SignalRef => {\n const signalValue = typeof value === 'string' ? `'${value}'` : value;\n const halfInnerPaddingFormula = `paddingInner * bandwidth('${scaleName}') / (2 * (1 - paddingInner))`;\n const beforePositionSignal = `scale('${scaleName}', ${signalValue}) - ${halfInnerPaddingFormula}`;\n const centeredPositionSignal = `scale('${scaleName}', ${signalValue}) + bandwidth('${scaleName}') / 2`;\n const afterPositionSignal = `scale('${scaleName}', ${signalValue}) + bandwidth('${scaleName}') + ${halfInnerPaddingFormula}`;\n if (scaleType === 'band') {\n if (position === 'before') return { signal: beforePositionSignal };\n if (position === 'after') return { signal: afterPositionSignal };\n return { signal: centeredPositionSignal };\n }\n return { scale: scaleName, value };\n};\n\nexport const getReferenceLineRuleMark = (\n { position, ticks }: AxisSpecOptions,\n { color, colorScheme, name, lineType }: ReferenceLineSpecOptions,\n positionEncoding: ProductionRule<NumericValueRef> | SignalRef\n): RuleMark => {\n const startOffset = ticks ? 9 : 0;\n\n const positionOptions: { [key in Position]: Partial<EncodeEntry> } = {\n top: {\n x: positionEncoding,\n y: { value: -startOffset },\n y2: { signal: 'height' },\n },\n bottom: {\n x: positionEncoding,\n y: { value: 0 },\n y2: { signal: `height + ${startOffset}` },\n },\n left: {\n x: { value: -startOffset },\n x2: { signal: 'width' },\n y: positionEncoding,\n },\n right: {\n x: { value: 0 },\n x2: { signal: `width + ${startOffset}` },\n y: positionEncoding,\n },\n };\n\n return {\n name,\n type: 'rule',\n interactive: false,\n encode: {\n enter: {\n stroke: { value: getColorValue(color, colorScheme) },\n strokeDash: { value: getStrokeDashFromLineType(lineType ?? 'solid') },\n },\n update: {\n ...positionOptions[position],\n },\n },\n };\n};\n\n/**\n * Gets position values for additional marks for the reference line.\n * @param offset\n * @param positionEncoding\n * @param horizontalOffset\n * @returns SymbolMark\n */\nconst getAdditiveMarkPositionOptions = (\n offset: number,\n positionEncoding: ProductionRule<NumericValueRef> | SignalRef,\n horizontalOffset?: number\n) => ({\n top: {\n x: positionEncoding,\n y: { value: -offset },\n },\n bottom: {\n x: positionEncoding,\n y: { signal: `height + ${offset}` },\n },\n left: {\n x: { value: -offset },\n y: { ...positionEncoding, offset: horizontalOffset },\n },\n right: {\n x: { signal: `width + ${offset}` },\n y: { ...positionEncoding, offset: horizontalOffset },\n },\n});\n\n/**\n * Gets the reference line symbol mark\n * @param AxisSpecOptions\n * @param ReferenceLineSpecOptions\n * @param referenceLineIndex\n * @param positionEncoding\n * @returns SymbolMark\n */\nexport const getReferenceLineSymbolMark = (\n { colorScheme, position }: AxisSpecOptions,\n { icon, iconColor, name }: ReferenceLineSpecOptions,\n positionEncoding: ProductionRule<NumericValueRef> | SignalRef\n): SymbolMark[] => {\n if (!icon) return [];\n\n // offset the icon from the edge of the chart area\n const OFFSET = 24;\n const positionOptions = getAdditiveMarkPositionOptions(OFFSET, positionEncoding);\n\n return [\n {\n name: `${name}_symbol`,\n type: 'symbol',\n encode: {\n enter: {\n shape: {\n value: getPathFromIcon(icon),\n },\n size: { value: 324 },\n fill: { value: getColorValue(iconColor, colorScheme) },\n },\n update: {\n ...positionOptions[position],\n },\n },\n },\n ];\n};\n\n/**\n * Gets the reference line text mark\n * @param AxisSpecOptions\n * @param ReferenceLineSpecOptions\n * @param referenceLineIndex\n * @param positionEncoding\n * @returns TextMark\n */\nexport const getReferenceLineTextMark = (\n axisOptions: AxisSpecOptions,\n referenceLineOptions: ReferenceLineSpecOptions,\n positionEncoding: ProductionRule<NumericValueRef> | SignalRef\n): TextMark[] => {\n const { label, name } = referenceLineOptions;\n if (!label) return [];\n\n return [\n {\n name: `${name}_label`,\n type: 'text',\n encode: {\n ...getReferenceLineLabelsEncoding(axisOptions, { ...referenceLineOptions, label }, positionEncoding),\n },\n },\n ];\n};\n\n/**\n * Calculates the vertical and horizontal offsets for reference line labels based on axis position and icon presence\n * @param position The axis position\n * @param icon Whether an icon is present\n * @returns Object containing verticalOffset and horizontalOffset values\n */\nconst calculateReferenceLineOffsets = (\n position: Position,\n icon?: string\n): { verticalOffset: number; horizontalOffset: number } => {\n const isVertical = isVerticalAxis(position);\n let verticalOffset = isVertical ? 40 : 28;\n let horizontalOffset = isVertical ? 4 : 5;\n\n if (icon) {\n if (isVertical) {\n verticalOffset += 25;\n } else {\n verticalOffset += 20;\n }\n if (!isVertical) {\n horizontalOffset += 25;\n verticalOffset += 2;\n }\n }\n\n return { verticalOffset, horizontalOffset };\n};\n\n/**\n * Gets the reference line label encoding\n * @param labelFontWeight\n * @param label\n * @param position\n * @param positionEncoding\n * @param icon\n * @returns updateEncoding\n */\nexport const getReferenceLineLabelsEncoding = (\n { position }: AxisSpecOptions,\n { colorScheme, icon, label, labelColor, labelFontWeight }: ReferenceLineSpecOptions & { label: string },\n positionEncoding: ProductionRule<NumericValueRef> | SignalRef\n): GuideEncodeEntry<TextEncodeEntry> => {\n const { verticalOffset, horizontalOffset } = calculateReferenceLineOffsets(position, icon);\n const positionOptions = getAdditiveMarkPositionOptions(verticalOffset, positionEncoding, horizontalOffset);\n\n return {\n update: {\n text: [\n {\n value: label,\n },\n ],\n fontWeight: [\n // default to the primary label font weight\n { value: labelFontWeight },\n ],\n fill: { value: getColorValue(labelColor, colorScheme) },\n ...getEncodedLabelBaselineAlign(position),\n ...positionOptions[position],\n },\n };\n};\n\n/**\n * Will return the label align or baseline based on the position\n * These properties are used within the reference line label encoding\n * If this is a vertical axis, it will return the correct baseline property and value\n * Otherwise, it will return the correct align property and value\n * @param position\n * @returns align | baseline\n */\nexport const getEncodedLabelBaselineAlign = (position: Position): EncodeEntry => {\n switch (position) {\n case 'top':\n case 'bottom':\n return {\n align: { value: 'center' },\n };\n case 'left':\n case 'right':\n return {\n baseline: { value: 'center' },\n };\n }\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Axis, GroupMark, Spec } from 'vega';\n\nimport { AxisSpecOptions } from '../types';\n\n/**\n * Checks the spec to see if it is a trellised chart\n * @param spec\n * @returns\n */\nexport const isTrellisedChart = (spec: Spec): boolean => {\n return /[xy]TrellisGroup/g.test(JSON.stringify(spec));\n};\n\n/**\n * Gets all the custom options for a trellis axis\n * If this axis is not a trellis axis, it will return an empty object\n * @param scaleName\n * @returns trellisAxisOptions\n */\nexport const getTrellisAxisOptions = (scaleName: string): Partial<AxisSpecOptions> => {\n let trellisAxisOptions: Partial<AxisSpecOptions> = {};\n\n // if 'TrellisBand' is in the scale name then this is a trellis axis\n if (scaleName.includes('TrellisBand')) {\n // shift the labels up/left half the scale bandwidth\n const labelOffsetSignal = `bandwidth('${scaleName}') / -2`;\n const axisType = scaleName.startsWith('x') ? 'x' : 'y';\n trellisAxisOptions = {\n position: axisType === 'x' ? 'top' : 'left',\n labelFontWeight: 'bold',\n labelAlign: undefined, // set this to undefined because we will manually control alignment\n title: undefined,\n vegaLabelAlign: 'left',\n vegaLabelBaseline: 'bottom',\n vegaLabelOffset: axisType === 'x' ? { signal: labelOffsetSignal } : { signal: `${labelOffsetSignal} - 8` }, // y axis needs an extra 8px as vertical padding\n vegaLabelPadding: axisType === 'x' ? 8 : 0, // add vertical padding\n };\n }\n return trellisAxisOptions;\n};\n\n/**\n * Adds title encodings so that only the first title is visible.\n * Does not mutate axes but instead returns a copy with the correct encodings added.\n * @param axes\n * @param trellisGroupMark\n * @returns axes\n */\nexport const encodeAxisTitle = (axes: Axis[], trellisGroupMark: GroupMark) => {\n const { facetName, facetGroupBy, trellisScaleName } = getTrellisGroupProperties(trellisGroupMark);\n\n return axes.map((axis) => {\n if (axis.title) {\n return {\n ...axis,\n encode: {\n ...axis.encode,\n title: {\n update: {\n opacity: [\n {\n test: `info(domain('${trellisScaleName}')[0] === data('${facetName}')[0].${facetGroupBy})`,\n value: 1,\n },\n { value: 0 },\n ],\n },\n },\n },\n };\n }\n return axis;\n });\n};\n\n/**\n * Gets properties of the trellis group mark\n * @param groupMark\n * @returns properties\n */\nexport const getTrellisGroupProperties = (\n groupMark: GroupMark\n): { facetGroupBy: string; facetName: string; trellisScaleName: string } => {\n const trellisScaleName = `${(groupMark.name ?? 'x')[0]}TrellisBand`;\n const fromFacet = groupMark.from as { facet: { name: string; groupby: string } };\n\n return { facetGroupBy: fromFacet.facet.groupby, facetName: fromFacet.facet.name, trellisScaleName };\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport deepmerge from 'deepmerge';\nimport { produce } from 'immer';\nimport { Axis, Data, GroupMark, Mark, ScaleType, Signal } from 'vega';\n\nimport {\n COLOR_SCALE,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_FONT_COLOR,\n DEFAULT_GRANULARITY,\n DEFAULT_LABEL_ALIGN,\n DEFAULT_LABEL_FONT_WEIGHT,\n DEFAULT_LABEL_ORIENTATION,\n FIRST_RSC_SERIES_ID,\n HIGHLIGHT_CONTRAST_RATIO,\n LAST_RSC_SERIES_ID,\n MOUSE_OVER_SERIES,\n} from '@spectrum-charts/constants';\nimport { spectrumColors } from '@spectrum-charts/themes';\n\nimport {\n addAxisAnnotationAxis,\n addAxisAnnotationData,\n addAxisAnnotationMarks,\n addAxisAnnotationSignals,\n getAxisAnnotationsFromChildren,\n} from '../axisAnnotation/axisAnnotationUtils';\nimport { getDualAxisScaleNames } from '../scale/scaleUtils';\nimport { getGenericValueSignal } from '../signal/signalSpecBuilder';\nimport { AxisOptions, AxisSpecOptions, ColorScheme, Label, Orientation, Position, ScSpec, UserMeta } from '../types';\nimport { getAxisLabelsEncoding, getControlledLabelAnchorValues, getLabelValue } from './axisLabelUtils';\nimport { getReferenceLineMarks, getReferenceLines, scaleTypeSupportsReferenceLines } from './axisReferenceLineUtils';\nimport { encodeAxisTitle, getTrellisAxisOptions, isTrellisedChart } from './axisTrellisUtils';\nimport {\n getBaselineRule,\n getDefaultAxis,\n getIsMetricAxis,\n getOpposingScaleType,\n getScale,\n getSubLabelAxis,\n getTimeAxes,\n hasSubLabels,\n} from './axisUtils';\n\nexport const addAxis = produce<ScSpec, [AxisOptions & { colorScheme?: ColorScheme; index?: number }]>(\n (\n spec,\n {\n name,\n axisAnnotations = [],\n baseline = false,\n baselineOffset = 0,\n colorScheme = DEFAULT_COLOR_SCHEME,\n granularity = DEFAULT_GRANULARITY,\n grid = false,\n hideDefaultLabels = false,\n index = 0,\n labelAlign = DEFAULT_LABEL_ALIGN,\n labelFontWeight = DEFAULT_LABEL_FONT_WEIGHT,\n labelOrientation = DEFAULT_LABEL_ORIENTATION,\n labels = [],\n numberFormat = 'shortNumber',\n position,\n range,\n referenceLines = [],\n subLabels = [],\n ticks = false,\n ...options\n }\n ) => {\n // get the scale that this axis will be associated with\n const scale = getScale(spec.scales ?? [], position);\n const scaleName = name || scale.name;\n const scaleType = scale.type;\n\n // get the opposing scale\n const opposingScaleType = getOpposingScaleType(spec.scales ?? [], position);\n\n // reconstruct options with defaults\n const axisOptions: AxisSpecOptions = {\n axisAnnotations,\n baseline,\n baselineOffset,\n colorScheme,\n granularity,\n grid,\n hideDefaultLabels,\n index,\n labelAlign,\n labelFontWeight,\n labelOrientation,\n labels,\n name: `axis${index}`,\n numberFormat,\n position,\n range,\n referenceLines,\n subLabels,\n ticks,\n scaleType: scaleType ?? 'linear',\n ...options,\n };\n\n const dualMetricAxis = spec.signals?.some((signal) => signal.name === 'firstRscSeriesId');\n\n spec.data = addAxisData(spec.data ?? [], { ...axisOptions, scaleType: scaleType ?? 'linear' });\n spec.signals = addAxisSignals(spec.signals ?? [], axisOptions);\n\n // set custom range if applicable\n if (range && (scaleType === 'linear' || scaleType === 'time')) {\n scale.domain = range;\n }\n\n const usermeta = spec.usermeta;\n spec.axes = addAxes(spec.axes ?? [], {\n ...axisOptions,\n scaleName,\n opposingScaleType,\n usermeta,\n\n // we don't want to show the grid on top level\n // axes for trellised charts\n grid: axisOptions.grid && !isTrellisedChart(spec),\n dualMetricAxis,\n });\n\n spec.marks = addAxesMarks(spec.marks ?? [], {\n ...axisOptions,\n usermeta,\n scaleName,\n opposingScaleType,\n dualMetricAxis,\n });\n\n return spec;\n }\n);\n\nexport const addAxisData = produce<Data[], [AxisSpecOptions & { scaleType: ScaleType }]>((data, options) => {\n const axisAnnotations = getAxisAnnotationsFromChildren(options);\n axisAnnotations.forEach((annotationOptions) => {\n addAxisAnnotationData(data, annotationOptions);\n });\n});\n\nexport const addAxisSignals = produce<Signal[], [AxisSpecOptions]>((signals, options) => {\n const { name, labels, position, subLabels, labelOrientation } = options;\n if (labels?.length) {\n // add all the label properties to a signal so that the axis encoding can use it to style each label correctly\n signals.push(getGenericValueSignal(`${name}_labels`, getLabelSignalValue(labels, position, labelOrientation)));\n }\n if (hasSubLabels(options)) {\n // add all the sublabel properties to a signal so that the axis encoding can use it to style each sublabel correctly\n signals.push(\n getGenericValueSignal(\n `${name}_subLabels`,\n subLabels.map((label) => ({\n ...label,\n // convert label align to vega align\n ...getControlledLabelAnchorValues(position, labelOrientation, label.align),\n }))\n )\n );\n }\n const axisAnnotations = getAxisAnnotationsFromChildren(options);\n axisAnnotations.forEach((annotationOptions) => {\n addAxisAnnotationSignals(signals, annotationOptions);\n });\n});\n\n/**\n * Gets the labels that have style properties on them and gets the correct alignment value based on axis position\n * @param labels\n * @param position\n * @returns\n */\nexport const getLabelSignalValue = (\n labels: (Label | string | number)[],\n position: Position,\n labelOrientation: Orientation\n) =>\n labels\n .map((label) => {\n // if this label is a string or number, then it doesn't need to be a signal\n if (typeof label !== 'object') {\n return;\n }\n return {\n ...label,\n ...getControlledLabelAnchorValues(position, labelOrientation, label.align),\n };\n })\n .filter(Boolean);\n\n/**\n * Applies fill and opacity encoding rules to the secondary metric axis\n * @param axis Axis to apply encoding rules to\n */\nexport function applySecondaryMetricAxisEncodings(axis: Axis): void {\n const secondaryAxisFillRules = [{ signal: `scale('${COLOR_SCALE}', ${LAST_RSC_SERIES_ID})` }];\n\n const secondaryAxisFillOpacityRules = [\n {\n test: `isValid(${MOUSE_OVER_SERIES}) && ${MOUSE_OVER_SERIES} !== ${LAST_RSC_SERIES_ID}`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n },\n ];\n\n const encodings = {\n labels: {\n enter: {\n fill: secondaryAxisFillRules,\n },\n update: {\n fillOpacity: secondaryAxisFillOpacityRules,\n },\n },\n title: {\n enter: {\n fill: secondaryAxisFillRules,\n },\n update: {\n fillOpacity: secondaryAxisFillOpacityRules,\n },\n },\n };\n\n if (!axis.encode) {\n axis.encode = encodings;\n } else {\n axis.encode = deepmerge(axis.encode, encodings);\n }\n}\n\n/**\n * Applies fill and opacity encoding rules to the primary metric axis\n * @param axis Axis to apply encoding rules to\n * @param colorScheme The color scheme (light or dark)\n */\nexport function applyPrimaryMetricAxisEncodings(axis: Axis, colorScheme: ColorScheme = DEFAULT_COLOR_SCHEME): void {\n // Get the appropriate font color value based on the colorScheme (light/dark theme)\n const defaultFontColor = spectrumColors[colorScheme][DEFAULT_FONT_COLOR];\n\n const primaryAxisFillRules = [\n {\n test: `length(domain('${COLOR_SCALE}')) -1 === 1`,\n signal: `scale('${COLOR_SCALE}', ${FIRST_RSC_SERIES_ID})`,\n },\n { value: defaultFontColor },\n ];\n const primaryAxisFillOpacityRules = [\n {\n test: `${MOUSE_OVER_SERIES} === ${LAST_RSC_SERIES_ID}`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n },\n ];\n\n const encodings = {\n labels: {\n update: {\n fill: primaryAxisFillRules,\n fillOpacity: primaryAxisFillOpacityRules,\n },\n },\n title: {\n update: {\n fill: primaryAxisFillRules,\n fillOpacity: primaryAxisFillOpacityRules,\n },\n },\n };\n\n if (!axis.encode) {\n axis.encode = encodings;\n } else {\n axis.encode = deepmerge(axis.encode, encodings);\n }\n}\n\n/**\n * Handles the dual Y axis logic for axis styling\n * @param axis The axis to process\n * @param usermeta The user metadata\n * @param scaleName The name of the scale\n */\nexport function addDualMetricAxisConfig(\n axis: Axis,\n isPrimaryMetricAxis: boolean,\n scaleName: string,\n colorScheme: ColorScheme = DEFAULT_COLOR_SCHEME\n) {\n const scaleNames = getDualAxisScaleNames(scaleName);\n const { primaryScale, secondaryScale } = scaleNames;\n\n if (isPrimaryMetricAxis) {\n axis.scale = primaryScale;\n applyPrimaryMetricAxisEncodings(axis, colorScheme);\n } else {\n axis.scale = secondaryScale;\n applySecondaryMetricAxisEncodings(axis);\n }\n}\n\nexport interface AxisAddOptions extends AxisSpecOptions {\n scaleName: string;\n opposingScaleType?: ScaleType;\n usermeta?: UserMeta;\n dualMetricAxis?: boolean;\n}\n\n/**\n * Add axes to the spec\n * @param axes The axes to add\n * @param options The axis options\n * @returns The updated axes\n */\nexport const addAxes = produce<\n Axis[],\n [\n AxisSpecOptions & {\n scaleName: string;\n opposingScaleType?: string;\n dualMetricAxis?: boolean;\n usermeta: UserMeta;\n }\n ]\n>((axes, { scaleName, opposingScaleType, dualMetricAxis, ...axisOptions }) => {\n const newAxes: Axis[] = [];\n // adds all the trellis axis options if this is a trellis axis\n axisOptions = { ...axisOptions, ...getTrellisAxisOptions(scaleName) };\n const {\n baseline,\n colorScheme,\n usermeta,\n labelAlign,\n labelFontWeight,\n labelFormat,\n labelOrientation,\n name,\n position,\n } = axisOptions;\n\n if (labelFormat === 'time') {\n // time axis actually needs two axes. A primary and secondary.\n newAxes.push(...getTimeAxes(scaleName, axisOptions));\n } else {\n const axis = getDefaultAxis(axisOptions, scaleName);\n // if labels exist, add them to the axis\n if (axisOptions.labels.length) {\n const labels = axisOptions.labels;\n const signalName = `${name}_labels`;\n axis.values = labels.map((label) => getLabelValue(label));\n axis.encode = {\n labels: getAxisLabelsEncoding(labelAlign, labelFontWeight, 'label', labelOrientation, position, signalName),\n };\n }\n\n // if sublabels exist, create a new axis for the sub labels\n if (hasSubLabels(axisOptions)) {\n axis.titlePadding = 24;\n\n // add sublabel axis\n const subLabelAxis = getSubLabelAxis(axisOptions, scaleName);\n\n handleDualMetricAxisConfig({\n dualMetricAxis,\n axis: subLabelAxis,\n usermeta,\n scaleName,\n colorScheme,\n position,\n incrementMetricAxisCount: false,\n });\n\n newAxes.push(subLabelAxis);\n }\n\n handleDualMetricAxisConfig({\n dualMetricAxis,\n axis,\n usermeta,\n scaleName,\n colorScheme,\n position,\n incrementMetricAxisCount: true,\n });\n\n newAxes.unshift(axis);\n }\n\n // add baseline\n if (opposingScaleType !== 'linear') {\n newAxes[0] = setAxisBaseline(newAxes[0], baseline);\n }\n\n if (scaleTypeSupportsReferenceLines(axisOptions.scaleType)) {\n // encode axis to hide labels that overlap reference line icons\n const referenceLines = getReferenceLines(axisOptions);\n referenceLines.forEach((referenceLineOptions) => {\n const { label: referenceLineLabel, icon, value, position: linePosition } = referenceLineOptions;\n const text = newAxes[0].encode?.labels?.update?.text;\n if ((icon || referenceLineLabel) && text && Array.isArray(text) && (!linePosition || linePosition === 'center')) {\n // if the label is within 30 pixels of the reference line icon, hide it\n text.unshift({\n test: `abs(scale('${scaleName}', ${value}) - scale('${scaleName}', datum.value)) < 30`,\n value: '',\n });\n }\n });\n }\n\n const axisAnnotations = getAxisAnnotationsFromChildren(axisOptions);\n axisAnnotations.forEach((annotationOptions) => {\n addAxisAnnotationAxis(newAxes, annotationOptions, scaleName);\n });\n\n axes.push(...newAxes);\n});\n\n/**\n * Adds dual metric axis configuration to the axis\n * This applies color and opacity encodings based on the series involved\n */\nconst handleDualMetricAxisConfig = ({\n dualMetricAxis,\n axis,\n usermeta,\n scaleName,\n colorScheme,\n position,\n incrementMetricAxisCount,\n}: {\n dualMetricAxis: boolean | undefined;\n axis: Axis;\n usermeta: UserMeta;\n scaleName: string;\n colorScheme: ColorScheme;\n position: Position;\n incrementMetricAxisCount: boolean;\n}) => {\n const chartOrientation = usermeta?.chartOrientation ?? 'vertical';\n if (dualMetricAxis && getIsMetricAxis(position, chartOrientation)) {\n if (!usermeta.metricAxisCount) {\n usermeta.metricAxisCount = 0;\n }\n addDualMetricAxisConfig(axis, usermeta.metricAxisCount === 0, scaleName, colorScheme);\n if (incrementMetricAxisCount) {\n usermeta.metricAxisCount++;\n }\n }\n};\n\nexport const addAxesMarks = produce<\n Mark[],\n [\n AxisSpecOptions & {\n scaleName: string;\n scaleType?: ScaleType;\n opposingScaleType?: string;\n dualMetricAxis?: boolean;\n usermeta: UserMeta;\n }\n ]\n>((marks, options) => {\n const { baseline, baselineOffset, opposingScaleType, position, scaleName, scaleType, usermeta } = options;\n\n // only add reference lines to linear or time scales\n if (scaleTypeSupportsReferenceLines(scaleType)) {\n const { back, front } = getReferenceLineMarks(options, scaleName);\n marks.unshift(...back);\n marks.push(...front);\n }\n\n const trellisGroupMark = marks.find((mark) => mark.name?.includes('Trellis')) as GroupMark;\n const isTrellised = Boolean(trellisGroupMark);\n\n if (baseline && opposingScaleType === 'linear') {\n addBaseline(marks, baselineOffset, position, trellisGroupMark);\n }\n\n if (isTrellised) {\n addAxesToTrellisGroup(options, trellisGroupMark, scaleName, usermeta);\n }\n\n const axisAnnotations = getAxisAnnotationsFromChildren(options);\n axisAnnotations.forEach((annotationOptions) => {\n addAxisAnnotationMarks(marks, annotationOptions, scaleName);\n });\n});\n\nfunction addBaseline(marks: Mark[], baselineOffset: number, position: Position, trellisGroupMark: GroupMark) {\n const baselineRule = getBaselineRule(baselineOffset, position);\n\n // if the chart is trellised, add the baseline to the trellis mark group\n if (trellisGroupMark && 'marks' in trellisGroupMark) {\n if (baselineOffset === 0) {\n trellisGroupMark.marks?.push(baselineRule);\n } else {\n trellisGroupMark.marks?.unshift(baselineRule);\n }\n } else if (baselineOffset === 0) {\n marks.push(baselineRule);\n } else {\n marks.unshift(baselineRule);\n }\n}\n\nfunction addAxesToTrellisGroup(\n options: AxisSpecOptions,\n trellisGroupMark: GroupMark,\n scaleName: string,\n usermeta: UserMeta\n) {\n const trellisOrientation = trellisGroupMark.name?.startsWith('x') ? 'horizontal' : 'vertical';\n const axisOrientation = options.position === 'bottom' || options.position === 'top' ? 'horizontal' : 'vertical';\n\n // hide labels if the axis is not in the same orientation as the trellis\n // for example, we don't want x-axis labels on a vertical trellis\n const hideDefaultLabels = options.hideDefaultLabels || trellisOrientation !== axisOrientation;\n\n let scaleType = options.scaleType;\n // get the scale that this axis will be associated with\n if (trellisOrientation === axisOrientation) {\n const scale = getScale(trellisGroupMark.scales ?? [], options.position);\n scaleName = scale.name;\n scaleType = scale.type ?? 'linear';\n } else {\n // if the axis is not the same orientation as the trellis, then we don't display the title\n // because it will be displayed on the root axis at the spec level\n options.title = undefined;\n }\n\n let newAxes = addAxes([], {\n ...options,\n hideDefaultLabels,\n scaleName,\n scaleType,\n dualMetricAxis: false, // trellis axes don't support dualMetricAxis scaling\n usermeta,\n });\n\n // titles on axes within the trellis group have special encodings so that the title is only shown on the first axis\n newAxes = encodeAxisTitle(newAxes, trellisGroupMark);\n\n trellisGroupMark.axes = [...(trellisGroupMark.axes ?? []), ...newAxes];\n}\n\nexport function setAxisBaseline(axis: Axis, baseline = false): Axis {\n // Vega's property is \"domain\" - we use \"baseline\"\n return { ...axis, domain: baseline, domainWidth: 2 };\n}\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Data, FormulaTransform, SourceData } from 'vega';\n\nimport { FILTERED_TABLE, SELECTED_GROUP, SERIES_ID } from '@spectrum-charts/constants';\n\nimport { getFilteredTableData } from '../data/dataUtils';\nimport {\n AreaSpecOptions,\n BarSpecOptions,\n ChartPopoverOptions,\n ChartPopoverSpecOptions,\n DonutSpecOptions,\n LineSpecOptions,\n ScatterSpecOptions,\n} from '../types';\n\ntype PopoverParentOptions = AreaSpecOptions | BarSpecOptions | DonutSpecOptions | LineSpecOptions | ScatterSpecOptions;\n\n/**\n * gets all the popovers\n * @param markOptions\n * @returns\n */\nexport const getPopovers = (chartPopovers: ChartPopoverOptions[], markName: string): ChartPopoverSpecOptions[] => {\n return chartPopovers.map((chartPopover) => applyPopoverPropDefaults(chartPopover, markName));\n};\n\n/**\n * Applies all defaults to ChartPopoverOptions\n * @param chartPopoverOptions\n * @returns ChartPopoverSpecOptions\n */\nexport const applyPopoverPropDefaults = (\n { UNSAFE_highlightBy = 'item', ...options }: ChartPopoverOptions,\n markName: string\n): ChartPopoverSpecOptions => {\n return {\n UNSAFE_highlightBy,\n markName,\n ...options,\n };\n};\n\n/**\n * Sets all the data needed for popovers\n *\n * NOTE: this function mutates the data object so it should only be called from a produce function\n * @param data\n * @param markOptions\n */\nexport const addPopoverData = (data: Data[], markOptions: PopoverParentOptions, addHighlightedData = true) => {\n const popovers = getPopovers(markOptions.chartPopovers, markOptions.name);\n\n for (const { UNSAFE_highlightBy, markName } of popovers) {\n const filteredTable = getFilteredTableData(data);\n if (!filteredTable.transform) {\n filteredTable.transform = [];\n }\n if (UNSAFE_highlightBy === 'dimension' && markOptions.markType !== 'donut') {\n filteredTable.transform.push(getGroupIdTransform([markOptions.dimension], markName));\n } else if (UNSAFE_highlightBy === 'series') {\n filteredTable.transform.push(getGroupIdTransform([SERIES_ID], markName));\n } else if (Array.isArray(UNSAFE_highlightBy)) {\n filteredTable.transform.push(getGroupIdTransform(UNSAFE_highlightBy, markName));\n } else {\n filteredTable.transform.push(getGroupIdTransform([markOptions.idKey], markName));\n }\n\n if (addHighlightedData) {\n data.push(getMarkSelectedData(markName));\n }\n }\n};\n\n/**\n * Gets the group id transform\n * @param highlightBy\n * @param markName\n * @returns FormulaTransform\n */\nexport const getGroupIdTransform = (highlightBy: string[], markName: string): FormulaTransform => {\n return {\n type: 'formula',\n as: `${markName}_selectedGroupId`,\n expr: highlightBy.map((facet) => `datum.${facet}`).join(' + \" | \" + '),\n };\n};\n\n/**\n * Gets the selected data for a mark\n * @param markName\n * @returns\n */\nconst getMarkSelectedData = (markName: string): SourceData => ({\n name: `${markName}_selectedData`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'filter',\n expr: `${SELECTED_GROUP} === datum.${markName}_selectedGroupId`,\n },\n ],\n});\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { SignalRef } from 'vega';\n\nimport { FILTERED_TABLE, MS_PER_DAY, TRENDLINE_VALUE } from '@spectrum-charts/constants';\n\nimport {\n AggregateMethod,\n BarSpecOptions,\n ColorFacet,\n LineSpecOptions,\n LineTypeFacet,\n Orientation,\n RegressionMethod as RscRegressionMethod,\n ScaleType,\n ScatterSpecOptions,\n TrendlineMethod,\n TrendlineOptions,\n TrendlineSpecOptions,\n WindowMethod,\n} from '../types';\n\n/** These are all the spec options that currently support trendlines */\nexport type TrendlineParentOptions = LineSpecOptions | ScatterSpecOptions | BarSpecOptions;\n\n/**\n * gets all the trendlines from the children and applies all the default trendline options\n * @param children\n * @param markName\n * @returns TrendlineSpecOptions[]\n */\nexport const getTrendlines = (markOptions: TrendlineParentOptions): TrendlineSpecOptions[] => {\n return markOptions.trendlines.map((trendline, index) => applyTrendlinePropDefaults(markOptions, trendline, index));\n};\n\n/**\n * applies all the default trendline options\n * @param param0\n * @param markName\n * @param index\n * @returns TrendlineSpecOptions\n */\nexport const applyTrendlinePropDefaults = (\n markOptions: TrendlineParentOptions,\n {\n chartTooltips = [],\n color,\n dimensionExtent,\n dimensionRange = [null, null],\n displayOnHover = false,\n highlightRawPoint = false,\n lineType = 'dashed',\n lineWidth = 'M',\n method = 'linear',\n opacity = 1,\n orientation = 'horizontal',\n trendlineAnnotations = [],\n ...opts\n }: TrendlineOptions,\n index: number\n): TrendlineSpecOptions => {\n const dimensionScaleType = getTrendlineScaleType(markOptions, orientation);\n const isDimensionNormalized =\n dimensionScaleType === 'time' && isRegressionMethod(method) && orientation === 'horizontal';\n const { trendlineDimension, trendlineMetric } = getTrendlineDimensionMetric(\n markOptions.dimension,\n markOptions.metric,\n orientation,\n isDimensionNormalized\n );\n const trendlineColor = color ? { value: color } : getTrendlineColorFromMarkOptions(markOptions.color);\n return {\n chartTooltips,\n colorScheme: markOptions.colorScheme,\n displayOnHover,\n dimensionExtent: dimensionExtent ?? dimensionRange,\n dimensionRange,\n dimensionScaleType,\n highlightRawPoint,\n isDimensionNormalized,\n lineType,\n lineWidth,\n method,\n metric: TRENDLINE_VALUE,\n name: `${markOptions.name}Trendline${index}`,\n opacity,\n orientation,\n trendlineAnnotations,\n trendlineColor,\n trendlineDimension,\n trendlineMetric,\n ...opts,\n };\n};\n\n/**\n * Gets the color from the parent options.\n * Simplifies dual facet colors into a single facet\n * @param color\n * @returns color\n */\nexport const getTrendlineColorFromMarkOptions = (color: TrendlineParentOptions['color']): ColorFacet => {\n return Array.isArray(color) ? color[0] : color;\n};\n\n/**\n * Gets the color from the parent options.\n * Simplifies dual facet colors into a single facet\n * @param lineType\n * @returns color\n */\nexport const getTrendlineLineTypeFromMarkOptions = (lineType: TrendlineParentOptions['lineType']): LineTypeFacet => {\n return Array.isArray(lineType) ? lineType[0] : lineType;\n};\n\n/**\n * Gets the metric and dimension for the trendline, taking into account the orientation.\n * if isDimensionNormalized is true, the trendlineDimension will have `Normalized` appended to it\n * @param dimension\n * @param metric\n * @param orientation\n * @param isDimensionNormalized\n * @returns \\{trendlineDimension: string, trendlineMetric: string}\n */\nexport const getTrendlineDimensionMetric = (\n dimension: string,\n metric: string,\n orientation: Orientation,\n isDimensionNormalized: boolean\n): { trendlineDimension: string; trendlineMetric: string } => {\n return orientation === 'horizontal'\n ? {\n trendlineDimension: normalizeTrendlineDimensionName(dimension, isDimensionNormalized),\n trendlineMetric: metric,\n }\n : {\n trendlineDimension: metric,\n trendlineMetric: dimension,\n };\n};\n\n/**\n * If the dimension should be normalized, returns the normalized dimension name, otherwise returns the original dimension\n * @param dimension\n * @param method\n * @param scaleType\n * @returns dimension name\n */\nexport const normalizeTrendlineDimensionName = (dimension: string, isDimensionNormalized: boolean) =>\n isDimensionNormalized ? `${dimension}Normalized` : dimension;\n\n/**\n * determines if the supplied method is an aggregate method (average, median)\n * @see https://vega.github.io/vega/docs/transforms/aggregate/\n * @param method\n * @returns boolean\n */\nexport const isAggregateMethod = (method: TrendlineMethod): method is AggregateMethod =>\n ['average', 'median'].includes(method);\n\n/**\n * determines if the supplied method is a regression method\n * @see https://vega.github.io/vega/docs/transforms/regression/\n * @param method\n * @returns boolean\n */\nexport const isRegressionMethod = (method: TrendlineMethod): method is RscRegressionMethod =>\n isPolynomialMethod(method) || ['exponential', 'logarithmic', 'power'].includes(method);\n\n/**\n * determines if the supplied method is a windowing method\n * @see https://vega.github.io/vega/docs/transforms/window/\n * @param method\n * @returns boolean\n */\nexport const isWindowMethod = (method: TrendlineMethod): method is WindowMethod => method.startsWith('movingAverage-');\n\n/**\n * determines if the supplied method is a polynomial method\n * @see https://vega.github.io/vega/docs/transforms/regression/\n * @param method\n * @returns boolean\n */\nexport const isPolynomialMethod = (method: TrendlineMethod): boolean =>\n method.startsWith('polynomial-') || ['linear', 'quadratic'].includes(method);\n\n/**\n * determines if any trendlines use the normalized dimension\n * @param markOptions\n * @returns boolean\n */\nexport const hasTrendlineWithNormalizedDimension = (markOptions: TrendlineParentOptions): boolean => {\n const trendlines = getTrendlines(markOptions);\n\n // only need to add the normalized dimension transform if there is a regression trendline and the dimension scale type is time\n return trendlines.some(\n ({ dimensionScaleType, method }) => isRegressionMethod(method) && dimensionScaleType === 'time'\n );\n};\n\n/**\n * gets the order of the polynomial\n * y = a + b * x + … + k * pow(x, order)\n * @see https://vega.github.io/vega/docs/transforms/regression/\n * @param method trendline method\n * @returns order\n */\nexport const getPolynomialOrder = (method: TrendlineMethod): number => {\n // method is one of the named polynomial methods\n switch (method) {\n case 'linear':\n return 1;\n case 'quadratic':\n return 2;\n }\n\n // method is of the form polynomial-<order>\n const order = parseInt(method.split('-')[1]);\n if (order < 1) {\n throw new Error(`Invalid polynomial order: ${order}, order must be an interger greater than 0`);\n }\n return order;\n};\n\n/**\n * gets the extent used in the regression transform\n * @param dimensionExtent\n * @param name\n * @param isNormalized\n * @returns\n */\nexport const getRegressionExtent = (\n dimensionExtent: TrendlineSpecOptions['dimensionExtent'],\n name: string,\n isNormalized: boolean\n): SignalRef => {\n const extentName = `${name}_extent`;\n const extentSignal = dimensionExtent\n .map((value, i) => {\n switch (value) {\n case null:\n return `${extentName}[${i}]`;\n case 'domain':\n return `${extentName}[${i}] ${i === 0 ? '-' : '+'} (${extentName}[1] - ${extentName}[0]) * 0.3`;\n default:\n // if this is a normalized date, we need to normalize the value\n if (isNormalized) {\n return `(${value} - data('${FILTERED_TABLE}')[0].datetimeMin + ${MS_PER_DAY}) / ${MS_PER_DAY}`;\n }\n return value;\n }\n })\n .join(', ');\n\n return { signal: `[${extentSignal}]` };\n};\n\nexport const getTrendlineScaleType = (\n markOptions: TrendlineParentOptions,\n trendlineOrientation: Orientation\n): ScaleType => {\n // y axis only support linear... for now...\n if (trendlineOrientation === 'vertical') return 'linear';\n return 'scaleType' in markOptions ? markOptions.scaleType : markOptions.dimensionScaleType;\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {\n AggregateOp,\n AggregateTransform,\n CollectTransform,\n ExtentTransform,\n FilterTransform,\n FormulaTransform,\n JoinAggregateTransform,\n LookupTransform,\n RegressionMethod,\n RegressionTransform,\n Transforms,\n WindowTransform,\n} from 'vega';\n\nimport { MS_PER_DAY, TRENDLINE_VALUE } from '@spectrum-charts/constants';\n\nimport { getFacetsFromOptions } from '../specUtils';\nimport { AggregateMethod, TrendlineMethod, TrendlineSpecOptions } from '../types';\nimport { TrendlineParentOptions, getPolynomialOrder, getRegressionExtent, isPolynomialMethod } from './trendlineUtils';\n\n/**\n * Gets the aggreagate transform used for calculating the average trendline\n * @param markOptions\n * @param trendlineSpecOptions\n * @param isHighResolutionData\n * @returns transform\n */\nexport const getAggregateTransform = (\n markOptions: TrendlineParentOptions,\n { method, trendlineDimension, trendlineMetric }: TrendlineSpecOptions,\n isHighResolutionData: boolean\n): AggregateTransform | JoinAggregateTransform => {\n const { color, lineType } = markOptions;\n const { facets } = getFacetsFromOptions({ color, lineType });\n const operations: Record<AggregateMethod, AggregateOp> = {\n average: 'mean',\n median: 'median',\n };\n if (isHighResolutionData) {\n return {\n type: 'aggregate',\n groupby: facets,\n ops: [operations[method], 'min', 'max'],\n fields: [trendlineMetric, trendlineDimension, trendlineDimension],\n as: [TRENDLINE_VALUE, `${trendlineDimension}Min`, `${trendlineDimension}Max`],\n };\n }\n return {\n type: 'joinaggregate',\n groupby: facets,\n ops: [operations[method]],\n fields: [trendlineMetric],\n as: [TRENDLINE_VALUE],\n };\n};\n\n/**\n * Gets the regression transform used for calculating the regression trendline.\n * Regression trendlines are ones that use the x value as a parameter\n * @see https://vega.github.io/vega/docs/transforms/regression/\n * @param markOptions\n * @param method\n * @param isHighResolutionData\n * @returns\n */\nexport const getRegressionTransform = (\n markOptions: TrendlineParentOptions,\n trendlineOptions: TrendlineSpecOptions,\n isHighResolutionData: boolean\n): RegressionTransform => {\n const { color, lineType } = markOptions;\n const { dimensionExtent, isDimensionNormalized, method, name, trendlineDimension, trendlineMetric } =\n trendlineOptions;\n const { facets } = getFacetsFromOptions({ color, lineType });\n\n let regressionMethod: RegressionMethod | undefined;\n let order: number | undefined;\n\n switch (method) {\n case 'exponential':\n regressionMethod = 'exp';\n break;\n case 'logarithmic':\n regressionMethod = 'log';\n break;\n case 'power':\n regressionMethod = 'pow';\n break;\n default:\n order = getPolynomialOrder(method);\n regressionMethod = 'poly';\n break;\n }\n\n return {\n type: 'regression',\n method: regressionMethod,\n order,\n groupby: facets,\n x: trendlineDimension,\n y: trendlineMetric,\n as: isHighResolutionData ? [trendlineDimension, TRENDLINE_VALUE] : undefined,\n params: !isHighResolutionData,\n extent: isHighResolutionData ? getRegressionExtent(dimensionExtent, name, isDimensionNormalized) : undefined,\n };\n};\n\n/**\n * Gets the window transform used for calculating the moving average trendline.\n * @param markOptions\n * @param method\n * @returns\n */\nexport const getWindowTransform = (\n markOptions: TrendlineParentOptions,\n { method, trendlineMetric }: TrendlineSpecOptions\n): WindowTransform => {\n const frameWidth = parseInt(method.split('-')[1]);\n\n const { color, lineType } = markOptions;\n const { facets } = getFacetsFromOptions({ color, lineType });\n\n if (isNaN(frameWidth) || frameWidth < 1) {\n throw new Error(`Invalid moving average frame width: ${frameWidth}, frame width must be an integer greater than 0`);\n }\n\n return {\n type: 'window',\n ops: ['mean'],\n groupby: facets,\n fields: [trendlineMetric],\n as: [TRENDLINE_VALUE],\n frame: [frameWidth - 1, 0],\n };\n};\n\n/**\n * Gets the transforms that will normalize the dimension.\n * The dimension gets normalized for time scales on regression methods. This makes the regression calculations far more accurate than using the raw time values\n * @param dimension\n * @returns\n */\nexport const getNormalizedDimensionTransform = (dimension: string): Transforms[] => [\n {\n type: 'joinaggregate',\n fields: [dimension],\n as: [`${dimension}Min`],\n ops: ['min'],\n },\n {\n type: 'formula',\n expr: `(datum.${dimension} - datum.${dimension}Min + ${MS_PER_DAY}) / ${MS_PER_DAY}`,\n as: `${dimension}Normalized`,\n },\n];\n\n/**\n * Gets an extent transform.\n * This is used to calculate the min and max of the dimension so that it can be used to set the extent of the regression trendline\n * @param dimension\n * @param name\n * @returns\n */\nexport const getRegressionExtentTransform = (dimension: string, name: string): ExtentTransform => ({\n type: 'extent',\n field: dimension,\n signal: `${name}_extent`,\n});\n\n/**\n * Gets the sort transform for the provided dimension.\n * This is used to sort window methods so they are calculated and drawn in the correct order\n * @param dimension\n * @returns CollectTransform\n */\nexport const getSortTransform = (dimension: string): CollectTransform => ({\n type: 'collect',\n sort: {\n field: dimension,\n },\n});\n\n/**\n * gets the filter transforms that will restrict the data to the dimension range\n * @param dimension\n * @param dimensionRange\n * @returns filterTansforms\n */\nexport const getTrendlineDimensionRangeTransforms = (\n dimension: string,\n dimensionRange: [number | null, number | null]\n): FilterTransform[] => {\n const filterExpressions: string[] = [];\n if (dimensionRange[0] !== null) {\n filterExpressions.push(`datum.${dimension} >= ${dimensionRange[0]}`);\n }\n if (dimensionRange[1] !== null) {\n filterExpressions.push(`datum.${dimension} <= ${dimensionRange[1]}`);\n }\n if (filterExpressions.length) {\n return [\n {\n type: 'filter',\n expr: filterExpressions.join(' && '),\n },\n ];\n }\n return [];\n};\n\n/**\n * This transform is used to calculate the value of the trendline using the coef and the dimension\n * @param trendlineDimension mark dimension\n * @param method trenline method\n * @returns formula transorfm\n */\nexport const getTrendlineParamFormulaTransforms = (\n trendlineDimension: string,\n method: TrendlineMethod\n): FormulaTransform[] => {\n let expr = '';\n if (isPolynomialMethod(method)) {\n const order = getPolynomialOrder(method);\n expr = [\n 'datum.coef[0]',\n ...Array(order)\n .fill(0)\n .map((_e, i) => `datum.coef[${i + 1}] * pow(datum.${trendlineDimension}, ${i + 1})`),\n ].join(' + ');\n } else if (method === 'exponential') {\n expr = `datum.coef[0] + exp(datum.coef[1] * datum.${trendlineDimension})`;\n } else if (method === 'logarithmic') {\n expr = `datum.coef[0] + datum.coef[1] * log(datum.${trendlineDimension})`;\n } else if (method === 'power') {\n expr = `datum.coef[0] * pow(datum.${trendlineDimension}, datum.coef[1])`;\n }\n\n if (!expr) return [];\n return [\n {\n type: 'formula',\n expr,\n as: TRENDLINE_VALUE,\n },\n ];\n};\n\n/**\n * Gets the lookup transform that will be used to lookup the coef for regression trendlines\n * @param markOptions\n * @param trendlineOptions\n * @returns LookupTransform\n */\nexport const getTrendlineParamLookupTransform = (\n { color, lineType }: TrendlineParentOptions,\n { name }: TrendlineSpecOptions\n): LookupTransform => {\n const { facets } = getFacetsFromOptions({ color, lineType });\n return {\n type: 'lookup',\n from: `${name}_params`,\n key: 'keys',\n fields: facets,\n values: ['coef'],\n };\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Data, SourceData, Transforms } from 'vega';\n\nimport {\n FILTERED_TABLE,\n HIGHLIGHTED_ITEM,\n HIGHLIGHTED_SERIES,\n SELECTED_ITEM,\n SELECTED_SERIES,\n SERIES_ID,\n} from '@spectrum-charts/constants';\n\nimport { getSeriesIdTransform, getTableData } from '../data/dataUtils';\nimport { isInteractive } from '../marks/markUtils';\nimport { getFacetsFromOptions } from '../specUtils';\nimport { TrendlineMethod, TrendlineSpecOptions } from '../types';\nimport {\n getAggregateTransform,\n getNormalizedDimensionTransform,\n getRegressionExtentTransform,\n getRegressionTransform,\n getSortTransform,\n getTrendlineDimensionRangeTransforms,\n getTrendlineParamFormulaTransforms,\n getTrendlineParamLookupTransform,\n getWindowTransform,\n} from './trendlineDataTransformUtils';\nimport {\n TrendlineParentOptions,\n getTrendlineDimensionMetric,\n getTrendlines,\n isAggregateMethod,\n isRegressionMethod,\n isWindowMethod,\n} from './trendlineUtils';\n\n/**\n * Adds the necessary data sources and transforms for the trendlines\n * NOTE: this function mutates the data array because it gets called from within a data produce function\n * @param data\n * @param markOptions\n */\nexport const addTrendlineData = (data: Data[], markOptions: TrendlineParentOptions) => {\n data.push(...getTrendlineData(markOptions));\n\n const tableData = getTableData(data);\n tableData.transform = addTableDataTransforms(tableData.transform ?? [], markOptions);\n};\n\n/**\n * Gets all the data sources and transforms for all trendlines\n * @param data\n * @param markOptions\n * @returns Data[]\n */\nexport const getTrendlineData = (markOptions: TrendlineParentOptions): SourceData[] => {\n const data: SourceData[] = [];\n const { color, idKey, lineType, name: markName } = markOptions;\n const trendlines = getTrendlines(markOptions);\n\n const concatenatedTrendlineData: { name: string; source: string[] } = {\n name: `${markName}_allTrendlineData`,\n source: [],\n };\n\n for (const trendlineOptions of trendlines) {\n const { displayOnHover, method, name } = trendlineOptions;\n const { facets } = getFacetsFromOptions({ color, lineType });\n\n if (isRegressionMethod(method)) {\n data.push(...getRegressionTrendlineData(markOptions, trendlineOptions, facets));\n } else if (isAggregateMethod(method)) {\n data.push(...getAggregateTrendlineData(markOptions, trendlineOptions, facets));\n } else if (isWindowMethod(method)) {\n data.push(getWindowTrendlineData(markOptions, trendlineOptions));\n }\n if (displayOnHover) {\n data.push(getTrendlineDisplayOnHoverData(name, method));\n }\n if (isInteractive(trendlineOptions)) {\n concatenatedTrendlineData.source.push(`${name}_data`);\n }\n }\n\n if (trendlines.some((trendline) => isInteractive(trendline))) {\n data.push(concatenatedTrendlineData);\n data.push(getHighlightTrendlineData(markName, idKey));\n }\n\n return data;\n};\n\n/**\n * Gets the data sources and transforms for aggregate trendlines (average, median)\n * @param markOptions\n * @param trendlineOptions\n * @param facets\n * @returns Data[]\n */\nexport const getAggregateTrendlineData = (\n markOptions: TrendlineParentOptions,\n trendlineOptions: TrendlineSpecOptions,\n facets: string[]\n) => {\n const data: SourceData[] = [];\n const { dimensionRange, name, trendlineDimension } = trendlineOptions;\n const dimensionRangeTransforms = getTrendlineDimensionRangeTransforms(trendlineDimension, dimensionRange);\n // high resolution data used for drawing the rule marks\n data.push({\n name: `${name}_highResolutionData`,\n source: FILTERED_TABLE,\n transform: [\n ...getExcludeDataKeyTransforms(trendlineOptions.excludeDataKeys),\n ...dimensionRangeTransforms,\n ...getTrendlineStatisticalTransforms(markOptions, trendlineOptions, true),\n ...getSeriesIdTransform(facets),\n ],\n });\n if (isInteractive(trendlineOptions)) {\n // data used for each of the trendline points\n data.push({\n name: `${name}_data`,\n source: FILTERED_TABLE,\n transform: [\n ...dimensionRangeTransforms,\n ...getTrendlineStatisticalTransforms(markOptions, trendlineOptions, false),\n ],\n });\n }\n return data;\n};\n\n/**\n * Gets the data sources and transforms for regression trendlines (linear, power, polynomial-x, etc.)\n * @param markOptions\n * @param trendlineOptions\n * @param facets\n * @returns Data[]\n */\nexport const getRegressionTrendlineData = (\n markOptions: TrendlineParentOptions,\n trendlineOptions: TrendlineSpecOptions,\n facets: string[]\n) => {\n const data: SourceData[] = [];\n const { dimension, metric } = markOptions;\n const { dimensionRange, method, name, orientation, trendlineDimension } = trendlineOptions;\n const { trendlineDimension: standardTrendlineDimension } = getTrendlineDimensionMetric(\n dimension,\n metric,\n orientation,\n false\n );\n const dimensionRangeTransforms = getTrendlineDimensionRangeTransforms(standardTrendlineDimension, dimensionRange);\n // high resolution data used for drawing the smooth trendline\n data.push({\n name: `${name}_highResolutionData`,\n source: FILTERED_TABLE,\n transform: [\n ...getExcludeDataKeyTransforms(trendlineOptions.excludeDataKeys),\n ...dimensionRangeTransforms,\n ...getTrendlineStatisticalTransforms(markOptions, trendlineOptions, true),\n ...getSeriesIdTransform(facets),\n ],\n });\n if (isInteractive(trendlineOptions)) {\n // params and data used for each of the trendline data points\n // the high resolution data has too much detail and we don't want a tooltip at each high resolution point\n data.push(\n {\n name: `${name}_params`,\n source: FILTERED_TABLE,\n transform: [\n ...dimensionRangeTransforms,\n ...getTrendlineStatisticalTransforms(markOptions, trendlineOptions, false),\n ],\n },\n {\n name: `${name}_data`,\n source: FILTERED_TABLE,\n transform: [\n ...dimensionRangeTransforms,\n getTrendlineParamLookupTransform(markOptions, trendlineOptions),\n ...getTrendlineParamFormulaTransforms(trendlineDimension, method),\n ],\n }\n );\n }\n return data;\n};\n\n/**\n * Gets the data source and transforms for window trendlines (movingAverage-x)\n * @param markOptions\n * @param trendlineOptions\n * @returns Data\n */\nconst getWindowTrendlineData = (\n markOptions: TrendlineParentOptions,\n trendlineOptions: TrendlineSpecOptions\n): SourceData => ({\n name: `${trendlineOptions.name}_data`,\n source: FILTERED_TABLE,\n transform: [\n ...getExcludeDataKeyTransforms(trendlineOptions.excludeDataKeys),\n ...getTrendlineStatisticalTransforms(markOptions, trendlineOptions, false),\n ...getTrendlineDimensionRangeTransforms(markOptions.dimension, trendlineOptions.dimensionRange),\n ],\n});\n\n/**\n * gets the data source and transforms for highlighting trendlines\n * @param markName\n * @param trendlines\n * @returns Data\n */\nconst getHighlightTrendlineData = (markName: string, idKey: string): SourceData => {\n const expr = `${SELECTED_ITEM} === datum.${idKey} || !isValid(${SELECTED_ITEM}) && (isArray(${HIGHLIGHTED_ITEM}) && indexof(${HIGHLIGHTED_ITEM}, datum.${idKey}) || ${HIGHLIGHTED_ITEM} === datum.${idKey})`;\n return {\n name: `${markName}Trendline_highlightedData`,\n source: `${markName}_allTrendlineData`,\n transform: [\n {\n type: 'filter',\n expr,\n },\n ],\n };\n};\n\n/**\n * Gets the statistical transforms that will calculate the trendline values\n * @param markOptions\n * @param trendlineOptions\n * @returns dataTransforms\n */\nexport const getTrendlineStatisticalTransforms = (\n markOptions: TrendlineParentOptions,\n trendlineOptions: TrendlineSpecOptions,\n isHighResolutionData: boolean\n): Transforms[] => {\n const { method, trendlineDimension } = trendlineOptions;\n\n if (isAggregateMethod(method)) {\n return [getAggregateTransform(markOptions, trendlineOptions, isHighResolutionData)];\n }\n if (isRegressionMethod(method)) {\n return [getRegressionTransform(markOptions, trendlineOptions, isHighResolutionData)];\n }\n if (isWindowMethod(method)) {\n return [getSortTransform(trendlineDimension), getWindowTransform(markOptions, trendlineOptions)];\n }\n\n return [];\n};\n\n/**\n * Adds the table data transforms needed for trendlines\n * @param transforms\n * @param markOptions\n */\nexport const addTableDataTransforms = produce<Transforms[], [TrendlineParentOptions]>((transforms, markOptions) => {\n const { dimension, metric } = markOptions;\n\n const trendlines = getTrendlines(markOptions);\n for (const { isDimensionNormalized, method, name, orientation, trendlineDimension } of trendlines) {\n if (isRegressionMethod(method)) {\n // time scales need to be normalized for regression trendlines\n const { trendlineDimension: standardTrendlinDimension } = getTrendlineDimensionMetric(\n dimension,\n metric,\n orientation,\n false\n );\n\n if (isDimensionNormalized) {\n if (\n !transforms.some(\n (transform) => 'as' in transform && transform.as === `${standardTrendlinDimension}Normalized`\n )\n ) {\n transforms.push(...getNormalizedDimensionTransform(standardTrendlinDimension));\n }\n }\n // add the extent transform\n transforms.push(getRegressionExtentTransform(trendlineDimension, name));\n }\n }\n});\n\n/**\n * Gets the data source and transforms for displaying the trendline on hover\n * @param trendlineName\n * @param method\n * @returns SourceData\n */\nexport const getTrendlineDisplayOnHoverData = (trendlineName: string, method: TrendlineMethod): SourceData => {\n const source = isWindowMethod(method) ? `${trendlineName}_data` : `${trendlineName}_highResolutionData`;\n return {\n name: `${trendlineName}_highlightedData`,\n source,\n transform: [\n {\n type: 'filter',\n expr: `datum.${SERIES_ID} === ${HIGHLIGHTED_SERIES} || datum.${SERIES_ID} === ${SELECTED_SERIES}`,\n },\n ],\n };\n};\n\nconst getExcludeDataKeyTransforms = (excludeDataKeys?: string[]): Transforms[] =>\n excludeDataKeys?.map((excludeDataKey) => ({\n type: 'filter',\n expr: `!datum.${excludeDataKey}`,\n })) ?? [];\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { ColorValueRef, NumericValueRef, SymbolMark } from 'vega';\n\nimport {\n BACKGROUND_COLOR,\n DEFAULT_SYMBOL_SIZE,\n DEFAULT_SYMBOL_STROKE_WIDTH,\n SELECTED_GROUP,\n SELECTED_ITEM,\n} from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport {\n getColorProductionRule,\n getHighlightOpacityValue,\n getOpacityProductionRule,\n getXProductionRule,\n getYProductionRule,\n hasPopover,\n} from '../marks/markUtils';\nimport { LineSpecOptions, ProductionRuleTests } from '../types';\nimport { LineMarkOptions } from './lineUtils';\n\nconst staticPointTest = (staticPoint: string) => `datum.${staticPoint} && datum.${staticPoint} === true`;\nconst getSelectedTest = (name: string, idKey: string) =>\n `(${SELECTED_ITEM} && ${SELECTED_ITEM} === datum.${idKey}) || (${SELECTED_GROUP} && ${SELECTED_GROUP} === datum.${name}_selectedGroupId)`;\n\n/**\n * Gets the point mark for static points on a line chart.\n * @param lineMarkOptions\n * @returns SymbolMark\n */\nexport const getLineStaticPoint = ({\n name,\n metric,\n metricAxis,\n color,\n colorScheme,\n scaleType,\n dimension,\n isSparkline,\n pointSize = 125,\n}: LineSpecOptions): SymbolMark => {\n return {\n name: `${name}_staticPoints`,\n description: `${name}_staticPoints`,\n type: 'symbol',\n from: { data: `${name}_staticPointData` },\n interactive: false,\n encode: {\n enter: {\n size: { value: pointSize },\n fill: isSparkline ? { signal: BACKGROUND_COLOR } : getColorProductionRule(color, colorScheme),\n stroke: isSparkline ? getColorProductionRule(color, colorScheme) : { signal: BACKGROUND_COLOR },\n y: getYProductionRule(metricAxis, metric),\n },\n update: {\n x: getXProductionRule(scaleType, dimension),\n },\n },\n };\n};\n\n/**\n * Gets a background to points to prevent opacity from displaying elements behind the point.\n * @param lineMarkOptions\n * @returns SymbolMark\n */\nexport const getHighlightBackgroundPoint = (lineOptions: LineMarkOptions): SymbolMark => {\n const { dimension, metric, metricAxis, name, scaleType } = lineOptions;\n return {\n name: `${name}_pointBackground`,\n description: `${name}_pointBackground`,\n type: 'symbol',\n from: { data: `${name}_highlightedData` },\n interactive: false,\n encode: {\n enter: {\n y: getYProductionRule(metricAxis, metric),\n fill: { signal: BACKGROUND_COLOR },\n stroke: { signal: BACKGROUND_COLOR },\n },\n update: {\n size: getHighlightPointSize(lineOptions),\n strokeWidth: getHighlightPointStrokeWidth(lineOptions),\n x: getXProductionRule(scaleType, dimension),\n },\n },\n };\n};\n\nconst getHighlightOrSelectionPoint = (lineOptions: LineMarkOptions, useHighlightedData = true): SymbolMark => {\n const { color, colorScheme, dimension, metric, metricAxis, name, scaleType } = lineOptions;\n return {\n name: `${name}_point_${useHighlightedData ? 'highlight' : 'select'}`,\n type: 'symbol',\n from: { data: `${name}${useHighlightedData ? '_highlightedData' : '_selectedData'}` },\n interactive: false,\n encode: {\n enter: {\n y: getYProductionRule(metricAxis, metric),\n stroke: getColorProductionRule(color, colorScheme),\n },\n update: {\n fill: getHighlightPointFill(lineOptions),\n size: getHighlightPointSize(lineOptions),\n stroke: getHighlightPointStroke(lineOptions),\n strokeOpacity: getHighlightPointStrokeOpacity(lineOptions),\n strokeWidth: getHighlightPointStrokeWidth(lineOptions),\n x: getXProductionRule(scaleType, dimension),\n },\n },\n };\n};\n\n/**\n * Displays a point on hover on the line.\n * @param lineMarkOptions\n * @returns SymbolMark\n */\nexport const getHighlightPoint = (lineOptions: LineMarkOptions): SymbolMark => {\n return getHighlightOrSelectionPoint(lineOptions, true);\n};\n\n/**\n * Displays a point on select on the line.\n * @param lineMarkOptions\n * @returns SymbolMark\n */\nexport const getSelectionPoint = (lineOptions: LineMarkOptions): SymbolMark => {\n return getHighlightOrSelectionPoint(lineOptions, false);\n};\n\n/**\n * Displays a secondary highlight point on hover or select on the line.\n * @param lineMarkOptions\n * @param secondaryHighlightedMetric\n * @returns SymbolMark\n */\nexport const getSecondaryHighlightPoint = (\n lineOptions: LineMarkOptions,\n secondaryHighlightedMetric: string\n): SymbolMark => {\n const { color, colorScheme, dimension, metricAxis, name, scaleType } = lineOptions;\n return {\n name: `${name}_secondaryPoint`,\n type: 'symbol',\n from: { data: `${name}_highlightedData` },\n interactive: false,\n encode: {\n enter: {\n y: getYProductionRule(metricAxis, secondaryHighlightedMetric),\n fill: { signal: BACKGROUND_COLOR },\n stroke: getColorProductionRule(color, colorScheme),\n },\n update: {\n x: getXProductionRule(scaleType, dimension),\n },\n },\n };\n};\n\n/**\n * gets the fill color for the highlighted point\n * @param lineMarkOptions\n * @returns fill rule\n */\nexport const getHighlightPointFill = (markOptions: LineMarkOptions): ProductionRuleTests<ColorValueRef> => {\n const { color, colorScheme, idKey, name, staticPoint } = markOptions;\n const fillRules: ProductionRuleTests<ColorValueRef> = [];\n const selectedTest = getSelectedTest(name, idKey);\n\n if (staticPoint) {\n fillRules.push({ test: staticPointTest(staticPoint), ...getColorProductionRule(color, colorScheme) });\n }\n if (hasPopover(markOptions)) {\n fillRules.push({ test: selectedTest, ...getColorProductionRule(color, colorScheme) });\n }\n return [...fillRules, { signal: BACKGROUND_COLOR }];\n};\n\n/**\n * gets the stroke color for the highlighted point\n * @param lineMarkOptions\n * @returns stroke rule\n */\nexport const getHighlightPointStroke = (markOptions: LineMarkOptions): ProductionRuleTests<ColorValueRef> => {\n const { color, colorScheme, idKey, name, staticPoint } = markOptions;\n const strokeRules: ProductionRuleTests<ColorValueRef> = [];\n const selectedTest = getSelectedTest(name, idKey);\n\n if (staticPoint) {\n strokeRules.push({ test: staticPointTest(staticPoint), ...getColorProductionRule(color, colorScheme) });\n }\n if (hasPopover(markOptions)) {\n strokeRules.push({ test: selectedTest, signal: BACKGROUND_COLOR });\n }\n\n return [...strokeRules, getColorProductionRule(color, colorScheme)];\n};\n\n/**\n * gets the stroke opacity for the highlighted point\n * @param lineMarkOptions\n * @returns stroke opacity rule\n */\nexport const getHighlightPointStrokeOpacity = ({\n opacity,\n staticPoint,\n}: LineMarkOptions): ProductionRuleTests<NumericValueRef> => {\n const baseOpacityRule = getOpacityProductionRule(opacity);\n const strokeOpacityRules: ProductionRuleTests<NumericValueRef> = [];\n if (staticPoint) {\n strokeOpacityRules.push({\n test: staticPointTest(staticPoint),\n ...getHighlightOpacityValue(baseOpacityRule),\n });\n }\n return [...strokeOpacityRules, baseOpacityRule];\n};\n\n/**\n * gets the size for the highlighted point\n * @param lineMarkOptions\n * @returns size rule\n */\nexport const getHighlightPointSize = ({ staticPoint }: LineMarkOptions): ProductionRuleTests<NumericValueRef> => {\n const sizeRules: ProductionRuleTests<NumericValueRef> = [];\n if (staticPoint) {\n sizeRules.push({\n // if this is a static point, reduce the size since we are increasing the stroke width\n test: staticPointTest(staticPoint),\n value: 64,\n });\n }\n return [...sizeRules, { value: DEFAULT_SYMBOL_SIZE }];\n};\n\n/**\n * gets the stroke width for the highlighted point\n * @param lineMarkOptions\n * @returns stroke width rule\n */\nexport const getHighlightPointStrokeWidth = ({\n staticPoint,\n}: LineMarkOptions): ProductionRuleTests<NumericValueRef> => {\n const strokeWidthRules: ProductionRuleTests<NumericValueRef> = [];\n if (staticPoint) {\n strokeWidthRules.push({\n // if the point is static, increase the stroke width\n test: staticPointTest(staticPoint),\n value: 6,\n });\n }\n return [...strokeWidthRules, { value: DEFAULT_SYMBOL_STROKE_WIDTH }];\n};\n\n/**\n * Gets point that is used for the selection ring.\n * @param lineMarkOptions\n * @returns SymbolMark\n */\nexport const getSelectRingPoint = (lineOptions: LineMarkOptions): SymbolMark => {\n const { colorScheme, dimension, idKey, metric, metricAxis, name, scaleType } = lineOptions;\n const selectedTest = getSelectedTest(name, idKey);\n\n return {\n name: `${name}_pointSelectRing`,\n type: 'symbol',\n from: { data: `${name}_selectedData` },\n interactive: false,\n encode: {\n enter: {\n y: getYProductionRule(metricAxis, metric),\n fill: { signal: BACKGROUND_COLOR },\n stroke: { value: getColorValue('static-blue', colorScheme) },\n },\n update: {\n size: [{ test: selectedTest, value: 196 }, { value: 0 }],\n strokeWidth: [{ test: selectedTest, value: DEFAULT_SYMBOL_STROKE_WIDTH }, { value: 0 }],\n x: getXProductionRule(scaleType, dimension),\n },\n },\n };\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { LineMark, Mark, NumericValueRef, ProductionRule, RuleMark } from 'vega';\n\nimport {\n DEFAULT_INTERACTION_MODE,\n DEFAULT_OPACITY_RULE,\n HIGHLIGHTED_SERIES,\n HIGHLIGHT_CONTRAST_RATIO,\n SELECTED_SERIES,\n SERIES_ID,\n} from '@spectrum-charts/constants';\n\nimport { getPopovers } from '../chartPopover/chartPopoverUtils';\nimport {\n getColorProductionRule,\n getItemHoverArea,\n getLineWidthProductionRule,\n getOpacityProductionRule,\n getPointsForVoronoi,\n getStrokeDashProductionRule,\n getVoronoiPath,\n getXProductionRule,\n getYProductionRule,\n hasPopover,\n} from '../marks/markUtils';\nimport { ScaleType } from '../types';\nimport {\n getHighlightBackgroundPoint,\n getHighlightPoint,\n getSecondaryHighlightPoint,\n getSelectRingPoint,\n getSelectionPoint,\n} from './linePointUtils';\nimport { LineMarkOptions } from './lineUtils';\n\n/**\n * generates a line mark\n * @param lineOptions\n * @param dataSource\n * @returns LineMark\n */\nexport const getLineMark = (lineMarkOptions: LineMarkOptions, dataSource: string): LineMark => {\n const {\n chartPopovers,\n color,\n colorScheme,\n dimension,\n lineType,\n lineWidth,\n metric,\n metricAxis,\n name,\n opacity,\n scaleType,\n } = lineMarkOptions;\n const popovers = getPopovers(chartPopovers ?? [], name);\n const popoverWithDimensionHighlightExists = popovers.some(\n ({ UNSAFE_highlightBy }) => UNSAFE_highlightBy === 'dimension'\n );\n\n return {\n name,\n description: name,\n type: 'line',\n from: { data: dataSource },\n interactive: false,\n encode: {\n enter: {\n y: getYProductionRule(metricAxis, metric),\n stroke: getColorProductionRule(color, colorScheme),\n strokeDash: getStrokeDashProductionRule(lineType),\n strokeOpacity: getOpacityProductionRule(opacity),\n strokeWidth: getLineWidthProductionRule(lineWidth),\n },\n update: {\n // this has to be in update because when you resize the window that doesn't rebuild the spec\n // but it may change the x position if it causes the chart to resize\n x: getXProductionRule(scaleType, dimension),\n ...(popoverWithDimensionHighlightExists ? {} : { opacity: getLineOpacity(lineMarkOptions) }),\n },\n },\n };\n};\n\nexport const getLineOpacity = ({\n displayOnHover,\n interactiveMarkName,\n popoverMarkName,\n isHighlightedByGroup,\n highlightedItem,\n}: LineMarkOptions): ProductionRule<NumericValueRef> => {\n if ((!interactiveMarkName || displayOnHover) && highlightedItem === undefined) return [DEFAULT_OPACITY_RULE];\n const strokeOpacityRules: ProductionRule<NumericValueRef> = [];\n\n if (isHighlightedByGroup) {\n strokeOpacityRules.push({\n test: `indexof(pluck(data('${interactiveMarkName}_highlightedData'), '${SERIES_ID}'), datum.${SERIES_ID}) !== -1`,\n value: 1,\n });\n }\n\n // add a rule that will lower the opacity of the line if there is a hovered series, but this line is not the one hovered\n strokeOpacityRules.push(\n {\n test: `isValid(${HIGHLIGHTED_SERIES}) && ${HIGHLIGHTED_SERIES} !== datum.${SERIES_ID}`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n },\n {\n test: `length(data('${interactiveMarkName}_highlightedData')) > 0 && indexof(pluck(data('${interactiveMarkName}_highlightedData'), '${SERIES_ID}'), datum.${SERIES_ID}) === -1`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n }\n );\n\n if (popoverMarkName) {\n strokeOpacityRules.push({\n test: `isValid(${SELECTED_SERIES}) && ${SELECTED_SERIES} !== datum.${SERIES_ID}`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n });\n }\n // This allows us to only show the metric range when hovering over the parent line component.\n strokeOpacityRules.push(DEFAULT_OPACITY_RULE);\n\n return strokeOpacityRules;\n};\n\n/**\n * All the marks that get displayed when hovering or selecting a point on a line\n * @param lineMarkOptions\n * @param dataSource\n * @param secondaryHighlightedMetric\n * @returns\n */\nexport const getLineHoverMarks = (\n lineOptions: LineMarkOptions,\n dataSource: string,\n secondaryHighlightedMetric?: string\n): Mark[] => {\n const { dimension, name, scaleType } = lineOptions;\n return [\n // vertical rule shown for the hovered or selected point\n getHoverRule(dimension, name, scaleType),\n // point behind the hovered or selected point used to prevent bacgorund elements from being visible through low opacity point\n getHighlightBackgroundPoint(lineOptions),\n // if has popover, add selection ring and selection point\n ...(hasPopover(lineOptions) ? [getSelectRingPoint(lineOptions), getSelectionPoint(lineOptions)] : []),\n // hover or select point\n getHighlightPoint(lineOptions),\n // additional point that gets highlighted like the trendline or raw line point\n ...(secondaryHighlightedMetric ? [getSecondaryHighlightPoint(lineOptions, secondaryHighlightedMetric)] : []),\n // get interactive marks for the line\n ...getInteractiveMarks(dataSource, lineOptions),\n ];\n};\n\nconst getHoverRule = (dimension: string, name: string, scaleType: ScaleType): RuleMark => {\n return {\n name: `${name}_hoverRule`,\n description: `${name}_hoverRule`,\n type: 'rule',\n from: { data: `${name}_highlightedData` },\n interactive: false,\n encode: {\n enter: {\n y: { value: 0 },\n y2: { signal: 'height' },\n strokeWidth: { value: 1 },\n },\n update: {\n x: getXProductionRule(scaleType, dimension),\n opacity: { signal: `length(data('${name}_selectedData')) > 0 ? 0 : 1` },\n },\n },\n };\n};\n\nconst getInteractiveMarks = (dataSource: string, lineOptions: LineMarkOptions): Mark[] => {\n const { interactionMode = DEFAULT_INTERACTION_MODE } = lineOptions;\n\n const tooltipMarks = {\n nearest: getVoronoiMarks,\n item: getItemHoverMarks,\n };\n\n return tooltipMarks[interactionMode](lineOptions, dataSource);\n};\n\nconst getVoronoiMarks = (lineOptions: LineMarkOptions, dataSource: string): Mark[] => {\n const { dimension, metric, metricAxis, name, scaleType } = lineOptions;\n\n return [\n // points used for the voronoi transform\n getPointsForVoronoi(dataSource, dimension, metric, name, scaleType, metricAxis),\n // voronoi transform used to get nearest point paths\n getVoronoiPath(lineOptions, `${name}_pointsForVoronoi`),\n ];\n};\n\nconst getItemHoverMarks = (lineOptions: LineMarkOptions, dataSource: string): Mark[] => {\n const { chartTooltips = [], dimension, metric, metricAxis, name, scaleType } = lineOptions;\n\n return [\n // area around item that triggers hover\n getItemHoverArea(chartTooltips, dataSource, dimension, metric, name, scaleType, metricAxis),\n ];\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { ColorValueRef, GroupMark, NumericValueRef, ProductionRule, RectMark, SymbolMark, TextMark } from 'vega';\n\nimport { TRENDLINE_VALUE } from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { getColorProductionRule, getColorProductionRuleSignalString } from '../marks/markUtils';\nimport { getScaleName } from '../scale/scaleSpecBuilder';\nimport { getLineWidthPixelsFromLineWidth } from '../specUtils';\nimport {\n getEndDimensionExtentProductionRule,\n getStartDimensionExtentProductionRule,\n} from '../trendline/trendlineMarkUtils';\nimport { ColorFacet, TrendlineAnnotationOptions, TrendlineAnnotationSpecOptions, TrendlineSpecOptions } from '../types';\n\n/**\n * Applies all trendline annotation defaults\n * @param trenlineAnnotationOptions\n * @param index\n * @param trendlineOptions\n * @param markName\n * @returns TrendlineAnnotationSpecOptions\n */\nexport const getTrendlineAnnotationSpecOptions = (\n { badge = false, dimensionValue = 'end', numberFormat = '', prefix = '' }: TrendlineAnnotationOptions,\n index: number,\n {\n colorScheme,\n dimensionExtent,\n dimensionScaleType,\n displayOnHover,\n lineWidth,\n orientation,\n trendlineColor,\n trendlineDimension,\n name: trendlineName,\n }: TrendlineSpecOptions,\n markName: string\n): TrendlineAnnotationSpecOptions => ({\n badge,\n colorScheme,\n dimensionValue,\n displayOnHover,\n markName,\n name: `${trendlineName}Annotation${index}`,\n numberFormat,\n prefix,\n trendlineColor,\n trendlineDimension,\n trendlineDimensionExtent: dimensionExtent,\n trendlineDimensionScaleType: dimensionScaleType,\n trendlineName: trendlineName,\n trendlineOrientation: orientation,\n trendlineWidth: getLineWidthPixelsFromLineWidth(lineWidth),\n});\n\n/**\n * Gets all the annotations on a trendline\n * @param trendlineOptions\n * @param markName\n * @returns TrendlineAnnotationSpecOptions[]\n */\nexport const getTrendlineAnnotations = (\n trendlineOptions: TrendlineSpecOptions,\n markName: string\n): TrendlineAnnotationSpecOptions[] => {\n return trendlineOptions.trendlineAnnotations.map((annotationOptions, index) =>\n getTrendlineAnnotationSpecOptions(annotationOptions, index, trendlineOptions, markName)\n );\n};\n\n/**\n * Gets all the trendline annotation marks\n * @param trendlineOptions\n * @param markName\n * @returns GroupMark[]\n */\nexport const getTrendlineAnnotationMarks = (trendlineOptions: TrendlineSpecOptions, markName: string): GroupMark[] => {\n const marks: GroupMark[] = [];\n const annotations = getTrendlineAnnotations(trendlineOptions, markName);\n\n annotations.forEach((annotation) => {\n marks.push({\n name: `${annotation.name}_group`,\n type: 'group',\n interactive: false,\n marks: [\n getTrendlineAnnotationPoints(annotation),\n getTrendlineAnnotationTextMark(annotation),\n ...getTrendlineAnnotationBadgeMark(annotation),\n ],\n });\n });\n return marks;\n};\n\n/**\n * Gets the annotation points\n * @param trendlineAnnotationOptions\n * @returns SymbolMark\n */\nconst getTrendlineAnnotationPoints = (annotationOptions: TrendlineAnnotationSpecOptions): SymbolMark => {\n const { name, trendlineName, trendlineWidth, displayOnHover } = annotationOptions;\n const data = displayOnHover ? `${trendlineName}_highlightedData` : `${trendlineName}_highResolutionData`;\n return {\n name: `${name}_points`,\n type: 'symbol',\n from: { data },\n interactive: false,\n encode: {\n enter: {\n opacity: { value: 0 },\n size: { value: Math.pow(trendlineWidth, 2) },\n x: getTrendlineAnnotationPointX(annotationOptions),\n y: getTrendlineAnnotationPointY(annotationOptions),\n },\n },\n };\n};\n\n/**\n * Gets the correct x rule for the annotation point\n * @param trendlineAnnotationOptions\n * @returns NumericValueRef\n */\nexport const getTrendlineAnnotationPointX = ({\n dimensionValue,\n trendlineDimension,\n trendlineDimensionExtent,\n trendlineDimensionScaleType,\n trendlineOrientation,\n}: TrendlineAnnotationSpecOptions): NumericValueRef => {\n const scale = getScaleName('x', trendlineDimensionScaleType);\n if (trendlineOrientation === 'vertical') {\n return { scale, field: TRENDLINE_VALUE };\n }\n switch (dimensionValue) {\n case 'start':\n return getStartDimensionExtentProductionRule(trendlineDimensionExtent[0], trendlineDimension, scale, 'x');\n case 'end':\n return getEndDimensionExtentProductionRule(trendlineDimensionExtent[1], trendlineDimension, scale, 'x');\n default:\n return { scale, value: dimensionValue };\n }\n};\n\n/**\n * Gets the correct y rule for the annotation point\n * @param trendlineAnnotationOptions\n * @returns NumericValueRef\n */\nexport const getTrendlineAnnotationPointY = ({\n dimensionValue,\n trendlineDimension,\n trendlineDimensionExtent,\n trendlineOrientation,\n}: TrendlineAnnotationSpecOptions): NumericValueRef => {\n const scale = 'yLinear';\n if (trendlineOrientation === 'horizontal') {\n return { scale, field: TRENDLINE_VALUE };\n }\n switch (dimensionValue) {\n case 'start':\n return getStartDimensionExtentProductionRule(trendlineDimensionExtent[0], trendlineDimension, scale, 'y');\n case 'end':\n return getEndDimensionExtentProductionRule(trendlineDimensionExtent[1], trendlineDimension, scale, 'y');\n default:\n return { scale, value: dimensionValue };\n }\n};\n\n/**\n * Gets the annotation text mark\n * @param trendlineAnnotationOptions\n * @returns TextMark\n */\nexport const getTrendlineAnnotationTextMark = (annotation: TrendlineAnnotationSpecOptions): TextMark => {\n const { name, numberFormat, prefix, trendlineName, markName } = annotation;\n const textPrefix = prefix ? `'${prefix} ' + ` : '';\n const fill = getTextFill({ ...annotation });\n return {\n name,\n type: 'text',\n from: { data: `${name}_points` },\n zindex: 1, // this will draw the text in front of the badge\n interactive: false,\n encode: {\n enter: {\n text: { signal: `${textPrefix}format(datum.datum.${TRENDLINE_VALUE}, '${numberFormat}')` },\n fill,\n },\n },\n transform: [\n {\n type: 'label',\n size: { signal: '[width, height]' },\n avoidMarks: [trendlineName, `${markName}_group`],\n offset: [6, 6, 6, 6, 8.49, 8.49, 8.49, 8.49],\n anchor: ['top', 'bottom', 'right', 'left', 'top-right', 'top-left', 'bottom-right', 'bottom-left'],\n },\n ],\n };\n};\n\n/**\n * Get's the encoding for the annotation text fill.\n * Includes a color contrast check to ensure the text is visually a11y.\n * @param trendlineAnnotationOptions\n * @returns fill ProductionRule\n */\nexport const getTextFill = ({\n badge,\n colorScheme,\n trendlineColor,\n}: TrendlineAnnotationSpecOptions): ProductionRule<ColorValueRef> | undefined => {\n if (!badge) {\n // by returning undefined, the rsc config will be used\n return undefined;\n }\n const color = getColorKey(trendlineColor);\n const colorString = getColorProductionRuleSignalString(color, colorScheme);\n const textColors = [getColorValue('gray-50', colorScheme), getColorValue('gray-900', colorScheme)];\n return [\n { test: `contrast(${colorString}, '${textColors[0]}') >= 4.5`, value: textColors[0] },\n { value: textColors[1] },\n ];\n};\n\nexport const getTrendlineAnnotationBadgeMark = ({\n badge,\n colorScheme,\n name,\n trendlineColor,\n}: TrendlineAnnotationSpecOptions): RectMark[] => {\n if (!badge) {\n return [];\n }\n const color = getColorKey(trendlineColor, 2);\n return [\n {\n name: `${name}_badge`,\n description: `${name}_badge`,\n type: 'rect',\n from: { data: `${name}` },\n interactive: false,\n encode: {\n enter: {\n cornerRadius: { value: 2 },\n fill: getColorProductionRule(color, colorScheme),\n opacity: { field: 'opacity' },\n x: { signal: 'datum.bounds.x1 - 3' },\n x2: { signal: 'datum.bounds.x2 + 3' },\n y: { signal: 'datum.bounds.y1 - 3' },\n y2: { signal: 'datum.bounds.y2 + 3' },\n },\n },\n },\n ];\n};\n\n/**\n * Gets the key used for color.\n * Since some of the marks base their data off of previous marks, the datum might be nested.\n * @param trendlineColor\n * @param datumOrder how many levels deep the datum is (ex. 1 becomes datum.color, 2 becomes datum.datum.color, etc.)\n * @returns\n */\nexport const getColorKey = (trendlineColor: ColorFacet, datumOrder: number = 1): ColorFacet => {\n if (typeof trendlineColor === 'string') {\n return `${new Array(datumOrder).fill('datum.').join('')}${trendlineColor}`;\n }\n return trendlineColor;\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { EncodeEntry, GroupMark, LineMark, NumericValueRef, RuleMark } from 'vega';\n\nimport { TRENDLINE_VALUE } from '@spectrum-charts/constants';\n\nimport { getLineHoverMarks, getLineOpacity } from '../line/lineMarkUtils';\nimport { LineMarkOptions } from '../line/lineUtils';\nimport {\n getColorProductionRule,\n getLineWidthProductionRule,\n getOpacityProductionRule,\n getStrokeDashProductionRule,\n hasTooltip,\n} from '../marks/markUtils';\nimport { getScaleName } from '../scale/scaleSpecBuilder';\nimport { getFacetsFromOptions } from '../specUtils';\nimport { getTrendlineAnnotationMarks } from '../trendlineAnnotation';\nimport { Orientation, ScaleType, TrendlineMethod, TrendlineSpecOptions } from '../types';\nimport {\n TrendlineParentOptions,\n getTrendlineColorFromMarkOptions,\n getTrendlineLineTypeFromMarkOptions,\n getTrendlines,\n isAggregateMethod,\n isRegressionMethod,\n} from './trendlineUtils';\n\nexport const getTrendlineMarks = (markOptions: TrendlineParentOptions): (GroupMark | RuleMark)[] => {\n const { color, lineType } = markOptions;\n const { facets } = getFacetsFromOptions({ color, lineType });\n\n const marks: (GroupMark | RuleMark)[] = [];\n const trendlines = getTrendlines(markOptions);\n for (const trendlineOptions of trendlines) {\n const { displayOnHover, method, name } = trendlineOptions;\n if (isAggregateMethod(method)) {\n marks.push(getTrendlineRuleMark(markOptions, trendlineOptions));\n } else {\n const data = getDataSourceName(name, method, displayOnHover);\n marks.push({\n name: `${name}_group`,\n type: 'group',\n clip: true,\n from: {\n facet: {\n name: `${name}_facet`,\n data,\n groupby: facets,\n },\n },\n marks: [getTrendlineLineMark(markOptions, trendlineOptions)],\n });\n }\n marks.push(...getTrendlineAnnotationMarks(trendlineOptions, markOptions.name));\n }\n\n if (trendlines.some((trendline) => hasTooltip(trendline))) {\n marks.push(\n getTrendlineHoverMarks(\n markOptions,\n trendlines.some((trendlineOptions) => trendlineOptions.highlightRawPoint)\n )\n );\n }\n\n return marks;\n};\n\nconst getDataSourceName = (trendlineName: string, method: TrendlineMethod, displayOnHover: boolean): string => {\n if (displayOnHover) return `${trendlineName}_highlightedData`;\n if (isRegressionMethod(method)) return `${trendlineName}_highResolutionData`;\n return `${trendlineName}_data`;\n};\n\n/**\n * gets the trendline rule mark used for aggregate methods (mean, median)\n * @param markOptions\n * @param trendlineOptions\n * @returns rule mark\n */\nexport const getTrendlineRuleMark = (\n markOptions: TrendlineParentOptions,\n trendlineOptions: TrendlineSpecOptions\n): RuleMark => {\n const { colorScheme } = markOptions;\n const {\n dimensionExtent,\n dimensionScaleType,\n displayOnHover,\n lineType,\n lineWidth,\n name,\n orientation,\n trendlineColor,\n trendlineDimension,\n } = trendlineOptions;\n\n const data = displayOnHover ? `${name}_highlightedData` : `${name}_highResolutionData`;\n\n return {\n name,\n type: 'rule',\n clip: true,\n from: {\n data,\n },\n interactive: false,\n encode: {\n enter: {\n ...getRuleYEncodings(dimensionExtent, trendlineDimension, orientation),\n stroke: getColorProductionRule(trendlineColor, colorScheme),\n strokeDash: getStrokeDashProductionRule({ value: lineType }),\n strokeOpacity: getOpacityProductionRule({ value: trendlineOptions.opacity }),\n strokeWidth: getLineWidthProductionRule({ value: lineWidth }),\n },\n update: {\n ...getRuleXEncodings(dimensionExtent, trendlineDimension, dimensionScaleType, orientation),\n opacity: getLineOpacity(getLineMarkOptions(markOptions, trendlineOptions)),\n },\n },\n };\n};\n\n/**\n * gets the production rules for the y and y2 encoding of a rule mark\n * @param dimensionExtent\n * @param dimension\n * @param orientation\n * @returns x production rules\n */\nexport const getRuleYEncodings = (\n dimensionExtent: TrendlineSpecOptions['dimensionExtent'],\n dimension: string,\n orientation: Orientation\n): EncodeEntry => {\n if (orientation === 'horizontal') {\n return { y: { scale: 'yLinear', field: TRENDLINE_VALUE } };\n }\n return {\n y: getStartDimensionExtentProductionRule(dimensionExtent[0], dimension, 'yLinear', 'y'),\n y2: getEndDimensionExtentProductionRule(dimensionExtent[1], dimension, 'yLinear', 'y'),\n };\n};\n\n/**\n * gets the production rules for the x and x2 encoding of a rule mark\n * @param dimensionExtent\n * @param dimension\n * @param scaleType\n * @param orientation\n * @returns x production rules\n */\nexport const getRuleXEncodings = (\n dimensionExtent: TrendlineSpecOptions['dimensionExtent'],\n dimension: string,\n scaleType: ScaleType,\n orientation: Orientation\n): EncodeEntry => {\n const scale = getScaleName('x', scaleType);\n if (orientation === 'vertical') {\n return { x: { scale, field: TRENDLINE_VALUE } };\n }\n return {\n x: getStartDimensionExtentProductionRule(dimensionExtent[0], dimension, scale, 'x'),\n x2: getEndDimensionExtentProductionRule(dimensionExtent[1], dimension, scale, 'x'),\n };\n};\n\n/**\n * Gets the production rule for the start dimension extent of a trendline\n * @param startDimensionExtent\n * @param dimension\n * @param scale\n * @param axis\n * @returns\n */\nexport const getStartDimensionExtentProductionRule = (\n startDimensionExtent: number | 'domain' | null,\n dimension: string,\n scale: string,\n axis: 'x' | 'y'\n): NumericValueRef => {\n switch (startDimensionExtent) {\n case null:\n return { scale, field: `${dimension}Min` };\n case 'domain':\n if (axis === 'x') return { value: 0 };\n return { signal: 'height' };\n default:\n return { scale, value: startDimensionExtent };\n }\n};\n\n/**\n * gets the production rule for the end dimension extent of a trendline\n * @param endDimensionExtent\n * @param dimension\n * @param scale\n * @param axis\n * @returns\n */\nexport const getEndDimensionExtentProductionRule = (\n endDimensionExtent: number | 'domain' | null,\n dimension: string,\n scale: string,\n axis: 'x' | 'y'\n): NumericValueRef => {\n switch (endDimensionExtent) {\n case null:\n return { scale, field: `${dimension}Max` };\n case 'domain':\n if (axis === 'x') return { signal: 'width' };\n return { value: 0 };\n default:\n return { scale, value: endDimensionExtent };\n }\n};\n\n/**\n * gets the trendline line mark used for regression and window methods\n * @param markOptions\n * @param trendlineOptions\n * @returns\n */\nexport const getTrendlineLineMark = (\n markOptions: TrendlineParentOptions,\n trendlineOptions: TrendlineSpecOptions\n): LineMark => {\n const { colorScheme } = markOptions;\n const {\n dimensionScaleType,\n isDimensionNormalized,\n lineType,\n lineWidth,\n name,\n orientation,\n trendlineColor,\n trendlineDimension,\n } = trendlineOptions;\n\n return {\n name,\n type: 'line',\n from: { data: `${name}_facet` },\n interactive: false,\n encode: {\n enter: {\n y: getLineYProductionRule(trendlineDimension, orientation),\n stroke: getColorProductionRule(trendlineColor, colorScheme),\n strokeDash: getStrokeDashProductionRule({ value: lineType }),\n strokeOpacity: getOpacityProductionRule({ value: trendlineOptions.opacity }),\n strokeWidth: getLineWidthProductionRule({ value: lineWidth }),\n },\n update: {\n x: getLineXProductionRule(trendlineDimension, dimensionScaleType, orientation, isDimensionNormalized),\n opacity: getLineOpacity(getLineMarkOptions(markOptions, trendlineOptions)),\n },\n },\n };\n};\n\n/**\n * gets the production rule for the y encoding of a line mark\n * @param trendlineDimension\n * @param orientation\n * @returns\n */\nexport const getLineYProductionRule = (trendlineDimension: string, orientation: Orientation): NumericValueRef => {\n const scale = 'yLinear';\n if (orientation === 'horizontal') {\n return { scale, field: TRENDLINE_VALUE };\n }\n return { scale, field: trendlineDimension };\n};\n\n/**\n * gets the production rule for the x encoding of a line mark\n * @param trendlineDimension\n * @param scaleType\n * @param orientation\n * @param isDimensionNormalized\n * @returns\n */\nexport const getLineXProductionRule = (\n trendlineDimension: string,\n scaleType: ScaleType,\n orientation: Orientation,\n isDimensionNormalized: boolean\n): NumericValueRef => {\n const scale = getScaleName('x', scaleType);\n if (orientation === 'vertical') {\n return { scale, field: TRENDLINE_VALUE };\n }\n return isDimensionNormalized\n ? { scale: 'xTrendline', field: trendlineDimension }\n : { scale, field: trendlineDimension };\n};\n\nconst getTrendlineHoverMarks = (markOptions: TrendlineParentOptions, highlightRawPoint: boolean): GroupMark => {\n const { metric, name } = markOptions;\n const trendlines = getTrendlines(markOptions);\n const trendlineHoverOptions = getLineMarkOptions(markOptions, trendlines[0], {\n name: `${name}Trendline`,\n chartTooltips: trendlines.map((trendline) => trendline.chartTooltips).flat(),\n metric: TRENDLINE_VALUE,\n });\n\n return {\n name: `${name}Trendline_hoverGroup`,\n type: 'group',\n clip: true,\n marks: getLineHoverMarks(trendlineHoverOptions, `${name}_allTrendlineData`, highlightRawPoint ? metric : undefined),\n };\n};\n\nconst getLineMarkOptions = (\n markOptions: TrendlineParentOptions,\n { dimensionScaleType, displayOnHover, lineWidth, metric, name, opacity }: TrendlineSpecOptions,\n override?: Partial<LineMarkOptions>\n): LineMarkOptions => {\n const { color, lineType } = markOptions;\n const popoverMarkName = 'popoverMarkName' in markOptions ? markOptions.popoverMarkName : undefined;\n const staticPoint = 'staticPoint' in markOptions ? markOptions.staticPoint : undefined;\n return {\n ...markOptions,\n color: getTrendlineColorFromMarkOptions(color),\n displayOnHover,\n lineType: getTrendlineLineTypeFromMarkOptions(lineType),\n lineWidth: { value: lineWidth },\n metric,\n name,\n opacity: { value: opacity },\n popoverMarkName,\n scaleType: dimensionScaleType,\n staticPoint,\n\n ...override,\n };\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Scale } from 'vega';\n\nimport { FILTERED_TABLE, LINEAR_PADDING } from '@spectrum-charts/constants';\n\nimport { TrendlineParentOptions, hasTrendlineWithNormalizedDimension } from './trendlineUtils';\n\n/**\n * Gets all the scales used for trendlines\n * @param options\n * @returns Scale[]\n */\nexport const getTrendlineScales = (options: TrendlineParentOptions): Scale[] => {\n const { dimension } = options;\n\n // if there is a trendline that requires a normalized dimension, add the scale\n if (hasTrendlineWithNormalizedDimension(options)) {\n return [\n {\n name: 'xTrendline',\n type: 'linear',\n range: 'width',\n domain: { data: FILTERED_TABLE, fields: [`${dimension}Normalized`] },\n padding: LINEAR_PADDING,\n zero: false,\n nice: false,\n },\n ];\n }\n return [];\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Signal } from 'vega';\n\nimport { hasTooltip } from '../marks/markUtils';\nimport { addHighlightedItemSignalEvents, addHighlightedSeriesSignalEvents } from '../signal/signalSpecBuilder';\nimport { TrendlineParentOptions, getTrendlines } from './trendlineUtils';\n\nexport const setTrendlineSignals = (signals: Signal[], markOptions: TrendlineParentOptions): void => {\n const { idKey, name: markName } = markOptions;\n const trendlines = getTrendlines(markOptions);\n\n if (trendlines.some((trendline) => hasTooltip(trendline))) {\n addHighlightedItemSignalEvents(signals, `${markName}Trendline_voronoi`, idKey, 2);\n addHighlightedSeriesSignalEvents(signals, `${markName}Trendline_voronoi`, 2);\n }\n\n if (trendlines.some((trendline) => trendline.displayOnHover)) {\n addHighlightedSeriesSignalEvents(signals, `${markName}_voronoi`, 2);\n }\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { GroupMark, Mark, Scale } from 'vega';\n\nimport { FILTERED_TABLE } from '@spectrum-charts/constants';\n\nimport { addDomainFields, getScaleIndexByName } from '../scale/scaleSpecBuilder';\nimport { BarSpecOptions } from '../types';\nimport { getDodgedDimensionEncodings, getTrellisedDimensionEncodings, isDodgedAndStacked } from './barUtils';\n\n/**\n * Generates the trellis group mark\n * @param options\n * @param marks visualization marks (bar, line, etc)\n * @param repeatedScale this is the scale that is repeated for each trellis, for example: y scale for vertical trellis, x scale for horizontal trellis\n * @returns\n */\nexport const getTrellisGroupMark = (options: BarSpecOptions, marks: Mark[], repeatedScale: Scale): GroupMark => {\n const { trellisOrientation } = options;\n const trellis = options.trellis as string;\n const {\n markName,\n facetName,\n scaleName,\n axis: trellisAxis,\n rangeScale: trellisRangeScale,\n } = getTrellisProperties(options);\n\n return {\n name: markName,\n type: 'group',\n\n // Define data source for this trellis\n from: {\n facet: {\n data: FILTERED_TABLE,\n name: facetName,\n groupby: trellis,\n },\n },\n\n // Override the default 'height' or 'width' signal with the trellis scale bandwidth\n signals: [{ name: trellisRangeScale, update: `bandwidth('${scaleName}')` }],\n\n // Encode the trellis on its axis\n encode: {\n enter: {\n [trellisAxis]: { scale: scaleName, field: trellis },\n height: { signal: trellisOrientation === 'vertical' ? `bandwidth('${scaleName}')` : 'height' },\n width: { signal: trellisOrientation === 'horizontal' ? `bandwidth('${scaleName}')` : 'width' },\n },\n },\n\n scales: [repeatedScale],\n marks,\n };\n};\n\nexport const addTrellisScale = (scales: Scale[], options: BarSpecOptions) => {\n if (!options.trellis) {\n return;\n }\n const { scaleName, rangeScale, paddingInner } = getTrellisProperties(options);\n const trellisScaleIndex = getScaleIndexByName(scales, scaleName, 'band');\n scales[trellisScaleIndex] = addDomainFields(scales[trellisScaleIndex], [options.trellis]);\n scales[trellisScaleIndex] = {\n ...scales[trellisScaleIndex],\n range: rangeScale,\n paddingInner,\n } as Scale;\n};\n\nexport const getTrellisedEncodeEntries = (options: BarSpecOptions) => {\n if (options.type === 'dodged' || isDodgedAndStacked(options)) {\n return getDodgedDimensionEncodings(options);\n }\n\n return getTrellisedDimensionEncodings(options);\n};\n\nexport interface BarTrellisProperties {\n facetName: string;\n scaleName: 'xTrellisBand' | 'yTrellisBand';\n markName: 'xTrellisGroup' | 'yTrellisGroup';\n rangeScale: 'width' | 'height';\n axis: 'x' | 'y';\n paddingInner: number;\n}\n\nexport const getTrellisProperties = ({\n trellisOrientation,\n name,\n trellisPadding,\n}: BarSpecOptions): BarTrellisProperties => {\n const axis = trellisOrientation === 'horizontal' ? 'x' : 'y';\n\n return {\n facetName: `${name}_trellis`,\n scaleName: `${axis}TrellisBand`,\n markName: `${axis}TrellisGroup`,\n rangeScale: axis === 'x' ? 'width' : 'height',\n axis,\n paddingInner: trellisPadding,\n };\n};\n\nexport const isTrellised = (options: BarSpecOptions) => Boolean(options.trellis);\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {\n ArrayValueRef,\n ColorValueRef,\n EncodeEntry,\n GroupMark,\n NumericValueRef,\n ProductionRule,\n RectEncodeEntry,\n RectMark,\n} from 'vega';\n\nimport {\n CORNER_RADIUS,\n FILTERED_TABLE,\n LAST_RSC_SERIES_ID,\n SELECTED_GROUP,\n SELECTED_ITEM,\n SERIES_ID,\n STACK_ID,\n} from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { getPopovers } from '../chartPopover/chartPopoverUtils';\nimport {\n getColorProductionRule,\n getCursor,\n getMarkOpacity,\n getOpacityProductionRule,\n getStrokeDashProductionRule,\n getTooltip,\n hasPopover,\n} from '../marks/markUtils';\nimport { getBandPadding } from '../scale/scaleSpecBuilder';\nimport { getLineWidthPixelsFromLineWidth } from '../specUtils';\nimport { BarSpecOptions, Orientation } from '../types';\nimport { getTrellisProperties, isTrellised } from './trellisedBarUtils';\n\n/**\n * checks to see if the bar is faceted in the stacked and dodged dimensions\n * @param color\n */\nexport const isDodgedAndStacked = ({ color, lineType, opacity }: BarSpecOptions): boolean => {\n return [color, lineType, opacity].some((facet) => Array.isArray(facet) && facet.length === 2);\n};\n\n/**\n * Checks if the bar chart is a dual metric axis chart\n * @param options - The bar chart options\n * @returns True if the bar chart is a dual metric axis chart, false otherwise\n */\nexport const isDualMetricAxis = (options: BarSpecOptions) => {\n const { dualMetricAxis, type } = options;\n return Boolean(dualMetricAxis && !isTrellised(options) && type === 'dodged' && !isDodgedAndStacked(options));\n};\n\nexport const getDodgedGroupMark = (options: BarSpecOptions): GroupMark => {\n const { dimension, groupedPadding, orientation, name, paddingRatio } = options;\n\n const { dimensionScaleKey, dimensionAxis, rangeScale } = getOrientationProperties(orientation);\n\n return {\n name: `${name}_group`,\n type: 'group',\n from: {\n facet: {\n data: isTrellised(options) ? getTrellisProperties(options).facetName : FILTERED_TABLE,\n name: `${name}_facet`,\n groupby: dimension,\n },\n },\n encode: {\n enter: {\n [dimensionAxis]: {\n scale: dimensionScaleKey,\n field: dimension,\n },\n },\n },\n signals: [{ name: rangeScale, update: `bandwidth(\"${dimensionScaleKey}\")` }],\n scales: [\n {\n name: `${name}_position`,\n type: 'band',\n range: rangeScale,\n // want to reference the FILTERED_TABLE and not the facet table because we want the bar widths and positioning to be consistent across facets\n // if we don't do this, the bar widths could be different for the different groups if one of the groups is missing a value\n domain: { data: FILTERED_TABLE, field: `${name}_dodgeGroup` },\n paddingInner: groupedPadding ?? paddingRatio,\n },\n ],\n };\n};\n\nexport const getDodgedDimensionEncodings = (options: BarSpecOptions): RectEncodeEntry => {\n const { dimensionAxis, rangeScale } = getOrientationProperties(options.orientation);\n\n const scale = `${options.name}_position`;\n const field = `${options.name}_dodgeGroup`;\n\n return {\n [dimensionAxis]: { scale, field },\n [rangeScale]: { scale, band: 1 },\n };\n};\n\nexport const getTrellisedDimensionEncodings = (options: BarSpecOptions): RectEncodeEntry => {\n const { dimensionAxis, rangeScale, dimensionScaleKey } = getOrientationProperties(options.orientation);\n\n return {\n [dimensionAxis]: { scale: dimensionScaleKey, field: options.dimension },\n [rangeScale]: { scale: dimensionScaleKey, band: 1 },\n };\n};\n\nexport const getMetricEncodings = (options: BarSpecOptions): RectEncodeEntry => {\n const { metric, type } = options;\n const { metricAxis: startKey, metricScaleKey: scaleKey } = getOrientationProperties(\n options.orientation,\n options.metricAxis\n );\n const endKey = `${startKey}2`;\n\n if (type === 'stacked' || isDodgedAndStacked(options)) {\n return getStackedMetricEncodings(options);\n }\n\n if (isDualMetricAxis(options)) {\n return {\n [startKey]: [\n {\n test: `datum.${SERIES_ID} === ${LAST_RSC_SERIES_ID}`,\n scale: `${scaleKey}Secondary`,\n value: 0,\n },\n {\n scale: `${scaleKey}Primary`,\n value: 0,\n },\n ],\n [endKey]: [\n {\n test: `datum.${SERIES_ID} === ${LAST_RSC_SERIES_ID}`,\n scale: `${scaleKey}Secondary`,\n field: metric,\n },\n {\n scale: `${scaleKey}Primary`,\n field: metric,\n },\n ],\n };\n }\n\n return {\n [startKey]: { scale: scaleKey, value: 0 },\n [endKey]: { scale: scaleKey, field: metric },\n };\n};\n\nexport const getStackedMetricEncodings = (options: BarSpecOptions): RectEncodeEntry => {\n const { metric, orientation } = options;\n const { metricAxis: startKey, metricScaleKey: scaleKey } = getOrientationProperties(\n options.orientation,\n options.metricAxis\n );\n const endKey = `${startKey}2`;\n\n const startValue = `datum.${metric}0`;\n const endValue = `datum.${metric}1`;\n\n const pixelGapBetweenBars = 1.5;\n\n if (orientation === 'vertical') {\n return {\n [startKey]: [\n // if the bar starts at 0, no need to calculate any shifts\n { test: `${startValue} === 0`, signal: `scale('${scaleKey}', ${startValue})` },\n // if the bar is positive, shift the start up by 1.5px gap\n {\n test: `${endValue} > 0`,\n signal: `max(scale('${scaleKey}', ${startValue}) - ${pixelGapBetweenBars}, scale('${scaleKey}', ${endValue}))`,\n },\n // if the bar is negative, shift the start down by 1.5px gap\n {\n signal: `min(scale('${scaleKey}', ${startValue}) + ${pixelGapBetweenBars}, scale('${scaleKey}', ${endValue}))`,\n },\n ],\n [endKey]: { scale: scaleKey, field: `${metric}1` },\n };\n }\n\n return {\n [startKey]: [\n // if the bar starts at 0, no need to calculate any shifts\n { test: `${startValue} === 0`, signal: `scale('${scaleKey}', ${startValue})` },\n // if the bar is positive, shift the start right by 1.5px gap\n {\n test: `${endValue} > 0`,\n signal: `min(scale('${scaleKey}', ${startValue}) + ${pixelGapBetweenBars}, scale('${scaleKey}', ${endValue}))`,\n },\n // if the bar is negative, shift the start left by 1.5px gap\n {\n signal: `max(scale('${scaleKey}', ${startValue}) - ${pixelGapBetweenBars}, scale('${scaleKey}', ${endValue}))`,\n },\n ],\n [endKey]: { scale: scaleKey, field: `${metric}1` },\n };\n};\n\nexport const getCornerRadiusEncodings = (options: BarSpecOptions): RectEncodeEntry => {\n const { type, lineWidth, metric, hasSquareCorners } = options;\n const value = hasSquareCorners ? 0 : Math.max(1, CORNER_RADIUS - getLineWidthPixelsFromLineWidth(lineWidth) / 2);\n\n let rectEncodeEntry: RectEncodeEntry;\n\n if (type === 'dodged' && !isDodgedAndStacked(options)) {\n rectEncodeEntry = {\n cornerRadiusTopLeft: [{ test: `datum.${metric} > 0`, value }, { value: 0 }],\n cornerRadiusTopRight: [{ test: `datum.${metric} > 0`, value }, { value: 0 }],\n cornerRadiusBottomLeft: [{ test: `datum.${metric} < 0`, value }, { value: 0 }],\n cornerRadiusBottomRight: [{ test: `datum.${metric} < 0`, value }, { value: 0 }],\n };\n } else {\n rectEncodeEntry = getStackedCornerRadiusEncodings(options);\n }\n\n return rotateRectClockwiseIfNeeded(rectEncodeEntry, options);\n};\n\nexport const getStackedCornerRadiusEncodings = ({\n name,\n metric,\n lineWidth,\n hasSquareCorners,\n}: BarSpecOptions): RectEncodeEntry => {\n const topTestString = `datum.${metric}1 > 0 && data('${name}_stacks')[indexof(pluck(data('${name}_stacks'), '${STACK_ID}'), datum.${STACK_ID})].max_${metric}1 === datum.${metric}1`;\n const bottomTestString = `datum.${metric}1 < 0 && data('${name}_stacks')[indexof(pluck(data('${name}_stacks'), '${STACK_ID}'), datum.${STACK_ID})].min_${metric}1 === datum.${metric}1`;\n const value = hasSquareCorners ? 0 : Math.max(1, CORNER_RADIUS - getLineWidthPixelsFromLineWidth(lineWidth) / 2);\n\n return {\n cornerRadiusTopLeft: [{ test: topTestString, value }, { value: 0 }],\n cornerRadiusTopRight: [{ test: topTestString, value }, { value: 0 }],\n cornerRadiusBottomLeft: [{ test: bottomTestString, value }, { value: 0 }],\n cornerRadiusBottomRight: [{ test: bottomTestString, value }, { value: 0 }],\n };\n};\n\nexport const rotateRectClockwiseIfNeeded = (\n rectEncodeEntry: RectEncodeEntry,\n { orientation }: BarSpecOptions\n): RectEncodeEntry => {\n if (orientation === 'vertical') return rectEncodeEntry;\n return {\n cornerRadiusTopLeft: rectEncodeEntry.cornerRadiusBottomLeft,\n cornerRadiusTopRight: rectEncodeEntry.cornerRadiusTopLeft,\n cornerRadiusBottomLeft: rectEncodeEntry.cornerRadiusBottomRight,\n cornerRadiusBottomRight: rectEncodeEntry.cornerRadiusTopRight,\n };\n};\n\nexport const getBaseBarEnterEncodings = (options: BarSpecOptions): EncodeEntry => ({\n ...getMetricEncodings(options),\n ...getCornerRadiusEncodings(options),\n});\n\nexport const getBarEnterEncodings = ({\n chartTooltips,\n color,\n colorScheme,\n name,\n opacity,\n}: BarSpecOptions): EncodeEntry => ({\n fill: getColorProductionRule(color, colorScheme),\n fillOpacity: getOpacityProductionRule(opacity),\n tooltip: getTooltip(chartTooltips, name),\n});\n\nexport const getBarUpdateEncodings = (options: BarSpecOptions): EncodeEntry => ({\n cursor: getCursor(options.chartPopovers, options.hasOnClick),\n opacity: getMarkOpacity(options),\n stroke: getStroke(options),\n strokeDash: getStrokeDash(options),\n strokeWidth: getStrokeWidth(options),\n});\n\nexport const getStroke = ({\n name,\n chartPopovers,\n color,\n colorScheme,\n idKey,\n}: BarSpecOptions): ProductionRule<ColorValueRef> => {\n const defaultProductionRule = getColorProductionRule(color, colorScheme);\n if (!hasPopover({ chartPopovers })) {\n return [defaultProductionRule];\n }\n\n return [\n {\n test: `(${SELECTED_ITEM} && ${SELECTED_ITEM} === datum.${idKey}) || (${SELECTED_GROUP} && ${SELECTED_GROUP} === datum.${name}_selectedGroupId)`,\n value: getColorValue('static-blue', colorScheme),\n },\n defaultProductionRule,\n ];\n};\n\nexport const getDimensionSelectionRing = (options: BarSpecOptions): RectMark => {\n const { name, colorScheme, paddingRatio, orientation } = options;\n\n const update =\n orientation === 'vertical'\n ? {\n y: { value: 0 },\n y2: { signal: 'height' },\n xc: { signal: `scale('xBand', datum.${name}_selectedGroupId) + bandwidth('xBand')/2` },\n width: { signal: `bandwidth('xBand')/(1 - ${paddingRatio} / 2)` },\n }\n : {\n x: { value: 0 },\n x2: { signal: 'width' },\n yc: { signal: `scale('yBand', datum.${name}_selectedGroupId) + bandwidth('yBand')/2` },\n height: { signal: `bandwidth('yBand')/(1 - ${paddingRatio} / 2)` },\n };\n\n return {\n name: `${name}_selectionRing`,\n type: 'rect',\n from: {\n data: `${name}_selectedData`,\n },\n interactive: false,\n encode: {\n enter: {\n fill: { value: 'transparent' },\n strokeWidth: { value: 2 },\n stroke: { value: getColorValue('static-blue', colorScheme) },\n cornerRadius: { value: 6 },\n },\n update,\n },\n };\n};\n\nexport const getStrokeDash = ({ chartPopovers, idKey, lineType }: BarSpecOptions): ProductionRule<ArrayValueRef> => {\n const defaultProductionRule = getStrokeDashProductionRule(lineType);\n if (!hasPopover({ chartPopovers })) {\n return [defaultProductionRule];\n }\n\n return [\n { test: `isValid(${SELECTED_ITEM}) && ${SELECTED_ITEM} === datum.${idKey}`, value: [] },\n defaultProductionRule,\n ];\n};\n\nexport const getStrokeWidth = ({\n chartPopovers,\n idKey,\n lineWidth,\n name,\n}: BarSpecOptions): ProductionRule<NumericValueRef> => {\n const lineWidthValue = getLineWidthPixelsFromLineWidth(lineWidth);\n const defaultProductionRule = { value: lineWidthValue };\n const popovers = getPopovers(chartPopovers, name);\n const popoverWithDimensionHighlightExists = popovers.some(\n ({ UNSAFE_highlightBy }) => UNSAFE_highlightBy === 'dimension'\n );\n\n if (popovers.length === 0 || popoverWithDimensionHighlightExists) {\n return [defaultProductionRule];\n }\n\n return [\n {\n test: `(isValid(${SELECTED_ITEM}) && ${SELECTED_ITEM} === datum.${idKey}) || (isValid(${SELECTED_GROUP}) && ${SELECTED_GROUP} === datum.${name}_selectedGroupId)`,\n value: Math.max(lineWidthValue, 2),\n },\n defaultProductionRule,\n ];\n};\n\nexport const getBarPadding = (paddingRatio: number, paddingOuter?: number) => {\n return getBandPadding(paddingRatio, paddingOuter);\n};\n\nexport const getScaleValues = (options: BarSpecOptions) => {\n return options.type === 'stacked' || isDodgedAndStacked(options) ? [`${options.metric}1`] : [options.metric];\n};\n\nexport interface BarOrientationProperties {\n metricAxis: 'x' | 'y';\n dimensionAxis: 'x' | 'y';\n metricScaleKey: string;\n dimensionScaleKey: 'xBand' | 'yBand';\n rangeScale: 'width' | 'height';\n}\n\nexport const getOrientationProperties = (orientation: Orientation, scaleName?: string): BarOrientationProperties =>\n orientation === 'vertical'\n ? {\n metricAxis: 'y',\n dimensionAxis: 'x',\n metricScaleKey: scaleName || 'yLinear',\n dimensionScaleKey: 'xBand',\n rangeScale: 'width',\n }\n : {\n metricAxis: 'x',\n dimensionAxis: 'y',\n metricScaleKey: scaleName || 'xLinear',\n dimensionScaleKey: 'yBand',\n rangeScale: 'height',\n };\n\nexport const getBaseScaleName = (options: BarSpecOptions) => {\n const { metricAxis, orientation } = options;\n const { metricScaleKey } = getOrientationProperties(orientation);\n return metricAxis || metricScaleKey;\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { GroupMark, NumericValueRef, ProductionRule, RectEncodeEntry, RectMark, TextMark } from 'vega';\n\nimport {\n ANNOTATION_FONT_SIZE,\n ANNOTATION_FONT_WEIGHT,\n ANNOTATION_PADDING,\n BACKGROUND_COLOR,\n} from '@spectrum-charts/constants';\n\nimport {\n BarAnnotationOptions,\n BarAnnotationSpecOptions,\n BarAnnotationStyleOptions,\n BarSpecOptions,\n Orientation,\n} from '../types';\nimport { getOrientationProperties, isDodgedAndStacked } from './barUtils';\n\ntype AnnotationWidth = { value: number } | { signal: string };\n\n/**\n * Gets the Annotation component from the children if one exists and applies default options, returning the BarAnnotationSpecOptions\n * @param barOptions\n * @returns BarAnnotationSpecOptions | undefined\n */\nconst getAnnotation = (\n options: BarSpecOptions,\n dataName: string,\n dimensionScaleName: string,\n dimensionField: string\n): BarAnnotationSpecOptions | undefined => {\n const annotation = options.barAnnotations[0];\n\n if (!annotation) {\n return;\n }\n return applyAnnotationPropDefaults(annotation, options, dataName, dimensionScaleName, dimensionField);\n};\n\n/**\n * Applies all default options, converting BarAnnotationOptions into BarAnnotationSpecOptions\n * @param annotationOptions\n * @param barOptions\n * @returns BarAnnotationSpecOptions\n */\nconst applyAnnotationPropDefaults = (\n { textKey, ...options }: BarAnnotationOptions,\n barOptions: BarSpecOptions,\n dataName: string,\n dimensionScaleName: string,\n dimensionField: string\n): BarAnnotationSpecOptions => ({\n barOptions,\n textKey: textKey || barOptions.metric,\n dataName,\n dimensionScaleName,\n dimensionField,\n ...options,\n});\n\n/**\n * Gets the annotation marks for the bar chart. Returns an empty array if no annotation is provided on the bar children.\n * @param barOptions\n * @param dataName\n * @param dimensionScaleName\n * @param dimensionName\n * @returns GroupMark[]\n */\nexport const getAnnotationMarks = (\n barOptions: BarSpecOptions,\n\n // These have to be local fields because it could be used in a group,\n // in which case we don't want to use the \"global\" (full table) values.\n dataName: string,\n dimensionScaleName: string,\n dimensionName: string\n): GroupMark[] => {\n const annotationOptions = getAnnotation(barOptions, dataName, dimensionScaleName, dimensionName);\n if (!annotationOptions) {\n return [];\n }\n\n return [\n {\n type: 'group',\n name: `${barOptions.name}_annotationGroup`,\n marks: [getAnnotationTextMark(annotationOptions), getAnnotationBackgroundMark(annotationOptions)],\n },\n ];\n};\n\n/**\n * Gets the annotation text mark for the bar chart\n * @param annotationOptions\n * @returns TextMark\n */\nconst getAnnotationTextMark = ({\n barOptions,\n dataName,\n dimensionField,\n dimensionScaleName,\n textKey,\n style,\n}: BarAnnotationSpecOptions): TextMark => {\n const { metricAxis, dimensionAxis } = getOrientationProperties(barOptions.orientation);\n const annotationWidth = getAnnotationWidth(textKey, style);\n const annotationPosition = getAnnotationMetricAxisPosition(barOptions, annotationWidth);\n\n return {\n name: `${barOptions.name}_annotationText`,\n type: 'text',\n from: { data: dataName },\n interactive: false,\n zindex: 1,\n encode: {\n enter: {\n [dimensionAxis]: {\n scale: dimensionScaleName,\n field: dimensionField,\n band: 0.5,\n },\n [metricAxis]: annotationPosition,\n text: [\n {\n test: `bandwidth('${dimensionScaleName}') > ${getMinBandwidth(barOptions.orientation)}`,\n field: textKey,\n },\n ],\n fontSize: { value: ANNOTATION_FONT_SIZE },\n fontWeight: { value: ANNOTATION_FONT_WEIGHT },\n baseline: { value: 'middle' },\n align: { value: 'center' },\n },\n },\n };\n};\n\n/**\n * Gets the annotation background mark\n * @param annotationOptions\n * @returns RectMark\n */\nconst getAnnotationBackgroundMark = ({\n barOptions,\n dimensionScaleName,\n textKey,\n style,\n}: BarAnnotationSpecOptions): RectMark => ({\n name: `${barOptions.name}_annotationBackground`,\n description: `${barOptions.name}_annotationBackground`,\n type: 'rect',\n from: { data: `${barOptions.name}_annotationText` },\n interactive: false,\n encode: {\n enter: {\n ...getAnnotationXEncode(style?.width),\n y: { signal: `datum.bounds.y1 - ${ANNOTATION_PADDING}` },\n y2: { signal: `datum.bounds.y2 + ${ANNOTATION_PADDING}` },\n cornerRadius: { value: 4 },\n fill: [\n {\n test: `datum.datum.${textKey} && bandwidth('${dimensionScaleName}') > ${getMinBandwidth(\n barOptions.orientation\n )}`,\n signal: BACKGROUND_COLOR,\n },\n ],\n },\n },\n});\n\n/**\n * Gets the minimum band width needed to display the annotations based on the bar orientation\n * @param orientation\n * @returns number\n */\nexport const getMinBandwidth = (orientation: Orientation): number =>\n orientation === 'vertical' ? 48 : ANNOTATION_FONT_SIZE + 2 * ANNOTATION_PADDING;\n\n/**\n * Gets the x position encoding for the annotation background\n * @param width\n * @returns RectEncodeEntry\n */\nexport const getAnnotationXEncode = (width?: number): RectEncodeEntry => {\n if (width) {\n return {\n xc: { signal: '(datum.bounds.x1 + datum.bounds.x2) / 2' },\n width: { value: width },\n };\n }\n return {\n x: { signal: `datum.bounds.x1 - ${ANNOTATION_PADDING}` },\n x2: { signal: `datum.bounds.x2 + ${ANNOTATION_PADDING}` },\n };\n};\n\nexport const getAnnotationWidth = (textKey: string, style?: BarAnnotationStyleOptions): AnnotationWidth => {\n if (style?.width) return { value: style.width };\n return {\n signal: `getLabelWidth(datum.${textKey}, '${ANNOTATION_FONT_WEIGHT}', ${ANNOTATION_FONT_SIZE}) + ${\n 2 * ANNOTATION_PADDING\n }`,\n };\n};\n\n/**\n * Offset calculation to make sure the annotation does not overlap the baseline\n * @param barOptions\n * @param annotationWidth\n * @returns string\n */\nexport const getAnnotationPositionOffset = (\n { orientation }: BarSpecOptions,\n annotationWidth: AnnotationWidth\n): string => {\n const pixelGapFromBaseline = 2.5;\n\n if (orientation === 'vertical') {\n return `${(2 * ANNOTATION_PADDING + ANNOTATION_FONT_SIZE) / 2 + pixelGapFromBaseline}`;\n }\n\n if ('value' in annotationWidth) {\n return `${annotationWidth.value / 2 + pixelGapFromBaseline}`;\n }\n\n // Need parens for order of operations\n // Evaluate signal expression first, then divide by 2, then add extra offset\n return `((${annotationWidth.signal}) / 2 + ${pixelGapFromBaseline})`;\n};\n\n/**\n * Gets the metric position for the annotation text.\n * This ensures that the annotation does not overlap the baseline.\n * @param barOptions\n * @param annotationWidth\n * @returns NumericValueref\n */\nexport const getAnnotationMetricAxisPosition = (\n options: BarSpecOptions,\n annotationWidth: AnnotationWidth\n): ProductionRule<NumericValueRef> => {\n const { type, metric, orientation } = options;\n const field = type === 'stacked' || isDodgedAndStacked(options) ? `${metric}1` : metric;\n const { metricScaleKey: scaleKey } = getOrientationProperties(orientation);\n const positionOffset = getAnnotationPositionOffset(options, annotationWidth);\n\n if (orientation === 'vertical') {\n return [\n {\n test: `datum.${field} < 0`,\n signal: `max(scale('${scaleKey}', datum.${field}), scale('${scaleKey}', 0) + ${positionOffset})`,\n },\n {\n signal: `min(scale('${scaleKey}', datum.${field}), scale('${scaleKey}', 0) - ${positionOffset})`,\n },\n ];\n }\n\n return [\n {\n test: `datum.${field} < 0`,\n signal: `min(scale('${scaleKey}', datum.${field}), scale('${scaleKey}', 0) - ${positionOffset})`,\n },\n {\n signal: `max(scale('${scaleKey}', datum.${field}), scale('${scaleKey}', 0) + ${positionOffset})`,\n },\n ];\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { GroupMark, Mark, RectEncodeEntry, RectMark } from 'vega';\n\nimport { BACKGROUND_COLOR, FILTERED_TABLE } from '@spectrum-charts/constants';\n\nimport { isInteractive } from '../marks/markUtils';\nimport { BarSpecOptions } from '../types';\nimport { getAnnotationMarks } from './barAnnotationUtils';\nimport {\n getBarEnterEncodings,\n getBarUpdateEncodings,\n getBaseBarEnterEncodings,\n getDodgedDimensionEncodings,\n getDodgedGroupMark,\n getOrientationProperties,\n isDodgedAndStacked,\n} from './barUtils';\nimport { getTrellisProperties, isTrellised } from './trellisedBarUtils';\n\nexport const getStackedBarMarks = (options: BarSpecOptions): Mark[] => {\n const marks: Mark[] = [];\n // add background marks\n // these marks make it so that when the opacity of a bar is lowered (like on hover), you can't see the grid lines behind the bars\n marks.push(getStackedBackgroundBar(options));\n\n // bar mark\n marks.push(getStackedBar(options));\n\n // add annotation marks\n marks.push(\n ...getAnnotationMarks(\n options,\n getBaseDataSourceName(options),\n getOrientationProperties(options.orientation).dimensionScaleKey,\n options.dimension\n )\n );\n\n return marks;\n};\n\nexport const getDodgedAndStackedBarMark = (options: BarSpecOptions): GroupMark => {\n const marks: Mark[] = [];\n // add background marks\n marks.push(getStackedBackgroundBar(options));\n\n // bar mark\n marks.push(getStackedBar(options));\n\n // add annotation marks\n marks.push(\n ...getAnnotationMarks(options, `${options.name}_facet`, `${options.name}_position`, `${options.name}_dodgeGroup`)\n );\n\n return { ...getDodgedGroupMark(options), marks };\n};\n\nexport const getStackedBackgroundBar = (options: BarSpecOptions): RectMark => {\n const { name } = options;\n\n return {\n name: `${name}_background`,\n description: `${name}_background`,\n type: 'rect',\n from: { data: isDodgedAndStacked(options) ? `${name}_facet` : getBaseDataSourceName(options) },\n interactive: false,\n encode: {\n enter: {\n ...getBaseBarEnterEncodings(options),\n fill: { signal: BACKGROUND_COLOR },\n },\n update: {\n ...getStackedDimensionEncodings(options),\n },\n },\n };\n};\n\nexport const getStackedBar = (options: BarSpecOptions): RectMark => {\n const { name } = options;\n return {\n name,\n description: name,\n type: 'rect',\n from: { data: isDodgedAndStacked(options) ? `${name}_facet` : getBaseDataSourceName(options) },\n interactive: isInteractive(options),\n encode: {\n enter: {\n ...getBaseBarEnterEncodings(options),\n ...getBarEnterEncodings(options),\n },\n update: {\n ...getStackedDimensionEncodings(options),\n ...getBarUpdateEncodings(options),\n },\n },\n };\n};\n\nexport const getStackedDimensionEncodings = (options: BarSpecOptions): RectEncodeEntry => {\n const { dimension, orientation } = options;\n if (isDodgedAndStacked(options)) {\n return getDodgedDimensionEncodings(options);\n }\n\n const { dimensionAxis, rangeScale, dimensionScaleKey } = getOrientationProperties(orientation);\n\n return {\n [dimensionAxis]: { scale: dimensionScaleKey, field: dimension },\n [rangeScale]: { scale: dimensionScaleKey, band: 1 },\n };\n};\n\nconst getBaseDataSourceName = (options: BarSpecOptions) => {\n if (isTrellised(options)) return getTrellisProperties(options).facetName;\n return FILTERED_TABLE;\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { BandScale, Data, FormulaTransform, Mark, OrdinalScale, Scale, Signal } from 'vega';\n\nimport {\n COLOR_SCALE,\n DEFAULT_CATEGORICAL_DIMENSION,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_METRIC,\n FILTERED_TABLE,\n LAST_RSC_SERIES_ID,\n LINE_TYPE_SCALE,\n OPACITY_SCALE,\n PADDING_RATIO,\n SERIES_ID,\n STACK_ID,\n TIME,\n TRELLIS_PADDING,\n} from '@spectrum-charts/constants';\nimport { toCamelCase } from '@spectrum-charts/utils';\n\nimport { addPopoverData, getPopovers } from '../chartPopover/chartPopoverUtils';\nimport { addTooltipData, addTooltipSignals } from '../chartTooltip/chartTooltipUtils';\nimport { addTimeTransform, getTableData, getTransformSort } from '../data/dataUtils';\nimport { getInteractiveMarkName } from '../marks/markUtils';\nimport {\n addDomainFields,\n addFieldToFacetScaleDomain,\n addMetricScale,\n getDefaultScale,\n getMetricScale,\n getScaleIndexByName,\n getScaleIndexByType,\n} from '../scale/scaleSpecBuilder';\nimport { getDualAxisScaleNames } from '../scale/scaleUtils';\nimport {\n addHighlightedItemSignalEvents,\n getFirstRscSeriesIdSignal,\n getGenericValueSignal,\n getLastRscSeriesIdSignal,\n getMouseOverSeriesSignal,\n} from '../signal/signalSpecBuilder';\nimport { getFacetsFromOptions } from '../specUtils';\nimport { addTrendlineData, getTrendlineMarks, setTrendlineSignals } from '../trendline';\nimport { BarOptions, BarSpecOptions, ColorScheme, HighlightedItem, ScSpec } from '../types';\nimport {\n getBarPadding,\n getBaseScaleName,\n getDimensionSelectionRing,\n getOrientationProperties,\n getScaleValues,\n isDodgedAndStacked,\n isDualMetricAxis,\n} from './barUtils';\nimport { getDodgedMark } from './dodgedBarUtils';\nimport { getDodgedAndStackedBarMark, getStackedBarMarks } from './stackedBarUtils';\nimport { addTrellisScale, getTrellisGroupMark, isTrellised } from './trellisedBarUtils';\n\nexport const addBar = produce<\n ScSpec,\n [BarOptions & { colorScheme?: ColorScheme; highlightedItem?: HighlightedItem; index?: number; idKey: string }]\n>(\n (\n spec,\n {\n barAnnotations = [],\n chartPopovers = [],\n chartTooltips = [],\n color = { value: 'categorical-100' },\n colorScheme = DEFAULT_COLOR_SCHEME,\n dimension = DEFAULT_CATEGORICAL_DIMENSION,\n dualMetricAxis = false,\n hasOnClick = false,\n hasSquareCorners = false,\n index = 0,\n lineType = { value: 'solid' },\n lineWidth = 0,\n metric = DEFAULT_METRIC,\n metricAxis,\n name,\n opacity = { value: 1 },\n orientation = 'vertical',\n paddingRatio = PADDING_RATIO,\n trellisOrientation = 'horizontal',\n trellisPadding = TRELLIS_PADDING,\n type = 'stacked',\n trendlines = [],\n ...options\n }\n ) => {\n const barName = toCamelCase(name || `bar${index}`);\n // put options back together now that all defaults are set\n const barOptions: BarSpecOptions = {\n barAnnotations,\n chartPopovers,\n chartTooltips,\n dimensionScaleType: 'band',\n dualMetricAxis,\n orientation,\n color,\n colorScheme,\n dimension,\n hasOnClick,\n hasSquareCorners,\n index,\n interactiveMarkName: getInteractiveMarkName(\n { chartPopovers, chartTooltips, hasOnClick, highlightedItem: options.highlightedItem, trendlines },\n barName\n ),\n lineType,\n lineWidth,\n metric,\n metricAxis,\n name: barName,\n opacity,\n paddingRatio,\n trellisOrientation,\n trellisPadding,\n trendlines,\n type,\n ...options,\n };\n\n spec.usermeta = {\n chartOrientation: barOptions.orientation,\n };\n\n spec.data = addData(spec.data ?? [], barOptions);\n spec.signals = addSignals(spec.signals ?? [], barOptions);\n spec.scales = addScales(spec.scales ?? [], barOptions);\n spec.marks = addMarks(spec.marks ?? [], barOptions);\n }\n);\n\nexport const addSignals = produce<Signal[], [BarSpecOptions]>((signals, options) => {\n const {\n barAnnotations,\n chartTooltips,\n chartPopovers,\n idKey,\n name,\n paddingRatio,\n paddingOuter: barPaddingOuter,\n trendlines,\n } = options;\n // We use this value to calculate ReferenceLine positions.\n const { paddingInner } = getBarPadding(paddingRatio, barPaddingOuter);\n signals.push(getGenericValueSignal('paddingInner', paddingInner));\n\n if (isDualMetricAxis(options)) {\n signals.push(getFirstRscSeriesIdSignal(), getLastRscSeriesIdSignal(), getMouseOverSeriesSignal(name));\n }\n\n if (!barAnnotations.length && !chartPopovers.length && !chartTooltips.length && !trendlines.length) {\n return;\n }\n addHighlightedItemSignalEvents(signals, name, idKey, 1, chartTooltips[0]?.excludeDataKeys);\n addTooltipSignals(signals, options);\n setTrendlineSignals(signals, options);\n});\n\nexport const addData = produce<Data[], [BarSpecOptions]>((data, options) => {\n const { dimension, dimensionDataType, metric, order, type } = options;\n if (dimensionDataType === TIME) {\n const tableData = getTableData(data);\n tableData.transform = addTimeTransform(tableData.transform ?? [], dimension);\n }\n\n const index = data.findIndex((d) => d.name === FILTERED_TABLE);\n data[index].transform = data[index].transform ?? [];\n if (type === 'stacked' || isDodgedAndStacked(options)) {\n data[index].transform?.push({\n type: 'stack',\n groupby: getStackFields(options),\n field: metric,\n sort: getTransformSort(order),\n as: [`${metric}0`, `${metric}1`],\n });\n\n data[index].transform?.push(getStackIdTransform(options));\n data.push(getStackAggregateData(options));\n }\n if (type === 'dodged' || isDodgedAndStacked(options)) {\n data[index].transform?.push(getDodgeGroupTransform(options));\n }\n\n addDualMetricAxisData(data, options);\n addTrendlineData(data, options);\n addTooltipData(data, options);\n addPopoverData(data, options);\n});\n\n/**\n * data aggregate used to calculate the min and max of the stack\n * used to figure out the corner radius of the bars\n * @param facets\n * @param barSpecOptions\n * @returns vega Data object\n */\nexport const getStackAggregateData = (options: BarSpecOptions): Data => {\n const { metric, name } = options;\n return {\n name: `${name}_stacks`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'aggregate',\n groupby: getStackFields(options),\n fields: [`${metric}1`, `${metric}1`],\n ops: ['min', 'max'],\n },\n getStackIdTransform(options),\n ],\n };\n};\n\nexport const getStackIdTransform = (options: BarSpecOptions): FormulaTransform => {\n return {\n type: 'formula',\n as: STACK_ID,\n expr: getStackFields(options)\n .map((facet) => `datum.${facet}`)\n .join(' + \",\" + '),\n } as FormulaTransform;\n};\n\nconst getStackFields = ({ trellis, color, dimension, lineType, opacity, type }: BarSpecOptions): string[] => {\n const { facets, secondaryFacets } = getFacetsFromOptions({ color, lineType, opacity });\n return [\n ...(trellis ? [trellis] : []),\n dimension,\n ...(type === 'dodged' ? facets : []),\n ...(type === 'stacked' ? secondaryFacets : []),\n ];\n};\n\nexport const getDodgeGroupTransform = ({ color, lineType, name, opacity, type }: BarSpecOptions): FormulaTransform => {\n const { facets, secondaryFacets } = getFacetsFromOptions({ color, lineType, opacity });\n return {\n type: 'formula',\n as: `${name}_dodgeGroup`,\n expr: (type === 'dodged' ? facets : secondaryFacets).map((facet) => `datum.${facet}`).join(' + \",\" + '),\n };\n};\n\nexport const addDualMetricAxisData = (data: Data[], options: BarSpecOptions) => {\n if (isDualMetricAxis(options)) {\n const baseScaleName = getBaseScaleName(options);\n const scaleNames = getDualAxisScaleNames(baseScaleName);\n\n if (scaleNames.primaryDomain && scaleNames.secondaryDomain) {\n data.push({\n name: scaleNames.primaryDomain,\n source: FILTERED_TABLE,\n transform: [{ type: 'filter', expr: `datum.${SERIES_ID} !== ${LAST_RSC_SERIES_ID}` }],\n });\n\n data.push({\n name: scaleNames.secondaryDomain,\n source: FILTERED_TABLE,\n transform: [{ type: 'filter', expr: `datum.${SERIES_ID} === ${LAST_RSC_SERIES_ID}` }],\n });\n }\n }\n};\n\nexport const addScales = produce<Scale[], [BarSpecOptions]>((scales, options) => {\n const { color, lineType, opacity, metricAxis } = options;\n const { metricAxis: axisType } = getOrientationProperties(options.orientation);\n\n addMetricScale(scales, getScaleValues(options), axisType);\n\n if (metricAxis) {\n addMetricScale(scales, getScaleValues(options), axisType, metricAxis);\n }\n\n if (isDualMetricAxis(options)) {\n const baseScaleName = getBaseScaleName(options);\n const scaleNames = getDualAxisScaleNames(baseScaleName);\n addMetricScale(scales, getScaleValues(options), axisType, scaleNames.primaryScale, scaleNames.primaryDomain);\n addMetricScale(scales, getScaleValues(options), axisType, scaleNames.secondaryScale, scaleNames.secondaryDomain);\n }\n addDimensionScale(scales, options);\n addTrellisScale(scales, options);\n addFieldToFacetScaleDomain(scales, COLOR_SCALE, color);\n addFieldToFacetScaleDomain(scales, LINE_TYPE_SCALE, lineType);\n addFieldToFacetScaleDomain(scales, OPACITY_SCALE, opacity);\n addSecondaryScales(scales, options);\n});\n\nexport const addDimensionScale = (\n scales: Scale[],\n { dimension, paddingRatio, paddingOuter: barPaddingOuter, orientation }: BarSpecOptions\n) => {\n const { dimensionAxis } = getOrientationProperties(orientation);\n const index = getScaleIndexByType(scales, 'band', dimensionAxis);\n scales[index] = addDomainFields(scales[index], [dimension]);\n const { paddingInner, paddingOuter } = getBarPadding(paddingRatio, barPaddingOuter);\n\n scales[index] = { ...scales[index], paddingInner, paddingOuter } as BandScale;\n};\n\n/**\n * adds scales for the secondary dimensions\n * If a bar is stacked and dodged,\n * @param scales\n * @param param1\n */\nexport const addSecondaryScales = (scales: Scale[], options: BarSpecOptions) => {\n const { color, lineType, opacity } = options;\n if (isDodgedAndStacked(options)) {\n [\n {\n value: color,\n scaleName: 'colors',\n secondaryScaleName: 'secondaryColor',\n },\n {\n value: lineType,\n scaleName: 'lineTypes',\n secondaryScaleName: 'secondaryLineType',\n },\n {\n value: opacity,\n scaleName: 'opacities',\n secondaryScaleName: 'secondaryOpacity',\n },\n ].forEach(({ value, scaleName, secondaryScaleName }) => {\n if (Array.isArray(value) && value.length === 2) {\n // secondary value scale used for 2D scales\n const secondaryIndex = getScaleIndexByName(scales, secondaryScaleName, 'ordinal');\n scales[secondaryIndex] = addDomainFields(scales[secondaryIndex], [value[1]]);\n\n const primaryIndex = getScaleIndexByName(scales, scaleName, 'ordinal');\n const primaryScale = scales[primaryIndex] as OrdinalScale;\n primaryScale.range = { signal: scaleName };\n scales[primaryIndex] = addDomainFields(primaryScale, [value[0]]);\n }\n });\n }\n};\n\nexport const addMarks = produce<Mark[], [BarSpecOptions]>((marks, options) => {\n const { chartPopovers, name, type } = options;\n const barMarks: Mark[] = [];\n if (isDodgedAndStacked(options)) {\n barMarks.push(getDodgedAndStackedBarMark(options));\n } else if (type === 'stacked') {\n barMarks.push(...getStackedBarMarks(options));\n } else {\n barMarks.push(getDodgedMark(options));\n }\n\n const popovers = getPopovers(chartPopovers, name);\n if (popovers.some((popover) => popover.UNSAFE_highlightBy === 'dimension')) {\n barMarks.push(getDimensionSelectionRing(options));\n }\n\n // if this is a trellis plot, we add the bars and the repeated scale to the trellis group\n if (isTrellised(options)) {\n const repeatedScale = getRepeatedScale(options);\n marks.push(getTrellisGroupMark(options, barMarks, repeatedScale));\n } else {\n marks.push(...barMarks);\n }\n\n marks.push(...getTrendlineMarks(options));\n});\n\nexport const getRepeatedScale = (options: BarSpecOptions): Scale => {\n const { orientation, trellisOrientation } = options;\n // if the orientations match then the metric scale is repeated, otherwise the dimension scale is repeated\n // ex. vertical bar in a vertical trellis will have multiple copies of the metric scale\n if (orientation === trellisOrientation) {\n const { metricAxis } = getOrientationProperties(orientation);\n return getMetricScale(getScaleValues(options), metricAxis, orientation);\n } else {\n return getDimensionScale(options);\n }\n};\n\n/**\n * Generates a dimension scale and returns it\n * NOTE: does not check if the dimension scale already exists\n * @param param0\n * @returns\n */\nconst getDimensionScale = ({\n dimension,\n orientation,\n paddingRatio,\n paddingOuter: barPaddingOuter,\n}: BarSpecOptions): BandScale => {\n const { dimensionAxis } = getOrientationProperties(orientation);\n let scale = getDefaultScale('band', dimensionAxis, orientation);\n scale = addDomainFields(scale, [dimension]);\n const { paddingInner, paddingOuter } = getBarPadding(paddingRatio, barPaddingOuter);\n return { ...scale, paddingInner, paddingOuter } as BandScale;\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { GroupMark } from 'vega';\n\nimport { BACKGROUND_COLOR } from '@spectrum-charts/constants';\n\nimport { isInteractive } from '../marks/markUtils';\nimport { BarSpecOptions } from '../types';\nimport { getAnnotationMarks } from './barAnnotationUtils';\nimport {\n getBarEnterEncodings,\n getBarUpdateEncodings,\n getBaseBarEnterEncodings,\n getDodgedDimensionEncodings,\n getDodgedGroupMark,\n} from './barUtils';\n\nexport const getDodgedMark = (options: BarSpecOptions): GroupMark => {\n const { name } = options;\n\n return {\n ...getDodgedGroupMark(options),\n marks: [\n // background bars\n {\n name: `${name}_background`,\n from: { data: `${name}_facet` },\n type: 'rect',\n interactive: false,\n encode: {\n enter: {\n ...getBaseBarEnterEncodings(options),\n fill: { signal: BACKGROUND_COLOR },\n },\n update: {\n ...getDodgedDimensionEncodings(options),\n },\n },\n },\n // bars\n {\n name,\n from: { data: `${name}_facet` },\n type: 'rect',\n interactive: isInteractive(options),\n encode: {\n enter: {\n ...getBaseBarEnterEncodings(options),\n ...getBarEnterEncodings(options),\n },\n update: {\n ...getDodgedDimensionEncodings(options),\n ...getBarUpdateEncodings(options),\n },\n },\n },\n ...getAnnotationMarks(options, `${name}_facet`, `${name}_position`, `${name}_dodgeGroup`),\n ],\n };\n};\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Data, FormulaTransform, ValuesData } from 'vega';\n\nimport { TABLE } from '@spectrum-charts/constants';\n\nimport { getTableData } from '../data/dataUtils';\nimport { BulletSpecOptions, ThresholdBackground } from '../types';\n\n/**\n * Retrieves the bullet table data from the provided data array.\n * If it doesn't exist, creates and pushes a new one.\n * @param data The data array.\n * @returns The bullet table data.\n */\nexport const getBulletTableData = (data: Data[]): ValuesData => {\n let tableData = getTableData(data);\n if (!tableData) {\n tableData = {\n name: TABLE,\n values: [],\n transform: [],\n };\n data.push(tableData);\n }\n return tableData;\n};\n\n/**\n * Generates the necessary formula transforms for the bullet chart.\n * It calculates the xPaddingForTarget and, if in flexible scale mode, adds the flexibleScaleValue.\n * It also generates a color expression for the threshold bars if applicable.\n * @param bulletOptions The bullet spec properties.\n * @returns An array of formula transforms.\n */\nexport const getBulletTransforms = (bulletOptions: BulletSpecOptions): FormulaTransform[] => {\n const transforms: FormulaTransform[] = [\n {\n type: 'formula',\n expr: `isValid(datum.${bulletOptions.target}) ? round(datum.${bulletOptions.target} * 1.05) : 0`,\n as: 'xPaddingForTarget',\n },\n ];\n\n if (bulletOptions.scaleType === 'flexible') {\n transforms.push({\n type: 'formula',\n expr: `${bulletOptions.maxScaleValue}`,\n as: 'flexibleScaleValue',\n });\n }\n\n if (bulletOptions.thresholdBarColor && (bulletOptions.thresholds?.length ?? 0) > 0) {\n transforms.push({\n type: 'formula',\n expr: generateThresholdColorExpr(bulletOptions.thresholds ?? [], bulletOptions.metric, bulletOptions.color),\n as: 'barColor',\n });\n }\n\n return transforms;\n};\n\n/**\n * Generates a Vega expression for the color of the bullet chart based on the provided thresholds.\n * The expression checks the value of the metric field against the thresholds and assigns the appropriate color.\n * @param thresholds An array of threshold objects.\n * @param metricField The name of the metric field in the data.\n * @param defaultColor The default color to use if no thresholds are met.\n * @returns A string representing the Vega expression for the color.\n */\nexport function generateThresholdColorExpr(\n thresholds: ThresholdBackground[],\n metricField: string,\n defaultColor: string\n): string {\n if (!thresholds || thresholds.length === 0) return `'${defaultColor}'`;\n\n const sorted: ThresholdBackground[] = thresholds.slice().sort((a, b) => {\n const aMin = a.thresholdMin !== undefined ? a.thresholdMin : -1e12;\n const bMin = b.thresholdMin !== undefined ? b.thresholdMin : -1e12;\n return aMin - bMin;\n });\n\n const exprParts: string[] = [];\n\n // For values below the first threshold's lower bound, use the default color.\n exprParts.push(\n `(datum.${metricField} < ${\n sorted[0].thresholdMin !== undefined ? sorted[0].thresholdMin : -1e12\n }) ? '${defaultColor}' : `\n );\n\n // For each threshold, check if the metric field is within the range defined by the thresholdMin and thresholdMax values.\n // If it is, use the corresponding fill color.\n for (let i = 0; i < sorted.length - 1; i++) {\n const nextLower = sorted[i + 1].thresholdMin !== undefined ? sorted[i + 1].thresholdMin : -1e12;\n exprParts.push(`(datum.${metricField} < ${nextLower}) ? '${sorted[i].fill}' : `);\n }\n\n // For values above the last threshold's upper bound, use the last threshold's fill color.\n exprParts.push(`'${sorted[sorted.length - 1].fill}'`);\n\n const expr = exprParts.join('');\n return expr;\n}\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Axis, GroupMark, Mark } from 'vega';\n\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { BulletSpecOptions } from '../types';\n\nexport const addMarks = produce<Mark[], [BulletSpecOptions]>((marks, bulletOptions) => {\n const markGroupEncodeUpdateDirection = bulletOptions.direction === 'column' ? 'y' : 'x';\n const bulletGroupWidth = bulletOptions.direction === 'column' ? 'width' : 'bulletGroupWidth';\n\n const bulletMark: GroupMark = {\n name: 'bulletGroup',\n type: 'group',\n from: {\n facet: { data: 'table', name: 'bulletGroups', groupby: `${bulletOptions.dimension}` },\n },\n encode: {\n update: {\n [markGroupEncodeUpdateDirection]: { scale: 'groupScale', field: `${bulletOptions.dimension}` },\n height: { signal: 'bulletGroupHeight' },\n width: { signal: bulletGroupWidth },\n },\n },\n marks: [],\n };\n\n const thresholds = bulletOptions.thresholds;\n\n if (Array.isArray(thresholds) && thresholds.length > 0) {\n bulletMark.data = [\n {\n name: 'thresholds',\n values: thresholds,\n transform: [{ type: 'identifier', as: 'id' }],\n },\n ];\n bulletMark.marks?.push(getBulletMarkThreshold(bulletOptions));\n } else if (bulletOptions.track) {\n bulletMark.marks?.push(getBulletTrack(bulletOptions));\n }\n\n bulletMark.marks?.push(getBulletMarkRect(bulletOptions));\n if (bulletOptions.target && bulletOptions.showTarget !== false) {\n bulletMark.marks?.push(getBulletMarkTarget(bulletOptions));\n if (bulletOptions.showTargetValue) {\n bulletMark.marks?.push(getBulletMarkTargetValueLabel(bulletOptions));\n }\n }\n\n if (bulletOptions.labelPosition === 'top' || bulletOptions.direction === 'row') {\n bulletMark.marks?.push(getBulletMarkLabel(bulletOptions));\n bulletMark.marks?.push(getBulletMarkValueLabel(bulletOptions));\n }\n\n marks.push(bulletMark);\n});\n\nexport function getBulletMarkRect(bulletOptions: BulletSpecOptions): Mark {\n //The vertical positioning is calculated starting at the bulletgroupheight\n //and then subtracting two times the bullet height to center the bullet bar\n //in the middle of the threshold. The 3 is subtracted because the bulletgroup height\n //starts the bullet below the threshold area.\n //Additionally, the value of the targetValueLabelHeight is subtracted if the target value label is shown\n //to make sure that the bullet bar is not drawn over the target value label.\n const bulletMarkRectEncodeUpdateYSignal =\n bulletOptions.showTarget && bulletOptions.showTargetValue\n ? 'bulletGroupHeight - targetValueLabelHeight - 3 - 2 * bulletHeight'\n : 'bulletGroupHeight - 3 - 2 * bulletHeight';\n\n const fillColor =\n bulletOptions.thresholdBarColor && (bulletOptions.thresholds?.length ?? 0) > 0\n ? [{ field: 'barColor' }]\n : [{ value: bulletOptions.color }];\n\n const bulletMarkRect: Mark = {\n name: `${bulletOptions.name}Rect`,\n description: `${bulletOptions.name}Rect`,\n type: 'rect',\n from: { data: 'bulletGroups' },\n encode: {\n enter: {\n cornerRadiusTopLeft: [{ test: `datum.${bulletOptions.metric} < 0`, value: 3 }],\n cornerRadiusBottomLeft: [{ test: `datum.${bulletOptions.metric} < 0`, value: 3 }],\n cornerRadiusTopRight: [{ test: `datum.${bulletOptions.metric} > 0`, value: 3 }],\n cornerRadiusBottomRight: [{ test: `datum.${bulletOptions.metric} > 0`, value: 3 }],\n fill: fillColor,\n },\n update: {\n x: { scale: 'xscale', value: 0 },\n x2: { scale: 'xscale', field: `${bulletOptions.metric}` },\n height: { signal: 'bulletHeight' },\n y: { signal: bulletMarkRectEncodeUpdateYSignal },\n },\n },\n };\n\n return bulletMarkRect;\n}\n\nexport function getBulletMarkTarget(bulletOptions: BulletSpecOptions): Mark {\n const solidColor = getColorValue('gray-900', bulletOptions.colorScheme);\n\n //When the target value label is shown, we must subtract the height of the target value label\n //to make sure that the target line is not drawn over the target value label\n const bulletMarkTargetEncodeUpdateY =\n bulletOptions.showTarget && bulletOptions.showTargetValue\n ? 'bulletGroupHeight - targetValueLabelHeight - targetHeight'\n : 'bulletGroupHeight - targetHeight';\n const bulletMarkTargetEncodeUpdateY2 =\n bulletOptions.showTarget && bulletOptions.showTargetValue\n ? 'bulletGroupHeight - targetValueLabelHeight'\n : 'bulletGroupHeight';\n\n const bulletMarkTarget: Mark = {\n name: `${bulletOptions.name}Target`,\n description: `${bulletOptions.name}Target`,\n type: 'rule',\n from: { data: 'bulletGroups' },\n encode: {\n enter: {\n stroke: { value: `${solidColor}` },\n strokeWidth: { value: 2 },\n },\n update: {\n x: { scale: 'xscale', field: `${bulletOptions.target}` },\n y: { signal: bulletMarkTargetEncodeUpdateY },\n y2: { signal: bulletMarkTargetEncodeUpdateY2 },\n },\n },\n };\n\n return bulletMarkTarget;\n}\n\nexport function getBulletMarkLabel(bulletOptions: BulletSpecOptions): Mark {\n const barLabelColor = getColorValue('gray-600', bulletOptions.colorScheme);\n\n const bulletMarkLabel: Mark = {\n name: `${bulletOptions.name}Label`,\n description: `${bulletOptions.name}Label`,\n type: 'text',\n from: { data: 'bulletGroups' },\n encode: {\n enter: {\n text: { signal: `datum.${bulletOptions.dimension}` },\n align: { value: 'left' },\n baseline: { value: 'top' },\n fill: { value: `${barLabelColor}` },\n },\n update: { x: { value: 0 }, y: { value: 0 } },\n },\n };\n\n return bulletMarkLabel;\n}\n\nexport function getBulletMarkValueLabel(bulletOptions: BulletSpecOptions): Mark {\n const defaultColor = getColorValue(bulletOptions.color, bulletOptions.colorScheme);\n const solidColor = getColorValue('gray-900', bulletOptions.colorScheme);\n const encodeUpdateSignalWidth = bulletOptions.direction === 'column' ? 'width' : 'bulletGroupWidth';\n const fillExpr =\n bulletOptions.thresholdBarColor && (bulletOptions.thresholds?.length ?? 0) > 0\n ? `datum.barColor === '${defaultColor}' ? '${solidColor}' : datum.barColor`\n : `'${solidColor}'`;\n\n const bulletMarkValueLabel: Mark = {\n name: `${bulletOptions.name}ValueLabel`,\n description: `${bulletOptions.name}ValueLabel`,\n type: 'text',\n from: { data: 'bulletGroups' },\n encode: {\n enter: {\n text: {\n signal: `datum.${bulletOptions.metric} != null ? format(datum.${bulletOptions.metric}, '${\n bulletOptions.numberFormat || ''\n }') : ''`,\n },\n align: { value: 'right' },\n baseline: { value: 'top' },\n fill: { signal: fillExpr },\n },\n update: { x: { signal: encodeUpdateSignalWidth }, y: { value: 0 } },\n },\n };\n\n return bulletMarkValueLabel;\n}\n\nexport function getBulletMarkTargetValueLabel(bulletOptions: BulletSpecOptions): Mark {\n const solidColor = getColorValue('gray-900', bulletOptions.colorScheme);\n\n const bulletMarkTargetValueLabel: Mark = {\n name: `${bulletOptions.name}TargetValueLabel`,\n description: `${bulletOptions.name}TargetValueLabel`,\n type: 'text',\n from: { data: 'bulletGroups' },\n encode: {\n enter: {\n text: {\n signal: `datum.${bulletOptions.target} != null ? 'Target: ' + format(datum.${bulletOptions.target}, '$,.2f') : 'No Target'`,\n },\n align: { value: 'center' },\n baseline: { value: 'top' },\n fill: { value: `${solidColor}` },\n },\n update: {\n x: { scale: 'xscale', field: `${bulletOptions.target}` },\n y: { signal: 'bulletGroupHeight - targetValueLabelHeight + 6' },\n },\n },\n };\n\n return bulletMarkTargetValueLabel;\n}\n\nexport function getBulletMarkThreshold(bulletOptions: BulletSpecOptions): Mark {\n // Vertically center the threshold bar by offsetting from bulletGroupHeight.\n // Subtract 3 for alignment and targetValueLabelHeight if the label is shown.\n const baseHeightSignal = 'bulletGroupHeight - 3 - bulletThresholdHeight';\n const encodeUpdateYSignal =\n bulletOptions.showTarget && bulletOptions.showTargetValue\n ? `${baseHeightSignal} - targetValueLabelHeight`\n : baseHeightSignal;\n\n const bulletMarkThreshold: Mark = {\n name: `${bulletOptions.name}Threshold`,\n description: `${bulletOptions.name}Threshold`,\n type: 'rect',\n from: { data: 'thresholds' },\n clip: true,\n encode: {\n enter: {\n cornerRadiusTopLeft: [{ test: `!isDefined(datum.thresholdMin) && domain('xscale')[0] !== 0`, value: 3 }],\n cornerRadiusBottomLeft: [{ test: `!isDefined(datum.thresholdMin) && domain('xscale')[0] !== 0`, value: 3 }],\n cornerRadiusTopRight: [{ test: `!isDefined(datum.thresholdMax) && domain('xscale')[1] !== 0`, value: 3 }],\n cornerRadiusBottomRight: [{ test: `!isDefined(datum.thresholdMax) && domain('xscale')[1] !== 0`, value: 3 }],\n fill: { field: 'fill' },\n fillOpacity: { value: 0.2 },\n },\n update: {\n x: {\n signal: \"isDefined(datum.thresholdMin) ? scale('xscale', datum.thresholdMin) : 0\",\n },\n x2: {\n signal: \"isDefined(datum.thresholdMax) ? scale('xscale', datum.thresholdMax) : width\",\n },\n height: { signal: 'bulletThresholdHeight' },\n y: { signal: encodeUpdateYSignal },\n },\n },\n };\n return bulletMarkThreshold;\n}\n\nexport function getBulletTrack(bulletOptions: BulletSpecOptions): Mark {\n const trackColor = getColorValue('gray-200', bulletOptions.colorScheme);\n const trackWidth = bulletOptions.direction === 'column' ? 'width' : 'bulletGroupWidth';\n // Subtracting 20 accounts for the space used by the target value label\n const trackY =\n bulletOptions.showTarget && bulletOptions.showTargetValue\n ? 'bulletGroupHeight - 3 - 2 * bulletHeight - 20'\n : 'bulletGroupHeight - 3 - 2 * bulletHeight';\n\n const bulletTrack: Mark = {\n name: `${bulletOptions.name}Track`,\n description: `${bulletOptions.name}Track`,\n type: 'rect',\n from: { data: 'bulletGroups' },\n encode: {\n enter: {\n fill: { value: trackColor },\n cornerRadiusTopRight: [{ test: \"domain('xscale')[1] !== 0\", value: 3 }],\n cornerRadiusBottomRight: [{ test: \"domain('xscale')[1] !== 0\", value: 3 }],\n cornerRadiusTopLeft: [{ test: \"domain('xscale')[0] !== 0\", value: 3 }],\n cornerRadiusBottomLeft: [{ test: \"domain('xscale')[0] !== 0\", value: 3 }],\n },\n update: {\n x: { value: 0 },\n width: { signal: trackWidth },\n height: { signal: 'bulletHeight' },\n y: { signal: trackY },\n },\n },\n };\n\n return bulletTrack;\n}\n\nexport function getBulletLabelAxesLeft(labelOffset): Axis {\n return {\n scale: 'groupScale',\n orient: 'left',\n tickSize: 0,\n labelOffset: labelOffset,\n labelPadding: 10,\n labelColor: '#797979',\n domain: false,\n };\n}\n\nexport function getBulletLabelAxesRight(bulletOptions: BulletSpecOptions, labelOffset): Axis {\n return {\n scale: 'groupScale',\n orient: 'right',\n tickSize: 0,\n labelOffset: labelOffset,\n labelPadding: 10,\n domain: false,\n encode: {\n labels: {\n update: {\n text: {\n signal: `info(data('table')[datum.index * (length(data('table')) - 1)].${\n bulletOptions.metric\n }) != null ? format(info(data('table')[datum.index * (length(data('table')) - 1)].${\n bulletOptions.metric\n }), '${bulletOptions.numberFormat || ''}') : ''`,\n },\n },\n },\n },\n };\n}\n\nexport function getBulletScaleAxes(): Axis {\n return {\n labelOffset: 2,\n scale: 'xscale',\n orient: 'bottom',\n ticks: false,\n labelColor: 'gray',\n domain: false,\n tickCount: 5,\n offset: { signal: 'axisOffset' },\n };\n}\n\nexport const addAxes = produce<Axis[], [BulletSpecOptions]>((axes, bulletOptions) => {\n if (bulletOptions.metricAxis && bulletOptions.direction === 'column' && !bulletOptions.showTargetValue) {\n axes.push(getBulletScaleAxes());\n }\n\n if (bulletOptions.labelPosition === 'side' && bulletOptions.direction === 'column') {\n const labelOffset = bulletOptions.showTargetValue && bulletOptions.showTarget ? -8 : 2;\n axes.push(getBulletLabelAxesLeft(labelOffset));\n axes.push(getBulletLabelAxesRight(bulletOptions, labelOffset));\n }\n});\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Data, Scale, Signal } from 'vega';\n\nimport {\n DEFAULT_BULLET_DIRECTION,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_LABEL_POSITION,\n DEFAULT_SCALE_TYPE,\n DEFAULT_SCALE_VALUE,\n} from '@spectrum-charts/constants';\nimport { getColorValue, spectrumColors } from '@spectrum-charts/themes';\nimport { toCamelCase } from '@spectrum-charts/utils';\n\nimport { BulletOptions, BulletSpecOptions, ColorScheme, ScSpec } from '../types';\nimport { getBulletTableData, getBulletTransforms } from './bulletDataUtils';\nimport { addAxes, addMarks } from './bulletMarkUtils';\n\nconst DEFAULT_COLOR = spectrumColors.light['static-blue'];\n\nexport const addBullet = produce<\n ScSpec,\n [BulletOptions & { colorScheme?: ColorScheme; index?: number; idKey: string }]\n>(\n (\n spec,\n {\n colorScheme = DEFAULT_COLOR_SCHEME,\n index = 0,\n name,\n metric,\n dimension,\n target,\n color = DEFAULT_COLOR,\n direction = DEFAULT_BULLET_DIRECTION,\n numberFormat,\n showTarget = true,\n showTargetValue = false,\n labelPosition = DEFAULT_LABEL_POSITION,\n scaleType = DEFAULT_SCALE_TYPE,\n maxScaleValue = DEFAULT_SCALE_VALUE,\n thresholds = [],\n track = false,\n thresholdBarColor = false,\n metricAxis = false,\n ...options\n }\n ) => {\n const bulletOptions: BulletSpecOptions = {\n colorScheme: colorScheme,\n index,\n color: getColorValue(color, colorScheme),\n metric: metric ?? 'currentAmount',\n dimension: dimension ?? 'graphLabel',\n target: target ?? 'target',\n name: toCamelCase(name ?? `bullet${index}`),\n direction: direction,\n numberFormat: numberFormat ?? '',\n showTarget: showTarget,\n showTargetValue: showTargetValue,\n labelPosition: labelPosition,\n scaleType: scaleType,\n maxScaleValue: maxScaleValue,\n track: track,\n thresholds: thresholds,\n thresholdBarColor: thresholdBarColor,\n metricAxis: metricAxis,\n ...options,\n };\n\n spec.data = addData(spec.data ?? [], bulletOptions);\n spec.marks = addMarks(spec.marks ?? [], bulletOptions);\n spec.scales = addScales(spec.scales ?? [], bulletOptions);\n spec.signals = addSignals(spec.signals ?? [], bulletOptions);\n spec.axes = addAxes(spec.axes ?? [], bulletOptions);\n }\n);\n\nexport const addScales = produce<Scale[], [BulletSpecOptions]>((scales, options) => {\n const groupScaleRangeSignal = options.direction === 'column' ? 'bulletChartHeight' : 'width';\n const xRange = options.direction === 'column' ? 'width' : [0, { signal: 'bulletGroupWidth' }];\n let domainFields;\n\n if (options.scaleType === 'flexible' && options.maxScaleValue > 0) {\n domainFields = { data: 'table', fields: ['xPaddingForTarget', options.metric, 'flexibleScaleValue'] };\n } else if (options.scaleType === 'fixed' && options.maxScaleValue > 0) {\n domainFields = [0, `${options.maxScaleValue}`];\n } else {\n domainFields = { data: 'table', fields: ['xPaddingForTarget', options.metric] };\n }\n\n scales.push(\n {\n name: 'groupScale',\n type: 'band',\n domain: { data: 'table', field: options.dimension },\n range: [0, { signal: groupScaleRangeSignal }],\n paddingInner: { signal: 'paddingRatio' },\n },\n {\n name: 'xscale',\n type: 'linear',\n domain: domainFields,\n range: xRange,\n round: true,\n clamp: true,\n zero: true,\n }\n );\n});\n\nexport const addSignals = produce<Signal[], [BulletSpecOptions]>((signals, options) => {\n signals.push({ name: 'gap', value: 12 });\n signals.push({ name: 'bulletHeight', value: 8 });\n signals.push({ name: 'bulletThresholdHeight', update: 'bulletHeight * 3' });\n signals.push({ name: 'targetHeight', update: 'bulletThresholdHeight + 6' });\n\n if (options.showTargetValue && options.showTarget) {\n signals.push({ name: 'targetValueLabelHeight', update: '20' });\n }\n\n signals.push({\n name: 'bulletGroupHeight',\n update: getBulletGroupHeightExpression(options),\n });\n\n if (options.direction === 'column') {\n signals.push({ name: 'paddingRatio', update: 'gap / (gap + bulletGroupHeight)' });\n\n if (options.metricAxis && !options.showTargetValue) {\n signals.push({\n name: 'bulletChartHeight',\n update: \"length(data('table')) * bulletGroupHeight + (length(data('table')) - 1) * gap + 10\",\n });\n signals.push({\n name: 'axisOffset',\n update: 'bulletChartHeight - height - 10',\n });\n } else {\n signals.push({\n name: 'bulletChartHeight',\n update: \"length(data('table')) * bulletGroupHeight + (length(data('table')) - 1) * gap\",\n });\n }\n } else {\n signals.push({ name: 'bulletGroupWidth', update: \"(width / length(data('table'))) - gap\" });\n signals.push({ name: 'paddingRatio', update: 'gap / (gap + bulletGroupWidth)' });\n signals.push({ name: 'bulletChartHeight', update: 'bulletGroupHeight' });\n }\n});\n\n/**\n * Returns the height of the bullet group based on the options\n * @param options the bullet spec options\n * @returns the height of the bullet group\n */\nfunction getBulletGroupHeightExpression(options: BulletSpecOptions): string {\n if (options.showTargetValue && options.showTarget) {\n return options.labelPosition === 'side' && options.direction === 'column'\n ? 'bulletThresholdHeight + targetValueLabelHeight + 10'\n : 'bulletThresholdHeight + targetValueLabelHeight + 24';\n } else if (options.labelPosition === 'side' && options.direction === 'column') {\n return 'bulletThresholdHeight + 10';\n }\n return 'bulletThresholdHeight + 24';\n}\n\nexport const addData = produce<Data[], [BulletSpecOptions]>((data, options) => {\n const tableData = getBulletTableData(data);\n tableData.transform = getBulletTransforms(options);\n});\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { AreaMark, GroupMark, LineMark, Signal, SourceData } from 'vega';\n\nimport {\n DEFAULT_METRIC,\n FILTERED_TABLE,\n HIGHLIGHTED_SERIES,\n SELECTED_SERIES,\n SERIES_ID,\n} from '@spectrum-charts/constants';\n\nimport { AreaMarkOptions, getAreaMark } from '../area/areaUtils';\nimport { getLineMark } from '../line/lineMarkUtils';\nimport { LineMarkOptions } from '../line/lineUtils';\nimport { addHighlightedSeriesSignalEvents } from '../signal/signalSpecBuilder';\nimport { getFacetsFromOptions } from '../specUtils';\nimport { LineSpecOptions, MetricRangeOptions, MetricRangeSpecOptions } from '../types';\n\nexport type MetricRangeParentOptions = LineSpecOptions;\n\nexport const getMetricRanges = (markOptions: MetricRangeParentOptions): MetricRangeSpecOptions[] => {\n return markOptions.metricRanges.map((metricRange, index) =>\n applyMetricRangeOptionDefaults(metricRange, markOptions.name, index)\n );\n};\n\nexport const applyMetricRangeOptionDefaults = (\n {\n chartTooltips = [],\n lineType = 'dashed',\n lineWidth = 'S',\n rangeOpacity = 0.2,\n metric = DEFAULT_METRIC,\n displayOnHover = false,\n ...options\n }: MetricRangeOptions,\n markName: string,\n index: number\n): MetricRangeSpecOptions => ({\n chartTooltips,\n lineType,\n lineWidth,\n name: `${markName}MetricRange${index}`,\n rangeOpacity,\n metric,\n displayOnHover,\n ...options,\n});\n\n/**\n * gets the metric range group mark including the metric range line and area marks.\n * @param lineMarkOptions\n */\nexport const getMetricRangeGroupMarks = (lineMarkOptions: LineSpecOptions): GroupMark[] => {\n const { color, lineType } = lineMarkOptions;\n const { facets } = getFacetsFromOptions({ color, lineType });\n\n const marks: GroupMark[] = [];\n const metricRanges = getMetricRanges(lineMarkOptions);\n\n for (const metricRangeOptions of metricRanges) {\n const { displayOnHover, name } = metricRangeOptions;\n // if displayOnHover is true, use the highlightedData source, otherwise use the filtered table\n const data = displayOnHover ? `${name}_highlightedData` : FILTERED_TABLE;\n marks.push({\n name: `${name}_group`,\n type: 'group',\n clip: true,\n from: {\n facet: {\n name: `${name}_facet`,\n data,\n groupby: facets,\n },\n },\n marks: getMetricRangeMark(lineMarkOptions, metricRangeOptions),\n });\n }\n\n return marks;\n};\n\n/**\n * gets the area and line marks for the metric range by combining line and metric range options.\n * @param lineMarkOptions\n * @param metricRangeOptions\n */\nexport const getMetricRangeMark = (\n lineMarkOptions: LineSpecOptions,\n metricRangeOptions: MetricRangeSpecOptions\n): (LineMark | AreaMark)[] => {\n const areaOptions: AreaMarkOptions = {\n name: `${metricRangeOptions.name}_area`,\n color: lineMarkOptions.color,\n colorScheme: lineMarkOptions.colorScheme,\n opacity: metricRangeOptions.rangeOpacity,\n metricStart: metricRangeOptions.metricStart,\n metricEnd: metricRangeOptions.metricEnd,\n isStacked: false,\n scaleType: 'time',\n dimension: lineMarkOptions.dimension,\n isMetricRange: true,\n parentName: lineMarkOptions.name,\n displayOnHover: metricRangeOptions.displayOnHover,\n };\n const lineOptions: LineMarkOptions = {\n ...lineMarkOptions,\n name: `${metricRangeOptions.name}_line`,\n color: metricRangeOptions.color ? { value: metricRangeOptions.color } : lineMarkOptions.color,\n metric: metricRangeOptions.metric,\n lineType: { value: metricRangeOptions.lineType },\n lineWidth: { value: metricRangeOptions.lineWidth },\n displayOnHover: metricRangeOptions.displayOnHover,\n };\n\n const dataSource = `${metricRangeOptions.name}_facet`;\n const lineMark = getLineMark(lineOptions, dataSource);\n const areaMark = getAreaMark(areaOptions, dataSource);\n\n return [lineMark, areaMark];\n};\n\n/**\n * gets the data source for the metricRange\n * @param markOptions\n */\nexport const getMetricRangeData = (markOptions: LineSpecOptions): SourceData[] => {\n const data: SourceData[] = [];\n const metricRanges = getMetricRanges(markOptions);\n\n for (const metricRangeOptions of metricRanges) {\n const { displayOnHover, name } = metricRangeOptions;\n // if displayOnHover is true, add a data source for the highlighted data\n if (displayOnHover) {\n data.push({\n name: `${name}_highlightedData`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'filter',\n expr: `isValid(${HIGHLIGHTED_SERIES}) && ${HIGHLIGHTED_SERIES} === datum.${SERIES_ID} || isValid(${SELECTED_SERIES}) && ${SELECTED_SERIES} === datum.${SERIES_ID}`,\n },\n ],\n });\n }\n }\n\n return data;\n};\n\n/**\n * gets the signals for the metricRange\n * @param markOptions\n */\nexport const getMetricRangeSignals = (markOptions: LineSpecOptions): Signal[] => {\n const signals: Signal[] = [];\n const { name: markName } = markOptions;\n const metricRanges = getMetricRanges(markOptions);\n\n if (metricRanges.length) {\n addHighlightedSeriesSignalEvents(signals, `${markName}_voronoi`, 2);\n }\n\n return signals;\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {\n BarAnnotationOptions,\n ChartPopoverOptions,\n ChartTooltipOptions,\n ColorFacet,\n ColorScheme,\n DonutSummaryOptions,\n HighlightedItem,\n InteractionMode,\n LineTypeFacet,\n LineWidthFacet,\n MetricRangeOptions,\n OpacityFacet,\n ScaleType,\n ScatterPathOptions,\n SegmentLabelOptions,\n TrendlineOptions,\n} from '../types';\n\nexport const getPopoverMarkName = (chartPopovers: ChartPopoverOptions[], lineName: string): string | undefined => {\n // if the line has a popover, this line is the target for the popover\n if (chartPopovers.length) {\n return lineName;\n }\n};\n\nexport interface LineMarkOptions {\n barAnnotations?: BarAnnotationOptions[];\n chartPopovers?: ChartPopoverOptions[];\n chartTooltips?: ChartTooltipOptions[];\n color: ColorFacet;\n colorScheme: ColorScheme;\n dimension: string;\n displayOnHover?: boolean;\n donutSummaries?: DonutSummaryOptions[];\n hasOnClick?: boolean;\n highlightedItem?: HighlightedItem;\n idKey: string;\n interactiveMarkName?: string; // optional name of the mark that is used for hover and click interactions\n interactionMode?: InteractionMode;\n isHighlightedByDimension?: boolean;\n isHighlightedByGroup?: boolean;\n lineType: LineTypeFacet;\n lineWidth?: LineWidthFacet;\n metric: string;\n metricAxis?: string;\n metricRanges?: MetricRangeOptions[];\n name: string;\n opacity: OpacityFacet;\n popoverMarkName?: string;\n scaleType: ScaleType;\n scatterPaths?: ScatterPathOptions[];\n segmentLabels?: SegmentLabelOptions[];\n staticPoint?: string;\n trendlines?: TrendlineOptions[];\n}\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Data, Mark, Scale, Signal } from 'vega';\n\nimport {\n COLOR_SCALE,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_METRIC,\n DEFAULT_TIME_DIMENSION,\n FILTERED_TABLE,\n INTERACTION_MODE,\n LINE_TYPE_SCALE,\n OPACITY_SCALE,\n} from '@spectrum-charts/constants';\nimport { toCamelCase } from '@spectrum-charts/utils';\n\nimport { addPopoverData } from '../chartPopover/chartPopoverUtils';\nimport { addTooltipData, addTooltipSignals, isHighlightedByGroup } from '../chartTooltip/chartTooltipUtils';\nimport { addTimeTransform, getFilteredTooltipData, getTableData } from '../data/dataUtils';\nimport { getHoverMarkNames, getInteractiveMarkName, hasPopover, isInteractive } from '../marks/markUtils';\nimport {\n getMetricRangeData,\n getMetricRangeGroupMarks,\n getMetricRangeSignals,\n getMetricRanges,\n} from '../metricRange/metricRangeUtils';\nimport { addContinuousDimensionScale, addFieldToFacetScaleDomain, addMetricScale } from '../scale/scaleSpecBuilder';\nimport { addHighlightedItemSignalEvents, addHighlightedSeriesSignalEvents } from '../signal/signalSpecBuilder';\nimport { getFacetsFromOptions } from '../specUtils';\nimport { addTrendlineData, getTrendlineMarks, getTrendlineScales, setTrendlineSignals } from '../trendline';\nimport { ColorScheme, HighlightedItem, LineOptions, LineSpecOptions, ScSpec } from '../types';\nimport { getLineHighlightedData, getLineStaticPointData } from './lineDataUtils';\nimport { getLineHoverMarks, getLineMark } from './lineMarkUtils';\nimport { getLineStaticPoint } from './linePointUtils';\nimport { getPopoverMarkName } from './lineUtils';\n\nexport const addLine = produce<\n ScSpec,\n [LineOptions & { colorScheme?: ColorScheme; highlightedItem?: HighlightedItem; index?: number; idKey: string }]\n>(\n (\n spec,\n {\n chartPopovers = [],\n chartTooltips = [],\n color = { value: 'categorical-100' },\n colorScheme = DEFAULT_COLOR_SCHEME,\n dimension = DEFAULT_TIME_DIMENSION,\n hasOnClick = false,\n index = 0,\n lineType = { value: 'solid' },\n metric = DEFAULT_METRIC,\n metricAxis,\n metricRanges = [],\n name,\n opacity = { value: 1 },\n scaleType = 'time',\n trendlines = [],\n ...options\n }\n ) => {\n const lineName = toCamelCase(name || `line${index}`);\n // put options back together now that all defaults are set\n const lineOptions: LineSpecOptions = {\n chartPopovers,\n chartTooltips,\n color,\n colorScheme,\n dimension,\n hasOnClick,\n index,\n interactiveMarkName: getInteractiveMarkName(\n {\n chartPopovers,\n chartTooltips,\n hasOnClick,\n highlightedItem: options.highlightedItem,\n metricRanges,\n trendlines,\n },\n lineName\n ),\n lineType,\n metric,\n metricAxis,\n metricRanges,\n name: lineName,\n opacity,\n popoverMarkName: getPopoverMarkName(chartPopovers, lineName),\n scaleType,\n trendlines,\n ...options,\n };\n lineOptions.isHighlightedByGroup = isHighlightedByGroup(lineOptions);\n\n spec.data = addData(spec.data ?? [], lineOptions);\n spec.signals = addSignals(spec.signals ?? [], lineOptions);\n spec.scales = setScales(spec.scales ?? [], lineOptions);\n spec.marks = addLineMarks(spec.marks ?? [], lineOptions);\n\n return spec;\n }\n);\n\nexport const addData = produce<Data[], [LineSpecOptions]>((data, options) => {\n const { chartTooltips, dimension, highlightedItem, isSparkline, isMethodLast, name, scaleType, staticPoint } =\n options;\n if (scaleType === 'time') {\n const tableData = getTableData(data);\n tableData.transform = addTimeTransform(tableData.transform ?? [], dimension);\n }\n if (isInteractive(options) || highlightedItem !== undefined) {\n data.push(\n getLineHighlightedData(name, options.idKey, FILTERED_TABLE, hasPopover(options), isHighlightedByGroup(options))\n );\n data.push(getFilteredTooltipData(chartTooltips));\n }\n if (staticPoint || isSparkline)\n data.push(getLineStaticPointData(name, staticPoint, FILTERED_TABLE, isSparkline, isMethodLast));\n addTrendlineData(data, options);\n addTooltipData(data, options, false);\n addPopoverData(data, options);\n data.push(...getMetricRangeData(options));\n});\n\nexport const addSignals = produce<Signal[], [LineSpecOptions]>((signals, options) => {\n const { idKey, name } = options;\n setTrendlineSignals(signals, options);\n signals.push(...getMetricRangeSignals(options));\n\n if (!isInteractive(options)) return;\n addHighlightedItemSignalEvents(signals, `${name}_voronoi`, idKey, 2);\n addHighlightedSeriesSignalEvents(signals, `${name}_voronoi`, 2);\n addHoverSignals(signals, options);\n addTooltipSignals(signals, options);\n});\n\nexport const setScales = produce<Scale[], [LineSpecOptions]>((scales, options) => {\n const { metricAxis, dimension, color, lineType, opacity, padding, scaleType } = options;\n // add dimension scale\n addContinuousDimensionScale(scales, { scaleType, dimension, padding });\n // add color to the color domain\n addFieldToFacetScaleDomain(scales, COLOR_SCALE, color);\n // add lineType to the lineType domain\n addFieldToFacetScaleDomain(scales, LINE_TYPE_SCALE, lineType);\n // add opacity to the opacity domain\n addFieldToFacetScaleDomain(scales, OPACITY_SCALE, opacity);\n // find the linear scale and add our fields to it\n addMetricScale(scales, getMetricKeys(options));\n // add linear scale with custom name\n if (metricAxis) {\n addMetricScale(scales, getMetricKeys(options), 'y', metricAxis);\n }\n // add trendline scales\n scales.push(...getTrendlineScales(options));\n return scales;\n});\n\n// The order that marks are added is important since it determines the draw order.\nexport const addLineMarks = produce<Mark[], [LineSpecOptions]>((marks, options) => {\n const { color, highlightedItem, isSparkline, lineType, name, opacity, staticPoint } = options;\n\n const { facets } = getFacetsFromOptions({ color, lineType, opacity });\n\n marks.push({\n name: `${name}_group`,\n type: 'group',\n from: {\n facet: {\n name: `${name}_facet`,\n data: FILTERED_TABLE,\n groupby: facets,\n },\n },\n marks: [getLineMark(options, `${name}_facet`)],\n });\n if (staticPoint || isSparkline) marks.push(getLineStaticPoint(options));\n marks.push(...getMetricRangeGroupMarks(options));\n if (isInteractive(options) || highlightedItem !== undefined) {\n marks.push(...getLineHoverMarks(options, `${FILTERED_TABLE}ForTooltip`));\n }\n marks.push(...getTrendlineMarks(options));\n});\n\nconst getMetricKeys = (lineOptions: LineSpecOptions) => {\n const metricKeys = [lineOptions.metric];\n\n // metric range fields should be added if metric-axis will be scaled to fit\n const metricRanges = getMetricRanges(lineOptions);\n metricRanges.forEach((metricRange) => {\n if (metricRange.scaleAxisToFit) metricKeys.push(metricRange.metricStart, metricRange.metricEnd);\n });\n\n return metricKeys;\n};\n\nconst addHoverSignals = (signals: Signal[], options: LineSpecOptions) => {\n const { idKey, interactionMode, name } = options;\n if (interactionMode !== INTERACTION_MODE.ITEM) return;\n getHoverMarkNames(name).forEach((hoverMarkName) => {\n addHighlightedItemSignalEvents(signals, hoverMarkName, idKey, 1);\n addHighlightedSeriesSignalEvents(signals, hoverMarkName, 1);\n });\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { SourceData } from 'vega';\n\nimport { HIGHLIGHTED_GROUP, HIGHLIGHTED_ITEM, SELECTED_ITEM } from '@spectrum-charts/constants';\n\n/**\n * gets the data used for highlighting hovered data points\n * @param name\n * @param source\n * @returns\n */\nexport const getLineHighlightedData = (\n name: string,\n idKey: string,\n source: string,\n hasPopover: boolean,\n hasGroupId: boolean\n): SourceData => {\n const highlightedExpr = hasGroupId\n ? `${HIGHLIGHTED_GROUP} === datum.${name}_highlightGroupId`\n : `isArray(${HIGHLIGHTED_ITEM}) && indexof(${HIGHLIGHTED_ITEM}, datum.${idKey}) > -1 || ${HIGHLIGHTED_ITEM} === datum.${idKey}`;\n const expr = hasPopover\n ? `${SELECTED_ITEM} && ${SELECTED_ITEM} === datum.${idKey} || !${SELECTED_ITEM} && ${highlightedExpr}`\n : highlightedExpr;\n return {\n name: `${name}_highlightedData`,\n source,\n transform: [\n {\n type: 'filter',\n expr,\n },\n ],\n };\n};\n\n/**\n * gets the data used for displaying points\n * @param name\n * @param staticPoint\n * @param source\n * @param isSparkline\n * @param isMethodLast\n * @returns\n */\nexport const getLineStaticPointData = (\n name: string,\n staticPoint: string | undefined,\n source: string,\n isSparkline: boolean | undefined,\n isMethodLast: boolean | undefined\n): SourceData => {\n const expr =\n isSparkline && isMethodLast ? \"datum === data('table')[data('table').length - 1]\" : `datum.${staticPoint} === true`;\n return {\n name: `${name}_staticPointData`,\n source,\n transform: [\n {\n type: 'filter',\n expr,\n },\n ],\n };\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\n\nimport { DEFAULT_COLOR_SCHEME, DEFAULT_TIME_DIMENSION } from '@spectrum-charts/constants';\nimport { combineNames, toCamelCase } from '@spectrum-charts/utils';\n\nimport { addBar } from '../bar/barSpecBuilder';\nimport { addLine } from '../line/lineSpecBuilder';\nimport { BarOptions, ColorScheme, ComboOptions, HighlightedItem, LineOptions, ScSpec } from '../types';\n\nexport const addCombo = produce<\n ScSpec,\n [ComboOptions & { colorScheme?: ColorScheme; highlightedItem?: HighlightedItem; index?: number; idKey: string }]\n>(\n (\n spec,\n {\n colorScheme = DEFAULT_COLOR_SCHEME,\n highlightedItem,\n idKey,\n index = 0,\n name,\n marks = [],\n dimension = DEFAULT_TIME_DIMENSION,\n }\n ) => {\n let { barCount, lineCount } = initializeComponentCounts();\n const comboName = toCamelCase(name || `combo${index}`);\n\n spec = [...marks].reduce((acc: ScSpec, mark) => {\n switch (mark.markType) {\n case 'bar':\n barCount++;\n return addBar(acc, {\n ...mark,\n colorScheme,\n highlightedItem,\n idKey,\n index: barCount,\n name: getComboMarkName(mark, comboName, barCount),\n dimension: getDimension(mark, dimension),\n });\n case 'line':\n default:\n lineCount++;\n return addLine(acc, {\n ...mark,\n colorScheme,\n highlightedItem,\n idKey,\n index: lineCount,\n name: getComboMarkName(mark, comboName, lineCount),\n dimension: getDimension(mark, dimension),\n });\n }\n }, spec);\n\n return spec;\n }\n);\n\nconst initializeComponentCounts = () => {\n return { barCount: -1, lineCount: -1 };\n};\n\nexport const getComboMarkName = (mark: BarOptions | LineOptions, comboName: string, index: number) => {\n if (mark.name) {\n return mark.name;\n }\n const displayName = getDisplayName(mark.markType);\n return combineNames(comboName, `${displayName}${index}`);\n};\n\nconst getDisplayName = (markType: string): string => {\n if (!markType) return '';\n return markType.charAt(0).toUpperCase() + markType.slice(1);\n};\n\nconst getDimension = (mark: BarOptions | LineOptions, dimension?: string) => mark.dimension ?? dimension;\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport {\n EncodeEntryName,\n GroupMark,\n Mark,\n NumericValueRef,\n ProductionRule,\n Signal,\n SourceData,\n TextBaselineValueRef,\n TextEncodeEntry,\n TextValueRef,\n ThresholdScale,\n} from 'vega';\n\nimport {\n DONUT_RADIUS,\n DONUT_SUMMARY_FONT_SIZE_RATIO,\n DONUT_SUMMARY_MIN_RADIUS,\n FILTERED_TABLE,\n} from '@spectrum-charts/constants';\n\nimport { getTextNumberFormat } from '../textUtils';\nimport { DonutSpecOptions, DonutSummaryOptions, DonutSummarySpecOptions } from '../types';\n\n/**\n * Gets the DonutSummary component from the children if one exists\n * @param donutOptions\n * @returns\n */\nconst getDonutSummary = (options: DonutSpecOptions): DonutSummarySpecOptions | undefined => {\n if (!options.donutSummaries.length) {\n return;\n }\n return applyDonutSummaryPropDefaults(options.donutSummaries[0], options);\n};\n\n/**\n * Applies all default options, converting DonutSummaryOptions into DonutSummarySpecOptions\n * @param donutSummaryOptions\n * @param donutOptions\n * @returns\n */\nconst applyDonutSummaryPropDefaults = (\n { numberFormat = 'shortNumber', ...options }: DonutSummaryOptions,\n donutOptions: DonutSpecOptions\n): DonutSummarySpecOptions => ({\n donutOptions,\n numberFormat,\n ...options,\n});\n\n/**\n * Gets the data for the donut summary\n * @param donutOptions\n * @returns SourceData[]\n */\nexport const getDonutSummaryData = (donutOptions: DonutSpecOptions): SourceData[] => {\n const donutSummary = getDonutSummary(donutOptions);\n if (!donutSummary || donutOptions.isBoolean) {\n return [];\n }\n return [\n {\n name: `${donutOptions.name}_summaryData`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'aggregate',\n fields: [donutOptions.metric],\n ops: ['sum'],\n as: ['sum'],\n },\n ],\n },\n ];\n};\n\n/**\n * Gets the required scales for the donut summary\n * @param donutOptions\n * @returns ThresholdScale[]\n */\nexport const getDonutSummaryScales = (donutOptions: DonutSpecOptions): ThresholdScale[] => {\n const donutSummary = getDonutSummary(donutOptions);\n if (!donutSummary) {\n return [];\n }\n return [\n // This scale will snap the fontsize to the spectrum font sizes L - XXXXL\n // 28 is the min, 60 is the max.\n {\n name: `${donutOptions.name}_summaryFontSizeScale`,\n type: 'threshold',\n domain: [32, 36, 40, 45, 50, 60],\n range: [28, 32, 36, 40, 45, 50, 60],\n },\n ];\n};\n\n/**\n * Gets the signals for the donut summary\n * @param donutOptions\n * @returns Signal[]\n */\nexport const getDonutSummarySignals = (donutOptions: DonutSpecOptions): Signal[] => {\n const donutSummary = getDonutSummary(donutOptions);\n if (!donutSummary) {\n return [];\n }\n const { name: donutName, holeRatio } = donutOptions;\n return [\n {\n name: `${donutName}_summaryFontSize`,\n update: `scale('${donutName}_summaryFontSizeScale', ${DONUT_RADIUS} * ${holeRatio} * ${DONUT_SUMMARY_FONT_SIZE_RATIO})`,\n },\n ];\n};\n\n/**\n * Gets all the marks for the donut summary\n * @param donutOptions\n * @returns GroupMark[]\n */\nexport const getDonutSummaryMarks = (options: DonutSpecOptions): GroupMark[] => {\n const donutSummary = getDonutSummary(options);\n if (!donutSummary) {\n return [];\n }\n const marks: GroupMark[] = [];\n if (options.isBoolean) {\n marks.push(getBooleanDonutSummaryGroupMark(donutSummary));\n } else {\n marks.push(getDonutSummaryGroupMark(donutSummary));\n }\n return marks;\n};\n\n/**\n * Gets the group mark for the donut summary\n * @param donutSummaryOptions\n * @returns GorupMark\n */\nexport const getDonutSummaryGroupMark = (options: DonutSummarySpecOptions): GroupMark => {\n const { donutOptions, label } = options;\n const groupMark: Mark = {\n type: 'group',\n name: `${donutOptions.name}_summaryGroup`,\n marks: [\n {\n type: 'text',\n name: `${donutOptions.name}_summaryValue`,\n from: { data: `${donutOptions.name}_summaryData` },\n encode: getSummaryValueEncode(options),\n },\n ],\n };\n if (label) {\n groupMark.marks?.push({\n type: 'text',\n name: `${donutOptions.name}_summaryLabel`,\n from: { data: `${donutOptions.name}_summaryData` },\n encode: getSummaryLabelEncode({ ...options, label }),\n });\n }\n return groupMark;\n};\n\n/**\n * Gets the group mark for a boolean donut summary\n * @param donutSummaryOptions\n * @returns GroupMark\n */\nexport const getBooleanDonutSummaryGroupMark = (options: DonutSummarySpecOptions): GroupMark => {\n const { donutOptions, label } = options;\n const groupMark: Mark = {\n type: 'group',\n name: `${donutOptions.name}_percentText`,\n marks: [\n {\n type: 'text',\n name: `${donutOptions.name}_booleanSummaryValue`,\n from: { data: `${donutOptions.name}_booleanData` },\n encode: getSummaryValueEncode(options),\n },\n ],\n };\n if (label) {\n groupMark.marks?.push({\n type: 'text',\n name: `${donutOptions.name}_booleanSummaryLabel`,\n from: { data: `${donutOptions.name}_booleanData` },\n encode: getSummaryLabelEncode({ ...options, label }),\n });\n }\n return groupMark;\n};\n\n/**\n * Gets the encode for the summary value\n * @param donutSummaryOptions\n * @returns encode\n */\nconst getSummaryValueEncode = (options: DonutSummarySpecOptions): Partial<Record<EncodeEntryName, TextEncodeEntry>> => {\n const { donutOptions, label } = options;\n return {\n update: {\n x: { signal: 'width / 2' },\n y: { signal: 'height / 2' },\n text: getSummaryValueText(options),\n fontSize: [\n { test: `${DONUT_RADIUS} * ${donutOptions.holeRatio} < ${DONUT_SUMMARY_MIN_RADIUS}`, value: 0 },\n { signal: `${donutOptions.name}_summaryFontSize` },\n ],\n align: { value: 'center' },\n baseline: getSummaryValueBaseline(label),\n limit: getSummaryValueLimit(options),\n },\n };\n};\n\n/**\n * Gets the text value for the summary value\n * @param donutSummaryOptions\n * @returns TextValueref\n */\nexport const getSummaryValueText = ({\n donutOptions,\n numberFormat,\n}: DonutSummarySpecOptions): ProductionRule<TextValueRef> => {\n if (donutOptions.isBoolean) {\n return { signal: `format(datum['${donutOptions.metric}'], '.0%')` };\n }\n return [...getTextNumberFormat(numberFormat, 'sum'), { field: 'sum' }];\n};\n\n/**\n * Gets the baseline for the summary value\n * @param label\n * @returns TextBaselineValueRef\n */\nexport const getSummaryValueBaseline = (label?: string): TextBaselineValueRef => {\n if (label) {\n return { value: 'alphabetic' };\n }\n // If there isn't a label, the text should be vertically centered\n return { value: 'middle' };\n};\n\n/**\n * Gets the limit for the summary value\n * @param donutSummaryOptions\n * @returns NumericValueRef\n */\nexport const getSummaryValueLimit = ({ donutOptions, label }: DonutSummarySpecOptions): NumericValueRef => {\n const { holeRatio, name } = donutOptions;\n // if there isn't a label, the height of the font from the center of the donut is 1/2 the font size\n const fontHeight = label ? `${name}_summaryFontSize` : `${name}_summaryFontSize * 0.5`;\n const donutInnerRadius = `${DONUT_RADIUS} * ${holeRatio}`;\n\n return {\n // This is the max length of the text that can be displayed in the donut summary\n // If the text is longer than this, it will be truncated\n // It is calculated using the Pythagorean theorem\n signal: `2 * sqrt(pow(${donutInnerRadius}, 2) - pow(${fontHeight}, 2))`,\n };\n};\n\n/**\n * Gets the encode for the metric label\n * @param donutSummaryOptions\n * @returns encode\n */\nexport const getSummaryLabelEncode = ({\n donutOptions,\n label,\n}: DonutSummarySpecOptions & { label: string }): Partial<Record<EncodeEntryName, TextEncodeEntry>> => {\n return {\n update: {\n x: { signal: 'width / 2' },\n y: { signal: 'height / 2' },\n dy: { signal: `ceil(${donutOptions.name}_summaryFontSize * 0.25)` },\n text: { value: label },\n fontSize: [\n { test: `${DONUT_RADIUS} * ${donutOptions.holeRatio} < ${DONUT_SUMMARY_MIN_RADIUS}`, value: 0 },\n { signal: `ceil(${donutOptions.name}_summaryFontSize * 0.5)` },\n ],\n align: { value: 'center' },\n baseline: { value: 'top' },\n limit: {\n signal: `2 * sqrt(pow(${DONUT_RADIUS} * ${donutOptions.holeRatio}, 2) - pow(${donutOptions.name}_summaryFontSize * 0.75, 2))`,\n },\n },\n };\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { GroupMark, NumericValueRef, ProductionRule, TextEncodeEntry, TextMark, TextValueRef } from 'vega';\n\nimport { DONUT_RADIUS, DONUT_SEGMENT_LABEL_MIN_ANGLE, FILTERED_TABLE } from '@spectrum-charts/constants';\n\nimport { getTextNumberFormat } from '../textUtils';\nimport { DonutSpecOptions, SegmentLabelOptions, SegmentLabelSpecOptions } from '../types';\n\n/**\n * Gets the SegmentLabel component from the children if one exists\n * @param donutOptions\n * @returns segmentLabelOptions\n */\nconst getSegmentLabel = (options: DonutSpecOptions): SegmentLabelSpecOptions | undefined => {\n if (!options.segmentLabels.length) {\n return;\n }\n return applySegmentLabelPropDefaults(options.segmentLabels[0], options);\n};\n\n/**\n * Applies all default options, converting SegmentLabelOptions into SegmentLabelSpecOptions\n * @param segmentLabelOptions\n * @param donutOptions\n * @returns SegmentLabelSpecOptions\n */\nconst applySegmentLabelPropDefaults = (\n { percent = false, value = false, valueFormat = 'standardNumber', ...options }: SegmentLabelOptions,\n donutOptions: DonutSpecOptions\n): SegmentLabelSpecOptions => ({\n donutOptions,\n percent,\n value,\n valueFormat,\n ...options,\n});\n\n/**\n * Gets the marks for the segment label. If there isn't a segment label, an empty array is returned.\n * @param donutOptions\n * @returns GroupMark[]\n */\nexport const getSegmentLabelMarks = (donutOptions: DonutSpecOptions): GroupMark[] => {\n const { isBoolean, name } = donutOptions;\n // segment labels are not supported for boolean variants\n if (isBoolean) return [];\n\n const segmentLabel = getSegmentLabel(donutOptions);\n // if there isn't a segment label, we don't need to do anything\n if (!segmentLabel) return [];\n\n return [\n {\n name: `${name}_segmentLabelGroup`,\n type: 'group',\n marks: [getSegmentLabelTextMark(segmentLabel), ...getSegmentLabelValueTextMark(segmentLabel)],\n },\n ];\n};\n\n/**\n * Gets the text mark for the segment label\n * @param segmentLabelOptions\n * @returns TextMark\n */\nexport const getSegmentLabelTextMark = ({\n labelKey,\n value,\n percent,\n donutOptions,\n}: SegmentLabelSpecOptions): TextMark => {\n const { name, color } = donutOptions;\n return {\n type: 'text',\n name: `${name}_segmentLabel`,\n from: { data: FILTERED_TABLE },\n encode: {\n enter: {\n ...getBaseSegmentLabelEnterEncode(name),\n text: { field: labelKey ?? color },\n fontWeight: { value: 'bold' },\n dy:\n value || percent\n ? {\n signal: `datum['${name}_arcTheta'] <= 0.5 * PI || datum['${name}_arcTheta'] >= 1.5 * PI ? -16 : 0`,\n }\n : undefined,\n },\n update: positionEncodings,\n },\n };\n};\n\n/**\n * Gets the text mark for the segment label values (percent and/or value)\n * @param segmentLabelOptions\n * @returns TextMark[]\n */\nexport const getSegmentLabelValueTextMark = (options: SegmentLabelSpecOptions): TextMark[] => {\n if (!options.value && !options.percent) return [];\n const { donutOptions } = options;\n\n return [\n {\n type: 'text',\n name: `${donutOptions.name}_segmentLabelValue`,\n from: { data: FILTERED_TABLE },\n encode: {\n enter: {\n ...getBaseSegmentLabelEnterEncode(donutOptions.name),\n text: getSegmentLabelValueText(options),\n dy: {\n signal: `datum['${donutOptions.name}_arcTheta'] <= 0.5 * PI || datum['${donutOptions.name}_arcTheta'] >= 1.5 * PI ? 0 : 16`,\n },\n },\n update: positionEncodings,\n },\n },\n ];\n};\n\n/**\n * Gets all the standard entry encodes for segment label text marks\n * @param name\n * @returns TextEncodeEntry\n */\nconst getBaseSegmentLabelEnterEncode = (name: string): TextEncodeEntry => ({\n radius: { signal: `${DONUT_RADIUS} + 6` },\n theta: { field: `${name}_arcTheta` },\n fontSize: getSegmentLabelFontSize(name),\n align: {\n signal: `datum['${name}_arcTheta'] <= PI ? 'left' : 'right'`,\n },\n baseline: {\n // if the center of the arc is in the top half of the donut, the text baseline should be bottom, else top\n signal: `datum['${name}_arcTheta'] <= 0.5 * PI || datum['${name}_arcTheta'] >= 1.5 * PI ? 'bottom' : 'top'`,\n },\n});\n/**\n * position encodings\n */\nconst positionEncodings: TextEncodeEntry = {\n x: { signal: 'width / 2' },\n y: { signal: 'height / 2' },\n};\n\n/**\n * Gets the text value ref for the segment label values (percent and/or value)\n * @param segmentLabelOptions\n * @returns TextValueRef\n */\nexport const getSegmentLabelValueText = ({\n donutOptions,\n percent,\n value,\n valueFormat,\n}: SegmentLabelSpecOptions): ProductionRule<TextValueRef> | undefined => {\n const percentSignal = `format(datum['${donutOptions.name}_arcPercent'], '.0%')`;\n if (value) {\n // to support `shortNumber` and `shortCurrency` we need to use the consistent logic\n const rules = getTextNumberFormat(valueFormat, donutOptions.metric) as { test?: string; signal: string }[];\n if (percent) {\n // rules will be an array so we need to add the percent to each signal\n return rules.map((rule) => ({\n ...rule,\n signal: `${percentSignal} + \"\\\\u00a0\\\\u00a0\" + ${rule.signal}`,\n }));\n }\n return rules;\n }\n\n if (percent) {\n return { signal: percentSignal };\n }\n};\n\n/**\n * Gets the font size for the segment label based on the arc length\n * If the arc length is less than 0.3 radians, the font size is 0\n * @param name\n * @returns NumericValueRef\n */\nconst getSegmentLabelFontSize = (name: string): ProductionRule<NumericValueRef> => {\n // need to use radians for this. 0.3 radians is about 17 degrees\n // if we used arc length, then showing a label could shrink the overall donut size which could make the arc to small\n // that would hide the label which would make the arc bigger which would show the label and so on\n return [{ test: `datum['${name}_arcLength'] < ${DONUT_SEGMENT_LABEL_MIN_ANGLE}`, value: 0 }, { value: 14 }];\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Data, FormulaTransform, Mark, PieTransform, Scale, Signal } from 'vega';\n\nimport {\n COLOR_SCALE,\n DEFAULT_COLOR,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_METRIC,\n FILTERED_TABLE,\n} from '@spectrum-charts/constants';\nimport { toCamelCase } from '@spectrum-charts/utils';\n\nimport { isInteractive } from '../marks/markUtils';\nimport { addFieldToFacetScaleDomain } from '../scale/scaleSpecBuilder';\nimport { addHighlightedItemSignalEvents } from '../signal/signalSpecBuilder';\nimport { ColorScheme, DonutOptions, DonutSpecOptions, HighlightedItem, ScSpec } from '../types';\nimport {\n getDonutSummaryData,\n getDonutSummaryMarks,\n getDonutSummaryScales,\n getDonutSummarySignals,\n} from './donutSummaryUtils';\nimport { getArcMark } from './donutUtils';\nimport { getSegmentLabelMarks } from './segmentLabelUtils';\n\nexport const addDonut = produce<\n ScSpec,\n [DonutOptions & { colorScheme?: ColorScheme; highlightedItem?: HighlightedItem; index?: number; idKey: string }]\n>(\n (\n spec,\n {\n chartPopovers = [],\n chartTooltips = [],\n color = DEFAULT_COLOR,\n colorScheme = DEFAULT_COLOR_SCHEME,\n donutSummaries = [],\n index = 0,\n metric = DEFAULT_METRIC,\n name,\n startAngle = 0,\n holeRatio = 0.85,\n isBoolean = false,\n segmentLabels = [],\n ...options\n }\n ) => {\n // put options back together now that all defaults are set\n const donutOptions: DonutSpecOptions = {\n chartPopovers,\n chartTooltips,\n color,\n colorScheme,\n donutSummaries,\n holeRatio,\n index,\n isBoolean,\n metric,\n name: toCamelCase(name ?? `donut${index}`),\n segmentLabels,\n startAngle,\n ...options,\n };\n\n spec.data = addData(spec.data ?? [], donutOptions);\n spec.scales = addScales(spec.scales ?? [], donutOptions);\n spec.marks = addMarks(spec.marks ?? [], donutOptions);\n spec.signals = addSignals(spec.signals ?? [], donutOptions);\n }\n);\n\nexport const addData = produce<Data[], [DonutSpecOptions]>((data, options) => {\n const { name, isBoolean } = options;\n const filteredTableIndex = data.findIndex((d) => d.name === FILTERED_TABLE);\n\n //set up transform\n data[filteredTableIndex].transform = data[filteredTableIndex].transform ?? [];\n data[filteredTableIndex].transform?.push(...getPieTransforms(options));\n\n if (isBoolean) {\n //select first data point for our boolean value\n data.push({\n name: `${name}_booleanData`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'window',\n ops: ['row_number'],\n as: [`${name}_rscRowIndex`],\n },\n {\n type: 'filter',\n expr: `datum.${name}_rscRowIndex === 1`, // Keep only the first row\n },\n ],\n });\n }\n data.push(...getDonutSummaryData(options));\n});\n\nconst getPieTransforms = ({ startAngle, metric, name }: DonutSpecOptions): (FormulaTransform | PieTransform)[] => [\n {\n type: 'pie',\n field: metric,\n startAngle,\n endAngle: { signal: `${startAngle} + 2 * PI` },\n as: [`${name}_startAngle`, `${name}_endAngle`],\n },\n {\n type: 'formula',\n as: `${name}_arcTheta`,\n expr: `(datum['${name}_startAngle'] + datum['${name}_endAngle']) / 2`,\n },\n {\n type: 'formula',\n as: `${name}_arcLength`,\n expr: `datum['${name}_endAngle'] - datum['${name}_startAngle']`,\n },\n {\n type: 'formula',\n as: `${name}_arcPercent`,\n expr: `datum['${name}_arcLength'] / (2 * PI)`,\n },\n];\n\nexport const addScales = produce<Scale[], [DonutSpecOptions]>((scales, options) => {\n const { color } = options;\n addFieldToFacetScaleDomain(scales, COLOR_SCALE, color);\n scales.push(...getDonutSummaryScales(options));\n});\n\nexport const addMarks = produce<Mark[], [DonutSpecOptions]>((marks, options) => {\n marks.push(getArcMark(options));\n marks.push(...getDonutSummaryMarks(options));\n marks.push(...getSegmentLabelMarks(options));\n});\n\nexport const addSignals = produce<Signal[], [DonutSpecOptions]>((signals, options) => {\n const { chartTooltips, idKey, name } = options;\n signals.push(...getDonutSummarySignals(options));\n if (!isInteractive(options)) return;\n addHighlightedItemSignalEvents(signals, name, idKey, 1, chartTooltips[0]?.excludeDataKeys);\n});\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { ArcMark } from 'vega';\n\nimport { DONUT_RADIUS, FILTERED_TABLE, SELECTED_ITEM } from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { getColorProductionRule, getCursor, getMarkOpacity, getTooltip } from '../marks/markUtils';\nimport { DonutSpecOptions } from '../types';\n\nexport const getArcMark = (options: DonutSpecOptions): ArcMark => {\n const { chartPopovers, chartTooltips, color, colorScheme, holeRatio, idKey, name } = options;\n return {\n type: 'arc',\n name,\n description: name,\n from: { data: FILTERED_TABLE },\n encode: {\n enter: {\n fill: getColorProductionRule(color, colorScheme),\n x: { signal: 'width / 2' },\n y: { signal: 'height / 2' },\n tooltip: getTooltip(chartTooltips, name),\n stroke: { value: getColorValue('static-blue', colorScheme) },\n },\n update: {\n startAngle: { field: `${name}_startAngle` },\n endAngle: { field: `${name}_endAngle` },\n padAngle: { value: 0.01 },\n innerRadius: { signal: `${holeRatio} * ${DONUT_RADIUS}` },\n outerRadius: { signal: DONUT_RADIUS },\n opacity: getMarkOpacity(options),\n cursor: getCursor(chartPopovers),\n strokeWidth: [{ test: `${SELECTED_ITEM} === datum.${idKey}`, value: 2 }, { value: 0 }],\n },\n },\n };\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { GroupMark, Mark, NumericValueRef } from 'vega';\n\nimport {\n COLOR_SCALE,\n HIGHLIGHTED_GROUP,\n HIGHLIGHTED_SERIES,\n HIGHLIGHT_CONTRAST_RATIO,\n SERIES_ID,\n} from '@spectrum-charts/constants';\n\n/**\n * Adds opacity tests for the fill and stroke of marks that use the color scale to set the fill or stroke value.\n */\nexport const setHoverOpacityForMarks = (marks: Mark[], keys?: string[], name?: string) => {\n if (!marks.length) return;\n const flatMarks = flattenMarks(marks);\n const seriesMarks = flatMarks.filter(markUsesSeriesColorScale);\n seriesMarks.forEach((mark) => {\n // need to drill down to the prop we need to set and add missing properties if needed\n if (!mark.encode) {\n mark.encode = { update: {} };\n }\n if (!mark.encode.update) {\n mark.encode.update = {};\n }\n const { update } = mark.encode;\n const { opacity } = update;\n\n if (opacity !== undefined) {\n // the new production rule for highlighting\n const highlightOpacityRule = getHighlightOpacityRule(keys, name);\n\n if (!Array.isArray(update.opacity)) {\n update.opacity = [];\n }\n // need to insert the new test in the second to last slot\n const opacityRuleInsertIndex = Math.max(update.opacity.length - 1, 0);\n update.opacity.splice(opacityRuleInsertIndex, 0, highlightOpacityRule);\n }\n });\n};\n\nexport const getHighlightOpacityRule = (keys?: string[], name?: string): { test?: string } & NumericValueRef => {\n let test = `isValid(${HIGHLIGHTED_SERIES}) && ${HIGHLIGHTED_SERIES} !== datum.${SERIES_ID}`;\n if (keys?.length) {\n test = `isValid(${HIGHLIGHTED_GROUP}) && ${HIGHLIGHTED_GROUP} !== datum.${name}_highlightGroupId`;\n }\n return { test, value: 1 / HIGHLIGHT_CONTRAST_RATIO };\n};\n\n/**\n * Determines if the supplied mark uses the color scale to set the fill or stroke value.\n * This is used to determine if we need to set the opacity for the mark when it is hovered\n * @param mark\n * @returns boolean\n */\nexport const markUsesSeriesColorScale = (mark: Mark): boolean => {\n const enter = mark.encode?.enter;\n if (!enter) return false;\n const { fill, stroke } = enter;\n if (fill && 'scale' in fill && fill.scale === COLOR_SCALE) {\n return true;\n }\n // some marks use a 2d color scale, these will use a signal expression to get the color for that series\n if (fill && 'signal' in fill && fill.signal.includes(\"scale('colors',\")) {\n return true;\n }\n if (stroke && 'scale' in stroke && stroke.scale === COLOR_SCALE) {\n return true;\n }\n return false;\n};\n\n/**\n * Recursively flattens all nested marks into a flat array\n * @param marks\n * @returns\n */\nexport const flattenMarks = (marks: Mark[]): Mark[] => {\n let result = marks;\n for (const mark of marks) {\n if (isGroupMark(mark) && mark.marks) {\n result = [...result, ...flattenMarks(mark.marks)];\n }\n }\n return result;\n};\n\nconst isGroupMark = (mark: Mark): mark is GroupMark => {\n return mark.type === 'group';\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Scale, ScaleMultiFieldsRef } from 'vega';\n\nimport {\n COLOR_SCALE,\n LINEAR_COLOR_SCALE,\n LINE_TYPE_SCALE,\n OPACITY_SCALE,\n SYMBOL_SHAPE_SCALE,\n SYMBOL_SIZE_SCALE,\n} from '@spectrum-charts/constants';\n\nimport { FacetType, SecondaryFacetType } from '../types';\nimport { Facet } from './legendUtils';\n\n/**\n * These are all the scale names that are used for facets\n */\nconst facetScaleNames: (FacetType | SecondaryFacetType)[] = [\n COLOR_SCALE,\n LINE_TYPE_SCALE,\n LINEAR_COLOR_SCALE,\n OPACITY_SCALE,\n 'secondaryColor',\n 'secondaryLineType',\n 'secondaryOpacity',\n 'secondarySymbolShape',\n SYMBOL_SHAPE_SCALE,\n SYMBOL_SIZE_SCALE,\n];\n\n/**\n * Goes through all the scales and finds all the facets that are used\n * A facet is a key in the data that is used to differentiate the data\n * Examples are color based on 'operatingSystem', size based on 'weight', lineType based on 'timePeriod' etc.\n * @param scales\n * @returns Factes\n */\nexport const getFacets = (scales: Scale[]): { ordinalFacets: Facet[]; continuousFacets: Facet[] } => {\n const ordinalFacets: Facet[] = [];\n const continuousFacets: Facet[] = [];\n\n scales.forEach((scale) => {\n if (\n facetScaleNames.includes(scale.name as FacetType) &&\n isScaleWithMultiFields(scale) &&\n scale.domain.fields.length\n ) {\n if (scale.type === 'ordinal' || scale.type === 'point') {\n ordinalFacets.push({\n facetType: scale.name as FacetType,\n field: scale.domain.fields[0].toString(),\n });\n } else {\n continuousFacets.push({ facetType: scale.name as FacetType, field: scale.domain.fields[0].toString() });\n }\n }\n });\n return { ordinalFacets, continuousFacets };\n};\n\n/**\n * This function goes through all the scales and finds the scales that use the provided keys\n * Example: if the keys are ['segment', 'event'], this function will find all the scales that use either of those fields so that they can be used to generate the legend\n * @param keys\n * @param scales\n * @returns\n */\nexport const getFacetsFromKeys = (\n keys: string[],\n scales: Scale[]\n): { ordinalFacets: Facet[]; continuousFacets: Facet[] } => {\n const ordinalFacets: Facet[] = [];\n const continuousFacets: Facet[] = [];\n scales.forEach((scale) => {\n if (isScaleWithMultiFields(scale) && scaleHasKey(scale, keys)) {\n if (scale.type === 'ordinal' || scale.type === 'point') {\n ordinalFacets.push({\n facetType: scale.name as FacetType,\n field: scale.domain.fields.find((field) => keys.includes(field.toString()))?.toString() as string,\n });\n } else {\n continuousFacets.push({\n facetType: scale.name as FacetType,\n field: scale.domain.fields.find((field) => keys.includes(field.toString()))?.toString() as string,\n });\n }\n }\n });\n return { ordinalFacets, continuousFacets };\n};\n\n/**\n * Checks if the scale has any of the provided keys\n * @param scale\n * @param keys\n * @returns boolean\n */\nconst scaleHasKey = (scale: ScaleWithMultiFields, keys: string[]): boolean =>\n scale.domain.fields.some((field) => keys.includes(field.toString()));\n\ntype ScaleWithMultiFields = Scale & { domain: ScaleMultiFieldsRef };\n\n/**\n * Checks that the scale has a domain with a fields array\n * @param scale\n * @returns\n */\nconst isScaleWithMultiFields = (scale: Scale): scale is ScaleWithMultiFields => {\n return Boolean('domain' in scale && scale.domain && 'fields' in scale.domain);\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport merge from 'deepmerge';\nimport {\n BaseValueRef,\n Color,\n ColorValueRef,\n FilterTransform,\n GuideEncodeEntry,\n LegendEncode,\n NumericValueRef,\n ProductionRule,\n SignalRef,\n SymbolEncodeEntry,\n} from 'vega';\n\nimport {\n COLOR_SCALE,\n COMPONENT_NAME,\n DEFAULT_OPACITY_RULE,\n FILTERED_TABLE,\n HIGHLIGHTED_GROUP,\n HIGHLIGHTED_SERIES,\n HIGHLIGHT_CONTRAST_RATIO,\n LINE_TYPE_SCALE,\n LINE_WIDTH_SCALE,\n OPACITY_SCALE,\n SELECTED_GROUP,\n SELECTED_SERIES,\n SYMBOL_SHAPE_SCALE,\n SYMBOL_SIZE_SCALE,\n} from '@spectrum-charts/constants';\nimport { getColorValue, spectrumColors } from '@spectrum-charts/themes';\n\nimport { getPathFromSymbolShape } from '../specUtils';\nimport {\n ColorValueV6,\n FacetRef,\n FacetType,\n LegendDescription,\n LegendLabel,\n LegendSpecOptions,\n Position,\n SecondaryFacetType,\n} from '../types';\n\nexport interface Facet {\n facetType: FacetType | SecondaryFacetType;\n field: string;\n}\n\n/**\n * Get the number of columns for the legend\n * @param position\n * @returns\n */\nexport const getColumns = (position: Position): SignalRef | undefined => {\n if (['left', 'right'].includes(position)) return;\n return { signal: 'floor(width / 220)' };\n};\n\n/**\n * Gets the filter transform for hidden entries\n * @param hiddenEntries\n * @returns\n */\nexport const getHiddenEntriesFilter = (hiddenEntries: string[], name: string): FilterTransform[] => {\n if (!hiddenEntries.length) return [];\n return [\n {\n type: 'filter',\n expr: `indexof(${JSON.stringify(hiddenEntries)}, datum.${name}Entries) === -1`,\n },\n ];\n};\n\n/**\n * Get the legend encodings\n * @param facets\n * @param legendOptions\n * @returns\n */\nexport const getEncodings = (facets: Facet[], legendOptions: LegendSpecOptions): LegendEncode => {\n const symbolEncodings = getSymbolEncodings(facets, legendOptions);\n const hoverEncodings = getHoverEncodings(legendOptions);\n const legendLabelsEncodings = getLegendLabelsEncodings(legendOptions.name, legendOptions.legendLabels);\n const showHideEncodings = getShowHideEncodings(legendOptions);\n const clickEncodings = getClickEncodings(legendOptions);\n // merge the encodings together\n return mergeLegendEncodings([\n symbolEncodings,\n legendLabelsEncodings,\n hoverEncodings,\n showHideEncodings,\n clickEncodings,\n ]);\n};\n\nconst getLegendLabelsEncodings = (name: string, legendLabels: LegendLabel[] | undefined): LegendEncode => {\n if (legendLabels) {\n return {\n labels: {\n update: {\n text: [\n {\n // Test whether a legendLabel exists for the seriesName, if not use the seriesName\n test: `indexof(pluck(${name}_labels, 'seriesName'), datum.value) > -1`,\n signal: `${name}_labels[indexof(pluck(${name}_labels, 'seriesName'), datum.value)].label`,\n },\n { signal: 'datum.value' },\n ],\n },\n },\n };\n }\n return {};\n};\n\nconst getHoverEncodings = (options: LegendSpecOptions): LegendEncode => {\n const { highlight, highlightedSeries, name, hasMouseInteraction, descriptions, chartPopovers } = options;\n if (highlight || highlightedSeries || descriptions || chartPopovers?.length) {\n return {\n entries: {\n name: `${name}_legendEntry`,\n interactive: true,\n enter: {\n tooltip: getTooltip(descriptions, name), // only add tooltip if descriptions exist\n },\n update: {\n fill: { value: 'transparent' }, // need something here to trigger the tooltip\n },\n },\n labels: {\n update: {\n opacity: getOpacityEncoding(options),\n },\n },\n symbols: {\n update: {\n opacity: getOpacityEncoding(options),\n },\n },\n };\n } else if (hasMouseInteraction) {\n return {\n entries: {\n name: `${name}_legendEntry`,\n interactive: true,\n enter: {\n fill: { value: 'transparent' },\n },\n },\n };\n }\n\n return {};\n};\n\nconst getTooltip = (descriptions: LegendDescription[] | undefined, name: string) => {\n if (descriptions?.length) {\n return { signal: `merge(datum, {'${COMPONENT_NAME}': '${name}'})` };\n }\n return undefined;\n};\n\n/**\n * simple opacity encoding for legend labels and the symbol stroke opacity\n * @param legendOptions\n * @returns opactiy encoding\n */\nexport const getOpacityEncoding = ({\n highlight,\n highlightedSeries,\n keys,\n chartPopovers,\n}: LegendSpecOptions): ProductionRule<NumericValueRef> | undefined => {\n const highlightSignalName = keys?.length ? HIGHLIGHTED_GROUP : HIGHLIGHTED_SERIES;\n const selectedSignalName = keys?.length ? SELECTED_GROUP : SELECTED_SERIES;\n // only add symbol opacity if highlight is true or highlightedSeries is defined\n if (highlight || highlightedSeries || chartPopovers?.length) {\n return [\n {\n test: `isValid(${highlightSignalName}) && datum.value !== ${highlightSignalName}`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n },\n {\n test: `isValid(${selectedSignalName}) && datum.value !== ${selectedSignalName}`,\n value: 1 / HIGHLIGHT_CONTRAST_RATIO,\n },\n DEFAULT_OPACITY_RULE,\n ];\n }\n return undefined;\n};\n\nexport const getSymbolEncodings = (facets: Facet[], options: LegendSpecOptions): LegendEncode => {\n const { color, lineType, lineWidth, name, opacity, symbolShape, colorScheme } = options;\n const enter: SymbolEncodeEntry = {\n fillOpacity: getSymbolFacetEncoding<number>({ facets, facetType: OPACITY_SCALE, customValue: opacity, name }),\n shape: getSymbolFacetEncoding<string>({\n facets,\n facetType: SYMBOL_SHAPE_SCALE,\n customValue: symbolShape,\n name,\n }),\n size: getSymbolFacetEncoding<number>({ facets, facetType: SYMBOL_SIZE_SCALE, name }),\n strokeDash: getSymbolFacetEncoding<number[]>({\n facets,\n facetType: LINE_TYPE_SCALE,\n customValue: lineType,\n name,\n }),\n strokeWidth: getSymbolFacetEncoding<number>({\n facets,\n facetType: LINE_WIDTH_SCALE,\n customValue: lineWidth,\n name,\n }),\n };\n const update: SymbolEncodeEntry = {\n fill: [\n ...getHiddenSeriesColorRule(options, 'gray-300'),\n getSymbolFacetEncoding<Color>({ facets, facetType: COLOR_SCALE, customValue: color, name }) ?? {\n value: spectrumColors[colorScheme]['categorical-100'],\n },\n ],\n stroke: [\n ...getHiddenSeriesColorRule(options, 'gray-300'),\n getSymbolFacetEncoding<Color>({ facets, facetType: COLOR_SCALE, customValue: color, name }) ?? {\n value: spectrumColors[colorScheme]['categorical-100'],\n },\n ],\n };\n // Remove undefined values\n const symbols: GuideEncodeEntry<SymbolEncodeEntry> = JSON.parse(JSON.stringify({ enter, update }));\n return {\n entries: {\n name: `${name}_legendEntry`,\n },\n symbols,\n };\n};\n\nconst getSymbolFacetEncoding = <T>({\n customValue,\n facets,\n facetType,\n name,\n}: {\n customValue?: FacetRef<T>;\n facets?: Facet[];\n facetType: FacetType;\n name: string;\n}): BaseValueRef<T> | undefined => {\n if (customValue) {\n if (typeof customValue === 'string') {\n return { signal: `scale('${facetType}', data('${name}Aggregate')[datum.index].${customValue})` };\n }\n return { value: customValue.value };\n }\n\n if (!facets) return;\n\n const secondaryFacetMapping: { [key in FacetType]: { scale: SecondaryFacetType; signal: string } } = {\n color: { scale: 'secondaryColor', signal: 'colors' },\n linearColor: { scale: 'secondaryColor', signal: 'colors' },\n lineType: { scale: 'secondaryLineType', signal: 'lineTypes' },\n lineWidth: { scale: 'secondaryLineWidth', signal: 'lineWidths' },\n opacity: { scale: 'secondaryOpacity', signal: 'opacities' },\n symbolShape: { scale: 'secondarySymbolShape', signal: 'symbolShapes' },\n symbolSize: { scale: 'secondarySymbolSize', signal: 'symbolSizes' },\n symbolPathWidth: { scale: 'secondarySymbolPathWidth', signal: 'symbolPathWidths' },\n };\n\n const facet = facets.find((f) => f.facetType === facetType);\n if (!facet) return;\n const secondaryFacet = facets.find((f) => f.facetType === secondaryFacetMapping[facetType].scale);\n if (secondaryFacet) {\n const { scale, signal } = secondaryFacetMapping[facetType];\n return {\n signal: `scale('${signal}', data('${name}Aggregate')[datum.index].${facet.field})[indexof(domain('${scale}'), data('${name}Aggregate')[datum.index].${secondaryFacet.field})% length(scale('${signal}', data('${name}Aggregate')[datum.index].${facet.field}))]`,\n };\n }\n\n return { signal: `scale('${facetType}', data('${name}Aggregate')[datum.index].${facet.field})` };\n};\n\nexport const getHiddenSeriesColorRule = (\n { colorScheme, hiddenSeries, isToggleable, keys, name }: LegendSpecOptions,\n colorValue: ColorValueV6\n): ({\n test?: string;\n} & ColorValueRef)[] => {\n if (!isToggleable && !hiddenSeries.length) return [];\n if (keys?.length) {\n return [\n {\n test: `indexof(pluck(data('${FILTERED_TABLE}'), '${name}_highlightGroupId'), datum.value) === -1`,\n value: getColorValue(colorValue, colorScheme),\n },\n ];\n }\n return [{ test: 'indexof(hiddenSeries, datum.value) !== -1', value: getColorValue(colorValue, colorScheme) }];\n};\n\n/**\n * Gets the required encondings for show/hide toggleable legends\n * @param isToggleable\n * @returns\n */\nexport const getShowHideEncodings = (options: LegendSpecOptions): LegendEncode => {\n const { colorScheme } = options;\n const hiddenSeriesEncode: LegendEncode = {\n labels: {\n update: {\n fill: [...getHiddenSeriesColorRule(options, 'gray-500'), { value: getColorValue('gray-700', colorScheme) }],\n },\n },\n };\n\n return hiddenSeriesEncode;\n};\n\n/**\n * Gets the required encondings for clickable legends\n * @param options\n * @returns\n */\nexport const getClickEncodings = (options: LegendSpecOptions): LegendEncode => {\n const { isToggleable, keys, name, hasOnClick, chartPopovers } = options;\n\n let clickEncode: LegendEncode = {};\n if ((isToggleable && !keys) || hasOnClick || chartPopovers?.length) {\n clickEncode = {\n entries: {\n name: `${name}_legendEntry`,\n interactive: true,\n enter: {\n fill: { value: 'transparent' },\n cursor: { value: 'pointer' },\n },\n },\n };\n }\n return clickEncode;\n};\n\n/**\n * Merge multiple vega spec legend encodings\n * @param encodings\n * @returns\n */\nexport const mergeLegendEncodings = (encodings: LegendEncode[]): LegendEncode => {\n let mergedEncodings = {};\n for (const encoding of encodings) {\n mergedEncodings = merge(mergedEncodings, encoding);\n }\n return mergedEncodings;\n};\n\n/**\n * Gets the symbol type (shape) for the legend\n * @param symbolShape\n * @returns symbolShape\n */\nexport const getSymbolType = (symbolShape: FacetRef<string> | undefined): string => {\n if (symbolShape && typeof symbolShape === 'object' && 'value' in symbolShape)\n return getPathFromSymbolShape(symbolShape.value);\n return 'circle';\n};\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Data, Legend, Mark, Scale, Signal } from 'vega';\n\nimport {\n COLOR_SCALE,\n DEFAULT_COLOR_SCHEME,\n LINEAR_COLOR_SCALE,\n LINE_TYPE_SCALE,\n OPACITY_SCALE,\n SYMBOL_SHAPE_SCALE,\n SYMBOL_SIZE_SCALE,\n} from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { getTableData } from '../data/dataUtils';\nimport { addFieldToFacetScaleDomain } from '../scale/scaleSpecBuilder';\nimport { addHighlighSignalLegendHoverEvents, getGenericValueSignal } from '../signal/signalSpecBuilder';\nimport { getLineWidthPixelsFromLineWidth, getPathFromSymbolShape, getStrokeDashFromLineType } from '../specUtils';\nimport {\n ColorFacet,\n ColorScheme,\n FacetRef,\n LegendOptions,\n LegendSpecOptions,\n LineTypeFacet,\n LineWidthFacet,\n ScSpec,\n SymbolShapeFacet,\n} from '../types';\nimport { getFacets, getFacetsFromKeys } from './legendFacetUtils';\nimport { setHoverOpacityForMarks } from './legendHighlightUtils';\nimport { Facet, getColumns, getEncodings, getHiddenEntriesFilter, getSymbolType } from './legendUtils';\n\nexport const addLegend = produce<\n ScSpec,\n [\n LegendOptions & {\n colorScheme?: ColorScheme;\n index?: number;\n hiddenSeries?: string[];\n highlightedSeries?: string | number;\n }\n ]\n>(\n (\n spec,\n {\n color,\n hasMouseInteraction = false,\n hasOnClick = false,\n hiddenEntries = [],\n hiddenSeries = [],\n highlight = false,\n highlightedSeries,\n index = 0,\n isToggleable = false,\n lineType,\n lineWidth,\n position = 'bottom',\n symbolShape,\n title,\n colorScheme = DEFAULT_COLOR_SCHEME,\n ...options\n }\n ) => {\n const { formattedColor, formattedLineType, formattedLineWidth, formattedSymbolShape } = formatFacetRefsWithPresets(\n color,\n lineType,\n lineWidth,\n symbolShape,\n colorScheme\n );\n\n const name = `legend${index}`;\n\n // put options back together now that all defaults are set\n const legendOptions: LegendSpecOptions = {\n color: formattedColor,\n hasMouseInteraction,\n hasOnClick,\n hiddenEntries,\n hiddenSeries,\n highlight,\n highlightedSeries,\n index,\n isToggleable,\n lineType: formattedLineType,\n lineWidth: formattedLineWidth,\n name,\n position,\n symbolShape: formattedSymbolShape,\n title,\n colorScheme,\n ...options,\n };\n\n // Order matters here. Facets rely on the scales being set up.\n spec.scales = addScales(spec.scales ?? [], legendOptions);\n\n // get the keys and facet types that are used to divide the data for this visualization\n const { ordinalFacets, continuousFacets } = options.keys\n ? getFacetsFromKeys(options.keys, spec.scales ?? [])\n : getFacets(spec.scales ?? []);\n\n const legends: Legend[] = [];\n\n // if there are any categorical facets, add the legend and supporting data, signals and marks\n if (ordinalFacets.length) {\n // add the legendEntries scale\n // this scale is used to generate every combination of the catergorical facets\n spec.scales.push({\n name: `${name}Entries`,\n type: 'ordinal',\n domain: { data: `${name}Aggregate`, field: `${name}Entries` },\n });\n\n // just want the unique fields\n const uniqueFacetFields = [...new Set(ordinalFacets.map((facet) => facet.field))];\n\n spec.data = addData(spec.data ?? [], { ...legendOptions, facets: uniqueFacetFields });\n spec.signals = addSignals(spec.signals ?? [], legendOptions);\n spec.marks = addMarks(spec.marks ?? [], legendOptions);\n\n // add the legend\n legends.push(getCategoricalLegend(ordinalFacets, legendOptions));\n }\n\n // continuous legends cannot be combined with any other legends\n continuousFacets.forEach((facet) => {\n // add the legend\n legends.push(getContinuousLegend(facet, legendOptions));\n });\n\n // if legends is undefined, initialize it as an empty array\n if (typeof spec.legends === 'undefined') {\n spec.legends = [];\n }\n spec.legends.push(...legends);\n }\n);\n\n/**\n * converts facets that could reference preset values to the actual vega supported value\n * Example {value: 'L'} => {value: 3}\n * @param color\n * @param lineType\n * @param lineWidth\n * @param colorScheme\n */\nexport const formatFacetRefsWithPresets = (\n color: ColorFacet | undefined,\n lineType: LineTypeFacet | undefined,\n lineWidth: LineWidthFacet | undefined,\n symbolShape: SymbolShapeFacet | undefined,\n colorScheme: ColorScheme\n) => {\n let formattedColor: FacetRef<string> | undefined;\n if (color && typeof color === 'object') {\n formattedColor = { value: getColorValue(color.value, colorScheme) };\n } else {\n formattedColor = color;\n }\n\n let formattedLineType: FacetRef<number[]> | undefined;\n if (lineType && typeof lineType === 'object') {\n formattedLineType = { value: getStrokeDashFromLineType(lineType.value) };\n } else {\n formattedLineType = lineType;\n }\n\n let formattedLineWidth: FacetRef<number> | undefined;\n if (lineWidth && typeof lineWidth === 'object') {\n formattedLineWidth = { value: getLineWidthPixelsFromLineWidth(lineWidth.value) };\n } else {\n formattedLineWidth = lineWidth;\n }\n\n let formattedSymbolShape: FacetRef<string> | undefined;\n if (symbolShape && typeof symbolShape === 'object') {\n formattedSymbolShape = { value: getPathFromSymbolShape(symbolShape.value) };\n } else {\n formattedSymbolShape = symbolShape;\n }\n return { formattedColor, formattedLineType, formattedLineWidth, formattedSymbolShape };\n};\n\n/**\n * gets the legend for all the categorical facets\n * @param facets\n * @param options\n * @returns\n */\nconst getCategoricalLegend = (facets: Facet[], options: LegendSpecOptions): Legend => {\n const { name, position, title, labelLimit, titleLimit } = options;\n const legend: Legend = {\n fill: `${name}Entries`,\n direction: ['top', 'bottom'].includes(position) ? 'horizontal' : 'vertical',\n orient: position,\n title,\n encode: getEncodings(facets, options),\n columns: getColumns(position),\n labelLimit,\n };\n if (titleLimit !== undefined) legend.titleLimit = titleLimit;\n return legend;\n};\n\n/**\n * gets the legend for a continuous facet\n * currently just setup to handle symbolSize since that is the only supported continuous facet\n * @param _facet\n * @param options\n * @returns\n */\nexport const getContinuousLegend = (facet: Facet, options: LegendSpecOptions): Legend => {\n const { symbolShape } = options;\n // add a switch statement here for the different types of continuous legends\n if (facet.facetType === SYMBOL_SIZE_SCALE) {\n return {\n size: SYMBOL_SIZE_SCALE,\n ...getLegendLayout(options),\n symbolType: getSymbolType(symbolShape),\n };\n }\n return {\n fill: LINEAR_COLOR_SCALE,\n gradientThickness: 10,\n ...getLegendLayout(options),\n };\n};\n\nconst getLegendLayout = ({ position, title, titleLimit }: LegendSpecOptions): Partial<Legend> => {\n const layout: Partial<Legend> = {\n direction: ['top', 'bottom'].includes(position) ? 'horizontal' : 'vertical',\n orient: position,\n title,\n };\n if (titleLimit !== undefined) layout.titleLimit = titleLimit;\n return layout;\n};\n\n/**\n * Adds a new scale that is used to create the legend entries\n */\nconst addScales = produce<Scale[], [LegendSpecOptions]>((scales, { color, lineType, opacity, symbolShape }) => {\n // it is possible to define fields to facet the data off of on the legend\n // if these fields are not already defined on the scales, we need to add them\n addFieldToFacetScaleDomain(scales, COLOR_SCALE, color);\n addFieldToFacetScaleDomain(scales, LINE_TYPE_SCALE, lineType);\n addFieldToFacetScaleDomain(scales, OPACITY_SCALE, opacity);\n addFieldToFacetScaleDomain(scales, SYMBOL_SHAPE_SCALE, symbolShape);\n});\n\nconst addMarks = produce<Mark[], [LegendSpecOptions]>((marks, { highlight, keys, name }) => {\n if (highlight) {\n setHoverOpacityForMarks(marks, keys, name);\n }\n});\n\n/**\n * Adds a new data set that aggregates the data off of the facet fields\n * This creates a row for every unique combination of the facets in the data\n * Each unique combination gets joined with a pipe to create a single string to use as legend entries\n */\nexport const addData = produce<Data[], [LegendSpecOptions & { facets: string[] }]>(\n (data, { facets, hiddenEntries, keys, name }) => {\n // expression for combining all the facets into a single key\n const expr = facets.map((facet) => `datum.${facet}`).join(' + \" | \" + ');\n data.push({\n name: `${name}Aggregate`,\n source: 'table',\n transform: [\n {\n type: 'aggregate',\n groupby: facets,\n },\n {\n type: 'formula',\n as: `${name}Entries`,\n expr,\n },\n ...getHiddenEntriesFilter(hiddenEntries, name),\n ],\n });\n\n if (keys?.length) {\n const tableData = getTableData(data);\n if (!tableData.transform) {\n tableData.transform = [];\n }\n tableData.transform.push({\n type: 'formula',\n as: `${name}_highlightGroupId`,\n expr: keys.map((key) => `datum.${key}`).join(' + \" | \" + '),\n });\n }\n }\n);\n\nexport const addSignals = produce<Signal[], [LegendSpecOptions]>(\n (signals, { hiddenSeries, highlight, isToggleable, keys, legendLabels, name }) => {\n if (highlight) {\n addHighlighSignalLegendHoverEvents(signals, name, Boolean(isToggleable || hiddenSeries), keys);\n }\n\n if (legendLabels) {\n signals.push(getGenericValueSignal(`${name}_labels`, legendLabels));\n }\n }\n);\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { GroupMark, NumericValueRef, Scale, TrailMark } from 'vega';\n\nimport {\n DEFAULT_OPACITY_RULE,\n FILTERED_TABLE,\n HIGHLIGHTED_ITEM,\n HIGHLIGHTED_SERIES,\n HIGHLIGHT_CONTRAST_RATIO,\n SELECTED_ITEM,\n SELECTED_SERIES,\n SYMBOL_PATH_WIDTH_SCALE,\n} from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { getXProductionRule } from '../marks/markUtils';\nimport { addFieldToFacetScaleDomain } from '../scale/scaleSpecBuilder';\nimport { getFacetsFromOptions, getLineWidthPixelsFromLineWidth } from '../specUtils';\nimport { LineWidthFacet, ScatterPathOptions, ScatterPathSpecOptions, ScatterSpecOptions } from '../types';\n\n/**\n * Gets the path spec options, applying defaults.\n * @param scatterPathOptions\n * @param index\n * @param markName\n * @param colorScheme\n * @returns ScatterPathSpecOptions\n */\nexport const getScatterPathSpecOptions = (\n { color = 'gray-500', groupBy, pathWidth = { value: 'M' }, opacity = 0.5, ...scatterPathOptions }: ScatterPathOptions,\n index: number,\n {\n color: scatterColor,\n colorScheme,\n dimension,\n dimensionScaleType,\n lineType,\n metric,\n name: scatterName,\n opacity: scatterOpacity,\n size,\n }: ScatterSpecOptions\n): ScatterPathSpecOptions => {\n const { facets } = getFacetsFromOptions({ color: scatterColor, lineType, size, opacity: scatterOpacity });\n return {\n color,\n colorScheme,\n dimension,\n dimensionScaleType,\n groupBy: groupBy ?? facets,\n metric,\n index,\n pathWidth,\n name: `${scatterName}Path${index}`,\n opacity,\n ...scatterPathOptions,\n };\n};\n\n/**\n * Gets all the paths on a scatter\n * @param scatterOptions\n * @returns ScatterPathSpecOptions[]\n */\nexport const getScatterPaths = (scatterOptions: ScatterSpecOptions): ScatterPathSpecOptions[] => {\n return scatterOptions.scatterPaths.map((path, index) => getScatterPathSpecOptions(path, index, scatterOptions));\n};\n\n/**\n * Sets the scales up for the scatter path marks\n * Note: This mutates the scales array so it should only be called from an immer produce function\n * @param scales\n * @param scatterOptions\n */\nexport const setScatterPathScales = (scales: Scale[], scatterOptions: ScatterSpecOptions) => {\n const paths = getScatterPaths(scatterOptions);\n\n paths.forEach((path) => {\n addFieldToFacetScaleDomain(scales, SYMBOL_PATH_WIDTH_SCALE, path.pathWidth);\n });\n};\n\nexport const getScatterPathMarks = (scatterOptions: ScatterSpecOptions): GroupMark[] => {\n const marks: GroupMark[] = [];\n const paths = getScatterPaths(scatterOptions);\n\n paths.forEach((path) => {\n const { groupBy, name } = path;\n marks.push({\n name: `${name}_group`,\n type: 'group',\n from: {\n facet: {\n name: `${name}_facet`,\n data: FILTERED_TABLE,\n groupby: groupBy,\n },\n },\n marks: [getScatterPathTrailMark(path)],\n });\n });\n\n return marks;\n};\n\nexport const getScatterPathTrailMark = ({\n color,\n colorScheme,\n dimension,\n dimensionScaleType,\n pathWidth,\n metric,\n name,\n opacity,\n}: ScatterPathSpecOptions): TrailMark => {\n return {\n name,\n type: 'trail',\n from: { data: `${name}_facet` },\n encode: {\n enter: {\n fill: {\n value: getColorValue(color, colorScheme),\n },\n fillOpacity: { value: opacity },\n size: getPathWidth(pathWidth),\n },\n update: {\n opacity: getOpacity(),\n x: getXProductionRule(dimensionScaleType, dimension),\n y: { scale: 'yLinear', field: metric },\n },\n },\n };\n};\n\n/**\n * Gets the opacity production rule for the scatterPath trail marks.\n * This is used for highlighting trails on hover and selection.\n * @param scatterOptions ScatterSpecOptions\n * @returns opacity production rule\n */\nexport const getOpacity = (): ({ test?: string } & NumericValueRef)[] => {\n // if a point is hovered or selected, all other points should be reduced opacity\n const fadedValue = 1 / HIGHLIGHT_CONTRAST_RATIO;\n\n return [\n {\n test: `isValid(${HIGHLIGHTED_SERIES}) || isValid(${HIGHLIGHTED_ITEM}) || isValid(${SELECTED_SERIES}) || isValid(${SELECTED_ITEM})`,\n value: fadedValue,\n },\n DEFAULT_OPACITY_RULE,\n ];\n};\n\nexport const getPathWidth = (pathWidth: LineWidthFacet): NumericValueRef => {\n if (typeof pathWidth === 'string') {\n return { scale: SYMBOL_PATH_WIDTH_SCALE, field: pathWidth };\n }\n return { value: getLineWidthPixelsFromLineWidth(pathWidth.value) };\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { GroupMark, Mark, NumericValueRef, SymbolMark } from 'vega';\n\nimport {\n DEFAULT_OPACITY_RULE,\n FILTERED_TABLE,\n HIGHLIGHT_CONTRAST_RATIO,\n SELECTED_ITEM,\n} from '@spectrum-charts/constants';\nimport { spectrumColors } from '@spectrum-charts/themes';\n\nimport { addHighlightMarkOpacityRules } from '../chartTooltip/chartTooltipUtils';\nimport {\n getColorProductionRule,\n getLineWidthProductionRule,\n getOpacityProductionRule,\n getPointsForVoronoi,\n getStrokeDashProductionRule,\n getSymbolSizeProductionRule,\n getVoronoiPath,\n getXProductionRule,\n hasPopover,\n isInteractive,\n} from '../marks/markUtils';\nimport { getScatterPathMarks } from '../scatterPath/scatterPathUtils';\nimport { getTrendlineMarks } from '../trendline';\nimport { ScatterSpecOptions, SymbolSizeFacet } from '../types';\n\nexport const addScatterMarks = produce<Mark[], [ScatterSpecOptions]>((marks, options) => {\n const { name } = options;\n\n const scatterGroup: GroupMark = {\n name: `${name}_group`,\n type: 'group',\n marks: [getScatterMark(options), ...getScatterHoverMarks(options), ...getScatterSelectMarks(options)],\n };\n\n marks.push(...getScatterPathMarks(options));\n marks.push(scatterGroup);\n marks.push(...getTrendlineMarks(options));\n});\n\n/**\n * Gets the primary scatter mark\n * @param scatterOptions scatterSpecOptions\n * @returns SymbolMark\n */\nexport const getScatterMark = (options: ScatterSpecOptions): SymbolMark => {\n const {\n color,\n colorScaleType,\n colorScheme,\n dimension,\n dimensionScaleType,\n lineType,\n lineWidth,\n metric,\n name,\n opacity,\n size,\n } = options;\n return {\n name,\n description: name,\n type: 'symbol',\n from: {\n data: FILTERED_TABLE,\n },\n encode: {\n enter: {\n /**\n * the blend mode makes it possible to tell when there are overlapping points\n * in light mode, the points are darker when they overlap (multiply)\n * in dark mode, the points are lighter when they overlap (screen)\n */\n blend: { value: colorScheme === 'light' ? 'multiply' : 'screen' },\n fill: getColorProductionRule(color, colorScheme, colorScaleType),\n fillOpacity: getOpacityProductionRule(opacity),\n shape: { value: 'circle' },\n size: getSymbolSizeProductionRule(size),\n strokeDash: getStrokeDashProductionRule(lineType),\n strokeWidth: getLineWidthProductionRule(lineWidth),\n stroke: getColorProductionRule(color, colorScheme, colorScaleType),\n },\n update: {\n opacity: getOpacity(options),\n x: getXProductionRule(dimensionScaleType, dimension),\n y: { scale: 'yLinear', field: metric },\n },\n },\n };\n};\n\n/**\n * Gets the opacity production rule for the scatter mark.\n * This is used for highlighting points on hover and selection.\n * @param scatterOptions ScatterSpecOptions\n * @returns opacity production rule\n */\nexport const getOpacity = (scatterOptions: ScatterSpecOptions): ({ test?: string } & NumericValueRef)[] => {\n const { highlightedItem, idKey } = scatterOptions;\n if (!isInteractive(scatterOptions) && highlightedItem === undefined) {\n return [DEFAULT_OPACITY_RULE];\n }\n // if a point is hovered or selected, all other points should be reduced opacity\n const fadedValue = 1 / HIGHLIGHT_CONTRAST_RATIO;\n\n const rules: ({ test?: string } & NumericValueRef)[] = [];\n addHighlightMarkOpacityRules(rules, scatterOptions);\n if (hasPopover(scatterOptions)) {\n rules.push({\n test: `isValid(${SELECTED_ITEM}) && ${SELECTED_ITEM} !== datum.${idKey}`,\n value: fadedValue,\n });\n }\n\n return [...rules, DEFAULT_OPACITY_RULE];\n};\n\n/**\n * Gets the vornoi path mark if there are any interactive children\n * @param scatterOptions ScatterSpecOptions\n * @returns Mark[]\n */\nexport const getScatterHoverMarks = (scatterOptions: ScatterSpecOptions): Mark[] => {\n const { dimension, dimensionScaleType, highlightedItem, metric, name } = scatterOptions;\n if (!isInteractive(scatterOptions) && highlightedItem === undefined) {\n return [];\n }\n\n return [\n getPointsForVoronoi(`${FILTERED_TABLE}ForTooltip`, dimension, metric, name, dimensionScaleType),\n getVoronoiPath(scatterOptions, `${name}_pointsForVoronoi`),\n ];\n};\n\nconst getScatterSelectMarks = (scatterOptions: ScatterSpecOptions): SymbolMark[] => {\n const { dimension, dimensionScaleType, metric, name, size } = scatterOptions;\n if (!hasPopover(scatterOptions)) {\n return [];\n }\n return [\n {\n name: `${name}_selectRing`,\n type: 'symbol',\n from: {\n data: `${name}_selectedData`,\n },\n encode: {\n enter: {\n fill: { value: 'transparent' },\n shape: { value: 'circle' },\n size: getSelectRingSize(size),\n strokeWidth: { value: 2 },\n stroke: { value: spectrumColors.light['static-blue'] },\n },\n update: {\n x: getXProductionRule(dimensionScaleType, dimension),\n y: { scale: 'yLinear', field: metric },\n },\n },\n },\n ];\n};\n\n/**\n * Gets the size of the select ring based on the size of the scatter points\n * @param size SymbolSizeFacet\n * @returns NumericValueRef\n */\nexport const getSelectRingSize = (size: SymbolSizeFacet): NumericValueRef => {\n const baseSize = getSymbolSizeProductionRule(size);\n if ('value' in baseSize && typeof baseSize.value === 'number') {\n // the select ring is 4px widr and taller\n // to calculate: (sqrt(baseSize) + 4)^2\n return { value: Math.pow(Math.sqrt(baseSize.value) + 4, 2) };\n }\n if ('scale' in baseSize && 'field' in baseSize) {\n return { signal: `pow(sqrt(scale('${baseSize.scale as string}', datum.${baseSize.field as string})) + 4, 2)` };\n }\n return baseSize;\n};\n","/*\n * Copyright 2024 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Data, Scale, Signal } from 'vega';\n\nimport {\n COLOR_SCALE,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_DIMENSION_SCALE_TYPE,\n DEFAULT_LINEAR_DIMENSION,\n DEFAULT_METRIC,\n FILTERED_TABLE,\n LINEAR_COLOR_SCALE,\n LINE_TYPE_SCALE,\n LINE_WIDTH_SCALE,\n OPACITY_SCALE,\n SELECTED_ITEM,\n SYMBOL_SIZE_SCALE,\n} from '@spectrum-charts/constants';\nimport { toCamelCase } from '@spectrum-charts/utils';\n\nimport { addTooltipData, addTooltipSignals } from '../chartTooltip/chartTooltipUtils';\nimport { addTimeTransform, getFilteredTooltipData, getTableData } from '../data/dataUtils';\nimport { getInteractiveMarkName, hasPopover, isInteractive } from '../marks/markUtils';\nimport { addContinuousDimensionScale, addFieldToFacetScaleDomain, addMetricScale } from '../scale/scaleSpecBuilder';\nimport { setScatterPathScales } from '../scatterPath';\nimport { addHighlightedItemSignalEvents } from '../signal/signalSpecBuilder';\nimport { addTrendlineData, getTrendlineScales, setTrendlineSignals } from '../trendline';\nimport { ColorScheme, HighlightedItem, ScSpec, ScatterOptions, ScatterSpecOptions } from '../types';\nimport { addScatterMarks } from './scatterMarkUtils';\n\n/**\n * Adds all the necessary parts of a scatter to the spec\n * @param spec Spec\n * @param scatterOptions ScatterOptions\n */\nexport const addScatter = produce<\n ScSpec,\n [ScatterOptions & { colorScheme?: ColorScheme; highlightedItem?: HighlightedItem; index?: number; idKey: string }]\n>(\n (\n spec,\n {\n chartPopovers = [],\n chartTooltips = [],\n color = { value: 'categorical-100' },\n colorScaleType = 'ordinal',\n colorScheme = DEFAULT_COLOR_SCHEME,\n dimension = DEFAULT_LINEAR_DIMENSION,\n dimensionScaleType = DEFAULT_DIMENSION_SCALE_TYPE,\n index = 0,\n lineType = { value: 'solid' },\n lineWidth = { value: 0 },\n metric = DEFAULT_METRIC,\n name,\n opacity = { value: 1 },\n scatterPaths = [],\n size = { value: 'M' },\n trendlines = [],\n ...options\n }\n ) => {\n const scatterName = toCamelCase(name || `scatter${index}`);\n // put options back together now that all the defaults have been set\n\n const scatterOptions: ScatterSpecOptions = {\n chartPopovers,\n chartTooltips,\n color,\n colorScaleType,\n colorScheme,\n dimension,\n dimensionScaleType,\n index,\n interactiveMarkName: getInteractiveMarkName(\n { chartPopovers, chartTooltips, highlightedItem: options.highlightedItem, trendlines },\n scatterName\n ),\n lineType,\n lineWidth,\n metric,\n name: scatterName,\n opacity,\n scatterPaths,\n size,\n trendlines,\n ...options,\n };\n\n spec.data = addData(spec.data ?? [], scatterOptions);\n spec.signals = addSignals(spec.signals ?? [], scatterOptions);\n spec.scales = setScales(spec.scales ?? [], scatterOptions);\n spec.marks = addScatterMarks(spec.marks ?? [], scatterOptions);\n }\n);\n\nexport const addData = produce<Data[], [ScatterSpecOptions]>((data, scatterOptions) => {\n const { chartTooltips, dimension, dimensionScaleType, highlightedItem, idKey, name } = scatterOptions;\n if (dimensionScaleType === 'time') {\n const tableData = getTableData(data);\n tableData.transform = addTimeTransform(tableData.transform ?? [], dimension);\n }\n\n if (isInteractive(scatterOptions) || highlightedItem !== undefined) {\n data.push(getFilteredTooltipData(chartTooltips));\n }\n\n if (hasPopover(scatterOptions)) {\n data.push({\n name: `${name}_selectedData`,\n source: FILTERED_TABLE,\n transform: [\n {\n type: 'filter',\n expr: `${SELECTED_ITEM} === datum.${idKey}`,\n },\n ],\n });\n }\n addTooltipData(data, scatterOptions);\n addTrendlineData(data, scatterOptions);\n});\n\n/**\n * Adds the signals for scatter to the signals array\n * @param signals Signal[]\n * @param scatterOptions ScatterSpecOptions\n */\nexport const addSignals = produce<Signal[], [ScatterSpecOptions]>((signals, scatterOptions) => {\n const { idKey, name } = scatterOptions;\n // trendline signals\n setTrendlineSignals(signals, scatterOptions);\n\n if (!isInteractive(scatterOptions)) return;\n // interactive signals\n addHighlightedItemSignalEvents(signals, `${name}_voronoi`, idKey, 2);\n addTooltipSignals(signals, scatterOptions);\n});\n\n/**\n * Sets up all the scales for scatter on the scales array\n * @param scales Scale[]\n * @param scatterOptions ScatterSpecOptions\n */\nexport const setScales = produce<Scale[], [ScatterSpecOptions]>((scales, scatterOptions) => {\n const { color, colorScaleType, dimension, dimensionScaleType, lineType, lineWidth, metric, opacity, size } =\n scatterOptions;\n // add dimension scale\n addContinuousDimensionScale(scales, { scaleType: dimensionScaleType, dimension });\n // add metric scale\n addMetricScale(scales, [metric]);\n if (colorScaleType === 'linear') {\n // add color to the color domain\n addFieldToFacetScaleDomain(scales, LINEAR_COLOR_SCALE, color);\n } else {\n // add color to the color domain\n addFieldToFacetScaleDomain(scales, COLOR_SCALE, color);\n }\n // add lineType to the lineType domain\n addFieldToFacetScaleDomain(scales, LINE_TYPE_SCALE, lineType);\n // add lineWidth to the lineWidth domain\n addFieldToFacetScaleDomain(scales, LINE_WIDTH_SCALE, lineWidth);\n // add opacity to the opacity domain\n addFieldToFacetScaleDomain(scales, OPACITY_SCALE, opacity);\n // add size to the size domain\n addFieldToFacetScaleDomain(scales, SYMBOL_SIZE_SCALE, size);\n\n setScatterPathScales(scales, scatterOptions);\n scales.push(...getTrendlineScales(scatterOptions));\n});\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\n\nimport { DEFAULT_TITLE_FONT_WEIGHT } from '@spectrum-charts/constants';\n\nimport { ScSpec, TitleOptions } from '../types';\n\nexport const addTitle = produce<ScSpec, [TitleOptions]>(\n (spec, { text, fontWeight = DEFAULT_TITLE_FONT_WEIGHT, position = 'middle', orient = 'top' }) => {\n spec.title = {\n text,\n fontWeight,\n anchor: position,\n frame: 'group',\n orient,\n };\n\n return spec;\n }\n);\n","import{nelderMead as ee,bisect as ne,conjugateGradient as te,zeros as re,zerosM as V,norm2 as W,scale as ie}from\"fmin\";function O(e){var t=j(e),r=t.filter(function(b){return Z(b,e)}),n=0,a=0,i=[],s;if(r.length>1){var f=_(r);r=r.map(b=>({...b,angle:Math.atan2(b.x-f.x,b.y-f.y)})).sort((b,A)=>A.angle-b.angle);var u=r[r.length-1];for(s=0;s<r.length;++s){var o=r[s];a+=(u.x+o.x)*(o.y-u.y);for(var l={x:(o.x+u.x)/2,y:(o.y+u.y)/2},c=null,h=0;h<o.parentIndex.length;++h)if(u.parentIndex.indexOf(o.parentIndex[h])>-1){var g=e[o.parentIndex[h]],x=Math.atan2(o.x-g.x,o.y-g.y),d=Math.atan2(u.x-g.x,u.y-g.y),v=d-x;v<0&&(v+=2*Math.PI);var p=d-v/2,y=z(l,{x:g.x+g.radius*Math.sin(p),y:g.y+g.radius*Math.cos(p)});y>g.radius*2&&(y=g.radius*2),(c===null||c.width>y)&&(c={circle:g,width:y,p1:o,p2:u})}c!==null&&(i.push(c),n+=w(c.circle.radius,c.width),u=o)}}else{var m=e[0];for(s=1;s<e.length;++s){let b=e[s];(m==null||b.radius<m.radius)&&(m=b)}var C=!1;for(s=0;s<e.length;++s){let b=e[s];if(b!==void 0&&z(b,m)>Math.abs(m.radius-b.radius)){C=!0;break}}C?n=a=0:(n=m.radius*m.radius*Math.PI,i.push({circle:m,p1:{x:m.x,y:m.y+m.radius},p2:{x:m.x-1e-10,y:m.y+m.radius},width:m.radius*2}))}return a/=2,{overlap:n+a,stats:{area:n+a,arcArea:n,polygonArea:a,arcs:i,innerPoints:r,intersectionPoints:t}}}function Z(e,t){for(var r=0;r<t.length;++r){let n=t[r];if(n!==void 0&&z(e,n)>n.radius+1e-10)return!1}return!0}function j(e){for(var t=[],r=0;r<e.length;++r)for(var n=r+1;n<e.length;++n){let s=e[r],f=e[n];if(!(!s||!f))for(var a=q(s,f),i=0;i<a.length;++i){let u=a[i];u&&t.push({...u,parentIndex:[r,n]})}}return t}function w(e,t){return e*e*Math.acos(1-t/e)-(e-t)*Math.sqrt(t*(2*e-t))}function z(e,t){return Math.sqrt((e.x-t.x)*(e.x-t.x)+(e.y-t.y)*(e.y-t.y))}function L(e,t,r){if(r>=e+t)return 0;if(r<=Math.abs(e-t))return Math.PI*Math.min(e,t)*Math.min(e,t);var n=e-(r*r-t*t+e*e)/(2*r),a=t-(r*r-e*e+t*t)/(2*r);return w(e,n)+w(t,a)}function q(e,t){var r=z(e,t),n=e.radius,a=t.radius;if(r>=n+a||r<=Math.abs(n-a))return[];var i=(n*n-a*a+r*r)/(2*r),s=Math.sqrt(n*n-i*i),f=e.x+i*(t.x-e.x)/r,u=e.y+i*(t.y-e.y)/r,o=-(t.y-e.y)*(s/r),l=-(t.x-e.x)*(s/r);return[{x:f+o,y:u-l},{x:f-o,y:u+l}]}function _(e){let t=e.reduce((r,n)=>({x:r.x+n.x,y:r.y+n.y}),{x:0,y:0});return t.x/=e.length,t.y/=e.length,t}var ae=new Map([[\"greedy\",H],[\"MDS\",k],[\"best\",fe]]);function X(e,t){t=t??{},t.maxIterations=t.maxIterations||500,t.seed=t.seed??Math.random();let r=ae.get(t.layout??\"best\");var n=F;e=se(e);var a=r(e,t),i=[],s=[];for(let c of Object.keys(a)){let h=a[c];h&&(i.push(h.x),i.push(h.y),s.push(c))}for(var f=0,u=ee(function(c){f+=1;for(var h={},g=0;g<s.length;++g){var x=s[g];let v=a[x];h[x]={x:c[2*g],y:c[2*g+1],radius:v.radius,setid:x,size:v.size,rowid:v.rowid}}return n(h,e)},i,t),o=u.x,l=0;l<s.length;++l){let c=s[l],h=a[c];h.x=o[2*l],h.y=o[2*l+1]}return a}var Y=1e-10;function B(e,t,r){return Math.min(e,t)*Math.min(e,t)*Math.PI<=r+Y?Math.abs(e-t):ne(function(n){return L(e,t,n)-r},0,e+t)}function se(e){e=e.slice();var t=[],r={},n,a,i,s;for(let f of e)f.sets.length==1?t.push(f.sets[0]):f.sets.length==2&&(i=f.sets[0],s=f.sets[1],r[`${i},${s}`]=!0,r[`${s},${i}`]=!0);for(t.sort((f,u)=>f.toString().localeCompare(u.toString())),n=0;n<t.length;++n)for(i=t[n],a=n+1;a<t.length;++a)s=t[a],`${i},${s}`in r||e.push({sets:[i,s],size:0});return e}function oe(e,t,r){var n=V(t.length,t.length),a=V(t.length,t.length);return e.filter(function(i){return i.sets.length===2}).map(function(i){var s=r[i.sets[0]],f=r[i.sets[1]];if(s===void 0||f===void 0)return i;var u=Math.sqrt(t[s].size/Math.PI),o=Math.sqrt(t[f].size/Math.PI),l=B(u,o,i.size);n[s][f]=n[f][s]=l;var c=0;i.size+1e-10>=Math.min(t[s].size,t[f].size)?c=1:i.size<=1e-10&&(c=-1),a[s][f]=a[f][s]=c}),{distances:n,constraints:a}}function ue(e,t,r,n){var a=0,i;for(i=0;i<t.length;++i)t[i]=0;for(i=0;i<r.length;++i)for(var s=e[2*i],f=e[2*i+1],u=i+1;u<r.length;++u){var o=e[2*u],l=e[2*u+1],c=r[i][u],h=n[i][u],g=(o-s)*(o-s)+(l-f)*(l-f),x=Math.sqrt(g),d=g-c*c;h>0&&x<=c||h<0&&x>=c||(a+=2*d*d,t[2*i]+=4*d*(s-o),t[2*i+1]+=4*d*(f-l),t[2*u]+=4*d*(o-s),t[2*u+1]+=4*d*(l-f))}return a}function fe(e,t){var r=H(e,t),n=F;if(e.length>=8){var a=k(e,t),i=n(a,e),s=n(r,e);i+1e-8<s&&(r=a)}return r}function le(e=1){return()=>{e=e+1831565813|0;let t=Math.imul(e^e>>>15,1|e);return t=Math.imul(t^t>>>7,61|t)^t,((t^t>>>14)>>>0)/4294967296}}function k(e,t){var r=t.restarts||10,n=[],a={},i;for(i=0;i<e.length;++i){var s=e[i];s?.sets.length===1&&(s.sets[0]&&(a[s.sets[0]]=n.length),n.push(s))}var f=oe(e,n,a),u=f.distances,o=f.constraints,l=W(u.map(W))/u.length;u=u.map(function(m){return m.map(function(C){return C/l})});let c=(t.seed??Math.random())*2**32>>>0,h=le(c);var g,x;for(i=0;i<r;++i){var d=re(u.length*2).map(()=>h());x=te((m,C)=>ue(m,C,u,o),d,t),(!g||x.fx<g.fx)&&(g=x)}var v=g?.x,p={};for(i=0;i<n.length;++i){var y=n[i];let m=y?.sets[0];y===void 0||m===void 0||(p[m]={x:v[2*i]*l,y:v[2*i+1]*l,radius:Math.sqrt(y.size/Math.PI),setid:m,size:y.size,rowid:Object.keys(p).length})}if(t.history)for(let m of t.history)ie(m.x,l);return p}function H(e,t){for(var r=F,n={},a={},i,s=0;s<e.length;++s){var f=e[s];f.sets.length==1&&(i=f.sets[0],n[i]={x:1e10,y:1e10,rowid:Object.keys(n).length,size:f.size,setid:i,radius:Math.sqrt(f.size/Math.PI)},a[i]=[])}for(e=e.filter(function(M){return M.sets.length==2}),s=0;s<e.length;++s){var u=e[s],o=u.weight?u.weight:1,l=u.sets[0],c=u.sets[1];if(l===void 0||c===void 0)continue;let M=n[l],R=n[c];!M.size||!R.size||(u.size+Y>=Math.min(M.size,R.size)&&(o=0),a[l]?.push({set:c,size:u.size,weight:o}),a[c]?.push({set:l,size:u.size,weight:o}))}var h=[];for(i in a){let M=a[i];if(M){var g=0;for(s=0;s<M.length;++s){let R=M[s];R&&(g+=R.size*R.weight)}h.push({set:i,size:g})}}h.sort((M,R)=>R.size-M.size);var x={};function d(M){return M.set in x}function v(M,R){let P=n[R];P&&(P.x=M.x,P.y=M.y),x[R]=!0}for(v({x:0,y:0},h[0]?.set??\"\"),s=1;s<h.length;++s){var p=h[s]?.set,y=p?a[p]?.filter(d):null;let M=p?n[p]:null;if(y?.sort((R,P)=>P.size-R.size),y?.length===0||!y)throw\"ERROR: missing pairwise overlap information\";for(var m=[],C=0;C<y.length;++C){let R=y[C];if(!R)continue;var b=n[y[C].set];if(!b)continue;let P=B(M.radius,b.radius,R.size);m.push({x:b.x+P,y:b.y}),m.push({x:b.x-P,y:b.y}),m.push({y:b.y+P,x:b.x}),m.push({y:b.y-P,x:b.x});for(var A=C+1;A<y.length;++A)for(var I=n[y[A].set],U=B(M.radius,I.radius,y[A].size),$=q({x:b.x,y:b.y,radius:P},{x:I.x,y:I.y,radius:U}),S=0;S<$.length;++S)m.push($[S])}var T=1e50,E=m[0];for(C=0;C<m.length;++C){n[p].x=m[C].x,n[p].y=m[C].y;var N=r(n,e);N<T&&(T=N,E=m[C])}v(E,p)}return n}function F(e,t){var r=0;function n(l){return l.map(function(c){return e[c]})}for(var a=0;a<t.length;++a){var i=t[a],s;if(!(!i||i.sets.length===1)){if(i.sets.length===2){var f=e[i.sets[0]],u=e[i.sets[1]];if(f===void 0||u===void 0)continue;s=L(f.radius,u.radius,z(f,u))}else s=O(n(i.sets)).overlap;var o=i.weight?i.weight:1;r+=o*(s-i.size)*(s-i.size)}}return r}function ce(e,t,r){r===null?e.sort(function(d,v){return v.radius-d.radius}):e.sort(r);var n;if(e.length>0){var a=e[0].x,i=e[0].y;for(n=0;n<e.length;++n)e[n].x-=a,e[n].y-=i}if(e.length==2){let d=e[0],v=e[1];if(d&&v){var s=z(d,v);s<Math.abs(v.radius-d.radius)&&(v.x=d.x+d.radius-v.radius-1e-10,v.y=v.y)}}if(e.length>1){var f=Math.atan2(e[1].x,e[1].y)-(t??0),u=Math.cos(f),o=Math.sin(f),l,c;for(n=0;n<e.length;++n){let d=e[n];d&&(l=d.x,c=d.y,d.x=u*l-o*c,d.y=o*l+u*c)}}if(e.length>2){for(var h=Math.atan2(e[2].x,e[2].y)-(t??0);h<0;)h+=2*Math.PI;for(;h>2*Math.PI;)h-=2*Math.PI;if(h>Math.PI){var g=e[1].y/(1e-10+e[1].x);for(n=0;n<e.length;++n){let d=e[n];if(d){var x=(d.x+g*d.y)/(1+g*g);d.x=2*x-d.x,d.y=2*x*g-d.y}}}}}function de(e){e.map(function(o){o.parent=o});function t(o){if(o)return o.parent!==o&&(o.parent=t(o.parent)),o.parent}function r(o,l){var c=t(o),h=t(l);c&&(c.parent=h)}for(var n=0;n<e.length;++n)for(var a=n+1;a<e.length;++a){let o=e[n],l=e[a];if(!(!o||!l)){var i=o.radius+l.radius;z(o,l)+1e-10<i&&r(l,o)}}var s={},f;for(n=0;n<e.length;++n){let o=e[n];if(!o)continue;let c=t(e[n])?.parent?.setid;c&&(c in s||(s[c]=[]),s[c]&&s[c].push(o))}e.map(function(o){delete o.parent});var u=[];for(f in s){let o=s[f];o&&u.push(o)}return u}function D(e){var t=function(r){var n=Math.max.apply(null,e.map(function(i){return i[r]+i.radius})),a=Math.min.apply(null,e.map(function(i){return i[r]-i.radius}));return{max:n,min:a}};return{xRange:t(\"x\"),yRange:t(\"y\")}}function J(e,t,r){t===null&&(t=Math.PI/2);var n=[],a,i;for(i in e){var s=e[i];s&&n.push({...s,setid:i})}var f=de(n);for(a=0;a<f.length;++a){let d=f[a];if(d){ce(d,t,r);var u=D(d);d.size=(u.xRange.max-u.xRange.min)*(u.yRange.max-u.yRange.min),d.bounds=u}}f.sort(function(d,v){return!d.size||!v.size?0:v.size-d.size});var l=f[0].bounds,c=(l.xRange.max-l.xRange.min)/50;function h(d,v,p){if(d&&!(!d.size||!d.bounds)){var y=d.bounds,m,C,b;v?m=l.xRange.max-y.xRange.min+c:(m=l.xRange.max-y.xRange.max,b=(y.xRange.max-y.xRange.min)/2-(l.xRange.max-l.xRange.min)/2,b<0&&(m+=b)),p?C=l.yRange.max-y.yRange.min+c:(C=l.yRange.max-y.yRange.max,b=(y.yRange.max-y.yRange.min)/2-(l.yRange.max-l.yRange.min)/2,b<0&&(C+=b));for(var A=0;A<d.length;++A){let I=d[A];I&&(I.x+=m,I.y+=C,n.push(I))}}}for(var g=1;g<f.length;)h(f[g],!0,!1),h(f[g+1],!1,!0),h(f[g+2],!0,!0),g+=3,l=D(n);var x={};for(let d of n)x[d.setid]=d;return x}function K(e,t,r,n){var a=[],i=[];for(var s in e){let y=e[s];y&&(i.push(s),a.push(y))}t-=2*n,r-=2*n;var f=D(a),u=f.xRange,o=f.yRange;if(u.max==u.min||o.max==o.min)return e;for(var l=t/(u.max-u.min),c=r/(o.max-o.min),h=Math.min(c,l),g=(t-(u.max-u.min)*h)/2,x=(r-(o.max-o.min)*h)/2,d={},v=0;v<a.length;++v){var p=a[v];let y=i[v];!p||!y||(d[y]={...p,radius:h*p.radius,x:n+g+(p.x-u.min)*h,y:n+x+(p.y-o.min)*h})}return d}import{nelderMead as he}from\"fmin\";function Ae(e,t){let{circles:r,intersections:n}=ge(e,t);return{$schema:\"https://vega.github.io/schema/vega/v5.json\",width:t.width,height:t.height,padding:t.padding,data:[{name:\"circles\",values:r},{name:\"intersections\",values:n}],scales:[{name:\"color\",type:\"ordinal\",domain:{data:\"circles\",field:\"set_id\"},range:\"category\"}],marks:[{type:\"symbol\",from:{data:\"circles\"},encode:{enter:{x:{field:\"x\"},y:{field:\"y\"},size:{field:\"size\"},shape:{value:\"circle\"},fillOpacity:{value:.3},fill:{scale:\"color\",field:\"set_id\"},tooltip:[{field:\"text\",type:\"quantitative\"}]},hover:{fillOpacity:{value:.5}},update:{fillOpacity:{value:.3}}}},{type:\"path\",from:{data:\"intersections\"},encode:{enter:{path:{field:\"path\"},fill:{value:\"grey\"},fillOpacity:{value:0},tooltip:[{field:\"text\",type:\"quantitative\"}]},hover:{stroke:{value:\"black\"},strokeWidth:{value:1},fill:{value:\"grey\"}},update:{strokeWidth:{value:0}}}},{type:\"text\",from:{data:\"intersections\"},encode:{enter:{x:{field:\"textX\"},y:{field:\"textY\"},text:{field:\"size\"},fontSize:{value:14},fill:{scale:\"color\",field:\"set_id\"},fontWeight:{value:\"normal\"}}}}]}}function ge(e,{layout:t,height:r,width:n,padding:a,seed:i,orientation:s,set_id_delimiter:f,orientationOrder:u}){let o=e.filter(x=>x.size!==0&&x.sets.length>0);if(o.length===0)return{circles:[],intersections:[]};let l=X(o,{layout:t,seed:i});s!==Math.PI/2&&(l=J(l,s,u)),l=K(l,n,r,a);let c=ye(l,o),h=o.map(x=>{let d=x.sets.join(\",\"),{x:v,y:p,disjoint:y}=c[d];return{set_id:x.sets.join(f),sets:x.sets,path:me(x.sets.map(m=>l[m])),textX:y?void 0:v,textY:y?void 0:p,size:x.size}}).filter(x=>x.sets.length>1);return{circles:Object.entries(l).map(([x,d])=>({set_id:x,x:d.x,y:d.y,size:Math.pow(d.radius*2,2),textX:c[x].x,textY:c[x].y})),intersections:h}}function me(e){let{stats:t}=O(e);var r=t.arcs;if(r.length===0)return\"M 0 0\";if(r.length===1){var n=r[0].circle;return xe(n.x,n.y,n.radius)}var a=[`\nM`,r[0].p2.x,r[0].p2.y];for(let i of r){let s=i.circle.radius,f=i.width>s;a.push(`\nA`,s,s,0,f?1:0,1,i.p1.x,i.p1.y)}return a.join(\" \")}function xe(e,t,r){var n=[];return n.push(`\nM`,e.toString(),t.toString()),n.push(`\nm`,-r,0),n.push(`\na`,r,r,0,1,0,r*2,0),n.push(`\na`,r,r,0,1,0,-r*2,0),n.join(\" \")}function ye(e,t,r=\",\"){for(var n={},a=ve(e),i=0;i<t.length;++i){for(var s=t[i].sets,f={},u={},o=0;o<s.length;++o){f[s[o]]=!0;var l=a[s[o]];if(l)for(var c=0;c<l.length;++c)u[l[c]]=!0}var h=[],g=[];for(var x in e)x in f?h.push(e[x]):x in u||g.push(e[x]);var d=Q(h,g);n[s.join(r)]=d,d.disjoint&&t[i].size>0&&console.log(\"WARNING: area \"+s+\" not represented on screen\")}return n}function ve(e){var t={},r=Object.keys(e);r.forEach(u=>t[u]=[]);for(var n=0;n<r.length;n++)for(var a=e[r[n]],i=n+1;i<r.length;++i){var s=e[r[i]],f=z(a,s);f+s.radius<=a.radius+1e-10?t[r[i]].push(r[n]):f+a.radius<=s.radius+1e-10&&t[r[n]].push(r[i])}return t}function Q(e,t){var r=[],n;for(n=0;n<e.length;++n){var a=e[n];a&&(r.push({x:a.x,y:a.y}),r.push({x:a.x+a.radius/2,y:a.y}),r.push({x:a.x-a.radius/2,y:a.y}),r.push({x:a.x,y:a.y+a.radius/2}),r.push({x:a.x,y:a.y-a.radius/2}))}var i=r[0],s=G(r[0],e,t);for(n=1;n<r.length;++n){var f=G(r[n],e,t);f>=s&&(i=r[n],s=f)}var u=he(function(c){return-1*G({x:c[0],y:c[1]},e,t)},[i.x,i.y],{maxIterations:500,minErrorDelta:1e-10}).x,o={x:u[0],y:u[1]},l=!0;for(n=0;n<e.length;++n)if(z(o,e[n])>e[n].radius){l=!1;break}for(n=0;n<t.length;++n)if(z(o,t[n])<t[n].radius){l=!1;break}if(!l)if(e.length==1)o={x:e[0].x,y:e[0].y};else{let{stats:c}=O(e);c.arcs.length===0?o={x:0,y:-1e3,disjoint:!0}:c.arcs.length===1?o={x:c.arcs[0].circle.x,y:c.arcs[0].circle.y}:t.length?o=Q(e,[]):o=_(c.arcs.map(function(h){return h.p1}))}return o}function G(e,t,r){var n=t[0].radius-z(t[0],e),a,i;for(a=1;a<t.length;++a)i=t[a].radius-z(t[a],e),i<=n&&(n=i);for(a=0;a<r.length;++a)i=z(r[a],e)-r[a].radius,i<=n&&(n=i);return n}export{fe as bestInitialLayout,Ae as chartVega,w as circleArea,q as circleCircleIntersection,L as circleOverlap,xe as circlePath,Q as computeTextCentre,ye as computeTextCentres,k as constrainedMDSLayout,Z as containedInCircles,de as disjointCluster,z as distance,B as distanceFromIntersectArea,_ as getCenter,oe as getDistanceMatrices,H as greedyLayout,O as intersectionArea,me as intersectionAreaPath,F as lossFunction,J as normalizeSolution,K as scaleSolution,X as venn,ge as vennSolution};\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { PathMark, SymbolMark, TextMark } from 'vega';\nimport { vennSolution } from 'venn-helper';\n\nimport { DEFAULT_VENN_COLOR, DEFAULT_VENN_METRIC, SELECTED_ITEM } from '@spectrum-charts/constants';\nimport { getColorValue } from '@spectrum-charts/themes';\n\nimport { getColorProductionRule, getCursor, getMarkOpacity, getTooltip } from '../marks/markUtils';\nimport { VennDegreeOptions, VennSpecOptions } from '../types';\n\ntype VennHelperProps = {\n sets: string[];\n size: number;\n};\n\n/** Default delimiter for set ids */\nexport const SET_ID_DELIMITER = '∩';\n\nexport const getVennSolution = (options: VennSpecOptions) => {\n const { orientation, chartWidth, chartHeight } = options;\n\n const safeData = mapDataForVennHelper(options);\n\n // safe to do casting since types in map and options are the same\n const orientationInRadians = degreesToRadians.get(orientation) as number;\n\n return vennSolution(safeData, {\n orientation: orientationInRadians,\n layout: 'greedy',\n width: chartWidth,\n height: chartHeight,\n set_id_delimiter: SET_ID_DELIMITER,\n padding: 0,\n });\n};\n\nexport const mapDataForVennHelper = (options: VennSpecOptions): VennHelperProps[] => {\n const { data, metric, color } = options;\n const unsafeData = data as unknown as Record<string, unknown>[];\n\n const parsed = unsafeData\n .map((datum) => {\n const res = { ...datum };\n\n if (res[metric] === undefined) {\n throw new Error(\"set the metric prop to the default 'size' or set your own\");\n }\n\n if (metric !== DEFAULT_VENN_METRIC && typeof res[metric] === 'number') {\n res.size = datum[metric] as string;\n }\n\n if (res[color] === undefined) {\n throw new Error(\"set the color prop to the default 'sets' or set your own\");\n }\n\n if (color !== DEFAULT_VENN_COLOR && Array.isArray(res[color])) {\n res.sets = structuredClone(datum[color]) as string[];\n }\n\n return {\n size: res.size as number,\n sets: res.sets as string[],\n } satisfies VennHelperProps;\n })\n .filter((datum) => datum.sets.length > 0);\n\n return parsed;\n};\n\nexport const getCircleMark = (options: VennSpecOptions): SymbolMark => {\n const { name, colorScheme, chartTooltips, chartPopovers } = options;\n\n return {\n type: 'symbol',\n name: name,\n from: { data: 'circles' },\n encode: {\n enter: {\n x: { field: 'x' },\n y: { field: 'y' },\n tooltip: getTooltip(chartTooltips, name),\n size: { field: 'size' },\n shape: { value: 'circle' },\n fill: getColorProductionRule('set_id', colorScheme),\n stroke: { signal: 'chartBackgroundColor' },\n strokeWidth: { value: 2 },\n },\n update: {\n opacity: getMarkOpacity(options),\n cursor: getCursor(chartPopovers),\n },\n },\n };\n};\n\nexport const getTextMark = (options: VennSpecOptions, dataSource: 'circles' | 'intersections'): TextMark => {\n const { label } = options;\n\n return {\n type: 'text',\n from: { data: dataSource },\n interactive: false,\n encode: {\n enter: {\n x: { field: 'textX' },\n y: { field: 'textY' },\n text: { field: `table_data.${label}` },\n align: { value: 'center' },\n baseline: { value: 'middle' },\n },\n update: {\n opacity: getMarkOpacity(options),\n },\n },\n };\n};\n\nexport const getIntersectionStrokeMark = (options: VennSpecOptions): PathMark => {\n const { name, idKey, colorScheme } = options;\n\n return {\n type: 'path',\n from: { data: 'intersections' },\n name: `${name}_intersections_strokes`,\n interactive: false,\n encode: {\n enter: {\n path: { field: 'path' },\n strokeWidth: { value: 6 },\n strokeCap: { value: 'round' },\n stroke: { value: getColorValue('static-blue', colorScheme) },\n },\n\n update: {\n strokeOpacity: [{ test: `${SELECTED_ITEM} === datum.${idKey}`, value: 1 }, { value: 0 }],\n },\n },\n };\n};\n\nexport const getInterserctionMark = (options: VennSpecOptions): PathMark => {\n const { name, chartTooltips, colorScheme, chartPopovers } = options;\n\n return {\n type: 'path',\n from: { data: 'intersections' },\n name: `${name}_intersections`,\n encode: {\n enter: {\n path: { field: 'path' },\n fill: getColorProductionRule('set_id', colorScheme),\n strokeWidth: { value: 2 },\n stroke: { signal: 'chartBackgroundColor' },\n strokeCap: { value: 'square' },\n tooltip: getTooltip(chartTooltips, `${name}`),\n },\n\n update: {\n opacity: getMarkOpacity(options),\n cursor: getCursor(chartPopovers),\n },\n },\n };\n};\n\nexport const getCircleStrokeMark = (options: VennSpecOptions): SymbolMark => {\n const { colorScheme, idKey } = options;\n return {\n type: 'symbol',\n name: `${options.name}_circle_strokes`,\n from: { data: 'circles' },\n interactive: false,\n encode: {\n enter: {\n x: { field: 'x' },\n y: { field: 'y' },\n size: { field: 'size' },\n shape: { value: 'circle' },\n stroke: { value: getColorValue('static-blue', colorScheme) },\n strokeWidth: { value: 6 },\n },\n update: {\n strokeOpacity: [{ test: `${SELECTED_ITEM} === datum.${idKey}`, value: 1 }, { value: 0 }],\n },\n },\n };\n};\n// the convertion here does not match to real math\n// however its the orientations that work for venn-helper\nexport const degreesToRadians = new Map<VennDegreeOptions, number>([\n ['0deg', Math.PI / 2],\n ['90deg', 0],\n ['180deg', (-3 * Math.PI) / 2],\n ['270deg', -Math.PI],\n]);\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport {\n Data,\n FilterTransform,\n FlattenTransform,\n FormulaTransform,\n JoinAggregateTransform,\n LookupTransform,\n Mark,\n Scale,\n Signal,\n WindowTransform,\n} from 'vega';\n\nimport {\n COLOR_SCALE,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_VENN_COLOR,\n DEFAULT_VENN_LABEL,\n DEFAULT_VENN_METRIC,\n TABLE,\n} from '@spectrum-charts/constants';\nimport { toCamelCase } from '@spectrum-charts/utils';\n\nimport { isInteractive } from '../marks/markUtils';\nimport { addFieldToFacetScaleDomain } from '../scale/scaleSpecBuilder';\nimport { addHighlightedItemSignalEvents } from '../signal/signalSpecBuilder';\nimport { ChartData, ColorScheme, HighlightedItem, ScSpec, VennOptions, VennSpecOptions } from '../types';\nimport {\n SET_ID_DELIMITER,\n getCircleMark,\n getCircleStrokeMark,\n getIntersectionStrokeMark,\n getInterserctionMark,\n getTextMark,\n getVennSolution,\n} from './vennUtils';\n\nexport const addVenn = produce<\n ScSpec,\n [\n VennOptions & {\n colorScheme?: ColorScheme;\n highlightedItem?: HighlightedItem;\n idKey: string;\n index?: number;\n chartHeight?: number;\n chartWidth?: number;\n data?: ChartData[];\n }\n ]\n>(\n (\n spec,\n {\n chartPopovers = [],\n chartTooltips = [],\n color = DEFAULT_VENN_COLOR,\n colorScheme = DEFAULT_COLOR_SCHEME,\n index = 0,\n label = DEFAULT_VENN_LABEL,\n metric = DEFAULT_VENN_METRIC,\n name,\n orientation = '0deg',\n chartHeight = 100,\n chartWidth = 100,\n data = [],\n ...props\n }\n ) => {\n const vennProps: VennSpecOptions = {\n chartPopovers,\n chartTooltips,\n chartWidth,\n chartHeight,\n data,\n index,\n colorScheme,\n color,\n label,\n orientation,\n metric,\n name: toCamelCase(name ?? `venn${index}`),\n ...props,\n };\n spec.data = addData(spec.data ?? [], vennProps);\n spec.signals = addSignals(spec.signals ?? [], vennProps);\n spec.scales = addScales(spec.scales ?? []);\n spec.marks = addMarks(spec.marks ?? [], vennProps);\n }\n);\n\nexport const addData = produce<Data[], [VennSpecOptions]>((data, props) => {\n const { circles, intersections } = getVennSolution(props);\n\n data.push({\n name: 'circles',\n values: circles,\n transform: [\n ...getTableJoinTransforms(),\n { type: 'formula', as: 'strokeSize', expr: 'datum.size * 1' },\n { type: 'filter', expr: 'indexof(hiddenSeries, datum.table_data.rscSeriesId) === -1' },\n ],\n });\n\n data.push({\n name: 'intersections',\n values: intersections,\n transform: [...getTableJoinTransforms(), ...getHiddenIntersectionTransforms()],\n });\n\n const tableIndex = data.findIndex((d) => d.name === TABLE);\n data[tableIndex].transform = data[tableIndex].transform ?? [];\n data[tableIndex].transform?.push(...getTableTransforms(props));\n});\n\nexport const addMarks = produce<Mark[], [VennSpecOptions]>((marks, props) => {\n marks.push(getCircleStrokeMark(props));\n marks.push(getCircleMark(props));\n marks.push(getIntersectionStrokeMark(props));\n marks.push(getInterserctionMark(props));\n marks.push(getTextMark(props, 'circles'), getTextMark(props, 'intersections'));\n});\n\nexport const addScales = produce<Scale[]>((scales) => {\n addFieldToFacetScaleDomain(scales, COLOR_SCALE, 'set_legend');\n addFieldToFacetScaleDomain(scales, COLOR_SCALE, 'set_id');\n});\n\nexport const getTableTransforms = (props: VennSpecOptions): (FormulaTransform | FilterTransform)[] => [\n {\n type: 'formula',\n as: 'set_id',\n expr: `join(datum.${props.color}, '${SET_ID_DELIMITER}')`,\n },\n {\n type: 'formula',\n as: 'set_legend',\n expr: `length(datum.${props.color}) > 1 ? datum.${props.color}[0]: join(datum.${props.color}, '${SET_ID_DELIMITER}')`,\n },\n];\n\nexport const getTableJoinTransforms = (): (LookupTransform | FormulaTransform)[] => [\n {\n type: 'lookup',\n key: 'set_id',\n fields: ['set_id'],\n from: TABLE,\n as: ['table_data'],\n },\n { type: 'formula', as: 'rscSeriesId', expr: 'datum.table_data.set_id' },\n { type: 'formula', expr: 'datum.table_data.rscMarkId', as: 'rscMarkId' },\n];\n\nexport const getHiddenIntersectionTransforms = (): (\n | FormulaTransform\n | FlattenTransform\n | JoinAggregateTransform\n | WindowTransform\n | FilterTransform\n)[] => {\n return [\n { type: 'formula', as: 'hidden', expr: 'hiddenSeries' },\n { type: 'flatten', fields: ['sets'], as: ['intersect_set'] },\n // check if each set in the relation is in hidden series\n {\n type: 'formula',\n as: 'hide_intersection',\n expr: 'indexof(datum.hidden, datum.intersect_set) === -1 ? 0 : 1',\n },\n // sum up the values\n { type: 'joinaggregate', groupby: ['set_id'], fields: ['hide_intersection'], ops: ['sum'] },\n { type: 'filter', expr: 'datum.sum_hide_intersection === 0' },\n // clean up duplicates\n { type: 'window', groupby: ['set_id'], ops: ['row_number'], as: ['row_num'] },\n { type: 'filter', expr: 'datum.row_num === 1' },\n ];\n};\n\nexport const addSignals = produce<Signal[], [VennSpecOptions]>((signals, props) => {\n const { chartTooltips, name, idKey } = props;\n\n if (!isInteractive(props)) return;\n addHighlightedItemSignalEvents(signals, name, idKey, 1, chartTooltips[0]?.excludeDataKeys);\n addHighlightedItemSignalEvents(signals, `${name}_intersections`, idKey, 1, chartTooltips[0]?.excludeDataKeys);\n});\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { produce } from 'immer';\nimport { Data, LinearScale, OrdinalScale, PointScale, Scale, Signal } from 'vega';\n\nimport {\n BACKGROUND_COLOR,\n DEFAULT_BACKGROUND_COLOR,\n DEFAULT_COLOR_SCHEME,\n DEFAULT_LINE_TYPES,\n FILTERED_TABLE,\n HIGHLIGHTED_GROUP,\n HIGHLIGHTED_ITEM,\n HIGHLIGHTED_SERIES,\n LINEAR_COLOR_SCALE,\n LINE_TYPE_SCALE,\n LINE_WIDTH_SCALE,\n MARK_ID,\n OPACITY_SCALE,\n SELECTED_GROUP,\n SELECTED_ITEM,\n SELECTED_SERIES,\n SERIES_ID,\n SYMBOL_PATH_WIDTH_SCALE,\n SYMBOL_SHAPE_SCALE,\n SYMBOL_SIZE_SCALE,\n TABLE,\n} from '@spectrum-charts/constants';\nimport { colorSchemes, getColorValue } from '@spectrum-charts/themes';\n\nimport { addArea } from './area/areaSpecBuilder';\nimport { addAxis } from './axis/axisSpecBuilder';\nimport { addBar } from './bar/barSpecBuilder';\nimport { addBullet } from './bullet/bulletSpecBuilder';\nimport { addCombo } from './combo/comboSpecBuilder';\nimport { getSeriesIdTransform } from './data/dataUtils';\nimport { addDonut } from './donut/donutSpecBuilder';\nimport { setHoverOpacityForMarks } from './legend/legendHighlightUtils';\nimport { addLegend } from './legend/legendSpecBuilder';\nimport { addLine } from './line/lineSpecBuilder';\nimport { getOrdinalScale } from './scale/scaleSpecBuilder';\nimport { addScatter } from './scatter/scatterSpecBuilder';\nimport { getGenericValueSignal } from './signal/signalSpecBuilder';\nimport {\n getFacetsFromScales,\n getLineWidthPixelsFromLineWidth,\n getPathFromSymbolShape,\n getStrokeDashFromLineType,\n getSymbolWidthFromRscSymbolSize,\n getVegaSymbolSizeFromRscSymbolSize,\n initializeSpec,\n} from './specUtils';\nimport { addTitle } from './title/titleSpecBuilder';\nimport {\n ChartColors,\n ChartOptions,\n ChartSpecOptions,\n ChartSymbolShape,\n ColorScale,\n ColorScheme,\n Colors,\n LineType,\n LineTypes,\n LineWidth,\n Opacities,\n ScSpec,\n SymbolShapes,\n SymbolSize,\n} from './types';\nimport { addVenn } from './venn/vennSpecBuilder';\n\nexport function buildSpec({\n axes = [],\n backgroundColor = DEFAULT_BACKGROUND_COLOR,\n chartHeight,\n chartWidth,\n colors = 'categorical12',\n colorScheme = DEFAULT_COLOR_SCHEME,\n data,\n description,\n hiddenSeries = [],\n highlightedItem,\n highlightedSeries,\n idKey = MARK_ID,\n legends = [],\n lineTypes = DEFAULT_LINE_TYPES as LineType[],\n lineWidths = ['M'],\n marks = [],\n opacities,\n symbolShapes = ['rounded-square'],\n symbolSizes = ['XS', 'XL'],\n title,\n titles = [],\n}: ChartOptions) {\n const options: ChartSpecOptions = {\n axes,\n backgroundColor,\n chartHeight,\n chartWidth,\n colors,\n colorScheme,\n data,\n description,\n hiddenSeries,\n highlightedItem,\n highlightedSeries,\n idKey,\n legends,\n lineTypes,\n lineWidths,\n marks,\n opacities,\n symbolShapes,\n symbolSizes,\n title,\n titles,\n };\n let spec = initializeSpec(null, { backgroundColor, colorScheme, description, title });\n spec.signals = getDefaultSignals(options);\n spec.scales = getDefaultScales(colors, colorScheme, lineTypes, lineWidths, opacities, symbolShapes, symbolSizes);\n\n let { areaCount, barCount, bulletCount, comboCount, donutCount, lineCount, scatterCount, vennCount } =\n initializeComponentCounts();\n const specOptions = { colorScheme, idKey, highlightedItem };\n spec = [...marks].reduce((acc: ScSpec, mark) => {\n switch (mark.markType) {\n case 'area':\n areaCount++;\n return addArea(acc, { ...mark, ...specOptions, index: areaCount });\n case 'bar':\n barCount++;\n return addBar(acc, { ...mark, ...specOptions, index: barCount });\n case 'bullet':\n bulletCount++;\n return addBullet(acc, { ...mark, ...specOptions, index: bulletCount });\n case 'combo':\n comboCount++;\n return addCombo(acc, { ...mark, ...specOptions, index: comboCount });\n case 'donut':\n donutCount++;\n return addDonut(acc, { ...mark, ...specOptions, index: donutCount });\n case 'line':\n lineCount++;\n return addLine(acc, { ...mark, ...specOptions, index: lineCount });\n case 'scatter':\n scatterCount++;\n return addScatter(acc, { ...mark, ...specOptions, index: scatterCount });\n case 'venn':\n vennCount++;\n return addVenn(acc, { ...mark, ...specOptions, index: vennCount, data, chartWidth, chartHeight });\n\n case 'bigNumber':\n // Do nothing and do not throw an error\n return acc;\n default:\n console.error(`Invalid component type: ${mark} is not a supported chart mark option child`);\n return acc;\n }\n }, spec);\n\n spec = [...legends].reduce((acc: ScSpec, legend, index) => {\n return addLegend(acc, {\n ...legend,\n ...specOptions,\n index,\n hiddenSeries,\n highlightedSeries,\n });\n }, spec);\n\n spec = [...axes].reduce((acc: ScSpec, axis, index) => {\n return addAxis(acc, {\n ...axis,\n ...specOptions,\n index,\n });\n }, spec);\n\n if (titles.length) {\n spec = addTitle(spec, titles[0]);\n }\n\n // copy the spec so we don't mutate the original\n spec = JSON.parse(JSON.stringify(spec));\n spec.data = addData(spec.data ?? [], { facets: getFacetsFromScales(spec.scales) });\n\n // add signals and update marks for controlled highlighting if there isn't a legend with highlight enabled\n if (highlightedSeries) {\n setHoverOpacityForMarks(spec.marks ?? []);\n }\n\n // clear out all scales that don't have any fields on the domain\n spec = removeUnusedScales(spec);\n\n return safeClone(spec);\n}\n\nexport const removeUnusedScales = produce<ScSpec>((spec) => {\n spec.scales = spec.scales?.filter((scale) => {\n return !('domain' in scale && scale.domain && 'fields' in scale.domain && scale.domain.fields.length === 0);\n });\n});\n\nconst initializeComponentCounts = () => {\n return {\n areaCount: -1,\n barCount: -1,\n comboCount: -1,\n donutCount: -1,\n bulletCount: -1,\n lineCount: -1,\n scatterCount: -1,\n vennCount: -1,\n };\n};\n\nexport const getDefaultSignals = ({\n backgroundColor,\n colors,\n colorScheme,\n lineTypes,\n opacities,\n hiddenSeries,\n highlightedItem,\n highlightedSeries,\n}: ChartSpecOptions): Signal[] => {\n // if the background color is transparent, then we want to set the signal background color to gray-50\n // if the signal background color were transparent then backgroundMarks and annotation fill would also be transparent\n const signalBackgroundColor = backgroundColor === 'transparent' ? 'gray-50' : backgroundColor;\n return [\n getGenericValueSignal(BACKGROUND_COLOR, getColorValue(signalBackgroundColor, colorScheme)),\n getGenericValueSignal('colors', getTwoDimensionalColorScheme(colors, colorScheme)),\n getGenericValueSignal('lineTypes', getTwoDimensionalLineTypes(lineTypes)),\n getGenericValueSignal('opacities', getTwoDimensionalOpacities(opacities)),\n getGenericValueSignal('hiddenSeries', hiddenSeries ?? []),\n getGenericValueSignal(HIGHLIGHTED_ITEM, highlightedItem),\n getGenericValueSignal(HIGHLIGHTED_GROUP),\n getGenericValueSignal(HIGHLIGHTED_SERIES, highlightedSeries),\n getGenericValueSignal(SELECTED_ITEM),\n getGenericValueSignal(SELECTED_SERIES),\n getGenericValueSignal(SELECTED_GROUP),\n ];\n};\n\nexport const getTwoDimensionalColorScheme = (colors: ChartColors, colorScheme: ColorScheme): string[][] => {\n if (isColors(colors)) {\n return getColors(colors, colorScheme).map((color) => [color]);\n }\n return colors.map((color) => getColors(color, colorScheme));\n};\n\nexport const getTwoDimensionalLineTypes = (lineTypes: LineTypes): number[][][] => {\n // 1D array of line types\n if (isLineTypeArray(lineTypes)) {\n return getStrokeDashesFromLineTypes(lineTypes).map((strokeDash) => [strokeDash]);\n }\n // 2D array of line types\n return lineTypes.map((lineTypeArray) => getStrokeDashesFromLineTypes(lineTypeArray));\n};\n\nexport const getTwoDimensionalOpacities = (opacities: Opacities | undefined): number[][] => {\n if (!opacities) return [[1]];\n // 1D array of line types\n if (isNumberArray(opacities)) {\n return opacities.map((opacity) => [opacity]);\n }\n // 2D array of line types\n return opacities;\n};\n\nconst getDefaultScales = (\n colors: ChartColors,\n colorScheme: ColorScheme,\n lineTypes: LineTypes,\n lineWidths: LineWidth[],\n opacities: Opacities | undefined,\n symbolShapes: SymbolShapes,\n symbolSizes: [SymbolSize, SymbolSize]\n): Scale[] => [\n getColorScale(colors, colorScheme),\n getLinearColorScale(colors, colorScheme),\n getLineTypeScale(lineTypes),\n getLineWidthScale(lineWidths),\n getOpacityScale(opacities),\n getSymbolShapeScale(symbolShapes),\n getSymbolSizeScale(symbolSizes),\n getSymbolPathWidthScale(symbolSizes),\n];\n\nexport const getColorScale = (colors: ChartColors, colorScheme: ColorScheme): OrdinalScale => {\n // if a two dimensional scale was provided, then just grab the first color in each scale and set that as the scale range\n const range = isColors(colors) ? getColors(colors, colorScheme) : colors.map((c) => getColors(c, colorScheme)[0]);\n return getOrdinalScale('color', range);\n};\n\nexport const getLinearColorScale = (colors: ChartColors, colorScheme: ColorScheme): LinearScale => {\n // if a two dimensional scale was provided, then just grab the first color in each scale and set that as the scale range\n const range = isColors(colors) ? getColors(colors, colorScheme) : colors.map((c) => getColors(c, colorScheme)[0]);\n return {\n name: LINEAR_COLOR_SCALE,\n type: 'linear',\n range,\n domain: { data: TABLE, fields: [] },\n };\n};\n\nexport const getLineTypeScale = (lineTypes: LineTypes): OrdinalScale => {\n // if a two dimensional scale was provided, then just grab the first color in each scale and set that as the scale range\n const range = isLineTypeArray(lineTypes)\n ? getStrokeDashesFromLineTypes(lineTypes)\n : lineTypes.map((lineTypesArray) => getStrokeDashFromLineType(lineTypesArray[0]));\n return getOrdinalScale(LINE_TYPE_SCALE, range);\n};\n\nexport const getSymbolShapeScale = (symbolShapes: SymbolShapes): OrdinalScale => {\n // if a two dimensional scale was provided, then just grab the first color in each scale and set that as the scale range\n const range = isSymbolShapeArray(symbolShapes)\n ? getPathsFromSymbolShapes(symbolShapes)\n : symbolShapes.map((symbolShape) => getPathFromSymbolShape(symbolShape[0]));\n return getOrdinalScale(SYMBOL_SHAPE_SCALE, range);\n};\n\n/**\n * returns the symbol size scale\n * @param symbolSizes\n * @returns LinearScale\n */\nexport const getSymbolSizeScale = (symbolSizes: [SymbolSize, SymbolSize]): LinearScale => ({\n name: SYMBOL_SIZE_SCALE,\n type: 'linear',\n zero: false,\n range: symbolSizes.map((symbolSize) => getVegaSymbolSizeFromRscSymbolSize(symbolSize)),\n domain: { data: TABLE, fields: [] },\n});\n\n/**\n * returns the path width scale\n * @param symbolSizes\n * @returns LinearScale\n */\nexport const getSymbolPathWidthScale = (symbolSizes: [SymbolSize, SymbolSize]): LinearScale => ({\n name: SYMBOL_PATH_WIDTH_SCALE,\n type: 'linear',\n zero: false,\n range: symbolSizes.map((symbolSize) => getSymbolWidthFromRscSymbolSize(symbolSize)),\n domain: { data: TABLE, fields: [] },\n});\n\nexport const getLineWidthScale = (lineWidths: LineWidth[]): OrdinalScale => {\n const range = lineWidths.map((lineWidth) => getLineWidthPixelsFromLineWidth(lineWidth));\n return getOrdinalScale(LINE_WIDTH_SCALE, range);\n};\n\nexport const getOpacityScale = (opacities?: Opacities): OrdinalScale | PointScale => {\n if (opacities?.length) {\n const range = isNumberArray(opacities) ? opacities : opacities.map((opacityArray) => opacityArray[0]);\n return getOrdinalScale(OPACITY_SCALE, range);\n }\n return {\n name: OPACITY_SCALE,\n type: 'point',\n range: [1, 0],\n padding: 1,\n align: 1,\n domain: { data: TABLE, fields: [] },\n };\n};\n\nfunction getColors(colors: Colors, colorScheme: ColorScheme): string[] {\n if (Array.isArray(colors)) {\n return colors.map((color: string) => getColorValue(color, colorScheme));\n }\n return colorSchemes[colors];\n}\n\nfunction getStrokeDashesFromLineTypes(lineTypes: LineType[]): number[][] {\n return lineTypes.map((lineType) => getStrokeDashFromLineType(lineType));\n}\n\nfunction getPathsFromSymbolShapes(symbolShapes: ChartSymbolShape[]) {\n return symbolShapes.map((symbolShape) => getPathFromSymbolShape(symbolShape));\n}\n\n/**\n * Adds a formula transform to the TABLE data that combines all the facets into a single key\n */\nexport const addData = produce<Data[], [{ facets: string[] }]>((data, { facets }) => {\n if (facets.length === 0) return;\n data[0]?.transform?.push(...getSeriesIdTransform(facets));\n\n // add a filter transform to the TABLE data that filters out any hidden series\n const index = data.findIndex((datum) => datum.name === FILTERED_TABLE);\n if (index !== -1) {\n data[index].transform = [\n { type: 'filter', expr: `indexof(hiddenSeries, datum.${SERIES_ID}) === -1` },\n ...(data[index].transform ?? []),\n ];\n }\n});\n\nexport const isColorScale = (colors: ChartColors): colors is ColorScale => {\n return Boolean(!Array.isArray(colors) && colors in colorSchemes);\n};\n\nexport const isColors = (colors: ChartColors): colors is Colors => {\n return isColorScale(colors) || colors.some((color) => !isColorScale(color) && typeof color === 'string');\n};\n\nexport const isLineTypeArray = (lineTypes: LineTypes): lineTypes is LineType[] => {\n return lineTypes.some((lineType) => typeof lineType === 'string' || isStrokeDashArray(lineType));\n};\n\nexport const isStrokeDashArray = (lineType: LineType | LineType[]): lineType is number[] => {\n return Array.isArray(lineType) && !lineType.some((value) => typeof value !== 'number');\n};\n\nexport const isNumberArray = (opacities: Opacities): opacities is number[] => {\n return !opacities.some((opacity) => Array.isArray(opacity));\n};\n\nexport const isSymbolShapeArray = (symbolShapes: SymbolShapes): symbolShapes is ChartSymbolShape[] => {\n return !symbolShapes.some((symbolShape) => Array.isArray(symbolShape));\n};\n\nconst safeClone = <T>(obj: T): T => {\n if (typeof structuredClone === 'function') {\n return structuredClone(obj);\n }\n return JSON.parse(JSON.stringify(obj));\n};\n","export default function(x) {\n return Math.abs(x = Math.round(x)) >= 1e21\n ? x.toLocaleString(\"en\").replace(/,/g, \"\")\n : x.toString(10);\n}\n\n// Computes the decimal coefficient and exponent of the specified number x with\n// significant digits p, where x is positive and p is in [1, 21] or undefined.\n// For example, formatDecimalParts(1.23) returns [\"123\", 0].\nexport function formatDecimalParts(x, p) {\n if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf(\"e\")) < 0) return null; // NaN, ±Infinity\n var i, coefficient = x.slice(0, i);\n\n // The string returned by toExponential either has the form \\d\\.\\d+e[-+]\\d+\n // (e.g., 1.2e+3) or the form \\de[-+]\\d+ (e.g., 1e+3).\n return [\n coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,\n +x.slice(i + 1)\n ];\n}\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Spec, SymbolShape } from 'vega';\n\nimport { GROUP_DATA, MARK_ID, SERIES_ID, TRENDLINE_VALUE } from '@spectrum-charts/constants';\n\nimport { SpectrumVizColor } from './spectrumVizColor.types';\n\nexport type PartiallyRequired<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;\n\n// For overloading Spec typing when more strict typing is needed.\nexport interface ScSpec extends Spec {\n /*\n * Strict typing for usermeta makes it clear what meta information can be accessed during spec creation.\n *\n * Usage:\n * Add properties to usermeta when it's necessary to provide information from one builder\n * to another during spec creation.\n * This should only be used when sibling components have tight coupling and there isn't a\n * reasonable alternative approach using the spec options.\n *\n * Example:\n * A chart element like bar needs to communicate information about its orientation to the axes elements.\n * However, axis elements are built within their own axisSpecBuilder, which is independant from the barSpecBuilder.\n * Parsing the spec for information about the bar is brittle, since implementation details may change.\n * A preferred approach would be to add the needed information to usermeta { orientation: 'vertical' }.\n */\n usermeta: UserMeta;\n}\n\nexport type UserMeta = {\n chartOrientation?: Orientation;\n metricAxisCount?: number;\n};\n\nexport interface MarkBounds {\n x1: number;\n x2: number;\n y1: number;\n y2: number;\n}\n\nconst DatumPredefinedKey = {\n markId: MARK_ID,\n seriesId: SERIES_ID,\n trendlineValue: TRENDLINE_VALUE,\n groupData: GROUP_DATA,\n} as const;\n\nexport type Datum = object & {\n [DatumPredefinedKey.markId]: number;\n [DatumPredefinedKey.seriesId]: string;\n [DatumPredefinedKey.trendlineValue]?: number;\n [DatumPredefinedKey.groupData]?: Datum[];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n};\n\nexport type NumberFormat = 'currency' | 'shortCurrency' | 'shortNumber' | 'standardNumber' | string;\nexport type Orientation = 'vertical' | 'horizontal';\nexport type Position = 'left' | 'right' | 'top' | 'bottom';\nexport type ScaleType = 'linear' | 'point' | 'time' | 'band';\nexport type ChartSymbolShape = 'rounded-square' | SymbolShape | string;\n\n/**\n * Stroke dasharray for the line.\n *\n * solid: null,\n * dashed: 7 4,\n * dotted: 2 3,\n * dotDash: 2 3 7 4,\n * shortDash: 3 4,\n * longDash: 11 4,\n * twoDash: 5 2 11 2\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray\n */\nexport type LineType = 'solid' | 'dashed' | 'dotted' | 'dotDash' | 'shortDash' | 'longDash' | 'twoDash' | number[];\n\n/**\n * Width of line in pixels\n *\n * XS: 1px,\n * S: 1.5px,\n * M: 2px,\n * L: 3px,\n * XL: 4px\n * */\nexport type LineWidth = 'XS' | 'S' | 'M' | 'L' | 'XL' | number;\n\n/**\n * Width of the trail in pixels\n *\n * XS: 6px,\n * S: 8px,\n * M: 10px,\n * L: 12px,\n * XL: 16px\n * */\nexport type PathWidth = 'XS' | 'S' | 'M' | 'L' | 'XL' | number;\n\n/**\n * Width of the symbol in pixels\n *\n * XS: 6px,\n * S: 8px,\n * M: 10px,\n * L: 12px,\n * XL: 16px\n * */\nexport type SymbolSize = 'XS' | 'S' | 'M' | 'L' | 'XL' | number;\n\nexport type StaticValue<T> = { value: T };\nexport type FacetRef<T> = string | StaticValue<T>;\n\nexport type ColorFacet = FacetRef<SpectrumVizColor | string>;\nexport type LineTypeFacet = FacetRef<LineType>;\nexport type LineWidthFacet = FacetRef<LineWidth>;\nexport type OpacityFacet = FacetRef<number>;\nexport type PathWidthFacet = FacetRef<PathWidth>;\nexport type SymbolSizeFacet = FacetRef<SymbolSize>;\nexport type SymbolShapeFacet = FacetRef<ChartSymbolShape>;\n\nexport type FacetType =\n | 'color'\n | 'linearColor'\n | 'lineType'\n | 'lineWidth'\n | 'opacity'\n | 'symbolShape'\n | 'symbolSize'\n | 'symbolPathWidth';\n\nexport type SecondaryFacetType =\n | 'secondaryColor'\n | 'secondaryLineType'\n | 'secondaryLineWidth'\n | 'secondaryOpacity'\n | 'secondarySymbolShape'\n | 'secondarySymbolSize'\n | 'secondarySymbolPathWidth';\n\n// vega production rule type\nexport type ProductionRuleTests<T> = ({\n test?: string;\n} & T)[];\n","// [[fill]align][sign][symbol][0][width][,][.precision][~][type]\nvar re = /^(?:(.)?([<>=^]))?([+\\-( ])?([$#])?(0)?(\\d+)?(,)?(\\.\\d+)?(~)?([a-z%])?$/i;\n\nexport default function formatSpecifier(specifier) {\n if (!(match = re.exec(specifier))) throw new Error(\"invalid format: \" + specifier);\n var match;\n return new FormatSpecifier({\n fill: match[1],\n align: match[2],\n sign: match[3],\n symbol: match[4],\n zero: match[5],\n width: match[6],\n comma: match[7],\n precision: match[8] && match[8].slice(1),\n trim: match[9],\n type: match[10]\n });\n}\n\nformatSpecifier.prototype = FormatSpecifier.prototype; // instanceof\n\nexport function FormatSpecifier(specifier) {\n this.fill = specifier.fill === undefined ? \" \" : specifier.fill + \"\";\n this.align = specifier.align === undefined ? \">\" : specifier.align + \"\";\n this.sign = specifier.sign === undefined ? \"-\" : specifier.sign + \"\";\n this.symbol = specifier.symbol === undefined ? \"\" : specifier.symbol + \"\";\n this.zero = !!specifier.zero;\n this.width = specifier.width === undefined ? undefined : +specifier.width;\n this.comma = !!specifier.comma;\n this.precision = specifier.precision === undefined ? undefined : +specifier.precision;\n this.trim = !!specifier.trim;\n this.type = specifier.type === undefined ? \"\" : specifier.type + \"\";\n}\n\nFormatSpecifier.prototype.toString = function() {\n return this.fill\n + this.align\n + this.sign\n + this.symbol\n + (this.zero ? \"0\" : \"\")\n + (this.width === undefined ? \"\" : Math.max(1, this.width | 0))\n + (this.comma ? \",\" : \"\")\n + (this.precision === undefined ? \"\" : \".\" + Math.max(0, this.precision | 0))\n + (this.trim ? \"~\" : \"\")\n + this.type;\n};\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport var prefixExponent;\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1],\n i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,\n n = coefficient.length;\n return i === n ? coefficient\n : i > n ? coefficient + new Array(i - n + 1).join(\"0\")\n : i > 0 ? coefficient.slice(0, i) + \".\" + coefficient.slice(i)\n : \"0.\" + new Array(1 - i).join(\"0\") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y!\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x, p) {\n var d = formatDecimalParts(x, p);\n if (!d) return x + \"\";\n var coefficient = d[0],\n exponent = d[1];\n return exponent < 0 ? \"0.\" + new Array(-exponent).join(\"0\") + coefficient\n : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + \".\" + coefficient.slice(exponent + 1)\n : coefficient + new Array(exponent - coefficient.length + 2).join(\"0\");\n}\n","import formatDecimal from \"./formatDecimal.js\";\nimport formatPrefixAuto from \"./formatPrefixAuto.js\";\nimport formatRounded from \"./formatRounded.js\";\n\nexport default {\n \"%\": (x, p) => (x * 100).toFixed(p),\n \"b\": (x) => Math.round(x).toString(2),\n \"c\": (x) => x + \"\",\n \"d\": formatDecimal,\n \"e\": (x, p) => x.toExponential(p),\n \"f\": (x, p) => x.toFixed(p),\n \"g\": (x, p) => x.toPrecision(p),\n \"o\": (x) => Math.round(x).toString(8),\n \"p\": (x, p) => formatRounded(x * 100, p),\n \"r\": formatRounded,\n \"s\": formatPrefixAuto,\n \"X\": (x) => Math.round(x).toString(16).toUpperCase(),\n \"x\": (x) => Math.round(x).toString(16)\n};\n","export default function(x) {\n return x;\n}\n","import exponent from \"./exponent.js\";\nimport formatGroup from \"./formatGroup.js\";\nimport formatNumerals from \"./formatNumerals.js\";\nimport formatSpecifier from \"./formatSpecifier.js\";\nimport formatTrim from \"./formatTrim.js\";\nimport formatTypes from \"./formatTypes.js\";\nimport {prefixExponent} from \"./formatPrefixAuto.js\";\nimport identity from \"./identity.js\";\n\nvar map = Array.prototype.map,\n prefixes = [\"y\",\"z\",\"a\",\"f\",\"p\",\"n\",\"µ\",\"m\",\"\",\"k\",\"M\",\"G\",\"T\",\"P\",\"E\",\"Z\",\"Y\"];\n\nexport default function(locale) {\n var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + \"\"),\n currencyPrefix = locale.currency === undefined ? \"\" : locale.currency[0] + \"\",\n currencySuffix = locale.currency === undefined ? \"\" : locale.currency[1] + \"\",\n decimal = locale.decimal === undefined ? \".\" : locale.decimal + \"\",\n numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)),\n percent = locale.percent === undefined ? \"%\" : locale.percent + \"\",\n minus = locale.minus === undefined ? \"−\" : locale.minus + \"\",\n nan = locale.nan === undefined ? \"NaN\" : locale.nan + \"\";\n\n function newFormat(specifier) {\n specifier = formatSpecifier(specifier);\n\n var fill = specifier.fill,\n align = specifier.align,\n sign = specifier.sign,\n symbol = specifier.symbol,\n zero = specifier.zero,\n width = specifier.width,\n comma = specifier.comma,\n precision = specifier.precision,\n trim = specifier.trim,\n type = specifier.type;\n\n // The \"n\" type is an alias for \",g\".\n if (type === \"n\") comma = true, type = \"g\";\n\n // The \"\" type, and any invalid type, is an alias for \".12~g\".\n else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = \"g\";\n\n // If zero fill is specified, padding goes after sign and before digits.\n if (zero || (fill === \"0\" && align === \"=\")) zero = true, fill = \"0\", align = \"=\";\n\n // Compute the prefix and suffix.\n // For SI-prefix, the suffix is lazily computed.\n var prefix = symbol === \"$\" ? currencyPrefix : symbol === \"#\" && /[boxX]/.test(type) ? \"0\" + type.toLowerCase() : \"\",\n suffix = symbol === \"$\" ? currencySuffix : /[%p]/.test(type) ? percent : \"\";\n\n // What format function should we use?\n // Is this an integer type?\n // Can this type generate exponential notation?\n var formatType = formatTypes[type],\n maybeSuffix = /[defgprs%]/.test(type);\n\n // Set the default precision if not specified,\n // or clamp the specified precision to the supported range.\n // For significant precision, it must be in [1, 21].\n // For fixed precision, it must be in [0, 20].\n precision = precision === undefined ? 6\n : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))\n : Math.max(0, Math.min(20, precision));\n\n function format(value) {\n var valuePrefix = prefix,\n valueSuffix = suffix,\n i, n, c;\n\n if (type === \"c\") {\n valueSuffix = formatType(value) + valueSuffix;\n value = \"\";\n } else {\n value = +value;\n\n // Determine the sign. -0 is not less than 0, but 1 / -0 is!\n var valueNegative = value < 0 || 1 / value < 0;\n\n // Perform the initial formatting.\n value = isNaN(value) ? nan : formatType(Math.abs(value), precision);\n\n // Trim insignificant zeros.\n if (trim) value = formatTrim(value);\n\n // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign.\n if (valueNegative && +value === 0 && sign !== \"+\") valueNegative = false;\n\n // Compute the prefix and suffix.\n valuePrefix = (valueNegative ? (sign === \"(\" ? sign : minus) : sign === \"-\" || sign === \"(\" ? \"\" : sign) + valuePrefix;\n valueSuffix = (type === \"s\" ? prefixes[8 + prefixExponent / 3] : \"\") + valueSuffix + (valueNegative && sign === \"(\" ? \")\" : \"\");\n\n // Break the formatted value into the integer “value” part that can be\n // grouped, and fractional or exponential “suffix” part that is not.\n if (maybeSuffix) {\n i = -1, n = value.length;\n while (++i < n) {\n if (c = value.charCodeAt(i), 48 > c || c > 57) {\n valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;\n value = value.slice(0, i);\n break;\n }\n }\n }\n }\n\n // If the fill character is not \"0\", grouping is applied before padding.\n if (comma && !zero) value = group(value, Infinity);\n\n // Compute the padding.\n var length = valuePrefix.length + value.length + valueSuffix.length,\n padding = length < width ? new Array(width - length + 1).join(fill) : \"\";\n\n // If the fill character is \"0\", grouping is applied after padding.\n if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = \"\";\n\n // Reconstruct the final output based on the desired alignment.\n switch (align) {\n case \"<\": value = valuePrefix + value + valueSuffix + padding; break;\n case \"=\": value = valuePrefix + padding + value + valueSuffix; break;\n case \"^\": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;\n default: value = padding + valuePrefix + value + valueSuffix; break;\n }\n\n return numerals(value);\n }\n\n format.toString = function() {\n return specifier + \"\";\n };\n\n return format;\n }\n\n function formatPrefix(specifier, value) {\n var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = \"f\", specifier)),\n e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3,\n k = Math.pow(10, -e),\n prefix = prefixes[8 + e / 3];\n return function(value) {\n return f(k * value) + prefix;\n };\n }\n\n return {\n format: newFormat,\n formatPrefix: formatPrefix\n };\n}\n","export default function(grouping, thousands) {\n return function(value, width) {\n var i = value.length,\n t = [],\n j = 0,\n g = grouping[0],\n length = 0;\n\n while (i > 0 && g > 0) {\n if (length + g + 1 > width) g = Math.max(1, width - length);\n t.push(value.substring(i -= g, i + g));\n if ((length += g + 1) > width) break;\n g = grouping[j = (j + 1) % grouping.length];\n }\n\n return t.reverse().join(thousands);\n };\n}\n","export default function(numerals) {\n return function(value) {\n return value.replace(/[0-9]/g, function(i) {\n return numerals[+i];\n });\n };\n}\n","// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.\nexport default function(s) {\n out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {\n switch (s[i]) {\n case \".\": i0 = i1 = i; break;\n case \"0\": if (i0 === 0) i0 = i; i1 = i; break;\n default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break;\n }\n }\n return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;\n}\n","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x) {\n return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\n}\n","/*\n * Copyright 2023 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { FormatLocaleDefinition, formatLocale } from 'd3-format';\nimport { FontWeight, Locale, NumberLocale, TimeLocale } from 'vega';\n\nimport { LocaleCode, NumberLocaleCode, TimeLocaleCode, getLocale, numberLocales } from '@spectrum-charts/locales';\nimport { ADOBE_CLEAN_FONT } from '@spectrum-charts/themes';\n\nimport { NumberFormat } from '../types';\n\nexport interface LabelDatum {\n index: number;\n label: string;\n value: string | number;\n}\n\nexport const getExpressionFunctions = (\n locale:\n | Locale\n | LocaleCode\n | { number?: NumberLocaleCode | NumberLocale; time?: TimeLocaleCode | TimeLocale } = 'en-US'\n) => {\n const { number: numberLocale } = getLocale(locale);\n const localeCode = typeof locale === 'string' ? locale : locale?.number;\n return {\n formatTimeDurationLabels: formatTimeDurationLabels(numberLocale),\n formatLocaleCurrency: formatLocaleCurrency(numberLocale),\n formatShortNumber: formatShortNumber(localeCode),\n consoleLog,\n formatHorizontalTimeAxisLabels: formatHorizontalTimeAxisLabels(),\n formatVerticalAxisTimeLabels: formatVerticalAxisTimeLabels(),\n getLabelWidth,\n truncateText,\n };\n};\n\n/**\n * Formats a number using the compact notation.\n * @param numberLocale\n * @returns formatted string\n */\nexport const formatShortNumber = (numberLocale?: string | FormatLocaleDefinition) => {\n const locale = typeof numberLocale === 'string' ? numberLocale : navigator.language;\n const customDecimalSymbol = typeof numberLocale === 'object' ? numberLocale.decimal : undefined;\n return (value: number) => {\n // get the decimal symbol for the locale by formatting a number with decimals\n const decimalSymbol = new Intl.NumberFormat(locale, { minimumFractionDigits: 1, maximumFractionDigits: 1 })\n .format(1.1)\n .replace(/\\d/g, '');\n\n const shortNumber = Intl.NumberFormat(locale, { notation: 'compact' }).format(value);\n if (customDecimalSymbol) {\n return shortNumber.replace(decimalSymbol, customDecimalSymbol);\n }\n return shortNumber;\n };\n};\n\n/**\n * Formats currency values using a currency specific locale and currency code for the position and\n * type of currency symbol.\n * Applies thousands and decimal separators based on the numberFormat.\n * @returns string\n */\nexport const formatLocaleCurrency = (numberLocale: FormatLocaleDefinition = numberLocales['en-US']) => {\n return ({ value }: LabelDatum, currencyLocale: string, currencyCode: string, numberFormat: NumberFormat) => {\n if (typeof value === 'string') return value;\n\n try {\n const formatOptions: Intl.NumberFormatOptions = {\n style: 'currency',\n currency: currencyCode,\n maximumFractionDigits: 0,\n };\n // Get currency template with positioning and symbol based on currencyLocale and currencyCode.\n const currencyTemplate = new Intl.NumberFormat(currencyLocale, formatOptions).format(0);\n\n let precision = 2;\n // Parse the precision if numberFormat is a format string.\n if (numberFormat !== 'currency') {\n precision = parseInt(numberFormat.split('.')[1].replace('f', ''));\n }\n\n // Format the value using the chart locale and the precision, then swap it into the currency template.\n const d3Formatter = formatLocale(numberLocale);\n return currencyTemplate.replace('0', d3Formatter.format(`,.${precision}f`)(value));\n } catch (error) {\n console.error('Error formatting currency: ', error);\n // Fallback to chart locale formatting.\n return formatLocale(numberLocale).format('$,.2f')(value);\n }\n };\n};\n\n/**\n * Hides labels that are the same as the previous label\n * @returns string\n */\nexport const formatHorizontalTimeAxisLabels = () => {\n let prevLabel: string;\n return (datum: LabelDatum) => {\n const showLabel = datum.index === 0 || prevLabel !== datum.label;\n prevLabel = datum.label;\n return showLabel ? datum.label : '';\n };\n};\n\n/**\n * Hides the larger granularity instead of repeating it for each tick\n * @returns string\n */\nexport const formatVerticalAxisTimeLabels = () => {\n let prevLabel: string;\n return (datum: LabelDatum) => {\n const labels = datum.label.split('\\u2000');\n const label = labels[0];\n\n const showLabel = datum.index === 0 || prevLabel !== label;\n prevLabel = label;\n return showLabel ? datum.label : labels[1];\n };\n};\n\n/**\n * Formats a duration in seconds as HH:MM:SS.\n * Function is initialized with a number locale. This ensures that the thousands separator is correct for the locale\n * @param numberLocale\n * @returns formatted sting (HH:MM:SS)\n */\nexport const formatTimeDurationLabels = (numberLocale: FormatLocaleDefinition = numberLocales['en-US']) => {\n const d3 = formatLocale(numberLocale);\n // 0 padded, minimum 2 digits, thousands separator, integer format\n const zeroPaddedFormat = d3.format('02,d');\n // Thousands separator, integer format\n const format = d3.format(',d');\n return ({ value }: LabelDatum) => {\n if (typeof value === 'string') return value;\n\n const sign = value < 0 ? '-' : '';\n const absoluteValue = Math.abs(value);\n const seconds = zeroPaddedFormat(Math.floor(absoluteValue % 60));\n\n // If the duration is less than an hour, only show minutes and seconds\n if (absoluteValue < 3600) {\n const minutes = format(Math.floor(absoluteValue / 60));\n return `${sign}${minutes}:${seconds}`;\n }\n\n const hours = format(Math.floor(absoluteValue / 60 / 60));\n const minutes = zeroPaddedFormat(Math.floor((absoluteValue / 60) % 60));\n return `${sign}${hours}:${minutes}:${seconds}`;\n };\n};\n\n/**\n * Utility function that will log the value to the console and return it\n * @param value\n * @returns\n */\nconst consoleLog = (value) => {\n console.log(value);\n return value;\n};\n\n/**\n * Figures out the rendered width of text by drawing it on a canvas\n * @param text\n * @param fontWeight\n * @param fontSize\n * @returns width in pixels\n */\nconst getLabelWidth = (text: string, fontWeight: FontWeight = 'bold', fontSize: number = 12) => {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (context === null) return 0;\n\n context.font = `${fontWeight} ${fontSize}px ${ADOBE_CLEAN_FONT}`;\n return context.measureText(text).width;\n};\n\nconst truncateText = (text: string, maxWidth: number, fontWeight: FontWeight = 'normal', fontSize: number = 12) => {\n maxWidth = maxWidth - 4;\n const textWidth = getLabelWidth(text, fontWeight, fontSize);\n const elipsisWidth = getLabelWidth('\\u2026', fontWeight, fontSize);\n if (textWidth <= maxWidth) return text;\n\n let truncatedText = text.slice(0, text.length - 1).trim();\n\n for (let i = truncatedText.length; i > 0; i--) {\n truncatedText = truncatedText.slice(0, truncatedText.length - 1).trim();\n if (getLabelWidth(truncatedText, fontWeight, fontSize) + elipsisWidth <= maxWidth) break;\n }\n\n if (truncatedText.length === 0) return text;\n return truncatedText + '\\u2026';\n};\n\nexport const expressionFunctions = {\n consoleLog,\n formatHorizontalTimeAxisLabels: formatHorizontalTimeAxisLabels(),\n formatVerticalAxisTimeLabels: formatVerticalAxisTimeLabels(),\n getLabelWidth,\n truncateText,\n};\n","/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\nimport { Config, Locale, NumberLocale, Padding, Renderers, TimeLocale } from 'vega';\n\nimport { DEFAULT_COLOR_SCHEME } from '@spectrum-charts/constants';\nimport { LocaleCode, NumberLocaleCode, TimeLocaleCode, getLocale } from '@spectrum-charts/locales';\n\nimport { getExpressionFunctions } from './expressionFunctions';\nimport { getChartConfig } from './specUtils';\n\nexport const getVegaEmbedOptions = ({\n locale = 'en-US',\n height = 400,\n width = 600,\n padding = 0,\n renderer = 'svg',\n config,\n colorScheme = DEFAULT_COLOR_SCHEME,\n}: {\n locale?: Locale | LocaleCode | { number?: NumberLocaleCode | NumberLocale; time?: TimeLocaleCode | TimeLocale };\n height?: number;\n width?: number;\n padding?: Padding;\n renderer?: Renderers;\n config?: Config;\n colorScheme?: 'light' | 'dark';\n}) => {\n const expressionFunctions = getExpressionFunctions(locale);\n const { number: numberLocale, time: timeLocale } = getLocale(locale);\n const chartConfig = config ?? getChartConfig(undefined, colorScheme);\n\n return {\n actions: false,\n ast: true,\n expressionFunctions,\n formatLocale: numberLocale as unknown as Record<string, unknown>, // these are poorly typed by vega-embed\n height,\n width,\n padding,\n renderer,\n timeFormatLocale: timeLocale as unknown as Record<string, unknown>, // these are poorly typed by vega-embed\n config: chartConfig,\n };\n};\n"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE__633__","__WEBPACK_EXTERNAL_MODULE__274__","__WEBPACK_EXTERNAL_MODULE__365__","isMergeableObject","value","isNonNullObject","stringValue","Object","prototype","toString","call","$$typeof","REACT_ELEMENT_TYPE","isReactElement","isSpecial","Symbol","for","cloneUnlessOtherwiseSpecified","options","clone","deepmerge","val","Array","isArray","defaultArrayMerge","target","source","concat","map","element","getKeys","keys","getOwnPropertySymbols","filter","symbol","propertyIsEnumerable","getEnumerableOwnPropertySymbols","propertyIsOnObject","object","property","_","arrayMerge","sourceIsArray","destination","forEach","key","hasOwnProperty","propertyIsUnsafe","customMerge","getMergeFunction","mergeObject","all","array","Error","reduce","prev","next","deepmerge_1","zeros","x","r","i","dot","a","b","ret","length","norm2","Math","sqrt","scale","c","weightedSum","w1","v1","w2","v2","j","wolfeLineSearch","f","pk","current","c1","c2","phi0","fx","phiPrime0","fxprime","phi","phi_old","phiPrime","a0","zoom","a_lo","a_high","phi_lo","iteration","abs","bisect","parameters","maxIterations","tolerance","fA","fB","delta","mid","fMid","nelderMead","x0","maxDiff","nonZeroDelta","zeroDelta","minErrorDelta","minTolerance","rho","undefined","chi","psi","sigma","N","simplex","id","point","slice","updateSimplex","sortOrder","centroid","reflected","contracted","expanded","sort","history","sortedSimplex","state","push","max","worst","shouldReduce","conjugateGradient","initial","params","temp","yk","alpha","delta_k","gradientDescent","learnRate","gradientDescentLineSearch","functionCalls","inner","zerosM","y","e","d","s","o","defineProperty","enumerable","get","toStringTag","getLocale","numberLocales","timeLocales","JSON","parse","number","time","t","n","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","getter","__esModule","definition","obj","prop","NOTHING","DRAFTABLE","DRAFT_STATE","die","error","args","getPrototypeOf","isDraft","isDraftable","isPlainObject","constructor","isMap","isSet","objectCtorString","proto","Ctor","Function","each","iter","getArchtype","Reflect","ownKeys","entry","index","thing","type_","has","set","propOrOldValue","add","Map","Set","latest","copy_","base_","shallowCopy","base","strict","isPlain","descriptors","getOwnPropertyDescriptors","desc","writable","configurable","create","assign","freeze","deep","isFrozen","clear","delete","dontMutateFrozenCollections","entries","currentScope","plugins","getPlugin","pluginKey","plugin","getCurrentScope","usePatchesInScope","scope","patchListener","patches_","inversePatches_","patchListener_","revokeScope","leaveScope","drafts_","revokeDraft","parent_","enterScope","immer2","immer_","canAutoFreeze_","unfinalizedDrafts_","draft","revoke_","revoked_","processResult","result","baseDraft","modified_","finalize","maybeFreeze","generateReplacementPatches_","rootScope","path","childValue","finalizeProperty","scope_","finalized_","resultEach","isSet2","generatePatches_","parentState","targetObject","rootPath","targetIsSet","res","assigned_","autoFreeze_","objectTraps","getDescriptorFromProto","draft_","readPropFromProto","peek","prepareCopy","createProxy","current2","currentState","markChanged","Number","isNaN","deleteProperty","getOwnPropertyDescriptor","owner","setPrototypeOf","arrayTraps","useStrictShallowCopy_","parent","proxyMap_","proxySet_","isManual_","traps","revoke","proxy","Proxy","revocable","createProxyProxy","currentImpl","copy","fn","arguments","apply","immer","config","produce","recipe","defaultBase","self","base2","hasError","p","ip","produceWithPatches","patches","inversePatches","autoFreeze","setAutoFreeze","useStrictShallowCopy","setUseStrictShallowCopy","createDraft","finishDraft","applyPatches","patch","op","applyPatchesImpl","applyPatches_","bind","addTimeTransform","transforms","dimension","findIndex","transform","type","expr","as","field","units","DEFAULT_TRANSFORMED_TIME_DIMENSION","DEFAULT_TIME_DIMENSION","getTransformSort","order","getTableData","data","find","name","TABLE","getFilteredTableData","FILTERED_TABLE","getSeriesIdTransform","facets","facet","join","SERIES_ID","getFilteredTooltipData","chartTooltips","excludeDataKeys","excludeDataKey","getFacetsFromOptions","color","lineType","opacity","size","secondaryFacets","getFacetsFromScales","scales","COLOR_SCALE","LINE_TYPE_SCALE","OPACITY_SCALE","acc","cur","domain","fields","getStrokeDashFromLineType","getLineWidthPixelsFromLineWidth","lineWidth","getPathFromSymbolShape","symbolShape","ROUNDED_SQUARE_PATH","getPathFromIcon","icon","date","DATE_PATH","sentimentNegative","SENTIMENT_NEGATIVE_PATH","sentimentNeutral","SENTIMENT_NEUTRAL_PATH","sentimentPositive","SENTIMENT_POSITIVE_PATH","getVegaSymbolSizeFromRscSymbolSize","symbolSize","pow","getSymbolWidthFromRscSymbolSize","baseData","values","MARK_ID","initializeSpec","spec","chartOptions","backgroundColor","colorScheme","description","title","baseSpec","usermeta","background","getColorValue","mergeValuesIntoData","dataset","datasetValues","getDimensionField","scaleType","getD3FormatSpecifierFromNumberFormat","numberFormat","getChartConfig","defaultConfig","getSpectrumVegaConfig","mergeConfig","getScaleIndexByType","axis","scaleName","domainDataKey","toCamelCase","generateScale","getScaleIndexByName","addDomainFields","isScaleMultiFieldsRef","includes","addContinuousDimensionScale","padding","overridePadding","paddingOuter","addMetricScale","metricKeys","metricAxis","addFieldToFacetScaleDomain","facetType","facetValue","facetField","getDefaultScale","chartOrientation","isDimensionAxis","vertical","horizontal","range","getPadding","nice","zero","paddingInner","getBandPadding","PADDING_RATIO","LINEAR_PADDING","DISCRETE_PADDING","paddingRatio","getScaleName","getOrdinalScale","Boolean","getCursor","chartPopovers","hasOnClick","getTooltip","nestedDatum","defaultTooltip","signal","COMPONENT_NAME","test","getBorderStrokeEncodings","isStacked","isArea","stroke","BACKGROUND_COLOR","strokeWidth","strokeJoin","isInteractive","metricRanges","trendlines","hasPopover","hasTooltip","some","trendline","displayOnHover","metricRange","getColorProductionRule","colorScaleType","colorScaleName","LINEAR_COLOR_SCALE","getLineWidthProductionRule","LINE_WIDTH_SCALE","getOpacityProductionRule","getSymbolSizeProductionRule","SYMBOL_SIZE_SCALE","getStrokeDashProductionRule","getXProductionRule","getYProductionRule","metric","getPointsForVoronoi","dataSource","from","interactive","encode","enter","fill","update","getVoronoiPath","markOptions","markName","isVoronoi","tooltip","cursor","getItemHoverArea","marks","getHoverSizes","getHoverMarkName","shape","HOVER_SHAPE","getHoverSizeSignal","HOVER_SHAPE_COUNT","HOVER_SIZE","getHoverMarkNames","getMarkOpacity","highlightedItem","idKey","rules","DEFAULT_OPACITY_RULE","addHighlightMarkOpacityRules","SELECTED_GROUP","SELECTED_ITEM","HIGHLIGHT_CONTRAST_RATIO","getInteractiveMarkName","getTooltips","chartTooltip","applyTooltipPropDefaults","highlightBy","addTooltipData","addHighlightedData","tooltips","filteredTable","markType","getGroupIdTransform","getMarkHighlightedData","HIGHLIGHTED_GROUP","isHighlightedByGroup","addTooltipSignals","signals","highlightedGroupSignal","interactionMode","INTERACTION_MODE","ITEM","addMouseEvents","on","events","opacityRules","unshift","HIGHLIGHTED_ITEM","getHighlightSignalUpdateExpression","legendName","includeHiddenSeries","hoveredSeriesExpression","getGenericValueSignal","addHighlightedItemSignalEvents","datumOrder","highlightedItemSignal","datum","excludeDataKeysCondition","addHighlightedSeriesSignalEvents","highlightedSeriesSignal","HIGHLIGHTED_SERIES","getAreaMark","areaOptions","metricStart","metricEnd","y2","getX","fillOpacity","getAreaOpacity","isMetricRange","fadedOpacity","SELECTED_SERIES","addArea","DEFAULT_COLOR","DEFAULT_COLOR_SCHEME","DEFAULT_METRIC","console","addData","addSignals","setScales","addAreaMarks","tableData","filteredTableData","groupby","areaHasPopover","areaHasTooltip","getAreaHighlightedData","hasGroupId","addHighlightedItemEvents","getControlledHoveredGroupSignal","getControlledHoveredIdSignal","areaName","getAnchorPointMark","getSelectedAreaMarks","getHoverMarks","highlightMarks","spectrumColors","light","getAxisAnnotationsFromChildren","axisAnnotations","axisName","position","annotation","annotationIndex","applyDefaultAxisAnnotationOptions","format","offset","DEFAULT_AXIS_ANNOTATION_OFFSET","DEFAULT_AXIS_ANNOTATION_COLOR","dataKey","getDualAxisScaleNames","baseScaleName","primaryScaleName","secondaryScaleName","primaryScale","secondaryScale","primaryDomain","secondaryDomain","getTextNumberFormat","datumProperty","currencyLocale","currencyCode","getDefaultAxis","axisOptions","grid","hideDefaultLabels","labelAlign","labelFontWeight","labelOrientation","tickCountLimit","ticks","tickMinStep","vegaLabelAlign","vegaLabelBaseline","vegaLabelOffset","vegaLabelPadding","orient","tickCount","getTickCount","labelAngle","getLabelAngle","labelOffset","getLabelOffset","labelPadding","labels","getLabelAnchorValues","text","getLabelFormat","getSecondaryTimeAxis","granularity","getTimeLabelFormats","formatType","labelSeparation","getSecondaryTimeAxisLabelFormatting","secondaryLabelFormat","primaryLabelFormat","getPrimaryTimeAxis","labelOverlap","dy","getScale","applicableScales","getRange","getDefaultScaleNameFromPosition","getOpposingRange","getDefaultOpposingScaleNameFromPosition","hasSubLabels","subLabels","interval","step","getControlledLabelAnchorValues","labelOrientaion","getLabelAnchor","align","baseline","labelBaseline","labelIsParallelToAxis","start","center","end","labelFormat","truncateLabels","getAxisLabelsEncoding","labelKey","signalName","fontWeight","getEncodedLabelAnchor","defaultLabelAlign","baseTestString","baseSignalString","getReferenceLines","referenceLines","referenceLine","applyReferenceLineOptionDefaults","iconColor","DEFAULT_FONT_COLOR","labelColor","DEFAULT_LABEL_FONT_WEIGHT","layer","scaleTypeSupportsReferenceLines","getPositionEncoding","signalValue","halfInnerPaddingFormula","getReferenceLineRuleMark","positionEncoding","startOffset","positionOptions","top","bottom","left","x2","right","strokeDash","getAdditiveMarkPositionOptions","horizontalOffset","getReferenceLineSymbolMark","getReferenceLineTextMark","referenceLineOptions","label","getReferenceLineLabelsEncoding","verticalOffset","isVertical","calculateReferenceLineOffsets","getEncodedLabelBaselineAlign","isTrellisedChart","stringify","addAxis","baselineOffset","DEFAULT_GRANULARITY","DEFAULT_LABEL_ALIGN","DEFAULT_LABEL_ORIENTATION","opposingScaleType","getOpposingScaleType","dualMetricAxis","addAxisData","addAxisSignals","axes","addAxes","addAxesMarks","annotationOptions","option","getAxisAnnotationDetailData","ops","getAxisAnnotationSummaryData","getAxisAnnotationAggregateData","getAxisAnnotationRangeData","addAxisAnnotationData","getLabelSignalValue","getHighlightAxisAnnotationSignal","markname","between","getClickAxisAnnotationSignal","getSelectAxisAnnotationSignal","addAxisAnnotationSignals","newAxes","trellisAxisOptions","labelOffsetSignal","axisType","startsWith","getTrellisAxisOptions","getTimeAxes","getLabelValue","titlePadding","subLabelAxis","subLabelValues","domainWidth","getSubLabelAxis","handleDualMetricAxisConfig","incrementMetricAxisCount","setAxisBaseline","referenceLineLabel","linePosition","addAxisAnnotationAxis","getIsMetricAxis","metricAxisCount","isPrimaryMetricAxis","scaleNames","defaultFontColor","primaryAxisFillRules","FIRST_RSC_SERIES_ID","primaryAxisFillOpacityRules","MOUSE_OVER_SERIES","LAST_RSC_SERIES_ID","encodings","applyPrimaryMetricAxisEncodings","secondaryAxisFillRules","secondaryAxisFillOpacityRules","applySecondaryMetricAxisEncodings","addDualMetricAxisConfig","back","front","referenceLineMarks","getReferenceLineMarks","trellisGroupMark","mark","isTrellised","baselineRule","orientation","getBaselineRule","addBaseline","trellisOrientation","axisOrientation","facetName","facetGroupBy","trellisScaleName","groupMark","fromFacet","getTrellisGroupProperties","encodeAxisTitle","addAxesToTrellisGroup","axisAnnotationOptions","zindex","ANNOTATION_SINGLE_ICON_SVG","xc","yc","getAxisAnnotationSummaryMarks","band","width","height","ANNOTATION_RANGED_ICON_SVG","getAxisAnnotationSpanMarks","addAxisAnnotationMarks","getPopovers","chartPopover","applyPopoverPropDefaults","UNSAFE_highlightBy","addPopoverData","popovers","getMarkSelectedData","getTrendlines","applyTrendlinePropDefaults","dimensionExtent","dimensionRange","highlightRawPoint","method","trendlineAnnotations","opts","dimensionScaleType","getTrendlineScaleType","isDimensionNormalized","isRegressionMethod","trendlineDimension","trendlineMetric","getTrendlineDimensionMetric","trendlineColor","getTrendlineColorFromMarkOptions","TRENDLINE_VALUE","getTrendlineLineTypeFromMarkOptions","normalizeTrendlineDimensionName","isAggregateMethod","isPolynomialMethod","isWindowMethod","getPolynomialOrder","parseInt","split","getRegressionExtent","isNormalized","extentName","MS_PER_DAY","trendlineOrientation","getAggregateTransform","isHighResolutionData","operations","average","median","getRegressionTransform","trendlineOptions","regressionMethod","extent","getWindowTransform","frameWidth","frame","getNormalizedDimensionTransform","getRegressionExtentTransform","getTrendlineDimensionRangeTransforms","filterExpressions","getTrendlineParamFormulaTransforms","_e","getTrendlineParamLookupTransform","addTrendlineData","getTrendlineData","addTableDataTransforms","concatenatedTrendlineData","getRegressionTrendlineData","getAggregateTrendlineData","getWindowTrendlineData","getTrendlineDisplayOnHoverData","getHighlightTrendlineData","dimensionRangeTransforms","getExcludeDataKeyTransforms","getTrendlineStatisticalTransforms","standardTrendlineDimension","standardTrendlinDimension","trendlineName","staticPointTest","staticPoint","getSelectedTest","getHighlightBackgroundPoint","lineOptions","getHighlightPointSize","getHighlightPointStrokeWidth","getHighlightOrSelectionPoint","useHighlightedData","getHighlightPointFill","getHighlightPointStroke","strokeOpacity","getHighlightPointStrokeOpacity","getHighlightPoint","getSelectionPoint","getSecondaryHighlightPoint","secondaryHighlightedMetric","fillRules","selectedTest","strokeRules","baseOpacityRule","strokeOpacityRules","opacityValue","getHighlightOpacityValue","sizeRules","DEFAULT_SYMBOL_SIZE","strokeWidthRules","DEFAULT_SYMBOL_STROKE_WIDTH","getSelectRingPoint","getLineMark","lineMarkOptions","popoverWithDimensionHighlightExists","getLineOpacity","interactiveMarkName","popoverMarkName","getLineHoverMarks","getHoverRule","getInteractiveMarks","DEFAULT_INTERACTION_MODE","nearest","getVoronoiMarks","item","getItemHoverMarks","getTrendlineAnnotationMarks","badge","dimensionValue","prefix","trendlineDimensionExtent","trendlineDimensionScaleType","trendlineWidth","getTrendlineAnnotationSpecOptions","getTrendlineAnnotations","getTrendlineAnnotationPoints","getTrendlineAnnotationTextMark","getTrendlineAnnotationBadgeMark","getTrendlineAnnotationPointX","getTrendlineAnnotationPointY","getStartDimensionExtentProductionRule","getEndDimensionExtentProductionRule","textPrefix","getTextFill","avoidMarks","anchor","colorString","colorRule","getColorProductionRuleSignalString","getColorKey","textColors","cornerRadius","getTrendlineMarks","getTrendlineRuleMark","getDataSourceName","clip","getTrendlineLineMark","getTrendlineHoverMarks","getRuleYEncodings","getRuleXEncodings","getLineMarkOptions","startDimensionExtent","endDimensionExtent","getLineYProductionRule","getLineXProductionRule","trendlineHoverOptions","flat","override","getTrendlineScales","setTrendlineSignals","getTrellisProperties","trellisPadding","rangeScale","trellis","isDualMetricAxis","getDodgedGroupMark","groupedPadding","dimensionScaleKey","dimensionAxis","getOrientationProperties","getBaseBarEnterEncodings","startKey","metricScaleKey","scaleKey","endKey","startValue","endValue","getStackedMetricEncodings","getMetricEncodings","hasSquareCorners","CORNER_RADIUS","rectEncodeEntry","topTestString","STACK_ID","bottomTestString","cornerRadiusTopLeft","cornerRadiusTopRight","cornerRadiusBottomLeft","cornerRadiusBottomRight","getStackedCornerRadiusEncodings","rotateRectClockwiseIfNeeded","getCornerRadiusEncodings","getBarEnterEncodings","getBarUpdateEncodings","getStroke","getStrokeDash","getStrokeWidth","defaultProductionRule","lineWidthValue","getBarPadding","getScaleValues","getBaseScaleName","applyAnnotationPropDefaults","barOptions","dataName","dimensionScaleName","dimensionField","textKey","getAnnotationMarks","dimensionName","barAnnotations","getAnnotation","getAnnotationTextMark","getAnnotationBackgroundMark","style","annotationWidth","getAnnotationWidth","annotationPosition","getAnnotationMetricAxisPosition","getMinBandwidth","fontSize","ANNOTATION_FONT_SIZE","ANNOTATION_FONT_WEIGHT","getAnnotationXEncode","ANNOTATION_PADDING","positionOffset","getAnnotationPositionOffset","getStackedBackgroundBar","getBaseDataSourceName","getStackedDimensionEncodings","getStackedBar","addBar","DEFAULT_CATEGORICAL_DIMENSION","TRELLIS_PADDING","barName","addScales","addMarks","barPaddingOuter","dimensionDataType","TIME","getStackFields","getStackIdTransform","getStackAggregateData","getDodgeGroupTransform","addDualMetricAxisData","addDimensionScale","trellisScaleIndex","addTrellisScale","addSecondaryScales","secondaryIndex","primaryIndex","barMarks","getDodgedAndStackedBarMark","getStackedBarMarks","getDodgedMark","popover","getDimensionSelectionRing","repeatedScale","getRepeatedScale","trellisAxis","trellisRangeScale","getTrellisGroupMark","getMetricScale","getDimensionScale","generateThresholdColorExpr","thresholds","metricField","defaultColor","sorted","thresholdMin","exprParts","nextLower","bulletOptions","markGroupEncodeUpdateDirection","direction","bulletGroupWidth","bulletMark","baseHeightSignal","encodeUpdateYSignal","showTarget","showTargetValue","getBulletMarkThreshold","track","trackColor","trackWidth","trackY","getBulletTrack","bulletMarkRectEncodeUpdateYSignal","fillColor","thresholdBarColor","getBulletMarkRect","solidColor","bulletMarkTargetEncodeUpdateY","bulletMarkTargetEncodeUpdateY2","getBulletMarkTarget","getBulletMarkTargetValueLabel","labelPosition","barLabelColor","getBulletMarkLabel","encodeUpdateSignalWidth","fillExpr","getBulletMarkValueLabel","tickSize","getBulletLabelAxesLeft","getBulletLabelAxesRight","addBullet","DEFAULT_BULLET_DIRECTION","DEFAULT_LABEL_POSITION","DEFAULT_SCALE_TYPE","maxScaleValue","DEFAULT_SCALE_VALUE","groupScaleRangeSignal","xRange","domainFields","round","clamp","getBulletGroupHeightExpression","getBulletTableData","getBulletTransforms","getMetricRanges","applyMetricRangeOptionDefaults","rangeOpacity","getMetricRangeMark","metricRangeOptions","parentName","getPopoverMarkName","lineName","addLine","addLineMarks","isSparkline","isMethodLast","highlightedExpr","getLineHighlightedData","getLineStaticPointData","getMetricRangeData","getMetricRangeSignals","addHoverSignals","getMetricKeys","pointSize","getLineStaticPoint","getMetricRangeGroupMarks","scaleAxisToFit","hoverMarkName","addCombo","barCount","lineCount","initializeComponentCounts","comboName","getComboMarkName","getDimension","displayName","getDisplayName","combineNames","charAt","toUpperCase","getDonutSummary","donutSummaries","applyDonutSummaryPropDefaults","donutOptions","getSummaryValueEncode","getSummaryValueText","DONUT_RADIUS","holeRatio","DONUT_SUMMARY_MIN_RADIUS","getSummaryValueBaseline","limit","getSummaryValueLimit","isBoolean","fontHeight","getSummaryLabelEncode","applySegmentLabelPropDefaults","percent","valueFormat","getSegmentLabelTextMark","getBaseSegmentLabelEnterEncode","positionEncodings","getSegmentLabelValueTextMark","getSegmentLabelValueText","radius","theta","getSegmentLabelFontSize","percentSignal","rule","DONUT_SEGMENT_LABEL_MIN_ANGLE","addDonut","startAngle","segmentLabels","filteredTableIndex","getPieTransforms","endAngle","padAngle","innerRadius","outerRadius","getArcMark","donutSummary","getBooleanDonutSummaryGroupMark","getDonutSummaryGroupMark","getDonutSummaryMarks","segmentLabel","getSegmentLabel","getSegmentLabelMarks","donutName","DONUT_SUMMARY_FONT_SIZE_RATIO","getDonutSummarySignals","setHoverOpacityForMarks","flattenMarks","markUsesSeriesColorScale","highlightOpacityRule","getHighlightOpacityRule","opacityRuleInsertIndex","splice","isGroupMark","facetScaleNames","SYMBOL_SHAPE_SCALE","isScaleWithMultiFields","getColumns","getHiddenEntriesFilter","hiddenEntries","getEncodings","legendOptions","symbolEncodings","getSymbolEncodings","hoverEncodings","getHoverEncodings","legendLabelsEncodings","getLegendLabelsEncodings","legendLabels","showHideEncodings","getShowHideEncodings","clickEncodings","getClickEncodings","mergeLegendEncodings","highlight","highlightedSeries","hasMouseInteraction","descriptions","getOpacityEncoding","symbols","highlightSignalName","selectedSignalName","getSymbolFacetEncoding","customValue","getHiddenSeriesColorRule","secondaryFacetMapping","linearColor","symbolPathWidth","secondaryFacet","hiddenSeries","isToggleable","colorValue","clickEncode","mergedEncodings","encoding","getSymbolType","addLegend","formattedColor","formattedLineType","formattedLineWidth","formattedSymbolShape","formatFacetRefsWithPresets","ordinalFacets","continuousFacets","scaleHasKey","getFacetsFromKeys","getFacets","legends","uniqueFacetFields","getCategoricalLegend","getContinuousLegend","labelLimit","titleLimit","legend","columns","getLegendLayout","symbolType","gradientThickness","layout","addHighlighSignalLegendHoverEvents","getScatterPaths","scatterOptions","scatterPaths","groupBy","pathWidth","scatterPathOptions","scatterColor","scatterName","scatterOpacity","getScatterPathSpecOptions","getScatterPathTrailMark","getPathWidth","getOpacity","fadedValue","SYMBOL_PATH_WIDTH_SCALE","addScatterMarks","scatterGroup","getScatterMark","getScatterHoverMarks","getScatterSelectMarks","getScatterPathMarks","blend","getSelectRingSize","baseSize","addScatter","DEFAULT_LINEAR_DIMENSION","DEFAULT_DIMENSION_SCALE_TYPE","setScatterPathScales","addTitle","DEFAULT_TITLE_FONT_WEIGHT","O","q","u","parentIndex","z","Z","angle","atan2","A","l","h","indexOf","g","v","PI","sin","cos","circle","p1","p2","w","m","C","overlap","stats","area","arcArea","polygonArea","arcs","innerPoints","intersectionPoints","acos","L","min","ae","H","k","F","Y","B","ue","restarts","sets","distances","constraints","oe","imul","le","seed","random","setid","rowid","M","weight","R","P","I","U","$","S","T","E","ce","D","yRange","ge","set_id_delimiter","orientationOrder","circles","intersections","localeCompare","se","X","de","bounds","J","K","ve","Q","disjoint","log","ye","set_id","me","textX","textY","xe","G","getTextMark","degreesToRadians","addVenn","DEFAULT_VENN_COLOR","DEFAULT_VENN_LABEL","DEFAULT_VENN_METRIC","chartHeight","chartWidth","props","vennProps","structuredClone","mapDataForVennHelper","getVennSolution","getTableJoinTransforms","getHiddenIntersectionTransforms","tableIndex","getTableTransforms","getCircleStrokeMark","getCircleMark","strokeCap","getIntersectionStrokeMark","getInterserctionMark","buildSpec","DEFAULT_BACKGROUND_COLOR","colors","lineTypes","DEFAULT_LINE_TYPES","lineWidths","opacities","symbolShapes","symbolSizes","titles","getDefaultSignals","getDefaultScales","areaCount","bulletCount","comboCount","donutCount","scatterCount","vennCount","specOptions","removeUnusedScales","safeClone","signalBackgroundColor","getTwoDimensionalColorScheme","getTwoDimensionalLineTypes","getTwoDimensionalOpacities","isColors","getColors","isLineTypeArray","getStrokeDashesFromLineTypes","lineTypeArray","isNumberArray","getColorScale","getLinearColorScale","getLineTypeScale","getLineWidthScale","getOpacityScale","getSymbolShapeScale","getSymbolSizeScale","getSymbolPathWidthScale","lineTypesArray","isSymbolShapeArray","getPathsFromSymbolShapes","opacityArray","colorSchemes","isColorScale","isStrokeDashArray","formatDecimalParts","toExponential","coefficient","GROUP_DATA","prefixExponent","re","formatSpecifier","specifier","match","exec","FormatSpecifier","sign","comma","precision","trim","exponent","toFixed","toLocaleString","replace","toPrecision","formatRounded","floor","prefixes","locale","grouping","thousands","group","identity","substring","reverse","currencyPrefix","currency","currencySuffix","decimal","numerals","formatNumerals","String","minus","nan","newFormat","formatTypes","toLowerCase","suffix","maybeSuffix","valuePrefix","valueSuffix","valueNegative","out","i1","i0","formatTrim","charCodeAt","Infinity","formatPrefix","NaN","getExpressionFunctions","numberLocale","localeCode","formatTimeDurationLabels","formatLocaleCurrency","formatShortNumber","consoleLog","formatHorizontalTimeAxisLabels","formatVerticalAxisTimeLabels","getLabelWidth","truncateText","navigator","language","customDecimalSymbol","decimalSymbol","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","shortNumber","notation","formatOptions","currencyTemplate","d3Formatter","prevLabel","showLabel","d3","zeroPaddedFormat","absoluteValue","seconds","context","document","createElement","getContext","font","ADOBE_CLEAN_FONT","measureText","maxWidth","textWidth","elipsisWidth","truncatedText","expressionFunctions","getVegaEmbedOptions","renderer","timeLocale","actions","ast","formatLocale","timeFormatLocale"],"sourceRoot":""}
|