drizzle-cube 0.2.28 → 0.2.29
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/client/charts/chartConfigs.d.ts +1 -1
- package/dist/client/charts.js +2 -2
- package/dist/client/chunks/{charts-BfXEKIrq.js → charts-Cr9ec7VQ.js} +66 -63
- package/dist/client/chunks/charts-Cr9ec7VQ.js.map +1 -0
- package/dist/client/chunks/{charts-DQuOI5HA.js → charts-nP6WCxHG.js} +2725 -2488
- package/dist/client/chunks/charts-nP6WCxHG.js.map +1 -0
- package/dist/client/chunks/{components-CWMeA5e-.js → components-CCRoi0sB.js} +5347 -4700
- package/dist/client/chunks/components-CCRoi0sB.js.map +1 -0
- package/dist/client/chunks/core-DcL8wSpZ.js +6 -0
- package/dist/client/chunks/core-DcL8wSpZ.js.map +1 -0
- package/dist/client/chunks/{hooks-CAKGR-w0.js → hooks-CM78mXuP.js} +20 -19
- package/dist/client/chunks/{hooks-CAKGR-w0.js.map → hooks-CM78mXuP.js.map} +1 -1
- package/dist/client/chunks/{icons-DI4Xack3.js → icons-D7ek1iXF.js} +39 -39
- package/dist/client/chunks/{icons-DI4Xack3.js.map → icons-D7ek1iXF.js.map} +1 -1
- package/dist/client/components/AnalysisBuilder/FunnelBindingKeySelector.d.ts +21 -0
- package/dist/client/components/AnalysisBuilder/types.d.ts +15 -4
- package/dist/client/components/charts/FunnelChart.config.d.ts +9 -0
- package/dist/client/components/charts/FunnelChart.d.ts +11 -0
- package/dist/client/components.js +2 -2
- package/dist/client/hooks/queries/index.d.ts +1 -0
- package/dist/client/hooks/queries/useFunnelQuery.d.ts +25 -0
- package/dist/client/hooks/useAnalysisBuilderHook.d.ts +7 -3
- package/dist/client/hooks/useAnalysisQueryExecution.d.ts +12 -1
- package/dist/client/hooks.js +5 -5
- package/dist/client/icons/types.d.ts +1 -0
- package/dist/client/icons.js +1 -1
- package/dist/client/index.d.ts +5 -3
- package/dist/client/index.js +115 -99
- package/dist/client/providers.js +1 -1
- package/dist/client/stores/analysisBuilderStore.d.ts +21 -1
- package/dist/client/styles.css +1 -1
- package/dist/client/types/funnel.d.ts +231 -0
- package/dist/client/types.d.ts +11 -2
- package/dist/client/utils/funnelExecution.d.ts +111 -0
- package/dist/client/utils/funnelValidation.d.ts +46 -0
- package/dist/client/utils/multiQueryValidation.d.ts +3 -3
- package/dist/client-bundle-stats.html +1 -1
- package/package.json +1 -1
- package/dist/client/chunks/charts-BfXEKIrq.js.map +0 -1
- package/dist/client/chunks/charts-DQuOI5HA.js.map +0 -1
- package/dist/client/chunks/components-CWMeA5e-.js.map +0 -1
- package/dist/client/chunks/core-DrhYtHHa.js +0 -6
- package/dist/client/chunks/core-DrhYtHHa.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"charts-nP6WCxHG.js","sources":["../../../node_modules/@tanstack/query-core/build/modern/subscribable.js","../../../node_modules/@tanstack/query-core/build/modern/timeoutManager.js","../../../node_modules/@tanstack/query-core/build/modern/utils.js","../../../node_modules/@tanstack/query-core/build/modern/focusManager.js","../../../node_modules/@tanstack/query-core/build/modern/thenable.js","../../../node_modules/@tanstack/query-core/build/modern/notifyManager.js","../../../node_modules/@tanstack/query-core/build/modern/onlineManager.js","../../../node_modules/@tanstack/query-core/build/modern/retryer.js","../../../node_modules/@tanstack/query-core/build/modern/removable.js","../../../node_modules/@tanstack/query-core/build/modern/query.js","../../../node_modules/@tanstack/query-core/build/modern/queryObserver.js","../../../node_modules/@tanstack/query-core/build/modern/infiniteQueryBehavior.js","../../../node_modules/@tanstack/query-core/build/modern/mutation.js","../../../node_modules/@tanstack/query-core/build/modern/mutationCache.js","../../../node_modules/@tanstack/query-core/build/modern/queriesObserver.js","../../../node_modules/@tanstack/query-core/build/modern/queryCache.js","../../../node_modules/@tanstack/query-core/build/modern/queryClient.js","../../../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js","../../../node_modules/@tanstack/react-query/build/modern/IsRestoringProvider.js","../../../node_modules/@tanstack/react-query/build/modern/QueryErrorResetBoundary.js","../../../node_modules/@tanstack/react-query/build/modern/errorBoundaryUtils.js","../../../node_modules/@tanstack/react-query/build/modern/suspense.js","../../../node_modules/@tanstack/react-query/build/modern/useQueries.js","../../../node_modules/@tanstack/react-query/build/modern/useBaseQuery.js","../../../node_modules/@tanstack/react-query/build/modern/useQuery.js","../../../src/client/client/CubeClient.ts","../../../src/client/client/BatchCoordinator.ts","../../../src/client/providers/CubeApiProvider.tsx","../../../src/client/hooks/queries/useCubeMetaQuery.ts","../../../src/client/icons/defaultIcons.ts","../../../src/client/icons/registry.tsx","../../../src/client/components/LoadingIndicator.tsx","../../../src/client/providers/CubeMetaProvider.tsx","../../../src/client/providers/CubeFeaturesProvider.tsx","../../../src/client/providers/CubeProvider.tsx","../../../src/client/components/AnalysisBuilder/SectionHeading.tsx","../../../src/client/components/charts/BarChart.config.tsx","../../../src/client/components/charts/LineChart.config.tsx","../../../src/client/components/charts/AreaChart.config.tsx","../../../src/client/components/charts/PieChart.config.tsx","../../../src/client/components/charts/ScatterChart.config.tsx","../../../src/client/components/charts/BubbleChart.config.tsx","../../../src/client/components/charts/RadarChart.config.tsx","../../../src/client/components/charts/RadialBarChart.config.tsx","../../../src/client/components/charts/TreeMapChart.config.tsx","../../../src/client/components/charts/DataTable.config.tsx","../../../src/client/components/charts/ActivityGridChart.config.tsx","../../../src/client/components/charts/KpiNumber.config.tsx","../../../src/client/components/charts/KpiDelta.config.tsx","../../../src/client/components/charts/KpiText.config.tsx","../../../src/client/components/charts/MarkdownChart.config.tsx","../../../src/client/components/charts/FunnelChart.config.tsx","../../../src/client/utils/chartUtils.ts","../../../src/client/components/charts/AxisFormatControls.tsx","../../../src/client/hooks/useCubeFieldLabel.ts","../../../src/client/theme/index.ts","../../../src/client/hooks/useTheme.ts","../../../src/client/utils/chartConstants.ts","../../../src/client/utils/periodUtils.ts","../../../src/client/utils/pivotUtils.ts","../../../src/client/utils/comparisonUtils.ts","../../../src/client/components/charts/ChartContainer.tsx","../../../src/client/components/charts/ChartTooltip.tsx","../../../src/client/utils/targetUtils.ts","../../../src/client/components/charts/BarChart.tsx","../../../src/client/components/charts/LineChart.tsx","../../../src/client/components/charts/AreaChart.tsx","../../../src/client/components/charts/PieChart.tsx","../../../src/client/components/charts/ScatterChart.tsx","../../../src/client/components/charts/RadarChart.tsx","../../../src/client/components/charts/RadialBarChart.tsx","../../../node_modules/d3-array/src/ascending.js","../../../node_modules/d3-array/src/descending.js","../../../node_modules/d3-array/src/bisector.js","../../../node_modules/d3-array/src/number.js","../../../node_modules/d3-array/src/bisect.js","../../../node_modules/d3-array/src/extent.js","../../../node_modules/internmap/src/index.js","../../../node_modules/d3-array/src/ticks.js","../../../node_modules/d3-array/src/max.js","../../../node_modules/d3-array/src/min.js","../../../node_modules/d3-axis/src/identity.js","../../../node_modules/d3-axis/src/axis.js","../../../node_modules/d3-selection/src/namespaces.js","../../../node_modules/d3-selection/src/namespace.js","../../../node_modules/d3-selection/src/creator.js","../../../node_modules/d3-selection/src/selector.js","../../../node_modules/d3-selection/src/selection/select.js","../../../node_modules/d3-selection/src/array.js","../../../node_modules/d3-selection/src/selectorAll.js","../../../node_modules/d3-selection/src/selection/selectAll.js","../../../node_modules/d3-selection/src/matcher.js","../../../node_modules/d3-selection/src/selection/selectChild.js","../../../node_modules/d3-selection/src/selection/selectChildren.js","../../../node_modules/d3-selection/src/selection/filter.js","../../../node_modules/d3-selection/src/selection/sparse.js","../../../node_modules/d3-selection/src/selection/enter.js","../../../node_modules/d3-selection/src/constant.js","../../../node_modules/d3-selection/src/selection/data.js","../../../node_modules/d3-selection/src/selection/exit.js","../../../node_modules/d3-selection/src/selection/join.js","../../../node_modules/d3-selection/src/selection/merge.js","../../../node_modules/d3-selection/src/selection/order.js","../../../node_modules/d3-selection/src/selection/sort.js","../../../node_modules/d3-selection/src/selection/call.js","../../../node_modules/d3-selection/src/selection/nodes.js","../../../node_modules/d3-selection/src/selection/node.js","../../../node_modules/d3-selection/src/selection/size.js","../../../node_modules/d3-selection/src/selection/empty.js","../../../node_modules/d3-selection/src/selection/each.js","../../../node_modules/d3-selection/src/selection/attr.js","../../../node_modules/d3-selection/src/window.js","../../../node_modules/d3-selection/src/selection/style.js","../../../node_modules/d3-selection/src/selection/property.js","../../../node_modules/d3-selection/src/selection/classed.js","../../../node_modules/d3-selection/src/selection/text.js","../../../node_modules/d3-selection/src/selection/html.js","../../../node_modules/d3-selection/src/selection/raise.js","../../../node_modules/d3-selection/src/selection/lower.js","../../../node_modules/d3-selection/src/selection/append.js","../../../node_modules/d3-selection/src/selection/insert.js","../../../node_modules/d3-selection/src/selection/remove.js","../../../node_modules/d3-selection/src/selection/clone.js","../../../node_modules/d3-selection/src/selection/datum.js","../../../node_modules/d3-selection/src/selection/on.js","../../../node_modules/d3-selection/src/selection/dispatch.js","../../../node_modules/d3-selection/src/selection/iterator.js","../../../node_modules/d3-selection/src/selection/index.js","../../../node_modules/d3-selection/src/select.js","../../../node_modules/d3-color/src/define.js","../../../node_modules/d3-color/src/color.js","../../../node_modules/d3-interpolate/src/constant.js","../../../node_modules/d3-interpolate/src/color.js","../../../node_modules/d3-interpolate/src/rgb.js","../../../node_modules/d3-interpolate/src/numberArray.js","../../../node_modules/d3-interpolate/src/array.js","../../../node_modules/d3-interpolate/src/date.js","../../../node_modules/d3-interpolate/src/number.js","../../../node_modules/d3-interpolate/src/object.js","../../../node_modules/d3-interpolate/src/string.js","../../../node_modules/d3-interpolate/src/value.js","../../../node_modules/d3-interpolate/src/round.js","../../../node_modules/d3-format/src/formatDecimal.js","../../../node_modules/d3-format/src/exponent.js","../../../node_modules/d3-format/src/formatGroup.js","../../../node_modules/d3-format/src/formatNumerals.js","../../../node_modules/d3-format/src/formatSpecifier.js","../../../node_modules/d3-format/src/formatTrim.js","../../../node_modules/d3-format/src/formatPrefixAuto.js","../../../node_modules/d3-format/src/formatRounded.js","../../../node_modules/d3-format/src/formatTypes.js","../../../node_modules/d3-format/src/identity.js","../../../node_modules/d3-format/src/locale.js","../../../node_modules/d3-format/src/defaultLocale.js","../../../node_modules/d3-format/src/precisionFixed.js","../../../node_modules/d3-format/src/precisionPrefix.js","../../../node_modules/d3-format/src/precisionRound.js","../../../node_modules/d3-scale/src/init.js","../../../node_modules/d3-scale/src/ordinal.js","../../../node_modules/d3-scale/src/constant.js","../../../node_modules/d3-scale/src/number.js","../../../node_modules/d3-scale/src/continuous.js","../../../node_modules/d3-scale/src/tickFormat.js","../../../node_modules/d3-scale/src/linear.js","../../../node_modules/d3-scale/src/pow.js","../../../node_modules/d3-scale/src/quantize.js","../../../src/client/components/charts/TreeMapChart.tsx","../../../src/client/components/charts/BubbleChart.tsx","../../../src/client/components/charts/DataTable.tsx","../../../src/client/components/charts/ActivityGridChart.tsx","../../../src/client/components/DataHistogram.tsx","../../../src/client/components/charts/KpiNumber.tsx","../../../src/client/components/charts/KpiDelta.tsx","../../../src/client/components/charts/KpiText.tsx","../../../src/client/components/charts/MarkdownChart.tsx","../../../src/client/components/charts/FunnelChart.tsx"],"sourcesContent":["// src/subscribable.ts\nvar Subscribable = class {\n constructor() {\n this.listeners = /* @__PURE__ */ new Set();\n this.subscribe = this.subscribe.bind(this);\n }\n subscribe(listener) {\n this.listeners.add(listener);\n this.onSubscribe();\n return () => {\n this.listeners.delete(listener);\n this.onUnsubscribe();\n };\n }\n hasListeners() {\n return this.listeners.size > 0;\n }\n onSubscribe() {\n }\n onUnsubscribe() {\n }\n};\nexport {\n Subscribable\n};\n//# sourceMappingURL=subscribable.js.map","// src/timeoutManager.ts\nvar defaultTimeoutProvider = {\n // We need the wrapper function syntax below instead of direct references to\n // global setTimeout etc.\n //\n // BAD: `setTimeout: setTimeout`\n // GOOD: `setTimeout: (cb, delay) => setTimeout(cb, delay)`\n //\n // If we use direct references here, then anything that wants to spy on or\n // replace the global setTimeout (like tests) won't work since we'll already\n // have a hard reference to the original implementation at the time when this\n // file was imported.\n setTimeout: (callback, delay) => setTimeout(callback, delay),\n clearTimeout: (timeoutId) => clearTimeout(timeoutId),\n setInterval: (callback, delay) => setInterval(callback, delay),\n clearInterval: (intervalId) => clearInterval(intervalId)\n};\nvar TimeoutManager = class {\n // We cannot have TimeoutManager<T> as we must instantiate it with a concrete\n // type at app boot; and if we leave that type, then any new timer provider\n // would need to support ReturnType<typeof setTimeout>, which is infeasible.\n //\n // We settle for type safety for the TimeoutProvider type, and accept that\n // this class is unsafe internally to allow for extension.\n #provider = defaultTimeoutProvider;\n #providerCalled = false;\n setTimeoutProvider(provider) {\n if (process.env.NODE_ENV !== \"production\") {\n if (this.#providerCalled && provider !== this.#provider) {\n console.error(\n `[timeoutManager]: Switching provider after calls to previous provider might result in unexpected behavior.`,\n { previous: this.#provider, provider }\n );\n }\n }\n this.#provider = provider;\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = false;\n }\n }\n setTimeout(callback, delay) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = true;\n }\n return this.#provider.setTimeout(callback, delay);\n }\n clearTimeout(timeoutId) {\n this.#provider.clearTimeout(timeoutId);\n }\n setInterval(callback, delay) {\n if (process.env.NODE_ENV !== \"production\") {\n this.#providerCalled = true;\n }\n return this.#provider.setInterval(callback, delay);\n }\n clearInterval(intervalId) {\n this.#provider.clearInterval(intervalId);\n }\n};\nvar timeoutManager = new TimeoutManager();\nfunction systemSetTimeoutZero(callback) {\n setTimeout(callback, 0);\n}\nexport {\n TimeoutManager,\n defaultTimeoutProvider,\n systemSetTimeoutZero,\n timeoutManager\n};\n//# sourceMappingURL=timeoutManager.js.map","// src/utils.ts\nimport { timeoutManager } from \"./timeoutManager.js\";\nvar isServer = typeof window === \"undefined\" || \"Deno\" in globalThis;\nfunction noop() {\n}\nfunction functionalUpdate(updater, input) {\n return typeof updater === \"function\" ? updater(input) : updater;\n}\nfunction isValidTimeout(value) {\n return typeof value === \"number\" && value >= 0 && value !== Infinity;\n}\nfunction timeUntilStale(updatedAt, staleTime) {\n return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0);\n}\nfunction resolveStaleTime(staleTime, query) {\n return typeof staleTime === \"function\" ? staleTime(query) : staleTime;\n}\nfunction resolveEnabled(enabled, query) {\n return typeof enabled === \"function\" ? enabled(query) : enabled;\n}\nfunction matchQuery(filters, query) {\n const {\n type = \"all\",\n exact,\n fetchStatus,\n predicate,\n queryKey,\n stale\n } = filters;\n if (queryKey) {\n if (exact) {\n if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {\n return false;\n }\n } else if (!partialMatchKey(query.queryKey, queryKey)) {\n return false;\n }\n }\n if (type !== \"all\") {\n const isActive = query.isActive();\n if (type === \"active\" && !isActive) {\n return false;\n }\n if (type === \"inactive\" && isActive) {\n return false;\n }\n }\n if (typeof stale === \"boolean\" && query.isStale() !== stale) {\n return false;\n }\n if (fetchStatus && fetchStatus !== query.state.fetchStatus) {\n return false;\n }\n if (predicate && !predicate(query)) {\n return false;\n }\n return true;\n}\nfunction matchMutation(filters, mutation) {\n const { exact, status, predicate, mutationKey } = filters;\n if (mutationKey) {\n if (!mutation.options.mutationKey) {\n return false;\n }\n if (exact) {\n if (hashKey(mutation.options.mutationKey) !== hashKey(mutationKey)) {\n return false;\n }\n } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {\n return false;\n }\n }\n if (status && mutation.state.status !== status) {\n return false;\n }\n if (predicate && !predicate(mutation)) {\n return false;\n }\n return true;\n}\nfunction hashQueryKeyByOptions(queryKey, options) {\n const hashFn = options?.queryKeyHashFn || hashKey;\n return hashFn(queryKey);\n}\nfunction hashKey(queryKey) {\n return JSON.stringify(\n queryKey,\n (_, val) => isPlainObject(val) ? Object.keys(val).sort().reduce((result, key) => {\n result[key] = val[key];\n return result;\n }, {}) : val\n );\n}\nfunction partialMatchKey(a, b) {\n if (a === b) {\n return true;\n }\n if (typeof a !== typeof b) {\n return false;\n }\n if (a && b && typeof a === \"object\" && typeof b === \"object\") {\n return Object.keys(b).every((key) => partialMatchKey(a[key], b[key]));\n }\n return false;\n}\nvar hasOwn = Object.prototype.hasOwnProperty;\nfunction replaceEqualDeep(a, b) {\n if (a === b) {\n return a;\n }\n const array = isPlainArray(a) && isPlainArray(b);\n if (!array && !(isPlainObject(a) && isPlainObject(b))) return b;\n const aItems = array ? a : Object.keys(a);\n const aSize = aItems.length;\n const bItems = array ? b : Object.keys(b);\n const bSize = bItems.length;\n const copy = array ? new Array(bSize) : {};\n let equalItems = 0;\n for (let i = 0; i < bSize; i++) {\n const key = array ? i : bItems[i];\n const aItem = a[key];\n const bItem = b[key];\n if (aItem === bItem) {\n copy[key] = aItem;\n if (array ? i < aSize : hasOwn.call(a, key)) equalItems++;\n continue;\n }\n if (aItem === null || bItem === null || typeof aItem !== \"object\" || typeof bItem !== \"object\") {\n copy[key] = bItem;\n continue;\n }\n const v = replaceEqualDeep(aItem, bItem);\n copy[key] = v;\n if (v === aItem) equalItems++;\n }\n return aSize === bSize && equalItems === aSize ? a : copy;\n}\nfunction shallowEqualObjects(a, b) {\n if (!b || Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n for (const key in a) {\n if (a[key] !== b[key]) {\n return false;\n }\n }\n return true;\n}\nfunction isPlainArray(value) {\n return Array.isArray(value) && value.length === Object.keys(value).length;\n}\nfunction isPlainObject(o) {\n if (!hasObjectPrototype(o)) {\n return false;\n }\n const ctor = o.constructor;\n if (ctor === void 0) {\n return true;\n }\n const prot = ctor.prototype;\n if (!hasObjectPrototype(prot)) {\n return false;\n }\n if (!prot.hasOwnProperty(\"isPrototypeOf\")) {\n return false;\n }\n if (Object.getPrototypeOf(o) !== Object.prototype) {\n return false;\n }\n return true;\n}\nfunction hasObjectPrototype(o) {\n return Object.prototype.toString.call(o) === \"[object Object]\";\n}\nfunction sleep(timeout) {\n return new Promise((resolve) => {\n timeoutManager.setTimeout(resolve, timeout);\n });\n}\nfunction replaceData(prevData, data, options) {\n if (typeof options.structuralSharing === \"function\") {\n return options.structuralSharing(prevData, data);\n } else if (options.structuralSharing !== false) {\n if (process.env.NODE_ENV !== \"production\") {\n try {\n return replaceEqualDeep(prevData, data);\n } catch (error) {\n console.error(\n `Structural sharing requires data to be JSON serializable. To fix this, turn off structuralSharing or return JSON-serializable data from your queryFn. [${options.queryHash}]: ${error}`\n );\n throw error;\n }\n }\n return replaceEqualDeep(prevData, data);\n }\n return data;\n}\nfunction keepPreviousData(previousData) {\n return previousData;\n}\nfunction addToEnd(items, item, max = 0) {\n const newItems = [...items, item];\n return max && newItems.length > max ? newItems.slice(1) : newItems;\n}\nfunction addToStart(items, item, max = 0) {\n const newItems = [item, ...items];\n return max && newItems.length > max ? newItems.slice(0, -1) : newItems;\n}\nvar skipToken = Symbol();\nfunction ensureQueryFn(options, fetchOptions) {\n if (process.env.NODE_ENV !== \"production\") {\n if (options.queryFn === skipToken) {\n console.error(\n `Attempted to invoke queryFn when set to skipToken. This is likely a configuration error. Query hash: '${options.queryHash}'`\n );\n }\n }\n if (!options.queryFn && fetchOptions?.initialPromise) {\n return () => fetchOptions.initialPromise;\n }\n if (!options.queryFn || options.queryFn === skipToken) {\n return () => Promise.reject(new Error(`Missing queryFn: '${options.queryHash}'`));\n }\n return options.queryFn;\n}\nfunction shouldThrowError(throwOnError, params) {\n if (typeof throwOnError === \"function\") {\n return throwOnError(...params);\n }\n return !!throwOnError;\n}\nfunction addConsumeAwareSignal(object, getSignal, onCancelled) {\n let consumed = false;\n let signal;\n Object.defineProperty(object, \"signal\", {\n enumerable: true,\n get: () => {\n signal ??= getSignal();\n if (consumed) {\n return signal;\n }\n consumed = true;\n if (signal.aborted) {\n onCancelled();\n } else {\n signal.addEventListener(\"abort\", onCancelled, { once: true });\n }\n return signal;\n }\n });\n return object;\n}\nexport {\n addConsumeAwareSignal,\n addToEnd,\n addToStart,\n ensureQueryFn,\n functionalUpdate,\n hashKey,\n hashQueryKeyByOptions,\n isPlainArray,\n isPlainObject,\n isServer,\n isValidTimeout,\n keepPreviousData,\n matchMutation,\n matchQuery,\n noop,\n partialMatchKey,\n replaceData,\n replaceEqualDeep,\n resolveEnabled,\n resolveStaleTime,\n shallowEqualObjects,\n shouldThrowError,\n skipToken,\n sleep,\n timeUntilStale\n};\n//# sourceMappingURL=utils.js.map","// src/focusManager.ts\nimport { Subscribable } from \"./subscribable.js\";\nimport { isServer } from \"./utils.js\";\nvar FocusManager = class extends Subscribable {\n #focused;\n #cleanup;\n #setup;\n constructor() {\n super();\n this.#setup = (onFocus) => {\n if (!isServer && window.addEventListener) {\n const listener = () => onFocus();\n window.addEventListener(\"visibilitychange\", listener, false);\n return () => {\n window.removeEventListener(\"visibilitychange\", listener);\n };\n }\n return;\n };\n }\n onSubscribe() {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.();\n this.#cleanup = void 0;\n }\n }\n setEventListener(setup) {\n this.#setup = setup;\n this.#cleanup?.();\n this.#cleanup = setup((focused) => {\n if (typeof focused === \"boolean\") {\n this.setFocused(focused);\n } else {\n this.onFocus();\n }\n });\n }\n setFocused(focused) {\n const changed = this.#focused !== focused;\n if (changed) {\n this.#focused = focused;\n this.onFocus();\n }\n }\n onFocus() {\n const isFocused = this.isFocused();\n this.listeners.forEach((listener) => {\n listener(isFocused);\n });\n }\n isFocused() {\n if (typeof this.#focused === \"boolean\") {\n return this.#focused;\n }\n return globalThis.document?.visibilityState !== \"hidden\";\n }\n};\nvar focusManager = new FocusManager();\nexport {\n FocusManager,\n focusManager\n};\n//# sourceMappingURL=focusManager.js.map","// src/thenable.ts\nimport { noop } from \"./utils.js\";\nfunction pendingThenable() {\n let resolve;\n let reject;\n const thenable = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n thenable.status = \"pending\";\n thenable.catch(() => {\n });\n function finalize(data) {\n Object.assign(thenable, data);\n delete thenable.resolve;\n delete thenable.reject;\n }\n thenable.resolve = (value) => {\n finalize({\n status: \"fulfilled\",\n value\n });\n resolve(value);\n };\n thenable.reject = (reason) => {\n finalize({\n status: \"rejected\",\n reason\n });\n reject(reason);\n };\n return thenable;\n}\nfunction tryResolveSync(promise) {\n let data;\n promise.then((result) => {\n data = result;\n return result;\n }, noop)?.catch(noop);\n if (data !== void 0) {\n return { data };\n }\n return void 0;\n}\nexport {\n pendingThenable,\n tryResolveSync\n};\n//# sourceMappingURL=thenable.js.map","// src/notifyManager.ts\nimport { systemSetTimeoutZero } from \"./timeoutManager.js\";\nvar defaultScheduler = systemSetTimeoutZero;\nfunction createNotifyManager() {\n let queue = [];\n let transactions = 0;\n let notifyFn = (callback) => {\n callback();\n };\n let batchNotifyFn = (callback) => {\n callback();\n };\n let scheduleFn = defaultScheduler;\n const schedule = (callback) => {\n if (transactions) {\n queue.push(callback);\n } else {\n scheduleFn(() => {\n notifyFn(callback);\n });\n }\n };\n const flush = () => {\n const originalQueue = queue;\n queue = [];\n if (originalQueue.length) {\n scheduleFn(() => {\n batchNotifyFn(() => {\n originalQueue.forEach((callback) => {\n notifyFn(callback);\n });\n });\n });\n }\n };\n return {\n batch: (callback) => {\n let result;\n transactions++;\n try {\n result = callback();\n } finally {\n transactions--;\n if (!transactions) {\n flush();\n }\n }\n return result;\n },\n /**\n * All calls to the wrapped function will be batched.\n */\n batchCalls: (callback) => {\n return (...args) => {\n schedule(() => {\n callback(...args);\n });\n };\n },\n schedule,\n /**\n * Use this method to set a custom notify function.\n * This can be used to for example wrap notifications with `React.act` while running tests.\n */\n setNotifyFunction: (fn) => {\n notifyFn = fn;\n },\n /**\n * Use this method to set a custom function to batch notifications together into a single tick.\n * By default React Query will use the batch function provided by ReactDOM or React Native.\n */\n setBatchNotifyFunction: (fn) => {\n batchNotifyFn = fn;\n },\n setScheduler: (fn) => {\n scheduleFn = fn;\n }\n };\n}\nvar notifyManager = createNotifyManager();\nexport {\n createNotifyManager,\n defaultScheduler,\n notifyManager\n};\n//# sourceMappingURL=notifyManager.js.map","// src/onlineManager.ts\nimport { Subscribable } from \"./subscribable.js\";\nimport { isServer } from \"./utils.js\";\nvar OnlineManager = class extends Subscribable {\n #online = true;\n #cleanup;\n #setup;\n constructor() {\n super();\n this.#setup = (onOnline) => {\n if (!isServer && window.addEventListener) {\n const onlineListener = () => onOnline(true);\n const offlineListener = () => onOnline(false);\n window.addEventListener(\"online\", onlineListener, false);\n window.addEventListener(\"offline\", offlineListener, false);\n return () => {\n window.removeEventListener(\"online\", onlineListener);\n window.removeEventListener(\"offline\", offlineListener);\n };\n }\n return;\n };\n }\n onSubscribe() {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.();\n this.#cleanup = void 0;\n }\n }\n setEventListener(setup) {\n this.#setup = setup;\n this.#cleanup?.();\n this.#cleanup = setup(this.setOnline.bind(this));\n }\n setOnline(online) {\n const changed = this.#online !== online;\n if (changed) {\n this.#online = online;\n this.listeners.forEach((listener) => {\n listener(online);\n });\n }\n }\n isOnline() {\n return this.#online;\n }\n};\nvar onlineManager = new OnlineManager();\nexport {\n OnlineManager,\n onlineManager\n};\n//# sourceMappingURL=onlineManager.js.map","// src/retryer.ts\nimport { focusManager } from \"./focusManager.js\";\nimport { onlineManager } from \"./onlineManager.js\";\nimport { pendingThenable } from \"./thenable.js\";\nimport { isServer, sleep } from \"./utils.js\";\nfunction defaultRetryDelay(failureCount) {\n return Math.min(1e3 * 2 ** failureCount, 3e4);\n}\nfunction canFetch(networkMode) {\n return (networkMode ?? \"online\") === \"online\" ? onlineManager.isOnline() : true;\n}\nvar CancelledError = class extends Error {\n constructor(options) {\n super(\"CancelledError\");\n this.revert = options?.revert;\n this.silent = options?.silent;\n }\n};\nfunction isCancelledError(value) {\n return value instanceof CancelledError;\n}\nfunction createRetryer(config) {\n let isRetryCancelled = false;\n let failureCount = 0;\n let continueFn;\n const thenable = pendingThenable();\n const isResolved = () => thenable.status !== \"pending\";\n const cancel = (cancelOptions) => {\n if (!isResolved()) {\n const error = new CancelledError(cancelOptions);\n reject(error);\n config.onCancel?.(error);\n }\n };\n const cancelRetry = () => {\n isRetryCancelled = true;\n };\n const continueRetry = () => {\n isRetryCancelled = false;\n };\n const canContinue = () => focusManager.isFocused() && (config.networkMode === \"always\" || onlineManager.isOnline()) && config.canRun();\n const canStart = () => canFetch(config.networkMode) && config.canRun();\n const resolve = (value) => {\n if (!isResolved()) {\n continueFn?.();\n thenable.resolve(value);\n }\n };\n const reject = (value) => {\n if (!isResolved()) {\n continueFn?.();\n thenable.reject(value);\n }\n };\n const pause = () => {\n return new Promise((continueResolve) => {\n continueFn = (value) => {\n if (isResolved() || canContinue()) {\n continueResolve(value);\n }\n };\n config.onPause?.();\n }).then(() => {\n continueFn = void 0;\n if (!isResolved()) {\n config.onContinue?.();\n }\n });\n };\n const run = () => {\n if (isResolved()) {\n return;\n }\n let promiseOrValue;\n const initialPromise = failureCount === 0 ? config.initialPromise : void 0;\n try {\n promiseOrValue = initialPromise ?? config.fn();\n } catch (error) {\n promiseOrValue = Promise.reject(error);\n }\n Promise.resolve(promiseOrValue).then(resolve).catch((error) => {\n if (isResolved()) {\n return;\n }\n const retry = config.retry ?? (isServer ? 0 : 3);\n const retryDelay = config.retryDelay ?? defaultRetryDelay;\n const delay = typeof retryDelay === \"function\" ? retryDelay(failureCount, error) : retryDelay;\n const shouldRetry = retry === true || typeof retry === \"number\" && failureCount < retry || typeof retry === \"function\" && retry(failureCount, error);\n if (isRetryCancelled || !shouldRetry) {\n reject(error);\n return;\n }\n failureCount++;\n config.onFail?.(failureCount, error);\n sleep(delay).then(() => {\n return canContinue() ? void 0 : pause();\n }).then(() => {\n if (isRetryCancelled) {\n reject(error);\n } else {\n run();\n }\n });\n });\n };\n return {\n promise: thenable,\n status: () => thenable.status,\n cancel,\n continue: () => {\n continueFn?.();\n return thenable;\n },\n cancelRetry,\n continueRetry,\n canStart,\n start: () => {\n if (canStart()) {\n run();\n } else {\n pause().then(run);\n }\n return thenable;\n }\n };\n}\nexport {\n CancelledError,\n canFetch,\n createRetryer,\n isCancelledError\n};\n//# sourceMappingURL=retryer.js.map","// src/removable.ts\nimport { timeoutManager } from \"./timeoutManager.js\";\nimport { isServer, isValidTimeout } from \"./utils.js\";\nvar Removable = class {\n #gcTimeout;\n destroy() {\n this.clearGcTimeout();\n }\n scheduleGc() {\n this.clearGcTimeout();\n if (isValidTimeout(this.gcTime)) {\n this.#gcTimeout = timeoutManager.setTimeout(() => {\n this.optionalRemove();\n }, this.gcTime);\n }\n }\n updateGcTime(newGcTime) {\n this.gcTime = Math.max(\n this.gcTime || 0,\n newGcTime ?? (isServer ? Infinity : 5 * 60 * 1e3)\n );\n }\n clearGcTimeout() {\n if (this.#gcTimeout) {\n timeoutManager.clearTimeout(this.#gcTimeout);\n this.#gcTimeout = void 0;\n }\n }\n};\nexport {\n Removable\n};\n//# sourceMappingURL=removable.js.map","// src/query.ts\nimport {\n ensureQueryFn,\n noop,\n replaceData,\n resolveEnabled,\n resolveStaleTime,\n skipToken,\n timeUntilStale\n} from \"./utils.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { CancelledError, canFetch, createRetryer } from \"./retryer.js\";\nimport { Removable } from \"./removable.js\";\nvar Query = class extends Removable {\n #initialState;\n #revertState;\n #cache;\n #client;\n #retryer;\n #defaultOptions;\n #abortSignalConsumed;\n constructor(config) {\n super();\n this.#abortSignalConsumed = false;\n this.#defaultOptions = config.defaultOptions;\n this.setOptions(config.options);\n this.observers = [];\n this.#client = config.client;\n this.#cache = this.#client.getQueryCache();\n this.queryKey = config.queryKey;\n this.queryHash = config.queryHash;\n this.#initialState = getDefaultState(this.options);\n this.state = config.state ?? this.#initialState;\n this.scheduleGc();\n }\n get meta() {\n return this.options.meta;\n }\n get promise() {\n return this.#retryer?.promise;\n }\n setOptions(options) {\n this.options = { ...this.#defaultOptions, ...options };\n this.updateGcTime(this.options.gcTime);\n if (this.state && this.state.data === void 0) {\n const defaultState = getDefaultState(this.options);\n if (defaultState.data !== void 0) {\n this.setState(\n successState(defaultState.data, defaultState.dataUpdatedAt)\n );\n this.#initialState = defaultState;\n }\n }\n }\n optionalRemove() {\n if (!this.observers.length && this.state.fetchStatus === \"idle\") {\n this.#cache.remove(this);\n }\n }\n setData(newData, options) {\n const data = replaceData(this.state.data, newData, this.options);\n this.#dispatch({\n data,\n type: \"success\",\n dataUpdatedAt: options?.updatedAt,\n manual: options?.manual\n });\n return data;\n }\n setState(state, setStateOptions) {\n this.#dispatch({ type: \"setState\", state, setStateOptions });\n }\n cancel(options) {\n const promise = this.#retryer?.promise;\n this.#retryer?.cancel(options);\n return promise ? promise.then(noop).catch(noop) : Promise.resolve();\n }\n destroy() {\n super.destroy();\n this.cancel({ silent: true });\n }\n reset() {\n this.destroy();\n this.setState(this.#initialState);\n }\n isActive() {\n return this.observers.some(\n (observer) => resolveEnabled(observer.options.enabled, this) !== false\n );\n }\n isDisabled() {\n if (this.getObserversCount() > 0) {\n return !this.isActive();\n }\n return this.options.queryFn === skipToken || this.state.dataUpdateCount + this.state.errorUpdateCount === 0;\n }\n isStatic() {\n if (this.getObserversCount() > 0) {\n return this.observers.some(\n (observer) => resolveStaleTime(observer.options.staleTime, this) === \"static\"\n );\n }\n return false;\n }\n isStale() {\n if (this.getObserversCount() > 0) {\n return this.observers.some(\n (observer) => observer.getCurrentResult().isStale\n );\n }\n return this.state.data === void 0 || this.state.isInvalidated;\n }\n isStaleByTime(staleTime = 0) {\n if (this.state.data === void 0) {\n return true;\n }\n if (staleTime === \"static\") {\n return false;\n }\n if (this.state.isInvalidated) {\n return true;\n }\n return !timeUntilStale(this.state.dataUpdatedAt, staleTime);\n }\n onFocus() {\n const observer = this.observers.find((x) => x.shouldFetchOnWindowFocus());\n observer?.refetch({ cancelRefetch: false });\n this.#retryer?.continue();\n }\n onOnline() {\n const observer = this.observers.find((x) => x.shouldFetchOnReconnect());\n observer?.refetch({ cancelRefetch: false });\n this.#retryer?.continue();\n }\n addObserver(observer) {\n if (!this.observers.includes(observer)) {\n this.observers.push(observer);\n this.clearGcTimeout();\n this.#cache.notify({ type: \"observerAdded\", query: this, observer });\n }\n }\n removeObserver(observer) {\n if (this.observers.includes(observer)) {\n this.observers = this.observers.filter((x) => x !== observer);\n if (!this.observers.length) {\n if (this.#retryer) {\n if (this.#abortSignalConsumed) {\n this.#retryer.cancel({ revert: true });\n } else {\n this.#retryer.cancelRetry();\n }\n }\n this.scheduleGc();\n }\n this.#cache.notify({ type: \"observerRemoved\", query: this, observer });\n }\n }\n getObserversCount() {\n return this.observers.length;\n }\n invalidate() {\n if (!this.state.isInvalidated) {\n this.#dispatch({ type: \"invalidate\" });\n }\n }\n async fetch(options, fetchOptions) {\n if (this.state.fetchStatus !== \"idle\" && // If the promise in the retyer is already rejected, we have to definitely\n // re-start the fetch; there is a chance that the query is still in a\n // pending state when that happens\n this.#retryer?.status() !== \"rejected\") {\n if (this.state.data !== void 0 && fetchOptions?.cancelRefetch) {\n this.cancel({ silent: true });\n } else if (this.#retryer) {\n this.#retryer.continueRetry();\n return this.#retryer.promise;\n }\n }\n if (options) {\n this.setOptions(options);\n }\n if (!this.options.queryFn) {\n const observer = this.observers.find((x) => x.options.queryFn);\n if (observer) {\n this.setOptions(observer.options);\n }\n }\n if (process.env.NODE_ENV !== \"production\") {\n if (!Array.isArray(this.options.queryKey)) {\n console.error(\n `As of v4, queryKey needs to be an Array. If you are using a string like 'repoData', please change it to an Array, e.g. ['repoData']`\n );\n }\n }\n const abortController = new AbortController();\n const addSignalProperty = (object) => {\n Object.defineProperty(object, \"signal\", {\n enumerable: true,\n get: () => {\n this.#abortSignalConsumed = true;\n return abortController.signal;\n }\n });\n };\n const fetchFn = () => {\n const queryFn = ensureQueryFn(this.options, fetchOptions);\n const createQueryFnContext = () => {\n const queryFnContext2 = {\n client: this.#client,\n queryKey: this.queryKey,\n meta: this.meta\n };\n addSignalProperty(queryFnContext2);\n return queryFnContext2;\n };\n const queryFnContext = createQueryFnContext();\n this.#abortSignalConsumed = false;\n if (this.options.persister) {\n return this.options.persister(\n queryFn,\n queryFnContext,\n this\n );\n }\n return queryFn(queryFnContext);\n };\n const createFetchContext = () => {\n const context2 = {\n fetchOptions,\n options: this.options,\n queryKey: this.queryKey,\n client: this.#client,\n state: this.state,\n fetchFn\n };\n addSignalProperty(context2);\n return context2;\n };\n const context = createFetchContext();\n this.options.behavior?.onFetch(context, this);\n this.#revertState = this.state;\n if (this.state.fetchStatus === \"idle\" || this.state.fetchMeta !== context.fetchOptions?.meta) {\n this.#dispatch({ type: \"fetch\", meta: context.fetchOptions?.meta });\n }\n this.#retryer = createRetryer({\n initialPromise: fetchOptions?.initialPromise,\n fn: context.fetchFn,\n onCancel: (error) => {\n if (error instanceof CancelledError && error.revert) {\n this.setState({\n ...this.#revertState,\n fetchStatus: \"idle\"\n });\n }\n abortController.abort();\n },\n onFail: (failureCount, error) => {\n this.#dispatch({ type: \"failed\", failureCount, error });\n },\n onPause: () => {\n this.#dispatch({ type: \"pause\" });\n },\n onContinue: () => {\n this.#dispatch({ type: \"continue\" });\n },\n retry: context.options.retry,\n retryDelay: context.options.retryDelay,\n networkMode: context.options.networkMode,\n canRun: () => true\n });\n try {\n const data = await this.#retryer.start();\n if (data === void 0) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(\n `Query data cannot be undefined. Please make sure to return a value other than undefined from your query function. Affected query key: ${this.queryHash}`\n );\n }\n throw new Error(`${this.queryHash} data is undefined`);\n }\n this.setData(data);\n this.#cache.config.onSuccess?.(data, this);\n this.#cache.config.onSettled?.(\n data,\n this.state.error,\n this\n );\n return data;\n } catch (error) {\n if (error instanceof CancelledError) {\n if (error.silent) {\n return this.#retryer.promise;\n } else if (error.revert) {\n if (this.state.data === void 0) {\n throw error;\n }\n return this.state.data;\n }\n }\n this.#dispatch({\n type: \"error\",\n error\n });\n this.#cache.config.onError?.(\n error,\n this\n );\n this.#cache.config.onSettled?.(\n this.state.data,\n error,\n this\n );\n throw error;\n } finally {\n this.scheduleGc();\n }\n }\n #dispatch(action) {\n const reducer = (state) => {\n switch (action.type) {\n case \"failed\":\n return {\n ...state,\n fetchFailureCount: action.failureCount,\n fetchFailureReason: action.error\n };\n case \"pause\":\n return {\n ...state,\n fetchStatus: \"paused\"\n };\n case \"continue\":\n return {\n ...state,\n fetchStatus: \"fetching\"\n };\n case \"fetch\":\n return {\n ...state,\n ...fetchState(state.data, this.options),\n fetchMeta: action.meta ?? null\n };\n case \"success\":\n const newState = {\n ...state,\n ...successState(action.data, action.dataUpdatedAt),\n dataUpdateCount: state.dataUpdateCount + 1,\n ...!action.manual && {\n fetchStatus: \"idle\",\n fetchFailureCount: 0,\n fetchFailureReason: null\n }\n };\n this.#revertState = action.manual ? newState : void 0;\n return newState;\n case \"error\":\n const error = action.error;\n return {\n ...state,\n error,\n errorUpdateCount: state.errorUpdateCount + 1,\n errorUpdatedAt: Date.now(),\n fetchFailureCount: state.fetchFailureCount + 1,\n fetchFailureReason: error,\n fetchStatus: \"idle\",\n status: \"error\",\n // flag existing data as invalidated if we get a background error\n // note that \"no data\" always means stale so we can set unconditionally here\n isInvalidated: true\n };\n case \"invalidate\":\n return {\n ...state,\n isInvalidated: true\n };\n case \"setState\":\n return {\n ...state,\n ...action.state\n };\n }\n };\n this.state = reducer(this.state);\n notifyManager.batch(() => {\n this.observers.forEach((observer) => {\n observer.onQueryUpdate();\n });\n this.#cache.notify({ query: this, type: \"updated\", action });\n });\n }\n};\nfunction fetchState(data, options) {\n return {\n fetchFailureCount: 0,\n fetchFailureReason: null,\n fetchStatus: canFetch(options.networkMode) ? \"fetching\" : \"paused\",\n ...data === void 0 && {\n error: null,\n status: \"pending\"\n }\n };\n}\nfunction successState(data, dataUpdatedAt) {\n return {\n data,\n dataUpdatedAt: dataUpdatedAt ?? Date.now(),\n error: null,\n isInvalidated: false,\n status: \"success\"\n };\n}\nfunction getDefaultState(options) {\n const data = typeof options.initialData === \"function\" ? options.initialData() : options.initialData;\n const hasData = data !== void 0;\n const initialDataUpdatedAt = hasData ? typeof options.initialDataUpdatedAt === \"function\" ? options.initialDataUpdatedAt() : options.initialDataUpdatedAt : 0;\n return {\n data,\n dataUpdateCount: 0,\n dataUpdatedAt: hasData ? initialDataUpdatedAt ?? Date.now() : 0,\n error: null,\n errorUpdateCount: 0,\n errorUpdatedAt: 0,\n fetchFailureCount: 0,\n fetchFailureReason: null,\n fetchMeta: null,\n isInvalidated: false,\n status: hasData ? \"success\" : \"pending\",\n fetchStatus: \"idle\"\n };\n}\nexport {\n Query,\n fetchState\n};\n//# sourceMappingURL=query.js.map","// src/queryObserver.ts\nimport { focusManager } from \"./focusManager.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { fetchState } from \"./query.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { pendingThenable } from \"./thenable.js\";\nimport {\n isServer,\n isValidTimeout,\n noop,\n replaceData,\n resolveEnabled,\n resolveStaleTime,\n shallowEqualObjects,\n timeUntilStale\n} from \"./utils.js\";\nimport { timeoutManager } from \"./timeoutManager.js\";\nvar QueryObserver = class extends Subscribable {\n constructor(client, options) {\n super();\n this.options = options;\n this.#client = client;\n this.#selectError = null;\n this.#currentThenable = pendingThenable();\n this.bindMethods();\n this.setOptions(options);\n }\n #client;\n #currentQuery = void 0;\n #currentQueryInitialState = void 0;\n #currentResult = void 0;\n #currentResultState;\n #currentResultOptions;\n #currentThenable;\n #selectError;\n #selectFn;\n #selectResult;\n // This property keeps track of the last query with defined data.\n // It will be used to pass the previous data and query to the placeholder function between renders.\n #lastQueryWithDefinedData;\n #staleTimeoutId;\n #refetchIntervalId;\n #currentRefetchInterval;\n #trackedProps = /* @__PURE__ */ new Set();\n bindMethods() {\n this.refetch = this.refetch.bind(this);\n }\n onSubscribe() {\n if (this.listeners.size === 1) {\n this.#currentQuery.addObserver(this);\n if (shouldFetchOnMount(this.#currentQuery, this.options)) {\n this.#executeFetch();\n } else {\n this.updateResult();\n }\n this.#updateTimers();\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.destroy();\n }\n }\n shouldFetchOnReconnect() {\n return shouldFetchOn(\n this.#currentQuery,\n this.options,\n this.options.refetchOnReconnect\n );\n }\n shouldFetchOnWindowFocus() {\n return shouldFetchOn(\n this.#currentQuery,\n this.options,\n this.options.refetchOnWindowFocus\n );\n }\n destroy() {\n this.listeners = /* @__PURE__ */ new Set();\n this.#clearStaleTimeout();\n this.#clearRefetchInterval();\n this.#currentQuery.removeObserver(this);\n }\n setOptions(options) {\n const prevOptions = this.options;\n const prevQuery = this.#currentQuery;\n this.options = this.#client.defaultQueryOptions(options);\n if (this.options.enabled !== void 0 && typeof this.options.enabled !== \"boolean\" && typeof this.options.enabled !== \"function\" && typeof resolveEnabled(this.options.enabled, this.#currentQuery) !== \"boolean\") {\n throw new Error(\n \"Expected enabled to be a boolean or a callback that returns a boolean\"\n );\n }\n this.#updateQuery();\n this.#currentQuery.setOptions(this.options);\n if (prevOptions._defaulted && !shallowEqualObjects(this.options, prevOptions)) {\n this.#client.getQueryCache().notify({\n type: \"observerOptionsUpdated\",\n query: this.#currentQuery,\n observer: this\n });\n }\n const mounted = this.hasListeners();\n if (mounted && shouldFetchOptionally(\n this.#currentQuery,\n prevQuery,\n this.options,\n prevOptions\n )) {\n this.#executeFetch();\n }\n this.updateResult();\n if (mounted && (this.#currentQuery !== prevQuery || resolveEnabled(this.options.enabled, this.#currentQuery) !== resolveEnabled(prevOptions.enabled, this.#currentQuery) || resolveStaleTime(this.options.staleTime, this.#currentQuery) !== resolveStaleTime(prevOptions.staleTime, this.#currentQuery))) {\n this.#updateStaleTimeout();\n }\n const nextRefetchInterval = this.#computeRefetchInterval();\n if (mounted && (this.#currentQuery !== prevQuery || resolveEnabled(this.options.enabled, this.#currentQuery) !== resolveEnabled(prevOptions.enabled, this.#currentQuery) || nextRefetchInterval !== this.#currentRefetchInterval)) {\n this.#updateRefetchInterval(nextRefetchInterval);\n }\n }\n getOptimisticResult(options) {\n const query = this.#client.getQueryCache().build(this.#client, options);\n const result = this.createResult(query, options);\n if (shouldAssignObserverCurrentProperties(this, result)) {\n this.#currentResult = result;\n this.#currentResultOptions = this.options;\n this.#currentResultState = this.#currentQuery.state;\n }\n return result;\n }\n getCurrentResult() {\n return this.#currentResult;\n }\n trackResult(result, onPropTracked) {\n return new Proxy(result, {\n get: (target, key) => {\n this.trackProp(key);\n onPropTracked?.(key);\n if (key === \"promise\") {\n this.trackProp(\"data\");\n if (!this.options.experimental_prefetchInRender && this.#currentThenable.status === \"pending\") {\n this.#currentThenable.reject(\n new Error(\n \"experimental_prefetchInRender feature flag is not enabled\"\n )\n );\n }\n }\n return Reflect.get(target, key);\n }\n });\n }\n trackProp(key) {\n this.#trackedProps.add(key);\n }\n getCurrentQuery() {\n return this.#currentQuery;\n }\n refetch({ ...options } = {}) {\n return this.fetch({\n ...options\n });\n }\n fetchOptimistic(options) {\n const defaultedOptions = this.#client.defaultQueryOptions(options);\n const query = this.#client.getQueryCache().build(this.#client, defaultedOptions);\n return query.fetch().then(() => this.createResult(query, defaultedOptions));\n }\n fetch(fetchOptions) {\n return this.#executeFetch({\n ...fetchOptions,\n cancelRefetch: fetchOptions.cancelRefetch ?? true\n }).then(() => {\n this.updateResult();\n return this.#currentResult;\n });\n }\n #executeFetch(fetchOptions) {\n this.#updateQuery();\n let promise = this.#currentQuery.fetch(\n this.options,\n fetchOptions\n );\n if (!fetchOptions?.throwOnError) {\n promise = promise.catch(noop);\n }\n return promise;\n }\n #updateStaleTimeout() {\n this.#clearStaleTimeout();\n const staleTime = resolveStaleTime(\n this.options.staleTime,\n this.#currentQuery\n );\n if (isServer || this.#currentResult.isStale || !isValidTimeout(staleTime)) {\n return;\n }\n const time = timeUntilStale(this.#currentResult.dataUpdatedAt, staleTime);\n const timeout = time + 1;\n this.#staleTimeoutId = timeoutManager.setTimeout(() => {\n if (!this.#currentResult.isStale) {\n this.updateResult();\n }\n }, timeout);\n }\n #computeRefetchInterval() {\n return (typeof this.options.refetchInterval === \"function\" ? this.options.refetchInterval(this.#currentQuery) : this.options.refetchInterval) ?? false;\n }\n #updateRefetchInterval(nextInterval) {\n this.#clearRefetchInterval();\n this.#currentRefetchInterval = nextInterval;\n if (isServer || resolveEnabled(this.options.enabled, this.#currentQuery) === false || !isValidTimeout(this.#currentRefetchInterval) || this.#currentRefetchInterval === 0) {\n return;\n }\n this.#refetchIntervalId = timeoutManager.setInterval(() => {\n if (this.options.refetchIntervalInBackground || focusManager.isFocused()) {\n this.#executeFetch();\n }\n }, this.#currentRefetchInterval);\n }\n #updateTimers() {\n this.#updateStaleTimeout();\n this.#updateRefetchInterval(this.#computeRefetchInterval());\n }\n #clearStaleTimeout() {\n if (this.#staleTimeoutId) {\n timeoutManager.clearTimeout(this.#staleTimeoutId);\n this.#staleTimeoutId = void 0;\n }\n }\n #clearRefetchInterval() {\n if (this.#refetchIntervalId) {\n timeoutManager.clearInterval(this.#refetchIntervalId);\n this.#refetchIntervalId = void 0;\n }\n }\n createResult(query, options) {\n const prevQuery = this.#currentQuery;\n const prevOptions = this.options;\n const prevResult = this.#currentResult;\n const prevResultState = this.#currentResultState;\n const prevResultOptions = this.#currentResultOptions;\n const queryChange = query !== prevQuery;\n const queryInitialState = queryChange ? query.state : this.#currentQueryInitialState;\n const { state } = query;\n let newState = { ...state };\n let isPlaceholderData = false;\n let data;\n if (options._optimisticResults) {\n const mounted = this.hasListeners();\n const fetchOnMount = !mounted && shouldFetchOnMount(query, options);\n const fetchOptionally = mounted && shouldFetchOptionally(query, prevQuery, options, prevOptions);\n if (fetchOnMount || fetchOptionally) {\n newState = {\n ...newState,\n ...fetchState(state.data, query.options)\n };\n }\n if (options._optimisticResults === \"isRestoring\") {\n newState.fetchStatus = \"idle\";\n }\n }\n let { error, errorUpdatedAt, status } = newState;\n data = newState.data;\n let skipSelect = false;\n if (options.placeholderData !== void 0 && data === void 0 && status === \"pending\") {\n let placeholderData;\n if (prevResult?.isPlaceholderData && options.placeholderData === prevResultOptions?.placeholderData) {\n placeholderData = prevResult.data;\n skipSelect = true;\n } else {\n placeholderData = typeof options.placeholderData === \"function\" ? options.placeholderData(\n this.#lastQueryWithDefinedData?.state.data,\n this.#lastQueryWithDefinedData\n ) : options.placeholderData;\n }\n if (placeholderData !== void 0) {\n status = \"success\";\n data = replaceData(\n prevResult?.data,\n placeholderData,\n options\n );\n isPlaceholderData = true;\n }\n }\n if (options.select && data !== void 0 && !skipSelect) {\n if (prevResult && data === prevResultState?.data && options.select === this.#selectFn) {\n data = this.#selectResult;\n } else {\n try {\n this.#selectFn = options.select;\n data = options.select(data);\n data = replaceData(prevResult?.data, data, options);\n this.#selectResult = data;\n this.#selectError = null;\n } catch (selectError) {\n this.#selectError = selectError;\n }\n }\n }\n if (this.#selectError) {\n error = this.#selectError;\n data = this.#selectResult;\n errorUpdatedAt = Date.now();\n status = \"error\";\n }\n const isFetching = newState.fetchStatus === \"fetching\";\n const isPending = status === \"pending\";\n const isError = status === \"error\";\n const isLoading = isPending && isFetching;\n const hasData = data !== void 0;\n const result = {\n status,\n fetchStatus: newState.fetchStatus,\n isPending,\n isSuccess: status === \"success\",\n isError,\n isInitialLoading: isLoading,\n isLoading,\n data,\n dataUpdatedAt: newState.dataUpdatedAt,\n error,\n errorUpdatedAt,\n failureCount: newState.fetchFailureCount,\n failureReason: newState.fetchFailureReason,\n errorUpdateCount: newState.errorUpdateCount,\n isFetched: newState.dataUpdateCount > 0 || newState.errorUpdateCount > 0,\n isFetchedAfterMount: newState.dataUpdateCount > queryInitialState.dataUpdateCount || newState.errorUpdateCount > queryInitialState.errorUpdateCount,\n isFetching,\n isRefetching: isFetching && !isPending,\n isLoadingError: isError && !hasData,\n isPaused: newState.fetchStatus === \"paused\",\n isPlaceholderData,\n isRefetchError: isError && hasData,\n isStale: isStale(query, options),\n refetch: this.refetch,\n promise: this.#currentThenable,\n isEnabled: resolveEnabled(options.enabled, query) !== false\n };\n const nextResult = result;\n if (this.options.experimental_prefetchInRender) {\n const finalizeThenableIfPossible = (thenable) => {\n if (nextResult.status === \"error\") {\n thenable.reject(nextResult.error);\n } else if (nextResult.data !== void 0) {\n thenable.resolve(nextResult.data);\n }\n };\n const recreateThenable = () => {\n const pending = this.#currentThenable = nextResult.promise = pendingThenable();\n finalizeThenableIfPossible(pending);\n };\n const prevThenable = this.#currentThenable;\n switch (prevThenable.status) {\n case \"pending\":\n if (query.queryHash === prevQuery.queryHash) {\n finalizeThenableIfPossible(prevThenable);\n }\n break;\n case \"fulfilled\":\n if (nextResult.status === \"error\" || nextResult.data !== prevThenable.value) {\n recreateThenable();\n }\n break;\n case \"rejected\":\n if (nextResult.status !== \"error\" || nextResult.error !== prevThenable.reason) {\n recreateThenable();\n }\n break;\n }\n }\n return nextResult;\n }\n updateResult() {\n const prevResult = this.#currentResult;\n const nextResult = this.createResult(this.#currentQuery, this.options);\n this.#currentResultState = this.#currentQuery.state;\n this.#currentResultOptions = this.options;\n if (this.#currentResultState.data !== void 0) {\n this.#lastQueryWithDefinedData = this.#currentQuery;\n }\n if (shallowEqualObjects(nextResult, prevResult)) {\n return;\n }\n this.#currentResult = nextResult;\n const shouldNotifyListeners = () => {\n if (!prevResult) {\n return true;\n }\n const { notifyOnChangeProps } = this.options;\n const notifyOnChangePropsValue = typeof notifyOnChangeProps === \"function\" ? notifyOnChangeProps() : notifyOnChangeProps;\n if (notifyOnChangePropsValue === \"all\" || !notifyOnChangePropsValue && !this.#trackedProps.size) {\n return true;\n }\n const includedProps = new Set(\n notifyOnChangePropsValue ?? this.#trackedProps\n );\n if (this.options.throwOnError) {\n includedProps.add(\"error\");\n }\n return Object.keys(this.#currentResult).some((key) => {\n const typedKey = key;\n const changed = this.#currentResult[typedKey] !== prevResult[typedKey];\n return changed && includedProps.has(typedKey);\n });\n };\n this.#notify({ listeners: shouldNotifyListeners() });\n }\n #updateQuery() {\n const query = this.#client.getQueryCache().build(this.#client, this.options);\n if (query === this.#currentQuery) {\n return;\n }\n const prevQuery = this.#currentQuery;\n this.#currentQuery = query;\n this.#currentQueryInitialState = query.state;\n if (this.hasListeners()) {\n prevQuery?.removeObserver(this);\n query.addObserver(this);\n }\n }\n onQueryUpdate() {\n this.updateResult();\n if (this.hasListeners()) {\n this.#updateTimers();\n }\n }\n #notify(notifyOptions) {\n notifyManager.batch(() => {\n if (notifyOptions.listeners) {\n this.listeners.forEach((listener) => {\n listener(this.#currentResult);\n });\n }\n this.#client.getQueryCache().notify({\n query: this.#currentQuery,\n type: \"observerResultsUpdated\"\n });\n });\n }\n};\nfunction shouldLoadOnMount(query, options) {\n return resolveEnabled(options.enabled, query) !== false && query.state.data === void 0 && !(query.state.status === \"error\" && options.retryOnMount === false);\n}\nfunction shouldFetchOnMount(query, options) {\n return shouldLoadOnMount(query, options) || query.state.data !== void 0 && shouldFetchOn(query, options, options.refetchOnMount);\n}\nfunction shouldFetchOn(query, options, field) {\n if (resolveEnabled(options.enabled, query) !== false && resolveStaleTime(options.staleTime, query) !== \"static\") {\n const value = typeof field === \"function\" ? field(query) : field;\n return value === \"always\" || value !== false && isStale(query, options);\n }\n return false;\n}\nfunction shouldFetchOptionally(query, prevQuery, options, prevOptions) {\n return (query !== prevQuery || resolveEnabled(prevOptions.enabled, query) === false) && (!options.suspense || query.state.status !== \"error\") && isStale(query, options);\n}\nfunction isStale(query, options) {\n return resolveEnabled(options.enabled, query) !== false && query.isStaleByTime(resolveStaleTime(options.staleTime, query));\n}\nfunction shouldAssignObserverCurrentProperties(observer, optimisticResult) {\n if (!shallowEqualObjects(observer.getCurrentResult(), optimisticResult)) {\n return true;\n }\n return false;\n}\nexport {\n QueryObserver\n};\n//# sourceMappingURL=queryObserver.js.map","// src/infiniteQueryBehavior.ts\nimport {\n addConsumeAwareSignal,\n addToEnd,\n addToStart,\n ensureQueryFn\n} from \"./utils.js\";\nfunction infiniteQueryBehavior(pages) {\n return {\n onFetch: (context, query) => {\n const options = context.options;\n const direction = context.fetchOptions?.meta?.fetchMore?.direction;\n const oldPages = context.state.data?.pages || [];\n const oldPageParams = context.state.data?.pageParams || [];\n let result = { pages: [], pageParams: [] };\n let currentPage = 0;\n const fetchFn = async () => {\n let cancelled = false;\n const addSignalProperty = (object) => {\n addConsumeAwareSignal(\n object,\n () => context.signal,\n () => cancelled = true\n );\n };\n const queryFn = ensureQueryFn(context.options, context.fetchOptions);\n const fetchPage = async (data, param, previous) => {\n if (cancelled) {\n return Promise.reject();\n }\n if (param == null && data.pages.length) {\n return Promise.resolve(data);\n }\n const createQueryFnContext = () => {\n const queryFnContext2 = {\n client: context.client,\n queryKey: context.queryKey,\n pageParam: param,\n direction: previous ? \"backward\" : \"forward\",\n meta: context.options.meta\n };\n addSignalProperty(queryFnContext2);\n return queryFnContext2;\n };\n const queryFnContext = createQueryFnContext();\n const page = await queryFn(queryFnContext);\n const { maxPages } = context.options;\n const addTo = previous ? addToStart : addToEnd;\n return {\n pages: addTo(data.pages, page, maxPages),\n pageParams: addTo(data.pageParams, param, maxPages)\n };\n };\n if (direction && oldPages.length) {\n const previous = direction === \"backward\";\n const pageParamFn = previous ? getPreviousPageParam : getNextPageParam;\n const oldData = {\n pages: oldPages,\n pageParams: oldPageParams\n };\n const param = pageParamFn(options, oldData);\n result = await fetchPage(oldData, param, previous);\n } else {\n const remainingPages = pages ?? oldPages.length;\n do {\n const param = currentPage === 0 ? oldPageParams[0] ?? options.initialPageParam : getNextPageParam(options, result);\n if (currentPage > 0 && param == null) {\n break;\n }\n result = await fetchPage(result, param);\n currentPage++;\n } while (currentPage < remainingPages);\n }\n return result;\n };\n if (context.options.persister) {\n context.fetchFn = () => {\n return context.options.persister?.(\n fetchFn,\n {\n client: context.client,\n queryKey: context.queryKey,\n meta: context.options.meta,\n signal: context.signal\n },\n query\n );\n };\n } else {\n context.fetchFn = fetchFn;\n }\n }\n };\n}\nfunction getNextPageParam(options, { pages, pageParams }) {\n const lastIndex = pages.length - 1;\n return pages.length > 0 ? options.getNextPageParam(\n pages[lastIndex],\n pages,\n pageParams[lastIndex],\n pageParams\n ) : void 0;\n}\nfunction getPreviousPageParam(options, { pages, pageParams }) {\n return pages.length > 0 ? options.getPreviousPageParam?.(pages[0], pages, pageParams[0], pageParams) : void 0;\n}\nfunction hasNextPage(options, data) {\n if (!data) return false;\n return getNextPageParam(options, data) != null;\n}\nfunction hasPreviousPage(options, data) {\n if (!data || !options.getPreviousPageParam) return false;\n return getPreviousPageParam(options, data) != null;\n}\nexport {\n hasNextPage,\n hasPreviousPage,\n infiniteQueryBehavior\n};\n//# sourceMappingURL=infiniteQueryBehavior.js.map","// src/mutation.ts\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Removable } from \"./removable.js\";\nimport { createRetryer } from \"./retryer.js\";\nvar Mutation = class extends Removable {\n #client;\n #observers;\n #mutationCache;\n #retryer;\n constructor(config) {\n super();\n this.#client = config.client;\n this.mutationId = config.mutationId;\n this.#mutationCache = config.mutationCache;\n this.#observers = [];\n this.state = config.state || getDefaultState();\n this.setOptions(config.options);\n this.scheduleGc();\n }\n setOptions(options) {\n this.options = options;\n this.updateGcTime(this.options.gcTime);\n }\n get meta() {\n return this.options.meta;\n }\n addObserver(observer) {\n if (!this.#observers.includes(observer)) {\n this.#observers.push(observer);\n this.clearGcTimeout();\n this.#mutationCache.notify({\n type: \"observerAdded\",\n mutation: this,\n observer\n });\n }\n }\n removeObserver(observer) {\n this.#observers = this.#observers.filter((x) => x !== observer);\n this.scheduleGc();\n this.#mutationCache.notify({\n type: \"observerRemoved\",\n mutation: this,\n observer\n });\n }\n optionalRemove() {\n if (!this.#observers.length) {\n if (this.state.status === \"pending\") {\n this.scheduleGc();\n } else {\n this.#mutationCache.remove(this);\n }\n }\n }\n continue() {\n return this.#retryer?.continue() ?? // continuing a mutation assumes that variables are set, mutation must have been dehydrated before\n this.execute(this.state.variables);\n }\n async execute(variables) {\n const onContinue = () => {\n this.#dispatch({ type: \"continue\" });\n };\n const mutationFnContext = {\n client: this.#client,\n meta: this.options.meta,\n mutationKey: this.options.mutationKey\n };\n this.#retryer = createRetryer({\n fn: () => {\n if (!this.options.mutationFn) {\n return Promise.reject(new Error(\"No mutationFn found\"));\n }\n return this.options.mutationFn(variables, mutationFnContext);\n },\n onFail: (failureCount, error) => {\n this.#dispatch({ type: \"failed\", failureCount, error });\n },\n onPause: () => {\n this.#dispatch({ type: \"pause\" });\n },\n onContinue,\n retry: this.options.retry ?? 0,\n retryDelay: this.options.retryDelay,\n networkMode: this.options.networkMode,\n canRun: () => this.#mutationCache.canRun(this)\n });\n const restored = this.state.status === \"pending\";\n const isPaused = !this.#retryer.canStart();\n try {\n if (restored) {\n onContinue();\n } else {\n this.#dispatch({ type: \"pending\", variables, isPaused });\n await this.#mutationCache.config.onMutate?.(\n variables,\n this,\n mutationFnContext\n );\n const context = await this.options.onMutate?.(\n variables,\n mutationFnContext\n );\n if (context !== this.state.context) {\n this.#dispatch({\n type: \"pending\",\n context,\n variables,\n isPaused\n });\n }\n }\n const data = await this.#retryer.start();\n await this.#mutationCache.config.onSuccess?.(\n data,\n variables,\n this.state.context,\n this,\n mutationFnContext\n );\n await this.options.onSuccess?.(\n data,\n variables,\n this.state.context,\n mutationFnContext\n );\n await this.#mutationCache.config.onSettled?.(\n data,\n null,\n this.state.variables,\n this.state.context,\n this,\n mutationFnContext\n );\n await this.options.onSettled?.(\n data,\n null,\n variables,\n this.state.context,\n mutationFnContext\n );\n this.#dispatch({ type: \"success\", data });\n return data;\n } catch (error) {\n try {\n await this.#mutationCache.config.onError?.(\n error,\n variables,\n this.state.context,\n this,\n mutationFnContext\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n await this.options.onError?.(\n error,\n variables,\n this.state.context,\n mutationFnContext\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n await this.#mutationCache.config.onSettled?.(\n void 0,\n error,\n this.state.variables,\n this.state.context,\n this,\n mutationFnContext\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n await this.options.onSettled?.(\n void 0,\n error,\n variables,\n this.state.context,\n mutationFnContext\n );\n } catch (e) {\n void Promise.reject(e);\n }\n this.#dispatch({ type: \"error\", error });\n throw error;\n } finally {\n this.#mutationCache.runNext(this);\n }\n }\n #dispatch(action) {\n const reducer = (state) => {\n switch (action.type) {\n case \"failed\":\n return {\n ...state,\n failureCount: action.failureCount,\n failureReason: action.error\n };\n case \"pause\":\n return {\n ...state,\n isPaused: true\n };\n case \"continue\":\n return {\n ...state,\n isPaused: false\n };\n case \"pending\":\n return {\n ...state,\n context: action.context,\n data: void 0,\n failureCount: 0,\n failureReason: null,\n error: null,\n isPaused: action.isPaused,\n status: \"pending\",\n variables: action.variables,\n submittedAt: Date.now()\n };\n case \"success\":\n return {\n ...state,\n data: action.data,\n failureCount: 0,\n failureReason: null,\n error: null,\n status: \"success\",\n isPaused: false\n };\n case \"error\":\n return {\n ...state,\n data: void 0,\n error: action.error,\n failureCount: state.failureCount + 1,\n failureReason: action.error,\n isPaused: false,\n status: \"error\"\n };\n }\n };\n this.state = reducer(this.state);\n notifyManager.batch(() => {\n this.#observers.forEach((observer) => {\n observer.onMutationUpdate(action);\n });\n this.#mutationCache.notify({\n mutation: this,\n type: \"updated\",\n action\n });\n });\n }\n};\nfunction getDefaultState() {\n return {\n context: void 0,\n data: void 0,\n error: null,\n failureCount: 0,\n failureReason: null,\n isPaused: false,\n status: \"idle\",\n variables: void 0,\n submittedAt: 0\n };\n}\nexport {\n Mutation,\n getDefaultState\n};\n//# sourceMappingURL=mutation.js.map","// src/mutationCache.ts\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Mutation } from \"./mutation.js\";\nimport { matchMutation, noop } from \"./utils.js\";\nimport { Subscribable } from \"./subscribable.js\";\nvar MutationCache = class extends Subscribable {\n constructor(config = {}) {\n super();\n this.config = config;\n this.#mutations = /* @__PURE__ */ new Set();\n this.#scopes = /* @__PURE__ */ new Map();\n this.#mutationId = 0;\n }\n #mutations;\n #scopes;\n #mutationId;\n build(client, options, state) {\n const mutation = new Mutation({\n client,\n mutationCache: this,\n mutationId: ++this.#mutationId,\n options: client.defaultMutationOptions(options),\n state\n });\n this.add(mutation);\n return mutation;\n }\n add(mutation) {\n this.#mutations.add(mutation);\n const scope = scopeFor(mutation);\n if (typeof scope === \"string\") {\n const scopedMutations = this.#scopes.get(scope);\n if (scopedMutations) {\n scopedMutations.push(mutation);\n } else {\n this.#scopes.set(scope, [mutation]);\n }\n }\n this.notify({ type: \"added\", mutation });\n }\n remove(mutation) {\n if (this.#mutations.delete(mutation)) {\n const scope = scopeFor(mutation);\n if (typeof scope === \"string\") {\n const scopedMutations = this.#scopes.get(scope);\n if (scopedMutations) {\n if (scopedMutations.length > 1) {\n const index = scopedMutations.indexOf(mutation);\n if (index !== -1) {\n scopedMutations.splice(index, 1);\n }\n } else if (scopedMutations[0] === mutation) {\n this.#scopes.delete(scope);\n }\n }\n }\n }\n this.notify({ type: \"removed\", mutation });\n }\n canRun(mutation) {\n const scope = scopeFor(mutation);\n if (typeof scope === \"string\") {\n const mutationsWithSameScope = this.#scopes.get(scope);\n const firstPendingMutation = mutationsWithSameScope?.find(\n (m) => m.state.status === \"pending\"\n );\n return !firstPendingMutation || firstPendingMutation === mutation;\n } else {\n return true;\n }\n }\n runNext(mutation) {\n const scope = scopeFor(mutation);\n if (typeof scope === \"string\") {\n const foundMutation = this.#scopes.get(scope)?.find((m) => m !== mutation && m.state.isPaused);\n return foundMutation?.continue() ?? Promise.resolve();\n } else {\n return Promise.resolve();\n }\n }\n clear() {\n notifyManager.batch(() => {\n this.#mutations.forEach((mutation) => {\n this.notify({ type: \"removed\", mutation });\n });\n this.#mutations.clear();\n this.#scopes.clear();\n });\n }\n getAll() {\n return Array.from(this.#mutations);\n }\n find(filters) {\n const defaultedFilters = { exact: true, ...filters };\n return this.getAll().find(\n (mutation) => matchMutation(defaultedFilters, mutation)\n );\n }\n findAll(filters = {}) {\n return this.getAll().filter((mutation) => matchMutation(filters, mutation));\n }\n notify(event) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(event);\n });\n });\n }\n resumePausedMutations() {\n const pausedMutations = this.getAll().filter((x) => x.state.isPaused);\n return notifyManager.batch(\n () => Promise.all(\n pausedMutations.map((mutation) => mutation.continue().catch(noop))\n )\n );\n }\n};\nfunction scopeFor(mutation) {\n return mutation.options.scope?.id;\n}\nexport {\n MutationCache\n};\n//# sourceMappingURL=mutationCache.js.map","// src/queriesObserver.ts\nimport { notifyManager } from \"./notifyManager.js\";\nimport { QueryObserver } from \"./queryObserver.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { replaceEqualDeep, shallowEqualObjects } from \"./utils.js\";\nfunction difference(array1, array2) {\n const excludeSet = new Set(array2);\n return array1.filter((x) => !excludeSet.has(x));\n}\nfunction replaceAt(array, index, value) {\n const copy = array.slice(0);\n copy[index] = value;\n return copy;\n}\nvar QueriesObserver = class extends Subscribable {\n #client;\n #result;\n #queries;\n #options;\n #observers;\n #combinedResult;\n #lastCombine;\n #lastResult;\n #observerMatches = [];\n constructor(client, queries, options) {\n super();\n this.#client = client;\n this.#options = options;\n this.#queries = [];\n this.#observers = [];\n this.#result = [];\n this.setQueries(queries);\n }\n onSubscribe() {\n if (this.listeners.size === 1) {\n this.#observers.forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result);\n });\n });\n }\n }\n onUnsubscribe() {\n if (!this.listeners.size) {\n this.destroy();\n }\n }\n destroy() {\n this.listeners = /* @__PURE__ */ new Set();\n this.#observers.forEach((observer) => {\n observer.destroy();\n });\n }\n setQueries(queries, options) {\n this.#queries = queries;\n this.#options = options;\n if (process.env.NODE_ENV !== \"production\") {\n const queryHashes = queries.map(\n (query) => this.#client.defaultQueryOptions(query).queryHash\n );\n if (new Set(queryHashes).size !== queryHashes.length) {\n console.warn(\n \"[QueriesObserver]: Duplicate Queries found. This might result in unexpected behavior.\"\n );\n }\n }\n notifyManager.batch(() => {\n const prevObservers = this.#observers;\n const newObserverMatches = this.#findMatchingObservers(this.#queries);\n newObserverMatches.forEach(\n (match) => match.observer.setOptions(match.defaultedQueryOptions)\n );\n const newObservers = newObserverMatches.map((match) => match.observer);\n const newResult = newObservers.map(\n (observer) => observer.getCurrentResult()\n );\n const hasLengthChange = prevObservers.length !== newObservers.length;\n const hasIndexChange = newObservers.some(\n (observer, index) => observer !== prevObservers[index]\n );\n const hasStructuralChange = hasLengthChange || hasIndexChange;\n const hasResultChange = hasStructuralChange ? true : newResult.some((result, index) => {\n const prev = this.#result[index];\n return !prev || !shallowEqualObjects(result, prev);\n });\n if (!hasStructuralChange && !hasResultChange) return;\n if (hasStructuralChange) {\n this.#observerMatches = newObserverMatches;\n this.#observers = newObservers;\n }\n this.#result = newResult;\n if (!this.hasListeners()) return;\n if (hasStructuralChange) {\n difference(prevObservers, newObservers).forEach((observer) => {\n observer.destroy();\n });\n difference(newObservers, prevObservers).forEach((observer) => {\n observer.subscribe((result) => {\n this.#onUpdate(observer, result);\n });\n });\n }\n this.#notify();\n });\n }\n getCurrentResult() {\n return this.#result;\n }\n getQueries() {\n return this.#observers.map((observer) => observer.getCurrentQuery());\n }\n getObservers() {\n return this.#observers;\n }\n getOptimisticResult(queries, combine) {\n const matches = this.#findMatchingObservers(queries);\n const result = matches.map(\n (match) => match.observer.getOptimisticResult(match.defaultedQueryOptions)\n );\n return [\n result,\n (r) => {\n return this.#combineResult(r ?? result, combine);\n },\n () => {\n return this.#trackResult(result, matches);\n }\n ];\n }\n #trackResult(result, matches) {\n return matches.map((match, index) => {\n const observerResult = result[index];\n return !match.defaultedQueryOptions.notifyOnChangeProps ? match.observer.trackResult(observerResult, (accessedProp) => {\n matches.forEach((m) => {\n m.observer.trackProp(accessedProp);\n });\n }) : observerResult;\n });\n }\n #combineResult(input, combine) {\n if (combine) {\n if (!this.#combinedResult || this.#result !== this.#lastResult || combine !== this.#lastCombine) {\n this.#lastCombine = combine;\n this.#lastResult = this.#result;\n this.#combinedResult = replaceEqualDeep(\n this.#combinedResult,\n combine(input)\n );\n }\n return this.#combinedResult;\n }\n return input;\n }\n #findMatchingObservers(queries) {\n const prevObserversMap = /* @__PURE__ */ new Map();\n this.#observers.forEach((observer) => {\n const key = observer.options.queryHash;\n if (!key) return;\n const previousObservers = prevObserversMap.get(key);\n if (previousObservers) {\n previousObservers.push(observer);\n } else {\n prevObserversMap.set(key, [observer]);\n }\n });\n const observers = [];\n queries.forEach((options) => {\n const defaultedOptions = this.#client.defaultQueryOptions(options);\n const match = prevObserversMap.get(defaultedOptions.queryHash)?.shift();\n const observer = match ?? new QueryObserver(this.#client, defaultedOptions);\n observers.push({\n defaultedQueryOptions: defaultedOptions,\n observer\n });\n });\n return observers;\n }\n #onUpdate(observer, result) {\n const index = this.#observers.indexOf(observer);\n if (index !== -1) {\n this.#result = replaceAt(this.#result, index, result);\n this.#notify();\n }\n }\n #notify() {\n if (this.hasListeners()) {\n const previousResult = this.#combinedResult;\n const newTracked = this.#trackResult(this.#result, this.#observerMatches);\n const newResult = this.#combineResult(newTracked, this.#options?.combine);\n if (previousResult !== newResult) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(this.#result);\n });\n });\n }\n }\n }\n};\nexport {\n QueriesObserver\n};\n//# sourceMappingURL=queriesObserver.js.map","// src/queryCache.ts\nimport { hashQueryKeyByOptions, matchQuery } from \"./utils.js\";\nimport { Query } from \"./query.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Subscribable } from \"./subscribable.js\";\nvar QueryCache = class extends Subscribable {\n constructor(config = {}) {\n super();\n this.config = config;\n this.#queries = /* @__PURE__ */ new Map();\n }\n #queries;\n build(client, options, state) {\n const queryKey = options.queryKey;\n const queryHash = options.queryHash ?? hashQueryKeyByOptions(queryKey, options);\n let query = this.get(queryHash);\n if (!query) {\n query = new Query({\n client,\n queryKey,\n queryHash,\n options: client.defaultQueryOptions(options),\n state,\n defaultOptions: client.getQueryDefaults(queryKey)\n });\n this.add(query);\n }\n return query;\n }\n add(query) {\n if (!this.#queries.has(query.queryHash)) {\n this.#queries.set(query.queryHash, query);\n this.notify({\n type: \"added\",\n query\n });\n }\n }\n remove(query) {\n const queryInMap = this.#queries.get(query.queryHash);\n if (queryInMap) {\n query.destroy();\n if (queryInMap === query) {\n this.#queries.delete(query.queryHash);\n }\n this.notify({ type: \"removed\", query });\n }\n }\n clear() {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n this.remove(query);\n });\n });\n }\n get(queryHash) {\n return this.#queries.get(queryHash);\n }\n getAll() {\n return [...this.#queries.values()];\n }\n find(filters) {\n const defaultedFilters = { exact: true, ...filters };\n return this.getAll().find(\n (query) => matchQuery(defaultedFilters, query)\n );\n }\n findAll(filters = {}) {\n const queries = this.getAll();\n return Object.keys(filters).length > 0 ? queries.filter((query) => matchQuery(filters, query)) : queries;\n }\n notify(event) {\n notifyManager.batch(() => {\n this.listeners.forEach((listener) => {\n listener(event);\n });\n });\n }\n onFocus() {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n query.onFocus();\n });\n });\n }\n onOnline() {\n notifyManager.batch(() => {\n this.getAll().forEach((query) => {\n query.onOnline();\n });\n });\n }\n};\nexport {\n QueryCache\n};\n//# sourceMappingURL=queryCache.js.map","// src/queryClient.ts\nimport {\n functionalUpdate,\n hashKey,\n hashQueryKeyByOptions,\n noop,\n partialMatchKey,\n resolveStaleTime,\n skipToken\n} from \"./utils.js\";\nimport { QueryCache } from \"./queryCache.js\";\nimport { MutationCache } from \"./mutationCache.js\";\nimport { focusManager } from \"./focusManager.js\";\nimport { onlineManager } from \"./onlineManager.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { infiniteQueryBehavior } from \"./infiniteQueryBehavior.js\";\nvar QueryClient = class {\n #queryCache;\n #mutationCache;\n #defaultOptions;\n #queryDefaults;\n #mutationDefaults;\n #mountCount;\n #unsubscribeFocus;\n #unsubscribeOnline;\n constructor(config = {}) {\n this.#queryCache = config.queryCache || new QueryCache();\n this.#mutationCache = config.mutationCache || new MutationCache();\n this.#defaultOptions = config.defaultOptions || {};\n this.#queryDefaults = /* @__PURE__ */ new Map();\n this.#mutationDefaults = /* @__PURE__ */ new Map();\n this.#mountCount = 0;\n }\n mount() {\n this.#mountCount++;\n if (this.#mountCount !== 1) return;\n this.#unsubscribeFocus = focusManager.subscribe(async (focused) => {\n if (focused) {\n await this.resumePausedMutations();\n this.#queryCache.onFocus();\n }\n });\n this.#unsubscribeOnline = onlineManager.subscribe(async (online) => {\n if (online) {\n await this.resumePausedMutations();\n this.#queryCache.onOnline();\n }\n });\n }\n unmount() {\n this.#mountCount--;\n if (this.#mountCount !== 0) return;\n this.#unsubscribeFocus?.();\n this.#unsubscribeFocus = void 0;\n this.#unsubscribeOnline?.();\n this.#unsubscribeOnline = void 0;\n }\n isFetching(filters) {\n return this.#queryCache.findAll({ ...filters, fetchStatus: \"fetching\" }).length;\n }\n isMutating(filters) {\n return this.#mutationCache.findAll({ ...filters, status: \"pending\" }).length;\n }\n /**\n * Imperative (non-reactive) way to retrieve data for a QueryKey.\n * Should only be used in callbacks or functions where reading the latest data is necessary, e.g. for optimistic updates.\n *\n * Hint: Do not use this function inside a component, because it won't receive updates.\n * Use `useQuery` to create a `QueryObserver` that subscribes to changes.\n */\n getQueryData(queryKey) {\n const options = this.defaultQueryOptions({ queryKey });\n return this.#queryCache.get(options.queryHash)?.state.data;\n }\n ensureQueryData(options) {\n const defaultedOptions = this.defaultQueryOptions(options);\n const query = this.#queryCache.build(this, defaultedOptions);\n const cachedData = query.state.data;\n if (cachedData === void 0) {\n return this.fetchQuery(options);\n }\n if (options.revalidateIfStale && query.isStaleByTime(resolveStaleTime(defaultedOptions.staleTime, query))) {\n void this.prefetchQuery(defaultedOptions);\n }\n return Promise.resolve(cachedData);\n }\n getQueriesData(filters) {\n return this.#queryCache.findAll(filters).map(({ queryKey, state }) => {\n const data = state.data;\n return [queryKey, data];\n });\n }\n setQueryData(queryKey, updater, options) {\n const defaultedOptions = this.defaultQueryOptions({ queryKey });\n const query = this.#queryCache.get(\n defaultedOptions.queryHash\n );\n const prevData = query?.state.data;\n const data = functionalUpdate(updater, prevData);\n if (data === void 0) {\n return void 0;\n }\n return this.#queryCache.build(this, defaultedOptions).setData(data, { ...options, manual: true });\n }\n setQueriesData(filters, updater, options) {\n return notifyManager.batch(\n () => this.#queryCache.findAll(filters).map(({ queryKey }) => [\n queryKey,\n this.setQueryData(queryKey, updater, options)\n ])\n );\n }\n getQueryState(queryKey) {\n const options = this.defaultQueryOptions({ queryKey });\n return this.#queryCache.get(\n options.queryHash\n )?.state;\n }\n removeQueries(filters) {\n const queryCache = this.#queryCache;\n notifyManager.batch(() => {\n queryCache.findAll(filters).forEach((query) => {\n queryCache.remove(query);\n });\n });\n }\n resetQueries(filters, options) {\n const queryCache = this.#queryCache;\n return notifyManager.batch(() => {\n queryCache.findAll(filters).forEach((query) => {\n query.reset();\n });\n return this.refetchQueries(\n {\n type: \"active\",\n ...filters\n },\n options\n );\n });\n }\n cancelQueries(filters, cancelOptions = {}) {\n const defaultedCancelOptions = { revert: true, ...cancelOptions };\n const promises = notifyManager.batch(\n () => this.#queryCache.findAll(filters).map((query) => query.cancel(defaultedCancelOptions))\n );\n return Promise.all(promises).then(noop).catch(noop);\n }\n invalidateQueries(filters, options = {}) {\n return notifyManager.batch(() => {\n this.#queryCache.findAll(filters).forEach((query) => {\n query.invalidate();\n });\n if (filters?.refetchType === \"none\") {\n return Promise.resolve();\n }\n return this.refetchQueries(\n {\n ...filters,\n type: filters?.refetchType ?? filters?.type ?? \"active\"\n },\n options\n );\n });\n }\n refetchQueries(filters, options = {}) {\n const fetchOptions = {\n ...options,\n cancelRefetch: options.cancelRefetch ?? true\n };\n const promises = notifyManager.batch(\n () => this.#queryCache.findAll(filters).filter((query) => !query.isDisabled() && !query.isStatic()).map((query) => {\n let promise = query.fetch(void 0, fetchOptions);\n if (!fetchOptions.throwOnError) {\n promise = promise.catch(noop);\n }\n return query.state.fetchStatus === \"paused\" ? Promise.resolve() : promise;\n })\n );\n return Promise.all(promises).then(noop);\n }\n fetchQuery(options) {\n const defaultedOptions = this.defaultQueryOptions(options);\n if (defaultedOptions.retry === void 0) {\n defaultedOptions.retry = false;\n }\n const query = this.#queryCache.build(this, defaultedOptions);\n return query.isStaleByTime(\n resolveStaleTime(defaultedOptions.staleTime, query)\n ) ? query.fetch(defaultedOptions) : Promise.resolve(query.state.data);\n }\n prefetchQuery(options) {\n return this.fetchQuery(options).then(noop).catch(noop);\n }\n fetchInfiniteQuery(options) {\n options.behavior = infiniteQueryBehavior(options.pages);\n return this.fetchQuery(options);\n }\n prefetchInfiniteQuery(options) {\n return this.fetchInfiniteQuery(options).then(noop).catch(noop);\n }\n ensureInfiniteQueryData(options) {\n options.behavior = infiniteQueryBehavior(options.pages);\n return this.ensureQueryData(options);\n }\n resumePausedMutations() {\n if (onlineManager.isOnline()) {\n return this.#mutationCache.resumePausedMutations();\n }\n return Promise.resolve();\n }\n getQueryCache() {\n return this.#queryCache;\n }\n getMutationCache() {\n return this.#mutationCache;\n }\n getDefaultOptions() {\n return this.#defaultOptions;\n }\n setDefaultOptions(options) {\n this.#defaultOptions = options;\n }\n setQueryDefaults(queryKey, options) {\n this.#queryDefaults.set(hashKey(queryKey), {\n queryKey,\n defaultOptions: options\n });\n }\n getQueryDefaults(queryKey) {\n const defaults = [...this.#queryDefaults.values()];\n const result = {};\n defaults.forEach((queryDefault) => {\n if (partialMatchKey(queryKey, queryDefault.queryKey)) {\n Object.assign(result, queryDefault.defaultOptions);\n }\n });\n return result;\n }\n setMutationDefaults(mutationKey, options) {\n this.#mutationDefaults.set(hashKey(mutationKey), {\n mutationKey,\n defaultOptions: options\n });\n }\n getMutationDefaults(mutationKey) {\n const defaults = [...this.#mutationDefaults.values()];\n const result = {};\n defaults.forEach((queryDefault) => {\n if (partialMatchKey(mutationKey, queryDefault.mutationKey)) {\n Object.assign(result, queryDefault.defaultOptions);\n }\n });\n return result;\n }\n defaultQueryOptions(options) {\n if (options._defaulted) {\n return options;\n }\n const defaultedOptions = {\n ...this.#defaultOptions.queries,\n ...this.getQueryDefaults(options.queryKey),\n ...options,\n _defaulted: true\n };\n if (!defaultedOptions.queryHash) {\n defaultedOptions.queryHash = hashQueryKeyByOptions(\n defaultedOptions.queryKey,\n defaultedOptions\n );\n }\n if (defaultedOptions.refetchOnReconnect === void 0) {\n defaultedOptions.refetchOnReconnect = defaultedOptions.networkMode !== \"always\";\n }\n if (defaultedOptions.throwOnError === void 0) {\n defaultedOptions.throwOnError = !!defaultedOptions.suspense;\n }\n if (!defaultedOptions.networkMode && defaultedOptions.persister) {\n defaultedOptions.networkMode = \"offlineFirst\";\n }\n if (defaultedOptions.queryFn === skipToken) {\n defaultedOptions.enabled = false;\n }\n return defaultedOptions;\n }\n defaultMutationOptions(options) {\n if (options?._defaulted) {\n return options;\n }\n return {\n ...this.#defaultOptions.mutations,\n ...options?.mutationKey && this.getMutationDefaults(options.mutationKey),\n ...options,\n _defaulted: true\n };\n }\n clear() {\n this.#queryCache.clear();\n this.#mutationCache.clear();\n }\n};\nexport {\n QueryClient\n};\n//# sourceMappingURL=queryClient.js.map","\"use client\";\n\n// src/QueryClientProvider.tsx\nimport * as React from \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nvar QueryClientContext = React.createContext(\n void 0\n);\nvar useQueryClient = (queryClient) => {\n const client = React.useContext(QueryClientContext);\n if (queryClient) {\n return queryClient;\n }\n if (!client) {\n throw new Error(\"No QueryClient set, use QueryClientProvider to set one\");\n }\n return client;\n};\nvar QueryClientProvider = ({\n client,\n children\n}) => {\n React.useEffect(() => {\n client.mount();\n return () => {\n client.unmount();\n };\n }, [client]);\n return /* @__PURE__ */ jsx(QueryClientContext.Provider, { value: client, children });\n};\nexport {\n QueryClientContext,\n QueryClientProvider,\n useQueryClient\n};\n//# sourceMappingURL=QueryClientProvider.js.map","\"use client\";\n\n// src/IsRestoringProvider.ts\nimport * as React from \"react\";\nvar IsRestoringContext = React.createContext(false);\nvar useIsRestoring = () => React.useContext(IsRestoringContext);\nvar IsRestoringProvider = IsRestoringContext.Provider;\nexport {\n IsRestoringProvider,\n useIsRestoring\n};\n//# sourceMappingURL=IsRestoringProvider.js.map","\"use client\";\n\n// src/QueryErrorResetBoundary.tsx\nimport * as React from \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nfunction createValue() {\n let isReset = false;\n return {\n clearReset: () => {\n isReset = false;\n },\n reset: () => {\n isReset = true;\n },\n isReset: () => {\n return isReset;\n }\n };\n}\nvar QueryErrorResetBoundaryContext = React.createContext(createValue());\nvar useQueryErrorResetBoundary = () => React.useContext(QueryErrorResetBoundaryContext);\nvar QueryErrorResetBoundary = ({\n children\n}) => {\n const [value] = React.useState(() => createValue());\n return /* @__PURE__ */ jsx(QueryErrorResetBoundaryContext.Provider, { value, children: typeof children === \"function\" ? children(value) : children });\n};\nexport {\n QueryErrorResetBoundary,\n useQueryErrorResetBoundary\n};\n//# sourceMappingURL=QueryErrorResetBoundary.js.map","\"use client\";\n\n// src/errorBoundaryUtils.ts\nimport * as React from \"react\";\nimport { shouldThrowError } from \"@tanstack/query-core\";\nvar ensurePreventErrorBoundaryRetry = (options, errorResetBoundary, query) => {\n const throwOnError = query?.state.error && typeof options.throwOnError === \"function\" ? shouldThrowError(options.throwOnError, [query.state.error, query]) : options.throwOnError;\n if (options.suspense || options.experimental_prefetchInRender || throwOnError) {\n if (!errorResetBoundary.isReset()) {\n options.retryOnMount = false;\n }\n }\n};\nvar useClearResetErrorBoundary = (errorResetBoundary) => {\n React.useEffect(() => {\n errorResetBoundary.clearReset();\n }, [errorResetBoundary]);\n};\nvar getHasError = ({\n result,\n errorResetBoundary,\n throwOnError,\n query,\n suspense\n}) => {\n return result.isError && !errorResetBoundary.isReset() && !result.isFetching && query && (suspense && result.data === void 0 || shouldThrowError(throwOnError, [result.error, query]));\n};\nexport {\n ensurePreventErrorBoundaryRetry,\n getHasError,\n useClearResetErrorBoundary\n};\n//# sourceMappingURL=errorBoundaryUtils.js.map","// src/suspense.ts\nvar defaultThrowOnError = (_error, query) => query.state.data === void 0;\nvar ensureSuspenseTimers = (defaultedOptions) => {\n if (defaultedOptions.suspense) {\n const MIN_SUSPENSE_TIME_MS = 1e3;\n const clamp = (value) => value === \"static\" ? value : Math.max(value ?? MIN_SUSPENSE_TIME_MS, MIN_SUSPENSE_TIME_MS);\n const originalStaleTime = defaultedOptions.staleTime;\n defaultedOptions.staleTime = typeof originalStaleTime === \"function\" ? (...args) => clamp(originalStaleTime(...args)) : clamp(originalStaleTime);\n if (typeof defaultedOptions.gcTime === \"number\") {\n defaultedOptions.gcTime = Math.max(\n defaultedOptions.gcTime,\n MIN_SUSPENSE_TIME_MS\n );\n }\n }\n};\nvar willFetch = (result, isRestoring) => result.isLoading && result.isFetching && !isRestoring;\nvar shouldSuspend = (defaultedOptions, result) => defaultedOptions?.suspense && result.isPending;\nvar fetchOptimistic = (defaultedOptions, observer, errorResetBoundary) => observer.fetchOptimistic(defaultedOptions).catch(() => {\n errorResetBoundary.clearReset();\n});\nexport {\n defaultThrowOnError,\n ensureSuspenseTimers,\n fetchOptimistic,\n shouldSuspend,\n willFetch\n};\n//# sourceMappingURL=suspense.js.map","\"use client\";\n\n// src/useQueries.ts\nimport * as React from \"react\";\nimport {\n QueriesObserver,\n QueryObserver,\n noop,\n notifyManager\n} from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nimport { useIsRestoring } from \"./IsRestoringProvider.js\";\nimport { useQueryErrorResetBoundary } from \"./QueryErrorResetBoundary.js\";\nimport {\n ensurePreventErrorBoundaryRetry,\n getHasError,\n useClearResetErrorBoundary\n} from \"./errorBoundaryUtils.js\";\nimport {\n ensureSuspenseTimers,\n fetchOptimistic,\n shouldSuspend,\n willFetch\n} from \"./suspense.js\";\nfunction useQueries({\n queries,\n ...options\n}, queryClient) {\n const client = useQueryClient(queryClient);\n const isRestoring = useIsRestoring();\n const errorResetBoundary = useQueryErrorResetBoundary();\n const defaultedQueries = React.useMemo(\n () => queries.map((opts) => {\n const defaultedOptions = client.defaultQueryOptions(\n opts\n );\n defaultedOptions._optimisticResults = isRestoring ? \"isRestoring\" : \"optimistic\";\n return defaultedOptions;\n }),\n [queries, client, isRestoring]\n );\n defaultedQueries.forEach((queryOptions) => {\n ensureSuspenseTimers(queryOptions);\n const query = client.getQueryCache().get(queryOptions.queryHash);\n ensurePreventErrorBoundaryRetry(queryOptions, errorResetBoundary, query);\n });\n useClearResetErrorBoundary(errorResetBoundary);\n const [observer] = React.useState(\n () => new QueriesObserver(\n client,\n defaultedQueries,\n options\n )\n );\n const [optimisticResult, getCombinedResult, trackResult] = observer.getOptimisticResult(\n defaultedQueries,\n options.combine\n );\n const shouldSubscribe = !isRestoring && options.subscribed !== false;\n React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => shouldSubscribe ? observer.subscribe(notifyManager.batchCalls(onStoreChange)) : noop,\n [observer, shouldSubscribe]\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult()\n );\n React.useEffect(() => {\n observer.setQueries(\n defaultedQueries,\n options\n );\n }, [defaultedQueries, options, observer]);\n const shouldAtLeastOneSuspend = optimisticResult.some(\n (result, index) => shouldSuspend(defaultedQueries[index], result)\n );\n const suspensePromises = shouldAtLeastOneSuspend ? optimisticResult.flatMap((result, index) => {\n const opts = defaultedQueries[index];\n if (opts) {\n const queryObserver = new QueryObserver(client, opts);\n if (shouldSuspend(opts, result)) {\n return fetchOptimistic(opts, queryObserver, errorResetBoundary);\n } else if (willFetch(result, isRestoring)) {\n void fetchOptimistic(opts, queryObserver, errorResetBoundary);\n }\n }\n return [];\n }) : [];\n if (suspensePromises.length > 0) {\n throw Promise.all(suspensePromises);\n }\n const firstSingleResultWhichShouldThrow = optimisticResult.find(\n (result, index) => {\n const query = defaultedQueries[index];\n return query && getHasError({\n result,\n errorResetBoundary,\n throwOnError: query.throwOnError,\n query: client.getQueryCache().get(query.queryHash),\n suspense: query.suspense\n });\n }\n );\n if (firstSingleResultWhichShouldThrow?.error) {\n throw firstSingleResultWhichShouldThrow.error;\n }\n return getCombinedResult(trackResult());\n}\nexport {\n useQueries\n};\n//# sourceMappingURL=useQueries.js.map","\"use client\";\n\n// src/useBaseQuery.ts\nimport * as React from \"react\";\nimport { isServer, noop, notifyManager } from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nimport { useQueryErrorResetBoundary } from \"./QueryErrorResetBoundary.js\";\nimport {\n ensurePreventErrorBoundaryRetry,\n getHasError,\n useClearResetErrorBoundary\n} from \"./errorBoundaryUtils.js\";\nimport { useIsRestoring } from \"./IsRestoringProvider.js\";\nimport {\n ensureSuspenseTimers,\n fetchOptimistic,\n shouldSuspend,\n willFetch\n} from \"./suspense.js\";\nfunction useBaseQuery(options, Observer, queryClient) {\n if (process.env.NODE_ENV !== \"production\") {\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new Error(\n 'Bad argument type. Starting with v5, only the \"Object\" form is allowed when calling query related functions. Please use the error stack to find the culprit call. More info here: https://tanstack.com/query/latest/docs/react/guides/migrating-to-v5#supports-a-single-signature-one-object'\n );\n }\n }\n const isRestoring = useIsRestoring();\n const errorResetBoundary = useQueryErrorResetBoundary();\n const client = useQueryClient(queryClient);\n const defaultedOptions = client.defaultQueryOptions(options);\n client.getDefaultOptions().queries?._experimental_beforeQuery?.(\n defaultedOptions\n );\n const query = client.getQueryCache().get(defaultedOptions.queryHash);\n if (process.env.NODE_ENV !== \"production\") {\n if (!defaultedOptions.queryFn) {\n console.error(\n `[${defaultedOptions.queryHash}]: No queryFn was passed as an option, and no default queryFn was found. The queryFn parameter is only optional when using a default queryFn. More info here: https://tanstack.com/query/latest/docs/framework/react/guides/default-query-function`\n );\n }\n }\n defaultedOptions._optimisticResults = isRestoring ? \"isRestoring\" : \"optimistic\";\n ensureSuspenseTimers(defaultedOptions);\n ensurePreventErrorBoundaryRetry(defaultedOptions, errorResetBoundary, query);\n useClearResetErrorBoundary(errorResetBoundary);\n const isNewCacheEntry = !client.getQueryCache().get(defaultedOptions.queryHash);\n const [observer] = React.useState(\n () => new Observer(\n client,\n defaultedOptions\n )\n );\n const result = observer.getOptimisticResult(defaultedOptions);\n const shouldSubscribe = !isRestoring && options.subscribed !== false;\n React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => {\n const unsubscribe = shouldSubscribe ? observer.subscribe(notifyManager.batchCalls(onStoreChange)) : noop;\n observer.updateResult();\n return unsubscribe;\n },\n [observer, shouldSubscribe]\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult()\n );\n React.useEffect(() => {\n observer.setOptions(defaultedOptions);\n }, [defaultedOptions, observer]);\n if (shouldSuspend(defaultedOptions, result)) {\n throw fetchOptimistic(defaultedOptions, observer, errorResetBoundary);\n }\n if (getHasError({\n result,\n errorResetBoundary,\n throwOnError: defaultedOptions.throwOnError,\n query,\n suspense: defaultedOptions.suspense\n })) {\n throw result.error;\n }\n ;\n client.getDefaultOptions().queries?._experimental_afterQuery?.(\n defaultedOptions,\n result\n );\n if (defaultedOptions.experimental_prefetchInRender && !isServer && willFetch(result, isRestoring)) {\n const promise = isNewCacheEntry ? (\n // Fetch immediately on render in order to ensure `.promise` is resolved even if the component is unmounted\n fetchOptimistic(defaultedOptions, observer, errorResetBoundary)\n ) : (\n // subscribe to the \"cache promise\" so that we can finalize the currentThenable once data comes in\n query?.promise\n );\n promise?.catch(noop).finally(() => {\n observer.updateResult();\n });\n }\n return !defaultedOptions.notifyOnChangeProps ? observer.trackResult(result) : result;\n}\nexport {\n useBaseQuery\n};\n//# sourceMappingURL=useBaseQuery.js.map","\"use client\";\n\n// src/useQuery.ts\nimport { QueryObserver } from \"@tanstack/query-core\";\nimport { useBaseQuery } from \"./useBaseQuery.js\";\nfunction useQuery(options, queryClient) {\n return useBaseQuery(options, QueryObserver, queryClient);\n}\nexport {\n useQuery\n};\n//# sourceMappingURL=useQuery.js.map","/**\n * Minimal Cube client implementation\n * Replaces @cubejs-client/core with lighter implementation\n */\n\nimport type { CubeQuery, CubeApiOptions, CubeResultSet } from '../types'\n\nexport class CubeClient {\n private apiUrl: string\n private headers: Record<string, string>\n private credentials: 'include' | 'omit' | 'same-origin'\n\n constructor(token?: string, options: CubeApiOptions = {}) {\n this.apiUrl = options.apiUrl || '/cubejs-api/v1'\n this.headers = {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n this.credentials = options.credentials ?? 'include'\n\n if (token) {\n this.headers['Authorization'] = token\n }\n }\n\n async load(query: CubeQuery): Promise<CubeResultSet> {\n // Use GET with query parameter for standard Cube.js compatibility\n const queryString = JSON.stringify(query)\n const queryParam = encodeURIComponent(queryString)\n const url = `${this.apiUrl}/load?query=${queryParam}`\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n // Remove Content-Type for GET request\n ...Object.fromEntries(\n Object.entries(this.headers).filter(([key]) => key !== 'Content-Type')\n )\n },\n credentials: this.credentials\n })\n\n if (!response.ok) {\n let errorMessage = `Cube query failed: ${response.status}`\n try {\n const errorText = await response.text()\n // Try to parse as JSON first to get structured error\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If not JSON, use the raw text\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n const result = await response.json()\n return new ResultSet(result)\n }\n\n async meta(): Promise<any> {\n const url = `${this.apiUrl}/meta`\n \n const response = await fetch(url, {\n method: 'GET',\n headers: this.headers,\n credentials: this.credentials\n })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch meta: ${response.status}`)\n }\n\n return response.json()\n }\n\n async sql(query: CubeQuery): Promise<any> {\n // Use GET with query parameter for standard Cube.js compatibility\n const queryParam = encodeURIComponent(JSON.stringify(query))\n const url = `${this.apiUrl}/sql?query=${queryParam}`\n \n const response = await fetch(url, {\n method: 'GET',\n headers: {\n // Remove Content-Type for GET request\n ...Object.fromEntries(\n Object.entries(this.headers).filter(([key]) => key !== 'Content-Type')\n )\n },\n credentials: this.credentials\n })\n\n if (!response.ok) {\n throw new Error(`SQL generation failed: ${response.status}`)\n }\n\n return response.json()\n }\n\n async dryRun(query: CubeQuery): Promise<any> {\n const url = `${this.apiUrl}/dry-run`\n\n const response = await fetch(url, {\n method: 'POST',\n headers: this.headers,\n credentials: this.credentials,\n body: JSON.stringify({ query })\n })\n\n if (!response.ok) {\n let errorMessage = `Dry run failed: ${response.status}`\n try {\n const errorText = await response.text()\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n return response.json()\n }\n\n /**\n * Execute multiple queries in a single batch request\n * Used by BatchCoordinator to optimize network requests\n */\n async batchLoad(queries: CubeQuery[]): Promise<CubeResultSet[]> {\n const url = `${this.apiUrl}/batch`\n\n const response = await fetch(url, {\n method: 'POST',\n headers: this.headers,\n credentials: this.credentials,\n body: JSON.stringify({ queries })\n })\n\n if (!response.ok) {\n let errorMessage = `Batch query failed: ${response.status}`\n try {\n const errorText = await response.text()\n try {\n const errorData = JSON.parse(errorText)\n if (errorData.error) {\n errorMessage = errorData.error\n } else {\n errorMessage += ` ${errorText}`\n }\n } catch {\n errorMessage += ` ${errorText}`\n }\n } catch {\n // If we can't read the response, just use the status\n }\n throw new Error(errorMessage)\n }\n\n const batchResponse = await response.json()\n\n // batchResponse.results is an array of individual query results\n // Each result may have succeeded or failed\n return batchResponse.results.map((result: any) => {\n // If this individual query failed, create a ResultSet with error info\n if (!result.success && result.error) {\n // Create a result set that will throw when accessed\n return {\n ...new ResultSet({ data: [], annotation: {} }),\n error: result.error\n }\n }\n\n // Create ResultSet from successful result\n return new ResultSet(result)\n })\n }\n}\n\n/**\n * Simple ResultSet implementation\n */\nclass ResultSet implements CubeResultSet {\n public loadResponse: any\n\n constructor(loadResponse: any) {\n this.loadResponse = loadResponse\n }\n\n rawData(): any[] {\n // Handle new nested structure: loadResponse.results[0].data\n // Keep backward compatibility with old structure: loadResponse.data\n if (this.loadResponse.results && this.loadResponse.results[0]) {\n return this.loadResponse.results[0].data || []\n }\n return this.loadResponse.data || []\n }\n\n tablePivot(): any[] {\n // For pie charts and tables, return the raw data\n return this.rawData()\n }\n\n series(): any[] {\n // Simple series implementation\n return this.rawData()\n }\n\n annotation(): any {\n // Handle new nested structure: loadResponse.results[0].annotation\n // Keep backward compatibility with old structure: loadResponse.annotation\n if (this.loadResponse.results && this.loadResponse.results[0]) {\n return this.loadResponse.results[0].annotation || {}\n }\n return this.loadResponse.annotation || {}\n }\n\n /**\n * Get cache metadata if result was served from cache\n * Returns undefined if not a cache hit\n */\n cacheInfo(): { hit: true; cachedAt: string; ttlMs: number; ttlRemainingMs: number } | undefined {\n // Handle nested structure: loadResponse.results[0].cache\n if (this.loadResponse.results && this.loadResponse.results[0]) {\n return this.loadResponse.results[0].cache\n }\n return this.loadResponse.cache\n }\n}\n\n/**\n * Factory function to create a cube client\n */\nexport function createCubeClient(token?: string, options: CubeApiOptions = {}): CubeClient {\n return new CubeClient(token, options)\n}\n\n// Legacy compatibility export\nexport function cube(token?: string, options: CubeApiOptions = {}): CubeClient {\n return createCubeClient(token, options)\n}","import type { CubeQuery, CubeResultSet } from '../types'\n\n/**\n * Represents a queued query with its resolver/rejector\n */\ninterface QueuedQuery {\n query: CubeQuery\n resolve: (result: CubeResultSet) => void\n reject: (error: Error) => void\n}\n\n/**\n * BatchCoordinator collects queries triggered in the same render cycle\n * and sends them as a single batch request to minimize network overhead.\n *\n * Uses a configurable delay (default 100ms) to batch queries from lazy-loaded\n * portlets that become visible during the same scroll action.\n */\nexport class BatchCoordinator {\n private queue: QueuedQuery[] = []\n private flushScheduled = false\n private batchExecutor: (queries: CubeQuery[]) => Promise<CubeResultSet[]>\n private delayMs: number\n\n constructor(batchExecutor: (queries: CubeQuery[]) => Promise<CubeResultSet[]>, delayMs: number = 100) {\n this.batchExecutor = batchExecutor\n this.delayMs = delayMs\n }\n\n /**\n * Register a query to be batched. Returns a promise that resolves\n * when the batch is executed and this specific query's result is available.\n */\n public register(query: CubeQuery): Promise<CubeResultSet> {\n return new Promise<CubeResultSet>((resolve, reject) => {\n // Add query to queue\n this.queue.push({ query, resolve, reject })\n\n // Schedule flush if not already scheduled\n if (!this.flushScheduled) {\n this.scheduleFlush()\n }\n })\n }\n\n /**\n * Schedule a flush after a short delay to collect multiple queries.\n * The delay allows queries from lazy-loaded portlets that become visible\n * during the same scroll action to be batched together.\n */\n private scheduleFlush(): void {\n this.flushScheduled = true\n\n setTimeout(() => {\n this.flush()\n }, this.delayMs)\n }\n\n /**\n * Execute all queued queries as a batch and resolve individual promises\n */\n private async flush(): Promise<void> {\n // Reset state\n this.flushScheduled = false\n\n // Take current queue and clear it\n const currentQueue = this.queue.slice()\n this.queue = []\n\n if (currentQueue.length === 0) {\n return\n }\n\n try {\n // Extract queries\n const queries = currentQueue.map(item => item.query)\n\n // Execute batch\n const results = await this.batchExecutor(queries)\n\n // Resolve individual promises with their corresponding results\n currentQueue.forEach((item, index) => {\n const result = results[index]\n\n // Check if this specific query had an error\n if (result && 'error' in result && result.error) {\n item.reject(new Error(result.error as string))\n } else {\n item.resolve(result)\n }\n })\n } catch (error) {\n // If entire batch fails, reject all queries\n currentQueue.forEach(item => {\n item.reject(error instanceof Error ? error : new Error(String(error)))\n })\n }\n }\n\n /**\n * Get current queue size (useful for debugging)\n */\n public getQueueSize(): number {\n return this.queue.length\n }\n\n /**\n * Clear the queue (useful for testing/cleanup)\n */\n public clear(): void {\n this.queue = []\n this.flushScheduled = false\n }\n}\n","/**\n * CubeApiProvider - Stable API Context Layer\n *\n * Provides the CubeClient API instance that only changes on authentication updates.\n * Isolated from metadata and feature contexts to prevent unnecessary re-renders.\n */\n\nimport { createContext, useContext, useState, useMemo, useCallback, useEffect, type ReactNode } from 'react'\nimport { createCubeClient, type CubeClient } from '../client/CubeClient'\nimport type { CubeQueryOptions, CubeApiOptions } from '../types'\nimport { BatchCoordinator } from '../client/BatchCoordinator'\n\ninterface CubeApiContextValue {\n cubeApi: CubeClient\n options?: CubeQueryOptions\n updateApiConfig: (apiOptions: CubeApiOptions, token?: string) => void\n batchCoordinator: BatchCoordinator | null\n enableBatching: boolean\n}\n\nconst CubeApiContext = createContext<CubeApiContextValue | null>(null)\n\ninterface CubeApiProviderProps {\n apiOptions: CubeApiOptions\n token?: string\n options?: CubeQueryOptions\n enableBatching?: boolean\n batchDelayMs?: number\n children: ReactNode\n}\n\nexport function CubeApiProvider({\n apiOptions: initialApiOptions,\n token: initialToken,\n options = {},\n enableBatching = true,\n batchDelayMs = 100,\n children\n}: CubeApiProviderProps) {\n const baseConfig = useMemo(\n () => ({ apiOptions: initialApiOptions, token: initialToken }),\n [initialApiOptions, initialToken]\n )\n const [overrideConfig, setOverrideConfig] = useState<{\n apiOptions: CubeApiOptions\n token?: string\n } | null>(null)\n\n useEffect(() => {\n setOverrideConfig(null)\n }, [baseConfig])\n\n const config = overrideConfig ?? baseConfig\n\n // Create CubeClient - only recreates when config changes\n const cubeApi = useMemo(() =>\n createCubeClient(config.token, config.apiOptions),\n [config.apiOptions, config.token]\n )\n\n // Create BatchCoordinator - only recreates when cubeApi or batching config changes\n const batchCoordinator = useMemo(() => {\n if (!enableBatching) return null\n return new BatchCoordinator((queries) => cubeApi.batchLoad(queries), batchDelayMs)\n }, [enableBatching, cubeApi, batchDelayMs])\n\n // Stable callback for updating config\n const updateApiConfig = useCallback((newApiOptions: CubeApiOptions, newToken?: string) => {\n setOverrideConfig({ apiOptions: newApiOptions, token: newToken })\n }, [])\n\n // Memoize context value - only changes when cubeApi/options change\n const value = useMemo(() => ({\n cubeApi,\n options,\n updateApiConfig,\n batchCoordinator,\n enableBatching\n }), [cubeApi, options, updateApiConfig, batchCoordinator, enableBatching])\n\n return (\n <CubeApiContext.Provider value={value}>\n {children}\n </CubeApiContext.Provider>\n )\n}\n\nexport function useCubeApi() {\n const context = useContext(CubeApiContext)\n if (!context) {\n throw new Error('useCubeApi must be used within CubeApiProvider')\n }\n return context\n}\n","/**\n * useCubeMetaQuery - TanStack Query hook for cube metadata\n *\n * Replaces manual caching in useCubeMeta with TanStack Query's built-in\n * cache management. Provides:\n * - Automatic caching with configurable stale time\n * - Built-in loading and error states\n * - Automatic refetch on mount (if stale)\n * - Manual refetch capability\n *\n * This hook wraps the existing CubeClient.meta() method.\n */\n\nimport { useQuery, useQueryClient } from '@tanstack/react-query'\nimport { useCubeApi } from '../../providers/CubeApiProvider'\nimport type { CubeMeta, FieldLabelMap } from '../../types'\n\n// Query key for cube metadata\nexport const CUBE_META_QUERY_KEY = ['cube', 'meta'] as const\n\n/**\n * Build a field label map from cube metadata\n * Maps field names to their display titles\n */\nfunction buildLabelMap(meta: CubeMeta): FieldLabelMap {\n const labelMap: FieldLabelMap = {}\n\n meta.cubes.forEach((cube) => {\n // Add measures\n cube.measures.forEach((measure) => {\n labelMap[measure.name] = measure.title || measure.shortTitle || measure.name\n })\n\n // Add dimensions\n cube.dimensions.forEach((dimension) => {\n labelMap[dimension.name] = dimension.title || dimension.shortTitle || dimension.name\n })\n\n // Add segments\n cube.segments.forEach((segment) => {\n labelMap[segment.name] = segment.title || segment.shortTitle || segment.name\n })\n })\n\n return labelMap\n}\n\nexport interface UseCubeMetaQueryOptions {\n /**\n * Whether to skip the query (useful for conditional fetching)\n * @default false\n */\n enabled?: boolean\n /**\n * Stale time in milliseconds (how long before data is considered stale)\n * @default 5 * 60 * 1000 (5 minutes)\n */\n staleTime?: number\n}\n\nexport interface UseCubeMetaQueryResult {\n /** Cube metadata */\n meta: CubeMeta | null\n /** Field label map for quick lookups */\n labelMap: FieldLabelMap\n /** Whether the query is loading */\n isLoading: boolean\n /** Whether the query is fetching (includes background refetch) */\n isFetching: boolean\n /** Error if the query failed */\n error: Error | null\n /** Manually refetch the metadata */\n refetch: () => void\n /** Get a field's display label */\n getFieldLabel: (fieldName: string) => string\n}\n\n/**\n * TanStack Query hook for fetching cube metadata\n *\n * Usage:\n * ```tsx\n * const { meta, labelMap, isLoading, error, refetch } = useCubeMetaQuery()\n * ```\n */\nexport function useCubeMetaQuery(\n options: UseCubeMetaQueryOptions = {}\n): UseCubeMetaQueryResult {\n const { enabled = true, staleTime = 5 * 60 * 1000 } = options\n const { cubeApi } = useCubeApi()\n const queryClient = useQueryClient()\n\n const query = useQuery({\n queryKey: CUBE_META_QUERY_KEY,\n queryFn: async () => {\n const metaData = await cubeApi.meta()\n const labelMap = buildLabelMap(metaData)\n return { meta: metaData, labelMap }\n },\n enabled,\n staleTime,\n // Keep data in cache for 15 minutes after it becomes unused\n gcTime: 15 * 60 * 1000,\n })\n\n // Extract data from query result\n const meta = query.data?.meta ?? null\n const labelMap = query.data?.labelMap ?? {}\n\n // Stable refetch function\n const refetch = () => {\n queryClient.invalidateQueries({ queryKey: CUBE_META_QUERY_KEY })\n }\n\n // Stable getFieldLabel function\n const getFieldLabel = (fieldName: string): string => {\n return labelMap[fieldName] || fieldName\n }\n\n return {\n meta,\n labelMap,\n isLoading: query.isLoading,\n isFetching: query.isFetching,\n error: query.error,\n refetch,\n getFieldLabel,\n }\n}\n\n/**\n * Prefetch cube metadata - useful for eager loading\n *\n * Usage:\n * ```tsx\n * const queryClient = useQueryClient()\n * await prefetchCubeMeta(queryClient, cubeApi)\n * ```\n */\nexport async function prefetchCubeMeta(\n queryClient: ReturnType<typeof useQueryClient>,\n cubeApi: ReturnType<typeof useCubeApi>['cubeApi']\n): Promise<void> {\n await queryClient.prefetchQuery({\n queryKey: CUBE_META_QUERY_KEY,\n queryFn: async () => {\n const metaData = await cubeApi.meta()\n const labelMap = buildLabelMap(metaData)\n return { meta: metaData, labelMap }\n },\n })\n}\n","/**\n * Default icon definitions using Iconify icon sets\n * Uses HeroIcons (outline/solid) and Tabler icons via Iconify\n */\n\n// HeroIcons Outline\nimport xMark from '@iconify-icons/heroicons-outline/x-mark'\nimport plus from '@iconify-icons/heroicons-outline/plus'\nimport pencil from '@iconify-icons/heroicons-outline/pencil'\nimport trash from '@iconify-icons/heroicons-outline/trash'\nimport arrowPath from '@iconify-icons/heroicons-outline/arrow-path'\nimport clipboardDocument from '@iconify-icons/heroicons-outline/clipboard-document'\nimport documentDuplicate from '@iconify-icons/heroicons-outline/document-duplicate'\nimport cog from '@iconify-icons/heroicons-outline/cog'\nimport funnel from '@iconify-icons/heroicons-outline/funnel'\nimport share from '@iconify-icons/heroicons-outline/share'\nimport chevronUp from '@iconify-icons/heroicons-outline/chevron-up'\nimport chevronDown from '@iconify-icons/heroicons-outline/chevron-down'\nimport chevronLeft from '@iconify-icons/heroicons-outline/chevron-left'\nimport chevronRight from '@iconify-icons/heroicons-outline/chevron-right'\nimport magnifyingGlass from '@iconify-icons/heroicons-outline/magnifying-glass'\nimport bars3 from '@iconify-icons/heroicons-outline/bars-3'\nimport checkCircle from '@iconify-icons/heroicons-outline/check-circle'\nimport exclamationTriangle from '@iconify-icons/heroicons-outline/exclaimation-triangle'\nimport exclamationCircle from '@iconify-icons/heroicons-outline/exclamation-circle'\nimport sparkles from '@iconify-icons/heroicons-outline/sparkles'\nimport eye from '@iconify-icons/heroicons-outline/eye'\nimport eyeSlash from '@iconify-icons/heroicons-outline/eye-slash'\nimport adjustmentsHorizontal from '@iconify-icons/heroicons-outline/adjustments-horizontal'\nimport computerDesktop from '@iconify-icons/heroicons-outline/computer-desktop'\nimport tableCells from '@iconify-icons/heroicons-outline/table-cells'\nimport link from '@iconify-icons/heroicons-outline/link'\nimport arrowRight from '@iconify-icons/heroicons-outline/arrow-right'\nimport sun from '@iconify-icons/heroicons-outline/sun'\nimport moon from '@iconify-icons/heroicons-outline/moon'\nimport ellipsisHorizontal from '@iconify-icons/heroicons-outline/ellipsis-horizontal'\nimport documentText from '@iconify-icons/heroicons-outline/document-text'\nimport bookOpen from '@iconify-icons/heroicons-outline/book-open'\nimport codeBracket from '@iconify-icons/heroicons-outline/code-bracket'\nimport swatch from '@iconify-icons/heroicons-outline/swatch'\n\n// HeroIcons Solid (for field type indicators and measures)\nimport chartBarSolid from '@iconify-icons/heroicons-solid/chart-bar'\nimport tagSolid from '@iconify-icons/heroicons-solid/tag'\nimport calendarSolid from '@iconify-icons/heroicons-solid/calendar'\nimport rectangleGroupSolid from '@iconify-icons/heroicons-solid/rectangle-group'\nimport playSolid from '@iconify-icons/heroicons-solid/play'\nimport checkSolid from '@iconify-icons/heroicons-solid/check'\nimport scaleSolid from '@iconify-icons/heroicons-solid/scale'\nimport arrowDownCircleSolid from '@iconify-icons/heroicons-solid/arrow-down-circle'\nimport arrowUpCircleSolid from '@iconify-icons/heroicons-solid/arrow-up-circle'\nimport arrowTrendingUpSolid from '@iconify-icons/heroicons-solid/arrow-trending-up'\nimport beakerSolid from '@iconify-icons/heroicons-solid/beaker'\nimport bars3BottomLeftSolid from '@iconify-icons/heroicons-solid/bars-3-bottom-left'\nimport fingerPrintSolid from '@iconify-icons/heroicons-solid/finger-print'\nimport chartBarSquareSolid from '@iconify-icons/heroicons-solid/chart-bar-square'\nimport plusCircleSolid from '@iconify-icons/heroicons-solid/plus-circle'\nimport hashtagSolid from '@iconify-icons/heroicons-solid/hashtag'\n\n// Tabler icons for chart types (already using these)\nimport chartBarTabler from '@iconify-icons/tabler/chart-bar'\nimport chartLine from '@iconify-icons/tabler/chart-line'\nimport chartAreaLine from '@iconify-icons/tabler/chart-area-line'\nimport chartPie from '@iconify-icons/tabler/chart-pie'\nimport chartDots2 from '@iconify-icons/tabler/chart-dots-2'\nimport chartBubble from '@iconify-icons/tabler/chart-bubble'\nimport chartRadar from '@iconify-icons/tabler/chart-radar'\nimport radar2 from '@iconify-icons/tabler/radar-2'\nimport chartTreemap from '@iconify-icons/tabler/chart-treemap'\nimport table from '@iconify-icons/tabler/table'\nimport calendarStats from '@iconify-icons/tabler/calendar-stats'\nimport number from '@iconify-icons/tabler/number'\nimport trendingUp from '@iconify-icons/tabler/trending-up'\nimport typography from '@iconify-icons/tabler/typography'\nimport fileText from '@iconify-icons/tabler/file-text'\nimport infoCircle from '@iconify-icons/tabler/info-circle'\nimport selector from '@iconify-icons/tabler/selector'\n\nimport type { IconRegistry } from './types'\n\n/**\n * Default icon registry with all icons used in drizzle-cube\n */\nexport const DEFAULT_ICONS: IconRegistry = {\n // Action icons\n close: { icon: xMark, category: 'action' },\n add: { icon: plus, category: 'action' },\n edit: { icon: pencil, category: 'action' },\n delete: { icon: trash, category: 'action' },\n refresh: { icon: arrowPath, category: 'action' },\n copy: { icon: clipboardDocument, category: 'action' },\n duplicate: { icon: documentDuplicate, category: 'action' },\n settings: { icon: cog, category: 'action' },\n filter: { icon: funnel, category: 'action' },\n share: { icon: share, category: 'action' },\n expand: { icon: chevronDown, category: 'action' },\n collapse: { icon: chevronUp, category: 'action' },\n search: { icon: magnifyingGlass, category: 'action' },\n menu: { icon: bars3, category: 'action' },\n run: { icon: playSolid, category: 'action' },\n check: { icon: checkSolid, category: 'action' },\n link: { icon: link, category: 'action' },\n eye: { icon: eye, category: 'action' },\n eyeOff: { icon: eyeSlash, category: 'action' },\n adjustments: { icon: adjustmentsHorizontal, category: 'action' },\n desktop: { icon: computerDesktop, category: 'action' },\n table: { icon: tableCells, category: 'action' },\n sun: { icon: sun, category: 'action' },\n moon: { icon: moon, category: 'action' },\n ellipsisHorizontal: { icon: ellipsisHorizontal, category: 'action' },\n documentText: { icon: documentText, category: 'action' },\n bookOpen: { icon: bookOpen, category: 'action' },\n codeBracket: { icon: codeBracket, category: 'action' },\n swatch: { icon: swatch, category: 'action' },\n\n // Field type icons (solid for visual distinction)\n measure: { icon: chartBarSolid, category: 'field' },\n dimension: { icon: tagSolid, category: 'field' },\n timeDimension: { icon: calendarSolid, category: 'field' },\n segment: { icon: rectangleGroupSolid, category: 'field' },\n\n // Chart type icons (Tabler - keeping existing visuals)\n chartBar: { icon: chartBarTabler, category: 'chart' },\n chartLine: { icon: chartLine, category: 'chart' },\n chartArea: { icon: chartAreaLine, category: 'chart' },\n chartPie: { icon: chartPie, category: 'chart' },\n chartScatter: { icon: chartDots2, category: 'chart' },\n chartBubble: { icon: chartBubble, category: 'chart' },\n chartRadar: { icon: chartRadar, category: 'chart' },\n chartRadialBar: { icon: radar2, category: 'chart' },\n chartTreemap: { icon: chartTreemap, category: 'chart' },\n chartTable: { icon: table, category: 'chart' },\n chartActivityGrid: { icon: calendarStats, category: 'chart' },\n chartKpiNumber: { icon: number, category: 'chart' },\n chartKpiDelta: { icon: trendingUp, category: 'chart' },\n chartKpiText: { icon: typography, category: 'chart' },\n chartMarkdown: { icon: fileText, category: 'chart' },\n chartFunnel: { icon: funnel, category: 'chart' },\n\n // Measure type icons (solid)\n measureCount: { icon: bars3BottomLeftSolid, category: 'measure' },\n measureCountDistinct: { icon: fingerPrintSolid, category: 'measure' },\n measureCountDistinctApprox: { icon: chartBarSquareSolid, category: 'measure' },\n measureSum: { icon: plusCircleSolid, category: 'measure' },\n measureAvg: { icon: scaleSolid, category: 'measure' },\n measureMin: { icon: arrowDownCircleSolid, category: 'measure' },\n measureMax: { icon: arrowUpCircleSolid, category: 'measure' },\n measureRunningTotal: { icon: arrowTrendingUpSolid, category: 'measure' },\n measureCalculated: { icon: beakerSolid, category: 'measure' },\n measureNumber: { icon: hashtagSolid, category: 'measure' },\n\n // State icons\n success: { icon: checkCircle, category: 'state' },\n warning: { icon: exclamationTriangle, category: 'state' },\n error: { icon: exclamationCircle, category: 'state' },\n info: { icon: infoCircle, category: 'state' },\n loading: { icon: arrowPath, category: 'state' },\n sparkles: { icon: sparkles, category: 'state' },\n\n // Navigation icons\n chevronUp: { icon: chevronUp, category: 'navigation' },\n chevronDown: { icon: chevronDown, category: 'navigation' },\n chevronLeft: { icon: chevronLeft, category: 'navigation' },\n chevronRight: { icon: chevronRight, category: 'navigation' },\n chevronUpDown: { icon: selector, category: 'navigation' },\n arrowUp: { icon: arrowUpCircleSolid, category: 'navigation' },\n arrowDown: { icon: arrowDownCircleSolid, category: 'navigation' },\n arrowRight: { icon: arrowRight, category: 'navigation' },\n arrowPath: { icon: arrowPath, category: 'navigation' },\n}\n","/**\n * Icon Registry - Centralized icon management following the theme pattern\n * Allows users to override any icon with their own implementations\n */\n\nimport { Icon } from '@iconify/react'\nimport type { IconifyIcon } from '@iconify/types'\nimport type { ComponentType } from 'react'\nimport { DEFAULT_ICONS } from './defaultIcons'\nimport type { IconRegistry, IconName, IconDefinition, IconCategory, IconProps, PartialIconRegistry } from './types'\n\n// Internal mutable registry - starts with defaults\nlet _registry: IconRegistry = { ...DEFAULT_ICONS }\n\n// Cache for icon components to avoid recreating on every getIcon() call\n// This prevents React from unmounting/remounting icons on each render\nconst _iconComponentCache = new Map<IconName, ComponentType<IconProps>>()\n\n/**\n * Get the full icon registry\n */\nexport function getIconRegistry(): IconRegistry {\n return _registry\n}\n\n/**\n * Get a specific icon as a React component\n * @param name The icon name from the registry\n * @returns A React component that renders the icon (cached for stable references)\n */\nexport function getIcon(name: IconName): ComponentType<IconProps> {\n // Check cache first for stable component references\n const cached = _iconComponentCache.get(name)\n if (cached) {\n return cached\n }\n\n const iconDef = _registry[name]\n if (!iconDef) {\n console.warn(`Icon \"${name}\" not found in registry, using fallback`)\n // Create and cache fallback component\n const FallbackIcon = ({ className, ...props }: IconProps) => (\n <Icon icon={_registry.info.icon} className={className} {...props} />\n )\n return FallbackIcon\n }\n\n // Create and cache the icon component\n const IconComponent = ({ className, ...props }: IconProps) => (\n <Icon icon={iconDef.icon} className={className} {...props} />\n )\n _iconComponentCache.set(name, IconComponent)\n return IconComponent\n}\n\n/**\n * Get icon data directly (for use with Iconify's Icon component)\n * @param name The icon name from the registry\n * @returns The IconifyIcon data\n */\nexport function getIconData(name: IconName): IconifyIcon {\n return _registry[name]?.icon ?? _registry.info.icon\n}\n\n/**\n * Override a single icon in the registry\n * @param name The icon name to override\n * @param icon The new IconifyIcon data\n */\nexport function setIcon(name: IconName, icon: IconifyIcon): void {\n if (_registry[name]) {\n _registry[name] = {\n ..._registry[name],\n icon\n }\n // Clear cache for this icon so it gets recreated with new definition\n _iconComponentCache.delete(name)\n }\n}\n\n/**\n * Register multiple icon overrides at once\n * @param overrides Partial registry with icons to override\n */\nexport function registerIcons(overrides: PartialIconRegistry): void {\n for (const [key, value] of Object.entries(overrides)) {\n if (value && key in _registry) {\n const iconKey = key as IconName\n\n // Check if it's a raw IconifyIcon or a full IconDefinition\n if ('body' in value) {\n // It's an IconifyIcon\n _registry[iconKey] = {\n ..._registry[iconKey],\n icon: value as IconifyIcon\n }\n } else {\n // It's a partial IconDefinition\n const partial = value as Partial<IconDefinition>\n _registry[iconKey] = {\n ..._registry[iconKey],\n ...partial,\n icon: partial.icon ?? _registry[iconKey].icon\n }\n }\n // Clear cache for this icon so it gets recreated with new definition\n _iconComponentCache.delete(iconKey)\n }\n }\n}\n\n/**\n * Reset the registry to default icons\n */\nexport function resetIcons(): void {\n _registry = { ...DEFAULT_ICONS }\n // Clear all cached icon components\n _iconComponentCache.clear()\n}\n\n/**\n * Get all icons in a specific category\n * @param category The icon category to filter by\n * @returns Record of icon names to their components\n */\nexport function getIconsByCategory(category: IconCategory): Record<string, ComponentType<IconProps>> {\n const result: Record<string, ComponentType<IconProps>> = {}\n\n for (const [key, value] of Object.entries(_registry)) {\n if (value.category === category) {\n result[key] = getIcon(key as IconName)\n }\n }\n\n return result\n}\n\n/**\n * Helper to get measure type icon component\n * @param measureType The measure type (count, avg, sum, etc.)\n * @returns React component for the icon\n */\nexport function getMeasureTypeIcon(measureType: string | undefined): ComponentType<IconProps> {\n const typeMap: Record<string, IconName> = {\n count: 'measureCount',\n countDistinct: 'measureCountDistinct',\n countDistinctApprox: 'measureCountDistinctApprox',\n sum: 'measureSum',\n avg: 'measureAvg',\n min: 'measureMin',\n max: 'measureMax',\n runningTotal: 'measureRunningTotal',\n calculated: 'measureCalculated',\n number: 'measureNumber'\n }\n\n const iconName = typeMap[measureType || ''] || 'measureCount'\n return getIcon(iconName)\n}\n\n/**\n * Helper to get chart type icon component\n * @param chartType The chart type (bar, line, pie, etc.)\n * @returns React component for the icon\n */\nexport function getChartTypeIcon(chartType: string): ComponentType<IconProps> {\n const typeMap: Record<string, IconName> = {\n bar: 'chartBar',\n line: 'chartLine',\n area: 'chartArea',\n pie: 'chartPie',\n scatter: 'chartScatter',\n bubble: 'chartBubble',\n radar: 'chartRadar',\n radialBar: 'chartRadialBar',\n treemap: 'chartTreemap',\n table: 'chartTable',\n activityGrid: 'chartActivityGrid',\n kpiNumber: 'chartKpiNumber',\n kpiDelta: 'chartKpiDelta',\n kpiText: 'chartKpiText',\n markdown: 'chartMarkdown',\n funnel: 'chartFunnel'\n }\n\n const iconName = typeMap[chartType] || 'chartBar'\n return getIcon(iconName)\n}\n\n/**\n * Helper to get field type icon component\n * @param fieldType The field type (measure, dimension, timeDimension)\n * @returns React component for the icon\n */\nexport function getFieldTypeIcon(fieldType: string): ComponentType<IconProps> {\n const typeMap: Record<string, IconName> = {\n measure: 'measure',\n dimension: 'dimension',\n timeDimension: 'timeDimension',\n time: 'timeDimension',\n segment: 'segment'\n }\n\n const iconName = typeMap[fieldType] || 'dimension'\n return getIcon(iconName)\n}\n","/**\n * LoadingIndicator Component\n *\n * A centralized, theme-aware loading spinner that uses CSS variables\n * for consistent styling across all drizzle-cube components.\n *\n * Can be overridden at the Dashboard or Portlet level by passing a\n * custom loadingComponent prop.\n */\n\nexport interface LoadingIndicatorProps {\n /** Size variant: 'sm' (24px), 'md' (32px), 'lg' (48px) */\n size?: 'sm' | 'md' | 'lg'\n /** Additional CSS classes */\n className?: string\n}\n\nconst sizeClasses = {\n sm: 'h-6 w-6',\n md: 'h-8 w-8',\n lg: 'h-12 w-12'\n}\n\nexport default function LoadingIndicator({\n size = 'md',\n className = ''\n}: LoadingIndicatorProps) {\n return (\n <div\n className={`animate-spin rounded-full border-b-2 ${sizeClasses[size]} ${className}`}\n style={{ borderBottomColor: 'var(--dc-primary)' }}\n role=\"status\"\n aria-label=\"Loading\"\n />\n )\n}\n","/**\n * CubeMetaProvider - Metadata Context Layer\n *\n * Provides cube metadata (meta, labelMap) isolated from API layer.\n * This prevents components from re-rendering when metadata loads\n * if they only need API access.\n *\n * Uses TanStack Query for metadata fetching with built-in caching.\n */\n\nimport { createContext, useContext, useCallback, useMemo, type ReactNode } from 'react'\nimport { useCubeMetaQuery } from '../hooks/queries/useCubeMetaQuery'\nimport type { CubeMeta, FieldLabelMap } from '../types'\n\nexport interface CubeMetaContextValue {\n meta: CubeMeta | null\n labelMap: FieldLabelMap\n metaLoading: boolean\n metaError: string | null\n getFieldLabel: (fieldName: string) => string\n refetchMeta: () => void\n}\n\nexport const CubeMetaContext = createContext<CubeMetaContextValue | null>(null)\n\ninterface CubeMetaProviderProps {\n children: ReactNode\n}\n\nexport function CubeMetaProvider({ children }: CubeMetaProviderProps) {\n // Use TanStack Query hook for metadata fetching\n const {\n meta,\n labelMap,\n isLoading: metaLoading,\n error,\n refetch,\n getFieldLabel: getFieldLabelFromQuery\n } = useCubeMetaQuery()\n\n // Convert error to string for backward compatibility\n const metaError = error ? (error instanceof Error ? error.message : String(error)) : null\n\n // Wrap refetch to match expected signature\n const refetchMeta = useCallback(() => {\n refetch()\n }, [refetch])\n\n // Create stable getFieldLabel that reads from current labelMap\n const getFieldLabel = useCallback((fieldName: string): string => {\n return getFieldLabelFromQuery(fieldName)\n }, [getFieldLabelFromQuery])\n\n // Memoize context value to prevent unnecessary re-renders\n const value = useMemo(() => ({\n meta,\n labelMap,\n metaLoading,\n metaError,\n getFieldLabel,\n refetchMeta\n }), [meta, labelMap, metaLoading, metaError, getFieldLabel, refetchMeta])\n\n return (\n <CubeMetaContext.Provider value={value}>\n {children}\n </CubeMetaContext.Provider>\n )\n}\n\nexport function useCubeMeta() {\n const context = useContext(CubeMetaContext)\n if (!context) {\n throw new Error('useCubeMeta must be used within CubeMetaProvider')\n }\n return context\n}\n","/**\n * CubeFeaturesProvider - Feature Flags Context Layer\n *\n * Provides feature configuration isolated from API and metadata layers.\n * This prevents components from re-rendering when feature flags change\n * if they don't use features.\n */\n\nimport { createContext, useContext, useState, useMemo, useCallback, type ReactNode } from 'react'\nimport type { FeaturesConfig, DashboardLayoutMode } from '../types'\n\ninterface CubeFeaturesContextValue {\n features: FeaturesConfig\n dashboardModes: DashboardLayoutMode[]\n updateFeatures: (newFeatures: Partial<FeaturesConfig>) => void\n}\n\nconst CubeFeaturesContext = createContext<CubeFeaturesContextValue | null>(null)\n\ninterface CubeFeaturesProviderProps {\n features?: FeaturesConfig\n dashboardModes?: DashboardLayoutMode[]\n children: ReactNode\n}\n\nconst DEFAULT_FEATURES: FeaturesConfig = {\n enableAI: true,\n aiEndpoint: '/api/ai/generate',\n showSchemaDiagram: false,\n useAnalysisBuilder: false,\n editToolbar: 'both',\n floatingToolbarPosition: 'right'\n}\n\nexport function CubeFeaturesProvider({\n features: initialFeatures,\n dashboardModes = ['rows', 'grid'],\n children\n}: CubeFeaturesProviderProps) {\n // Merge passed features with defaults so new features get default values\n const [features, setFeatures] = useState<FeaturesConfig>(() => ({\n ...DEFAULT_FEATURES,\n ...initialFeatures\n }))\n\n const updateFeatures = useCallback((newFeatures: Partial<FeaturesConfig>) => {\n setFeatures(prev => ({ ...prev, ...newFeatures }))\n }, [])\n\n const value = useMemo(() => ({\n features,\n dashboardModes,\n updateFeatures\n }), [features, dashboardModes, updateFeatures])\n\n return (\n <CubeFeaturesContext.Provider value={value}>\n {children}\n </CubeFeaturesContext.Provider>\n )\n}\n\nexport function useCubeFeatures() {\n const context = useContext(CubeFeaturesContext)\n if (!context) {\n throw new Error('useCubeFeatures must be used within CubeFeaturesProvider')\n }\n return context\n}\n","/**\n * CubeProvider - Backward Compatibility Wrapper\n *\n * This provider wraps the three specialized context providers (API, Meta, Features)\n * to maintain 100% backward compatibility with existing code using useCubeContext().\n *\n * New code should use the specialized hooks (useCubeApi, useCubeMeta, useCubeFeatures)\n * for better performance and selective re-rendering.\n *\n * Also includes TanStack Query's QueryClientProvider for data fetching in\n * AnalysisBuilder and other components that use TanStack Query hooks.\n */\n\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport { CubeApiProvider, useCubeApi } from './CubeApiProvider'\nimport { CubeMetaProvider, useCubeMeta } from './CubeMetaProvider'\nimport { CubeFeaturesProvider, useCubeFeatures } from './CubeFeaturesProvider'\nimport type { CubeQueryOptions, CubeApiOptions, FeaturesConfig, DashboardLayoutMode, CubeMeta, FieldLabelMap } from '../types'\nimport type { CubeClient } from '../client/CubeClient'\nimport type { BatchCoordinator } from '../client/BatchCoordinator'\n\nconst DEFAULT_API_OPTIONS: CubeApiOptions = { apiUrl: '/cubejs-api/v1' }\n\nexport const createCubeQueryClient = () => new QueryClient({\n defaultOptions: {\n queries: {\n // Stale time: 5 minutes (matches existing cache duration)\n staleTime: 5 * 60 * 1000,\n // GC time: 15 minutes\n gcTime: 15 * 60 * 1000,\n // Retry failed queries up to 3 times\n retry: 3,\n // Don't refetch on window focus by default (can be overridden per-query)\n refetchOnWindowFocus: false,\n },\n },\n})\n\n// Legacy default client (useful for tests or explicit injection)\nexport const queryClient = createCubeQueryClient()\n\n// Backward compatible interface - merges all three contexts\ninterface CubeContextValue {\n cubeApi: CubeClient\n options?: CubeQueryOptions\n meta: CubeMeta | null\n labelMap: FieldLabelMap\n metaLoading: boolean\n metaError: string | null\n getFieldLabel: (fieldName: string) => string\n refetchMeta: () => void\n updateApiConfig: (apiOptions: CubeApiOptions, token?: string) => void\n features: FeaturesConfig\n batchCoordinator: BatchCoordinator | null\n enableBatching: boolean\n dashboardModes: DashboardLayoutMode[]\n}\n\ninterface CubeProviderProps {\n cubeApi?: CubeClient\n apiOptions?: CubeApiOptions\n token?: string\n options?: CubeQueryOptions\n features?: FeaturesConfig\n dashboardModes?: DashboardLayoutMode[]\n enableBatching?: boolean\n batchDelayMs?: number // Delay in ms to collect queries before batching (default: 100)\n queryClient?: QueryClient\n children: ReactNode\n}\n\n/**\n * CubeProvider - Three-layer context wrapper\n *\n * Wraps children in three isolated context providers for optimal performance:\n * 1. CubeApiProvider - Stable API layer (changes only on auth)\n * 2. CubeMetaProvider - Metadata layer (changes on metadata load)\n * 3. CubeFeaturesProvider - Feature flags layer (changes on feature updates)\n */\nexport function CubeProvider({\n cubeApi: _initialCubeApi, // Intentionally unused - for backward compatibility\n apiOptions,\n token,\n options,\n features,\n dashboardModes,\n enableBatching,\n batchDelayMs,\n queryClient: providedQueryClient,\n children\n}: CubeProviderProps) {\n const [internalQueryClient] = useState(() => createCubeQueryClient())\n const queryClient = providedQueryClient ?? internalQueryClient\n\n return (\n <QueryClientProvider client={queryClient}>\n <CubeApiProvider\n apiOptions={apiOptions || DEFAULT_API_OPTIONS}\n token={token}\n options={options}\n enableBatching={enableBatching}\n batchDelayMs={batchDelayMs}\n >\n <CubeMetaProvider>\n <CubeFeaturesProvider features={features} dashboardModes={dashboardModes}>\n {children}\n </CubeFeaturesProvider>\n </CubeMetaProvider>\n </CubeApiProvider>\n </QueryClientProvider>\n )\n}\n\n/**\n * useCubeContext - Backward compatible hook\n *\n * Merges all three contexts into a single object for backward compatibility.\n * Components using this hook will re-render when ANY context changes.\n *\n * For better performance, use specialized hooks:\n * - useCubeApi() - Only re-renders on API changes\n * - useCubeMeta() - Only re-renders on metadata changes\n * - useCubeFeatures() - Only re-renders on feature changes\n */\nexport function useCubeContext(): CubeContextValue {\n const api = useCubeApi()\n const meta = useCubeMeta()\n const featuresCtx = useCubeFeatures()\n\n return useMemo(() => ({\n ...api,\n ...meta,\n features: featuresCtx.features,\n dashboardModes: featuresCtx.dashboardModes\n }), [api, meta, featuresCtx])\n}\n\n// Re-export specialized hooks for better tree-shaking and performance\nexport { useCubeApi, useCubeMeta, useCubeFeatures }\n\n// Export factory for testing and advanced use cases\nexport { createCubeQueryClient as createQueryClient }\n","/**\n * SectionHeading Component\n *\n * A reusable section heading for the Analysis Builder panels.\n * Provides consistent styling that can be easily adjusted in one place.\n */\n\nimport type { ReactNode } from 'react'\n\ninterface SectionHeadingProps {\n children: ReactNode\n /** Optional className to add additional styles */\n className?: string\n}\n\n/**\n * Consistent section heading style for Analysis Builder panels.\n * Change the styles here to update all section headings at once.\n */\nexport default function SectionHeading({ children, className = '' }: SectionHeadingProps) {\n return (\n <h3 className={`text-sm font-semibold text-dc-primary uppercase tracking-wide ${className}`}>\n {children}\n </h3>\n )\n}\n","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the bar chart type\n */\nexport const barChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('bar'),\n description: 'Compare values across categories',\n useCase: 'Best for comparing discrete categories, showing rankings, or displaying changes over time',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Categories)',\n description: 'Dimensions and time dimensions for grouping',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop dimensions & time dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for bar heights',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here',\n enableDualAxis: true\n },\n {\n key: 'series',\n label: 'Series (Split into Multiple Series)',\n description: 'Dimensions to create separate data series',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here to split data into series'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'stackType',\n label: 'Stacking',\n type: 'select',\n defaultValue: 'none',\n options: [\n { value: 'none', label: 'None' },\n { value: 'normal', label: 'Stacked' },\n { value: 'percent', label: 'Stacked 100%' }\n ],\n description: 'How to stack multiple bar series'\n },\n {\n key: 'target',\n label: 'Target Values',\n type: 'string',\n placeholder: 'e.g., 100 or 50,75 for spread',\n description: 'Single value or comma-separated values to spread across X-axis'\n },\n {\n key: 'leftYAxisFormat',\n label: 'Left Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for left Y-axis'\n },\n {\n key: 'rightYAxisFormat',\n label: 'Right Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for right Y-axis'\n }\n ]\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the line chart type\n */\nexport const lineChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('line'),\n description: 'Show trends and changes over time',\n useCase: 'Best for continuous data, trends, time series, and showing relationships between multiple series',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Time/Categories)',\n description: 'Time dimensions or dimensions for X-axis',\n mandatory: true,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop time dimensions or dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for line values',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here',\n enableDualAxis: true\n },\n {\n key: 'series',\n label: 'Series (Multiple Lines)',\n description: 'Dimensions to create separate lines',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here for multiple lines'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'connectNulls',\n label: 'Connect Nulls',\n type: 'boolean',\n defaultValue: false,\n description: 'Draw continuous line through missing data points'\n },\n {\n key: 'target',\n label: 'Target Values',\n type: 'string',\n placeholder: 'e.g., 100 or 50,75 for spread',\n description: 'Single value or comma-separated values to spread across X-axis'\n },\n {\n key: 'priorPeriodStyle',\n label: 'Prior Period Line Style',\n type: 'select',\n defaultValue: 'dashed',\n options: [\n { value: 'dashed', label: 'Dashed' },\n { value: 'dotted', label: 'Dotted' },\n { value: 'solid', label: 'Solid' }\n ],\n description: 'Line style for prior period in comparison mode'\n },\n {\n key: 'priorPeriodOpacity',\n label: 'Prior Period Opacity',\n type: 'number',\n defaultValue: 0.5,\n min: 0.1,\n max: 1,\n step: 0.1,\n description: 'Opacity for prior period lines (0.1 to 1)'\n },\n {\n key: 'leftYAxisFormat',\n label: 'Left Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for left Y-axis'\n },\n {\n key: 'rightYAxisFormat',\n label: 'Right Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for right Y-axis'\n }\n ]\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the area chart type\n */\nexport const areaChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('area'),\n description: 'Emphasize magnitude of change over time',\n useCase: 'Best for showing cumulative totals, volume changes, or stacked comparisons over time',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis (Time/Categories)',\n description: 'Time dimensions or dimensions for X-axis',\n mandatory: true,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop time dimensions or dimensions here'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis (Values)',\n description: 'Measures for area values',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures here',\n enableDualAxis: true\n },\n {\n key: 'series',\n label: 'Series (Stack Areas)',\n description: 'Dimensions to create stacked areas',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions here for stacked areas'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'stackType',\n label: 'Stacking',\n type: 'select',\n defaultValue: 'none',\n options: [\n { value: 'none', label: 'None' },\n { value: 'normal', label: 'Stacked' },\n { value: 'percent', label: 'Stacked 100%' }\n ],\n description: 'How to stack multiple area series'\n },\n {\n key: 'connectNulls',\n label: 'Connect Nulls',\n type: 'boolean',\n defaultValue: false,\n description: 'Draw continuous line through missing data points'\n },\n {\n key: 'target',\n label: 'Target Values',\n type: 'string',\n placeholder: 'e.g., 100 or 50,75 for spread',\n description: 'Single value or comma-separated values to spread across X-axis'\n },\n {\n key: 'leftYAxisFormat',\n label: 'Left Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for left Y-axis'\n },\n {\n key: 'rightYAxisFormat',\n label: 'Right Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for right Y-axis'\n }\n ]\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the pie chart type\n */\nexport const pieChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('pie'),\n description: 'Show proportions of a whole',\n useCase: 'Best for showing percentage distribution or composition of a total (limit to 5-7 slices)',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Categories',\n description: 'Dimension for pie slices',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop a dimension for categories'\n },\n {\n key: 'yAxis',\n label: 'Values',\n description: 'Measure for slice sizes',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for values'\n }\n ],\n displayOptions: ['showLegend', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'leftYAxisFormat',\n label: 'Value Format',\n type: 'axisFormat',\n description: 'Number formatting for values'\n }\n ]\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the scatter chart type\n */\nexport const scatterChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('scatter'),\n description: 'Reveal correlations between variables',\n useCase: 'Best for identifying patterns, correlations, outliers, and relationships between two measures',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis',\n description: 'Measure or dimension for X position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension', 'timeDimension', 'measure'],\n emptyText: 'Drop a field for X-axis'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis',\n description: 'Measure for Y position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for Y-axis'\n },\n {\n key: 'series',\n label: 'Series (Color Groups)',\n description: 'Dimension to color points by category',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop a dimension to color points'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'xAxisFormat',\n label: 'X-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for X-axis'\n },\n {\n key: 'leftYAxisFormat',\n label: 'Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for Y-axis'\n }\n ]\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the bubble chart type\n */\nexport const bubbleChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('bubble'),\n description: 'Compare three dimensions of data',\n useCase: 'Best for showing relationships between three variables (X, Y, and size), market analysis',\n dropZones: [\n {\n key: 'xAxis',\n label: 'X-Axis',\n description: 'Horizontal axis position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension', 'timeDimension', 'measure'],\n emptyText: 'Drop a field for X-axis position'\n },\n {\n key: 'yAxis',\n label: 'Y-Axis', \n description: 'Vertical axis position',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for Y-axis position'\n },\n {\n key: 'sizeField',\n label: 'Bubble Radius',\n description: 'Size of bubbles based on this measure',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for bubble size'\n },\n {\n key: 'series',\n label: 'Bubble Labels',\n description: 'Field to use for bubble labels and identification',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop a dimension for bubble labels'\n },\n {\n key: 'colorField',\n label: 'Bubble Colour',\n description: 'Color bubbles by this field (optional)',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension', 'measure'],\n emptyText: 'Drop a field for bubble color (optional)'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'minBubbleSize', 'maxBubbleSize', 'bubbleOpacity', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'xAxisFormat',\n label: 'X-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for X-axis'\n },\n {\n key: 'leftYAxisFormat',\n label: 'Y-Axis Format',\n type: 'axisFormat',\n description: 'Number formatting for Y-axis and values'\n }\n ]\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the radar chart type\n */\nexport const radarChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('radar'),\n description: 'Compare multiple metrics across categories',\n useCase: 'Best for multivariate comparisons, performance metrics, strengths/weaknesses analysis',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Axes (Categories)',\n description: 'Dimensions for radar axes',\n mandatory: true,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions for radar axes'\n },\n {\n key: 'yAxis',\n label: 'Values',\n description: 'Measures for radar values',\n mandatory: true,\n acceptTypes: ['measure'],\n emptyText: 'Drop measures for values'\n },\n {\n key: 'series',\n label: 'Series (Multiple Shapes)',\n description: 'Dimensions to create multiple radar shapes',\n mandatory: false,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions for multiple shapes'\n }\n ],\n displayOptions: ['showLegend', 'showGrid', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'leftYAxisFormat',\n label: 'Value Format',\n type: 'axisFormat',\n description: 'Number formatting for values'\n }\n ]\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the radial bar chart type\n */\nexport const radialBarChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('radialBar'),\n description: 'Circular progress and KPI visualization',\n useCase: 'Best for showing progress toward goals, KPIs, or comparing percentages in a compact form',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Categories',\n description: 'Dimensions for radial segments',\n mandatory: true,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions for categories'\n },\n {\n key: 'yAxis',\n label: 'Values',\n description: 'Measures for radial bar lengths',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for values'\n }\n ],\n displayOptions: ['showLegend', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'leftYAxisFormat',\n label: 'Value Format',\n type: 'axisFormat',\n description: 'Number formatting for values'\n }\n ]\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the treemap chart type\n */\nexport const treemapChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('treemap'),\n description: 'Visualize hierarchical data with nested rectangles',\n useCase: 'Best for showing part-to-whole relationships in hierarchical data, disk usage, budget allocation',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Categories',\n description: 'Dimensions for treemap rectangles',\n mandatory: true,\n acceptTypes: ['dimension'],\n emptyText: 'Drop dimensions for categories'\n },\n {\n key: 'yAxis',\n label: 'Size',\n description: 'Measure for rectangle sizes',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for size'\n },\n {\n key: 'series',\n label: 'Color Groups',\n description: 'Dimension to color rectangles by category',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Drop a dimension for color grouping'\n }\n ],\n displayOptions: ['showLegend', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'leftYAxisFormat',\n label: 'Value Format',\n type: 'axisFormat',\n description: 'Number formatting for size values'\n }\n ]\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the data table type\n */\nexport const dataTableConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('table'),\n description: 'Display detailed tabular data',\n useCase: 'Best for precise values, detailed analysis, sortable/filterable data exploration',\n dropZones: [\n {\n key: 'xAxis',\n label: 'Columns',\n description: 'All fields to display as columns',\n mandatory: false,\n acceptTypes: ['dimension', 'timeDimension', 'measure'],\n emptyText: 'Drop fields to display as columns (or leave empty for all)'\n }\n ],\n displayOptions: ['hideHeader'],\n displayOptionsConfig: [\n {\n key: 'leftYAxisFormat',\n label: 'Value Format',\n type: 'axisFormat',\n description: 'Number formatting for numeric values'\n }\n ]\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the activity grid chart type\n */\nexport const activityGridChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('activityGrid'),\n description: 'GitHub-style activity grid showing temporal patterns across different time scales',\n useCase: 'Best for visualizing activity patterns over time. Supports hour (3hr blocks × days), day (days × weeks), week (weeks × months), month (months × quarters), and quarter (quarters × years) granularities',\n dropZones: [\n {\n key: 'dateField',\n label: 'Time Dimension',\n description: 'Time field that determines grid structure (granularity affects layout)',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['timeDimension'],\n emptyText: 'Drop a time dimension (granularity affects grid structure)'\n },\n {\n key: 'valueField',\n label: 'Activity Measure',\n description: 'Measure used for activity intensity (color coding)',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure for activity intensity'\n }\n ],\n displayOptions: ['showLabels', 'showTooltip', 'hideHeader'],\n displayOptionsConfig: [\n {\n key: 'fitToWidth',\n label: 'Fit to Width',\n type: 'boolean',\n defaultValue: false,\n description: 'Automatically size blocks to fill portlet width and height while maintaining aspect ratio'\n }\n ],\n validate: (config) => {\n const { dateField, valueField } = config\n \n if (!dateField || (Array.isArray(dateField) && dateField.length === 0)) {\n return {\n isValid: false,\n message: 'Time dimension is required for activity grid'\n }\n }\n \n if (!valueField || (Array.isArray(valueField) && valueField.length === 0)) {\n return {\n isValid: false,\n message: 'Activity measure is required for intensity mapping'\n }\n }\n \n return { isValid: true }\n }\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the KPI Number chart type\n */\nexport const kpiNumberConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('kpiNumber'),\n description: 'Display key performance indicators as large numbers',\n useCase: 'Perfect for showing important metrics like revenue, user count, or other key business metrics in a prominent, easy-to-read format',\n dropZones: [\n {\n key: 'yAxis',\n label: 'Value',\n description: 'Measure to display as KPI number',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure here'\n }\n ],\n displayOptionsConfig: [\n {\n key: 'target',\n label: 'Target Value',\n type: 'string',\n placeholder: 'e.g., 100',\n description: 'Target value to compare against (first value used if multiple provided)'\n },\n {\n key: 'prefix',\n label: 'Prefix',\n type: 'string',\n placeholder: 'e.g., $, €, #',\n description: 'Text to display before the number'\n },\n {\n key: 'suffix',\n label: 'Suffix',\n type: 'string',\n placeholder: 'e.g., %, units, items',\n description: 'Text to display after the number'\n },\n {\n key: 'decimals',\n label: 'Decimal Places',\n type: 'number',\n defaultValue: 0,\n min: 0,\n max: 10,\n step: 1,\n description: 'Number of decimal places to display'\n },\n {\n key: 'valueColorIndex',\n label: 'Value Color',\n type: 'paletteColor',\n defaultValue: 0,\n description: 'Color from the dashboard palette for the KPI value text'\n },\n {\n key: 'useLastCompletePeriod',\n label: 'Use Last Complete Period',\n type: 'boolean',\n defaultValue: true,\n description: 'Exclude current incomplete period from aggregation (e.g., partial week/month)'\n },\n {\n key: 'skipLastPeriod',\n label: 'Skip Last Period',\n type: 'boolean',\n defaultValue: false,\n description: 'Always exclude the last period regardless of completeness'\n }\n ],\n displayOptions: ['hideHeader']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the KPI Delta chart type\n */\nexport const kpiDeltaConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('kpiDelta'),\n description: 'Display change between latest and previous values with trend indicators',\n useCase: 'Perfect for showing performance changes over time, such as revenue growth, user acquisition changes, or other metrics where the trend and delta are more important than the absolute value',\n dropZones: [\n {\n key: 'yAxis',\n label: 'Value',\n description: 'Measure to track changes for',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure here'\n },\n {\n key: 'xAxis',\n label: 'Dimension (optional)',\n description: 'Dimension for ordering data (typically time)',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension', 'timeDimension'],\n emptyText: 'Drop a dimension for ordering'\n }\n ],\n displayOptionsConfig: [\n {\n key: 'prefix',\n label: 'Prefix',\n type: 'string',\n placeholder: 'e.g., $, €, #',\n description: 'Text to display before the number'\n },\n {\n key: 'suffix',\n label: 'Suffix',\n type: 'string',\n placeholder: 'e.g., %, units, items',\n description: 'Text to display after the number'\n },\n {\n key: 'decimals',\n label: 'Decimal Places',\n type: 'number',\n defaultValue: 1,\n min: 0,\n max: 10,\n step: 1,\n description: 'Number of decimal places to display'\n },\n {\n key: 'positiveColorIndex',\n label: 'Positive Change Color',\n type: 'paletteColor',\n defaultValue: 2, // Typically green in most palettes\n description: 'Color for positive changes (increases)'\n },\n {\n key: 'negativeColorIndex',\n label: 'Negative Change Color', \n type: 'paletteColor',\n defaultValue: 3, // Typically red in most palettes\n description: 'Color for negative changes (decreases)'\n },\n {\n key: 'showHistogram',\n label: 'Show Variance Histogram',\n type: 'boolean',\n defaultValue: true,\n description: 'Display historical variance chart below the delta'\n },\n {\n key: 'useLastCompletePeriod',\n label: 'Use Last Complete Period',\n type: 'boolean',\n defaultValue: true,\n description: 'Exclude current incomplete period from delta calculation (e.g., partial week/month)'\n },\n {\n key: 'skipLastPeriod',\n label: 'Skip Last Period',\n type: 'boolean',\n defaultValue: false,\n description: 'Always exclude the last period regardless of completeness'\n }\n ],\n displayOptions: ['hideHeader'],\n validate: (config: any) => {\n if (!config.yAxis || (Array.isArray(config.yAxis) && config.yAxis.length === 0)) {\n return {\n isValid: false,\n message: 'A measure is required for KPI Delta charts'\n }\n }\n \n return { isValid: true }\n }\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the KPI Text chart type\n */\nexport const kpiTextConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('kpiText'),\n description: 'Display key performance indicators as customizable text',\n useCase: 'Perfect for showing metrics with custom formatting, combining multiple values, or displaying contextual KPI information using templates',\n dropZones: [\n {\n key: 'yAxis',\n label: 'Value',\n description: 'Measure to display in the KPI text template',\n mandatory: true,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Drop a measure here'\n }\n ],\n displayOptionsConfig: [\n {\n key: 'template',\n label: 'Text Template',\n type: 'string',\n placeholder: 'e.g., Total Revenue: ${value}',\n description: 'Template for displaying the text. Use ${value} to insert the measure value.'\n },\n {\n key: 'decimals',\n label: 'Decimal Places',\n type: 'number',\n defaultValue: 0,\n min: 0,\n max: 10,\n step: 1,\n description: 'Number of decimal places to display for numeric values'\n },\n {\n key: 'valueColorIndex',\n label: 'Value Color',\n type: 'paletteColor',\n defaultValue: 0,\n description: 'Color from the dashboard palette for the KPI value text'\n }\n ],\n displayOptions: ['hideHeader']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the Markdown chart type\n */\nexport const markdownConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('markdown'),\n description: 'Display custom markdown content with formatting',\n useCase: 'Perfect for adding documentation, notes, instructions, or formatted text to dashboards',\n skipQuery: true, // This chart doesn't require a valid query\n dropZones: [], // No drop zones needed for markdown content\n displayOptionsConfig: [\n {\n key: 'content',\n label: 'Markdown Content',\n type: 'string',\n placeholder: '# Welcome\\n\\nAdd your **markdown** content here:\\n\\n- Lists with bullets\\n- [Links](https://example.com)\\n- *Italic* and **bold** text',\n description: 'Enter markdown text. Supports headers (#), bold (**text**), italic (*text*), links ([text](url)), and lists (- item).'\n },\n {\n key: 'accentColorIndex',\n label: 'Accent Color',\n type: 'paletteColor',\n defaultValue: 0,\n description: 'Color from the dashboard palette for headers, bullets, and links'\n },\n {\n key: 'fontSize',\n label: 'Font Size',\n type: 'select',\n defaultValue: 'medium',\n options: [\n { value: 'small', label: 'Small' },\n { value: 'medium', label: 'Medium' },\n { value: 'large', label: 'Large' }\n ],\n description: 'Overall text size for the markdown content'\n },\n {\n key: 'alignment',\n label: 'Text Alignment',\n type: 'select',\n defaultValue: 'left',\n options: [\n { value: 'left', label: 'Left' },\n { value: 'center', label: 'Center' },\n { value: 'right', label: 'Right' }\n ],\n description: 'Horizontal alignment of the markdown content'\n }\n ],\n displayOptions: ['hideHeader']\n}","import type { ChartTypeConfig } from '../../charts/chartConfigs'\nimport { getChartTypeIcon } from '../../icons'\n\n/**\n * Configuration for the funnel chart type\n *\n * Funnel charts visualize sequential conversion data.\n * They work with data from useFunnelQuery which provides\n * pre-calculated step names, values, and conversion rates.\n */\nexport const funnelChartConfig: ChartTypeConfig = {\n icon: getChartTypeIcon('funnel'),\n description: 'Show conversion through sequential steps',\n useCase: 'Best for visualizing user journey funnels, sales pipelines, or multi-step processes',\n dropZones: [\n // Funnel charts don't use traditional drop zones since they work with\n // pre-calculated funnel data from useFunnelQuery. The steps are defined\n // in the funnel configuration, not through drag-and-drop.\n // However, we keep xAxis and yAxis for compatibility with chart system.\n {\n key: 'xAxis',\n label: 'Step Name',\n description: 'Step names (auto-populated from funnel steps)',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['dimension'],\n emptyText: 'Steps defined in funnel config'\n },\n {\n key: 'yAxis',\n label: 'Step Count',\n description: 'Count at each step (auto-calculated)',\n mandatory: false,\n maxItems: 1,\n acceptTypes: ['measure'],\n emptyText: 'Counts calculated from funnel execution'\n }\n ],\n displayOptions: ['hideHeader'],\n displayOptionsConfig: [\n {\n key: 'hideSummaryFooter',\n label: 'Hide Summary Footer',\n type: 'boolean',\n defaultValue: false,\n description: 'Hide the summary footer showing steps count and overall conversion'\n },\n {\n key: 'funnelOrientation',\n label: 'Orientation',\n type: 'buttonGroup',\n defaultValue: 'horizontal',\n options: [\n { value: 'horizontal', label: 'Horizontal' },\n { value: 'vertical', label: 'Vertical' }\n ]\n },\n {\n key: 'funnelStepLabels',\n label: 'Step Labels',\n type: 'stringArray',\n placeholder: 'Enter label for each step (one per line)',\n description: 'Custom labels for funnel steps (e.g., \"Signup\", \"Activation\", \"Purchase\"). Leave empty to use default step names.'\n }\n ]\n}\n","import type { FieldLabelMap, AxisFormatConfig } from '../types'\n\n// Utility function to check if a value is a valid numeric value (not null, undefined, or NaN)\n// This is used to preserve null values instead of converting them to 0\nexport function isValidNumericValue(value: any): boolean {\n return value !== null && value !== undefined && !isNaN(Number(value))\n}\n\n// Utility function to parse numeric value from data, preserving nulls\n// Returns null for null/undefined/NaN values, otherwise returns the numeric value\nexport function parseNumericValue(value: any): number | null {\n if (value === null || value === undefined) return null\n const num = typeof value === 'string' ? parseFloat(value) : Number(value)\n return isNaN(num) ? null : num\n}\n\n// Utility function to format numeric values for display in charts\n// Rounds to at most 2 decimal places, preserves integers\nexport function formatNumericValue(value: any): string {\n if (value === null || value === undefined) return 'No data'\n const num = typeof value === 'number' ? value : parseFloat(value)\n if (isNaN(num)) return String(value)\n if (Number.isInteger(num)) return num.toLocaleString()\n // Round to at most 2 decimal places, remove trailing zeros\n return parseFloat(num.toFixed(2)).toLocaleString()\n}\n\n/**\n * Format a numeric value for axis/tooltip display with configurable formatting\n *\n * @param value - The numeric value to format\n * @param config - Optional formatting configuration\n * @param locale - Optional locale string (defaults to browser locale)\n * @returns Formatted string representation of the value\n *\n * @example\n * formatAxisValue(1250000, { unit: 'currency', abbreviate: true }) // \"$1.25M\"\n * formatAxisValue(0.75, { unit: 'percent', decimals: 1 }) // \"75.0%\"\n * formatAxisValue(1234567, { abbreviate: true, decimals: 2 }) // \"1.23M\"\n */\nexport function formatAxisValue(\n value: number | null | undefined,\n config?: AxisFormatConfig,\n locale?: string\n): string {\n // Handle null/undefined\n if (value === null || value === undefined) {\n return 'No data'\n }\n\n // Handle non-numeric values\n const num = typeof value === 'number' ? value : parseFloat(String(value))\n if (isNaN(num)) {\n return String(value)\n }\n\n // Handle special cases\n if (!isFinite(num)) {\n return num > 0 ? '∞' : '-∞'\n }\n\n // Get locale (default to browser locale)\n const effectiveLocale = locale || (typeof navigator !== 'undefined' ? navigator.language : 'en-US')\n\n // If no config provided, use default formatting\n if (!config) {\n return formatNumericValue(value)\n }\n\n const { unit, abbreviate = true, decimals, customPrefix, customSuffix } = config\n\n // Calculate the display value and suffix for abbreviation\n // Default to true for abbreviation when config is provided\n let displayValue = num\n let abbreviationSuffix = ''\n\n if (abbreviate) {\n const absNum = Math.abs(num)\n if (absNum >= 1_000_000_000) {\n displayValue = num / 1_000_000_000\n abbreviationSuffix = 'B'\n } else if (absNum >= 1_000_000) {\n displayValue = num / 1_000_000\n abbreviationSuffix = 'M'\n } else if (absNum >= 1_000) {\n displayValue = num / 1_000\n abbreviationSuffix = 'K'\n }\n }\n\n // Determine decimal places\n // If decimals is undefined, use auto (2 for non-integers, 0 for integers after abbreviation)\n const effectiveDecimals = decimals !== undefined\n ? decimals\n : (Number.isInteger(displayValue) ? 0 : 2)\n\n // Format based on unit type\n switch (unit) {\n case 'currency': {\n // Use Intl.NumberFormat for currency\n // Currency code is determined by locale (USD for en-US, EUR for de-DE, etc.)\n const currencyCode = getCurrencyCodeForLocale(effectiveLocale)\n\n if (abbreviate && abbreviationSuffix) {\n // For abbreviated currency, format the number part and add suffix\n const formatted = new Intl.NumberFormat(effectiveLocale, {\n style: 'currency',\n currency: currencyCode,\n minimumFractionDigits: effectiveDecimals,\n maximumFractionDigits: effectiveDecimals,\n }).format(displayValue)\n // Insert abbreviation suffix before any trailing currency symbol or at end\n // Handle both \"$1.25\" -> \"$1.25M\" and \"1.25 €\" -> \"1.25M €\"\n const parts = new Intl.NumberFormat(effectiveLocale, {\n style: 'currency',\n currency: currencyCode,\n }).formatToParts(displayValue)\n const hasTrailingCurrency = parts[parts.length - 1]?.type === 'currency'\n if (hasTrailingCurrency) {\n // Currency symbol is at the end (e.g., \"1.25 €\")\n return formatted.replace(/(\\s*[^\\d\\s]+)$/, abbreviationSuffix + '$1')\n }\n return formatted + abbreviationSuffix\n }\n\n return new Intl.NumberFormat(effectiveLocale, {\n style: 'currency',\n currency: currencyCode,\n minimumFractionDigits: effectiveDecimals,\n maximumFractionDigits: effectiveDecimals,\n }).format(displayValue)\n }\n\n case 'percent': {\n // Format as percentage (multiply by 100 if value is 0-1 range, otherwise use as-is)\n // Assume values > 1 are already percentages, values <= 1 need multiplication\n const percentValue = Math.abs(displayValue) <= 1 && !abbreviate ? displayValue * 100 : displayValue\n const formatted = new Intl.NumberFormat(effectiveLocale, {\n minimumFractionDigits: effectiveDecimals,\n maximumFractionDigits: effectiveDecimals,\n }).format(percentValue)\n return formatted + abbreviationSuffix + '%'\n }\n\n case 'custom': {\n // Apply custom prefix/suffix\n const prefix = customPrefix || ''\n const suffix = customSuffix || ''\n const formatted = new Intl.NumberFormat(effectiveLocale, {\n minimumFractionDigits: effectiveDecimals,\n maximumFractionDigits: effectiveDecimals,\n }).format(displayValue)\n return prefix + formatted + abbreviationSuffix + suffix\n }\n\n case 'number':\n default: {\n // Standard number formatting with locale-aware grouping\n const formatted = new Intl.NumberFormat(effectiveLocale, {\n minimumFractionDigits: effectiveDecimals,\n maximumFractionDigits: effectiveDecimals,\n }).format(displayValue)\n return formatted + abbreviationSuffix\n }\n }\n}\n\n/**\n * Get the currency code for a given locale\n * Maps common locales to their default currency\n */\nfunction getCurrencyCodeForLocale(locale: string): string {\n // Extract language and region from locale (e.g., \"en-US\" -> [\"en\", \"US\"])\n const parts = locale.split('-')\n const region = parts[1]?.toUpperCase()\n\n // Map regions to currencies\n const currencyMap: Record<string, string> = {\n 'US': 'USD',\n 'CA': 'CAD',\n 'GB': 'GBP',\n 'UK': 'GBP',\n 'AU': 'AUD',\n 'NZ': 'NZD',\n 'EU': 'EUR',\n 'DE': 'EUR',\n 'FR': 'EUR',\n 'IT': 'EUR',\n 'ES': 'EUR',\n 'NL': 'EUR',\n 'BE': 'EUR',\n 'AT': 'EUR',\n 'IE': 'EUR',\n 'PT': 'EUR',\n 'FI': 'EUR',\n 'JP': 'JPY',\n 'CN': 'CNY',\n 'KR': 'KRW',\n 'IN': 'INR',\n 'BR': 'BRL',\n 'MX': 'MXN',\n 'CH': 'CHF',\n 'SE': 'SEK',\n 'NO': 'NOK',\n 'DK': 'DKK',\n 'PL': 'PLN',\n 'RU': 'RUB',\n 'ZA': 'ZAR',\n 'SG': 'SGD',\n 'HK': 'HKD',\n 'TW': 'TWD',\n 'TH': 'THB',\n 'MY': 'MYR',\n 'PH': 'PHP',\n 'ID': 'IDR',\n 'VN': 'VND',\n 'AE': 'AED',\n 'SA': 'SAR',\n 'IL': 'ILS',\n 'TR': 'TRY',\n }\n\n return currencyMap[region] || 'USD'\n}\n\n/**\n * Create a tick formatter function for Recharts axes\n * Returns a function that can be used as tickFormatter prop\n */\nexport function createAxisTickFormatter(config?: AxisFormatConfig): (value: any) => string {\n return (value: any) => formatAxisValue(value, config)\n}\n\n// Utility function to get field label from field name\nexport function getFieldLabel(fieldName: string, labelMap: FieldLabelMap): string {\n return labelMap[fieldName] || fieldName\n}\n\n// Utility function to transform series keys to use labels\nexport function transformSeriesKeysWithLabels(seriesKeys: string[], labelMap: FieldLabelMap): string[] {\n return seriesKeys.map(key => getFieldLabel(key, labelMap))\n}\n\n// Utility function to format time values for better display using known granularity\nexport function formatTimeValue(value: any, granularity?: string): string {\n if (!value) return String(value || 'Unknown')\n \n const str = String(value)\n \n // Check if it's a timestamp (ISO format or PostgreSQL format)\n // Handles formats like: \"2025-04-01T00:00:00.000\" or \"2023-02-01 00:00:00+00\"\n if (str.match(/^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}:\\d{2}/)) {\n // Convert PostgreSQL format to ISO format if needed\n let isoStr = str\n if (str.includes(' ')) {\n // Convert \"2023-02-01 00:00:00+00\" to \"2023-02-01T00:00:00Z\"\n isoStr = str.replace(' ', 'T').replace('+00', 'Z').replace(/\\+\\d{2}:\\d{2}$/, 'Z')\n }\n // Ensure the timestamp ends with 'Z' if not present\n if (!isoStr.endsWith('Z') && !isoStr.includes('+')) {\n isoStr = isoStr + 'Z'\n }\n const date = new Date(isoStr)\n \n // Ensure we're working with valid date\n if (isNaN(date.getTime())) {\n return str\n }\n \n // Use UTC methods on the properly UTC-parsed date\n const year = date.getUTCFullYear()\n const month = String(date.getUTCMonth() + 1).padStart(2, '0')\n const day = String(date.getUTCDate()).padStart(2, '0')\n const hours = date.getUTCHours()\n const minutes = date.getUTCMinutes()\n \n // Format based on known granularity if provided\n if (granularity) {\n switch (granularity.toLowerCase()) {\n case 'year':\n return `${year}`\n case 'quarter': {\n const quarter = Math.floor(date.getUTCMonth() / 3) + 1\n return `${year}-Q${quarter}`\n }\n case 'month':\n return `${year}-${month}`\n case 'week':\n // For week, we could calculate week number, but let's use date for simplicity\n return `${year}-${month}-${day}`\n case 'day':\n return `${year}-${month}-${day}`\n case 'hour':\n return `${year}-${month}-${day} ${String(hours).padStart(2, '0')}:00`\n case 'minute':\n return `${year}-${month}-${day} ${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`\n default:\n // Unknown granularity, fall back to heuristic\n break\n }\n }\n \n // Fallback heuristic if granularity not provided or unknown\n const seconds = date.getUTCSeconds()\n const milliseconds = date.getUTCMilliseconds()\n \n // If it's the first day of the month at exactly midnight UTC, it's likely a month granularity\n if (day === '01' && hours === 0 && minutes === 0 && seconds === 0 && milliseconds === 0) {\n // Check if it's also first month of a quarter (quarter granularity)\n if (month === '01' || month === '04' || month === '07' || month === '10') {\n const quarter = Math.floor(date.getUTCMonth() / 3) + 1\n return `${year}-Q${quarter}`\n }\n // Month granularity\n return `${year}-${month}`\n }\n \n // If it's exactly midnight UTC, it's likely a day granularity\n if (hours === 0 && minutes === 0 && seconds === 0 && milliseconds === 0) {\n return `${year}-${month}-${day}`\n }\n \n // If it has time components, include them (hour/minute granularity)\n if (minutes === 0 && seconds === 0 && milliseconds === 0) {\n // Hour granularity\n return `${year}-${month}-${day} ${String(hours).padStart(2, '0')}:00`\n }\n \n // Full timestamp\n return `${year}-${month}-${day} ${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`\n }\n \n // Return as-is if not a timestamp\n return str\n}\n\n// Helper function to get granularity for a field from the query timeDimensions\nexport function getFieldGranularity(queryObject: any, fieldName: string): string | undefined {\n try {\n if (queryObject?.timeDimensions) {\n // Find the timeDimension that matches this field\n const timeDim = queryObject.timeDimensions.find((td: any) => {\n // Check if field name matches the dimension or dimension with granularity suffix\n return fieldName === td.dimension || \n fieldName.startsWith(td.dimension.replace('.', '_')) ||\n fieldName === `${td.dimension}_${td.granularity}`\n })\n \n if (timeDim?.granularity) {\n return timeDim.granularity\n }\n }\n \n // Fallback: extract granularity from field name suffix if present\n const granularityMatch = fieldName.match(/_([a-z]+)$/)\n if (granularityMatch) {\n const suffix = granularityMatch[1]\n // Only return if it's a valid granularity\n if (['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second'].includes(suffix)) {\n return suffix\n }\n }\n \n return undefined\n } catch {\n return undefined\n }\n}\n\n// Transform data for charts with proper type handling\n// NOTE: Preserves null values to allow charts to handle gaps/missing data appropriately\nexport function transformChartData(\n data: any[],\n xAxisField: string,\n yAxisFields: string[],\n queryObject: any,\n getFieldLabelFn: (fieldName: string) => string = (fieldName) => fieldName\n) {\n if (!data || data.length === 0) return []\n\n const granularity = getFieldGranularity(queryObject, xAxisField)\n\n return data.map((row: any) => {\n const transformed: any = {\n name: formatTimeValue(row[xAxisField], granularity) || row[xAxisField] || 'Unknown',\n }\n\n yAxisFields.forEach(field => {\n const displayName = getFieldLabelFn(field)\n // Preserve null values instead of converting to 0\n transformed[displayName] = parseNumericValue(row[field])\n })\n\n return transformed\n })\n}\n\nexport interface ChartSeriesResult {\n data: any[]\n seriesKeys: string[]\n hasDimensions: boolean\n}\n\n// Advanced data transformation that handles both measures and dimensions on Y-axis\n// NOTE: Preserves null values to allow charts to handle gaps/missing data appropriately\nexport function transformChartDataWithSeries(\n data: any[],\n xAxisField: string,\n yAxisFields: string[],\n queryObject: any,\n seriesFields?: string[], // New optional parameter for explicit series fields\n getFieldLabelFn: (fieldName: string) => string = (fieldName) => fieldName // Function to get field labels\n): ChartSeriesResult {\n if (!data || data.length === 0) {\n return { data: [], seriesKeys: [], hasDimensions: false }\n }\n\n const originalQuery = queryObject || {}\n const queryDimensions = [\n ...(originalQuery.dimensions || []),\n ...(originalQuery.timeDimensions?.map((td: any) => td.dimension) || [])\n ]\n const queryMeasures = originalQuery.measures || []\n\n // Use explicit series fields if provided, otherwise no dimension-based series\n const yAxisMeasures = yAxisFields.filter(field => queryMeasures.includes(field))\n const yAxisDimensions = (seriesFields || []).filter(field => queryDimensions.includes(field))\n\n // Handle complex case with dimensions on Y-axis\n if (yAxisDimensions.length > 0) {\n // Group data by X-axis field and create separate series for dimension values\n const groupedData: { [key: string]: any } = {}\n\n data.forEach((row: any) => {\n const granularity = getFieldGranularity(queryObject, xAxisField)\n const xValue = formatTimeValue(row[xAxisField], granularity) || row[xAxisField] || 'Unknown'\n if (!groupedData[xValue]) {\n groupedData[xValue] = { name: String(xValue) }\n }\n\n // Add measures - preserve nulls for individual measures\n yAxisMeasures.forEach(measure => {\n const displayName = getFieldLabelFn(measure)\n const measureValue = parseNumericValue(row[measure])\n\n // For aggregation: sum non-null values, preserve null if all are null\n if (measureValue !== null) {\n const currentValue = groupedData[xValue][displayName]\n groupedData[xValue][displayName] = (currentValue === null || currentValue === undefined)\n ? measureValue\n : currentValue + measureValue\n } else if (!(displayName in groupedData[xValue])) {\n // Only set to null if no value exists yet\n groupedData[xValue][displayName] = null\n }\n })\n\n // Add dimensions as separate series (aggregate measure values by dimension)\n yAxisDimensions.forEach(dimension => {\n const dimValue = row[dimension]\n if (dimValue !== undefined && dimValue !== null) {\n const seriesName = String(dimValue)\n // Aggregate the first measure for this dimension value, or use totalCost if available\n const measureToAggregate = yAxisMeasures[0] || queryMeasures.find((m: string) =>\n m.includes('totalCost') || m.includes('count') || m.includes('sum')\n ) || queryMeasures[0]\n\n if (measureToAggregate) {\n const measureValue = parseNumericValue(row[measureToAggregate])\n\n // For dimension series: sum non-null values, preserve null if all are null\n if (measureValue !== null) {\n const currentValue = groupedData[xValue][seriesName]\n groupedData[xValue][seriesName] = (currentValue === null || currentValue === undefined)\n ? measureValue\n : currentValue + measureValue\n } else if (!(seriesName in groupedData[xValue])) {\n // Only set to null if no value exists yet\n groupedData[xValue][seriesName] = null\n }\n }\n }\n })\n })\n \n const chartData = Object.values(groupedData)\n \n // Get all series keys for rendering\n // When dimensions are on Y-axis, only show dimension series, not measures\n // The measures are the values being aggregated for each dimension series\n const dimensionSeries = Array.from(new Set(\n data.flatMap((row: any) => \n yAxisDimensions.map(dimension => {\n const value = row[dimension]\n return value !== undefined && value !== null \n ? String(value)\n : null\n }).filter((value): value is string => value !== null)\n )\n ))\n \n return {\n data: chartData,\n seriesKeys: dimensionSeries,\n hasDimensions: true\n }\n }\n \n // Standard measures-only path\n const chartData = transformChartData(data, xAxisField, yAxisFields, queryObject, getFieldLabelFn)\n const seriesKeys = yAxisFields.map(field => getFieldLabelFn(field))\n \n return {\n data: chartData,\n seriesKeys,\n hasDimensions: false\n }\n}","/**\n * AxisFormatControls Component\n *\n * A reusable component for configuring axis number formatting.\n * Provides controls for unit type, abbreviation, decimal places, and custom labels.\n */\n\nimport { useMemo } from 'react'\nimport SectionHeading from '../AnalysisBuilder/SectionHeading'\nimport type { AxisFormatConfig } from '../../types'\nimport { formatAxisValue } from '../../utils/chartUtils'\n\ninterface AxisFormatControlsProps {\n value: AxisFormatConfig\n onChange: (config: AxisFormatConfig) => void\n axisLabel: string // \"X-Axis\", \"Left Y-Axis\", \"Right Y-Axis\"\n /** Sample value for preview (default: 1250000) */\n previewValue?: number\n}\n\n/**\n * Get the currency symbol for the user's locale\n */\nfunction getLocaleCurrencySymbol(): string {\n const locale = typeof navigator !== 'undefined' ? navigator.language : 'en-US'\n // Format a number as currency and extract just the symbol\n const formatted = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: getCurrencyCodeForLocale(locale),\n currencyDisplay: 'narrowSymbol'\n }).format(0)\n // Extract the currency symbol (remove digits, spaces, and common separators)\n return formatted.replace(/[\\d.,\\s]/g, '').trim() || '$'\n}\n\n/**\n * Get the currency code for a given locale (duplicated from chartUtils for component isolation)\n */\nfunction getCurrencyCodeForLocale(locale: string): string {\n const parts = locale.split('-')\n const region = parts[1]?.toUpperCase()\n const currencyMap: Record<string, string> = {\n 'US': 'USD', 'CA': 'CAD', 'GB': 'GBP', 'UK': 'GBP', 'AU': 'AUD', 'NZ': 'NZD',\n 'EU': 'EUR', 'DE': 'EUR', 'FR': 'EUR', 'IT': 'EUR', 'ES': 'EUR', 'NL': 'EUR',\n 'BE': 'EUR', 'AT': 'EUR', 'IE': 'EUR', 'PT': 'EUR', 'FI': 'EUR',\n 'JP': 'JPY', 'CN': 'CNY', 'KR': 'KRW', 'IN': 'INR', 'BR': 'BRL', 'MX': 'MXN',\n 'CH': 'CHF', 'SE': 'SEK', 'NO': 'NOK', 'DK': 'DKK', 'PL': 'PLN', 'RU': 'RUB',\n 'ZA': 'ZAR', 'SG': 'SGD', 'HK': 'HKD', 'TW': 'TWD', 'TH': 'THB', 'MY': 'MYR',\n 'PH': 'PHP', 'ID': 'IDR', 'VN': 'VND', 'AE': 'AED', 'SA': 'SAR', 'IL': 'ILS', 'TR': 'TRY',\n }\n return currencyMap[region] || 'USD'\n}\n\n/**\n * Single axis format control section\n */\nexport function AxisFormatControls({\n value,\n onChange,\n axisLabel,\n previewValue = 1250000\n}: AxisFormatControlsProps) {\n const config = useMemo(() => value || {}, [value])\n\n // Get locale-aware currency symbol for the button\n const currencySymbol = useMemo(() => getLocaleCurrencySymbol(), [])\n\n // Generate preview of formatted value\n const preview = useMemo(() => {\n return formatAxisValue(previewValue, config)\n }, [previewValue, config])\n\n const handleChange = (updates: Partial<AxisFormatConfig>) => {\n onChange({ ...config, ...updates })\n }\n\n const unitButtons: Array<{ value: AxisFormatConfig['unit']; label: string }> = [\n { value: 'currency', label: currencySymbol },\n { value: 'percent', label: '%' },\n { value: 'number', label: '#' },\n { value: 'custom', label: 'Custom' }\n ]\n\n return (\n <div className=\"space-y-3 pb-4\">\n {/* Axis Header */}\n <SectionHeading>{axisLabel}</SectionHeading>\n\n {/* Label Input */}\n <div className=\"space-y-1\">\n <label className=\"text-xs text-dc-text-secondary\">Label</label>\n <input\n type=\"text\"\n value={config.label || ''}\n onChange={(e) => handleChange({ label: e.target.value || undefined })}\n placeholder=\"Auto-generated label\"\n className=\"w-full px-2 py-1 text-sm border border-dc-border rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n />\n </div>\n\n {/* Unit Type */}\n <div className=\"space-y-1\">\n <label className=\"text-xs text-dc-text-secondary\">Unit</label>\n <div className=\"flex border border-dc-border rounded-sm overflow-hidden\">\n {unitButtons.map((btn) => (\n <button\n key={btn.value}\n type=\"button\"\n onClick={() => handleChange({ unit: btn.value })}\n className={`flex-1 px-2 py-1.5 text-sm font-medium transition-colors ${\n config.unit === btn.value\n ? 'bg-dc-primary text-white'\n : 'bg-dc-surface text-dc-text hover:bg-dc-border'\n }`}\n >\n {btn.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Custom Prefix/Suffix (only when Custom is selected) */}\n {config.unit === 'custom' && (\n <div className=\"flex gap-2\">\n <div className=\"flex-1 space-y-1\">\n <label className=\"text-xs text-dc-text-secondary\">Prefix</label>\n <input\n type=\"text\"\n value={config.customPrefix || ''}\n onChange={(e) => handleChange({ customPrefix: e.target.value || undefined })}\n placeholder=\"e.g., $\"\n className=\"w-full px-2 py-1 text-sm border border-dc-border rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n />\n </div>\n <div className=\"flex-1 space-y-1\">\n <label className=\"text-xs text-dc-text-secondary\">Suffix</label>\n <input\n type=\"text\"\n value={config.customSuffix || ''}\n onChange={(e) => handleChange({ customSuffix: e.target.value || undefined })}\n placeholder=\"e.g., units\"\n className=\"w-full px-2 py-1 text-sm border border-dc-border rounded-sm focus:ring-dc-accent focus:border-dc-accent bg-dc-surface text-dc-text\"\n />\n </div>\n </div>\n )}\n\n {/* Abbreviation Toggle */}\n <div className=\"space-y-1\">\n <label className=\"text-xs text-dc-text-secondary\">Abbreviation</label>\n <div className=\"flex border border-dc-border rounded-sm overflow-hidden\">\n <button\n type=\"button\"\n onClick={() => handleChange({ abbreviate: true })}\n className={`flex-1 px-3 py-1.5 text-sm font-medium transition-colors ${\n config.abbreviate !== false\n ? 'bg-dc-primary text-white'\n : 'bg-dc-surface text-dc-text hover:bg-dc-border'\n }`}\n >\n Yes\n </button>\n <button\n type=\"button\"\n onClick={() => handleChange({ abbreviate: false })}\n className={`flex-1 px-3 py-1.5 text-sm font-medium transition-colors ${\n config.abbreviate === false\n ? 'bg-dc-primary text-white'\n : 'bg-dc-surface text-dc-text hover:bg-dc-border'\n }`}\n >\n No\n </button>\n </div>\n </div>\n\n {/* Decimals */}\n <div className=\"space-y-1\">\n <label className=\"text-xs text-dc-text-secondary\">Decimals</label>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={() => {\n const current = config.decimals ?? 2\n if (current > 0) handleChange({ decimals: current - 1 })\n }}\n disabled={(config.decimals ?? 2) <= 0}\n className=\"flex-1 px-3 py-2 text-sm border border-dc-border rounded-sm bg-dc-surface text-dc-text hover:bg-dc-border disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n >\n ← .0\n </button>\n <button\n type=\"button\"\n onClick={() => {\n const current = config.decimals ?? 2\n if (current < 4) handleChange({ decimals: current + 1 })\n }}\n disabled={(config.decimals ?? 2) >= 4}\n className=\"flex-1 px-3 py-2 text-sm border border-dc-border rounded-sm bg-dc-surface text-dc-text hover:bg-dc-border disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n >\n .00 →\n </button>\n </div>\n </div>\n\n {/* Preview */}\n <div className=\"space-y-1\">\n <label className=\"text-xs text-dc-text-secondary\">Preview</label>\n <div className=\"text-sm font-mono text-dc-text\">\n {preview}\n </div>\n </div>\n </div>\n )\n}\n\ninterface MultiAxisFormatControlsProps {\n displayConfig: {\n xAxisFormat?: AxisFormatConfig\n leftYAxisFormat?: AxisFormatConfig\n rightYAxisFormat?: AxisFormatConfig\n }\n onChange: (updates: {\n xAxisFormat?: AxisFormatConfig\n leftYAxisFormat?: AxisFormatConfig\n rightYAxisFormat?: AxisFormatConfig\n }) => void\n /** Which axes to show controls for */\n showAxes?: {\n xAxis?: boolean\n leftYAxis?: boolean\n rightYAxis?: boolean\n }\n}\n\n/**\n * Container component for multiple axis format controls\n */\nexport function MultiAxisFormatControls({\n displayConfig,\n onChange,\n showAxes = { leftYAxis: true, rightYAxis: true }\n}: MultiAxisFormatControlsProps) {\n return (\n <div className=\"space-y-4\">\n {showAxes.leftYAxis && (\n <AxisFormatControls\n axisLabel=\"Left Y-Axis\"\n value={displayConfig.leftYAxisFormat || {}}\n onChange={(config) =>\n onChange({\n ...displayConfig,\n leftYAxisFormat: Object.keys(config).length > 0 ? config : undefined\n })\n }\n />\n )}\n\n {showAxes.rightYAxis && (\n <AxisFormatControls\n axisLabel=\"Right Y-Axis\"\n value={displayConfig.rightYAxisFormat || {}}\n onChange={(config) =>\n onChange({\n ...displayConfig,\n rightYAxisFormat: Object.keys(config).length > 0 ? config : undefined\n })\n }\n />\n )}\n\n {showAxes.xAxis && (\n <AxisFormatControls\n axisLabel=\"X-Axis\"\n value={displayConfig.xAxisFormat || {}}\n onChange={(config) =>\n onChange({\n ...displayConfig,\n xAxisFormat: Object.keys(config).length > 0 ? config : undefined\n })\n }\n previewValue={2024} // Use a year-like number for X-axis preview\n />\n )}\n </div>\n )\n}\n\nexport default AxisFormatControls\n","/**\n * Optimized hook that only subscribes to field label functionality\n * from CubeMeta context. This prevents re-renders when unrelated\n * contexts (CubeApi, Features) change.\n *\n * Use this instead of useCubeContext() when you only need getFieldLabel.\n */\n\nimport { useContext, useMemo } from 'react'\nimport { CubeMetaContext, type CubeMetaContextValue } from '../providers/CubeMetaProvider'\n\n/**\n * Returns a stable reference to the getFieldLabel function.\n * Components using this hook will only re-render when the field label\n * mapping actually changes, not when unrelated API or feature contexts update.\n *\n * @returns Function to get human-readable label for a field name\n * @throws Error if used outside CubeProvider\n */\nexport function useCubeFieldLabel(): (fieldName: string) => string {\n const context = useContext(CubeMetaContext) as CubeMetaContextValue | null\n\n if (!context) {\n throw new Error('useCubeFieldLabel must be used within CubeProvider')\n }\n\n // Return stable reference - only changes when getFieldLabel itself changes\n return useMemo(() => context.getFieldLabel, [context.getFieldLabel])\n}\n","/**\n * Theme utilities and TypeScript types for drizzle-cube theming system\n */\n\n/**\n * Semantic color tokens used throughout drizzle-cube components\n */\nexport interface ThemeColorTokens {\n // Surface colors\n surface: string\n surfaceSecondary: string\n surfaceTertiary: string\n surfaceHover: string\n\n // Text colors\n text: string\n textSecondary: string\n textMuted: string\n textDisabled: string\n\n // Border colors\n border: string\n borderSecondary: string\n borderHover: string\n\n // Primary colors\n primary: string\n primaryHover: string\n primaryContent: string\n\n // Semantic state colors\n success: string\n successBg: string\n successBorder: string\n\n warning: string\n warningBg: string\n warningBorder: string\n\n error: string\n errorBg: string\n errorBorder: string\n\n info: string\n infoBg: string\n infoBorder: string\n\n // Danger colors\n danger: string\n dangerHover: string\n dangerBg: string\n\n // Overlay colors\n overlay: string\n overlayLight: string\n}\n\n/**\n * Theme configuration interface\n */\nexport interface ThemeConfig {\n name: string\n colors: Partial<ThemeColorTokens>\n}\n\n/**\n * Get the current value of a theme CSS variable\n */\nexport function getThemeVariable(variableName: string): string {\n if (typeof window === 'undefined') return ''\n\n return getComputedStyle(document.documentElement)\n .getPropertyValue(`--dc-${variableName}`)\n .trim()\n}\n\n/**\n * Set a theme CSS variable\n */\nexport function setThemeVariable(variableName: string, value: string): void {\n if (typeof window === 'undefined') return\n\n document.documentElement.style.setProperty(`--dc-${variableName}`, value)\n}\n\n/**\n * Apply a complete theme configuration\n */\nexport function applyTheme(theme: ThemeConfig): void {\n if (typeof window === 'undefined') return\n\n Object.entries(theme.colors).forEach(([key, value]) => {\n if (value) {\n // Convert camelCase to kebab-case\n const cssVarName = key.replace(/[A-Z]/g, letter => `-${letter.toLowerCase()}`)\n setThemeVariable(cssVarName, value)\n }\n })\n}\n\n/**\n * Reset theme to defaults by removing custom properties\n */\nexport function resetTheme(): void {\n if (typeof window === 'undefined') return\n\n const styleElement = document.documentElement.style\n const properties = Array.from(styleElement)\n\n properties.forEach(prop => {\n if (prop.startsWith('--dc-')) {\n styleElement.removeProperty(prop)\n }\n })\n}\n\n/**\n * Theme type definition\n */\nexport type Theme = 'light' | 'dark' | 'neon'\n\n/**\n * Get the current theme\n */\nexport function getTheme(): Theme {\n if (typeof window === 'undefined') return 'light'\n\n // Check localStorage first\n const stored = localStorage.getItem('theme')\n if (stored === 'dark' || stored === 'neon' || stored === 'light') {\n return stored\n }\n\n // Check for data-theme attribute\n const dataTheme = document.documentElement.getAttribute('data-theme')\n if (dataTheme === 'dark' || dataTheme === 'neon') {\n return dataTheme\n }\n\n // Check for dark class\n if (document.documentElement.classList.contains('dark') ||\n document.body.classList.contains('dark')) {\n return 'dark'\n }\n\n // Check for neon class\n if (document.documentElement.classList.contains('neon') ||\n document.body.classList.contains('neon')) {\n return 'neon'\n }\n\n // Check system preference\n if (window.matchMedia('(prefers-color-scheme: dark)').matches) {\n return 'dark'\n }\n\n return 'light'\n}\n\n/**\n * Set the theme\n */\nexport function setTheme(theme: Theme): void {\n if (typeof window === 'undefined') return\n\n // Remove all theme classes\n document.documentElement.classList.remove('dark', 'neon')\n\n // Set data-theme attribute\n document.documentElement.setAttribute('data-theme', theme)\n\n // Add appropriate class for backwards compatibility\n if (theme === 'dark' || theme === 'neon') {\n document.documentElement.classList.add(theme)\n }\n\n // Persist to localStorage\n localStorage.setItem('theme', theme)\n}\n\n/**\n * Detect if dark mode is currently active (backwards compatibility)\n * @deprecated Use getTheme() instead\n */\nexport function isDarkMode(): boolean {\n const theme = getTheme()\n return theme === 'dark' || theme === 'neon'\n}\n\n/**\n * Watch for theme changes\n */\nexport function watchThemeChanges(callback: (theme: Theme) => void): () => void {\n if (typeof window === 'undefined') return () => {}\n\n // Watch for class changes on html element\n const observer = new MutationObserver(() => {\n callback(getTheme())\n })\n\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class', 'data-theme']\n })\n\n // Watch for system preference changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n const mediaListener = () => callback(getTheme())\n mediaQuery.addEventListener('change', mediaListener)\n\n // Return cleanup function\n return () => {\n observer.disconnect()\n mediaQuery.removeEventListener('change', mediaListener)\n }\n}\n\n/**\n * Example theme configurations\n */\nexport const THEME_PRESETS = {\n light: {\n name: 'light' as const,\n colors: {\n surface: '#ffffff',\n surfaceSecondary: '#f9fafb',\n text: '#111827',\n textSecondary: '#374151',\n textMuted: '#6b7280',\n border: '#e5e7eb',\n primary: '#3b82f6',\n primaryHover: '#2563eb',\n }\n },\n dark: {\n name: 'dark' as const,\n colors: {\n surface: '#1e293b',\n surfaceSecondary: '#334155',\n text: '#f1f5f9',\n textSecondary: '#e2e8f0',\n textMuted: '#cbd5e1',\n border: '#475569',\n primary: '#60a5fa',\n primaryHover: '#3b82f6',\n }\n },\n neon: {\n name: 'neon' as const,\n colors: {\n surface: '#0a0118',\n surfaceSecondary: '#1a0f2e',\n surfaceTertiary: '#2a1f3e',\n text: '#ffffff',\n textSecondary: '#e0e0ff',\n textMuted: '#b0b0d0',\n border: '#ff00ff',\n borderSecondary: '#00ffff',\n primary: '#00ffff',\n primaryHover: '#00cccc',\n primaryContent: '#000000',\n success: '#00ff00',\n warning: '#ffff00',\n error: '#ff0066',\n info: '#00ffff',\n danger: '#ff1493',\n }\n }\n} as const\n","/**\n * useTheme - External Theme State Hook\n *\n * Uses React 18's useSyncExternalStore to prevent parent component re-renders.\n * The theme state is stored externally and changes are propagated through\n * a subscribe/notify pattern.\n *\n * This prevents the ThemeToggle component from causing Layout re-renders.\n */\n\nimport { useSyncExternalStore, useCallback } from 'react'\nimport { getTheme, setTheme as setThemeUtil, watchThemeChanges, type Theme } from '../theme'\n\n// External store for theme state\nconst themeStore = {\n listeners: new Set<() => void>(),\n\n subscribe(listener: () => void) {\n this.listeners.add(listener)\n return () => this.listeners.delete(listener)\n },\n\n notify() {\n this.listeners.forEach(listener => listener())\n }\n}\n\n// Watch theme changes from DOM/system and notify subscribers\nwatchThemeChanges(() => {\n themeStore.notify()\n})\n\n/**\n * Hook to access and update theme\n *\n * Returns current theme and a setter function.\n * Only components using this hook will re-render on theme changes.\n */\nexport function useTheme() {\n // Subscribe to external theme store\n const theme = useSyncExternalStore(\n themeStore.subscribe.bind(themeStore),\n getTheme, // Client-side snapshot\n getTheme // Server-side snapshot (SSR)\n )\n\n // Stable setter function\n const setTheme = useCallback((newTheme: Theme) => {\n setThemeUtil(newTheme)\n themeStore.notify()\n }, [])\n\n return { theme, setTheme }\n}\n","// Default color palette for charts - used as fallback when no dashboard palette is specified\n// These are now part of the 'default' palette in the unified color palette system\nexport const CHART_COLORS = [\n '#3b82f6', // blue\n '#10b981', // green\n '#f59e0b', // yellow\n '#ef4444', // red\n '#8b5cf6', // purple\n '#f97316', // orange\n '#06b6d4', // cyan\n '#84cc16', // lime\n]\n\n// Default gradient colors for continuous numeric scales - used as fallback\n// These are now part of the 'default' palette in the unified color palette system\nexport const CHART_COLORS_GRADIENT = [\n '#440154', // dark purple\n '#414487', // purple-blue\n '#2a788e', // teal\n '#22a884', // green-teal \n '#7ad151', // green\n '#fde725', // yellow\n]\n\n// Colors for positive/negative values\nexport const POSITIVE_COLOR = '#10b981' // green\nexport const NEGATIVE_COLOR = '#ef4444' // red\n\nexport const CHART_MARGINS = {\n top: 5,\n right: 30,\n left: 20,\n bottom: 5\n}\n\nexport const RESPONSIVE_CHART_MARGINS = {\n top: 5,\n right: 30,\n left: 20,\n bottom: 60 // Extra space for rotated labels\n}","/**\n * Utility functions for detecting incomplete time periods in KPI charts\n */\n\n/**\n * Get the end date of a period based on granularity\n * @param date - The date within the period\n * @param granularity - The time granularity (day, week, month, quarter, year)\n * @returns The end date of the period (end of day)\n */\nexport function getPeriodEndDate(date: Date, granularity: string): Date {\n const endDate = new Date(date)\n\n switch (granularity.toLowerCase()) {\n case 'day':\n // End of the same day\n endDate.setHours(23, 59, 59, 999)\n break\n\n case 'week': {\n // End of the week (Saturday, assuming week starts Sunday)\n const dayOfWeek = endDate.getDay()\n const daysUntilSaturday = 6 - dayOfWeek\n endDate.setDate(endDate.getDate() + daysUntilSaturday)\n endDate.setHours(23, 59, 59, 999)\n break\n }\n\n case 'month':\n // Last day of the month\n endDate.setMonth(endDate.getMonth() + 1, 0) // Set to day 0 of next month = last day of current month\n endDate.setHours(23, 59, 59, 999)\n break\n\n case 'quarter': {\n // Last day of the quarter\n const currentMonth = endDate.getMonth()\n const quarterEndMonth = Math.floor(currentMonth / 3) * 3 + 2 // 0->2, 3->5, 6->8, 9->11\n endDate.setMonth(quarterEndMonth + 1, 0) // Last day of quarter end month\n endDate.setHours(23, 59, 59, 999)\n break\n }\n\n case 'year':\n // December 31st\n endDate.setMonth(11, 31) // December 31\n endDate.setHours(23, 59, 59, 999)\n break\n\n default:\n // Unknown granularity - treat as complete\n endDate.setHours(23, 59, 59, 999)\n }\n\n return endDate\n}\n\n/**\n * Check if the last period in the data is complete based on granularity\n * @param lastDataPoint - The last data point in the sorted dataset\n * @param timeDimensionField - The field name containing the time value\n * @param granularity - The time granularity\n * @returns true if the period is complete, false if it's incomplete\n */\nexport function isLastPeriodComplete(\n lastDataPoint: any,\n timeDimensionField: string,\n granularity: string\n): boolean {\n if (!lastDataPoint || !timeDimensionField || !granularity) {\n return true // Assume complete if we can't determine\n }\n\n const timeValue = lastDataPoint[timeDimensionField]\n if (!timeValue) {\n return true // Assume complete if no time value\n }\n\n // Parse the time value\n const date = new Date(timeValue)\n if (isNaN(date.getTime())) {\n return true // Assume complete if invalid date\n }\n\n // Get the end of this period\n const periodEnd = getPeriodEndDate(date, granularity)\n\n // Compare with current time\n const now = new Date()\n\n // If the period end is in the future, the period is incomplete\n return periodEnd <= now\n}\n\n/**\n * Extract granularity from a query object\n * @param queryObject - The CubeQuery object\n * @param dimensionField - Optional specific dimension field to match\n * @returns The granularity string or null if not found\n */\nexport function getQueryGranularity(\n queryObject: any,\n dimensionField?: string\n): string | null {\n if (!queryObject?.timeDimensions || queryObject.timeDimensions.length === 0) {\n return null\n }\n\n // If a specific dimension field is provided, try to find its granularity\n if (dimensionField) {\n const matchingDim = queryObject.timeDimensions.find((td: any) =>\n td.dimension === dimensionField ||\n td.dimension?.includes(dimensionField) ||\n dimensionField?.includes(td.dimension)\n )\n if (matchingDim?.granularity) {\n return matchingDim.granularity\n }\n }\n\n // Fallback to first time dimension's granularity\n const firstTimeDim = queryObject.timeDimensions[0]\n return firstTimeDim?.granularity || null\n}\n\n/**\n * Filter data to exclude incomplete or last period\n * @param data - The data array sorted by time\n * @param timeDimensionField - The field containing time values\n * @param queryObject - The query object containing timeDimensions\n * @param useLastCompletePeriod - Whether to check for incomplete periods\n * @param skipLastPeriod - Whether to always skip the last period (overrides useLastCompletePeriod)\n * @returns Object with filtered data and whether filtering was applied\n */\nexport function filterIncompletePeriod(\n data: any[],\n timeDimensionField: string | undefined,\n queryObject: any,\n useLastCompletePeriod: boolean,\n skipLastPeriod: boolean = false\n): { filteredData: any[]; excludedIncompletePeriod: boolean; skippedLastPeriod: boolean; granularity: string | null } {\n // Default return - no filtering\n const noFilter = {\n filteredData: data,\n excludedIncompletePeriod: false,\n skippedLastPeriod: false,\n granularity: null\n }\n\n // Need at least 2 data points to filter\n if (data.length < 2) {\n return noFilter\n }\n\n const granularity = getQueryGranularity(queryObject, timeDimensionField)\n\n // If skipLastPeriod is enabled, always skip the last period\n if (skipLastPeriod) {\n return {\n filteredData: data.slice(0, -1),\n excludedIncompletePeriod: false,\n skippedLastPeriod: true,\n granularity\n }\n }\n\n // Skip incomplete period check if feature is disabled\n if (!useLastCompletePeriod) {\n return { ...noFilter, granularity }\n }\n\n // Skip if no time dimension field\n if (!timeDimensionField) {\n return { ...noFilter, granularity }\n }\n\n // Skip if no time dimensions in query\n if (!queryObject?.timeDimensions || queryObject.timeDimensions.length === 0) {\n return { ...noFilter, granularity }\n }\n\n if (!granularity) {\n return noFilter\n }\n\n // Check if last period is incomplete\n const lastRow = data[data.length - 1]\n if (!isLastPeriodComplete(lastRow, timeDimensionField, granularity)) {\n return {\n filteredData: data.slice(0, -1),\n excludedIncompletePeriod: true,\n skippedLastPeriod: false,\n granularity\n }\n }\n\n return { ...noFilter, granularity }\n}\n","/**\n * Pivot utilities for DataTable time dimension pivoting\n *\n * When a query includes a time dimension with granularity, transforms flat data\n * into a pivoted structure with time periods as columns.\n */\n\nimport type { CubeQuery, CubeMeta } from '../types'\nimport { formatTimeValue } from './chartUtils'\n\n/**\n * Derives ordered column list from a CubeQuery object.\n * Order: dimensions, timeDimensions (as field names), measures\n *\n * @param queryObject The CubeQuery object\n * @returns Array of field names in order\n */\nexport function getOrderedColumnsFromQuery(queryObject?: CubeQuery): string[] {\n if (!queryObject) return []\n\n const columns: string[] = []\n\n // Add regular dimensions first\n if (queryObject.dimensions) {\n columns.push(...queryObject.dimensions)\n }\n\n // Add time dimensions\n if (queryObject.timeDimensions) {\n queryObject.timeDimensions.forEach(td => {\n if (!columns.includes(td.dimension)) {\n columns.push(td.dimension)\n }\n })\n }\n\n // Add measures last\n if (queryObject.measures) {\n columns.push(...queryObject.measures)\n }\n\n return columns\n}\n\n/**\n * Configuration for pivoting based on query structure\n */\nexport interface PivotConfig {\n /** Time dimension field name (e.g., \"Sales.date\") */\n timeDimension: string\n /** Time granularity (e.g., \"month\", \"day\", \"year\") */\n granularity: string\n /** Non-time dimension fields */\n dimensions: string[]\n /** Measure fields */\n measures: string[]\n}\n\n/**\n * Column definition for pivoted table\n */\nexport interface PivotColumn {\n /** Column key for data access */\n key: string\n /** Display label for column header */\n label: string\n /** Whether this is a time column (vs row identifier column) */\n isTimeColumn: boolean\n /** Whether this is the measure column */\n isMeasureColumn?: boolean\n}\n\n/**\n * Row in the pivoted table\n */\nexport interface PivotRow {\n /** Unique row identifier */\n id: string\n /** The measure field name (for icon lookup) */\n measureField: string\n /** Values keyed by column key */\n values: Record<string, any>\n /** Whether this is the first row in a dimension group (for row spanning) */\n isFirstInGroup?: boolean\n /** Number of rows to span for dimension cells (only set on first row in group) */\n dimensionRowSpan?: number\n}\n\n/**\n * Result of pivoting table data\n */\nexport interface PivotedTableData {\n /** Whether data was pivoted (has time dimension with granularity) */\n isPivoted: boolean\n /** Column definitions for the pivoted table */\n columns: PivotColumn[]\n /** Rows of pivoted data */\n rows: PivotRow[]\n}\n\n/**\n * Determines if a query has a time dimension with granularity that should trigger pivoting\n * @param queryObject The CubeQuery object\n * @param xAxisOverride Optional array of fields to use for filtering dimensions and measures\n * (for respecting chartConfig.xAxis configuration)\n * @returns PivotConfig if pivoting should occur, null otherwise\n */\nexport function hasTimeDimensionForPivot(\n queryObject?: CubeQuery,\n xAxisOverride?: string[]\n): PivotConfig | null {\n if (!queryObject?.timeDimensions?.length) return null\n\n // Find the first time dimension with granularity\n const timeDim = queryObject.timeDimensions.find(td => td.granularity)\n if (!timeDim?.granularity) return null\n\n // Must have at least one measure to pivot\n if (!queryObject.measures?.length) return null\n\n let dimensions: string[]\n let measures: string[]\n\n if (xAxisOverride && xAxisOverride.length > 0) {\n // Filter dimensions from xAxisOverride (excluding time dimension and measures)\n dimensions = xAxisOverride.filter(field => {\n // Exclude the time dimension being pivoted (it becomes columns)\n if (field === timeDim.dimension) return false\n // Exclude measures (they become row values, not dimension columns)\n if (queryObject.measures?.includes(field)) return false\n return true\n })\n\n // Filter measures from xAxisOverride - only show measures that are in xAxis\n const measuresInXAxis = xAxisOverride.filter(field =>\n queryObject.measures?.includes(field)\n )\n // If xAxis contains measures, use only those; otherwise fall back to all measures\n measures = measuresInXAxis.length > 0 ? measuresInXAxis : queryObject.measures\n } else {\n dimensions = queryObject.dimensions || []\n measures = queryObject.measures\n }\n\n // Must have at least one measure after filtering\n if (measures.length === 0) return null\n\n return {\n timeDimension: timeDim.dimension,\n granularity: timeDim.granularity,\n dimensions,\n measures\n }\n}\n\n/**\n * Extracts unique time values from data and sorts them chronologically\n */\nfunction extractAndSortTimeValues(\n data: any[],\n timeDimension: string,\n granularity: string\n): string[] {\n const timeSet = new Set<string>()\n\n data.forEach(row => {\n const rawTime = row[timeDimension]\n if (rawTime != null) {\n const formattedTime = formatTimeValue(rawTime, granularity)\n timeSet.add(formattedTime)\n }\n })\n\n // Sort chronologically - ISO date strings sort correctly alphabetically\n return Array.from(timeSet).sort()\n}\n\n/**\n * Builds column definitions for pivoted table\n * Order: Measure (if multiple) -> Dimensions -> Time columns\n */\nfunction buildColumns(\n config: PivotConfig,\n timeValues: string[],\n getFieldLabel: (field: string) => string\n): PivotColumn[] {\n const columns: PivotColumn[] = []\n\n // Add measure column first (if multiple measures)\n if (config.measures.length > 1) {\n columns.push({\n key: '__measure__',\n label: 'Measure',\n isTimeColumn: false,\n isMeasureColumn: true\n })\n }\n\n // Add dimension columns\n config.dimensions.forEach(dim => {\n columns.push({\n key: dim,\n label: getFieldLabel(dim),\n isTimeColumn: false\n })\n })\n\n // Add time columns (already sorted chronologically)\n timeValues.forEach(timeVal => {\n columns.push({\n key: timeVal,\n label: timeVal,\n isTimeColumn: true\n })\n })\n\n return columns\n}\n\n/**\n * Groups data by dimension values, then by time period\n * Returns Map<dimensionKey, Map<formattedTime, dataRow>>\n */\nfunction groupByDimensions(\n data: any[],\n config: PivotConfig\n): Map<string, Map<string, any>> {\n const grouped = new Map<string, Map<string, any>>()\n\n data.forEach(row => {\n // Build dimension key from all dimension values\n const dimKey = config.dimensions.length > 0\n ? config.dimensions.map(dim => String(row[dim] ?? '')).join('|')\n : '__all__'\n\n // Get or create time map for this dimension combo\n if (!grouped.has(dimKey)) {\n grouped.set(dimKey, new Map())\n }\n\n // Store data point by formatted time value\n const rawTime = row[config.timeDimension]\n if (rawTime != null) {\n const formattedTime = formatTimeValue(rawTime, config.granularity)\n grouped.get(dimKey)!.set(formattedTime, row)\n }\n })\n\n return grouped\n}\n\n/**\n * Builds pivoted rows from grouped data\n * Rows are grouped by measure first (all Revenue rows together, all Quantity rows together)\n * Then within each measure group, rows are ordered by dimension values\n */\nfunction buildPivotedRows(\n data: any[],\n config: PivotConfig,\n timeValues: string[],\n getFieldLabel: (field: string) => string\n): PivotRow[] {\n // Group data by dimensions and time\n const grouped = groupByDimensions(data, config)\n const dimensionKeys = Array.from(grouped.keys())\n\n const rows: PivotRow[] = []\n const measureCount = config.measures.length\n const dimensionCount = dimensionKeys.length\n\n // Iterate over measures first, then dimensions\n // This groups all rows for one measure together\n config.measures.forEach((measure) => {\n dimensionKeys.forEach((dimensionKey, dimIndex) => {\n const timeData = grouped.get(dimensionKey)!\n const rowId = measureCount > 1\n ? `${measure}|${dimensionKey}`\n : dimensionKey\n\n const values: Record<string, any> = {}\n\n // Add dimension values\n const dimValues = dimensionKey === '__all__' ? [] : dimensionKey.split('|')\n config.dimensions.forEach((dim, idx) => {\n values[dim] = dimValues[idx] ?? ''\n })\n\n // Add measure name if multiple measures (for display in Measure column)\n if (measureCount > 1) {\n values['__measure__'] = getFieldLabel(measure)\n }\n\n // Add time period values\n timeValues.forEach(timeVal => {\n const dataPoint = timeData.get(timeVal)\n values[timeVal] = dataPoint?.[measure] ?? null\n })\n\n // Track grouping for row spanning (when multiple measures)\n // First row of each measure group should span all dimension rows\n const isFirstInGroup = dimIndex === 0\n const measureRowSpan = isFirstInGroup && measureCount > 1 ? dimensionCount : undefined\n\n rows.push({\n id: rowId,\n measureField: measure,\n values,\n isFirstInGroup,\n dimensionRowSpan: measureRowSpan\n })\n })\n })\n\n return rows\n}\n\n/**\n * Pivots flat data into time-columned table structure\n *\n * @param data Raw data array from query result\n * @param config Pivot configuration\n * @param getFieldLabel Function to get display label for a field\n * @param meta Optional cube metadata for looking up measure types\n * @returns Pivoted table data structure\n */\nexport function pivotTableData(\n data: any[],\n config: PivotConfig,\n getFieldLabel: (field: string) => string,\n _meta?: CubeMeta | null\n): PivotedTableData {\n if (!data || data.length === 0) {\n return { isPivoted: true, columns: [], rows: [] }\n }\n\n // Extract unique time values and sort chronologically\n const timeValues = extractAndSortTimeValues(data, config.timeDimension, config.granularity)\n\n // Build column definitions\n const columns = buildColumns(config, timeValues, getFieldLabel)\n\n // Build pivoted rows\n const rows = buildPivotedRows(data, config, timeValues, getFieldLabel)\n\n return { isPivoted: true, columns, rows }\n}\n\n/**\n * Looks up the measure type from metadata\n *\n * @param measureField The fully qualified measure field name (e.g., \"Sales.revenue\")\n * @param meta Cube metadata\n * @returns The measure type (e.g., \"sum\", \"count\", \"avg\") or undefined\n */\nexport function getMeasureType(measureField: string, meta: CubeMeta | null): string | undefined {\n if (!meta?.cubes) return undefined\n\n for (const cube of meta.cubes) {\n const measure = cube.measures.find(m => m.name === measureField)\n if (measure) {\n return measure.type\n }\n }\n\n return undefined\n}\n","/**\n * Comparison Data Utilities\n * Handles period-over-period comparison data transformation for charts\n *\n * These utilities detect comparison query results (with __periodIndex metadata)\n * and transform them for visualization in either 'separate' or 'overlay' mode.\n */\n\n/**\n * Check if data contains comparison period metadata\n */\nexport function isComparisonData(data: any[]): boolean {\n return data.length > 0 && '__periodIndex' in data[0]\n}\n\n/**\n * Get unique period labels from comparison data\n */\nexport function getPeriodLabels(data: any[]): string[] {\n if (!isComparisonData(data)) return []\n\n const labels = new Set<string>()\n for (const row of data) {\n if (row.__period) {\n labels.add(row.__period)\n }\n }\n return Array.from(labels)\n}\n\n/**\n * Get period indices from comparison data\n */\nexport function getPeriodIndices(data: any[]): number[] {\n if (!isComparisonData(data)) return []\n\n const indices = new Set<number>()\n for (const row of data) {\n if (typeof row.__periodIndex === 'number') {\n indices.add(row.__periodIndex)\n }\n }\n return Array.from(indices).sort((a, b) => a - b)\n}\n\n/**\n * Generate a short label for a period (used in legends)\n * Uses simple \"Current\" / \"Prior\" labels for clarity\n */\nexport function generatePeriodShortLabel(_periodLabel: string, index: number): string {\n return index === 0 ? 'Current' : 'Prior'\n}\n\n/**\n * Transform comparison data for 'separate' mode\n * Returns data with each row having its original measure values\n * Series are created per period (e.g., \"totalLinesOfCode (Current)\", \"totalLinesOfCode (Prior)\")\n */\nexport function transformForSeparateMode(\n data: any[],\n measures: string[],\n _timeDimensionKey: string\n): { data: any[], seriesKeys: string[] } {\n if (!isComparisonData(data)) {\n return { data, seriesKeys: measures }\n }\n\n const periodLabels = getPeriodLabels(data)\n const seriesKeys: string[] = []\n\n // Create series key for each measure + period combination\n for (const measure of measures) {\n for (let i = 0; i < periodLabels.length; i++) {\n const shortLabel = generatePeriodShortLabel(periodLabels[i], i)\n const key = `${measure} (${shortLabel})`\n seriesKeys.push(key)\n }\n }\n\n // Data already has period info, just return as-is for separate mode\n // The chart will group by time dimension and show multiple lines\n return { data, seriesKeys }\n}\n\n/**\n * Detect dimension fields in comparison data\n * Returns fields that are not measures, time dimension, or metadata fields\n */\nfunction detectDimensionFields(\n data: any[],\n measures: string[],\n timeDimensionKey: string\n): string[] {\n if (data.length === 0) return []\n\n const metadataFields = ['__period', '__periodIndex', '__periodDayIndex']\n const firstRow = data[0]\n const dimensions: string[] = []\n\n for (const key of Object.keys(firstRow)) {\n if (\n !measures.includes(key) &&\n key !== timeDimensionKey &&\n !metadataFields.includes(key)\n ) {\n dimensions.push(key)\n }\n }\n\n return dimensions\n}\n\n/**\n * Get unique dimension values from data for a set of dimension fields\n */\nfunction getUniqueDimensionValues(\n data: any[],\n dimensionFields: string[]\n): Map<string, Set<any>> {\n const values = new Map<string, Set<any>>()\n\n for (const field of dimensionFields) {\n values.set(field, new Set())\n }\n\n for (const row of data) {\n for (const field of dimensionFields) {\n if (row[field] !== undefined && row[field] !== null) {\n values.get(field)!.add(row[field])\n }\n }\n }\n\n return values\n}\n\n/**\n * Transform comparison data for 'overlay' mode\n * Pivots data so each row represents a day-of-period index,\n * with separate columns for each period's values.\n *\n * When dimensions are present, creates series keys that include\n * dimension values: \"Engineering - Total Lines of Code (Current)\"\n *\n * Input (without dimensions):\n * [\n * { date: '2024-01-01', value: 100, __periodIndex: 0, __periodDayIndex: 0 },\n * { date: '2024-01-02', value: 110, __periodIndex: 0, __periodDayIndex: 1 },\n * { date: '2023-01-01', value: 80, __periodIndex: 1, __periodDayIndex: 0 },\n * { date: '2023-01-02', value: 85, __periodIndex: 1, __periodDayIndex: 1 },\n * ]\n *\n * Output (without dimensions):\n * [\n * { __periodDayIndex: 0, 'value (Current)': 100, 'value (Prior)': 80 },\n * { __periodDayIndex: 1, 'value (Current)': 110, 'value (Prior)': 85 },\n * ]\n *\n * Input (with dimensions):\n * [\n * { date: '2024-01-01', 'Dept.name': 'Engineering', value: 100, __periodIndex: 0, __periodDayIndex: 0 },\n * { date: '2024-01-01', 'Dept.name': 'Sales', value: 50, __periodIndex: 0, __periodDayIndex: 0 },\n * { date: '2023-01-01', 'Dept.name': 'Engineering', value: 80, __periodIndex: 1, __periodDayIndex: 0 },\n * { date: '2023-01-01', 'Dept.name': 'Sales', value: 40, __periodIndex: 1, __periodDayIndex: 0 },\n * ]\n *\n * Output (with dimensions):\n * [\n * {\n * __periodDayIndex: 0,\n * 'Engineering - value (Current)': 100,\n * 'Engineering - value (Prior)': 80,\n * 'Sales - value (Current)': 50,\n * 'Sales - value (Prior)': 40,\n * },\n * ]\n */\nexport function transformForOverlayMode(\n data: any[],\n measures: string[],\n timeDimensionKey: string,\n getFieldLabel?: (fieldName: string) => string\n): { data: any[], seriesKeys: string[], xAxisKey: string } {\n if (!isComparisonData(data)) {\n return { data, seriesKeys: measures, xAxisKey: timeDimensionKey }\n }\n\n const periodLabels = getPeriodLabels(data)\n const periodIndices = getPeriodIndices(data)\n\n // Detect dimension fields in the data\n const dimensionFields = detectDimensionFields(data, measures, timeDimensionKey)\n const hasDimensions = dimensionFields.length > 0\n\n // Get unique dimension values for generating series keys\n const uniqueDimensionValues = hasDimensions\n ? getUniqueDimensionValues(data, dimensionFields)\n : null\n\n // Group data by __periodDayIndex\n const groupedByDayIndex = new Map<number, Record<string, any>>()\n\n for (const row of data) {\n const dayIndex = row.__periodDayIndex\n const periodIndex = row.__periodIndex\n\n if (!groupedByDayIndex.has(dayIndex)) {\n groupedByDayIndex.set(dayIndex, {\n __periodDayIndex: dayIndex,\n // Store the date from the first period (index 0) for reference\n __displayDate: periodIndex === 0 ? row[timeDimensionKey] : undefined\n })\n }\n\n const groupedRow = groupedByDayIndex.get(dayIndex)!\n\n // If this is the first period and we don't have a display date yet, add it\n if (!groupedRow.__displayDate && row[timeDimensionKey]) {\n groupedRow.__displayDate = row[timeDimensionKey]\n }\n\n // Build dimension prefix if dimensions are present\n let dimensionPrefix = ''\n if (hasDimensions) {\n const dimensionValues = dimensionFields.map(field => {\n const value = row[field]\n return getFieldLabel ? getFieldLabel(String(value)) : String(value)\n })\n dimensionPrefix = dimensionValues.join(' / ')\n }\n\n // Add measure values with optional dimension prefix and period suffix\n const shortLabel = generatePeriodShortLabel(periodLabels[periodIndex] || '', periodIndex)\n for (const measure of measures) {\n const displayName = getFieldLabel ? getFieldLabel(measure) : measure\n const key = dimensionPrefix\n ? `${dimensionPrefix} - ${displayName} (${shortLabel})`\n : `${displayName} (${shortLabel})`\n groupedRow[key] = row[measure]\n }\n }\n\n // Convert to array and sort by day index\n const transformedData = Array.from(groupedByDayIndex.values())\n .sort((a, b) => a.__periodDayIndex - b.__periodDayIndex)\n\n // Generate series keys (using display names to match the data keys)\n const seriesKeys: string[] = []\n\n if (hasDimensions && uniqueDimensionValues) {\n // Generate all combinations of dimension values\n const dimensionCombinations = generateDimensionCombinations(\n dimensionFields,\n uniqueDimensionValues,\n getFieldLabel\n )\n\n // For each dimension combination, create series keys for each measure + period\n for (const dimCombo of dimensionCombinations) {\n for (const measure of measures) {\n const displayName = getFieldLabel ? getFieldLabel(measure) : measure\n for (let i = 0; i < periodIndices.length; i++) {\n const shortLabel = generatePeriodShortLabel(periodLabels[i] || '', i)\n seriesKeys.push(`${dimCombo} - ${displayName} (${shortLabel})`)\n }\n }\n }\n } else {\n // No dimensions - generate simple measure + period keys\n for (const measure of measures) {\n const displayName = getFieldLabel ? getFieldLabel(measure) : measure\n for (let i = 0; i < periodIndices.length; i++) {\n const shortLabel = generatePeriodShortLabel(periodLabels[i] || '', i)\n seriesKeys.push(`${displayName} (${shortLabel})`)\n }\n }\n }\n\n return {\n data: transformedData,\n seriesKeys,\n xAxisKey: '__periodDayIndex'\n }\n}\n\n/**\n * Generate all combinations of dimension values as formatted strings\n */\nfunction generateDimensionCombinations(\n dimensionFields: string[],\n uniqueValues: Map<string, Set<any>>,\n getFieldLabel?: (fieldName: string) => string\n): string[] {\n if (dimensionFields.length === 0) return []\n\n // For single dimension, just return the values\n if (dimensionFields.length === 1) {\n const field = dimensionFields[0]\n const values = Array.from(uniqueValues.get(field) || [])\n return values.map(v => getFieldLabel ? getFieldLabel(String(v)) : String(v))\n }\n\n // For multiple dimensions, generate cartesian product\n const result: string[] = []\n const fieldValues = dimensionFields.map(field =>\n Array.from(uniqueValues.get(field) || [])\n )\n\n function generateCombos(index: number, current: string[]): void {\n if (index === fieldValues.length) {\n const formatted = current.map(v =>\n getFieldLabel ? getFieldLabel(String(v)) : String(v)\n )\n result.push(formatted.join(' / '))\n return\n }\n\n for (const value of fieldValues[index]) {\n generateCombos(index + 1, [...current, value])\n }\n }\n\n generateCombos(0, [])\n return result\n}\n\n/**\n * Format the period day index for display on X-axis\n * Can show as \"Day 1\", \"Day 2\", etc., or as the original date\n */\nexport function formatPeriodDayIndex(\n dayIndex: number,\n displayDate?: string | Date,\n options?: {\n showDayNumber?: boolean\n dateFormat?: 'short' | 'long'\n }\n): string {\n if (options?.showDayNumber) {\n return `Day ${dayIndex + 1}`\n }\n\n if (displayDate) {\n const date = typeof displayDate === 'string' ? new Date(displayDate) : displayDate\n if (!isNaN(date.getTime())) {\n return date.toLocaleDateString('en-US', {\n month: options?.dateFormat === 'long' ? 'long' : 'short',\n day: 'numeric'\n })\n }\n }\n\n return `${dayIndex + 1}`\n}\n\n/**\n * Check if a series key represents a prior period (not the first period)\n * Used for applying different styling to prior period lines\n */\nexport function isPriorPeriodSeries(seriesKey: string, periodLabels: string[]): boolean {\n if (periodLabels.length < 2) return false\n\n // Check if the series key contains any label other than the first period's\n for (let i = 1; i < periodLabels.length; i++) {\n const shortLabel = generatePeriodShortLabel(periodLabels[i], i)\n if (seriesKey.includes(`(${shortLabel})`)) {\n return true\n }\n }\n\n // Also check for \"(Prior\" pattern\n return seriesKey.includes('(Prior')\n}\n\n/**\n * Get the stroke dash array for prior period styling\n */\nexport function getPriorPeriodStrokeDashArray(\n style: 'solid' | 'dashed' | 'dotted' = 'dashed'\n): string | undefined {\n switch (style) {\n case 'solid':\n return undefined\n case 'dashed':\n return '5 5'\n case 'dotted':\n return '2 2'\n default:\n return '5 5'\n }\n}\n","import { ReactElement, useState, useRef, useLayoutEffect } from 'react'\nimport { ResponsiveContainer } from 'recharts'\nimport LoadingIndicator from '../LoadingIndicator'\n\ninterface ChartContainerProps {\n children: ReactElement\n height?: string | number\n}\n\nexport default function ChartContainer({ children, height = \"100%\" }: ChartContainerProps) {\n // Track if container is ready to render ResponsiveContainer\n // We need to wait for the container to be in the DOM with valid dimensions\n const containerRef = useRef<HTMLDivElement>(null)\n const [isReady, setIsReady] = useState(false)\n const [containerSize, setContainerSize] = useState({ width: 0, height: 0 })\n\n // Use useLayoutEffect to measure before paint\n useLayoutEffect(() => {\n let mounted = true\n let resizeObserver: ResizeObserver | null = null\n\n const measureAndSetReady = () => {\n if (!mounted || !containerRef.current) return\n\n const rect = containerRef.current.getBoundingClientRect()\n // Check both clientWidth/Height AND getBoundingClientRect for robustness\n const width = Math.max(containerRef.current.clientWidth, rect.width)\n const height = Math.max(containerRef.current.clientHeight, rect.height)\n\n if (width > 0 && height > 0) {\n setContainerSize({ width, height })\n setIsReady(true)\n }\n }\n\n // Set up ResizeObserver to detect when container gets valid dimensions\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n if (width > 0 && height > 0) {\n setContainerSize({ width, height })\n if (!isReady) {\n setIsReady(true)\n }\n }\n }\n })\n\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current)\n // Also try immediate measurement\n measureAndSetReady()\n }\n\n return () => {\n mounted = false\n resizeObserver?.disconnect()\n }\n }, [isReady])\n\n try {\n if (height === \"100%\") {\n // For 100% height, make the container fill the available flex space with proper sizing\n return (\n <div\n ref={containerRef}\n className=\"w-full h-full flex-1 flex flex-col relative\"\n style={{ minHeight: '250px', minWidth: '100px', overflow: 'hidden' }}\n >\n {isReady && containerSize.width > 0 && containerSize.height > 0 ? (\n <ResponsiveContainer\n width={containerSize.width}\n height={containerSize.height - 16}\n debounce={100}\n style={{ marginTop: '16px' }}\n >\n {children}\n </ResponsiveContainer>\n ) : (\n <div className=\"flex items-center justify-center w-full h-full\">\n <LoadingIndicator size=\"sm\" />\n </div>\n )}\n </div>\n )\n }\n\n // For specific heights, use them directly\n const containerStyle = {\n height: typeof height === 'number' ? `${height}px` : height,\n width: '100%',\n minHeight: '200px',\n minWidth: '100px'\n }\n\n return (\n <div\n ref={containerRef}\n className=\"w-full flex flex-col relative\"\n style={{ ...containerStyle, overflow: 'hidden' }}\n >\n {isReady && containerSize.width > 0 && containerSize.height > 0 ? (\n <ResponsiveContainer\n width={containerSize.width}\n height={containerSize.height - 16}\n debounce={100}\n style={{ marginTop: '16px' }}\n >\n {children}\n </ResponsiveContainer>\n ) : (\n <div className=\"flex items-center justify-center w-full h-full\">\n <LoadingIndicator size=\"sm\" />\n </div>\n )}\n </div>\n )\n } catch (error) {\n // ChartContainer ResponsiveContainer error\n\n return (\n <div\n className=\"flex flex-col items-center justify-center w-full h-full p-4 text-center border border-dashed rounded-lg\"\n style={{ height, borderColor: 'var(--dc-border)', backgroundColor: 'var(--dc-surface)' }}\n >\n <div className=\"text-sm font-semibold mb-1 text-dc-text-muted\">Unable to display chart</div>\n <div className=\"text-xs text-dc-text-secondary\">\n {error instanceof Error ? error.message : 'Failed to create responsive container'}\n </div>\n </div>\n )\n }\n}","import React from 'react'\nimport { Tooltip } from 'recharts'\nimport { formatNumericValue } from '../../utils/chartUtils'\n\ninterface ChartTooltipProps {\n formatter?: (value: any, name: any, props: any) => [React.ReactText, React.ReactText]\n labelFormatter?: (label: any, payload?: readonly any[]) => React.ReactText\n}\n\n// Default formatter that rounds numeric values to at most 2 decimal places\nconst defaultFormatter = (value: any, name: any): [React.ReactText, React.ReactText] => {\n if (value === null || value === undefined) {\n return ['No data', name]\n }\n return [formatNumericValue(value), name]\n}\n\nexport default function ChartTooltip({ formatter, labelFormatter }: ChartTooltipProps) {\n return (\n <Tooltip\n formatter={formatter || defaultFormatter}\n labelFormatter={labelFormatter}\n contentStyle={{\n backgroundColor: 'white',\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n color: '#1f2937',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n padding: '8px 12px'\n }}\n />\n )\n}","/**\n * Utility functions for handling target values in charts\n */\n\n/**\n * Parse target values from string format\n * @param targetString - String containing target values (e.g., \"100\" or \"50,75,100\")\n * @returns Array of numeric target values\n */\nexport function parseTargetValues(targetString: string): number[] {\n if (!targetString || typeof targetString !== 'string') {\n return []\n }\n\n const trimmed = targetString.trim()\n if (!trimmed) {\n return []\n }\n\n try {\n // Split by comma and parse each value\n const values = trimmed\n .split(',')\n .map(val => val.trim())\n .filter(val => val !== '')\n .map(val => {\n const num = parseFloat(val)\n if (isNaN(num)) {\n throw new Error(`Invalid numeric value: ${val}`)\n }\n return num\n })\n\n return values.length > 0 ? values : []\n } catch (error) {\n console.warn('Failed to parse target values:', error)\n return []\n }\n}\n\n/**\n * Spread target values across data points\n * @param targets - Array of target values\n * @param dataLength - Number of data points to spread across\n * @returns Array of target values for each data point\n */\nexport function spreadTargetValues(targets: number[], dataLength: number): number[] {\n if (targets.length === 0 || dataLength <= 0) {\n return []\n }\n\n // If only one target value, repeat for all data points\n if (targets.length === 1) {\n return new Array(dataLength).fill(targets[0])\n }\n\n // If we have multiple targets, spread them evenly across data points\n const result: number[] = []\n const baseGroupSize = Math.floor(dataLength / targets.length)\n const remainder = dataLength % targets.length\n\n let currentIndex = 0\n \n for (let i = 0; i < targets.length; i++) {\n // Calculate group size for this target\n // First 'remainder' groups get an extra item\n const groupSize = baseGroupSize + (i < remainder ? 1 : 0)\n \n // Fill this group with the current target value\n for (let j = 0; j < groupSize; j++) {\n result[currentIndex++] = targets[i]\n }\n }\n\n return result\n}\n\n/**\n * Calculate variance between actual and target values\n * @param actual - Actual value\n * @param target - Target value\n * @returns Variance as percentage\n */\nexport function calculateVariance(actual: number, target: number): number {\n if (target === 0) {\n return actual === 0 ? 0 : (actual > 0 ? 100 : -100)\n }\n return ((actual - target) / target) * 100\n}\n\n/**\n * Format variance as percentage string with appropriate sign and color indication\n * @param variance - Variance percentage\n * @param decimals - Number of decimal places (default: 1)\n * @returns Formatted variance string (e.g., \"+12.5%\" or \"-8.3%\")\n */\nexport function formatVariance(variance: number, decimals: number = 1): string {\n const sign = variance >= 0 ? '+' : ''\n return `${sign}${variance.toFixed(decimals)}%`\n}\n\n/**\n * Get unique target values for reference lines\n * @param targets - Array of target values (may contain duplicates)\n * @returns Array of unique target values\n */\nexport function getUniqueTargets(targets: number[]): number[] {\n return [...new Set(targets)].sort((a, b) => a - b)\n}","import React, { useState, useMemo } from 'react'\nimport { ComposedChart, Bar, Line, XAxis, YAxis, CartesianGrid, Cell, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS, POSITIVE_COLOR, NEGATIVE_COLOR, CHART_MARGINS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, isValidNumericValue, formatAxisValue } from '../../utils/chartUtils'\nimport { parseTargetValues, spreadTargetValues } from '../../utils/targetUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\nconst BarChart = React.memo(function BarChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n // Determine stacking from stackType (new) or stacked (legacy)\n const stackType = displayConfig?.stackType ?? (displayConfig?.stacked ? 'normal' : 'none')\n const shouldStack = stackType !== 'none'\n const isPercentStack = stackType === 'percent'\n\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true\n }\n\n // Extract axis format configs\n const leftYAxisFormat = displayConfig?.leftYAxisFormat\n const rightYAxisFormat = displayConfig?.rightYAxisFormat\n\n // Validate chartConfig - support both legacy and new formats\n // Do validation but don't early return yet (hooks must come first)\n const { xAxisField, yAxisFields, seriesFields, configError } = useMemo(() => {\n let xAxisField: string | undefined\n let yAxisFields: string[] = []\n let seriesFields: string[] = []\n let configError: string | null = null\n\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format\n xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n yAxisFields = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis]\n seriesFields = chartConfig.series || []\n } else if (chartConfig?.x && chartConfig?.y) {\n // Legacy format\n xAxisField = chartConfig.x\n yAxisFields = Array.isArray(chartConfig.y) ? chartConfig.y : [chartConfig.y]\n } else {\n configError = 'Invalid or missing chart axis configuration'\n }\n\n if (!configError && (!xAxisField || !yAxisFields || yAxisFields.length === 0)) {\n configError = 'Missing required X-axis or Y-axis fields'\n }\n\n return { xAxisField, yAxisFields, seriesFields, configError }\n }, [chartConfig])\n\n // Transform data (will be empty arrays if config is invalid)\n const { data: transformedData, seriesKeys } = useMemo(() => {\n if (configError || !data || data.length === 0 || !xAxisField) {\n return { data: [], seriesKeys: [] }\n }\n return transformChartDataWithSeries(\n data,\n xAxisField,\n yAxisFields,\n queryObject,\n seriesFields,\n getFieldLabel\n )\n }, [data, xAxisField, yAxisFields, queryObject, seriesFields, getFieldLabel, configError])\n\n // Dual Y-axis support: extract yAxisAssignment from chartConfig (memoized to prevent object recreation)\n const yAxisAssignment = useMemo(() =>\n chartConfig?.yAxisAssignment || {},\n [chartConfig?.yAxisAssignment]\n )\n\n // Build mapping from series key (label) to original field name\n const seriesKeyToField: Record<string, string> = useMemo(() => {\n const mapping: Record<string, string> = {}\n yAxisFields.forEach((field) => {\n const label = getFieldLabel(field)\n mapping[label] = field\n })\n return mapping\n }, [yAxisFields, getFieldLabel])\n\n // Determine if we need a right Y-axis\n const hasRightAxis = yAxisFields.some((field) => yAxisAssignment[field] === 'right')\n\n // Get fields for left and right axes for labels\n const leftAxisFields = yAxisFields.filter((f) => (yAxisAssignment[f] || 'left') === 'left')\n const rightAxisFields = yAxisFields.filter((f) => yAxisAssignment[f] === 'right')\n\n // Null handling: Filter out data points where ALL measure values are null\n // This prevents rendering empty bars and makes the chart clearer\n const { chartData, skippedCount } = useMemo(() => {\n if (transformedData.length === 0 || seriesKeys.length === 0) {\n return { chartData: [], skippedCount: 0 }\n }\n const filtered = transformedData.filter(row => {\n // Keep the row if at least one series has a valid numeric value\n return seriesKeys.some(key => isValidNumericValue(row[key]))\n })\n const skipped = transformedData.length - filtered.length\n return { chartData: filtered, skippedCount: skipped }\n }, [transformedData, seriesKeys])\n\n // Now handle early returns AFTER all hooks\n try {\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in bar chart</div>\n </div>\n </div>\n )\n }\n\n if (configError) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">{configError}</div>\n </div>\n </div>\n )\n }\n\n // Determine stack offset for percentage stacking\n // Disable stacking when dual Y-axis is used (bars on different axes can't be stacked)\n const effectiveShouldStack = shouldStack && !hasRightAxis\n const effectiveIsPercentStack = isPercentStack && !hasRightAxis\n const stackOffset = effectiveIsPercentStack ? 'expand' as const : undefined\n\n // Check if we should use positive/negative coloring\n // This is enabled when we have single series data with mixed positive/negative values\n const usePositiveNegativeColoring = seriesKeys.length === 1 && chartData.some(row => {\n const value = row[seriesKeys[0]]\n return typeof value === 'number' && value < 0\n })\n\n // Determine if legend will be shown\n const showLegend = safeDisplayConfig.showLegend\n\n // Use custom chart margins with extra space for Y-axis labels\n const chartMargins = {\n ...CHART_MARGINS,\n left: 40, // Space for left Y-axis label\n right: hasRightAxis ? 40 : 20 // Extra space for right Y-axis label if needed\n }\n \n // Process target values and add to chart data\n const targetValues = parseTargetValues(displayConfig?.target || '')\n const spreadTargets = spreadTargetValues(targetValues, chartData.length)\n \n // Add target data to chart data if targets exist\n let enhancedChartData = chartData\n if (spreadTargets.length > 0) {\n enhancedChartData = chartData.map((dataPoint, index) => ({\n ...dataPoint,\n __target: spreadTargets[index] || null\n }))\n }\n \n // Validate transformed data\n if (!chartData || chartData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">No valid data points for bar chart after transformation</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"relative w-full\" style={{ height }}>\n <ChartContainer height={skippedCount > 0 ? `calc(100% - 20px)` : \"100%\"}>\n <ComposedChart data={enhancedChartData} margin={chartMargins} stackOffset={stackOffset}>\n {safeDisplayConfig.showGrid && (\n <CartesianGrid strokeDasharray=\"3 3\" />\n )}\n <XAxis\n dataKey=\"name\"\n tick={{ fontSize: 12 }}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n />\n <YAxis\n yAxisId=\"left\"\n orientation=\"left\"\n tick={{ fontSize: 12 }}\n tickFormatter={\n effectiveIsPercentStack\n ? (v) => `${(v * 100).toFixed(0)}%`\n : leftYAxisFormat\n ? (value) => formatAxisValue(value, leftYAxisFormat)\n : undefined\n }\n domain={effectiveIsPercentStack ? [0, 1] : undefined}\n label={\n effectiveIsPercentStack\n ? undefined\n : leftAxisFields.length > 0\n ? {\n value: leftYAxisFormat?.label || getFieldLabel(leftAxisFields[0]),\n angle: -90,\n position: 'left',\n style: { textAnchor: 'middle', fontSize: '12px' }\n }\n : undefined\n }\n />\n {hasRightAxis && (\n <YAxis\n yAxisId=\"right\"\n orientation=\"right\"\n tick={{ fontSize: 12 }}\n tickFormatter={rightYAxisFormat ? (value) => formatAxisValue(value, rightYAxisFormat) : undefined}\n label={\n rightAxisFields.length > 0\n ? {\n value: rightYAxisFormat?.label || getFieldLabel(rightAxisFields[0]),\n angle: 90,\n position: 'right',\n style: { textAnchor: 'middle', fontSize: '12px' }\n }\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={(value: any, name: any) => {\n // Handle null values in tooltip\n if (value === null || value === undefined) {\n return ['No data', name]\n }\n if (name === 'Target') {\n // Use left Y-axis format for target values\n return [formatAxisValue(value, leftYAxisFormat), 'Target Value']\n }\n // Format as percentage when using percent stacking\n if (effectiveIsPercentStack && typeof value === 'number') {\n return [`${(value * 100).toFixed(1)}%`, name]\n }\n // Determine which axis format to use based on series name\n const originalField = seriesKeyToField[name]\n const axisId = originalField && yAxisAssignment[originalField] === 'right' ? 'right' : 'left'\n const formatConfig = axisId === 'right' ? rightYAxisFormat : leftYAxisFormat\n return [formatAxisValue(value, formatConfig), name]\n }}\n />\n )}\n {showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '25px' }}\n iconType=\"rect\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n {seriesKeys.map((seriesKey, index) => {\n // Look up the original field name to get its axis assignment\n const originalField = seriesKeyToField[seriesKey]\n const axisId = originalField && yAxisAssignment[originalField] === 'right' ? 'right' : 'left'\n return (\n <Bar\n key={seriesKey}\n dataKey={seriesKey}\n yAxisId={axisId}\n stackId={effectiveShouldStack ? 'stack' : undefined}\n fill={\n usePositiveNegativeColoring\n ? POSITIVE_COLOR\n : (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }\n fillOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n >\n {usePositiveNegativeColoring &&\n chartData.map((entry, entryIndex) => {\n const value = entry[seriesKey]\n const fillColor = typeof value === 'number' && value < 0 ? NEGATIVE_COLOR : POSITIVE_COLOR\n return (\n <Cell\n key={`cell-${entryIndex}`}\n fill={fillColor}\n fillOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n />\n )\n })}\n </Bar>\n )\n })}\n {spreadTargets.length > 0 && (\n <>\n {/* White background line */}\n <Line\n type=\"monotone\"\n dataKey=\"__target\"\n yAxisId=\"left\"\n stroke=\"#ffffff\"\n strokeWidth={2}\n dot={false}\n activeDot={false}\n connectNulls={false}\n />\n {/* Grey dashed line on top */}\n <Line\n type=\"monotone\"\n dataKey=\"__target\"\n yAxisId=\"left\"\n name=\"Target\"\n stroke=\"#8B5CF6\"\n strokeWidth={2}\n strokeDasharray=\"2 3\"\n dot={false}\n activeDot={false}\n connectNulls={false}\n />\n </>\n )}\n </ComposedChart>\n </ChartContainer>\n {skippedCount > 0 && (\n <div className=\"text-xs text-dc-text-muted text-center mt-1\">\n {skippedCount} data point{skippedCount !== 1 ? 's' : ''} with no values hidden\n </div>\n )}\n </div>\n )\n } catch (error) {\n // 'BarChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-dc-error p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Bar Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n})\n\nexport default BarChart","import React, { useState, useMemo } from 'react'\nimport { LineChart as RechartsLineChart, Line, XAxis, YAxis, CartesianGrid, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS, CHART_MARGINS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatAxisValue, formatTimeValue, getFieldGranularity } from '../../utils/chartUtils'\nimport { parseTargetValues, spreadTargetValues } from '../../utils/targetUtils'\nimport {\n isComparisonData,\n getPeriodLabels,\n transformForOverlayMode,\n isPriorPeriodSeries,\n getPriorPeriodStrokeDashArray\n} from '../../utils/comparisonUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\nconst LineChart = React.memo(function LineChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n // Extract Y-axis fields early for use in useMemo hooks\n // This ensures hooks are always called in the same order\n const yAxisFields = useMemo(() => {\n if (chartConfig?.yAxis) {\n return Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis]\n }\n if (chartConfig?.y) {\n return Array.isArray(chartConfig.y) ? chartConfig.y : [chartConfig.y]\n }\n return []\n }, [chartConfig?.yAxis, chartConfig?.y])\n\n // Dual Y-axis support: extract yAxisAssignment from chartConfig (memoized to prevent object recreation)\n // MUST be called before any early returns to satisfy React hooks rules\n const yAxisAssignment = useMemo(() =>\n chartConfig?.yAxisAssignment || {},\n [chartConfig?.yAxisAssignment]\n )\n\n // Build mapping from series key (label) to original field name (memoized to prevent object recreation)\n // This is needed because seriesKeys use display labels, not field names\n // MUST be called before any early returns to satisfy React hooks rules\n const seriesKeyToField = useMemo(() => {\n const mapping: Record<string, string> = {}\n yAxisFields.forEach((field) => {\n const label = getFieldLabel(field)\n mapping[label] = field\n })\n return mapping\n }, [yAxisFields, getFieldLabel])\n\n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n connectNulls: displayConfig?.connectNulls ?? false\n }\n\n // Extract axis format configs\n const leftYAxisFormat = displayConfig?.leftYAxisFormat\n const rightYAxisFormat = displayConfig?.rightYAxisFormat\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in line chart</div>\n </div>\n </div>\n )\n }\n\n // Validate chartConfig - support both legacy and new formats\n let xAxisField: string\n let seriesFields: string[] = []\n\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format\n xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n seriesFields = chartConfig.series || []\n } else if (chartConfig?.x && chartConfig?.y) {\n // Legacy format\n xAxisField = chartConfig.x\n } else {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">Invalid or missing chart axis configuration</div>\n </div>\n </div>\n )\n }\n\n if (!xAxisField || yAxisFields.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">Missing required X-axis or Y-axis fields</div>\n </div>\n </div>\n )\n }\n\n // Check if this is comparison data (has __periodIndex metadata)\n const hasComparisonData = isComparisonData(data)\n const priorPeriodStyle = displayConfig?.priorPeriodStyle || 'dashed'\n const priorPeriodOpacity = displayConfig?.priorPeriodOpacity ?? 0.5\n const periodLabels = hasComparisonData ? getPeriodLabels(data) : []\n\n // Transform data based on comparison mode\n let chartData: any[]\n let seriesKeys: string[]\n let effectiveXAxisKey = 'name' // Default X-axis key after transformation\n\n if (hasComparisonData) {\n // For comparison data, always use overlay transformation to align by period day index\n // Both 'separate' and 'overlay' modes use the same data transformation,\n // they differ only in styling (dashed lines, opacity for prior periods in overlay mode)\n const overlayResult = transformForOverlayMode(data, yAxisFields, xAxisField, getFieldLabel)\n chartData = overlayResult.data\n seriesKeys = overlayResult.seriesKeys\n effectiveXAxisKey = '__periodDayIndex'\n } else {\n // Standard mode: use normal transformation\n const standardResult = transformChartDataWithSeries(\n data,\n xAxisField,\n yAxisFields,\n queryObject,\n seriesFields,\n getFieldLabel\n )\n chartData = standardResult.data\n seriesKeys = standardResult.seriesKeys\n }\n\n // Helper to find field from series key, handling comparison suffixes like \"(Current)\" and \"(Prior)\"\n const findFieldFromSeriesKey = (seriesKey: string): string | undefined => {\n // Direct match first\n if (seriesKeyToField[seriesKey]) {\n return seriesKeyToField[seriesKey]\n }\n // For comparison data, strip the period suffix and any dimension prefix\n // Series keys look like: \"Label (Current)\", \"Label (Prior)\", or \"DimValue - Label (Current)\"\n const withoutSuffix = seriesKey.replace(/\\s*\\((Current|Prior)\\)$/, '')\n // Check if it has a dimension prefix (contains \" - \")\n const parts = withoutSuffix.split(' - ')\n const measureLabel = parts[parts.length - 1] // Last part is the measure label\n return seriesKeyToField[measureLabel]\n }\n\n // Determine if we need a right Y-axis\n const hasRightAxis = yAxisFields.some((field) => yAxisAssignment[field] === 'right')\n\n // Get fields for left and right axes for labels\n const leftAxisFields = yAxisFields.filter((f) => (yAxisAssignment[f] || 'left') === 'left')\n const rightAxisFields = yAxisFields.filter((f) => yAxisAssignment[f] === 'right')\n\n // Determine if legend will be shown\n const showLegend = safeDisplayConfig.showLegend\n\n // Use custom chart margins with extra space for Y-axis labels\n const chartMargins = {\n ...CHART_MARGINS,\n left: 40, // Space for left Y-axis label\n right: hasRightAxis ? 40 : 20 // Extra space for right Y-axis label if needed\n }\n\n // Process target values and add to chart data\n const targetValues = parseTargetValues(displayConfig?.target || '')\n const spreadTargets = spreadTargetValues(targetValues, chartData.length)\n\n // Add target data to chart data if targets exist\n let enhancedChartData = chartData\n if (spreadTargets.length > 0) {\n enhancedChartData = chartData.map((dataPoint, index) => ({\n ...dataPoint,\n __target: spreadTargets[index] || null\n }))\n }\n\n // Validate transformed data\n if (!chartData || chartData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">No valid data points for line chart after transformation</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsLineChart data={enhancedChartData} margin={chartMargins}>\n {safeDisplayConfig.showGrid && (\n <CartesianGrid strokeDasharray=\"3 3\" />\n )}\n <XAxis\n dataKey={effectiveXAxisKey}\n tick={{ fontSize: 12 }}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n tickFormatter={\n hasComparisonData\n ? (value, index) => {\n // For comparison data, show the date from the current period\n // formatted according to the query's granularity\n const row = chartData[index]\n if (row?.__displayDate) {\n const granularity = getFieldGranularity(queryObject, xAxisField)\n return formatTimeValue(row.__displayDate, granularity)\n }\n return `Period ${value + 1}`\n }\n : undefined\n }\n />\n <YAxis\n yAxisId=\"left\"\n orientation=\"left\"\n tick={{ fontSize: 12 }}\n tickFormatter={leftYAxisFormat ? (value) => formatAxisValue(value, leftYAxisFormat) : undefined}\n label={\n leftAxisFields.length > 0\n ? {\n value: leftYAxisFormat?.label || getFieldLabel(leftAxisFields[0]),\n angle: -90,\n position: 'left',\n style: { textAnchor: 'middle', fontSize: '12px' }\n }\n : undefined\n }\n />\n {hasRightAxis && (\n <YAxis\n yAxisId=\"right\"\n orientation=\"right\"\n tick={{ fontSize: 12 }}\n tickFormatter={rightYAxisFormat ? (value) => formatAxisValue(value, rightYAxisFormat) : undefined}\n label={\n rightAxisFields.length > 0\n ? {\n value: rightYAxisFormat?.label || getFieldLabel(rightAxisFields[0]),\n angle: 90,\n position: 'right',\n style: { textAnchor: 'middle', fontSize: '12px' }\n }\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={(value: any, name: any) => {\n // Handle null values in tooltip\n if (value === null || value === undefined) {\n return ['No data', name]\n }\n if (name === 'Target') {\n // Use left Y-axis format for target values\n return [formatAxisValue(value, leftYAxisFormat), 'Target Value']\n }\n\n // Determine which axis format to use based on series name\n const originalField = findFieldFromSeriesKey(name)\n const axisId = originalField && yAxisAssignment[originalField] === 'right' ? 'right' : 'left'\n const formatConfig = axisId === 'right' ? rightYAxisFormat : leftYAxisFormat\n // Series name is already formatted (e.g., \"Total Lines of Code (Current)\")\n return [formatAxisValue(value, formatConfig), name]\n }}\n labelFormatter={\n hasComparisonData\n ? (label: any, payload: any) => {\n // For comparison data, show the date from the current period\n // formatted according to the query's granularity\n if (payload && payload.length > 0) {\n const row = payload[0]?.payload\n if (row?.__displayDate) {\n const granularity = getFieldGranularity(queryObject, xAxisField)\n return formatTimeValue(row.__displayDate, granularity)\n }\n }\n return `Period ${Number(label) + 1}`\n }\n : undefined\n }\n />\n )}\n {showLegend && (\n <Legend\n wrapperStyle={{ fontSize: '12px', paddingTop: '25px' }}\n iconType=\"line\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n {seriesKeys.map((seriesKey, index) => {\n // Look up the original field name to get its axis assignment\n const originalField = findFieldFromSeriesKey(seriesKey)\n const axisId = originalField && yAxisAssignment[originalField] === 'right' ? 'right' : 'left'\n\n // Determine if this is a prior period series (for styling)\n const isPriorPeriod = hasComparisonData && isPriorPeriodSeries(seriesKey, periodLabels)\n const strokeDashArray = isPriorPeriod ? getPriorPeriodStrokeDashArray(priorPeriodStyle) : undefined\n const opacity = isPriorPeriod ? priorPeriodOpacity : 1\n\n return (\n <Line\n key={seriesKey}\n type=\"monotone\"\n dataKey={seriesKey}\n yAxisId={axisId}\n stroke={\n (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }\n strokeWidth={isPriorPeriod ? 1.5 : 2}\n strokeDasharray={strokeDashArray}\n dot={isPriorPeriod ? false : { r: 3 }}\n activeDot={isPriorPeriod ? false : { r: 5 }}\n strokeOpacity={\n hoveredLegend\n ? (hoveredLegend === seriesKey ? 1 : 0.3)\n : opacity\n }\n connectNulls={safeDisplayConfig.connectNulls}\n />\n )\n })}\n {spreadTargets.length > 0 && (\n <>\n {/* White background line */}\n <Line\n type=\"monotone\"\n dataKey=\"__target\"\n yAxisId=\"left\"\n stroke=\"#ffffff\"\n strokeWidth={2}\n dot={false}\n activeDot={false}\n connectNulls={false}\n />\n {/* Grey dashed line on top */}\n <Line\n type=\"monotone\"\n dataKey=\"__target\"\n yAxisId=\"left\"\n name=\"Target\"\n stroke=\"#8B5CF6\"\n strokeWidth={2}\n strokeDasharray=\"2 3\"\n dot={false}\n activeDot={false}\n connectNulls={false}\n />\n </>\n )}\n </RechartsLineChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'LineChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-dc-error p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Line Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n})\n\nexport default LineChart\n","import React, { useState } from 'react'\nimport { ComposedChart, Area, Line, XAxis, YAxis, CartesianGrid, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS, CHART_MARGINS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatAxisValue } from '../../utils/chartUtils'\nimport { parseTargetValues, spreadTargetValues } from '../../utils/targetUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\nconst AreaChart = React.memo(function AreaChart({ \n data, \n chartConfig, \n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n \n try {\n // Determine stacking from stackType (new) or stacked (legacy)\n const stackType = displayConfig?.stackType ?? (displayConfig?.stacked ? 'normal' : 'none')\n const shouldStack = stackType !== 'none'\n const isPercentStack = stackType === 'percent'\n\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n connectNulls: displayConfig?.connectNulls ?? false\n }\n\n // Extract axis format configs\n const leftYAxisFormat = displayConfig?.leftYAxisFormat\n const rightYAxisFormat = displayConfig?.rightYAxisFormat\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in area chart</div>\n </div>\n </div>\n )\n }\n\n // Validate chartConfig - support both legacy and new formats\n let xAxisField: string\n let yAxisFields: string[]\n let seriesFields: string[] = []\n \n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format\n xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n yAxisFields = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis]\n seriesFields = chartConfig.series || []\n } else if (chartConfig?.x && chartConfig?.y) {\n // Legacy format\n xAxisField = chartConfig.x\n yAxisFields = Array.isArray(chartConfig.y) ? chartConfig.y : [chartConfig.y]\n } else {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">Invalid or missing chart axis configuration</div>\n </div>\n </div>\n )\n }\n\n if (!xAxisField || !yAxisFields || yAxisFields.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">Missing required X-axis or Y-axis fields</div>\n </div>\n </div>\n )\n }\n\n // Use shared function to transform data and handle series\n const { data: chartData, seriesKeys } = transformChartDataWithSeries(\n data,\n xAxisField,\n yAxisFields,\n queryObject,\n seriesFields,\n getFieldLabel\n )\n\n // Dual Y-axis support: extract yAxisAssignment from chartConfig\n const yAxisAssignment = chartConfig?.yAxisAssignment || {}\n\n // Build mapping from series key (label) to original field name\n const seriesKeyToField: Record<string, string> = {}\n yAxisFields.forEach((field) => {\n const label = getFieldLabel(field)\n seriesKeyToField[label] = field\n })\n\n // Determine if we need a right Y-axis\n const hasRightAxis = yAxisFields.some((field) => yAxisAssignment[field] === 'right')\n\n // Get fields for left and right axes for labels\n const leftAxisFields = yAxisFields.filter((f) => (yAxisAssignment[f] || 'left') === 'left')\n const rightAxisFields = yAxisFields.filter((f) => yAxisAssignment[f] === 'right')\n\n // Disable stacking when dual Y-axis is used (areas on different axes can't be stacked)\n const effectiveShouldStack = shouldStack && !hasRightAxis\n const effectiveIsPercentStack = isPercentStack && !hasRightAxis\n\n // Determine if legend will be shown\n const showLegend = safeDisplayConfig.showLegend\n\n // Use custom chart margins with extra space for Y-axis labels\n const chartMargins = {\n ...CHART_MARGINS,\n left: 40, // Space for left Y-axis label\n right: hasRightAxis ? 40 : 20 // Extra space for right Y-axis label if needed\n }\n \n // Process target values and add to chart data\n const targetValues = parseTargetValues(displayConfig?.target || '')\n const spreadTargets = spreadTargetValues(targetValues, chartData.length)\n \n // Add target data to chart data if targets exist\n let enhancedChartData = chartData\n if (spreadTargets.length > 0) {\n enhancedChartData = chartData.map((dataPoint, index) => ({\n ...dataPoint,\n __target: spreadTargets[index] || null\n }))\n }\n \n // Validate transformed data\n if (!chartData || chartData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">No valid data points for area chart after transformation</div>\n </div>\n </div>\n )\n }\n\n // Determine stack offset for percentage stacking\n const stackOffset = effectiveIsPercentStack ? ('expand' as const) : undefined\n\n return (\n <ChartContainer height={height}>\n <ComposedChart data={enhancedChartData} margin={chartMargins} stackOffset={stackOffset}>\n {safeDisplayConfig.showGrid && <CartesianGrid strokeDasharray=\"3 3\" />}\n <XAxis dataKey=\"name\" tick={{ fontSize: 12 }} angle={-45} textAnchor=\"end\" height={60} />\n <YAxis\n yAxisId=\"left\"\n orientation=\"left\"\n tick={{ fontSize: 12 }}\n tickFormatter={\n effectiveIsPercentStack\n ? (v) => `${(v * 100).toFixed(0)}%`\n : leftYAxisFormat\n ? (value) => formatAxisValue(value, leftYAxisFormat)\n : undefined\n }\n domain={effectiveIsPercentStack ? [0, 1] : undefined}\n label={\n effectiveIsPercentStack\n ? undefined\n : leftAxisFields.length > 0\n ? {\n value: leftYAxisFormat?.label || getFieldLabel(leftAxisFields[0]),\n angle: -90,\n position: 'left',\n style: { textAnchor: 'middle', fontSize: '12px' }\n }\n : undefined\n }\n />\n {hasRightAxis && (\n <YAxis\n yAxisId=\"right\"\n orientation=\"right\"\n tick={{ fontSize: 12 }}\n tickFormatter={rightYAxisFormat ? (value) => formatAxisValue(value, rightYAxisFormat) : undefined}\n label={\n rightAxisFields.length > 0\n ? {\n value: rightYAxisFormat?.label || getFieldLabel(rightAxisFields[0]),\n angle: 90,\n position: 'right',\n style: { textAnchor: 'middle', fontSize: '12px' }\n }\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={(value: any, name: any) => {\n // Handle null values in tooltip\n if (value === null || value === undefined) {\n return ['No data', name]\n }\n if (name === 'Target') {\n // Use left Y-axis format for target values\n return [formatAxisValue(value, leftYAxisFormat), 'Target Value']\n }\n // Format as percentage when using percent stacking\n if (effectiveIsPercentStack && typeof value === 'number') {\n return [`${(value * 100).toFixed(1)}%`, name]\n }\n // Determine which axis format to use based on series name\n const originalField = seriesKeyToField[name]\n const axisId = originalField && yAxisAssignment[originalField] === 'right' ? 'right' : 'left'\n const formatConfig = axisId === 'right' ? rightYAxisFormat : leftYAxisFormat\n return [formatAxisValue(value, formatConfig), name]\n }}\n />\n )}\n {showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"rect\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n {seriesKeys.map((seriesKey, index) => {\n // Look up the original field name to get its axis assignment\n const originalField = seriesKeyToField[seriesKey]\n const axisId = originalField && yAxisAssignment[originalField] === 'right' ? 'right' : 'left'\n return (\n <Area\n key={seriesKey}\n type=\"monotone\"\n dataKey={seriesKey}\n yAxisId={axisId}\n stackId={effectiveShouldStack ? 'stack' : undefined}\n stroke={\n (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }\n fill={\n (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) ||\n CHART_COLORS[index % CHART_COLORS.length]\n }\n fillOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 0.6 : 0.1) : 0.3}\n strokeWidth={2}\n strokeOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n connectNulls={safeDisplayConfig.connectNulls}\n />\n )\n })}\n {spreadTargets.length > 0 && (\n <>\n {/* White background line */}\n <Line\n type=\"monotone\"\n dataKey=\"__target\"\n yAxisId=\"left\"\n stroke=\"#ffffff\"\n strokeWidth={2}\n dot={false}\n activeDot={false}\n connectNulls={false}\n />\n {/* Grey dashed line on top */}\n <Line\n type=\"monotone\"\n dataKey=\"__target\"\n yAxisId=\"left\"\n name=\"Target\"\n stroke=\"#8B5CF6\"\n strokeWidth={2}\n strokeDasharray=\"2 3\"\n dot={false}\n activeDot={false}\n connectNulls={false}\n />\n </>\n )}\n </ComposedChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'AreaChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-dc-error p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Area Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n})\n\nexport default AreaChart","import React, { useState } from 'react'\nimport { PieChart as RechartsPieChart, Pie, Cell, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\nconst PieChart = React.memo(function PieChart({ \n data, \n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in pie chart</div>\n </div>\n </div>\n )\n }\n\n let pieData: Array<{name: string, value: number}>\n\n // Validate chartConfig - support both legacy and new formats\n let xAxisField: string\n let yAxisFields: string[]\n let seriesFields: string[] = []\n \n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format\n xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n yAxisFields = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis]\n seriesFields = chartConfig.series || []\n } else if (chartConfig?.x && chartConfig?.y) {\n // Legacy format\n xAxisField = chartConfig.x\n yAxisFields = Array.isArray(chartConfig.y) ? chartConfig.y : [chartConfig.y]\n } else {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">chartConfig.x/y or chartConfig.xAxis/yAxis required for pie chart</div>\n </div>\n </div>\n )\n }\n\n if (!xAxisField || !yAxisFields || yAxisFields.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">Missing required X-axis or Y-axis fields</div>\n </div>\n </div>\n )\n }\n\n if (seriesFields.length > 0) {\n // Use series-based transformation for dimension-based pie slices\n const { data: chartData } = transformChartDataWithSeries(\n data,\n xAxisField,\n yAxisFields,\n queryObject,\n seriesFields,\n getFieldLabel\n )\n \n // Convert series data to pie format\n pieData = []\n if (chartData.length > 0) {\n const firstRow = chartData[0]\n Object.keys(firstRow).forEach(key => {\n if (key !== 'name' && typeof firstRow[key] === 'number') {\n pieData.push({\n name: String(key),\n value: firstRow[key]\n })\n }\n })\n }\n } else {\n // Standard measure-based pie chart\n const granularity = getFieldGranularity(queryObject, xAxisField)\n pieData = data.map(item => {\n let name = formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown'\n // Handle boolean values with better labels\n if (typeof item[xAxisField] === 'boolean') {\n name = item[xAxisField] ? 'Active' : 'Inactive'\n } else if (name === 'true' || name === 'false') {\n name = name === 'true' ? 'Active' : 'Inactive'\n }\n return {\n name,\n value: typeof item[yAxisFields[0]] === 'string' \n ? parseFloat(item[yAxisFields[0]]) \n : (item[yAxisFields[0]] || 0)\n }\n })\n }\n\n // Filter out invalid values (null, undefined, NaN, or zero)\n const originalLength = pieData.length\n pieData = pieData.filter(item => \n item.value != null && \n !isNaN(item.value) && \n item.value !== 0 && \n item.value > 0\n )\n \n if (pieData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">\n {originalLength > 0\n ? `Filtered out ${originalLength} data points (zero or invalid values)`\n : 'No data points to display in pie chart'\n }\n </div>\n </div>\n </div>\n )\n }\n \n return (\n <ChartContainer height={height}>\n <RechartsPieChart>\n <Pie\n data={pieData}\n cx=\"50%\"\n cy=\"50%\"\n outerRadius=\"70%\"\n dataKey=\"value\"\n label={!safeDisplayConfig.showLegend ? ({ name, percent }) => \n `${name} ${((percent || 0) * 100).toFixed(0)}%`\n : undefined}\n >\n {pieData.map((_entry, index) => (\n <Cell \n key={`cell-${index}`} \n fill={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fillOpacity={hoveredLegend ? (hoveredLegend === pieData[index].name ? 1 : 0.3) : 1}\n />\n ))}\n </Pie>\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, safeDisplayConfig.leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.value || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n </RechartsPieChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'PieChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-dc-error p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Pie Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n})\n\nexport default PieChart","import React, { useState } from 'react'\nimport { ScatterChart as RechartsScatterChart, Scatter, XAxis, YAxis, CartesianGrid, Legend, Tooltip } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport { CHART_COLORS, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity, parseNumericValue, isValidNumericValue, formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\nconst ScatterChart = React.memo(function ScatterChart({ \n data, \n chartConfig, \n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true\n }\n\n // Extract axis format configs\n // For scatter charts, xAxis uses xAxisFormat, yAxis uses leftYAxisFormat\n const xAxisFormat = displayConfig?.xAxisFormat\n const yAxisFormat = displayConfig?.leftYAxisFormat\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in scatter chart</div>\n </div>\n </div>\n )\n }\n\n // Validate chartConfig - support both legacy and new formats\n let xAxisField: string\n let yAxisField: string\n let seriesFields: string[] = []\n \n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - handle both string and array values\n xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis\n // Normalize series to array\n const seriesConfig = chartConfig.series\n seriesFields = seriesConfig ? (Array.isArray(seriesConfig) ? seriesConfig : [seriesConfig]) : []\n } else if (chartConfig?.x && chartConfig?.y) {\n // Legacy format (adapt for scatter chart)\n xAxisField = chartConfig.x\n yAxisField = Array.isArray(chartConfig.y) ? chartConfig.y[0] : chartConfig.y\n } else {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">Invalid or missing chart axis configuration</div>\n </div>\n </div>\n )\n }\n\n if (!xAxisField || !yAxisField) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">Missing required X-axis or Y-axis fields</div>\n </div>\n </div>\n )\n }\n\n // Extract time dimensions from query for tooltip display\n const timeDimensions = queryObject?.timeDimensions || []\n const timeDimensionFields = timeDimensions.map((td: any) => td.dimension)\n\n // Transform data for scatter plot\n // Null handling: Filter out data points where x or y coordinates are null\n let scatterData: any[]\n let seriesGroups: { [key: string]: any[] } = {}\n\n if (seriesFields.length > 0) {\n // Group data by series field\n const seriesField = seriesFields[0]\n data.forEach(item => {\n const seriesValue = String(item[seriesField] || 'Default')\n if (!seriesGroups[seriesValue]) {\n seriesGroups[seriesValue] = []\n }\n\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n const xValue = formatTimeValue(item[xAxisField], xGranularity) || item[xAxisField]\n const yValue = parseNumericValue(item[yAxisField])\n\n // Only add point if both x and y are valid numbers\n const xNum = typeof xValue === 'string' ? parseFloat(xValue) : xValue\n if (isValidNumericValue(xNum) && yValue !== null) {\n // Extract time dimension values for tooltip\n const timeValues: { [key: string]: string } = {}\n timeDimensionFields.forEach((field: string) => {\n if (item[field]) {\n const granularity = getFieldGranularity(queryObject, field)\n timeValues[field] = formatTimeValue(item[field], granularity)\n }\n })\n\n seriesGroups[seriesValue].push({\n x: xNum,\n y: yValue,\n name: seriesValue,\n timeValues,\n originalItem: item\n })\n }\n })\n\n // Collect all valid points from all series for validation\n // (The actual rendering uses seriesGroups with series separated)\n const seriesKeys = Object.keys(seriesGroups)\n scatterData = seriesKeys.flatMap(key => seriesGroups[key])\n } else {\n // Single series scatter plot\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n scatterData = data\n .map(item => {\n const xValue = formatTimeValue(item[xAxisField], xGranularity) || item[xAxisField]\n const yValue = parseNumericValue(item[yAxisField])\n const xNum = typeof xValue === 'string' ? parseFloat(xValue) : xValue\n\n // Extract time dimension values for tooltip\n const timeValues: { [key: string]: string } = {}\n timeDimensionFields.forEach((field: string) => {\n if (item[field]) {\n const granularity = getFieldGranularity(queryObject, field)\n timeValues[field] = formatTimeValue(item[field], granularity)\n }\n })\n\n return {\n x: xNum,\n y: yValue,\n name: `Point`,\n timeValues,\n originalItem: item,\n isValid: isValidNumericValue(xNum) && yValue !== null\n }\n })\n .filter(point => point.isValid)\n }\n \n // Validate transformed data\n if (!scatterData || scatterData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">No valid data points for scatter chart after transformation</div>\n </div>\n </div>\n )\n }\n\n const seriesKeys = Object.keys(seriesGroups)\n // Limit series to prevent performance issues with high-cardinality fields (e.g., dates)\n // If more than 20 unique series, fall back to single-series mode\n const MAX_SERIES = 20\n const hasSeries = seriesKeys.length > 1 && seriesKeys.length <= MAX_SERIES\n \n // Determine if legend will be shown\n const showLegend = safeDisplayConfig.showLegend && hasSeries\n \n // Use custom chart margins with extra left space for Y-axis label\n const chartMargins = {\n ...CHART_MARGINS,\n left: 40 // Increased from 20 to 40 for Y-axis label space\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsScatterChart margin={chartMargins}>\n {safeDisplayConfig.showGrid && (\n <CartesianGrid strokeDasharray=\"3 3\" />\n )}\n <XAxis\n type=\"number\"\n dataKey=\"x\"\n name={xAxisFormat?.label || getFieldLabel(xAxisField)}\n tick={{ fontSize: 12 }}\n tickFormatter={xAxisFormat ? (value) => formatAxisValue(value, xAxisFormat) : undefined}\n />\n <YAxis\n type=\"number\"\n dataKey=\"y\"\n name={yAxisFormat?.label || getFieldLabel(yAxisField)}\n tick={{ fontSize: 12 }}\n tickFormatter={yAxisFormat ? (value) => formatAxisValue(value, yAxisFormat) : undefined}\n label={{ value: yAxisFormat?.label || getFieldLabel(yAxisField), angle: -90, position: 'left', style: { textAnchor: 'middle', fontSize: '12px' } }}\n />\n {safeDisplayConfig.showTooltip && (\n <Tooltip\n cursor={{ strokeDasharray: '3 3' }}\n content={({ active, payload }) => {\n if (!active || !payload || payload.length === 0) return null\n // Only show the first (active) point\n const point = payload[0]?.payload\n if (!point) return null\n\n return (\n <div style={{\n backgroundColor: 'white',\n border: '1px solid #e5e7eb',\n borderRadius: '0.5rem',\n fontSize: '0.875rem',\n color: '#1f2937',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1)',\n padding: '8px 12px'\n }}>\n <div style={{ fontWeight: 600, marginBottom: '4px' }}>{point.name}</div>\n {/* Show time dimension values if present */}\n {point.timeValues && Object.keys(point.timeValues).length > 0 && (\n <div style={{ marginBottom: '4px', color: '#6b7280' }}>\n {Object.entries(point.timeValues).map(([field, value]) => (\n <div key={field}>{getFieldLabel(field)}: {value as string}</div>\n ))}\n </div>\n )}\n <div>{xAxisFormat?.label || getFieldLabel(xAxisField)}: {formatAxisValue(point.x, xAxisFormat)}</div>\n <div>{yAxisFormat?.label || getFieldLabel(yAxisField)}: {formatAxisValue(point.y, yAxisFormat)}</div>\n </div>\n )\n }}\n />\n )}\n {showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n {hasSeries ? (\n // Multiple series\n seriesKeys.map((seriesKey, index) => (\n <Scatter\n key={seriesKey}\n name={seriesKey}\n data={seriesGroups[seriesKey]}\n fill={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fillOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n />\n ))\n ) : (\n // Single series\n <Scatter\n name=\"Data\"\n data={scatterData}\n fill={(colorPalette?.colors && colorPalette.colors[0]) || CHART_COLORS[0]}\n />\n )}\n </RechartsScatterChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'ScatterChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-dc-error p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Scatter Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n})\n\nexport default ScatterChart","import React, { useState } from 'react'\nimport { RadarChart as RechartsRadarChart, PolarGrid, PolarAngleAxis, PolarRadiusAxis, Radar, Legend } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { transformChartDataWithSeries, formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils'\nimport type { ChartProps } from '../../types'\n\nconst RadarChart = React.memo(function RadarChart({ \n data, \n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in radar chart</div>\n </div>\n </div>\n )\n }\n\n let radarData: any[]\n let seriesKeys: string[] = []\n\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - use chart config\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis // Subject/category field\n const yAxisFields = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis : [chartConfig.yAxis] // Value fields\n const seriesFields = chartConfig.series || []\n\n // Use shared function to transform data and handle series\n const { data: chartData, seriesKeys: transformedSeriesKeys } = transformChartDataWithSeries(\n data, \n xAxisField, \n yAxisFields, \n queryObject,\n seriesFields\n )\n \n radarData = chartData\n seriesKeys = transformedSeriesKeys\n } else {\n // Legacy format or auto-detection - try to find suitable fields\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n \n // Try to find subject/category field\n const subjectField = keys.find(key => \n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('subject') ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n // Find numeric fields for values\n const valueFields = keys.filter(key => \n typeof firstRow[key] === 'number' && key !== subjectField\n )\n\n if (valueFields.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">No numeric fields found for radar chart values</div>\n </div>\n </div>\n )\n }\n\n // Transform data for radar chart\n if (subjectField) {\n // Use subject field for radar categories\n const granularity = getFieldGranularity(queryObject, subjectField)\n radarData = data.map(item => {\n const transformedItem: any = {\n name: formatTimeValue(item[subjectField], granularity) || String(item[subjectField]) || 'Unknown'\n }\n \n valueFields.forEach(field => {\n const displayName = field.split('.').pop() || field\n transformedItem[displayName] = typeof item[field] === 'string' \n ? parseFloat(item[field]) \n : (item[field] || 0)\n })\n \n return transformedItem\n })\n \n seriesKeys = valueFields.map(field => field.split('.').pop() || field)\n } else {\n // Fallback - use first value field only\n radarData = data.map(item => ({\n name: String(item[keys[0]] || 'Unknown'),\n value: typeof item[valueFields[0]] === 'string' \n ? parseFloat(item[valueFields[0]]) \n : (item[valueFields[0]] || 0)\n }))\n seriesKeys = ['value']\n }\n }\n \n // Validate transformed data\n if (!radarData || radarData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">No valid data points for radar chart after transformation</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsRadarChart data={radarData} margin={{ top: 20, right: 80, bottom: 20, left: 80 }}>\n {safeDisplayConfig.showGrid && (\n <PolarGrid />\n )}\n <PolarAngleAxis\n dataKey=\"name\"\n tick={{ fontSize: 12 }}\n className=\"text-dc-text-muted\"\n />\n <PolarRadiusAxis\n tick={{ fontSize: 10 }}\n className=\"text-dc-text-muted\"\n tickFormatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any) => formatAxisValue(value, safeDisplayConfig.leftYAxisFormat)\n : undefined\n }\n />\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, safeDisplayConfig.leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {(safeDisplayConfig.showLegend && seriesKeys.length > 1) && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"rect\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.dataKey || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n {seriesKeys.map((seriesKey, index) => (\n <Radar\n key={seriesKey}\n name={seriesKey}\n dataKey={seriesKey}\n stroke={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fill={(colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]}\n fillOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 0.6 : 0.1) : 0.3}\n strokeOpacity={hoveredLegend ? (hoveredLegend === seriesKey ? 1 : 0.3) : 1}\n strokeWidth={2}\n />\n ))}\n </RechartsRadarChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'RadarChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-dc-error p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Radar Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n})\n\nexport default RadarChart","import React, { useState } from 'react'\nimport { RadialBarChart as RechartsRadialBarChart, RadialBar, Legend, Cell } from 'recharts'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils'\nimport type { ChartProps } from '../../types'\n\nconst RadialBarChart = React.memo(function RadialBarChart({ \n data, \n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredLegend, setHoveredLegend] = useState<string | null>(null)\n \n try {\n const safeDisplayConfig = {\n showLegend: displayConfig?.showLegend ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in radial bar chart</div>\n </div>\n </div>\n )\n }\n\n let radialData: Array<{name: string, value: number, fill?: string}>\n\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - use chart config\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis // Name/category field\n const yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis // Value field\n\n const granularity = getFieldGranularity(queryObject, xAxisField)\n radialData = data.map((item, index) => ({\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n value: typeof item[yAxisField] === 'string' \n ? parseFloat(item[yAxisField]) \n : (item[yAxisField] || 0),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n }))\n } else {\n // Legacy format or auto-detection\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n \n // Try to find name/label field\n const nameField = keys.find(key => \n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('label') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n // Find a numeric field for values\n const valueField = keys.find(key => \n typeof firstRow[key] === 'number' && key !== nameField\n ) || keys[1]\n\n if (!valueField) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">No numeric field found for radial bar chart values</div>\n </div>\n </div>\n )\n }\n\n // Transform data for radial bar chart\n radialData = data.map((item, index) => {\n let name = item[nameField]\n // Handle boolean values with better labels\n if (typeof name === 'boolean') {\n name = name ? 'Active' : 'Inactive'\n } else if (name === 'true' || name === 'false') {\n name = name === 'true' ? 'Active' : 'Inactive'\n } else {\n name = String(name)\n }\n return {\n name,\n value: typeof item[valueField] === 'string' \n ? parseFloat(item[valueField]) \n : (item[valueField] || 0),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n }\n })\n }\n\n // Filter out zero/null values\n radialData = radialData.filter(item => item.value != null && item.value !== 0)\n \n if (radialData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">No valid data points for radial bar chart after transformation</div>\n </div>\n </div>\n )\n }\n\n return (\n <ChartContainer height={height}>\n <RechartsRadialBarChart \n data={radialData}\n innerRadius=\"10%\"\n outerRadius=\"80%\"\n margin={{ top: 20, right: 30, bottom: 20, left: 30 }}\n >\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, safeDisplayConfig.leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n {safeDisplayConfig.showLegend && (\n <Legend \n wrapperStyle={{ fontSize: '12px', paddingTop: '10px' }}\n iconType=\"circle\"\n iconSize={8}\n layout=\"horizontal\"\n align=\"center\"\n verticalAlign=\"bottom\"\n onMouseEnter={(o) => setHoveredLegend(String(o.value || ''))}\n onMouseLeave={() => setHoveredLegend(null)}\n />\n )}\n <RadialBar\n dataKey=\"value\"\n cornerRadius={4}\n label={{\n position: 'insideStart',\n fill: '#fff',\n fontSize: 12,\n formatter: safeDisplayConfig.leftYAxisFormat\n ? (value: any) => formatAxisValue(value, safeDisplayConfig.leftYAxisFormat)\n : undefined\n }}\n >\n {radialData.map((entry, index) => (\n <Cell \n key={`cell-${index}`} \n fill={entry.fill}\n fillOpacity={hoveredLegend ? (hoveredLegend === entry.name ? 1 : 0.3) : 1}\n />\n ))}\n </RadialBar>\n </RechartsRadialBarChart>\n </ChartContainer>\n )\n } catch (error) {\n // 'RadialBarChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-dc-error p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Radial Bar Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n})\n\nexport default RadialBarChart","export default function ascending(a, b) {\n return a == null || b == null ? NaN : a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function descending(a, b) {\n return a == null || b == null ? NaN\n : b < a ? -1\n : b > a ? 1\n : b >= a ? 0\n : NaN;\n}\n","import ascending from \"./ascending.js\";\nimport descending from \"./descending.js\";\n\nexport default function bisector(f) {\n let compare1, compare2, delta;\n\n // If an accessor is specified, promote it to a comparator. In this case we\n // can test whether the search value is (self-) comparable. We can’t do this\n // for a comparator (except for specific, known comparators) because we can’t\n // tell if the comparator is symmetric, and an asymmetric comparator can’t be\n // used to test whether a single value is comparable.\n if (f.length !== 2) {\n compare1 = ascending;\n compare2 = (d, x) => ascending(f(d), x);\n delta = (d, x) => f(d) - x;\n } else {\n compare1 = f === ascending || f === descending ? f : zero;\n compare2 = f;\n delta = f;\n }\n\n function left(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function right(a, x, lo = 0, hi = a.length) {\n if (lo < hi) {\n if (compare1(x, x) !== 0) return hi;\n do {\n const mid = (lo + hi) >>> 1;\n if (compare2(a[mid], x) <= 0) lo = mid + 1;\n else hi = mid;\n } while (lo < hi);\n }\n return lo;\n }\n\n function center(a, x, lo = 0, hi = a.length) {\n const i = left(a, x, lo, hi - 1);\n return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i;\n }\n\n return {left, center, right};\n}\n\nfunction zero() {\n return 0;\n}\n","export default function number(x) {\n return x === null ? NaN : +x;\n}\n\nexport function* numbers(values, valueof) {\n if (valueof === undefined) {\n for (let value of values) {\n if (value != null && (value = +value) >= value) {\n yield value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) {\n yield value;\n }\n }\n }\n}\n","import ascending from \"./ascending.js\";\nimport bisector from \"./bisector.js\";\nimport number from \"./number.js\";\n\nconst ascendingBisect = bisector(ascending);\nexport const bisectRight = ascendingBisect.right;\nexport const bisectLeft = ascendingBisect.left;\nexport const bisectCenter = bisector(number).center;\nexport default bisectRight;\n","export default function extent(values, valueof) {\n let min;\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null) {\n if (min === undefined) {\n if (value >= value) min = max = value;\n } else {\n if (min > value) min = value;\n if (max < value) max = value;\n }\n }\n }\n }\n return [min, max];\n}\n","export class InternMap extends Map {\n constructor(entries, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (entries != null) for (const [key, value] of entries) this.set(key, value);\n }\n get(key) {\n return super.get(intern_get(this, key));\n }\n has(key) {\n return super.has(intern_get(this, key));\n }\n set(key, value) {\n return super.set(intern_set(this, key), value);\n }\n delete(key) {\n return super.delete(intern_delete(this, key));\n }\n}\n\nexport class InternSet extends Set {\n constructor(values, key = keyof) {\n super();\n Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}});\n if (values != null) for (const value of values) this.add(value);\n }\n has(value) {\n return super.has(intern_get(this, value));\n }\n add(value) {\n return super.add(intern_set(this, value));\n }\n delete(value) {\n return super.delete(intern_delete(this, value));\n }\n}\n\nfunction intern_get({_intern, _key}, value) {\n const key = _key(value);\n return _intern.has(key) ? _intern.get(key) : value;\n}\n\nfunction intern_set({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) return _intern.get(key);\n _intern.set(key, value);\n return value;\n}\n\nfunction intern_delete({_intern, _key}, value) {\n const key = _key(value);\n if (_intern.has(key)) {\n value = _intern.get(key);\n _intern.delete(key);\n }\n return value;\n}\n\nfunction keyof(value) {\n return value !== null && typeof value === \"object\" ? value.valueOf() : value;\n}\n","const e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nfunction tickSpec(start, stop, count) {\n const step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log10(step)),\n error = step / Math.pow(10, power),\n factor = error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1;\n let i1, i2, inc;\n if (power < 0) {\n inc = Math.pow(10, -power) / factor;\n i1 = Math.round(start * inc);\n i2 = Math.round(stop * inc);\n if (i1 / inc < start) ++i1;\n if (i2 / inc > stop) --i2;\n inc = -inc;\n } else {\n inc = Math.pow(10, power) * factor;\n i1 = Math.round(start / inc);\n i2 = Math.round(stop / inc);\n if (i1 * inc < start) ++i1;\n if (i2 * inc > stop) --i2;\n }\n if (i2 < i1 && 0.5 <= count && count < 2) return tickSpec(start, stop, count * 2);\n return [i1, i2, inc];\n}\n\nexport default function ticks(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n if (!(count > 0)) return [];\n if (start === stop) return [start];\n const reverse = stop < start, [i1, i2, inc] = reverse ? tickSpec(stop, start, count) : tickSpec(start, stop, count);\n if (!(i2 >= i1)) return [];\n const n = i2 - i1 + 1, ticks = new Array(n);\n if (reverse) {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i2 - i) * inc;\n } else {\n if (inc < 0) for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) / -inc;\n else for (let i = 0; i < n; ++i) ticks[i] = (i1 + i) * inc;\n }\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n return tickSpec(start, stop, count)[2];\n}\n\nexport function tickStep(start, stop, count) {\n stop = +stop, start = +start, count = +count;\n const reverse = stop < start, inc = reverse ? tickIncrement(stop, start, count) : tickIncrement(start, stop, count);\n return (reverse ? -1 : 1) * (inc < 0 ? 1 / -inc : inc);\n}\n","export default function max(values, valueof) {\n let max;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (max < value || (max === undefined && value >= value))) {\n max = value;\n }\n }\n }\n return max;\n}\n","export default function min(values, valueof) {\n let min;\n if (valueof === undefined) {\n for (const value of values) {\n if (value != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n } else {\n let index = -1;\n for (let value of values) {\n if ((value = valueof(value, ++index, values)) != null\n && (min > value || (min === undefined && value >= value))) {\n min = value;\n }\n }\n }\n return min;\n}\n","export default function(x) {\n return x;\n}\n","import identity from \"./identity.js\";\n\nvar top = 1,\n right = 2,\n bottom = 3,\n left = 4,\n epsilon = 1e-6;\n\nfunction translateX(x) {\n return \"translate(\" + x + \",0)\";\n}\n\nfunction translateY(y) {\n return \"translate(0,\" + y + \")\";\n}\n\nfunction number(scale) {\n return d => +scale(d);\n}\n\nfunction center(scale, offset) {\n offset = Math.max(0, scale.bandwidth() - offset * 2) / 2;\n if (scale.round()) offset = Math.round(offset);\n return d => +scale(d) + offset;\n}\n\nfunction entering() {\n return !this.__axis;\n}\n\nfunction axis(orient, scale) {\n var tickArguments = [],\n tickValues = null,\n tickFormat = null,\n tickSizeInner = 6,\n tickSizeOuter = 6,\n tickPadding = 3,\n offset = typeof window !== \"undefined\" && window.devicePixelRatio > 1 ? 0 : 0.5,\n k = orient === top || orient === left ? -1 : 1,\n x = orient === left || orient === right ? \"x\" : \"y\",\n transform = orient === top || orient === bottom ? translateX : translateY;\n\n function axis(context) {\n var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,\n format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat,\n spacing = Math.max(tickSizeInner, 0) + tickPadding,\n range = scale.range(),\n range0 = +range[0] + offset,\n range1 = +range[range.length - 1] + offset,\n position = (scale.bandwidth ? center : number)(scale.copy(), offset),\n selection = context.selection ? context.selection() : context,\n path = selection.selectAll(\".domain\").data([null]),\n tick = selection.selectAll(\".tick\").data(values, scale).order(),\n tickExit = tick.exit(),\n tickEnter = tick.enter().append(\"g\").attr(\"class\", \"tick\"),\n line = tick.select(\"line\"),\n text = tick.select(\"text\");\n\n path = path.merge(path.enter().insert(\"path\", \".tick\")\n .attr(\"class\", \"domain\")\n .attr(\"stroke\", \"currentColor\"));\n\n tick = tick.merge(tickEnter);\n\n line = line.merge(tickEnter.append(\"line\")\n .attr(\"stroke\", \"currentColor\")\n .attr(x + \"2\", k * tickSizeInner));\n\n text = text.merge(tickEnter.append(\"text\")\n .attr(\"fill\", \"currentColor\")\n .attr(x, k * spacing)\n .attr(\"dy\", orient === top ? \"0em\" : orient === bottom ? \"0.71em\" : \"0.32em\"));\n\n if (context !== selection) {\n path = path.transition(context);\n tick = tick.transition(context);\n line = line.transition(context);\n text = text.transition(context);\n\n tickExit = tickExit.transition(context)\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { return isFinite(d = position(d)) ? transform(d + offset) : this.getAttribute(\"transform\"); });\n\n tickEnter\n .attr(\"opacity\", epsilon)\n .attr(\"transform\", function(d) { var p = this.parentNode.__axis; return transform((p && isFinite(p = p(d)) ? p : position(d)) + offset); });\n }\n\n tickExit.remove();\n\n path\n .attr(\"d\", orient === left || orient === right\n ? (tickSizeOuter ? \"M\" + k * tickSizeOuter + \",\" + range0 + \"H\" + offset + \"V\" + range1 + \"H\" + k * tickSizeOuter : \"M\" + offset + \",\" + range0 + \"V\" + range1)\n : (tickSizeOuter ? \"M\" + range0 + \",\" + k * tickSizeOuter + \"V\" + offset + \"H\" + range1 + \"V\" + k * tickSizeOuter : \"M\" + range0 + \",\" + offset + \"H\" + range1));\n\n tick\n .attr(\"opacity\", 1)\n .attr(\"transform\", function(d) { return transform(position(d) + offset); });\n\n line\n .attr(x + \"2\", k * tickSizeInner);\n\n text\n .attr(x, k * spacing)\n .text(format);\n\n selection.filter(entering)\n .attr(\"fill\", \"none\")\n .attr(\"font-size\", 10)\n .attr(\"font-family\", \"sans-serif\")\n .attr(\"text-anchor\", orient === right ? \"start\" : orient === left ? \"end\" : \"middle\");\n\n selection\n .each(function() { this.__axis = position; });\n }\n\n axis.scale = function(_) {\n return arguments.length ? (scale = _, axis) : scale;\n };\n\n axis.ticks = function() {\n return tickArguments = Array.from(arguments), axis;\n };\n\n axis.tickArguments = function(_) {\n return arguments.length ? (tickArguments = _ == null ? [] : Array.from(_), axis) : tickArguments.slice();\n };\n\n axis.tickValues = function(_) {\n return arguments.length ? (tickValues = _ == null ? null : Array.from(_), axis) : tickValues && tickValues.slice();\n };\n\n axis.tickFormat = function(_) {\n return arguments.length ? (tickFormat = _, axis) : tickFormat;\n };\n\n axis.tickSize = function(_) {\n return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeInner = function(_) {\n return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;\n };\n\n axis.tickSizeOuter = function(_) {\n return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;\n };\n\n axis.tickPadding = function(_) {\n return arguments.length ? (tickPadding = +_, axis) : tickPadding;\n };\n\n axis.offset = function(_) {\n return arguments.length ? (offset = +_, axis) : offset;\n };\n\n return axis;\n}\n\nexport function axisTop(scale) {\n return axis(top, scale);\n}\n\nexport function axisRight(scale) {\n return axis(right, scale);\n}\n\nexport function axisBottom(scale) {\n return axis(bottom, scale);\n}\n\nexport function axisLeft(scale) {\n return axis(left, scale);\n}\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n svg: \"http://www.w3.org/2000/svg\",\n xhtml: xhtml,\n xlink: \"http://www.w3.org/1999/xlink\",\n xml: \"http://www.w3.org/XML/1998/namespace\",\n xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n var prefix = name += \"\", i = prefix.indexOf(\":\");\n if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n","import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n return function() {\n var document = this.ownerDocument,\n uri = this.namespaceURI;\n return uri === xhtml && document.documentElement.namespaceURI === xhtml\n ? document.createElement(name)\n : document.createElementNS(uri, name);\n };\n}\n\nfunction creatorFixed(fullname) {\n return function() {\n return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n };\n}\n\nexport default function(name) {\n var fullname = namespace(name);\n return (fullname.local\n ? creatorFixed\n : creatorInherit)(fullname);\n}\n","function none() {}\n\nexport default function(selector) {\n return selector == null ? none : function() {\n return this.querySelector(selector);\n };\n}\n","import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n if (typeof select !== \"function\") select = selector(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n if (\"__data__\" in node) subnode.__data__ = node.__data__;\n subgroup[i] = subnode;\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don’t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nexport default function array(x) {\n return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n","function empty() {\n return [];\n}\n\nexport default function(selector) {\n return selector == null ? empty : function() {\n return this.querySelectorAll(selector);\n };\n}\n","import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n return function() {\n return array(select.apply(this, arguments));\n };\n}\n\nexport default function(select) {\n if (typeof select === \"function\") select = arrayAll(select);\n else select = selectorAll(select);\n\n for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n subgroups.push(select.call(node, node.__data__, i, group));\n parents.push(node);\n }\n }\n }\n\n return new Selection(subgroups, parents);\n}\n","export default function(selector) {\n return function() {\n return this.matches(selector);\n };\n}\n\nexport function childMatcher(selector) {\n return function(node) {\n return node.matches(selector);\n };\n}\n\n","import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n return function() {\n return find.call(this.children, match);\n };\n}\n\nfunction childFirst() {\n return this.firstElementChild;\n}\n\nexport default function(match) {\n return this.select(match == null ? childFirst\n : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n return function() {\n return filter.call(this.children, match);\n };\n}\n\nexport default function(match) {\n return this.selectAll(match == null ? children\n : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n if (typeof match !== \"function\") match = matcher(match);\n\n for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n subgroup.push(node);\n }\n }\n }\n\n return new Selection(subgroups, this._parents);\n}\n","export default function(update) {\n return new Array(update.length);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n this.ownerDocument = parent.ownerDocument;\n this.namespaceURI = parent.namespaceURI;\n this._next = null;\n this._parent = parent;\n this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n constructor: EnterNode,\n appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n querySelector: function(selector) { return this._parent.querySelector(selector); },\n querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","export default function(x) {\n return function() {\n return x;\n };\n}\n","import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n var i = 0,\n node,\n groupLength = group.length,\n dataLength = data.length;\n\n // Put any non-null nodes that fit into update.\n // Put any null nodes into enter.\n // Put any remaining data into enter.\n for (; i < dataLength; ++i) {\n if (node = group[i]) {\n node.__data__ = data[i];\n update[i] = node;\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Put any non-null nodes that don’t fit into exit.\n for (; i < groupLength; ++i) {\n if (node = group[i]) {\n exit[i] = node;\n }\n }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n var i,\n node,\n nodeByKeyValue = new Map,\n groupLength = group.length,\n dataLength = data.length,\n keyValues = new Array(groupLength),\n keyValue;\n\n // Compute the key for each node.\n // If multiple nodes have the same key, the duplicates are added to exit.\n for (i = 0; i < groupLength; ++i) {\n if (node = group[i]) {\n keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n if (nodeByKeyValue.has(keyValue)) {\n exit[i] = node;\n } else {\n nodeByKeyValue.set(keyValue, node);\n }\n }\n }\n\n // Compute the key for each datum.\n // If there a node associated with this key, join and add it to update.\n // If there is not (or the key is a duplicate), add it to enter.\n for (i = 0; i < dataLength; ++i) {\n keyValue = key.call(parent, data[i], i, data) + \"\";\n if (node = nodeByKeyValue.get(keyValue)) {\n update[i] = node;\n node.__data__ = data[i];\n nodeByKeyValue.delete(keyValue);\n } else {\n enter[i] = new EnterNode(parent, data[i]);\n }\n }\n\n // Add any remaining nodes that were not bound to data to exit.\n for (i = 0; i < groupLength; ++i) {\n if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n exit[i] = node;\n }\n }\n}\n\nfunction datum(node) {\n return node.__data__;\n}\n\nexport default function(value, key) {\n if (!arguments.length) return Array.from(this, datum);\n\n var bind = key ? bindKey : bindIndex,\n parents = this._parents,\n groups = this._groups;\n\n if (typeof value !== \"function\") value = constant(value);\n\n for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n var parent = parents[j],\n group = groups[j],\n groupLength = group.length,\n data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n dataLength = data.length,\n enterGroup = enter[j] = new Array(dataLength),\n updateGroup = update[j] = new Array(dataLength),\n exitGroup = exit[j] = new Array(groupLength);\n\n bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n // Now connect the enter nodes to their following update node, such that\n // appendChild can insert the materialized enter node before this node,\n // rather than at the end of the parent node.\n for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n if (previous = enterGroup[i0]) {\n if (i0 >= i1) i1 = i0 + 1;\n while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n previous._next = next || null;\n }\n }\n }\n\n update = new Selection(update, parents);\n update._enter = enter;\n update._exit = exit;\n return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn’t worried about “live” collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don’t; we’d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n return typeof data === \"object\" && \"length\" in data\n ? data // Array, TypedArray, NodeList, array-like\n : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","export default function(onenter, onupdate, onexit) {\n var enter = this.enter(), update = this, exit = this.exit();\n if (typeof onenter === \"function\") {\n enter = onenter(enter);\n if (enter) enter = enter.selection();\n } else {\n enter = enter.append(onenter + \"\");\n }\n if (onupdate != null) {\n update = onupdate(update);\n if (update) update = update.selection();\n }\n if (onexit == null) exit.remove(); else onexit(exit);\n return enter && update ? enter.merge(update).order() : update;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(context) {\n var selection = context.selection ? context.selection() : context;\n\n for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group0[i] || group1[i]) {\n merge[i] = node;\n }\n }\n }\n\n for (; j < m0; ++j) {\n merges[j] = groups0[j];\n }\n\n return new Selection(merges, this._parents);\n}\n","export default function() {\n\n for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n if (node = group[i]) {\n if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n next = node;\n }\n }\n }\n\n return this;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n if (!compare) compare = ascending;\n\n function compareNode(a, b) {\n return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n }\n\n for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n if (node = group[i]) {\n sortgroup[i] = node;\n }\n }\n sortgroup.sort(compareNode);\n }\n\n return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function() {\n var callback = arguments[0];\n arguments[0] = this;\n callback.apply(null, arguments);\n return this;\n}\n","export default function() {\n return Array.from(this);\n}\n","export default function() {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n var node = group[i];\n if (node) return node;\n }\n }\n\n return null;\n}\n","export default function() {\n let size = 0;\n for (const node of this) ++size; // eslint-disable-line no-unused-vars\n return size;\n}\n","export default function() {\n return !this.node();\n}\n","export default function(callback) {\n\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) callback.call(node, node.__data__, i, group);\n }\n }\n\n return this;\n}\n","import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n return function() {\n this.removeAttribute(name);\n };\n}\n\nfunction attrRemoveNS(fullname) {\n return function() {\n this.removeAttributeNS(fullname.space, fullname.local);\n };\n}\n\nfunction attrConstant(name, value) {\n return function() {\n this.setAttribute(name, value);\n };\n}\n\nfunction attrConstantNS(fullname, value) {\n return function() {\n this.setAttributeNS(fullname.space, fullname.local, value);\n };\n}\n\nfunction attrFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttribute(name);\n else this.setAttribute(name, v);\n };\n}\n\nfunction attrFunctionNS(fullname, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n else this.setAttributeNS(fullname.space, fullname.local, v);\n };\n}\n\nexport default function(name, value) {\n var fullname = namespace(name);\n\n if (arguments.length < 2) {\n var node = this.node();\n return fullname.local\n ? node.getAttributeNS(fullname.space, fullname.local)\n : node.getAttribute(fullname);\n }\n\n return this.each((value == null\n ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n ? (fullname.local ? attrFunctionNS : attrFunction)\n : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n || (node.document && node) // node is a Window\n || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n return function() {\n this.style.removeProperty(name);\n };\n}\n\nfunction styleConstant(name, value, priority) {\n return function() {\n this.style.setProperty(name, value, priority);\n };\n}\n\nfunction styleFunction(name, value, priority) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) this.style.removeProperty(name);\n else this.style.setProperty(name, v, priority);\n };\n}\n\nexport default function(name, value, priority) {\n return arguments.length > 1\n ? this.each((value == null\n ? styleRemove : typeof value === \"function\"\n ? styleFunction\n : styleConstant)(name, value, priority == null ? \"\" : priority))\n : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n return node.style.getPropertyValue(name)\n || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function propertyRemove(name) {\n return function() {\n delete this[name];\n };\n}\n\nfunction propertyConstant(name, value) {\n return function() {\n this[name] = value;\n };\n}\n\nfunction propertyFunction(name, value) {\n return function() {\n var v = value.apply(this, arguments);\n if (v == null) delete this[name];\n else this[name] = v;\n };\n}\n\nexport default function(name, value) {\n return arguments.length > 1\n ? this.each((value == null\n ? propertyRemove : typeof value === \"function\"\n ? propertyFunction\n : propertyConstant)(name, value))\n : this.node()[name];\n}\n","function classArray(string) {\n return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n this._node = node;\n this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n add: function(name) {\n var i = this._names.indexOf(name);\n if (i < 0) {\n this._names.push(name);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n remove: function(name) {\n var i = this._names.indexOf(name);\n if (i >= 0) {\n this._names.splice(i, 1);\n this._node.setAttribute(\"class\", this._names.join(\" \"));\n }\n },\n contains: function(name) {\n return this._names.indexOf(name) >= 0;\n }\n};\n\nfunction classedAdd(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n var list = classList(node), i = -1, n = names.length;\n while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n return function() {\n classedAdd(this, names);\n };\n}\n\nfunction classedFalse(names) {\n return function() {\n classedRemove(this, names);\n };\n}\n\nfunction classedFunction(names, value) {\n return function() {\n (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n };\n}\n\nexport default function(name, value) {\n var names = classArray(name + \"\");\n\n if (arguments.length < 2) {\n var list = classList(this.node()), i = -1, n = names.length;\n while (++i < n) if (!list.contains(names[i])) return false;\n return true;\n }\n\n return this.each((typeof value === \"function\"\n ? classedFunction : value\n ? classedTrue\n : classedFalse)(names, value));\n}\n","function textRemove() {\n this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n return function() {\n this.textContent = value;\n };\n}\n\nfunction textFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.textContent = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? textRemove : (typeof value === \"function\"\n ? textFunction\n : textConstant)(value))\n : this.node().textContent;\n}\n","function htmlRemove() {\n this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n return function() {\n this.innerHTML = value;\n };\n}\n\nfunction htmlFunction(value) {\n return function() {\n var v = value.apply(this, arguments);\n this.innerHTML = v == null ? \"\" : v;\n };\n}\n\nexport default function(value) {\n return arguments.length\n ? this.each(value == null\n ? htmlRemove : (typeof value === \"function\"\n ? htmlFunction\n : htmlConstant)(value))\n : this.node().innerHTML;\n}\n","function raise() {\n if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n return this.each(raise);\n}\n","function lower() {\n if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n return this.each(lower);\n}\n","import creator from \"../creator.js\";\n\nexport default function(name) {\n var create = typeof name === \"function\" ? name : creator(name);\n return this.select(function() {\n return this.appendChild(create.apply(this, arguments));\n });\n}\n","import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n return null;\n}\n\nexport default function(name, before) {\n var create = typeof name === \"function\" ? name : creator(name),\n select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n return this.select(function() {\n return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n });\n}\n","function remove() {\n var parent = this.parentNode;\n if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n return this.each(remove);\n}\n","function selection_cloneShallow() {\n var clone = this.cloneNode(false), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n var clone = this.cloneNode(true), parent = this.parentNode;\n return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","export default function(value) {\n return arguments.length\n ? this.property(\"__data__\", value)\n : this.node().__data__;\n}\n","function contextListener(listener) {\n return function(event) {\n listener.call(this, event, this.__data__);\n };\n}\n\nfunction parseTypenames(typenames) {\n return typenames.trim().split(/^|\\s+/).map(function(t) {\n var name = \"\", i = t.indexOf(\".\");\n if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n return {type: t, name: name};\n });\n}\n\nfunction onRemove(typename) {\n return function() {\n var on = this.__on;\n if (!on) return;\n for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n } else {\n on[++i] = o;\n }\n }\n if (++i) on.length = i;\n else delete this.__on;\n };\n}\n\nfunction onAdd(typename, value, options) {\n return function() {\n var on = this.__on, o, listener = contextListener(value);\n if (on) for (var j = 0, m = on.length; j < m; ++j) {\n if ((o = on[j]).type === typename.type && o.name === typename.name) {\n this.removeEventListener(o.type, o.listener, o.options);\n this.addEventListener(o.type, o.listener = listener, o.options = options);\n o.value = value;\n return;\n }\n }\n this.addEventListener(typename.type, listener, options);\n o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n if (!on) this.__on = [o];\n else on.push(o);\n };\n}\n\nexport default function(typename, value, options) {\n var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n if (arguments.length < 2) {\n var on = this.node().__on;\n if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n for (i = 0, o = on[j]; i < n; ++i) {\n if ((t = typenames[i]).type === o.type && t.name === o.name) {\n return o.value;\n }\n }\n }\n return;\n }\n\n on = value ? onAdd : onRemove;\n for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n return this;\n}\n","import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n var window = defaultView(node),\n event = window.CustomEvent;\n\n if (typeof event === \"function\") {\n event = new event(type, params);\n } else {\n event = window.document.createEvent(\"Event\");\n if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n else event.initEvent(type, false, false);\n }\n\n node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n return function() {\n return dispatchEvent(this, type, params);\n };\n}\n\nfunction dispatchFunction(type, params) {\n return function() {\n return dispatchEvent(this, type, params.apply(this, arguments));\n };\n}\n\nexport default function(type, params) {\n return this.each((typeof params === \"function\"\n ? dispatchFunction\n : dispatchConstant)(type, params));\n}\n","export default function*() {\n for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n if (node = group[i]) yield node;\n }\n }\n}\n","import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n this._groups = groups;\n this._parents = parents;\n}\n\nfunction selection() {\n return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n return this;\n}\n\nSelection.prototype = selection.prototype = {\n constructor: Selection,\n select: selection_select,\n selectAll: selection_selectAll,\n selectChild: selection_selectChild,\n selectChildren: selection_selectChildren,\n filter: selection_filter,\n data: selection_data,\n enter: selection_enter,\n exit: selection_exit,\n join: selection_join,\n merge: selection_merge,\n selection: selection_selection,\n order: selection_order,\n sort: selection_sort,\n call: selection_call,\n nodes: selection_nodes,\n node: selection_node,\n size: selection_size,\n empty: selection_empty,\n each: selection_each,\n attr: selection_attr,\n style: selection_style,\n property: selection_property,\n classed: selection_classed,\n text: selection_text,\n html: selection_html,\n raise: selection_raise,\n lower: selection_lower,\n append: selection_append,\n insert: selection_insert,\n remove: selection_remove,\n clone: selection_clone,\n datum: selection_datum,\n on: selection_on,\n dispatch: selection_dispatch,\n [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n","import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n return typeof selector === \"string\"\n ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n : new Selection([[selector]], root);\n}\n","export default function(constructor, factory, prototype) {\n constructor.prototype = factory.prototype = prototype;\n prototype.constructor = constructor;\n}\n\nexport function extend(parent, definition) {\n var prototype = Object.create(parent.prototype);\n for (var key in definition) prototype[key] = definition[key];\n return prototype;\n}\n","import define, {extend} from \"./define.js\";\n\nexport function Color() {}\n\nexport var darker = 0.7;\nexport var brighter = 1 / darker;\n\nvar reI = \"\\\\s*([+-]?\\\\d+)\\\\s*\",\n reN = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\s*\",\n reP = \"\\\\s*([+-]?(?:\\\\d*\\\\.)?\\\\d+(?:[eE][+-]?\\\\d+)?)%\\\\s*\",\n reHex = /^#([0-9a-f]{3,8})$/,\n reRgbInteger = new RegExp(`^rgb\\\\(${reI},${reI},${reI}\\\\)$`),\n reRgbPercent = new RegExp(`^rgb\\\\(${reP},${reP},${reP}\\\\)$`),\n reRgbaInteger = new RegExp(`^rgba\\\\(${reI},${reI},${reI},${reN}\\\\)$`),\n reRgbaPercent = new RegExp(`^rgba\\\\(${reP},${reP},${reP},${reN}\\\\)$`),\n reHslPercent = new RegExp(`^hsl\\\\(${reN},${reP},${reP}\\\\)$`),\n reHslaPercent = new RegExp(`^hsla\\\\(${reN},${reP},${reP},${reN}\\\\)$`);\n\nvar named = {\n aliceblue: 0xf0f8ff,\n antiquewhite: 0xfaebd7,\n aqua: 0x00ffff,\n aquamarine: 0x7fffd4,\n azure: 0xf0ffff,\n beige: 0xf5f5dc,\n bisque: 0xffe4c4,\n black: 0x000000,\n blanchedalmond: 0xffebcd,\n blue: 0x0000ff,\n blueviolet: 0x8a2be2,\n brown: 0xa52a2a,\n burlywood: 0xdeb887,\n cadetblue: 0x5f9ea0,\n chartreuse: 0x7fff00,\n chocolate: 0xd2691e,\n coral: 0xff7f50,\n cornflowerblue: 0x6495ed,\n cornsilk: 0xfff8dc,\n crimson: 0xdc143c,\n cyan: 0x00ffff,\n darkblue: 0x00008b,\n darkcyan: 0x008b8b,\n darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9,\n darkgreen: 0x006400,\n darkgrey: 0xa9a9a9,\n darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b,\n darkolivegreen: 0x556b2f,\n darkorange: 0xff8c00,\n darkorchid: 0x9932cc,\n darkred: 0x8b0000,\n darksalmon: 0xe9967a,\n darkseagreen: 0x8fbc8f,\n darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f,\n darkslategrey: 0x2f4f4f,\n darkturquoise: 0x00ced1,\n darkviolet: 0x9400d3,\n deeppink: 0xff1493,\n deepskyblue: 0x00bfff,\n dimgray: 0x696969,\n dimgrey: 0x696969,\n dodgerblue: 0x1e90ff,\n firebrick: 0xb22222,\n floralwhite: 0xfffaf0,\n forestgreen: 0x228b22,\n fuchsia: 0xff00ff,\n gainsboro: 0xdcdcdc,\n ghostwhite: 0xf8f8ff,\n gold: 0xffd700,\n goldenrod: 0xdaa520,\n gray: 0x808080,\n green: 0x008000,\n greenyellow: 0xadff2f,\n grey: 0x808080,\n honeydew: 0xf0fff0,\n hotpink: 0xff69b4,\n indianred: 0xcd5c5c,\n indigo: 0x4b0082,\n ivory: 0xfffff0,\n khaki: 0xf0e68c,\n lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5,\n lawngreen: 0x7cfc00,\n lemonchiffon: 0xfffacd,\n lightblue: 0xadd8e6,\n lightcoral: 0xf08080,\n lightcyan: 0xe0ffff,\n lightgoldenrodyellow: 0xfafad2,\n lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90,\n lightgrey: 0xd3d3d3,\n lightpink: 0xffb6c1,\n lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa,\n lightskyblue: 0x87cefa,\n lightslategray: 0x778899,\n lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de,\n lightyellow: 0xffffe0,\n lime: 0x00ff00,\n limegreen: 0x32cd32,\n linen: 0xfaf0e6,\n magenta: 0xff00ff,\n maroon: 0x800000,\n mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd,\n mediumorchid: 0xba55d3,\n mediumpurple: 0x9370db,\n mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee,\n mediumspringgreen: 0x00fa9a,\n mediumturquoise: 0x48d1cc,\n mediumvioletred: 0xc71585,\n midnightblue: 0x191970,\n mintcream: 0xf5fffa,\n mistyrose: 0xffe4e1,\n moccasin: 0xffe4b5,\n navajowhite: 0xffdead,\n navy: 0x000080,\n oldlace: 0xfdf5e6,\n olive: 0x808000,\n olivedrab: 0x6b8e23,\n orange: 0xffa500,\n orangered: 0xff4500,\n orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa,\n palegreen: 0x98fb98,\n paleturquoise: 0xafeeee,\n palevioletred: 0xdb7093,\n papayawhip: 0xffefd5,\n peachpuff: 0xffdab9,\n peru: 0xcd853f,\n pink: 0xffc0cb,\n plum: 0xdda0dd,\n powderblue: 0xb0e0e6,\n purple: 0x800080,\n rebeccapurple: 0x663399,\n red: 0xff0000,\n rosybrown: 0xbc8f8f,\n royalblue: 0x4169e1,\n saddlebrown: 0x8b4513,\n salmon: 0xfa8072,\n sandybrown: 0xf4a460,\n seagreen: 0x2e8b57,\n seashell: 0xfff5ee,\n sienna: 0xa0522d,\n silver: 0xc0c0c0,\n skyblue: 0x87ceeb,\n slateblue: 0x6a5acd,\n slategray: 0x708090,\n slategrey: 0x708090,\n snow: 0xfffafa,\n springgreen: 0x00ff7f,\n steelblue: 0x4682b4,\n tan: 0xd2b48c,\n teal: 0x008080,\n thistle: 0xd8bfd8,\n tomato: 0xff6347,\n turquoise: 0x40e0d0,\n violet: 0xee82ee,\n wheat: 0xf5deb3,\n white: 0xffffff,\n whitesmoke: 0xf5f5f5,\n yellow: 0xffff00,\n yellowgreen: 0x9acd32\n};\n\ndefine(Color, color, {\n copy(channels) {\n return Object.assign(new this.constructor, this, channels);\n },\n displayable() {\n return this.rgb().displayable();\n },\n hex: color_formatHex, // Deprecated! Use color.formatHex.\n formatHex: color_formatHex,\n formatHex8: color_formatHex8,\n formatHsl: color_formatHsl,\n formatRgb: color_formatRgb,\n toString: color_formatRgb\n});\n\nfunction color_formatHex() {\n return this.rgb().formatHex();\n}\n\nfunction color_formatHex8() {\n return this.rgb().formatHex8();\n}\n\nfunction color_formatHsl() {\n return hslConvert(this).formatHsl();\n}\n\nfunction color_formatRgb() {\n return this.rgb().formatRgb();\n}\n\nexport default function color(format) {\n var m, l;\n format = (format + \"\").trim().toLowerCase();\n return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000\n : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00\n : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000\n : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000\n : null) // invalid hex\n : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)\n : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)\n : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)\n : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)\n : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)\n : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)\n : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins\n : format === \"transparent\" ? new Rgb(NaN, NaN, NaN, 0)\n : null;\n}\n\nfunction rgbn(n) {\n return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);\n}\n\nfunction rgba(r, g, b, a) {\n if (a <= 0) r = g = b = NaN;\n return new Rgb(r, g, b, a);\n}\n\nexport function rgbConvert(o) {\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Rgb;\n o = o.rgb();\n return new Rgb(o.r, o.g, o.b, o.opacity);\n}\n\nexport function rgb(r, g, b, opacity) {\n return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);\n}\n\nexport function Rgb(r, g, b, opacity) {\n this.r = +r;\n this.g = +g;\n this.b = +b;\n this.opacity = +opacity;\n}\n\ndefine(Rgb, rgb, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);\n },\n rgb() {\n return this;\n },\n clamp() {\n return new Rgb(clampi(this.r), clampi(this.g), clampi(this.b), clampa(this.opacity));\n },\n displayable() {\n return (-0.5 <= this.r && this.r < 255.5)\n && (-0.5 <= this.g && this.g < 255.5)\n && (-0.5 <= this.b && this.b < 255.5)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n hex: rgb_formatHex, // Deprecated! Use color.formatHex.\n formatHex: rgb_formatHex,\n formatHex8: rgb_formatHex8,\n formatRgb: rgb_formatRgb,\n toString: rgb_formatRgb\n}));\n\nfunction rgb_formatHex() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}`;\n}\n\nfunction rgb_formatHex8() {\n return `#${hex(this.r)}${hex(this.g)}${hex(this.b)}${hex((isNaN(this.opacity) ? 1 : this.opacity) * 255)}`;\n}\n\nfunction rgb_formatRgb() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"rgb(\" : \"rgba(\"}${clampi(this.r)}, ${clampi(this.g)}, ${clampi(this.b)}${a === 1 ? \")\" : `, ${a})`}`;\n}\n\nfunction clampa(opacity) {\n return isNaN(opacity) ? 1 : Math.max(0, Math.min(1, opacity));\n}\n\nfunction clampi(value) {\n return Math.max(0, Math.min(255, Math.round(value) || 0));\n}\n\nfunction hex(value) {\n value = clampi(value);\n return (value < 16 ? \"0\" : \"\") + value.toString(16);\n}\n\nfunction hsla(h, s, l, a) {\n if (a <= 0) h = s = l = NaN;\n else if (l <= 0 || l >= 1) h = s = NaN;\n else if (s <= 0) h = NaN;\n return new Hsl(h, s, l, a);\n}\n\nexport function hslConvert(o) {\n if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);\n if (!(o instanceof Color)) o = color(o);\n if (!o) return new Hsl;\n if (o instanceof Hsl) return o;\n o = o.rgb();\n var r = o.r / 255,\n g = o.g / 255,\n b = o.b / 255,\n min = Math.min(r, g, b),\n max = Math.max(r, g, b),\n h = NaN,\n s = max - min,\n l = (max + min) / 2;\n if (s) {\n if (r === max) h = (g - b) / s + (g < b) * 6;\n else if (g === max) h = (b - r) / s + 2;\n else h = (r - g) / s + 4;\n s /= l < 0.5 ? max + min : 2 - max - min;\n h *= 60;\n } else {\n s = l > 0 && l < 1 ? 0 : h;\n }\n return new Hsl(h, s, l, o.opacity);\n}\n\nexport function hsl(h, s, l, opacity) {\n return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);\n}\n\nfunction Hsl(h, s, l, opacity) {\n this.h = +h;\n this.s = +s;\n this.l = +l;\n this.opacity = +opacity;\n}\n\ndefine(Hsl, hsl, extend(Color, {\n brighter(k) {\n k = k == null ? brighter : Math.pow(brighter, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n darker(k) {\n k = k == null ? darker : Math.pow(darker, k);\n return new Hsl(this.h, this.s, this.l * k, this.opacity);\n },\n rgb() {\n var h = this.h % 360 + (this.h < 0) * 360,\n s = isNaN(h) || isNaN(this.s) ? 0 : this.s,\n l = this.l,\n m2 = l + (l < 0.5 ? l : 1 - l) * s,\n m1 = 2 * l - m2;\n return new Rgb(\n hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),\n hsl2rgb(h, m1, m2),\n hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),\n this.opacity\n );\n },\n clamp() {\n return new Hsl(clamph(this.h), clampt(this.s), clampt(this.l), clampa(this.opacity));\n },\n displayable() {\n return (0 <= this.s && this.s <= 1 || isNaN(this.s))\n && (0 <= this.l && this.l <= 1)\n && (0 <= this.opacity && this.opacity <= 1);\n },\n formatHsl() {\n const a = clampa(this.opacity);\n return `${a === 1 ? \"hsl(\" : \"hsla(\"}${clamph(this.h)}, ${clampt(this.s) * 100}%, ${clampt(this.l) * 100}%${a === 1 ? \")\" : `, ${a})`}`;\n }\n}));\n\nfunction clamph(value) {\n value = (value || 0) % 360;\n return value < 0 ? value + 360 : value;\n}\n\nfunction clampt(value) {\n return Math.max(0, Math.min(1, value || 0));\n}\n\n/* From FvD 13.37, CSS Color Module Level 3 */\nfunction hsl2rgb(h, m1, m2) {\n return (h < 60 ? m1 + (m2 - m1) * h / 60\n : h < 180 ? m2\n : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60\n : m1) * 255;\n}\n","export default x => () => x;\n","import constant from \"./constant.js\";\n\nfunction linear(a, d) {\n return function(t) {\n return a + t * d;\n };\n}\n\nfunction exponential(a, b, y) {\n return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {\n return Math.pow(a + t * b, y);\n };\n}\n\nexport function hue(a, b) {\n var d = b - a;\n return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a);\n}\n\nexport function gamma(y) {\n return (y = +y) === 1 ? nogamma : function(a, b) {\n return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a);\n };\n}\n\nexport default function nogamma(a, b) {\n var d = b - a;\n return d ? linear(a, d) : constant(isNaN(a) ? b : a);\n}\n","import {rgb as colorRgb} from \"d3-color\";\nimport basis from \"./basis.js\";\nimport basisClosed from \"./basisClosed.js\";\nimport nogamma, {gamma} from \"./color.js\";\n\nexport default (function rgbGamma(y) {\n var color = gamma(y);\n\n function rgb(start, end) {\n var r = color((start = colorRgb(start)).r, (end = colorRgb(end)).r),\n g = color(start.g, end.g),\n b = color(start.b, end.b),\n opacity = nogamma(start.opacity, end.opacity);\n return function(t) {\n start.r = r(t);\n start.g = g(t);\n start.b = b(t);\n start.opacity = opacity(t);\n return start + \"\";\n };\n }\n\n rgb.gamma = rgbGamma;\n\n return rgb;\n})(1);\n\nfunction rgbSpline(spline) {\n return function(colors) {\n var n = colors.length,\n r = new Array(n),\n g = new Array(n),\n b = new Array(n),\n i, color;\n for (i = 0; i < n; ++i) {\n color = colorRgb(colors[i]);\n r[i] = color.r || 0;\n g[i] = color.g || 0;\n b[i] = color.b || 0;\n }\n r = spline(r);\n g = spline(g);\n b = spline(b);\n color.opacity = 1;\n return function(t) {\n color.r = r(t);\n color.g = g(t);\n color.b = b(t);\n return color + \"\";\n };\n };\n}\n\nexport var rgbBasis = rgbSpline(basis);\nexport var rgbBasisClosed = rgbSpline(basisClosed);\n","export default function(a, b) {\n if (!b) b = [];\n var n = a ? Math.min(b.length, a.length) : 0,\n c = b.slice(),\n i;\n return function(t) {\n for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t;\n return c;\n };\n}\n\nexport function isNumberArray(x) {\n return ArrayBuffer.isView(x) && !(x instanceof DataView);\n}\n","import value from \"./value.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n return (isNumberArray(b) ? numberArray : genericArray)(a, b);\n}\n\nexport function genericArray(a, b) {\n var nb = b ? b.length : 0,\n na = a ? Math.min(nb, a.length) : 0,\n x = new Array(na),\n c = new Array(nb),\n i;\n\n for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]);\n for (; i < nb; ++i) c[i] = b[i];\n\n return function(t) {\n for (i = 0; i < na; ++i) c[i] = x[i](t);\n return c;\n };\n}\n","export default function(a, b) {\n var d = new Date;\n return a = +a, b = +b, function(t) {\n return d.setTime(a * (1 - t) + b * t), d;\n };\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return a * (1 - t) + b * t;\n };\n}\n","import value from \"./value.js\";\n\nexport default function(a, b) {\n var i = {},\n c = {},\n k;\n\n if (a === null || typeof a !== \"object\") a = {};\n if (b === null || typeof b !== \"object\") b = {};\n\n for (k in b) {\n if (k in a) {\n i[k] = value(a[k], b[k]);\n } else {\n c[k] = b[k];\n }\n }\n\n return function(t) {\n for (k in i) c[k] = i[k](t);\n return c;\n };\n}\n","import number from \"./number.js\";\n\nvar reA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g,\n reB = new RegExp(reA.source, \"g\");\n\nfunction zero(b) {\n return function() {\n return b;\n };\n}\n\nfunction one(b) {\n return function(t) {\n return b(t) + \"\";\n };\n}\n\nexport default function(a, b) {\n var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b\n am, // current match in a\n bm, // current match in b\n bs, // string preceding current number in b, if any\n i = -1, // index in s\n s = [], // string constants and placeholders\n q = []; // number interpolators\n\n // Coerce inputs to strings.\n a = a + \"\", b = b + \"\";\n\n // Interpolate pairs of numbers in a & b.\n while ((am = reA.exec(a))\n && (bm = reB.exec(b))) {\n if ((bs = bm.index) > bi) { // a string precedes the next number in b\n bs = b.slice(bi, bs);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match\n if (s[i]) s[i] += bm; // coalesce with previous string\n else s[++i] = bm;\n } else { // interpolate non-matching numbers\n s[++i] = null;\n q.push({i: i, x: number(am, bm)});\n }\n bi = reB.lastIndex;\n }\n\n // Add remains of b.\n if (bi < b.length) {\n bs = b.slice(bi);\n if (s[i]) s[i] += bs; // coalesce with previous string\n else s[++i] = bs;\n }\n\n // Special optimization for only a single match.\n // Otherwise, interpolate each of the numbers and rejoin the string.\n return s.length < 2 ? (q[0]\n ? one(q[0].x)\n : zero(b))\n : (b = q.length, function(t) {\n for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n return s.join(\"\");\n });\n}\n","import {color} from \"d3-color\";\nimport rgb from \"./rgb.js\";\nimport {genericArray} from \"./array.js\";\nimport date from \"./date.js\";\nimport number from \"./number.js\";\nimport object from \"./object.js\";\nimport string from \"./string.js\";\nimport constant from \"./constant.js\";\nimport numberArray, {isNumberArray} from \"./numberArray.js\";\n\nexport default function(a, b) {\n var t = typeof b, c;\n return b == null || t === \"boolean\" ? constant(b)\n : (t === \"number\" ? number\n : t === \"string\" ? ((c = color(b)) ? (b = c, rgb) : string)\n : b instanceof color ? rgb\n : b instanceof Date ? date\n : isNumberArray(b) ? numberArray\n : Array.isArray(b) ? genericArray\n : typeof b.valueOf !== \"function\" && typeof b.toString !== \"function\" || isNaN(b) ? object\n : number)(a, b);\n}\n","export default function(a, b) {\n return a = +a, b = +b, function(t) {\n return Math.round(a * (1 - t) + b * t);\n };\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","import {formatDecimalParts} from \"./formatDecimal.js\";\n\nexport default function(x) {\n return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN;\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","// [[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","// 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 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","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","export function initRange(domain, range) {\n switch (arguments.length) {\n case 0: break;\n case 1: this.range(domain); break;\n default: this.range(range).domain(domain); break;\n }\n return this;\n}\n\nexport function initInterpolator(domain, interpolator) {\n switch (arguments.length) {\n case 0: break;\n case 1: {\n if (typeof domain === \"function\") this.interpolator(domain);\n else this.range(domain);\n break;\n }\n default: {\n this.domain(domain);\n if (typeof interpolator === \"function\") this.interpolator(interpolator);\n else this.range(interpolator);\n break;\n }\n }\n return this;\n}\n","import {InternMap} from \"d3-array\";\nimport {initRange} from \"./init.js\";\n\nexport const implicit = Symbol(\"implicit\");\n\nexport default function ordinal() {\n var index = new InternMap(),\n domain = [],\n range = [],\n unknown = implicit;\n\n function scale(d) {\n let i = index.get(d);\n if (i === undefined) {\n if (unknown !== implicit) return unknown;\n index.set(d, i = domain.push(d) - 1);\n }\n return range[i % range.length];\n }\n\n scale.domain = function(_) {\n if (!arguments.length) return domain.slice();\n domain = [], index = new InternMap();\n for (const value of _) {\n if (index.has(value)) continue;\n index.set(value, domain.push(value) - 1);\n }\n return scale;\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), scale) : range.slice();\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n scale.copy = function() {\n return ordinal(domain, range).unknown(unknown);\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n","export default function constants(x) {\n return function() {\n return x;\n };\n}\n","export default function number(x) {\n return +x;\n}\n","import {bisect} from \"d3-array\";\nimport {interpolate as interpolateValue, interpolateNumber, interpolateRound} from \"d3-interpolate\";\nimport constant from \"./constant.js\";\nimport number from \"./number.js\";\n\nvar unit = [0, 1];\n\nexport function identity(x) {\n return x;\n}\n\nfunction normalize(a, b) {\n return (b -= (a = +a))\n ? function(x) { return (x - a) / b; }\n : constant(isNaN(b) ? NaN : 0.5);\n}\n\nfunction clamper(a, b) {\n var t;\n if (a > b) t = a, a = b, b = t;\n return function(x) { return Math.max(a, Math.min(b, x)); };\n}\n\n// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].\n// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].\nfunction bimap(domain, range, interpolate) {\n var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];\n if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);\n else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);\n return function(x) { return r0(d0(x)); };\n}\n\nfunction polymap(domain, range, interpolate) {\n var j = Math.min(domain.length, range.length) - 1,\n d = new Array(j),\n r = new Array(j),\n i = -1;\n\n // Reverse descending domains.\n if (domain[j] < domain[0]) {\n domain = domain.slice().reverse();\n range = range.slice().reverse();\n }\n\n while (++i < j) {\n d[i] = normalize(domain[i], domain[i + 1]);\n r[i] = interpolate(range[i], range[i + 1]);\n }\n\n return function(x) {\n var i = bisect(domain, x, 1, j) - 1;\n return r[i](d[i](x));\n };\n}\n\nexport function copy(source, target) {\n return target\n .domain(source.domain())\n .range(source.range())\n .interpolate(source.interpolate())\n .clamp(source.clamp())\n .unknown(source.unknown());\n}\n\nexport function transformer() {\n var domain = unit,\n range = unit,\n interpolate = interpolateValue,\n transform,\n untransform,\n unknown,\n clamp = identity,\n piecewise,\n output,\n input;\n\n function rescale() {\n var n = Math.min(domain.length, range.length);\n if (clamp !== identity) clamp = clamper(domain[0], domain[n - 1]);\n piecewise = n > 2 ? polymap : bimap;\n output = input = null;\n return scale;\n }\n\n function scale(x) {\n return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));\n }\n\n scale.invert = function(y) {\n return clamp(untransform((input || (input = piecewise(range, domain.map(transform), interpolateNumber)))(y)));\n };\n\n scale.domain = function(_) {\n return arguments.length ? (domain = Array.from(_, number), rescale()) : domain.slice();\n };\n\n scale.range = function(_) {\n return arguments.length ? (range = Array.from(_), rescale()) : range.slice();\n };\n\n scale.rangeRound = function(_) {\n return range = Array.from(_), interpolate = interpolateRound, rescale();\n };\n\n scale.clamp = function(_) {\n return arguments.length ? (clamp = _ ? true : identity, rescale()) : clamp !== identity;\n };\n\n scale.interpolate = function(_) {\n return arguments.length ? (interpolate = _, rescale()) : interpolate;\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : unknown;\n };\n\n return function(t, u) {\n transform = t, untransform = u;\n return rescale();\n };\n}\n\nexport default function continuous() {\n return transformer()(identity, identity);\n}\n","import {tickStep} from \"d3-array\";\nimport {format, formatPrefix, formatSpecifier, precisionFixed, precisionPrefix, precisionRound} from \"d3-format\";\n\nexport default function tickFormat(start, stop, count, specifier) {\n var step = tickStep(start, stop, count),\n precision;\n specifier = formatSpecifier(specifier == null ? \",f\" : specifier);\n switch (specifier.type) {\n case \"s\": {\n var value = Math.max(Math.abs(start), Math.abs(stop));\n if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;\n return formatPrefix(specifier, value);\n }\n case \"\":\n case \"e\":\n case \"g\":\n case \"p\":\n case \"r\": {\n if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === \"e\");\n break;\n }\n case \"f\":\n case \"%\": {\n if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === \"%\") * 2;\n break;\n }\n }\n return format(specifier);\n}\n","import {ticks, tickIncrement} from \"d3-array\";\nimport continuous, {copy} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\nimport tickFormat from \"./tickFormat.js\";\n\nexport function linearish(scale) {\n var domain = scale.domain;\n\n scale.ticks = function(count) {\n var d = domain();\n return ticks(d[0], d[d.length - 1], count == null ? 10 : count);\n };\n\n scale.tickFormat = function(count, specifier) {\n var d = domain();\n return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);\n };\n\n scale.nice = function(count) {\n if (count == null) count = 10;\n\n var d = domain();\n var i0 = 0;\n var i1 = d.length - 1;\n var start = d[i0];\n var stop = d[i1];\n var prestep;\n var step;\n var maxIter = 10;\n\n if (stop < start) {\n step = start, start = stop, stop = step;\n step = i0, i0 = i1, i1 = step;\n }\n \n while (maxIter-- > 0) {\n step = tickIncrement(start, stop, count);\n if (step === prestep) {\n d[i0] = start\n d[i1] = stop\n return domain(d);\n } else if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n } else if (step < 0) {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n } else {\n break;\n }\n prestep = step;\n }\n\n return scale;\n };\n\n return scale;\n}\n\nexport default function linear() {\n var scale = continuous();\n\n scale.copy = function() {\n return copy(scale, linear());\n };\n\n initRange.apply(scale, arguments);\n\n return linearish(scale);\n}\n","import {linearish} from \"./linear.js\";\nimport {copy, identity, transformer} from \"./continuous.js\";\nimport {initRange} from \"./init.js\";\n\nfunction transformPow(exponent) {\n return function(x) {\n return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);\n };\n}\n\nfunction transformSqrt(x) {\n return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);\n}\n\nfunction transformSquare(x) {\n return x < 0 ? -x * x : x * x;\n}\n\nexport function powish(transform) {\n var scale = transform(identity, identity),\n exponent = 1;\n\n function rescale() {\n return exponent === 1 ? transform(identity, identity)\n : exponent === 0.5 ? transform(transformSqrt, transformSquare)\n : transform(transformPow(exponent), transformPow(1 / exponent));\n }\n\n scale.exponent = function(_) {\n return arguments.length ? (exponent = +_, rescale()) : exponent;\n };\n\n return linearish(scale);\n}\n\nexport default function pow() {\n var scale = powish(transformer());\n\n scale.copy = function() {\n return copy(scale, pow()).exponent(scale.exponent());\n };\n\n initRange.apply(scale, arguments);\n\n return scale;\n}\n\nexport function sqrt() {\n return pow.apply(null, arguments).exponent(0.5);\n}\n","import {bisect} from \"d3-array\";\nimport {linearish} from \"./linear.js\";\nimport {initRange} from \"./init.js\";\n\nexport default function quantize() {\n var x0 = 0,\n x1 = 1,\n n = 1,\n domain = [0.5],\n range = [0, 1],\n unknown;\n\n function scale(x) {\n return x != null && x <= x ? range[bisect(domain, x, 0, n)] : unknown;\n }\n\n function rescale() {\n var i = -1;\n domain = new Array(n);\n while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);\n return scale;\n }\n\n scale.domain = function(_) {\n return arguments.length ? ([x0, x1] = _, x0 = +x0, x1 = +x1, rescale()) : [x0, x1];\n };\n\n scale.range = function(_) {\n return arguments.length ? (n = (range = Array.from(_)).length - 1, rescale()) : range.slice();\n };\n\n scale.invertExtent = function(y) {\n var i = range.indexOf(y);\n return i < 0 ? [NaN, NaN]\n : i < 1 ? [x0, domain[0]]\n : i >= n ? [domain[n - 1], x1]\n : [domain[i - 1], domain[i]];\n };\n\n scale.unknown = function(_) {\n return arguments.length ? (unknown = _, scale) : scale;\n };\n\n scale.thresholds = function() {\n return domain.slice();\n };\n\n scale.copy = function() {\n return quantize()\n .domain([x0, x1])\n .range(range)\n .unknown(unknown);\n };\n\n return initRange.apply(linearish(scale), arguments);\n}\n","import React, { useState } from 'react'\nimport { Treemap } from 'recharts'\nimport { scaleQuantize, scaleOrdinal } from 'd3'\nimport ChartContainer from './ChartContainer'\nimport ChartTooltip from './ChartTooltip'\nimport { CHART_COLORS, CHART_COLORS_GRADIENT } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity, formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport type { ChartProps } from '../../types'\n\nconst TreeMapChart = React.memo(function TreeMapChart({ \n data, \n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n \n try {\n const safeDisplayConfig = {\n showTooltip: displayConfig?.showTooltip ?? true,\n showLegend: displayConfig?.showLegend ?? true,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in treemap chart</div>\n </div>\n </div>\n )\n }\n\n let treemapData: Array<{name: string, size: number, fill?: string, series?: string}>\n let isNumericSeries = false\n let seriesField: string | undefined\n\n if (chartConfig?.xAxis && chartConfig?.yAxis) {\n // New format - use chart config\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis // Name/category field\n const yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis // Size field\n seriesField = Array.isArray(chartConfig.series) ? chartConfig.series[0] : chartConfig.series // Color grouping field\n\n const granularity = getFieldGranularity(queryObject, xAxisField)\n \n if (seriesField) {\n // Check if series field is numeric for color scaling\n const seriesValues = data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n }).filter(val => !isNaN(val))\n \n isNumericSeries = seriesValues.length === data.length && seriesValues.every(val => typeof val === 'number')\n \n \n if (isNumericSeries) {\n // Use D3 quantize scale for better color distribution with small ranges\n const minValue = Math.min(...seriesValues)\n const maxValue = Math.max(...seriesValues)\n \n // Create D3 quantize color scale - maps continuous data to discrete color bands\n const colorScale = scaleQuantize<string>()\n .domain([minValue, maxValue])\n .range(CHART_COLORS_GRADIENT)\n \n treemapData = data.map((item) => {\n const seriesValue = typeof item[seriesField!] === 'string' \n ? parseFloat(item[seriesField!]) \n : item[seriesField!]\n \n const color = colorScale(seriesValue)\n \n return {\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n size: typeof item[yAxisField] === 'string' \n ? parseFloat(item[yAxisField]) \n : (item[yAxisField] || 0),\n fill: color,\n series: String(item[seriesField!])\n }\n })\n } else {\n // Use D3 ordinal color scale for categorical series\n const uniqueSeriesValues = [...new Set(data.map(item => String(item[seriesField!])))]\n const colorScale = scaleOrdinal<string>()\n .domain(uniqueSeriesValues)\n .range(colorPalette?.colors || CHART_COLORS)\n \n treemapData = data.map((item) => ({\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n size: typeof item[yAxisField] === 'string' \n ? parseFloat(item[yAxisField]) \n : (item[yAxisField] || 0),\n fill: colorScale(String(item[seriesField!])),\n series: String(item[seriesField!])\n }))\n }\n } else {\n // No series grouping - use index-based colors\n treemapData = data.map((item, index) => ({\n name: formatTimeValue(item[xAxisField], granularity) || String(item[xAxisField]) || 'Unknown',\n size: typeof item[yAxisField] === 'string' \n ? parseFloat(item[yAxisField]) \n : (item[yAxisField] || 0),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n }))\n }\n } else {\n // Legacy format or auto-detection\n const firstRow = data[0]\n const keys = Object.keys(firstRow)\n \n // Try to find name/label field\n const nameField = keys.find(key => \n typeof firstRow[key] === 'string' ||\n key.toLowerCase().includes('name') ||\n key.toLowerCase().includes('label') ||\n key.toLowerCase().includes('category')\n ) || keys[0]\n\n // Find a numeric field for size - look for 'size' field first, then any numeric\n const sizeField = keys.find(key => key.toLowerCase().includes('size')) ||\n keys.find(key => \n typeof firstRow[key] === 'number' && key !== nameField\n ) || keys[1]\n\n if (!sizeField) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">No numeric field found for treemap chart size</div>\n </div>\n </div>\n )\n }\n\n // Transform data for treemap chart\n treemapData = data.map((item, index) => {\n let name = item[nameField]\n // Handle boolean values with better labels\n if (typeof name === 'boolean') {\n name = name ? 'Active' : 'Inactive'\n } else if (name === 'true' || name === 'false') {\n name = name === 'true' ? 'Active' : 'Inactive'\n } else {\n name = String(name)\n }\n return {\n name,\n size: typeof item[sizeField] === 'string' \n ? parseFloat(item[sizeField]) \n : (item[sizeField] || 0),\n fill: (colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]\n }\n })\n }\n\n // Filter out zero/null values and ensure positive sizes\n treemapData = treemapData.filter(item => item.size != null && item.size > 0)\n \n if (treemapData.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs text-dc-text-secondary\">No valid data points for treemap chart after transformation</div>\n </div>\n </div>\n )\n }\n\n // Custom content renderer for treemap cells with HTML overlays\n const CustomizedContent = (props: any) => {\n const { x, y, width, height, index, name, size } = props\n \n if (width < 20 || height < 20) return null // Don't render content for very small cells\n \n return (\n <g>\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n style={{\n fill: treemapData[index]?.fill || ((colorPalette?.colors && colorPalette.colors[index % colorPalette.colors.length]) || CHART_COLORS[index % CHART_COLORS.length]),\n fillOpacity: hoveredIndex !== null ? (hoveredIndex === index ? 1 : 0.6) : 0.8,\n stroke: '#fff',\n strokeWidth: 2,\n cursor: 'pointer'\n }}\n onMouseEnter={() => setHoveredIndex(index)}\n onMouseLeave={() => setHoveredIndex(null)}\n />\n <foreignObject \n x={x} \n y={y} \n width={width} \n height={height}\n style={{ pointerEvents: 'none', overflow: 'visible' }}\n >\n <div \n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '4px',\n boxSizing: 'border-box',\n color: '#ffffff',\n textShadow: '0 1px 2px rgba(0,0,0,0.8)',\n fontFamily: 'system-ui, -apple-system, sans-serif',\n overflow: 'hidden'\n }}\n >\n {width > 40 && height > 30 && (\n <div \n style={{\n fontSize: `${Math.max(10, Math.min(width / 8, height / 8, 16))}px`,\n fontWeight: '600',\n textAlign: 'center',\n lineHeight: '1.2',\n marginBottom: width > 60 && height > 45 ? '4px' : '0',\n wordBreak: 'break-word',\n hyphens: 'auto'\n }}\n >\n {name}\n </div>\n )}\n {width > 60 && height > 45 && (\n <div\n style={{\n fontSize: `${Math.max(8, Math.min(width / 10, height / 10, 14))}px`,\n textAlign: 'center',\n opacity: 0.9\n }}\n >\n {safeDisplayConfig.leftYAxisFormat\n ? formatAxisValue(size, safeDisplayConfig.leftYAxisFormat)\n : (typeof size === 'number' ? size.toLocaleString() : size)\n }\n </div>\n )}\n </div>\n </foreignObject>\n </g>\n )\n }\n\n // Check if we have series data for legend\n const hasSeriesData = treemapData.some(item => 'series' in item)\n const uniqueSeries = hasSeriesData \n ? [...new Set(treemapData.map(item => item.series).filter(Boolean))]\n : []\n \n // For numeric series, create a legend showing the color scale\n let legendPayload: any[] = []\n if (safeDisplayConfig.showLegend && seriesField) {\n \n if (isNumericSeries) {\n // Create color scale legend for numeric values\n const minValue = Math.min(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n }))\n const maxValue = Math.max(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n }))\n \n \n // Create legend entries showing color scale\n legendPayload = CHART_COLORS_GRADIENT.map((color, index) => {\n const ratio = index / (CHART_COLORS_GRADIENT.length - 1)\n const value = minValue + (maxValue - minValue) * ratio\n return {\n value: safeDisplayConfig.leftYAxisFormat\n ? formatAxisValue(value, safeDisplayConfig.leftYAxisFormat)\n : value.toFixed(2),\n type: 'rect',\n color: color\n }\n })\n } else if (uniqueSeries.length > 1) {\n // Use categorical legend for non-numeric series\n legendPayload = uniqueSeries.map((series, index) => ({\n value: series,\n type: 'rect',\n color: CHART_COLORS[index % CHART_COLORS.length]\n }))\n }\n \n }\n\n // Calculate height adjustment for legend\n const hasLegend = safeDisplayConfig.showLegend && legendPayload.length > 0\n const adjustedHeight = hasLegend \n ? (typeof height === 'string' && height.includes('%') \n ? height \n : typeof height === 'number' \n ? height + 60 \n : `calc(${height} + 60px)`)\n : height\n\n return (\n <div className=\"w-full\" style={{ height: adjustedHeight }}>\n <ChartContainer height={hasLegend ? `calc(100% - 50px)` : \"100%\"}>\n <Treemap\n data={treemapData}\n dataKey=\"size\"\n aspectRatio={4/3}\n stroke=\"#fff\"\n content={<CustomizedContent />}\n >\n {safeDisplayConfig.showTooltip && (\n <ChartTooltip\n formatter={safeDisplayConfig.leftYAxisFormat\n ? (value: any, name: string) => [formatAxisValue(value, safeDisplayConfig.leftYAxisFormat), name]\n : undefined\n }\n />\n )}\n </Treemap>\n </ChartContainer>\n \n {/* Custom Legend outside ChartContainer */}\n {hasLegend && (\n <div className=\"flex justify-center items-center mt-4 pb-2\">\n {isNumericSeries ? (\n // Gradient legend for numeric series\n <div className=\"flex flex-col items-center\">\n <div className=\"text-xs font-semibold text-dc-text-primary mb-2\">\n {seriesField ? getFieldLabel(seriesField) : ''}\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-dc-text-muted\">\n {safeDisplayConfig.leftYAxisFormat\n ? formatAxisValue(Math.min(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n })), safeDisplayConfig.leftYAxisFormat)\n : Math.min(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n })).toFixed(2)\n }\n </span>\n <div\n className=\"h-4 rounded-sm\"\n style={{\n width: '200px',\n background: `linear-gradient(to right, ${CHART_COLORS_GRADIENT.join(', ')})`\n }}\n />\n <span className=\"text-xs text-dc-text-muted\">\n {safeDisplayConfig.leftYAxisFormat\n ? formatAxisValue(Math.max(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n })), safeDisplayConfig.leftYAxisFormat)\n : Math.max(...data.map(item => {\n const value = item[seriesField!]\n return typeof value === 'string' ? parseFloat(value) : value\n })).toFixed(2)\n }\n </span>\n </div>\n </div>\n ) : (\n // Discrete legend for categorical series\n <div className=\"flex flex-wrap justify-center gap-4\">\n {legendPayload.map((item, index) => (\n <div key={index} className=\"flex items-center gap-2\">\n <div\n className=\"w-3 h-3 rounded-xs\"\n style={{ backgroundColor: item.color }}\n />\n <span className=\"text-xs text-dc-text-muted\">\n {item.value}\n </span>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )\n } catch (error) {\n // 'TreeMapChart rendering error\n return (\n <div className=\"flex flex-col items-center justify-center w-full text-dc-error p-4\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">TreeMap Chart Error</div>\n <div className=\"text-xs mb-2\">{error instanceof Error ? error.message : 'Unknown rendering error'}</div>\n <div className=\"text-xs text-dc-text-muted\">Check the data and configuration</div>\n </div>\n </div>\n )\n }\n})\n\nexport default TreeMapChart","import React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'\nimport { select, scaleLinear, scaleSqrt, scaleOrdinal, scaleQuantize, extent, max, axisBottom, axisLeft, type ScaleOrdinal, type ScaleQuantize } from 'd3'\nimport { CHART_COLORS, CHART_COLORS_GRADIENT, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatTimeValue, getFieldGranularity, parseNumericValue, isValidNumericValue, formatAxisValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport { useTheme } from '../../hooks/useTheme'\nimport type { ChartProps } from '../../types'\n\ninterface BubbleData {\n x: number\n xLabel?: string // Formatted label for time dimensions\n y: number\n size: number\n color?: string | number\n label: string\n series?: string\n}\n\nconst BubbleChart = React.memo(function BubbleChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const svgRef = useRef<SVGSVGElement | null>(null)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n const [dimensionsReady, setDimensionsReady] = useState(false)\n const { theme } = useTheme()\n const getFieldLabel = useCubeFieldLabel()\n\n // Memoize safeDisplayConfig to prevent unnecessary re-renders\n const safeDisplayConfig = useMemo(() => ({\n showLegend: displayConfig?.showLegend ?? true,\n showGrid: displayConfig?.showGrid ?? true,\n showTooltip: displayConfig?.showTooltip ?? true,\n minBubbleSize: displayConfig?.minBubbleSize ?? 5,\n maxBubbleSize: displayConfig?.maxBubbleSize ?? 50,\n bubbleOpacity: displayConfig?.bubbleOpacity ?? 0.7,\n xAxisFormat: displayConfig?.xAxisFormat,\n leftYAxisFormat: displayConfig?.leftYAxisFormat\n }), [\n displayConfig?.showLegend,\n displayConfig?.showGrid,\n displayConfig?.showTooltip,\n displayConfig?.minBubbleSize,\n displayConfig?.maxBubbleSize,\n displayConfig?.bubbleOpacity,\n displayConfig?.xAxisFormat,\n displayConfig?.leftYAxisFormat\n ])\n\n // Enhanced dimension measurement with retry mechanism\n useLayoutEffect(() => {\n let retryCount = 0\n const maxRetries = 10\n let rafId: number\n let timeoutId: ReturnType<typeof setTimeout>\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n \n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n setDimensionsReady(true)\n return true\n }\n }\n return false\n }\n \n // Immediate measurement\n const success = updateDimensions()\n \n if (!success && retryCount < maxRetries) {\n // Retry with requestAnimationFrame\n const retryWithRaf = () => {\n const rafSuccess = updateDimensions()\n \n if (!rafSuccess && retryCount < maxRetries) {\n retryCount++\n // Use setTimeout for additional retries with increasing delays\n timeoutId = setTimeout(() => {\n rafId = requestAnimationFrame(retryWithRaf)\n }, 50 * retryCount) // Increasing delay: 50ms, 100ms, 150ms, etc.\n }\n }\n \n rafId = requestAnimationFrame(retryWithRaf)\n }\n \n return () => {\n if (rafId) cancelAnimationFrame(rafId)\n if (timeoutId) clearTimeout(timeoutId)\n }\n }, [])\n\n // Enhanced ResizeObserver for dynamic resizing with immediate initialization\n useEffect(() => {\n let resizeObserver: ResizeObserver | null = null\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n if (!dimensionsReady) {\n setDimensionsReady(true)\n }\n }\n }\n }\n \n // Initialize ResizeObserver immediately\n if (containerRef.current) {\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n if (!dimensionsReady) {\n setDimensionsReady(true)\n }\n }\n }\n })\n \n resizeObserver.observe(containerRef.current)\n \n // Also try immediate measurement as fallback\n updateDimensions()\n }\n\n // Window resize as additional fallback\n window.addEventListener('resize', updateDimensions)\n \n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect()\n }\n window.removeEventListener('resize', updateDimensions)\n }\n }, [dimensionsReady])\n\n useEffect(() => {\n if (!data || data.length === 0 || !svgRef.current || !dimensionsReady || dimensions.width === 0) {\n return\n }\n\n // Clear previous chart\n select(svgRef.current).selectAll('*').remove()\n\n\n // Validate chartConfig - only new format supported\n if (!chartConfig?.xAxis || !chartConfig?.yAxis || !chartConfig?.series) {\n return\n }\n\n const xAxisField = Array.isArray(chartConfig.xAxis) ? chartConfig.xAxis[0] : chartConfig.xAxis\n const yAxisField = Array.isArray(chartConfig.yAxis) ? chartConfig.yAxis[0] : chartConfig.yAxis\n const seriesField = Array.isArray(chartConfig.series) ? chartConfig.series[0] : chartConfig.series\n const sizeFieldName = Array.isArray(chartConfig.sizeField) ? chartConfig.sizeField[0] : chartConfig.sizeField || yAxisField\n const colorFieldName = Array.isArray(chartConfig.colorField) ? chartConfig.colorField[0] : chartConfig.colorField\n\n\n if (!xAxisField || !yAxisField || !seriesField || !sizeFieldName) {\n return\n }\n\n // Transform data for bubble chart\n // Null handling: Filter out bubbles where x, y, or size are null\n const xGranularity = getFieldGranularity(queryObject, xAxisField)\n\n // Check if x-axis field is a time dimension\n const isTimeDimension = queryObject?.timeDimensions?.some(\n (td: { dimension: string }) => td.dimension === xAxisField\n ) || false\n\n const bubbleData: BubbleData[] = data\n .map(item => {\n const rawXValue = item[xAxisField]\n let xNum: number\n let xLabel: string\n\n if (isTimeDimension && rawXValue) {\n // For time dimensions, convert to timestamp for proper numeric positioning\n const dateStr = String(rawXValue)\n // Try to parse as date - handle ISO format and PostgreSQL format\n let date: Date\n if (dateStr.match(/^\\d{4}-\\d{2}-\\d{2}[T ]/)) {\n // Full timestamp format\n let isoStr = dateStr\n if (dateStr.includes(' ')) {\n isoStr = dateStr.replace(' ', 'T').replace('+00', 'Z').replace(/\\+\\d{2}:\\d{2}$/, 'Z')\n }\n if (!isoStr.endsWith('Z') && !isoStr.includes('+')) {\n isoStr = isoStr + 'Z'\n }\n date = new Date(isoStr)\n } else {\n date = new Date(dateStr)\n }\n\n xNum = isNaN(date.getTime()) ? parseFloat(dateStr) : date.getTime()\n xLabel = formatTimeValue(rawXValue, xGranularity)\n } else {\n // Non-time value - use as-is\n const formattedValue = formatTimeValue(rawXValue, xGranularity) || rawXValue\n xNum = typeof formattedValue === 'string' ? parseFloat(formattedValue) : formattedValue\n xLabel = String(formattedValue)\n }\n\n const yValue = parseNumericValue(item[yAxisField])\n const sizeValue = parseNumericValue(item[sizeFieldName])\n const seriesValue = item[seriesField]\n\n return {\n x: xNum,\n xLabel, // Store formatted label for tooltip display\n y: yValue as number, // Type assertion: filter below ensures this is never null\n size: sizeValue !== null ? Math.abs(sizeValue) : 0, // Ensure positive size\n color: colorFieldName ? item[colorFieldName] : seriesValue,\n series: seriesValue,\n label: `${seriesValue || 'Unknown'}`,\n isValid: isValidNumericValue(xNum) && yValue !== null && sizeValue !== null && sizeValue > 0\n }\n })\n .filter(d => d.isValid && d.size > 0) // Filter out bubbles with invalid coordinates or no size\n\n if (bubbleData.length === 0) return\n\n const margin = { \n ...CHART_MARGINS, \n left: CHART_MARGINS.left + 30, // Add extra 30px left margin for Y-axis label\n bottom: (safeDisplayConfig.showLegend && colorFieldName) ? 100 : 40 // Add extra space for legend\n }\n const width = dimensions.width - margin.left - margin.right\n const chartHeight = dimensions.height - margin.top - margin.bottom\n\n const svg = select(svgRef.current)\n .attr('width', dimensions.width)\n .attr('height', dimensions.height)\n\n const g = svg.append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`)\n\n // Set up scales\n const xScale = scaleLinear()\n .domain(extent(bubbleData, d => d.x) as [number, number])\n .range([0, width])\n .nice()\n\n const yScale = scaleLinear()\n .domain(extent(bubbleData, d => d.y) as [number, number])\n .range([chartHeight, 0])\n .nice()\n\n const sizeScale = scaleSqrt()\n .domain([0, max(bubbleData, d => d.size) as number])\n .range([safeDisplayConfig.minBubbleSize, safeDisplayConfig.maxBubbleSize])\n\n // Set up color scale\n let colorScale: ScaleOrdinal<string, string> | ScaleQuantize<string>\n let isNumericColorField = false\n let uniqueColors: string[] = []\n \n if (colorFieldName && bubbleData.length > 0) {\n // Check if color field is numeric for color scaling (same logic as TreeMapChart)\n const colorValues = bubbleData.map(item => {\n const value = item.color\n return typeof value === 'string' ? parseFloat(value) : value\n }).filter((val): val is number => !isNaN(val as number))\n \n isNumericColorField = colorValues.length === bubbleData.length && colorValues.every(val => typeof val === 'number')\n \n if (isNumericColorField) {\n // Use D3 quantize scale for better color distribution with small ranges\n const minValue = Math.min(...colorValues)\n const maxValue = Math.max(...colorValues)\n \n // Create D3 quantize color scale - maps continuous data to discrete color bands\n colorScale = scaleQuantize<string>()\n .domain([minValue, maxValue])\n .range(colorPalette?.gradient || CHART_COLORS_GRADIENT)\n } else {\n // Categorical color field - use series colors\n uniqueColors = [...new Set(bubbleData.map(d => String(d.color)))]\n colorScale = scaleOrdinal<string>()\n .domain(uniqueColors)\n .range(colorPalette?.colors || CHART_COLORS)\n }\n } else {\n // Single color for all bubbles\n colorScale = scaleOrdinal<string>()\n .domain(['default'])\n .range([CHART_COLORS[0]])\n }\n\n // Get theme colors from CSS variables\n const getThemeColor = (varName: string, fallback: string) => {\n const value = getComputedStyle(document.documentElement).getPropertyValue(varName).trim()\n return value || fallback\n }\n\n const isDark = theme !== 'light'\n const textColor = isDark\n ? getThemeColor('--dc-text-muted', '#cbd5e1') // Lighter text for dark mode\n : getThemeColor('--dc-text-secondary', '#374151') // Darker text for light mode\n const gridColor = isDark\n ? getThemeColor('--dc-border', '#475569') // Lighter grid for dark mode\n : '#9ca3af' // Much darker gray for light mode visibility\n\n // Add grid\n if (safeDisplayConfig.showGrid) {\n // X-axis grid\n const xGrid = g.append('g')\n .attr('class', 'grid')\n .attr('transform', `translate(0,${chartHeight})`)\n .call(axisBottom(xScale)\n .tickSize(-chartHeight)\n .tickFormat(() => '')\n )\n\n xGrid.selectAll('line')\n .style('stroke', gridColor)\n .style('stroke-dasharray', '3,3')\n .style('opacity', 0.3)\n\n xGrid.select('.domain')\n .style('stroke', 'none')\n\n // Y-axis grid\n const yGrid = g.append('g')\n .attr('class', 'grid')\n .call(axisLeft(yScale)\n .tickSize(-width)\n .tickFormat(() => '')\n )\n\n yGrid.selectAll('line')\n .style('stroke', gridColor)\n .style('stroke-dasharray', '3,3')\n .style('opacity', 0.3)\n\n yGrid.select('.domain')\n .style('stroke', 'none')\n }\n\n // Add X axis with proper time formatting if needed\n const xAxisGenerator = axisBottom(xScale)\n\n // If it's a time dimension, format the tick labels\n if (isTimeDimension) {\n xAxisGenerator.tickFormat((d) => {\n const date = new Date(d as number)\n if (isNaN(date.getTime())) return String(d)\n\n // Format based on granularity\n switch (xGranularity?.toLowerCase()) {\n case 'year':\n return String(date.getUTCFullYear())\n case 'quarter': {\n const q = Math.floor(date.getUTCMonth() / 3) + 1\n return `${date.getUTCFullYear()}-Q${q}`\n }\n case 'month':\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}`\n case 'week':\n case 'day':\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(date.getUTCDate()).padStart(2, '0')}`\n case 'hour':\n return `${String(date.getUTCMonth() + 1).padStart(2, '0')}-${String(date.getUTCDate()).padStart(2, '0')} ${String(date.getUTCHours()).padStart(2, '0')}:00`\n default:\n return `${date.getUTCFullYear()}-${String(date.getUTCMonth() + 1).padStart(2, '0')}`\n }\n })\n } else if (safeDisplayConfig.xAxisFormat) {\n // Apply custom formatting for non-time X-axis\n xAxisGenerator.tickFormat((d) => formatAxisValue(d as number, safeDisplayConfig.xAxisFormat))\n }\n\n const xAxis = g.append('g')\n .attr('transform', `translate(0,${chartHeight})`)\n .call(xAxisGenerator)\n\n xAxis.selectAll('text')\n .style('fill', textColor)\n\n xAxis.selectAll('line, path')\n .style('stroke', gridColor)\n\n xAxis.append('text')\n .attr('x', width / 2)\n .attr('y', 35)\n .attr('fill', textColor)\n .style('text-anchor', 'middle')\n .style('font-size', '12px')\n .text(safeDisplayConfig.xAxisFormat?.label || getFieldLabel(xAxisField))\n\n // Add Y axis with optional formatting\n const yAxisGenerator = axisLeft(yScale)\n if (safeDisplayConfig.leftYAxisFormat) {\n yAxisGenerator.tickFormat((d) => formatAxisValue(d as number, safeDisplayConfig.leftYAxisFormat))\n }\n const yAxis = g.append('g')\n .call(yAxisGenerator)\n\n yAxis.selectAll('text')\n .style('fill', textColor)\n\n yAxis.selectAll('line, path')\n .style('stroke', gridColor)\n\n yAxis.append('text')\n .attr('transform', 'rotate(-90)')\n .attr('y', -35)\n .attr('x', -chartHeight / 2)\n .attr('fill', textColor)\n .style('text-anchor', 'middle')\n .style('font-size', '12px')\n .text(safeDisplayConfig.leftYAxisFormat?.label || getFieldLabel(yAxisField))\n\n // Create tooltip\n const tooltip = select('body').append('div')\n .attr('class', 'bubble-chart-tooltip')\n .style('position', 'absolute')\n .style('padding', '8px')\n .style('background', 'rgba(0, 0, 0, 0.8)')\n .style('color', 'white')\n .style('border-radius', '4px')\n .style('font-size', '12px')\n .style('pointer-events', 'none')\n .style('opacity', 0)\n .style('z-index', 1000)\n\n // Add bubbles\n const bubbles = g.selectAll('.bubble')\n .data(bubbleData)\n .enter().append('circle')\n .attr('class', 'bubble')\n .attr('cx', d => xScale(d.x))\n .attr('cy', d => yScale(d.y))\n .attr('r', d => sizeScale(d.size))\n .style('fill', d => {\n if (colorFieldName && d.color !== undefined) {\n return isNumericColorField\n ? (colorScale as ScaleQuantize<string>)(d.color as number)\n : (colorScale as ScaleOrdinal<string, string>)(String(d.color))\n }\n return CHART_COLORS[0]\n })\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n .style('stroke', '#fff')\n .style('stroke-width', 1)\n .style('cursor', 'pointer')\n\n // Add hover effects\n if (safeDisplayConfig.showTooltip) {\n bubbles\n .on('mouseover', function(event, d) {\n select(this)\n .transition()\n .duration(200)\n .style('opacity', 1)\n .attr('r', sizeScale(d.size) * 1.1)\n\n const tooltipContent = [\n `<strong>${d.series || 'Unknown'}</strong>`,\n `${getFieldLabel(xAxisField)}: ${d.xLabel || (safeDisplayConfig.xAxisFormat ? formatAxisValue(d.x, safeDisplayConfig.xAxisFormat) : d.x)}`,\n `${getFieldLabel(yAxisField)}: ${safeDisplayConfig.leftYAxisFormat ? formatAxisValue(d.y, safeDisplayConfig.leftYAxisFormat) : d.y}`,\n `${getFieldLabel(sizeFieldName)}: ${safeDisplayConfig.leftYAxisFormat ? formatAxisValue(d.size, safeDisplayConfig.leftYAxisFormat) : d.size}`,\n colorFieldName && d.color ? `${getFieldLabel(colorFieldName)}: ${d.color}` : ''\n ].filter(Boolean).join('<br>')\n\n tooltip\n .html(tooltipContent)\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n .transition()\n .duration(200)\n .style('opacity', 1)\n })\n .on('mousemove', function(event) {\n tooltip\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n })\n .on('mouseout', function(_event, d) {\n select(this)\n .transition()\n .duration(200)\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n .attr('r', sizeScale(d.size))\n\n tooltip\n .transition()\n .duration(200)\n .style('opacity', 0)\n })\n }\n\n // Add legend if needed\n if (safeDisplayConfig.showLegend && colorFieldName) {\n if (isNumericColorField) {\n // Create gradient legend for numeric color field\n const legendWidth = 200\n const legendHeight = 20\n const minValue = Math.min(...bubbleData.map(d => d.color as number))\n const maxValue = Math.max(...bubbleData.map(d => d.color as number))\n \n const legend = g.append('g')\n .attr('class', 'color-legend')\n .attr('transform', `translate(${width / 2 - legendWidth / 2}, ${chartHeight + 60})`)\n\n // Create gradient definition\n const defs = svg.append('defs')\n const gradient = defs.append('linearGradient')\n .attr('id', 'color-scale-gradient')\n .attr('x1', '0%')\n .attr('y1', '0%')\n .attr('x2', '100%')\n .attr('y2', '0%')\n\n // Add color stops for the gradient\n const gradientColors = colorPalette?.gradient || CHART_COLORS_GRADIENT\n gradientColors.forEach((color, i) => {\n gradient.append('stop')\n .attr('offset', `${(i / (gradientColors.length - 1)) * 100}%`)\n .attr('stop-color', color)\n })\n\n // Add the gradient rectangle\n legend.append('rect')\n .attr('width', legendWidth)\n .attr('height', legendHeight)\n .style('fill', 'url(#color-scale-gradient)')\n .style('stroke', '#ccc')\n .style('stroke-width', 1)\n\n // Add min value label\n legend.append('text')\n .attr('x', 0)\n .attr('y', legendHeight + 15)\n .attr('text-anchor', 'start')\n .style('font-size', '11px')\n .style('fill', textColor)\n .text(safeDisplayConfig.leftYAxisFormat ? formatAxisValue(minValue, safeDisplayConfig.leftYAxisFormat) : minValue.toFixed(2))\n\n // Add max value label\n legend.append('text')\n .attr('x', legendWidth)\n .attr('y', legendHeight + 15)\n .attr('text-anchor', 'end')\n .style('font-size', '11px')\n .style('fill', textColor)\n .text(safeDisplayConfig.leftYAxisFormat ? formatAxisValue(maxValue, safeDisplayConfig.leftYAxisFormat) : maxValue.toFixed(2))\n\n // Add field name label\n legend.append('text')\n .attr('x', legendWidth / 2)\n .attr('y', -5)\n .attr('text-anchor', 'middle')\n .style('font-size', '12px')\n .style('font-weight', 'bold')\n .style('fill', textColor)\n .text(getFieldLabel(colorFieldName))\n\n } else {\n // Original categorical legend\n const legendItems = uniqueColors\n\n if (legendItems.length > 0) {\n const legend = g.append('g')\n .attr('class', 'legend')\n .attr('transform', `translate(${width / 2 - (legendItems.length * 80) / 2}, ${chartHeight + 60})`)\n\n const legendItem = legend.selectAll('.legend-item')\n .data(legendItems)\n .enter().append('g')\n .attr('class', 'legend-item')\n .attr('transform', (_d, i) => `translate(${i * 80}, 0)`)\n .style('cursor', 'pointer')\n\n legendItem.append('circle')\n .attr('cx', 5)\n .attr('cy', 5)\n .attr('r', 5)\n .style('fill', d => (colorScale as ScaleOrdinal<string, string>)(d as string))\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n\n legendItem.append('text')\n .attr('x', 15)\n .attr('y', 5)\n .attr('dy', '.35em')\n .style('font-size', '11px')\n .style('fill', textColor)\n .text(d => String(d))\n\n // Legend hover effects\n legendItem\n .on('mouseover', function(_event, legendKey) {\n // Highlight matching bubbles\n bubbles\n .transition()\n .duration(200)\n .style('opacity', d => {\n const matches = colorFieldName && String(d.color) === legendKey\n return matches ? 1 : 0.2\n })\n })\n .on('mouseout', function() {\n // Reset all bubbles\n bubbles\n .transition()\n .duration(200)\n .style('opacity', safeDisplayConfig.bubbleOpacity)\n })\n }\n }\n }\n\n // Cleanup function\n return () => {\n tooltip.remove()\n }\n }, [data, chartConfig, safeDisplayConfig, queryObject, dimensions, dimensionsReady, colorPalette, theme, getFieldLabel])\n\n if (!data || data.length === 0) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-text-muted\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in bubble chart</div>\n </div>\n </div>\n )\n }\n\n // Validate that we have required fields\n const hasValidConfig = chartConfig?.xAxis && chartConfig?.yAxis && chartConfig?.series\n if (!hasValidConfig) {\n return (\n <div className=\"flex items-center justify-center w-full text-dc-warning\" style={{ height }}>\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Required</div>\n <div className=\"text-xs\">Bubble chart requires xAxis, yAxis, series, and sizeField dimensions</div>\n <div className=\"text-xs mt-1\">Optional: colorField for bubble coloring</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"w-full flex-1 flex flex-col relative\" style={{ height, minHeight: '250px', overflow: 'hidden' }}>\n <div ref={containerRef} className=\"w-full h-full relative\">\n <svg ref={svgRef} className=\"w-full h-full\" />\n {!dimensionsReady && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <div className=\"text-dc-text-muted text-sm\">Measuring chart dimensions...</div>\n </div>\n )}\n </div>\n </div>\n )\n})\n\nexport default BubbleChart","/**\n * Data Table component with time dimension pivoting\n *\n * When a query includes a time dimension with granularity, the table\n * automatically pivots to show time periods as columns.\n */\n\nimport React, { useMemo } from 'react'\nimport { useCubeMeta } from '../../providers/CubeProvider'\nimport { getMeasureTypeIcon } from '../../icons'\nimport {\n hasTimeDimensionForPivot,\n pivotTableData,\n getMeasureType,\n getOrderedColumnsFromQuery,\n type PivotedTableData,\n type PivotColumn,\n type PivotRow\n} from '../../utils/pivotUtils'\nimport { formatAxisValue } from '../../utils/chartUtils'\nimport type { ChartProps, AxisFormatConfig } from '../../types'\n\nconst DataTable = React.memo(function DataTable({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = 300\n}: ChartProps) {\n const { getFieldLabel, meta } = useCubeMeta()\n\n // Detect if we should pivot based on query structure\n // Pass chartConfig.xAxis to respect user-configured column ordering\n const pivotConfig = useMemo(\n () => hasTimeDimensionForPivot(queryObject, chartConfig?.xAxis),\n [queryObject, chartConfig?.xAxis]\n )\n\n // Check if pivoting is enabled (default: true when time dimension present)\n const enablePivot = displayConfig?.pivotTimeDimension !== false\n\n // Compute pivoted data if applicable\n const pivotedData = useMemo<PivotedTableData | null>(() => {\n if (!pivotConfig || !enablePivot) return null\n return pivotTableData(data, pivotConfig, getFieldLabel, meta)\n }, [data, pivotConfig, enablePivot, getFieldLabel, meta])\n\n // Empty state\n if (!data || data.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full\"\n style={{ height }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data to display in table</div>\n </div>\n </div>\n )\n }\n\n // Render pivoted table if applicable\n if (pivotedData?.isPivoted && pivotedData.columns.length > 0) {\n return (\n <PivotedTable\n pivotedData={pivotedData}\n height={height}\n meta={meta}\n leftYAxisFormat={displayConfig?.leftYAxisFormat}\n />\n )\n }\n\n // Fallback to flat table rendering\n return (\n <FlatTable\n data={data}\n chartConfig={chartConfig}\n queryObject={queryObject}\n height={height}\n getFieldLabel={getFieldLabel}\n leftYAxisFormat={displayConfig?.leftYAxisFormat}\n />\n )\n})\n\nexport default DataTable\n\n/**\n * Pivoted table component - renders time dimension as columns\n */\nfunction PivotedTable({\n pivotedData,\n height,\n meta,\n leftYAxisFormat\n}: {\n pivotedData: PivotedTableData\n height: number | string\n meta: any\n leftYAxisFormat?: AxisFormatConfig\n}) {\n const { columns, rows } = pivotedData\n\n if (columns.length === 0 || rows.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full\"\n style={{ height }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data to display in table</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"w-full overflow-auto\" style={{ height }}>\n <table className=\"min-w-full divide-y border-dc-border\">\n <thead className=\"bg-dc-surface-secondary sticky top-0\">\n <tr>\n {columns.map((col: PivotColumn) => (\n <th\n key={col.key}\n className={`px-3 py-2 text-xs font-medium text-dc-text-muted uppercase tracking-wider whitespace-nowrap ${\n col.isTimeColumn ? 'text-right' : 'text-left'\n }`}\n >\n {col.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"bg-dc-surface divide-y border-dc-border\">\n {rows.map((row: PivotRow) => (\n <PivotedTableRow\n key={row.id}\n row={row}\n columns={columns}\n meta={meta}\n leftYAxisFormat={leftYAxisFormat}\n />\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\n/**\n * Single row in the pivoted table\n * Supports row spanning for measure cells when grouped by measure\n */\nfunction PivotedTableRow({\n row,\n columns,\n meta,\n leftYAxisFormat\n}: {\n row: PivotRow\n columns: PivotColumn[]\n meta: any\n leftYAxisFormat?: AxisFormatConfig\n}) {\n // Get measure icon for this row\n const measureType = getMeasureType(row.measureField, meta)\n const MeasureIcon = getMeasureTypeIcon(measureType)\n\n return (\n <tr className=\"hover:bg-dc-surface-secondary\">\n {columns.map((col: PivotColumn) => {\n const value = row.values[col.key]\n\n // Measure column - show icon + label with row spanning\n if (col.isMeasureColumn) {\n // Skip this cell if not first in measure group\n if (row.isFirstInGroup === false) {\n return null\n }\n\n return (\n <td\n key={col.key}\n className=\"px-3 py-2 whitespace-nowrap text-sm text-dc-text align-top\"\n rowSpan={row.dimensionRowSpan}\n >\n <div className=\"flex items-center\">\n <MeasureIcon className=\"w-3.5 h-3.5 mr-1.5 text-dc-text-muted shrink-0\" />\n <span>{value}</span>\n </div>\n </td>\n )\n }\n\n // Time column - right-aligned, formatted values (these are measure values)\n if (col.isTimeColumn) {\n return (\n <td\n key={col.key}\n className=\"px-3 py-2 whitespace-nowrap text-sm text-right text-dc-text\"\n >\n {formatPivotCellValue(value, leftYAxisFormat)}\n </td>\n )\n }\n\n // Dimension column - left-aligned (no row spanning) - no number formatting\n return (\n <td\n key={col.key}\n className=\"px-3 py-2 whitespace-nowrap text-sm text-dc-text\"\n >\n {formatPivotCellValue(value)}\n </td>\n )\n })}\n </tr>\n )\n}\n\n/**\n * Format cell value for pivoted table display\n * Shows \"-\" for null/undefined values\n */\nfunction formatPivotCellValue(value: any, formatConfig?: AxisFormatConfig): string {\n if (value === null || value === undefined) return '-'\n if (typeof value === 'number') {\n // Use formatAxisValue if config provided\n if (formatConfig) {\n return formatAxisValue(value, formatConfig)\n }\n // Format with locale and up to 2 decimal places\n if (Number.isInteger(value)) {\n return value.toLocaleString()\n }\n return parseFloat(value.toFixed(2)).toLocaleString()\n }\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No'\n }\n return String(value)\n}\n\n/**\n * Flat table component - original non-pivoted table rendering\n */\nfunction FlatTable({\n data,\n chartConfig,\n queryObject,\n height,\n getFieldLabel,\n leftYAxisFormat\n}: {\n data: any[]\n chartConfig?: { xAxis?: string[] }\n queryObject?: ChartProps['queryObject']\n height: number | string\n getFieldLabel: (field: string) => string\n leftYAxisFormat?: AxisFormatConfig\n}) {\n // Get all columns available in data\n const allColumns = Object.keys(data[0] || {})\n\n // Determine column order with proper fallback:\n // 1. If xAxis is configured, use that order\n // 2. Otherwise, derive order from queryObject (dimensions + timeDimensions + measures)\n // 3. Fallback: Object.keys order\n const columns = useMemo(() => {\n // If xAxis is configured, use that order (filtered to existing columns)\n if (chartConfig?.xAxis && chartConfig.xAxis.length > 0) {\n return chartConfig.xAxis.filter(col => allColumns.includes(col))\n }\n\n // Derive order from queryObject\n const queryOrder = getOrderedColumnsFromQuery(queryObject)\n if (queryOrder.length > 0) {\n // Filter to only columns that exist in data\n const ordered = queryOrder.filter(col => allColumns.includes(col))\n // Add any columns in data that weren't in query (edge case)\n const remaining = allColumns.filter(col => !ordered.includes(col))\n return [...ordered, ...remaining]\n }\n\n // Final fallback: Object.keys order\n return allColumns\n }, [chartConfig?.xAxis, queryObject, allColumns])\n\n if (columns.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full\"\n style={{ height }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No columns available</div>\n <div className=\"text-xs text-dc-text-secondary\">Data structure is invalid</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"w-full overflow-auto\" style={{ height }}>\n <table className=\"min-w-full divide-y border-dc-border\">\n <thead className=\"bg-dc-surface-secondary sticky top-0\">\n <tr>\n {columns.map((column) => (\n <th\n key={column}\n className=\"px-3 py-2 text-left text-xs font-medium text-dc-text-muted uppercase tracking-wider\"\n >\n {getFieldLabel(column)}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"bg-dc-surface divide-y border-dc-border\">\n {data.map((row, index) => (\n <tr key={index} className=\"hover:bg-dc-surface-secondary\">\n {columns.map((column) => (\n <td\n key={column}\n className=\"px-3 py-2 whitespace-nowrap text-sm text-dc-text\"\n >\n {formatCellValue(row[column], leftYAxisFormat)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\n/**\n * Format cell value for flat table display\n */\nfunction formatCellValue(value: any, formatConfig?: AxisFormatConfig): string {\n if (value == null) return ''\n if (typeof value === 'number') {\n // Use formatAxisValue if config provided\n if (formatConfig) {\n return formatAxisValue(value, formatConfig)\n }\n return value.toLocaleString()\n }\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No'\n }\n return String(value)\n}\n","import React, { useEffect, useLayoutEffect, useRef, useState, useMemo, useCallback } from 'react'\nimport { select, scaleQuantize, max, min } from 'd3'\nimport { CHART_COLORS_GRADIENT, CHART_MARGINS } from '../../utils/chartConstants'\nimport { formatTimeValue } from '../../utils/chartUtils'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport { getTheme, watchThemeChanges, type Theme } from '../../theme'\nimport type { ChartProps } from '../../types'\n\ninterface GridCell {\n x: number\n y: number\n value: number\n date: Date\n label: string\n}\n\ninterface GridMapping {\n extractX: (date: Date) => number\n extractY: (date: Date) => number\n xLabels: string[]\n yLabels: string[]\n xFormat: (value: number) => string\n yFormat: (value: number) => string\n cellWidth: number\n cellHeight: number\n hasHierarchicalLabels?: boolean\n getYearFromX?: (value: number) => number\n}\n\nconst ActivityGridChart = React.memo(function ActivityGridChart({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const svgRef = useRef<SVGSVGElement | null>(null)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const [dimensions, setDimensions] = useState({ width: 0, height: 0 })\n const [dimensionsReady, setDimensionsReady] = useState(false)\n const [currentTheme, setCurrentTheme] = useState<Theme>('light')\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n // Watch for theme changes\n useEffect(() => {\n setCurrentTheme(getTheme())\n const unwatch = watchThemeChanges((theme) => {\n setCurrentTheme(theme)\n })\n return unwatch\n }, [])\n\n const safeDisplayConfig = useMemo(() => ({\n showTooltip: displayConfig?.showTooltip ?? true,\n showLabels: displayConfig?.showLabels ?? true,\n fitToWidth: displayConfig?.fitToWidth ?? false\n }), [displayConfig?.showTooltip, displayConfig?.showLabels, displayConfig?.fitToWidth])\n\n // Enhanced dimension measurement with retry mechanism\n useLayoutEffect(() => {\n let retryCount = 0\n const maxRetries = 10\n let rafId: number\n let timeoutId: ReturnType<typeof setTimeout>\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n \n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n setDimensionsReady(true)\n return true\n }\n }\n return false\n }\n \n const success = updateDimensions()\n \n if (!success && retryCount < maxRetries) {\n const retryWithRaf = () => {\n const rafSuccess = updateDimensions()\n \n if (!rafSuccess && retryCount < maxRetries) {\n retryCount++\n timeoutId = setTimeout(() => {\n rafId = requestAnimationFrame(retryWithRaf)\n }, 50 * retryCount)\n }\n }\n \n rafId = requestAnimationFrame(retryWithRaf)\n }\n \n return () => {\n if (rafId) cancelAnimationFrame(rafId)\n if (timeoutId) clearTimeout(timeoutId)\n }\n }, [])\n\n // ResizeObserver for dynamic resizing\n useEffect(() => {\n let resizeObserver: ResizeObserver | null = null\n \n const updateDimensions = () => {\n if (containerRef.current) {\n const { width, height } = containerRef.current.getBoundingClientRect()\n if (width > 0 && height > 0) {\n setDimensions({ width, height })\n if (!dimensionsReady) {\n setDimensionsReady(true)\n }\n }\n }\n }\n \n if (containerRef.current) {\n resizeObserver = new ResizeObserver(() => updateDimensions())\n resizeObserver.observe(containerRef.current)\n updateDimensions()\n }\n\n window.addEventListener('resize', updateDimensions)\n \n return () => {\n if (resizeObserver) {\n resizeObserver.disconnect()\n }\n window.removeEventListener('resize', updateDimensions)\n }\n }, [dimensionsReady])\n\n // Helper functions for grid coordinate extraction\n const getQuarter = (date: Date): number => {\n return Math.floor(date.getMonth() / 3) + 1 // 1-4\n }\n\n const getMonthOfQuarter = (date: Date): number => {\n return (date.getMonth() % 3) + 1 // 1-3\n }\n\n const getWeekOfMonth = (date: Date): number => {\n // Always start from week 1 for the first week of the month, regardless of day offset\n const dayOfMonth = date.getDate()\n return Math.floor((dayOfMonth - 1) / 7) + 1 // 1-5 typically\n }\n\n // Get granularity mapping based on time dimension\n const getGridMapping = useCallback((granularity: string): GridMapping | null => {\n switch (granularity?.toLowerCase()) {\n case 'year':\n // Year granularity is not useful for activity grids\n return null\n \n case 'quarter':\n // Quarter granularity: years × quarters\n return {\n extractX: (date: Date) => date.getFullYear(),\n extractY: (date: Date) => getQuarter(date) - 1, // 0-3 for indexing\n xLabels: [], // Will be determined from data\n yLabels: ['Q1', 'Q2', 'Q3', 'Q4'],\n xFormat: (value: number) => `'${value.toString().slice(-2)}`, // '24 instead of 2024\n yFormat: (value: number) => ['Q1', 'Q2', 'Q3', 'Q4'][value] || '',\n cellWidth: 16,\n cellHeight: 16\n }\n \n case 'month':\n // Month granularity: quarters × months of quarter\n // Show years above and quarters (Q1, Q2, Q3, Q4) as columns with hierarchical labels\n return {\n extractX: (date: Date) => {\n const year = date.getFullYear()\n const quarter = getQuarter(date) // 1-4\n return year * 10 + quarter // e.g., 20241, 20242, 20243, 20244 (only 4 per year)\n },\n extractY: (date: Date) => getMonthOfQuarter(date) - 1, // 0-2 for indexing\n xLabels: [], // Will be determined from data\n yLabels: ['Month 1', 'Month 2', 'Month 3'],\n xFormat: (value: number) => {\n const quarter = value % 10\n return `Q${quarter}` // Just show Q1, Q2, Q3, Q4 for individual columns\n },\n yFormat: (value: number) => ['Month 1', 'Month 2', 'Month 3'][value] || '',\n cellWidth: 16,\n cellHeight: 16,\n hasHierarchicalLabels: true, // Flag to indicate we need special handling\n getYearFromX: (value: number) => Math.floor(value / 10) // Helper to get year for grouping\n }\n \n case 'week':\n // Week granularity: months × weeks of month (same structure as quarters but with months as columns)\n return {\n extractX: (date: Date) => {\n const year = date.getFullYear()\n const month = date.getMonth() + 1\n return year * 100 + month // e.g., 202401, 202402, etc.\n },\n extractY: (date: Date) => getWeekOfMonth(date) - 1, // 0-5 for indexing\n xLabels: [], // Will be determined from data\n yLabels: ['Week 1', 'Week 2', 'Week 3', 'Week 4', 'Week 5'],\n xFormat: (value: number) => {\n const month = value % 100\n const monthNames = ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D']\n return monthNames[month - 1] || ''\n },\n yFormat: (value: number) => ['Week 1', 'Week 2', 'Week 3', 'Week 4', 'Week 5'][value] || '',\n cellWidth: 16,\n cellHeight: 16,\n hasHierarchicalLabels: true, // Add hierarchical labels like month view\n getYearFromX: (value: number) => Math.floor(value / 100) // Helper to get year for grouping\n }\n \n case 'day':\n // Day granularity: weeks × days of week with hierarchical year/week labels\n return {\n extractX: (date: Date) => {\n const { year, week } = getWeekOfYear(date)\n return year * 100 + week // e.g., 202401, 202402, etc.\n },\n extractY: (date: Date) => date.getDay(), // 0-6 (Sun-Sat)\n xLabels: [], // Will be determined from data\n yLabels: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n xFormat: (value: number) => {\n const week = value % 100\n return `${week}`\n },\n yFormat: (value: number) => ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][value] || '',\n cellWidth: 16,\n cellHeight: 16,\n hasHierarchicalLabels: true, // Add hierarchical labels\n getYearFromX: (value: number) => Math.floor(value / 100) // Helper to get year for grouping\n }\n\n case 'hour':\n // Hour granularity: days × 3-hour blocks with hierarchical year/month labels\n return {\n extractX: (date: Date) => {\n // Get day as YYYYMMDD number for unique day identification\n const year = date.getFullYear()\n const month = date.getMonth() + 1\n const day = date.getDate()\n return year * 10000 + month * 100 + day // e.g., 20240115\n },\n extractY: (date: Date) => Math.floor(date.getHours() / 3), // 0-7 for 8 three-hour blocks\n xLabels: [], // Will be determined from data\n yLabels: ['00-03', '03-06', '06-09', '09-12', '12-15', '15-18', '18-21', '21-00'],\n xFormat: (value: number) => {\n // Format YYYYMMDD as just the day number\n const day = value % 100\n return `${day}`\n },\n yFormat: (value: number) => ['00-03', '03-06', '06-09', '09-12', '12-15', '15-18', '18-21', '21-00'][value] || '',\n cellWidth: 16,\n cellHeight: 16,\n hasHierarchicalLabels: true, // Show year/month grouping above\n getYearFromX: (value: number) => Math.floor(value / 100) // Extract YYYYMM for month grouping\n }\n\n default:\n return null\n }\n }, [])\n\n // Helper function to get week of year with correct year (1-53)\n const getWeekOfYear = (date: Date): { year: number, week: number } => {\n const d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()))\n const dayNum = d.getUTCDay() || 7\n d.setUTCDate(d.getUTCDate() + 4 - dayNum)\n const year = d.getUTCFullYear()\n const yearStart = new Date(Date.UTC(year, 0, 1))\n const week = Math.ceil((((d.getTime() - yearStart.getTime()) / 86400000) + 1) / 7)\n return { year, week }\n }\n\n useEffect(() => {\n if (!data || data.length === 0 || !svgRef.current || !dimensionsReady || dimensions.width === 0) {\n return\n }\n\n // Clear previous chart\n select(svgRef.current).selectAll('*').remove()\n\n // Validate chartConfig\n if (!chartConfig?.dateField || !chartConfig?.valueField) {\n return\n }\n\n const dateField = Array.isArray(chartConfig.dateField) ? chartConfig.dateField[0] : chartConfig.dateField\n const valueField = Array.isArray(chartConfig.valueField) ? chartConfig.valueField[0] : chartConfig.valueField\n\n\n if (!dateField || !valueField) {\n return\n }\n\n // Get granularity directly from the query's time dimensions\n const getQueryGranularity = () => {\n if (!queryObject?.timeDimensions || queryObject.timeDimensions.length === 0) {\n return 'day'\n }\n \n // Find the time dimension that matches our dateField\n const timeDim = queryObject.timeDimensions.find((td: any) => \n td.dimension === dateField || td.dimension.includes(dateField)\n )\n \n if (timeDim && timeDim.granularity) {\n return timeDim.granularity\n }\n \n // Fallback to first time dimension's granularity\n const firstTimeDim = queryObject.timeDimensions[0]\n if (firstTimeDim && firstTimeDim.granularity) {\n return firstTimeDim.granularity\n }\n \n return 'day'\n }\n \n const queryGranularity = getQueryGranularity()\n const gridMapping = getGridMapping(queryGranularity)\n \n // Handle unsupported granularity\n if (!gridMapping) {\n return\n }\n \n\n // Transform data for grid\n const gridData: GridCell[] = data.map(item => {\n const dateValue = item[dateField]\n const value = typeof item[valueField] === 'string' \n ? parseFloat(item[valueField]) \n : (item[valueField] || 0)\n \n // Parse the date\n let date: Date\n if (typeof dateValue === 'string') {\n // Handle different date formats\n let isoStr = dateValue\n if (dateValue.includes(' ')) {\n isoStr = dateValue.replace(' ', 'T').replace('+00', 'Z').replace(/\\+\\d{2}:\\d{2}$/, 'Z')\n }\n if (!isoStr.endsWith('Z') && !isoStr.includes('+')) {\n isoStr = isoStr + 'Z'\n }\n date = new Date(isoStr)\n } else {\n date = new Date(dateValue)\n }\n\n // Skip invalid dates\n if (isNaN(date.getTime())) {\n return null\n }\n\n const x = gridMapping.extractX(date)\n const y = gridMapping.extractY(date)\n \n return {\n x,\n y,\n value,\n date,\n label: formatTimeValue(dateValue, queryGranularity)\n }\n }).filter((cell): cell is GridCell => cell !== null)\n\n\n if (gridData.length === 0) return\n\n // Calculate grid dimensions\n const maxY = max(gridData, d => d.y) || 0\n const minY = min(gridData, d => d.y) || 0\n\n\n // Generate complete X range first so we can calculate proper grid width\n const getCompleteXRange = (): number[] => {\n const dataXValues = [...new Set(gridData.map(cell => cell.x))].sort()\n \n if (queryGranularity === 'quarter') {\n // For quarters: only show quarters that have data to avoid gaps\n return dataXValues\n }\n \n if (queryGranularity === 'month') {\n // For months: only show quarters that have data to avoid gaps\n return dataXValues\n }\n \n if (queryGranularity === 'week') {\n // For weeks: only show months that have data to avoid gaps\n return dataXValues\n }\n \n if (queryGranularity === 'day') {\n // For days: only show the actual weeks that have data to avoid discontinuities\n return dataXValues\n }\n \n // For other granularities, use the actual data values\n return dataXValues\n }\n \n const completeXRange = getCompleteXRange()\n \n // Calculate grid dimensions based on complete X range\n const gridWidth = completeXRange.length * gridMapping.cellWidth + (completeXRange.length - 1) * 4\n const gridHeight = (maxY - minY + 1) * gridMapping.cellHeight + (maxY - minY) * 4\n\n const margin = { \n ...CHART_MARGINS, \n left: 60, // Space for Y-axis labels\n bottom: 10, // Reduced since labels are at top\n top: gridMapping.hasHierarchicalLabels ? 40 : 25, // Extra space for hierarchical labels\n right: 10\n }\n \n const availableWidth = dimensions.width - margin.left - margin.right\n const availableHeight = dimensions.height - margin.top - margin.bottom\n\n // Scale the grid to fit the available space\n let finalCellWidth: number\n let finalCellHeight: number\n\n if (safeDisplayConfig.fitToWidth) {\n // Fit to Width mode: Calculate cell size to perfectly fit both dimensions\n // Remove min/max constraints and let blocks scale to optimal size\n const scaleX = availableWidth / gridWidth\n const scaleY = availableHeight / gridHeight\n const scale = Math.min(scaleX, scaleY)\n\n // Use the scale to calculate cell size, maintaining 1:1 aspect ratio\n finalCellWidth = gridMapping.cellWidth * scale\n finalCellHeight = gridMapping.cellHeight * scale\n } else {\n // Default mode: Use minimum/maximum size constraints with scrolling\n const getMinCellSize = () => {\n return { width: 16, height: 16 } // Same size for all views\n }\n\n const minCellSize = getMinCellSize()\n const maxCellSize = 24\n\n const scaleX = availableWidth / gridWidth\n const scaleY = availableHeight / gridHeight\n const scale = Math.min(scaleX, scaleY)\n\n // Calculate final cell size with constraints\n finalCellWidth = Math.max(minCellSize.width, Math.min(maxCellSize, gridMapping.cellWidth * scale))\n finalCellHeight = Math.max(minCellSize.height, Math.min(maxCellSize, gridMapping.cellHeight * scale))\n\n // For week view, prefer scrolling over tiny cells\n if (queryGranularity === 'week' && finalCellWidth < minCellSize.width) {\n finalCellWidth = minCellSize.width\n }\n }\n \n // Calculate actual grid dimensions with the final cell sizes\n const actualGridWidth = completeXRange.length * finalCellWidth + (completeXRange.length - 1) * 4\n \n // Determine if we need horizontal scrolling\n const needsHorizontalScroll = actualGridWidth > availableWidth\n const svgWidth = needsHorizontalScroll ? actualGridWidth + margin.left + margin.right : dimensions.width\n \n\n const svg = select(svgRef.current)\n .attr('width', svgWidth)\n .attr('height', dimensions.height)\n\n const g = svg.append('g')\n .attr('transform', `translate(${margin.left},${margin.top})`)\n\n // Set up color scale\n const values = gridData.map(d => d.value)\n const minValue = min(values) || 0\n const maxValue = max(values) || 1\n\n const colorScale = scaleQuantize<string>()\n .domain([minValue, maxValue])\n .range(colorPalette?.gradient || CHART_COLORS_GRADIENT)\n\n // Create grid data map for quick lookup\n const gridMap = new Map<string, GridCell>()\n gridData.forEach(cell => {\n const key = `${cell.x}-${cell.y}`\n gridMap.set(key, cell)\n })\n\n // Get theme colors from CSS variables\n const getThemeColor = (varName: string, fallback: string) => {\n const value = getComputedStyle(document.documentElement).getPropertyValue(varName).trim()\n return value || fallback\n }\n\n const isDark = currentTheme !== 'light'\n const textColor = isDark\n ? getThemeColor('--dc-text-muted', '#cbd5e1') // Lighter text for dark mode\n : getThemeColor('--dc-text-secondary', '#374151') // Darker text for light mode\n const lineColor = getThemeColor('--dc-border', '#e5e7eb')\n // Use theme-aware colors for empty cells: light gray in light mode, slightly lighter than bg in dark mode\n const emptyCellColor = isDark\n ? getThemeColor('--dc-bg-secondary', '#1e293b') // Slightly lighter than dark background\n : getThemeColor('--dc-bg-secondary', '#f3f4f6') // Very light gray in light mode\n const cellStrokeColor = isDark\n ? getThemeColor('--dc-border', '#334155') // Subtle border in dark mode\n : getThemeColor('--dc-bg', '#ffffff') // White border in light mode\n\n // Create tooltip\n const tooltip = select('body').append('div')\n .attr('class', 'activity-grid-tooltip')\n .style('position', 'absolute')\n .style('padding', '8px')\n .style('background', 'rgba(0, 0, 0, 0.8)')\n .style('color', 'white')\n .style('border-radius', '4px')\n .style('font-size', '12px')\n .style('pointer-events', 'none')\n .style('opacity', 0)\n .style('z-index', 1000)\n\n // Create a mapping from X values to their position indices for proper spacing\n const xValueToIndex = new Map<number, number>()\n completeXRange.forEach((x, index) => {\n xValueToIndex.set(x, index)\n })\n \n // Render grid cells for the complete X range\n for (const x of completeXRange) {\n for (let y = minY; y <= maxY; y++) {\n const key = `${x}-${y}`\n const cell = gridMap.get(key)\n const xIndex = xValueToIndex.get(x) || 0\n \n const rect = g.append('rect')\n .attr('x', xIndex * (finalCellWidth + 4))\n .attr('y', (y - minY) * (finalCellHeight + 4))\n .attr('width', finalCellWidth)\n .attr('height', finalCellHeight)\n .attr('rx', 2)\n .attr('ry', 2)\n .style('fill', cell ? colorScale(cell.value) : emptyCellColor)\n .style('stroke', cellStrokeColor)\n .style('stroke-width', 1)\n\n // Add hover effects and tooltips\n if (safeDisplayConfig.showTooltip) {\n rect\n .style('cursor', 'pointer')\n .on('mouseover', function(event) {\n select(this)\n .style('stroke', '#000')\n .style('stroke-width', 2)\n\n if (cell) {\n const tooltipContent = [\n `<strong>${cell.label}</strong>`,\n `${getFieldLabel(valueField)}: ${cell.value}`\n ].join('<br>')\n\n tooltip\n .html(tooltipContent)\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n .transition()\n .duration(200)\n .style('opacity', 1)\n }\n })\n .on('mousemove', function(event) {\n tooltip\n .style('left', (event.pageX + 10) + 'px')\n .style('top', (event.pageY - 10) + 'px')\n })\n .on('mouseout', function() {\n select(this)\n .style('stroke', cellStrokeColor)\n .style('stroke-width', 1)\n\n tooltip\n .transition()\n .duration(200)\n .style('opacity', 0)\n })\n }\n }\n }\n\n // Add axis labels if enabled\n if (safeDisplayConfig.showLabels) {\n if (gridMapping.hasHierarchicalLabels && gridMapping.getYearFromX) {\n // Special handling for quarter view with hierarchical labels\n // Use the complete X range to show all quarters/months\n \n // Group quarters by year\n const yearGroups = new Map<number, number[]>()\n for (const x of completeXRange) {\n const year = gridMapping.getYearFromX(x)\n if (!yearGroups.has(year)) {\n yearGroups.set(year, [])\n }\n yearGroups.get(year)!.push(x)\n }\n \n \n // Draw column labels (Q1-Q4 for months, Jan-Dec for weeks)\n for (const x of completeXRange) {\n const xIndex = xValueToIndex.get(x) || 0\n g.append('text')\n .attr('x', xIndex * (finalCellWidth + 4) + finalCellWidth / 2)\n .attr('y', -8)\n .attr('text-anchor', 'middle')\n .style('font-size', '10px')\n .style('fill', textColor)\n .text(gridMapping.xFormat(x))\n }\n\n // Draw year group labels above quarters\n for (const [year, xValues] of yearGroups) {\n if (xValues.length > 0) {\n // Get the index positions for proper spacing\n const startIndex = Math.min(...xValues.map(x => xValueToIndex.get(x) || 0))\n const endIndex = Math.max(...xValues.map(x => xValueToIndex.get(x) || 0))\n const centerIndex = (startIndex + endIndex) / 2\n\n // Year label (or year/month for hour granularity)\n let labelText = ''\n if (year > 9999) {\n // For hour granularity, year is encoded as YYYYMM\n const actualYear = Math.floor(year / 100)\n const month = year % 100\n const monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\n labelText = `${monthNames[month - 1]} '${actualYear.toString().slice(-2)}`\n } else {\n // For other granularities, just show the year\n labelText = `'${year.toString().slice(-2)}`\n }\n\n g.append('text')\n .attr('x', centerIndex * (finalCellWidth + 4) + finalCellWidth / 2)\n .attr('y', -25)\n .attr('text-anchor', 'middle')\n .style('font-size', '12px')\n .style('font-weight', 'bold')\n .style('fill', textColor)\n .text(labelText)\n\n // Optional: Add a subtle line to group quarters under the year\n if (xValues.length > 1) {\n g.append('line')\n .attr('x1', startIndex * (finalCellWidth + 4))\n .attr('x2', endIndex * (finalCellWidth + 4) + finalCellWidth)\n .attr('y1', -20)\n .attr('y2', -20)\n .style('stroke', lineColor)\n .style('stroke-width', 1)\n .style('opacity', 0.3)\n }\n }\n }\n } else {\n // Regular X-axis labels for other granularities\n const xLabelStep = Math.max(1, Math.floor(completeXRange.length / 10))\n for (let i = 0; i < completeXRange.length; i += xLabelStep) {\n const x = completeXRange[i]\n g.append('text')\n .attr('x', i * (finalCellWidth + 4) + finalCellWidth / 2)\n .attr('y', -8)\n .attr('text-anchor', 'middle')\n .style('font-size', '10px')\n .style('fill', textColor)\n .text(gridMapping.xFormat(x))\n }\n }\n\n // Y-axis labels (left) - same for all granularities\n for (let y = minY; y <= maxY; y++) {\n g.append('text')\n .attr('x', -8)\n .attr('y', (y - minY) * (finalCellHeight + 4) + finalCellHeight / 2)\n .attr('text-anchor', 'end')\n .attr('dy', '.35em')\n .style('font-size', '10px')\n .style('fill', textColor)\n .text(gridMapping.yFormat(y))\n }\n }\n\n // Cleanup function\n return () => {\n tooltip.remove()\n }\n }, [data, chartConfig, displayConfig, queryObject, dimensions, dimensionsReady, safeDisplayConfig, colorPalette, currentTheme, getFieldLabel, getGridMapping])\n\n if (!data || data.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full\"\n style={{ height }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display in activity grid</div>\n </div>\n </div>\n )\n }\n\n // Validate that we have required fields\n const hasValidConfig = chartConfig?.dateField && chartConfig?.valueField\n if (!hasValidConfig) {\n return (\n <div\n className=\"flex items-center justify-center w-full\"\n style={{ height }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Required</div>\n <div className=\"text-xs text-dc-text-secondary\">Activity grid requires a time dimension and a measure</div>\n </div>\n </div>\n )\n }\n\n // Check if granularity is supported\n const dateField = Array.isArray(chartConfig.dateField) ? chartConfig.dateField[0] : chartConfig.dateField\n const granularityFromQuery = queryObject?.timeDimensions?.find((td: any) => \n td.dimension === dateField || td.dimension.includes(dateField)\n )?.granularity || 'day'\n \n if (granularityFromQuery?.toLowerCase() === 'year') {\n return (\n <div\n className=\"flex items-center justify-center w-full\"\n style={{ height }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">Granularity Too High</div>\n <div className=\"text-xs text-dc-text-secondary\">Activity grids work best with hour, day, week, month, or quarter granularity</div>\n <div className=\"text-xs text-dc-text-secondary mt-1\">Please choose a lower granularity for your time dimension</div>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"w-full flex flex-col relative\" style={{ height, minHeight: '250px', overflow: 'hidden', width: '100%' }}>\n <div ref={containerRef} className=\"w-full h-full relative overflow-x-auto\" style={{ width: '100%' }}>\n <svg ref={svgRef} className=\"h-full\" />\n {!dimensionsReady && (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <div className=\"text-dc-text-muted text-sm\">Measuring chart dimensions...</div>\n </div>\n )}\n </div>\n </div>\n )\n})\n\nexport default ActivityGridChart","\ninterface DataHistogramProps {\n /** Array of numeric values to create histogram from */\n values: number[]\n /** Minimum value in the dataset */\n min: number\n /** Maximum value in the dataset */\n max: number\n /** Color for the histogram bars */\n color?: string\n /** Number of buckets/bars to create (default: 12) */\n bucketCount?: number\n /** Height of the histogram in pixels (default: 32) */\n height?: number\n /** Format function for min/max labels */\n formatValue?: (value: number) => string\n /** Width of the histogram to match text above */\n width?: number\n /** Whether to show average indicator line (default: true) */\n showAverageIndicator?: boolean\n /** Target value to show as green line */\n targetValue?: number\n}\n\n/**\n * Reusable histogram component that shows the distribution of actual data values\n */\nexport default function DataHistogram({\n values,\n min,\n max,\n color = '#1f2937',\n bucketCount = 12,\n height = 32,\n formatValue = (val) => val.toString(),\n width,\n showAverageIndicator = true,\n targetValue\n}: DataHistogramProps) {\n // Create histogram buckets from actual data\n const buckets = new Array(bucketCount).fill(0)\n const range = max - min\n \n // Distribute actual values into buckets\n values.forEach(value => {\n if (range === 0) {\n // All values are the same, put everything in middle bucket\n buckets[Math.floor(bucketCount / 2)]++\n } else {\n // Calculate which bucket this value belongs to\n let bucketIndex = Math.floor(((value - min) / range) * (bucketCount - 1))\n // Clamp to valid bucket range\n bucketIndex = Math.max(0, Math.min(bucketCount - 1, bucketIndex))\n buckets[bucketIndex]++\n }\n })\n \n // Find max bucket count for normalization\n const maxBucketCount = Math.max(...buckets)\n \n // Calculate average for indicator positioning\n const average = values.reduce((sum, val) => sum + val, 0) / values.length\n \n // Calculate average position as percentage of histogram width\n const averagePosition = range === 0 ? 50 : ((average - min) / range) * 100\n \n // Calculate target position if target value is provided\n const targetPosition = targetValue !== undefined && range > 0 \n ? ((targetValue - min) / range) * 100 \n : null\n\n return (\n <div className=\"flex flex-col items-center\">\n {/* Horizontal bars representing actual data distribution */}\n <div \n className=\"relative flex items-end justify-center space-x-0.5\" \n style={{ \n height: `${height}px`,\n width: width ? `${width}px` : '200px',\n minWidth: '200px'\n }}\n >\n {buckets.map((count, i) => {\n // Normalize height based on actual data frequency\n const normalizedHeight = maxBucketCount > 0 ? count / maxBucketCount : 0\n const minHeight = 0.1 // minimum height for empty buckets\n const displayHeight = count > 0 ? Math.max(minHeight, normalizedHeight) : minHeight\n \n return (\n <div\n key={i}\n className=\"flex-1 rounded-t-sm transition-all duration-300 ease-out\"\n style={{\n height: `${displayHeight * height}px`,\n backgroundColor: color,\n opacity: count > 0 ? 0.7 + (normalizedHeight * 0.3) : 0.2 // higher opacity for buckets with data\n }}\n title={`${count} values in this range`} // tooltip showing actual count\n />\n )\n })}\n \n {/* Average indicator line */}\n {showAverageIndicator && (\n <div\n className=\"absolute top-0 bottom-0 pointer-events-none\"\n style={{\n left: `${averagePosition}%`,\n transform: 'translateX(-50%)',\n width: '2px',\n backgroundColor: '#ef4444',\n opacity: 0.8,\n zIndex: 10\n }}\n title={`Average: ${formatValue(average)}`}\n >\n {/* Small triangle at top to indicate average */}\n <div\n className=\"absolute -top-1\"\n style={{\n left: '50%',\n transform: 'translateX(-50%)',\n width: '0',\n height: '0',\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderTop: '6px solid #ef4444'\n }}\n />\n </div>\n )}\n \n {/* Target indicator line */}\n {targetPosition !== null && targetValue !== undefined && (\n <div\n className=\"absolute top-0 bottom-0 pointer-events-none\"\n style={{\n left: `${Math.max(0, Math.min(100, targetPosition))}%`,\n transform: 'translateX(-50%)',\n width: '2px',\n backgroundColor: '#10b981',\n opacity: 0.8,\n zIndex: 11\n }}\n title={`Target: ${formatValue(targetValue)}`}\n >\n {/* Small triangle at top to indicate target */}\n <div\n className=\"absolute -top-1\"\n style={{\n left: '50%',\n transform: 'translateX(-50%)',\n width: '0',\n height: '0',\n borderLeft: '4px solid transparent',\n borderRight: '4px solid transparent',\n borderTop: '6px solid #10b981'\n }}\n />\n </div>\n )}\n </div>\n \n {/* Min/Max values aligned with histogram width */}\n <div\n className=\"flex justify-between mt-2 text-xs text-dc-text-muted\"\n style={{\n width: width ? `${width}px` : '200px',\n minWidth: '200px'\n }}\n >\n <span>{formatValue(min)}</span>\n <span>{formatValue(max)}</span>\n </div>\n\n {/* Average indicator */}\n <div className=\"text-center mt-1 text-xs text-dc-text-muted\">\n Average of {values.length} values\n </div>\n </div>\n )\n}","import React, { useState, useRef, useEffect, useMemo, useCallback } from 'react'\nimport { Icon } from '@iconify/react'\nimport infoCircleIcon from '@iconify-icons/tabler/info-circle'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport DataHistogram from '../DataHistogram'\nimport { parseTargetValues, calculateVariance, formatVariance } from '../../utils/targetUtils'\nimport { filterIncompletePeriod } from '../../utils/periodUtils'\nimport type { ChartProps } from '../../types'\n\nconst KpiNumber = React.memo(function KpiNumber({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [fontSize, setFontSize] = useState(32)\n const [textWidth, setTextWidth] = useState(250)\n const containerRef = useRef<HTMLDivElement>(null)\n const valueRef = useRef<HTMLDivElement>(null)\n\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n // Extract value field from chart config - handle both string and array formats\n const valueFields = useMemo(() => {\n if (!chartConfig?.yAxis) return []\n if (typeof chartConfig.yAxis === 'string') return [chartConfig.yAxis]\n if (Array.isArray(chartConfig.yAxis)) return chartConfig.yAxis\n return []\n }, [chartConfig?.yAxis])\n\n const valueField = valueFields[0] || '' // Use first measure field\n\n // Get time dimension field if present (for incomplete period filtering)\n const timeDimensionField = queryObject?.timeDimensions?.[0]?.dimension || undefined\n\n // Memoize sorted data to prevent recalculation on every render\n const sortedData = useMemo(() => {\n if (!data || data.length === 0) return []\n let sorted = [...data]\n if (timeDimensionField) {\n sorted = sorted.sort((a, b) => {\n const aVal = a[timeDimensionField]\n const bVal = b[timeDimensionField]\n if (aVal < bVal) return -1\n if (aVal > bVal) return 1\n return 0\n })\n }\n return sorted\n }, [data, timeDimensionField])\n\n // Filter out incomplete or last period if enabled\n const { useLastCompletePeriod = true, skipLastPeriod = false } = displayConfig\n\n // Memoize filtered data\n const {\n filteredData,\n excludedIncompletePeriod,\n skippedLastPeriod,\n granularity\n } = useMemo(() => {\n if (sortedData.length === 0) {\n return { filteredData: [], excludedIncompletePeriod: false, skippedLastPeriod: false, granularity: undefined }\n }\n return filterIncompletePeriod(sortedData, timeDimensionField, queryObject, useLastCompletePeriod, skipLastPeriod)\n }, [sortedData, timeDimensionField, queryObject, useLastCompletePeriod, skipLastPeriod])\n\n // Use filtered data for calculations\n const dataToUse = filteredData\n\n // Memoize value extraction to prevent recalculation\n const values = useMemo(() => {\n if (!valueField || dataToUse.length === 0) return []\n\n const rawValues = dataToUse.map(row => {\n // Try direct field access first\n if (row[valueField] !== undefined) {\n return row[valueField]\n }\n\n // If not found, try finding the first numeric field as fallback\n const numericFields = Object.keys(row).filter(key =>\n typeof row[key] === 'number' && !isNaN(row[key])\n )\n\n if (numericFields.length > 0) {\n return row[numericFields[0]]\n }\n\n return undefined\n })\n\n return rawValues\n .filter(val => val !== null && val !== undefined && !isNaN(Number(val)))\n .map(val => Number(val))\n }, [dataToUse, valueField])\n\n // Memoize statistics calculations\n const { avg, min, max } = useMemo(() => {\n if (values.length === 0) return { avg: 0, min: 0, max: 0 }\n const sum = values.reduce((acc, val) => acc + val, 0)\n const avg = sum / values.length\n const min = Math.min(...values)\n const max = Math.max(...values)\n return { avg, min, max }\n }, [values])\n\n // Memoize format function to prevent re-creating on every render\n const formatNumber = useCallback((value: number | null | undefined): string => {\n // If custom formatValue is provided, use it exclusively\n if (displayConfig.formatValue) {\n return displayConfig.formatValue(value)\n }\n\n // Null handling: Show placeholder for missing data\n if (value === null || value === undefined) {\n return '—'\n }\n\n const decimals = displayConfig.decimals ?? 0\n const prefix = displayConfig.prefix ?? ''\n\n let formattedValue: string\n\n if (Math.abs(value) >= 1e9) {\n formattedValue = (value / 1e9).toFixed(decimals) + 'B'\n } else if (Math.abs(value) >= 1e6) {\n formattedValue = (value / 1e6).toFixed(decimals) + 'M'\n } else if (Math.abs(value) >= 1e3) {\n formattedValue = (value / 1e3).toFixed(decimals) + 'K'\n } else {\n formattedValue = value.toFixed(decimals)\n }\n\n return prefix + formattedValue\n }, [displayConfig])\n\n const mainValue = values.length === 1 ? values[0] : avg\n const showStats = values.length > 1\n\n // Memoize color calculation to prevent re-creating function on every render\n const valueColor = useMemo((): string => {\n if (displayConfig.valueColorIndex !== undefined && colorPalette?.colors) {\n const colorIndex = displayConfig.valueColorIndex\n if (colorIndex >= 0 && colorIndex < colorPalette.colors.length) {\n return colorPalette.colors[colorIndex]\n }\n }\n // Default to first color in palette if available, otherwise fallback to dark gray\n return colorPalette?.colors?.[0] || '#1f2937'\n }, [displayConfig.valueColorIndex, colorPalette?.colors])\n\n // Process target values for variance calculation\n const targetValues = useMemo(() => parseTargetValues(displayConfig?.target || ''), [displayConfig?.target])\n const targetValue = targetValues.length > 0 ? targetValues[0] : null // Use first target value\n const variance = targetValue !== null && values.length > 0 ? calculateVariance(mainValue, targetValue) : null\n\n // Memoize variance color calculation\n const varianceColor = useMemo((): string => {\n if (variance === null) return '#6B7280' // Gray for no target\n\n if (variance >= 0) {\n // Positive variance - use positive color from palette\n const positiveIndex = displayConfig.positiveColorIndex ?? 1\n return colorPalette?.colors?.[positiveIndex] || '#10B981' // Green fallback\n } else {\n // Negative variance - use negative color from palette\n const negativeIndex = displayConfig.negativeColorIndex ?? 7\n return colorPalette?.colors?.[negativeIndex] || '#EF4444' // Red fallback\n }\n }, [variance, displayConfig.positiveColorIndex, displayConfig.negativeColorIndex, colorPalette?.colors])\n\n // Calculate font size and text width based on container dimensions\n useEffect(() => {\n const updateDimensions = () => {\n if (containerRef.current) {\n const container = containerRef.current\n const rect = container.getBoundingClientRect()\n const containerWidth = rect.width\n const containerHeight = rect.height\n\n if (containerWidth > 0 && containerHeight > 0) {\n // Calculate font size based on container dimensions\n // For KPI displays, we want the text to be large and prominent\n // Reserve space for the label by using more conservative sizing\n const widthBasedSize = containerWidth / 5\n const heightBasedSize = containerHeight / 4 // More conservative to leave room for label\n const baseFontSize = Math.min(widthBasedSize, heightBasedSize)\n const clampedFontSize = Math.max(24, Math.min(baseFontSize, 120)) // Lower max to ensure label fits\n setFontSize(clampedFontSize)\n\n // Use a timeout to measure text width after font size is applied\n setTimeout(() => {\n if (valueRef.current) {\n const textRect = valueRef.current.getBoundingClientRect()\n const measuredWidth = textRect.width\n // Ensure we have a minimum width and use container width as fallback\n const effectiveWidth = Math.max(measuredWidth, Math.min(containerWidth * 0.6, 300))\n setTextWidth(effectiveWidth)\n }\n }, 10)\n }\n }\n }\n\n // Initial calculation - reduce delay for faster initial render\n const timer = setTimeout(updateDimensions, 50)\n\n const resizeObserver = new ResizeObserver(() => {\n // Debounce the resize updates\n setTimeout(updateDimensions, 10)\n })\n\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current)\n }\n\n return () => {\n clearTimeout(timer)\n resizeObserver.disconnect()\n }\n }, [data, chartConfig])\n\n // Early returns AFTER all hooks\n if (!data || data.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display</div>\n </div>\n </div>\n )\n }\n\n if (valueFields.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined,\n backgroundColor: 'var(--dc-danger-bg)',\n color: 'var(--dc-danger)',\n borderColor: 'var(--dc-danger-border)'\n }}\n >\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">No measure fields configured</div>\n </div>\n </div>\n )\n }\n\n // Null handling: If all values are null, show placeholder instead of error\n if (values.length === 0) {\n return (\n <div\n ref={containerRef}\n className=\"flex flex-col items-center justify-center w-full h-full p-4\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Field Label */}\n <div\n className=\"text-dc-text-secondary font-bold text-center mb-3\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2'\n }}\n >\n {getFieldLabel(valueField)}\n </div>\n\n {/* No Data Placeholder */}\n <div\n className=\"font-bold leading-none text-dc-text-muted\"\n style={{\n fontSize: `${fontSize}px`\n }}\n >\n —\n </div>\n\n <div className=\"text-xs text-dc-text-muted mt-2\">No data</div>\n </div>\n )\n }\n\n return (\n <div\n ref={containerRef}\n className=\"flex flex-col items-center justify-center w-full h-full p-4\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Field Label - Bolder and bigger */}\n <div\n className=\"text-dc-text-secondary font-bold text-center mb-3 flex items-center justify-center gap-1\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2'\n }}\n >\n <span>\n {(() => {\n const label = getFieldLabel(valueField)\n // Temporary fix: if label seems wrong, use the field name directly\n const displayLabel = (label && label.length > 1) ? label : valueField\n return displayLabel\n })()}\n </span>\n {(excludedIncompletePeriod || skippedLastPeriod) && (\n <span\n title={skippedLastPeriod\n ? `Excludes last ${granularity || 'period'}`\n : `Excludes current incomplete ${granularity}`}\n className=\"cursor-help\"\n >\n <Icon icon={infoCircleIcon} className=\"w-4 h-4 text-dc-text-muted opacity-70\" />\n </span>\n )}\n </div>\n\n {/* Main KPI Value and Variance - Horizontal layout */}\n <div className=\"flex items-center justify-center gap-4 mb-3\">\n <div\n ref={valueRef}\n className=\"font-bold leading-none\"\n style={{\n fontSize: `${fontSize}px`,\n color: valueColor\n }}\n >\n {formatNumber(mainValue)}\n </div>\n\n {/* Target Variance Display - To the right of main value */}\n {targetValue !== null && variance !== null && (\n <div className=\"flex flex-col items-start\">\n <div\n className=\"font-semibold\"\n style={{\n fontSize: `${Math.max(12, fontSize * 0.3)}px`,\n color: varianceColor,\n lineHeight: '1.2'\n }}\n >\n {formatVariance(variance, 1)}\n </div>\n <div\n className=\"text-dc-text-muted text-xs\"\n style={{\n opacity: 0.7,\n fontSize: `${Math.max(10, fontSize * 0.2)}px`\n }}\n >\n vs {formatNumber(targetValue)}\n </div>\n </div>\n )}\n </div>\n\n {/* Unit/Suffix - Larger, not bold (hidden when formatValue is provided) */}\n {displayConfig.suffix && !displayConfig.formatValue && (\n <div\n className=\"text-dc-text-muted text-center\"\n style={{\n fontSize: '14px',\n lineHeight: '1.2',\n opacity: 0.8\n }}\n >\n {displayConfig.suffix}\n </div>\n )}\n\n {/* Data Histogram for multiple values */}\n {showStats && (\n <div className=\"mt-4\">\n <DataHistogram\n values={values}\n min={min}\n max={max}\n color={valueColor}\n formatValue={formatNumber}\n height={24}\n width={textWidth}\n targetValue={targetValue || undefined}\n />\n </div>\n )}\n </div>\n )\n})\n\nexport default KpiNumber\n","import React, { useState, useRef, useEffect } from \"react\";\nimport { Icon } from \"@iconify/react\";\nimport infoCircleIcon from \"@iconify-icons/tabler/info-circle\";\nimport { useCubeFieldLabel } from \"../../hooks/useCubeFieldLabel\";\nimport { filterIncompletePeriod } from \"../../utils/periodUtils\";\nimport type { ChartProps } from \"../../types\";\n\ninterface VarianceHistogramProps {\n values: number[];\n lastValue: number;\n positiveColor: string;\n negativeColor: string;\n formatValue: (value: number) => string;\n width: number;\n height: number;\n}\n\nfunction VarianceHistogram({\n values,\n lastValue,\n positiveColor,\n negativeColor,\n formatValue,\n width,\n height,\n}: VarianceHistogramProps) {\n // Limit to most recent N values to fit in the histogram\n // Calculate max bars based on width (minimum 8px per bar including gap)\n const maxBars = Math.max(10, Math.floor(width / 10));\n const limitedValues =\n values.length > maxBars\n ? values.slice(-maxBars) // Take the most recent values\n : values;\n\n // Calculate variance (difference) from current/last value for each point\n const variances = limitedValues.map((value) => value - lastValue);\n\n // Find min/max variance for scaling (include 0 as baseline)\n const minVariance = Math.min(...variances, 0);\n const maxVariance = Math.max(...variances, 0);\n const range = Math.max(Math.abs(minVariance), Math.abs(maxVariance));\n\n if (range === 0 || variances.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center bg-dc-bg-secondary rounded-sm border border-dc-border\"\n style={{ width: `${width}px`, height: `${height}px` }}\n >\n <span className=\"text-xs text-dc-text-muted\">No variance data</span>\n </div>\n );\n }\n\n // Calculate bar dimensions\n const barGap = 2;\n const availableWidth = width - (limitedValues.length - 1) * barGap;\n const barWidth = Math.max(4, availableWidth / limitedValues.length);\n\n // Calculate where zero line should be positioned (as percentage from top)\n // If maxVariance = 67 and minVariance = -24, total range = 91\n // Zero should be at 67/91 = 73.6% from top\n const totalRange = maxVariance - minVariance;\n const zeroLinePercent =\n totalRange > 0 ? (maxVariance / totalRange) * 100 : 50;\n\n return (\n <div className=\"flex items-center space-x-2\">\n {/* Histogram bars */}\n <div\n className=\"relative\"\n style={{\n width: `${width}px`,\n height: `${height}px`,\n }}\n >\n {/* Zero line (represents current value) */}\n <div\n className=\"absolute left-0 right-0\"\n style={{\n height: \"1px\",\n top: `${zeroLinePercent}%`,\n backgroundColor: \"var(--dc-border)\",\n zIndex: 1,\n }}\n />\n\n {/* Variance bars - oldest to newest (left to right) */}\n {variances.map((variance, index) => {\n // Calculate bar height as proportion of total range\n const normalizedHeight = Math.abs(variance) / totalRange;\n const barHeight = Math.max(2, normalizedHeight * (height - 4));\n const isPositive = variance >= 0;\n const isLastValue = index === limitedValues.length - 1;\n const color = isPositive ? positiveColor : negativeColor;\n const xPosition = index * (barWidth + barGap);\n\n return (\n <div\n key={index}\n className=\"absolute rounded-xs\"\n style={{\n left: `${xPosition}px`,\n width: `${barWidth}px`,\n height: `${barHeight}px`,\n backgroundColor: color,\n opacity: isLastValue ? 1 : 0.6,\n // Position bar relative to zero line\n ...(isPositive\n ? { bottom: `${100 - zeroLinePercent}%` }\n : { top: `${zeroLinePercent}%` }),\n zIndex: 2,\n }}\n title={`${formatValue(limitedValues[index])}: ${variance >= 0 ? \"+\" : \"\"}${formatValue(variance)} vs current`}\n />\n );\n })}\n </div>\n\n {/* Variance labels on the right - show actual value difference */}\n <div\n className=\"flex flex-col justify-between text-xs text-dc-text-muted\"\n style={{ height: `${height}px` }}\n >\n <span>+{formatValue(maxVariance)}</span>\n <span>\n {minVariance < 0 ? \"\" : \"\"}\n {formatValue(minVariance)}\n </span>\n </div>\n </div>\n );\n}\n\nconst KpiDelta = React.memo(function KpiDelta({\n data,\n chartConfig,\n displayConfig = {},\n queryObject,\n height = \"100%\",\n colorPalette,\n}: ChartProps) {\n const [fontSize, setFontSize] = useState(32);\n const [textWidth, setTextWidth] = useState(250);\n const containerRef = useRef<HTMLDivElement>(null);\n const valueRef = useRef<HTMLDivElement>(null);\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel();\n\n // Calculate font size and text width based on container dimensions\n useEffect(() => {\n const updateDimensions = () => {\n if (containerRef.current) {\n const container = containerRef.current;\n const rect = container.getBoundingClientRect();\n const containerWidth = rect.width;\n const containerHeight = rect.height;\n\n if (containerWidth > 0 && containerHeight > 0) {\n const widthBasedSize = containerWidth / 4;\n const heightBasedSize = containerHeight / 4;\n const baseFontSize = Math.min(widthBasedSize, heightBasedSize);\n const clampedFontSize = Math.max(28, Math.min(baseFontSize, 140));\n setFontSize(clampedFontSize);\n\n setTimeout(() => {\n if (valueRef.current) {\n const textRect = valueRef.current.getBoundingClientRect();\n const measuredWidth = textRect.width;\n // Scale histogram width with container, accounting for labels on the right (~60px)\n const maxHistogramWidth = containerWidth - 100; // Leave room for padding and labels\n const effectiveWidth = Math.max(\n measuredWidth,\n Math.min(maxHistogramWidth, containerWidth * 0.7),\n );\n setTextWidth(Math.max(100, effectiveWidth)); // Minimum 100px\n }\n }, 10);\n }\n }\n };\n\n const timer = setTimeout(updateDimensions, 50);\n\n const resizeObserver = new ResizeObserver(() => {\n setTimeout(updateDimensions, 10);\n });\n\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current);\n }\n\n return () => {\n clearTimeout(timer);\n resizeObserver.disconnect();\n };\n }, [data, chartConfig]);\n\n if (!data || data.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? \"200px\" : undefined,\n }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">\n No data points to display\n </div>\n </div>\n </div>\n );\n }\n\n // Extract value and dimension fields from chart config\n let valueFields: string[] = [];\n let dimensionFields: string[] = [];\n\n if (chartConfig?.yAxis) {\n valueFields = Array.isArray(chartConfig.yAxis)\n ? chartConfig.yAxis\n : [chartConfig.yAxis];\n }\n\n if (chartConfig?.xAxis) {\n dimensionFields = Array.isArray(chartConfig.xAxis)\n ? chartConfig.xAxis\n : [chartConfig.xAxis];\n }\n\n if (valueFields.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? \"200px\" : undefined,\n backgroundColor: \"var(--dc-danger-bg)\",\n color: \"var(--dc-danger)\",\n borderColor: \"var(--dc-danger-border)\",\n }}\n >\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">No measure field configured</div>\n </div>\n </div>\n );\n }\n\n const valueField = valueFields[0];\n const dimensionField = dimensionFields[0]; // Optional\n\n // Sort data by dimension if available (for time series)\n let sortedData = [...data];\n if (dimensionField) {\n sortedData = sortedData.sort((a, b) => {\n const aVal = a[dimensionField];\n const bVal = b[dimensionField];\n if (aVal < bVal) return -1;\n if (aVal > bVal) return 1;\n return 0;\n });\n }\n\n // Filter out incomplete or last period if enabled\n const { useLastCompletePeriod = true, skipLastPeriod = false } =\n displayConfig;\n const {\n filteredData,\n excludedIncompletePeriod,\n skippedLastPeriod,\n granularity,\n } = filterIncompletePeriod(\n sortedData,\n dimensionField,\n queryObject,\n useLastCompletePeriod,\n skipLastPeriod,\n );\n\n // Use filtered data for calculations\n const dataToUse = filteredData;\n\n // Extract values from filtered data\n const values = dataToUse\n .map((row) => row[valueField])\n .filter((val) => val !== null && val !== undefined && !isNaN(Number(val)))\n .map((val) => Number(val));\n\n if (values.length < 2) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? \"200px\" : undefined,\n backgroundColor: \"var(--dc-warning-bg)\",\n color: \"var(--dc-warning)\",\n borderColor: \"var(--dc-warning-border)\",\n }}\n >\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Insufficient Data</div>\n <div className=\"text-xs\">\n Delta calculation requires at least 2 data points\n </div>\n <div className=\"text-xs\">Current data points: {values.length}</div>\n </div>\n </div>\n );\n }\n\n // Calculate delta between last and second-last values\n const lastValue = values[values.length - 1];\n const secondLastValue = values[values.length - 2];\n const absoluteChange = lastValue - secondLastValue;\n const percentageChange =\n secondLastValue !== 0\n ? (absoluteChange / Math.abs(secondLastValue)) * 100\n : 0;\n\n const isPositiveChange = absoluteChange >= 0;\n\n // Format number with appropriate units and decimals\n const formatNumber = (value: number | null | undefined): string => {\n // If custom formatValue is provided, use it exclusively\n if (displayConfig.formatValue) {\n return displayConfig.formatValue(value);\n }\n\n // Null handling: Show placeholder for missing data\n if (value === null || value === undefined) {\n return \"—\";\n }\n\n const decimals = displayConfig.decimals ?? 0;\n const prefix = displayConfig.prefix ?? \"\";\n\n let formattedValue: string;\n\n if (Math.abs(value) >= 1e9) {\n formattedValue = (value / 1e9).toFixed(decimals) + \"B\";\n } else if (Math.abs(value) >= 1e6) {\n formattedValue = (value / 1e6).toFixed(decimals) + \"M\";\n } else if (Math.abs(value) >= 1e3) {\n formattedValue = (value / 1e3).toFixed(decimals) + \"K\";\n } else {\n formattedValue = value.toFixed(decimals);\n }\n\n return prefix + formattedValue;\n };\n\n // Get colors from palette\n const getPositiveColor = (): string => {\n if (\n displayConfig.positiveColorIndex !== undefined &&\n colorPalette?.colors\n ) {\n const colorIndex = displayConfig.positiveColorIndex;\n if (colorIndex >= 0 && colorIndex < colorPalette.colors.length) {\n return colorPalette.colors[colorIndex];\n }\n }\n return \"#10b981\"; // Default green\n };\n\n const getNegativeColor = (): string => {\n if (\n displayConfig.negativeColorIndex !== undefined &&\n colorPalette?.colors\n ) {\n const colorIndex = displayConfig.negativeColorIndex;\n if (colorIndex >= 0 && colorIndex < colorPalette.colors.length) {\n return colorPalette.colors[colorIndex];\n }\n }\n return \"#ef4444\"; // Default red\n };\n\n const positiveColor = getPositiveColor();\n const negativeColor = getNegativeColor();\n const currentColor = isPositiveChange ? positiveColor : negativeColor;\n\n return (\n <div\n ref={containerRef}\n className=\"flex flex-col items-center justify-center w-full h-full p-4\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? \"200px\" : undefined,\n }}\n >\n {/* Field Label */}\n <div\n className=\"text-dc-text-secondary font-bold text-center mb-2 flex items-center justify-center gap-1\"\n style={{\n fontSize: \"14px\",\n lineHeight: \"1.2\",\n }}\n >\n <span>\n {(() => {\n const label = getFieldLabel(valueField);\n return label && label.length > 1 ? label : valueField;\n })()}\n </span>\n {(excludedIncompletePeriod || skippedLastPeriod) && (\n <span\n title={\n skippedLastPeriod\n ? `Excludes last ${granularity || \"period\"}`\n : `Excludes current incomplete ${granularity}`\n }\n className=\"cursor-help\"\n >\n <Icon\n icon={infoCircleIcon}\n className=\"w-4 h-4 text-dc-text-muted opacity-70\"\n />\n </span>\n )}\n </div>\n\n {/* Main KPI Value and Delta */}\n <div className=\"flex items-center justify-center space-x-4 mb-2\">\n {/* Main KPI Value */}\n <div\n ref={valueRef}\n className=\"font-bold leading-none\"\n style={{\n fontSize: `${fontSize}px`,\n color: \"var(--dc-text)\", // Keep main value neutral\n }}\n >\n {formatNumber(lastValue)}\n </div>\n\n {/* Delta Information */}\n <div className=\"flex items-center space-x-1\">\n {/* Arrow */}\n <div\n className=\"font-bold\"\n style={{\n color: currentColor,\n fontSize: `${fontSize * 0.35}px`,\n }}\n >\n {isPositiveChange ? \"▲\" : \"▼\"}\n </div>\n\n {/* Delta Values */}\n <div className=\"text-left\">\n <div\n className=\"font-bold leading-tight\"\n style={{\n fontSize: `${fontSize * 0.35}px`,\n color: currentColor,\n }}\n >\n {isPositiveChange ? \"+\" : \"\"}\n {formatNumber(absoluteChange)}\n </div>\n <div\n className=\"font-semibold leading-tight\"\n style={{\n fontSize: `${fontSize * 0.28}px`,\n color: currentColor,\n opacity: 0.8,\n }}\n >\n {isPositiveChange ? \"+\" : \"\"}\n {percentageChange.toFixed(1)}%\n </div>\n </div>\n </div>\n </div>\n\n {/* Unit/Suffix (hidden when formatValue is provided) */}\n {displayConfig.suffix && !displayConfig.formatValue && (\n <div\n className=\"text-dc-text-muted text-center mb-3\"\n style={{\n fontSize: \"14px\",\n lineHeight: \"1.2\",\n opacity: 0.8,\n }}\n >\n {displayConfig.suffix}\n </div>\n )}\n\n {/* Variance Histogram */}\n {displayConfig.showHistogram !== false && values.length > 2 && (\n <div className=\"mt-2 w-full flex justify-center overflow-hidden\">\n <VarianceHistogram\n values={values}\n lastValue={lastValue}\n positiveColor={positiveColor}\n negativeColor={negativeColor}\n formatValue={formatNumber}\n width={textWidth}\n height={64}\n />\n </div>\n )}\n </div>\n );\n})\n\nexport default KpiDelta\n","import React, { useState, useRef, useEffect } from 'react'\nimport { useCubeFieldLabel } from '../../hooks/useCubeFieldLabel'\nimport DataHistogram from '../DataHistogram'\nimport type { ChartProps } from '../../types'\n\nconst KpiText = React.memo(function KpiText({ \n data, \n chartConfig, \n displayConfig = {},\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const [fontSize, setFontSize] = useState(28)\n const [textWidth, setTextWidth] = useState(0)\n const containerRef = useRef<HTMLDivElement>(null)\n const textRef = useRef<HTMLDivElement>(null)\n // Use specialized hook to avoid re-renders from unrelated context changes\n const getFieldLabel = useCubeFieldLabel()\n\n // Calculate font size and text width based on container dimensions\n useEffect(() => {\n const updateDimensions = () => {\n if (containerRef.current) {\n const container = containerRef.current\n const rect = container.getBoundingClientRect()\n const containerWidth = rect.width\n const containerHeight = rect.height\n \n if (containerWidth > 0 && containerHeight > 0) {\n // Calculate font size based on container dimensions\n // For KPI Text displays, text might be longer so use more conservative sizing\n // Also reserve space for potential statistics display\n const widthBasedSize = containerWidth / 8\n const heightBasedSize = containerHeight / 5\n const baseFontSize = Math.min(widthBasedSize, heightBasedSize)\n const clampedFontSize = Math.max(18, Math.min(baseFontSize, 80))\n setFontSize(clampedFontSize)\n }\n }\n \n // Measure the text width after font size is set\n if (textRef.current) {\n const textRect = textRef.current.getBoundingClientRect()\n setTextWidth(textRect.width)\n }\n }\n\n // Initial calculation after a short delay to ensure the container is fully rendered\n const timer = setTimeout(updateDimensions, 100)\n \n const resizeObserver = new ResizeObserver(() => {\n // Debounce the resize updates\n clearTimeout(timer)\n setTimeout(updateDimensions, 50)\n })\n \n if (containerRef.current) {\n resizeObserver.observe(containerRef.current)\n }\n\n return () => {\n clearTimeout(timer)\n resizeObserver.disconnect()\n }\n }, [data, chartConfig])\n\n if (!data || data.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No data available</div>\n <div className=\"text-xs text-dc-text-secondary\">No data points to display</div>\n </div>\n </div>\n )\n }\n\n // Extract value field from chart config - handle both string and array formats\n let valueFields: string[] = []\n if (chartConfig?.yAxis) {\n // Handle both string and array formats\n if (typeof chartConfig.yAxis === 'string') {\n valueFields = [chartConfig.yAxis]\n } else if (Array.isArray(chartConfig.yAxis)) {\n valueFields = chartConfig.yAxis\n }\n }\n \n \n if (valueFields.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined,\n backgroundColor: 'var(--dc-danger-bg)',\n color: 'var(--dc-danger)',\n borderColor: 'var(--dc-danger-border)'\n }}\n >\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">Configuration Error</div>\n <div className=\"text-xs\">No measure fields configured</div>\n </div>\n </div>\n )\n }\n\n const valueField = valueFields[0] // Use first measure field\n \n // Debug logging (remove in production)\n \n // Extract values for the selected field\n const values = data\n .map(row => {\n // Try direct field access first\n if (row[valueField] !== undefined) {\n return row[valueField]\n }\n \n // If not found, try finding the first available field as fallback\n const availableFields = Object.keys(row)\n if (availableFields.length > 0) {\n // Field not found, using fallback\n return row[availableFields[0]]\n }\n \n return undefined\n })\n .filter(val => val !== null && val !== undefined)\n \n\n if (values.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined,\n backgroundColor: 'var(--dc-warning-bg)',\n color: 'var(--dc-warning)',\n borderColor: 'var(--dc-warning-border)'\n }}\n >\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No valid data</div>\n <div className=\"text-xs\">All values are null or invalid</div>\n </div>\n </div>\n )\n }\n\n // Calculate statistics for numeric values\n const numericValues = values\n .map(val => Number(val))\n .filter(val => !isNaN(val))\n\n let mainValue: any\n let min: number | null = null\n let max: number | null = null\n let showStats = false\n\n if (numericValues.length > 0) {\n if (values.length === 1) {\n mainValue = values[0]\n } else {\n // Calculate average for multiple numeric values\n const sum = numericValues.reduce((acc, val) => acc + val, 0)\n const avg = sum / numericValues.length\n mainValue = avg\n min = Math.min(...numericValues)\n max = Math.max(...numericValues)\n showStats = true\n }\n } else {\n // Non-numeric values - just use the first one or concatenate if multiple\n mainValue = values.length === 1 ? values[0] : values.join(', ')\n }\n\n // Format number with appropriate units and decimals\n const formatNumber = (value: number | null | undefined): string => {\n // If custom formatValue is provided, use it exclusively\n if (displayConfig.formatValue) {\n return displayConfig.formatValue(value)\n }\n\n // Null handling: Show placeholder for missing data\n if (value === null || value === undefined) {\n return '—'\n }\n\n const decimals = displayConfig.decimals ?? 2\n\n if (Math.abs(value) >= 1e9) {\n return (value / 1e9).toFixed(decimals) + 'B'\n } else if (Math.abs(value) >= 1e6) {\n return (value / 1e6).toFixed(decimals) + 'M'\n } else if (Math.abs(value) >= 1e3) {\n return (value / 1e3).toFixed(decimals) + 'K'\n } else {\n return value.toFixed(decimals)\n }\n }\n\n // Process template string\n const processTemplate = (template: string, value: any): string => {\n try {\n // Create template variables\n const templateVars = {\n value: typeof value === 'number' ? formatNumber(value) : String(value),\n rawValue: value,\n field: valueField,\n fieldLabel: getFieldLabel(valueField),\n min: min !== null ? formatNumber(min) : '',\n max: max !== null ? formatNumber(max) : '',\n count: values.length\n }\n\n // Simple template replacement using ${variable} syntax\n return template.replace(/\\$\\{(\\w+)\\}/g, (match, varName) => {\n if (varName in templateVars) {\n return String(templateVars[varName as keyof typeof templateVars])\n }\n return match\n })\n } catch {\n // Error processing template\n return String(value)\n }\n }\n\n const template = displayConfig.template || '${fieldLabel}: ${value}'\n const displayText = processTemplate(template, mainValue)\n\n // Get color from palette by index, default to first color in palette\n const getValueColor = (): string => {\n if (displayConfig.valueColorIndex !== undefined && colorPalette?.colors) {\n const colorIndex = displayConfig.valueColorIndex\n if (colorIndex >= 0 && colorIndex < colorPalette.colors.length) {\n return colorPalette.colors[colorIndex]\n }\n }\n // Default to first color in palette if available, otherwise fallback to dark gray\n return colorPalette?.colors?.[0] || '#1f2937'\n }\n\n const valueColor = getValueColor()\n\n return (\n <div \n ref={containerRef}\n className=\"flex flex-col items-center justify-center w-full h-full p-4\"\n style={{ \n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {/* Main KPI Text */}\n <div \n ref={textRef}\n className=\"font-bold leading-tight text-center\"\n style={{ \n fontSize: `${fontSize}px`,\n color: valueColor \n }}\n >\n {displayText}\n </div>\n\n {/* Data Histogram for multiple values */}\n {showStats && min !== null && max !== null && (\n <div className=\"mt-4\">\n <DataHistogram\n values={values}\n min={min}\n max={max}\n color={valueColor}\n formatValue={formatNumber}\n height={24}\n width={textWidth || 200}\n />\n </div>\n )}\n </div>\n )\n})\n\nexport default KpiText","import React from 'react'\nimport type { ChartProps } from '../../types'\n\ninterface MarkdownNode {\n type: 'text' | 'bold' | 'italic' | 'link' | 'header' | 'list' | 'listItem' | 'paragraph' | 'break'\n content?: string\n url?: string\n level?: number\n ordered?: boolean\n children?: MarkdownNode[]\n parentOrdered?: boolean // For list items to know if parent list is ordered\n}\n\nconst MarkdownChart = React.memo(function MarkdownChart({ \n displayConfig = {},\n height = \"100%\",\n colorPalette\n}: ChartProps) {\n const content = displayConfig.content || ''\n const accentColorIndex = displayConfig.accentColorIndex ?? 0\n const fontSize = displayConfig.fontSize || 'medium'\n const alignment = displayConfig.alignment || 'left'\n\n // Get accent color from palette\n const getAccentColor = (): string => {\n if (colorPalette?.colors && accentColorIndex < colorPalette.colors.length) {\n return colorPalette.colors[accentColorIndex]\n }\n return '#8884d8' // Default color\n }\n\n const accentColor = getAccentColor()\n\n // Font size mapping\n const fontSizeClasses = {\n small: 'text-sm',\n medium: 'text-lg', \n large: 'text-xl'\n }\n\n // Alignment mapping\n const alignmentClasses = {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right'\n }\n\n // Simple markdown parser\n const parseMarkdown = (text: string): MarkdownNode[] => {\n const lines = text.split('\\n')\n const nodes: MarkdownNode[] = []\n let currentList: MarkdownNode | null = null\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim()\n \n if (!line) {\n // Empty line - end current list and add line break\n if (currentList) {\n nodes.push(currentList)\n currentList = null\n }\n nodes.push({ type: 'break' })\n continue\n }\n\n // Headers\n const headerMatch = line.match(/^(#{1,3})\\s+(.*)$/)\n if (headerMatch) {\n if (currentList) {\n nodes.push(currentList)\n currentList = null\n }\n nodes.push({\n type: 'header',\n level: headerMatch[1].length,\n content: headerMatch[2]\n })\n continue\n }\n\n // Unordered list\n const unorderedMatch = line.match(/^[-*+]\\s+(.*)$/)\n if (unorderedMatch) {\n if (!currentList || currentList.ordered) {\n if (currentList) nodes.push(currentList)\n currentList = { type: 'list', ordered: false, children: [] }\n }\n currentList.children!.push({\n type: 'listItem',\n children: parseInline(unorderedMatch[1]),\n parentOrdered: false\n })\n continue\n }\n\n // Ordered list\n const orderedMatch = line.match(/^\\d+\\.\\s+(.*)$/)\n if (orderedMatch) {\n if (!currentList || !currentList.ordered) {\n if (currentList) nodes.push(currentList)\n currentList = { type: 'list', ordered: true, children: [] }\n }\n currentList.children!.push({\n type: 'listItem',\n children: parseInline(orderedMatch[1]),\n parentOrdered: true\n })\n continue\n }\n\n // Regular paragraph\n if (currentList) {\n nodes.push(currentList)\n currentList = null\n }\n \n nodes.push({\n type: 'paragraph',\n children: parseInline(line)\n })\n }\n\n // Add any remaining list\n if (currentList) {\n nodes.push(currentList)\n }\n\n return nodes\n }\n\n // Parse inline elements (bold, italic, links)\n const parseInline = (text: string): MarkdownNode[] => {\n const nodes: MarkdownNode[] = []\n let remaining = text\n \n while (remaining) {\n // Try to match link first [text](url)\n const linkMatch = remaining.match(/^(.*?)\\[([^\\]]+)\\]\\(([^)]+)\\)(.*)$/)\n if (linkMatch) {\n const [, before, linkText, url, after] = linkMatch\n if (before) {\n nodes.push(...parseSimpleInline(before))\n }\n nodes.push({\n type: 'link',\n content: linkText,\n url: url\n })\n remaining = after\n continue\n }\n\n // No more special formatting, parse remaining as simple inline\n nodes.push(...parseSimpleInline(remaining))\n break\n }\n\n return nodes\n }\n\n // Parse bold and italic\n const parseSimpleInline = (text: string): MarkdownNode[] => {\n const nodes: MarkdownNode[] = []\n let remaining = text\n\n while (remaining) {\n // Try bold first **text**\n const boldMatch = remaining.match(/^(.*?)\\*\\*([^*]+)\\*\\*(.*)$/)\n if (boldMatch) {\n const [, before, boldText, after] = boldMatch\n if (before) nodes.push({ type: 'text', content: before })\n nodes.push({ type: 'bold', content: boldText })\n remaining = after\n continue\n }\n\n // Try italic *text*\n const italicMatch = remaining.match(/^(.*?)\\*([^*]+)\\*(.*)$/)\n if (italicMatch) {\n const [, before, italicText, after] = italicMatch\n if (before) nodes.push({ type: 'text', content: before })\n nodes.push({ type: 'italic', content: italicText })\n remaining = after\n continue\n }\n\n // No more formatting, add as text\n nodes.push({ type: 'text', content: remaining })\n break\n }\n\n return nodes\n }\n\n // Render markdown nodes to React elements\n const renderNode = (node: MarkdownNode, key: number, listNumber?: number): React.ReactNode => {\n switch (node.type) {\n case 'text':\n return <span key={key} className=\"text-dc-text\">{node.content}</span>\n\n case 'bold':\n return <strong key={key} className=\"font-bold text-dc-text\">{node.content}</strong>\n\n case 'italic':\n return <em key={key} className=\"italic text-dc-text\">{node.content}</em>\n\n case 'link':\n return (\n <a \n key={key}\n href={node.url}\n target=\"_blank\"\n rel=\"nofollow noopener noreferrer\"\n className=\"hover:underline transition-colors\"\n style={{ color: accentColor }}\n >\n {node.content}\n </a>\n )\n\n case 'header': {\n // Header classes that scale with fontSize setting\n const getHeaderClasses = (level: number, fontSize: string) => {\n const baseClasses = 'font-bold'\n const marginClasses = {\n 1: 'mb-4',\n 2: 'mb-3',\n 3: 'mb-2'\n }\n\n let sizeClasses = ''\n if (fontSize === 'small') {\n sizeClasses = { 1: 'text-lg', 2: 'text-base', 3: 'text-sm' }[level] || 'text-sm'\n } else if (fontSize === 'large') {\n sizeClasses = { 1: 'text-5xl', 2: 'text-4xl', 3: 'text-3xl' }[level] || 'text-3xl'\n } else { // medium (default)\n sizeClasses = { 1: 'text-3xl', 2: 'text-2xl', 3: 'text-xl' }[level] || 'text-xl'\n }\n\n return `${baseClasses} ${sizeClasses} ${marginClasses[level as keyof typeof marginClasses]}`\n }\n\n const HeaderTag = `h${node.level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'\n return (\n <HeaderTag\n key={key}\n className={getHeaderClasses(node.level as number, fontSize)}\n style={{ color: accentColor }}\n >\n {node.content}\n </HeaderTag>\n )\n }\n\n case 'paragraph':\n return (\n <p key={key} className=\"mb-3 leading-relaxed\">\n {node.children?.map((child, i) => renderNode(child, i))}\n </p>\n )\n\n case 'list': {\n const ListTag = node.ordered ? 'ol' : 'ul'\n let listClasses = 'mb-3'\n\n if (alignment === 'center') {\n listClasses += ' list-none flex flex-col items-center'\n } else if (alignment === 'right') {\n listClasses += ' list-none ml-auto max-w-max'\n } else {\n listClasses += ' list-none ml-6'\n }\n\n return (\n <ListTag key={key} className={listClasses}>\n {node.children?.map((child, i) => renderNode(child, i, node.ordered ? i + 1 : undefined))}\n </ListTag>\n )\n }\n\n case 'listItem':\n if (node.children) {\n // For ordered lists, use custom colored numbers\n if (node.parentOrdered && listNumber !== undefined) {\n const numberSizeClass = fontSizeClasses[fontSize as keyof typeof fontSizeClasses]\n \n if (alignment === 'center') {\n return (\n <li key={key} className=\"mb-1 flex items-center justify-center\">\n <span \n className={`inline-block mr-2 shrink-0 ${numberSizeClass} font-medium`}\n style={{ color: accentColor }}\n >\n {listNumber}.\n </span>\n <span className=\"text-center\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n </li>\n )\n } else if (alignment === 'right') {\n return (\n <li key={key} className=\"mb-1 flex items-start justify-end\">\n <span className=\"text-right\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n <span \n className={`inline-block ml-2 shrink-0 ${numberSizeClass} font-medium`}\n style={{ color: accentColor }}\n >\n {listNumber}.\n </span>\n </li>\n )\n } else {\n return (\n <li key={key} className=\"mb-1 flex items-start\">\n <span \n className={`inline-block mr-3 shrink-0 ${numberSizeClass} font-medium`}\n style={{ color: accentColor }}\n >\n {listNumber}.\n </span>\n <span className=\"flex-1\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n </li>\n )\n }\n }\n \n // For unordered lists, use custom bullets with alignment\n if (alignment === 'center') {\n return (\n <li key={key} className=\"mb-1 flex items-center justify-center\">\n <span \n className=\"inline-block w-2 h-2 rounded-full mr-2 shrink-0\"\n style={{ backgroundColor: accentColor }}\n />\n <span className=\"text-center\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n </li>\n )\n } else if (alignment === 'right') {\n return (\n <li key={key} className=\"mb-1 flex items-start justify-end\">\n <span className=\"text-right\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n <span \n className=\"inline-block w-2 h-2 rounded-full ml-2 mt-2 shrink-0\"\n style={{ backgroundColor: accentColor }}\n />\n </li>\n )\n } else {\n return (\n <li key={key} className=\"mb-1 flex items-start\">\n <span \n className=\"inline-block w-2 h-2 rounded-full mr-3 mt-2 shrink-0\"\n style={{ backgroundColor: accentColor }}\n />\n <span className=\"flex-1\">\n {node.children.map((child, i) => renderNode(child, i))}\n </span>\n </li>\n )\n }\n }\n return null\n\n case 'break':\n return <br key={key} />\n\n default:\n return null\n }\n }\n\n if (!content.trim()) {\n return (\n <div\n className=\"flex items-center justify-center w-full h-full\"\n style={{\n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n <div className=\"text-center text-dc-text-muted\">\n <div className=\"text-sm font-semibold mb-1\">No content</div>\n <div className=\"text-xs text-dc-text-secondary\">Add markdown content in the chart configuration</div>\n </div>\n </div>\n )\n }\n\n const parsedNodes = parseMarkdown(content)\n\n return (\n <div \n className={`p-4 w-full h-full overflow-auto ${fontSizeClasses[fontSize as keyof typeof fontSizeClasses]} ${alignmentClasses[alignment as keyof typeof alignmentClasses]}`}\n style={{ \n height: height === \"100%\" ? \"100%\" : height,\n minHeight: height === \"100%\" ? '200px' : undefined\n }}\n >\n {parsedNodes.map((node, index) => renderNode(node, index))}\n </div>\n )\n})\n\nexport default MarkdownChart","/**\n * FunnelChart Component\n *\n * Visualizes funnel data showing conversion rates between steps.\n * Uses horizontal bars with percentage widths to represent the funnel shape.\n * Works with data from useFunnelQuery hook which provides FunnelChartData.\n */\n\nimport React, { useMemo } from 'react'\nimport { CHART_COLORS } from '../../utils/chartConstants'\nimport type { ChartProps } from '../../types'\nimport type { FunnelChartData } from '../../types/funnel'\n\n// Color gradient for funnel steps (darker to lighter)\nconst FUNNEL_COLORS = [\n '#3B82F6', // blue-500\n '#60A5FA', // blue-400\n '#93C5FD', // blue-300\n '#BFDBFE', // blue-200\n '#DBEAFE', // blue-100\n]\n\n/**\n * Get color for a funnel step\n */\nfunction getStepColor(index: number, colorPalette?: string[]): string {\n const colors = colorPalette || FUNNEL_COLORS\n return colors[index % colors.length]\n}\n\n/**\n * Check if data is funnel data format\n */\nfunction isFunnelData(data: unknown[]): data is FunnelChartData[] {\n if (!data || data.length === 0) return false\n const first = data[0]\n return (\n typeof first === 'object' &&\n first !== null &&\n 'name' in first &&\n 'value' in first &&\n 'percentage' in first\n )\n}\n\n/**\n * FunnelChart Component\n *\n * Renders a funnel visualization from FunnelChartData array.\n * Shows each step as a horizontal bar with width proportional to count.\n * Displays conversion rates between steps.\n */\nconst FunnelChart = React.memo(function FunnelChart({\n data,\n height = '100%',\n colorPalette,\n displayConfig,\n}: ChartProps) {\n // Get display config options\n const customStepLabels = displayConfig?.funnelStepLabels\n const orientation = displayConfig?.funnelOrientation || 'horizontal'\n const isVertical = orientation === 'vertical'\n\n // Transform data if needed\n const funnelData = useMemo<FunnelChartData[]>(() => {\n if (!data || data.length === 0) return []\n\n // If already funnel data format, use directly\n if (isFunnelData(data)) {\n return data\n }\n\n // Try to convert from raw query results\n // Look for common patterns: step/name, count/value, percentage\n return data.map((row, index) => {\n const record = row as Record<string, unknown>\n\n // Find name field\n const nameField = Object.keys(record).find(\n (k) => k.toLowerCase().includes('step') || k.toLowerCase().includes('name') || k === '__stepName'\n )\n const name = nameField ? String(record[nameField]) : `Step ${index + 1}`\n\n // Find value field\n const valueField = Object.keys(record).find(\n (k) => k.toLowerCase().includes('count') || k.toLowerCase().includes('value') || k === '__count'\n )\n const value = valueField ? Number(record[valueField]) || 0 : 0\n\n // Find percentage field\n const percentField = Object.keys(record).find(\n (k) => k.toLowerCase().includes('percent') || k === '__percentage'\n )\n const percentage = percentField ? Number(record[percentField]) || 0 : 0\n\n // Find conversion rate field\n const convRateField = Object.keys(record).find(\n (k) => k.toLowerCase().includes('conversion') || k === '__conversionRate'\n )\n const conversionRate = convRateField ? Number(record[convRateField]) || null : null\n\n return {\n name,\n value,\n percentage,\n conversionRate,\n stepIndex: index,\n }\n })\n }, [data])\n\n // Calculate first step value for percentage calculations\n const firstStepValue = funnelData[0]?.value || 0\n\n // Handle no data\n if (!data || data.length === 0 || funnelData.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center w-full text-dc-text-muted\"\n style={{ height }}\n >\n <div className=\"text-center\">\n <div className=\"text-sm font-semibold mb-1\">No funnel data</div>\n <div className=\"text-xs text-dc-text-secondary\">\n Configure a funnel with at least 2 steps and a binding key\n </div>\n </div>\n </div>\n )\n }\n\n const paletteColors = colorPalette?.colors || CHART_COLORS\n\n // Render vertical orientation (bars grow from bottom to top, steps laid out horizontally)\n if (isVertical) {\n return (\n <div className=\"relative w-full h-full flex flex-col\" style={{ height }}>\n {/* Funnel Steps - Vertical Layout */}\n <div className=\"flex-1 flex items-end justify-center gap-4 px-4 py-3 overflow-hidden\">\n {funnelData.map((step, index) => {\n const heightPercent = firstStepValue > 0 ? (step.value / firstStepValue) * 100 : 0\n const prevStep = index > 0 ? funnelData[index - 1] : null\n const stepConversionRate = prevStep && prevStep.value > 0\n ? (step.value / prevStep.value) * 100\n : null\n\n // Use custom label if provided, otherwise fall back to step name\n const displayName = customStepLabels?.[index] || step.name\n\n return (\n <div key={step.name} className=\"flex flex-col items-center gap-2 flex-1 max-w-32 h-full\">\n {/* Conversion Rate from Previous (top) */}\n <div className=\"h-5 flex-shrink-0\">\n {stepConversionRate !== null ? (\n <div className=\"text-xs text-dc-text-secondary\">\n → {stepConversionRate.toFixed(1)}%\n </div>\n ) : (\n <div className=\"text-xs text-dc-text-muted\">—</div>\n )}\n </div>\n\n {/* Bar Container */}\n <div className=\"flex-1 w-full relative min-h-12\">\n {/* Background Track */}\n <div className=\"absolute inset-0 bg-dc-surface-secondary rounded-sm\" />\n\n {/* Filled Bar (grows from bottom) */}\n <div\n className=\"absolute bottom-0 left-0 right-0 rounded-sm transition-all duration-300\"\n style={{\n height: `${Math.max(heightPercent, 5)}%`,\n backgroundColor: getStepColor(index, paletteColors),\n }}\n />\n\n {/* Percentage Label on Bar */}\n <div\n className=\"absolute bottom-0 left-0 right-0 flex items-end justify-center pb-1 pointer-events-none\"\n style={{ height: `${Math.max(heightPercent, 20)}%` }}\n >\n <span className=\"text-xs font-medium text-white drop-shadow-sm\">\n {step.percentage?.toFixed(1) ?? heightPercent.toFixed(1)}%\n </span>\n </div>\n </div>\n\n {/* Step Label (bottom) */}\n <div className=\"flex-shrink-0 text-center\">\n <div className=\"text-sm font-medium text-dc-text truncate\" title={displayName}>\n {displayName}\n </div>\n <div className=\"text-xs text-dc-text-muted\">\n {step.value.toLocaleString()}\n </div>\n </div>\n </div>\n )\n })}\n </div>\n\n {/* Summary Footer */}\n {!displayConfig?.hideSummaryFooter && (\n <div className=\"flex-shrink-0 px-4 py-2 border-t border-dc-border bg-dc-surface-secondary\">\n <div className=\"flex items-center justify-between text-sm\">\n <div className=\"text-dc-text-muted\">\n <span className=\"font-medium\">{funnelData.length}</span> steps\n </div>\n <div className=\"text-dc-text\">\n <span className=\"text-dc-text-muted\">Overall:</span>{' '}\n <span className=\"font-medium\">\n {firstStepValue > 0\n ? `${((funnelData[funnelData.length - 1]?.value || 0) / firstStepValue * 100).toFixed(1)}%`\n : '0%'}\n </span>\n </div>\n <div className=\"text-dc-text-muted\">\n {funnelData[funnelData.length - 1]?.value.toLocaleString() || 0} / {firstStepValue.toLocaleString()} completed\n </div>\n </div>\n </div>\n )}\n </div>\n )\n }\n\n // Render horizontal orientation (default - bars grow left to right, steps stacked vertically)\n return (\n <div className=\"relative w-full h-full flex flex-col\" style={{ height }}>\n {/* Funnel Steps - Horizontal Layout */}\n <div className=\"flex-1 flex flex-col justify-center gap-2 px-4 py-3 overflow-hidden\">\n {funnelData.map((step, index) => {\n const widthPercent = firstStepValue > 0 ? (step.value / firstStepValue) * 100 : 0\n const prevStep = index > 0 ? funnelData[index - 1] : null\n const stepConversionRate = prevStep && prevStep.value > 0\n ? (step.value / prevStep.value) * 100\n : null\n\n // Use custom label if provided, otherwise fall back to step name\n const displayName = customStepLabels?.[index] || step.name\n\n return (\n <div key={step.name} className=\"flex items-center gap-3\">\n {/* Step Label */}\n <div className=\"w-24 flex-shrink-0 text-right\">\n <div className=\"text-sm font-medium text-dc-text truncate\" title={displayName}>\n {displayName}\n </div>\n <div className=\"text-xs text-dc-text-muted\">\n {step.value.toLocaleString()}\n </div>\n </div>\n\n {/* Bar Container */}\n <div className=\"flex-1 relative\">\n {/* Background Track */}\n <div className=\"w-full h-8 bg-dc-surface-secondary rounded-sm\" />\n\n {/* Filled Bar */}\n <div\n className=\"absolute top-0 left-0 h-8 rounded-sm transition-all duration-300\"\n style={{\n width: `${Math.max(widthPercent, 2)}%`,\n backgroundColor: getStepColor(index, paletteColors),\n }}\n />\n\n {/* Percentage Label on Bar */}\n <div\n className=\"absolute top-0 left-0 h-8 flex items-center px-2 pointer-events-none\"\n style={{ width: `${Math.max(widthPercent, 20)}%` }}\n >\n <span className=\"text-xs font-medium text-white drop-shadow-sm\">\n {step.percentage?.toFixed(1) ?? widthPercent.toFixed(1)}%\n </span>\n </div>\n </div>\n\n {/* Conversion Rate from Previous */}\n <div className=\"w-16 flex-shrink-0 text-left\">\n {stepConversionRate !== null ? (\n <div className=\"text-xs text-dc-text-secondary\">\n ↓ {stepConversionRate.toFixed(1)}%\n </div>\n ) : (\n <div className=\"text-xs text-dc-text-muted\">—</div>\n )}\n </div>\n </div>\n )\n })}\n </div>\n\n {/* Summary Footer */}\n {!displayConfig?.hideSummaryFooter && (\n <div className=\"flex-shrink-0 px-4 py-2 border-t border-dc-border bg-dc-surface-secondary\">\n <div className=\"flex items-center justify-between text-sm\">\n <div className=\"text-dc-text-muted\">\n <span className=\"font-medium\">{funnelData.length}</span> steps\n </div>\n <div className=\"text-dc-text\">\n <span className=\"text-dc-text-muted\">Overall:</span>{' '}\n <span className=\"font-medium\">\n {firstStepValue > 0\n ? `${((funnelData[funnelData.length - 1]?.value || 0) / firstStepValue * 100).toFixed(1)}%`\n : '0%'}\n </span>\n </div>\n <div className=\"text-dc-text-muted\">\n {funnelData[funnelData.length - 1]?.value.toLocaleString() || 0} / {firstStepValue.toLocaleString()} completed\n </div>\n </div>\n </div>\n )}\n </div>\n )\n})\n\nexport default FunnelChart\n"],"names":["Subscribable","listener","defaultTimeoutProvider","callback","delay","timeoutId","intervalId","TimeoutManager","#provider","#providerCalled","provider","timeoutManager","systemSetTimeoutZero","isServer","noop","functionalUpdate","updater","input","isValidTimeout","value","timeUntilStale","updatedAt","staleTime","resolveStaleTime","query","resolveEnabled","enabled","matchQuery","filters","type","exact","fetchStatus","predicate","queryKey","stale","hashQueryKeyByOptions","partialMatchKey","isActive","matchMutation","mutation","status","mutationKey","hashKey","options","_","val","isPlainObject","result","key","a","b","hasOwn","replaceEqualDeep","array","isPlainArray","aSize","bItems","bSize","copy","equalItems","i","aItem","bItem","v","shallowEqualObjects","o","hasObjectPrototype","ctor","prot","sleep","timeout","resolve","replaceData","prevData","data","error","addToEnd","items","item","max","newItems","addToStart","skipToken","ensureQueryFn","fetchOptions","shouldThrowError","throwOnError","params","addConsumeAwareSignal","object","getSignal","onCancelled","consumed","signal","FocusManager","#focused","#cleanup","#setup","onFocus","setup","focused","isFocused","focusManager","pendingThenable","reject","thenable","_resolve","_reject","finalize","reason","defaultScheduler","createNotifyManager","queue","transactions","notifyFn","batchNotifyFn","scheduleFn","schedule","flush","originalQueue","args","fn","notifyManager","OnlineManager","#online","onOnline","onlineListener","offlineListener","online","onlineManager","defaultRetryDelay","failureCount","canFetch","networkMode","CancelledError","createRetryer","config","isRetryCancelled","continueFn","isResolved","cancel","cancelOptions","cancelRetry","continueRetry","canContinue","canStart","pause","continueResolve","run","promiseOrValue","initialPromise","retry","retryDelay","shouldRetry","Removable","#gcTimeout","newGcTime","Query","#initialState","#revertState","#cache","#client","#retryer","#defaultOptions","#abortSignalConsumed","getDefaultState","defaultState","successState","newData","#dispatch","state","setStateOptions","promise","observer","x","abortController","addSignalProperty","fetchFn","queryFn","queryFnContext","queryFnContext2","context","context2","action","reducer","fetchState","newState","dataUpdatedAt","hasData","initialDataUpdatedAt","QueryObserver","client","#selectError","#currentThenable","#currentQuery","#currentQueryInitialState","#currentResult","#currentResultState","#currentResultOptions","#selectFn","#selectResult","#lastQueryWithDefinedData","#staleTimeoutId","#refetchIntervalId","#currentRefetchInterval","#trackedProps","shouldFetchOnMount","#executeFetch","#updateTimers","shouldFetchOn","#clearStaleTimeout","#clearRefetchInterval","prevOptions","prevQuery","#updateQuery","mounted","shouldFetchOptionally","#updateStaleTimeout","nextRefetchInterval","#computeRefetchInterval","#updateRefetchInterval","shouldAssignObserverCurrentProperties","onPropTracked","target","defaultedOptions","nextInterval","prevResult","prevResultState","prevResultOptions","queryInitialState","isPlaceholderData","fetchOnMount","fetchOptionally","errorUpdatedAt","skipSelect","placeholderData","selectError","isFetching","isPending","isError","isLoading","nextResult","isStale","finalizeThenableIfPossible","recreateThenable","pending","prevThenable","shouldNotifyListeners","notifyOnChangeProps","notifyOnChangePropsValue","includedProps","typedKey","#notify","notifyOptions","shouldLoadOnMount","field","optimisticResult","infiniteQueryBehavior","pages","direction","oldPages","oldPageParams","currentPage","cancelled","fetchPage","param","previous","page","maxPages","addTo","pageParamFn","getPreviousPageParam","getNextPageParam","oldData","remainingPages","pageParams","lastIndex","Mutation","#observers","#mutationCache","variables","onContinue","mutationFnContext","restored","isPaused","e","MutationCache","#mutations","#scopes","#mutationId","scope","scopeFor","scopedMutations","index","firstPendingMutation","m","defaultedFilters","event","pausedMutations","difference","array1","array2","excludeSet","replaceAt","QueriesObserver","#result","#queries","#options","#combinedResult","#lastCombine","#lastResult","#observerMatches","queries","#onUpdate","queryHashes","prevObservers","newObserverMatches","#findMatchingObservers","match","newObservers","newResult","hasLengthChange","hasIndexChange","hasStructuralChange","hasResultChange","prev","combine","matches","r","#combineResult","#trackResult","observerResult","accessedProp","prevObserversMap","previousObservers","observers","previousResult","newTracked","QueryCache","queryHash","queryInMap","QueryClient","#queryCache","#queryDefaults","#mutationDefaults","#mountCount","#unsubscribeFocus","#unsubscribeOnline","cachedData","queryCache","defaultedCancelOptions","promises","defaults","queryDefault","QueryClientContext","React","useQueryClient","queryClient","QueryClientProvider","children","jsx","IsRestoringContext","useIsRestoring","createValue","isReset","QueryErrorResetBoundaryContext","useQueryErrorResetBoundary","ensurePreventErrorBoundaryRetry","errorResetBoundary","useClearResetErrorBoundary","getHasError","suspense","ensureSuspenseTimers","clamp","originalStaleTime","willFetch","isRestoring","shouldSuspend","fetchOptimistic","useQueries","defaultedQueries","opts","queryOptions","getCombinedResult","trackResult","shouldSubscribe","onStoreChange","suspensePromises","queryObserver","firstSingleResultWhichShouldThrow","useBaseQuery","Observer","isNewCacheEntry","unsubscribe","useQuery","CubeClient","token","queryString","queryParam","url","response","errorMessage","errorText","errorData","ResultSet","loadResponse","createCubeClient","BatchCoordinator","batchExecutor","delayMs","currentQueue","results","CubeApiContext","createContext","CubeApiProvider","initialApiOptions","initialToken","enableBatching","batchDelayMs","baseConfig","useMemo","overrideConfig","setOverrideConfig","useState","useEffect","cubeApi","batchCoordinator","updateApiConfig","useCallback","newApiOptions","newToken","useCubeApi","useContext","CUBE_META_QUERY_KEY","buildLabelMap","meta","labelMap","cube","measure","dimension","segment","useCubeMetaQuery","metaData","refetch","getFieldLabel","fieldName","DEFAULT_ICONS","xMark","plus","pencil","trash","arrowPath","clipboardDocument","documentDuplicate","cog","funnel","share","chevronDown","chevronUp","magnifyingGlass","bars3","playSolid","checkSolid","link","eye","eyeSlash","adjustmentsHorizontal","computerDesktop","tableCells","sun","moon","ellipsisHorizontal","documentText","bookOpen","codeBracket","swatch","chartBarSolid","tagSolid","calendarSolid","rectangleGroupSolid","chartBarTabler","chartLine","chartAreaLine","chartPie","chartDots2","chartBubble","chartRadar","radar2","chartTreemap","table","calendarStats","number","trendingUp","typography","fileText","bars3BottomLeftSolid","fingerPrintSolid","chartBarSquareSolid","plusCircleSolid","scaleSolid","arrowDownCircleSolid","arrowUpCircleSolid","arrowTrendingUpSolid","beakerSolid","hashtagSolid","checkCircle","exclamationTriangle","exclamationCircle","infoCircle","sparkles","chevronLeft","chevronRight","selector","arrowRight","_registry","_iconComponentCache","getIconRegistry","getIcon","name","cached","iconDef","className","props","Icon","IconComponent","getIconData","setIcon","icon","registerIcons","overrides","iconKey","partial","resetIcons","getIconsByCategory","category","getMeasureTypeIcon","measureType","iconName","getChartTypeIcon","chartType","getFieldTypeIcon","fieldType","sizeClasses","LoadingIndicator","size","CubeMetaContext","CubeMetaProvider","metaLoading","getFieldLabelFromQuery","metaError","refetchMeta","useCubeMeta","CubeFeaturesContext","DEFAULT_FEATURES","CubeFeaturesProvider","initialFeatures","dashboardModes","features","setFeatures","updateFeatures","newFeatures","useCubeFeatures","DEFAULT_API_OPTIONS","createCubeQueryClient","CubeProvider","_initialCubeApi","apiOptions","providedQueryClient","internalQueryClient","useCubeContext","api","featuresCtx","SectionHeading","barChartConfig","lineChartConfig","areaChartConfig","pieChartConfig","scatterChartConfig","bubbleChartConfig","radarChartConfig","radialBarChartConfig","treemapChartConfig","dataTableConfig","activityGridChartConfig","dateField","valueField","kpiNumberConfig","kpiDeltaConfig","kpiTextConfig","markdownConfig","funnelChartConfig","isValidNumericValue","parseNumericValue","num","formatNumericValue","formatAxisValue","locale","effectiveLocale","unit","abbreviate","decimals","customPrefix","customSuffix","displayValue","abbreviationSuffix","absNum","effectiveDecimals","currencyCode","getCurrencyCodeForLocale","formatted","parts","percentValue","prefix","suffix","region","formatTimeValue","granularity","str","isoStr","date","year","month","day","hours","minutes","quarter","seconds","milliseconds","getFieldGranularity","queryObject","timeDim","td","granularityMatch","transformChartData","xAxisField","yAxisFields","getFieldLabelFn","row","transformed","displayName","transformChartDataWithSeries","seriesFields","originalQuery","queryDimensions","queryMeasures","yAxisMeasures","yAxisDimensions","groupedData","xValue","measureValue","currentValue","dimValue","seriesName","measureToAggregate","chartData","dimensionSeries","seriesKeys","getLocaleCurrencySymbol","AxisFormatControls","onChange","axisLabel","previewValue","currencySymbol","preview","handleChange","updates","unitButtons","jsxs","btn","current","useCubeFieldLabel","getThemeVariable","variableName","setThemeVariable","applyTheme","theme","cssVarName","letter","resetTheme","styleElement","prop","getTheme","stored","dataTheme","setTheme","isDarkMode","watchThemeChanges","mediaQuery","mediaListener","THEME_PRESETS","themeStore","useTheme","useSyncExternalStore","newTheme","setThemeUtil","CHART_COLORS","CHART_COLORS_GRADIENT","POSITIVE_COLOR","NEGATIVE_COLOR","CHART_MARGINS","getPeriodEndDate","endDate","daysUntilSaturday","currentMonth","quarterEndMonth","isLastPeriodComplete","lastDataPoint","timeDimensionField","timeValue","getQueryGranularity","dimensionField","matchingDim","filterIncompletePeriod","useLastCompletePeriod","skipLastPeriod","noFilter","lastRow","getOrderedColumnsFromQuery","columns","hasTimeDimensionForPivot","xAxisOverride","dimensions","measures","measuresInXAxis","extractAndSortTimeValues","timeDimension","timeSet","rawTime","formattedTime","buildColumns","timeValues","dim","timeVal","groupByDimensions","grouped","dimKey","buildPivotedRows","dimensionKeys","rows","measureCount","dimensionCount","dimensionKey","dimIndex","timeData","rowId","values","dimValues","idx","dataPoint","isFirstInGroup","measureRowSpan","pivotTableData","_meta","getMeasureType","measureField","isComparisonData","getPeriodLabels","labels","getPeriodIndices","indices","generatePeriodShortLabel","_periodLabel","detectDimensionFields","timeDimensionKey","metadataFields","firstRow","getUniqueDimensionValues","dimensionFields","transformForOverlayMode","periodLabels","periodIndices","hasDimensions","uniqueDimensionValues","groupedByDayIndex","dayIndex","periodIndex","groupedRow","dimensionPrefix","shortLabel","transformedData","dimensionCombinations","generateDimensionCombinations","dimCombo","uniqueValues","fieldValues","generateCombos","isPriorPeriodSeries","seriesKey","getPriorPeriodStrokeDashArray","style","ChartContainer","height","containerRef","useRef","isReady","setIsReady","containerSize","setContainerSize","useLayoutEffect","resizeObserver","measureAndSetReady","rect","width","entries","entry","ResponsiveContainer","containerStyle","defaultFormatter","ChartTooltip","formatter","labelFormatter","Tooltip","parseTargetValues","targetString","trimmed","spreadTargetValues","targets","dataLength","baseGroupSize","remainder","currentIndex","groupSize","j","calculateVariance","actual","formatVariance","variance","BarChart","chartConfig","displayConfig","colorPalette","hoveredLegend","setHoveredLegend","stackType","shouldStack","isPercentStack","safeDisplayConfig","leftYAxisFormat","rightYAxisFormat","configError","yAxisAssignment","seriesKeyToField","mapping","label","hasRightAxis","leftAxisFields","f","rightAxisFields","skippedCount","filtered","skipped","effectiveShouldStack","effectiveIsPercentStack","stackOffset","usePositiveNegativeColoring","showLegend","chartMargins","targetValues","spreadTargets","enhancedChartData","ComposedChart","CartesianGrid","XAxis","YAxis","originalField","formatConfig","Legend","axisId","Bar","entryIndex","fillColor","Cell","Fragment","Line","LineChart","hasComparisonData","priorPeriodStyle","priorPeriodOpacity","effectiveXAxisKey","overlayResult","standardResult","findFieldFromSeriesKey","measureLabel","RechartsLineChart","payload","isPriorPeriod","strokeDashArray","opacity","AreaChart","Area","PieChart","pieData","originalLength","RechartsPieChart","Pie","percent","_entry","ScatterChart","xAxisFormat","yAxisFormat","yAxisField","seriesConfig","timeDimensionFields","scatterData","seriesGroups","seriesField","seriesValue","xGranularity","yValue","xNum","point","hasSeries","RechartsScatterChart","active","Scatter","RadarChart","radarData","transformedSeriesKeys","keys","subjectField","valueFields","transformedItem","RechartsRadarChart","PolarGrid","PolarAngleAxis","PolarRadiusAxis","Radar","RadialBarChart","radialData","nameField","RechartsRadialBarChart","RadialBar","ascending","descending","bisector","compare1","compare2","delta","d","zero","left","lo","hi","mid","right","center","ascendingBisect","bisectRight","extent","valueof","min","InternMap","keyof","intern_get","intern_set","intern_delete","_intern","_key","e10","e5","e2","tickSpec","start","stop","count","step","power","factor","i1","i2","inc","ticks","reverse","n","tickIncrement","tickStep","identity$2","top","bottom","epsilon","translateX","translateY","y","scale","offset","entering","axis","orient","tickArguments","tickValues","tickFormat","tickSizeInner","tickSizeOuter","tickPadding","k","transform","format","identity","spacing","range","range0","range1","position","selection","path","tick","tickExit","tickEnter","line","text","p","axisBottom","axisLeft","xhtml","namespaces","namespace","creatorInherit","document","uri","creatorFixed","fullname","creator","none","selection_select","select","groups","subgroups","group","subgroup","node","subnode","Selection","empty","selectorAll","arrayAll","selection_selectAll","parents","matcher","childMatcher","find","childFind","childFirst","selection_selectChild","filter","childrenFilter","selection_selectChildren","selection_filter","sparse","update","selection_enter","EnterNode","parent","datum","child","next","constant$1","bindIndex","enter","exit","groupLength","bindKey","nodeByKeyValue","keyValues","keyValue","selection_data","bind","constant","arraylike","enterGroup","updateGroup","exitGroup","i0","selection_exit","selection_join","onenter","onupdate","onexit","selection_merge","groups0","groups1","m0","m1","merges","group0","group1","merge","selection_order","selection_sort","compare","compareNode","sortgroups","sortgroup","selection_call","selection_nodes","selection_node","selection_size","selection_empty","selection_each","attrRemove","attrRemoveNS","attrConstant","attrConstantNS","attrFunction","attrFunctionNS","selection_attr","defaultView","styleRemove","styleConstant","priority","styleFunction","selection_style","styleValue","propertyRemove","propertyConstant","propertyFunction","selection_property","classArray","string","classList","ClassList","classedAdd","names","list","classedRemove","classedTrue","classedFalse","classedFunction","selection_classed","textRemove","textConstant","textFunction","selection_text","htmlRemove","htmlConstant","htmlFunction","selection_html","raise","selection_raise","lower","selection_lower","selection_append","create","constantNull","selection_insert","before","remove","selection_remove","selection_cloneShallow","clone","selection_cloneDeep","selection_clone","deep","selection_datum","contextListener","parseTypenames","typenames","onRemove","typename","on","onAdd","selection_on","t","dispatchEvent","window","dispatchConstant","dispatchFunction","selection_dispatch","selection_iterator","root","selection_selection","define","constructor","factory","prototype","extend","definition","Color","darker","brighter","reI","reN","reP","reHex","reRgbInteger","reRgbPercent","reRgbaInteger","reRgbaPercent","reHslPercent","reHslaPercent","named","color","channels","color_formatHex","color_formatHex8","color_formatHsl","color_formatRgb","hslConvert","l","rgbn","Rgb","rgba","hsla","g","rgbConvert","rgb","clampi","clampa","rgb_formatHex","rgb_formatHex8","rgb_formatRgb","hex","h","s","Hsl","hsl","m2","hsl2rgb","clamph","clampt","linear","exponential","gamma","nogamma","interpolateRgb","rgbGamma","end","colorRgb","numberArray","c","isNumberArray","genericArray","nb","na","interpolateNumber","reA","reB","one","interpolateString","bi","am","bm","bs","q","interpolate","interpolateRound","formatDecimal","formatDecimalParts","coefficient","exponent","formatGroup","grouping","thousands","length","formatNumerals","numerals","re","formatSpecifier","specifier","FormatSpecifier","formatTrim","out","prefixExponent","formatPrefixAuto","formatRounded","formatTypes","identity$1","map","prefixes","formatLocale","currencyPrefix","currencySuffix","decimal","minus","nan","newFormat","fill","align","sign","symbol","comma","precision","trim","formatType","maybeSuffix","valuePrefix","valueSuffix","valueNegative","padding","formatPrefix","defaultLocale","precisionFixed","precisionPrefix","precisionRound","initRange","domain","implicit","ordinal","unknown","constants","normalize","clamper","bimap","d0","d1","r0","r1","polymap","bisect","source","transformer","interpolateValue","untransform","piecewise","output","rescale","u","continuous","linearish","prestep","maxIter","transformPow","transformSqrt","transformSquare","powish","pow","sqrt","quantize","x0","x1","TreeMapChart","hoveredIndex","setHoveredIndex","treemapData","isNumericSeries","seriesValues","minValue","maxValue","colorScale","scaleQuantize","uniqueSeriesValues","scaleOrdinal","sizeField","CustomizedContent","uniqueSeries","legendPayload","ratio","series","hasLegend","adjustedHeight","Treemap","BubbleChart","svgRef","setDimensions","dimensionsReady","setDimensionsReady","retryCount","maxRetries","rafId","updateDimensions","retryWithRaf","sizeFieldName","colorFieldName","isTimeDimension","bubbleData","rawXValue","xLabel","dateStr","formattedValue","sizeValue","margin","chartHeight","svg","xScale","scaleLinear","yScale","sizeScale","scaleSqrt","isNumericColorField","uniqueColors","colorValues","getThemeColor","varName","fallback","isDark","textColor","gridColor","xGrid","yGrid","xAxisGenerator","xAxis","yAxisGenerator","yAxis","tooltip","bubbles","tooltipContent","_event","legend","gradient","gradientColors","legendItems","legendItem","_d","legendKey","DataTable","pivotConfig","enablePivot","pivotedData","PivotedTable","FlatTable","col","PivotedTableRow","MeasureIcon","formatPivotCellValue","allColumns","queryOrder","ordered","remaining","column","formatCellValue","ActivityGridChart","currentTheme","setCurrentTheme","getQuarter","getMonthOfQuarter","getWeekOfMonth","dayOfMonth","getGridMapping","week","getWeekOfYear","dayNum","yearStart","queryGranularity","firstTimeDim","gridMapping","gridData","dateValue","cell","maxY","minY","completeXRange","dataXValues","gridWidth","gridHeight","availableWidth","availableHeight","finalCellWidth","finalCellHeight","scaleX","scaleY","minCellSize","maxCellSize","actualGridWidth","svgWidth","gridMap","lineColor","emptyCellColor","cellStrokeColor","xValueToIndex","xIndex","yearGroups","xValues","startIndex","endIndex","centerIndex","labelText","actualYear","xLabelStep","DataHistogram","bucketCount","formatValue","showAverageIndicator","targetValue","buckets","bucketIndex","maxBucketCount","average","sum","averagePosition","targetPosition","normalizedHeight","minHeight","displayHeight","KpiNumber","fontSize","setFontSize","textWidth","setTextWidth","valueRef","sortedData","sorted","aVal","bVal","filteredData","excludedIncompletePeriod","skippedLastPeriod","dataToUse","numericFields","avg","acc","formatNumber","mainValue","showStats","valueColor","colorIndex","varianceColor","positiveIndex","negativeIndex","containerWidth","containerHeight","widthBasedSize","heightBasedSize","baseFontSize","clampedFontSize","measuredWidth","effectiveWidth","timer","infoCircleIcon","VarianceHistogram","lastValue","positiveColor","negativeColor","maxBars","limitedValues","variances","minVariance","maxVariance","barGap","barWidth","totalRange","zeroLinePercent","barHeight","isPositive","isLastValue","xPosition","KpiDelta","maxHistogramWidth","secondLastValue","absoluteChange","percentageChange","isPositiveChange","getPositiveColor","getNegativeColor","currentColor","KpiText","textRef","textRect","availableFields","numericValues","processTemplate","template","templateVars","displayText","MarkdownChart","content","accentColorIndex","alignment","accentColor","fontSizeClasses","alignmentClasses","parseMarkdown","lines","nodes","currentList","headerMatch","unorderedMatch","parseInline","orderedMatch","linkMatch","linkText","after","parseSimpleInline","boldMatch","boldText","italicMatch","italicText","renderNode","listNumber","getHeaderClasses","level","baseClasses","marginClasses","HeaderTag","ListTag","listClasses","numberSizeClass","parsedNodes","FUNNEL_COLORS","getStepColor","colors","isFunnelData","first","FunnelChart","customStepLabels","isVertical","funnelData","record","percentField","percentage","convRateField","conversionRate","firstStepValue","paletteColors","heightPercent","prevStep","stepConversionRate","widthPercent"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165]}
|