@linzjs/step-ag-grid
Version:
[](https://github.com/semantic-release/semantic-release) > Reusable [ag-grid](https://www.ag-grid.com/) component for LINZ / Toitū te whenua.
1 lines • 4.95 MB
Source Map (JSON)
{"version":3,"file":"step-ag-grid.cjs","sources":["../src/components/ComponentLoadingWrapper.tsx","../node_modules/ag-grid-community/dist/package/main.esm.mjs","../node_modules/ag-grid-react/dist/package/index.esm.mjs","../node_modules/clsx/dist/clsx.mjs","../src/contexts/GridContext.tsx","../src/contexts/GridUpdatingContext.tsx","../src/utils/storybook.ts","../node_modules/lodash.debounce/index.js","../node_modules/usehooks-ts/dist/index.js","../src/utils/useInterval.ts","../node_modules/natsort/lib/index.js","../src/utils/util.ts","../src/components/clickInputWhenContainingCellClicked.tsx","../src/components/gridHeader/GridHeaderSelect.tsx","../node_modules/style-inject/dist/style-inject.es.js","../src/react-menu3/contexts/EventHandlersContext.ts","../src/react-menu3/contexts/ItemSettingsContext.ts","../src/react-menu3/contexts/SettingsContext.ts","../src/react-menu3/hooks/useBEM.ts","../src/react-menu3/hooks/useCombinedRef.ts","../src/react-menu3/hooks/useIsomorphicLayoutEffect.ts","../src/react-menu3/hooks/useItemEffect.ts","../src/react-menu3/utils/constants.ts","../src/react-menu3/utils/utils.ts","../src/react-menu3/contexts/HoverItemContext.ts","../src/react-menu3/utils/withHovering.tsx","../src/react-menu3/hooks/useItems.ts","../src/react-menu3/contexts/MenuListItemContext.ts","../src/react-menu3/hooks/useItemState.ts","../src/react-menu3/hooks/useMenuChange.ts","../node_modules/react-transition-state/dist/esm/internal.mjs","../node_modules/react-transition-state/dist/esm/useTransitionState.mjs","../src/react-menu3/hooks/useMenuState.ts","../src/react-menu3/hooks/useMenuStateAndFocus.ts","../src/react-menu3/contexts/MenuListContext.ts","../src/react-menu3/positionUtils/getPositionHelpers.ts","../src/react-menu3/positionUtils/positionContextMenu.ts","../src/react-menu3/positionUtils/placeArrowVertical.ts","../src/react-menu3/positionUtils/placeLeftorRight.ts","../src/react-menu3/positionUtils/placeArrowHorizontal.ts","../src/react-menu3/positionUtils/placeToporBottom.ts","../src/react-menu3/positionUtils/positionMenu.ts","../src/react-menu3/components/MenuList.tsx","../src/react-menu3/components/ControlledMenu.tsx","../src/react-menu3/components/FocusableItem.tsx","../src/react-menu3/components/Menu.tsx","../src/react-menu3/components/MenuButton.tsx","../src/react-menu3/components/MenuDivider.tsx","../src/react-menu3/components/MenuGroup.tsx","../src/react-menu3/components/MenuHeader.tsx","../src/react-menu3/contexts/RadioGroupContext.ts","../src/react-menu3/components/MenuItem.tsx","../src/react-menu3/components/MenuRadioGroup.tsx","../src/react-menu3/components/SubMenu.tsx","../src/components/gridHook/useGridContextMenu.tsx","../src/lui/tsUtils.ts","../src/components/gridHook/useGridCopySettings.ts","../src/components/GridRangeSelectContextMenu.tsx","../src/components/types.ts","../src/components/gridHook/useGridCopy.ts","../src/components/gridHook/useGridRangeSelection.ts","../src/components/GridNoRowsOverlay.tsx","../src/components/PostSortRowsHook.ts","../src/components/Grid.tsx","../src/contexts/GridPopoverContext.tsx","../src/contexts/GridPopoverContextProvider.tsx","../src/components/GridCellMultiSelectClassRules.tsx","../src/components/GridIcon.tsx","../src/components/GridLoadableCell.tsx","../src/components/GridCell.tsx","../src/components/GridCellFiller.tsx","../src/components/GridCellMultiEditor.tsx","../src/components/gridDragUtil.ts","../src/components/gridFilter/useGridFilter.ts","../src/components/gridFilter/GridFilterButtons.tsx","../src/components/gridFilter/GridFilterColumnsMultiSelect.tsx","../src/components/gridFilter/GridFilterHeaderIconButton.tsx","../src/components/gridFilter/GridFilterColumnsToggle.tsx","../src/lui/timeoutHook.tsx","../src/lui/stateDeferredHook.tsx","../src/components/gridFilter/GridFilterDownloadCsvButton.tsx","../src/components/gridFilter/GridFilterQuick.tsx","../src/components/gridFilter/GridFilters.tsx","../node_modules/debounce-promise/dist/index.js","../src/contexts/GridSubComponentContext.ts","../src/lui/FormError.tsx","../src/lui/reactUtils.tsx","../node_modules/matcher/node_modules/escape-string-regexp/index.js","../node_modules/matcher/index.js","../src/utils/textMatcher.ts","../src/components/GridPopoverHook.tsx","../src/components/gridForm/GridFormDropDown.tsx","../src/lui/TextInputFormatted.tsx","../src/utils/bearing.ts","../src/components/gridForm/GridFormEditBearing.tsx","../src/utils/textValidator.ts","../src/components/gridForm/GridFormInlineTextInput.tsx","../src/components/gridForm/GridFormMessage.tsx","../src/components/gridForm/GridFormMultiSelect.tsx","../src/components/gridForm/GridFormMultiSelectGrid.tsx","../src/components/gridForm/GridFormPopoverMenu.tsx","../src/lui/TextAreaInput.tsx","../src/components/gridForm/GridFormSubComponentTextArea.tsx","../src/components/gridForm/GridFormSubComponentTextInput.tsx","../src/components/gridForm/GridFormTextArea.tsx","../src/components/gridForm/GridFormTextInput.tsx","../src/components/gridPopoverEdit/GridButton.tsx","../src/utils/useSharedInterval.ts","../src/components/gridPopoverEdit/GridEditBoolean.tsx","../src/components/gridPopoverEdit/GridInlineTextInput.ts","../src/components/gridPopoverEdit/GridPopoutEditMultiSelect.ts","../src/components/gridPopoverEdit/GridPopoutEditMultiSelectGrid.ts","../src/components/gridPopoverEdit/GridPopoverEditBearing.ts","../src/components/gridPopoverEdit/GridPopoverEditDropDown.tsx","../src/components/gridRender/GridRenderPopoutMenuCell.tsx","../src/components/gridPopoverEdit/GridPopoverMenu.tsx","../src/components/gridPopoverEdit/GridPopoverMessage.ts","../src/components/gridPopoverEdit/GridPopoverTextArea.ts","../src/components/gridPopoverEdit/GridPopoverTextInput.ts","../src/components/GridWrapper.tsx","../src/components/gridUtil.ts","../src/utils/waitForCondition.tsx","../src/contexts/GridContextProvider.tsx","../src/contexts/GridUpdatingContextProvider.tsx","../src/lui/ActionButton.tsx","../src/utils/deferredPromise.ts"],"sourcesContent":["import { LuiMiniSpinner } from '@linzjs/lui';\nimport { PropsWithChildren, ReactElement } from 'react';\n\n/**\n * If loading is true this returns a loading spinner, otherwise it returns its children.\n */\nexport const ComponentLoadingWrapper = (\n props: PropsWithChildren<{\n loading?: boolean;\n saving?: boolean;\n className: string | undefined;\n }>,\n): ReactElement => {\n return props.loading ? (\n <LuiMiniSpinner size={22} divProps={{ role: 'status', ['aria-label']: 'Loading', style: { padding: 16 } }} />\n ) : (\n <div style={{ pointerEvents: props.saving ? 'none' : 'inherit' }} className={props.className}>\n {props.saving && <div className={'ComponentLoadingWrapper-saveOverlay'} />}\n {props.children}\n </div>\n );\n};\n","// packages/ag-grid-community/src/agStack/events/localEventService.ts\nvar LocalEventService = class {\n constructor() {\n this.allSyncListeners = /* @__PURE__ */ new Map();\n this.allAsyncListeners = /* @__PURE__ */ new Map();\n this.globalSyncListeners = /* @__PURE__ */ new Set();\n this.globalAsyncListeners = /* @__PURE__ */ new Set();\n this.asyncFunctionsQueue = [];\n this.scheduled = false;\n // using an object performs better than a Set for the number of different events we have\n this.firedEvents = {};\n }\n setFrameworkOverrides(frameworkOverrides) {\n this.frameworkOverrides = frameworkOverrides;\n }\n getListeners(eventType, async, autoCreateListenerCollection) {\n const listenerMap = async ? this.allAsyncListeners : this.allSyncListeners;\n let listeners = listenerMap.get(eventType);\n if (!listeners && autoCreateListenerCollection) {\n listeners = /* @__PURE__ */ new Set();\n listenerMap.set(eventType, listeners);\n }\n return listeners;\n }\n noRegisteredListenersExist() {\n return this.allSyncListeners.size === 0 && this.allAsyncListeners.size === 0 && this.globalSyncListeners.size === 0 && this.globalAsyncListeners.size === 0;\n }\n addEventListener(eventType, listener, async = false) {\n this.getListeners(eventType, async, true).add(listener);\n }\n removeEventListener(eventType, listener, async = false) {\n const listeners = this.getListeners(eventType, async, false);\n if (!listeners) {\n return;\n }\n listeners.delete(listener);\n if (listeners.size === 0) {\n (async ? this.allAsyncListeners : this.allSyncListeners).delete(eventType);\n }\n }\n addGlobalListener(listener, async = false) {\n this.getGlobalListeners(async).add(listener);\n }\n removeGlobalListener(listener, async = false) {\n this.getGlobalListeners(async).delete(listener);\n }\n dispatchEvent(event) {\n this.dispatchToListeners(event, true);\n this.dispatchToListeners(event, false);\n this.firedEvents[event.type] = true;\n }\n dispatchEventOnce(event) {\n if (!this.firedEvents[event.type]) {\n this.dispatchEvent(event);\n }\n }\n dispatchToListeners(event, async) {\n const eventType = event.type;\n if (async && \"event\" in event) {\n const browserEvent = event.event;\n if (browserEvent instanceof Event) {\n event.eventPath = browserEvent.composedPath();\n }\n }\n const { frameworkOverrides } = this;\n const runCallback = (func) => {\n const callback = frameworkOverrides ? () => frameworkOverrides.wrapIncoming(func) : func;\n if (async) {\n this.dispatchAsync(callback);\n } else {\n callback();\n }\n };\n const originalListeners = this.getListeners(eventType, async, false);\n if ((originalListeners?.size ?? 0) > 0) {\n const listeners = new Set(originalListeners);\n for (const listener of listeners) {\n if (!originalListeners?.has(listener)) {\n continue;\n }\n runCallback(() => listener(event));\n }\n }\n const globalListenersSrc = this.getGlobalListeners(async);\n if (globalListenersSrc.size > 0) {\n const globalListeners = new Set(globalListenersSrc);\n for (const listener of globalListeners) {\n runCallback(() => listener(eventType, event));\n }\n }\n }\n getGlobalListeners(async) {\n return async ? this.globalAsyncListeners : this.globalSyncListeners;\n }\n // this gets called inside the grid's thread, for each event that it\n // wants to set async. the grid then batches the events into one setTimeout()\n // because setTimeout() is an expensive operation. ideally we would have\n // each event in it's own setTimeout(), but we batch for performance.\n dispatchAsync(func) {\n this.asyncFunctionsQueue.push(func);\n if (!this.scheduled) {\n const flush = () => {\n window.setTimeout(this.flushAsyncQueue.bind(this), 0);\n };\n this.frameworkOverrides ? this.frameworkOverrides.wrapIncoming(flush) : flush();\n this.scheduled = true;\n }\n }\n // this happens in the next VM turn only, and empties the queue of events\n flushAsyncQueue() {\n this.scheduled = false;\n const queueCopy = this.asyncFunctionsQueue.slice();\n this.asyncFunctionsQueue = [];\n for (const func of queueCopy) {\n func();\n }\n }\n};\n\n// packages/ag-grid-community/src/agStack/utils/generic.ts\nfunction _makeNull(value) {\n if (value == null || value === \"\") {\n return null;\n }\n return value;\n}\nfunction _exists(value) {\n return value != null && value !== \"\";\n}\nfunction _missing(value) {\n return !_exists(value);\n}\nfunction _toStringOrNull(value) {\n return value != null && typeof value.toString === \"function\" ? value.toString() : null;\n}\nfunction _jsonEquals(val1, val2) {\n const val1Json = val1 ? JSON.stringify(val1) : null;\n const val2Json = val2 ? JSON.stringify(val2) : null;\n return val1Json === val2Json;\n}\nfunction _defaultComparator(valueA, valueB, accentedCompare = false) {\n const valueAMissing = valueA == null;\n const valueBMissing = valueB == null;\n if (valueA?.toNumber) {\n valueA = valueA.toNumber();\n }\n if (valueB?.toNumber) {\n valueB = valueB.toNumber();\n }\n if (valueAMissing && valueBMissing) {\n return 0;\n }\n if (valueAMissing) {\n return -1;\n }\n if (valueBMissing) {\n return 1;\n }\n function doQuickCompare(a, b) {\n return a > b ? 1 : a < b ? -1 : 0;\n }\n if (typeof valueA !== \"string\") {\n return doQuickCompare(valueA, valueB);\n }\n if (!accentedCompare) {\n return doQuickCompare(valueA, valueB);\n }\n try {\n return valueA.localeCompare(valueB);\n } catch (e) {\n return doQuickCompare(valueA, valueB);\n }\n}\n\n// packages/ag-grid-community/src/agStack/utils/string.ts\nvar reUnescapedHtml = /[&<>\"']/g;\nvar HTML_ESCAPES = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\"\n};\nfunction _toString(toEscape) {\n return toEscape?.toString().toString() ?? null;\n}\nfunction _escapeString(toEscape) {\n return _toString(toEscape)?.replace(reUnescapedHtml, (chr) => HTML_ESCAPES[chr]) ?? null;\n}\n\n// packages/ag-grid-community/src/agStack/utils/document.ts\nfunction _getRootNode(beans) {\n return beans.eRootDiv.getRootNode();\n}\nfunction _getActiveDomElement(beans) {\n return _getRootNode(beans).activeElement;\n}\nfunction _getDocument(beans) {\n const { gos, eRootDiv } = beans;\n let result = null;\n const optionsGetDocument = gos.get(\"getDocument\");\n if (optionsGetDocument && _exists(optionsGetDocument)) {\n result = optionsGetDocument();\n } else if (eRootDiv) {\n result = eRootDiv.ownerDocument;\n }\n if (result && _exists(result)) {\n return result;\n }\n return document;\n}\nfunction _isNothingFocused(beans) {\n const activeEl = _getActiveDomElement(beans);\n return activeEl === null || activeEl === _getDocument(beans).body;\n}\nfunction _getWindow(beans) {\n const eDocument = _getDocument(beans);\n return eDocument.defaultView || window;\n}\nfunction _getPageBody(beans) {\n let rootNode = null;\n let targetEl = null;\n try {\n rootNode = _getDocument(beans).fullscreenElement;\n } catch (e) {\n } finally {\n if (!rootNode) {\n rootNode = _getRootNode(beans);\n }\n const body = rootNode.querySelector(\"body\");\n if (body) {\n targetEl = body;\n } else if (rootNode instanceof ShadowRoot) {\n targetEl = rootNode;\n } else if (rootNode instanceof Document) {\n targetEl = rootNode?.documentElement;\n } else {\n targetEl = rootNode;\n }\n }\n return targetEl;\n}\nfunction _getBodyWidth(beans) {\n const body = _getPageBody(beans);\n return body?.clientWidth ?? (window.innerWidth || -1);\n}\nfunction _getBodyHeight(beans) {\n const body = _getPageBody(beans);\n return body?.clientHeight ?? (window.innerHeight || -1);\n}\n\n// packages/ag-grid-community/src/agStack/utils/aria.ts\nfunction _toggleAriaAttribute(element, attribute, value) {\n if (value == null || typeof value === \"string\" && value == \"\") {\n _removeAriaAttribute(element, attribute);\n } else {\n _setAriaAttribute(element, attribute, value);\n }\n}\nfunction _setAriaAttribute(element, attribute, value) {\n element.setAttribute(_ariaAttributeName(attribute), value.toString());\n}\nfunction _removeAriaAttribute(element, attribute) {\n element.removeAttribute(_ariaAttributeName(attribute));\n}\nfunction _ariaAttributeName(attribute) {\n return `aria-${attribute}`;\n}\nfunction _setAriaRole(element, role) {\n if (role) {\n element.setAttribute(\"role\", role);\n } else {\n element.removeAttribute(\"role\");\n }\n}\nfunction _getAriaSortState(sortDirection) {\n let sort;\n if (sortDirection === \"asc\") {\n sort = \"ascending\";\n } else if (sortDirection === \"desc\") {\n sort = \"descending\";\n } else if (sortDirection === \"mixed\") {\n sort = \"other\";\n } else {\n sort = \"none\";\n }\n return sort;\n}\nfunction _getAriaPosInSet(element) {\n return Number.parseInt(element.getAttribute(\"aria-posinset\"), 10);\n}\nfunction _getAriaLabel(element) {\n return element.getAttribute(\"aria-label\");\n}\nfunction _setAriaLabel(element, label) {\n _toggleAriaAttribute(element, \"label\", label);\n}\nfunction _setAriaLabelledBy(element, labelledBy) {\n _toggleAriaAttribute(element, \"labelledby\", labelledBy);\n}\nfunction _setAriaDescribedBy(element, describedby) {\n _toggleAriaAttribute(element, \"describedby\", describedby);\n}\nfunction _setAriaLive(element, live) {\n _toggleAriaAttribute(element, \"live\", live);\n}\nfunction _setAriaAtomic(element, atomic) {\n _toggleAriaAttribute(element, \"atomic\", atomic);\n}\nfunction _setAriaRelevant(element, relevant) {\n _toggleAriaAttribute(element, \"relevant\", relevant);\n}\nfunction _setAriaInvalid(element, invalid) {\n _toggleAriaAttribute(element, \"invalid\", invalid);\n}\nfunction _setAriaLevel(element, level) {\n _toggleAriaAttribute(element, \"level\", level);\n}\nfunction _setAriaDisabled(element, disabled) {\n _toggleAriaAttribute(element, \"disabled\", disabled);\n}\nfunction _setAriaHidden(element, hidden) {\n _toggleAriaAttribute(element, \"hidden\", hidden);\n}\nfunction _setAriaActiveDescendant(element, descendantId) {\n _toggleAriaAttribute(element, \"activedescendant\", descendantId);\n}\nfunction _setAriaExpanded(element, expanded) {\n _setAriaAttribute(element, \"expanded\", expanded);\n}\nfunction _removeAriaExpanded(element) {\n _removeAriaAttribute(element, \"expanded\");\n}\nfunction _setAriaSetSize(element, setsize) {\n _setAriaAttribute(element, \"setsize\", setsize);\n}\nfunction _setAriaPosInSet(element, position) {\n _setAriaAttribute(element, \"posinset\", position);\n}\nfunction _setAriaMultiSelectable(element, multiSelectable) {\n _setAriaAttribute(element, \"multiselectable\", multiSelectable);\n}\nfunction _setAriaRowCount(element, rowCount) {\n _setAriaAttribute(element, \"rowcount\", rowCount);\n}\nfunction _setAriaRowIndex(element, rowIndex) {\n _setAriaAttribute(element, \"rowindex\", rowIndex);\n}\nfunction _setAriaRowSpan(element, spanCount) {\n _setAriaAttribute(element, \"rowspan\", spanCount);\n}\nfunction _setAriaColCount(element, colCount) {\n _setAriaAttribute(element, \"colcount\", colCount);\n}\nfunction _setAriaColIndex(element, colIndex) {\n _setAriaAttribute(element, \"colindex\", colIndex);\n}\nfunction _setAriaColSpan(element, colSpan) {\n _setAriaAttribute(element, \"colspan\", colSpan);\n}\nfunction _setAriaSort(element, sort) {\n _setAriaAttribute(element, \"sort\", sort);\n}\nfunction _removeAriaSort(element) {\n _removeAriaAttribute(element, \"sort\");\n}\nfunction _setAriaSelected(element, selected) {\n _toggleAriaAttribute(element, \"selected\", selected);\n}\nfunction _setAriaChecked(element, checked) {\n _setAriaAttribute(element, \"checked\", checked === void 0 ? \"mixed\" : checked);\n}\nfunction _setAriaControls(controllerElement, controlledId) {\n _toggleAriaAttribute(controllerElement, \"controls\", controlledId);\n}\nfunction _setAriaControlsAndLabel(controllerElement, controlledElement) {\n _setAriaControls(controllerElement, controlledElement.id);\n _setAriaLabelledBy(controlledElement, controllerElement.id);\n}\nfunction _setAriaOwns(ownerElement, ownedId) {\n _toggleAriaAttribute(ownerElement, \"owns\", ownedId);\n}\nfunction _setAriaHasPopup(element, hasPopup) {\n _toggleAriaAttribute(element, \"haspopup\", hasPopup === false ? null : hasPopup);\n}\nfunction _getAriaCheckboxStateName(translate, state) {\n return state === void 0 ? translate(\"ariaIndeterminate\", \"indeterminate\") : state === true ? translate(\"ariaChecked\", \"checked\") : translate(\"ariaUnchecked\", \"unchecked\");\n}\n\n// packages/ag-grid-community/src/agStack/utils/dom.ts\nfunction _radioCssClass(element, elementClass, otherElementClass) {\n const parent = element.parentElement;\n let sibling = parent && parent.firstChild;\n while (sibling) {\n if (elementClass) {\n sibling.classList.toggle(elementClass, sibling === element);\n }\n if (otherElementClass) {\n sibling.classList.toggle(otherElementClass, sibling !== element);\n }\n sibling = sibling.nextSibling;\n }\n}\nvar FOCUSABLE_SELECTOR = \"[tabindex], input, select, button, textarea, [href]\";\nvar FOCUSABLE_EXCLUDE = \"[disabled], .ag-disabled:not(.ag-button), .ag-disabled *\";\nfunction _isFocusableFormField(element) {\n if (!element) {\n return false;\n }\n const isFocusable = element.matches(\"input, select, button, textarea\");\n if (!isFocusable) {\n return false;\n }\n const isNotFocusable = element.matches(FOCUSABLE_EXCLUDE);\n if (!isNotFocusable) {\n return false;\n }\n return _isVisible(element);\n}\nfunction _setDisplayed(element, displayed, options = {}) {\n const { skipAriaHidden } = options;\n element.classList.toggle(\"ag-hidden\", !displayed);\n if (!skipAriaHidden) {\n _setAriaHidden(element, !displayed);\n }\n}\nfunction _setVisible(element, visible, options = {}) {\n const { skipAriaHidden } = options;\n element.classList.toggle(\"ag-invisible\", !visible);\n if (!skipAriaHidden) {\n _setAriaHidden(element, !visible);\n }\n}\nfunction _setDisabled(element, disabled) {\n const attributeName = \"disabled\";\n const addOrRemoveDisabledAttribute = disabled ? (e) => e.setAttribute(attributeName, \"\") : (e) => e.removeAttribute(attributeName);\n addOrRemoveDisabledAttribute(element);\n const inputs = element.querySelectorAll(\"input\") ?? [];\n for (const input of inputs) {\n addOrRemoveDisabledAttribute(input);\n }\n}\nfunction _isElementChildOfClass(element, cls, maxNest) {\n let counter = 0;\n while (element) {\n if (element.classList.contains(cls)) {\n return true;\n }\n element = element.parentElement;\n if (typeof maxNest == \"number\") {\n if (++counter > maxNest) {\n break;\n }\n } else if (element === maxNest) {\n break;\n }\n }\n return false;\n}\nfunction _getElementSize(el) {\n const {\n height,\n width,\n borderTopWidth,\n borderRightWidth,\n borderBottomWidth,\n borderLeftWidth,\n paddingTop,\n paddingRight,\n paddingBottom,\n paddingLeft,\n marginTop,\n marginRight,\n marginBottom,\n marginLeft,\n boxSizing\n } = window.getComputedStyle(el);\n const pf = Number.parseFloat;\n return {\n height: pf(height || \"0\"),\n width: pf(width || \"0\"),\n borderTopWidth: pf(borderTopWidth || \"0\"),\n borderRightWidth: pf(borderRightWidth || \"0\"),\n borderBottomWidth: pf(borderBottomWidth || \"0\"),\n borderLeftWidth: pf(borderLeftWidth || \"0\"),\n paddingTop: pf(paddingTop || \"0\"),\n paddingRight: pf(paddingRight || \"0\"),\n paddingBottom: pf(paddingBottom || \"0\"),\n paddingLeft: pf(paddingLeft || \"0\"),\n marginTop: pf(marginTop || \"0\"),\n marginRight: pf(marginRight || \"0\"),\n marginBottom: pf(marginBottom || \"0\"),\n marginLeft: pf(marginLeft || \"0\"),\n boxSizing\n };\n}\nfunction _getInnerHeight(el) {\n const size = _getElementSize(el);\n if (size.boxSizing === \"border-box\") {\n return size.height - size.paddingTop - size.paddingBottom - size.borderTopWidth - size.borderBottomWidth;\n }\n return size.height;\n}\nfunction _getInnerWidth(el) {\n const size = _getElementSize(el);\n if (size.boxSizing === \"border-box\") {\n return size.width - size.paddingLeft - size.paddingRight - size.borderLeftWidth - size.borderRightWidth;\n }\n return size.width;\n}\nfunction _getAbsoluteHeight(el) {\n const { height, marginBottom, marginTop } = _getElementSize(el);\n return Math.floor(height + marginBottom + marginTop);\n}\nfunction _getAbsoluteWidth(el) {\n const { width, marginLeft, marginRight } = _getElementSize(el);\n return Math.floor(width + marginLeft + marginRight);\n}\nfunction _getElementRectWithOffset(el) {\n const offsetElementRect = el.getBoundingClientRect();\n const { borderTopWidth, borderLeftWidth, borderRightWidth, borderBottomWidth } = _getElementSize(el);\n return {\n top: offsetElementRect.top + (borderTopWidth || 0),\n left: offsetElementRect.left + (borderLeftWidth || 0),\n right: offsetElementRect.right + (borderRightWidth || 0),\n bottom: offsetElementRect.bottom + (borderBottomWidth || 0)\n };\n}\nfunction _getScrollLeft(element, rtl) {\n let scrollLeft = element.scrollLeft;\n if (rtl) {\n scrollLeft = Math.abs(scrollLeft);\n }\n return scrollLeft;\n}\nfunction _setScrollLeft(element, value, rtl) {\n if (rtl) {\n value *= -1;\n }\n element.scrollLeft = value;\n}\nfunction _clearElement(el) {\n while (el?.firstChild) {\n el.firstChild.remove();\n }\n}\nfunction _removeFromParent(node) {\n if (node?.parentNode) {\n node.remove();\n }\n}\nfunction _isInDOM(element) {\n return !!element.offsetParent;\n}\nfunction _isVisible(element) {\n if (element.checkVisibility) {\n return element.checkVisibility({ checkVisibilityCSS: true });\n }\n const isHidden = !_isInDOM(element) || window.getComputedStyle(element).visibility !== \"visible\";\n return !isHidden;\n}\nfunction _loadTemplate(template) {\n const tempDiv = document.createElement(\"div\");\n tempDiv.innerHTML = (template || \"\").trim();\n return tempDiv.firstChild;\n}\nfunction _ensureDomOrder(eContainer, eChild, eChildBefore) {\n if (eChildBefore && eChildBefore.nextSibling === eChild) {\n return;\n }\n if (!eContainer.firstChild) {\n eContainer.appendChild(eChild);\n } else if (eChildBefore) {\n if (eChildBefore.nextSibling) {\n eContainer.insertBefore(eChild, eChildBefore.nextSibling);\n } else {\n eContainer.appendChild(eChild);\n }\n } else if (eContainer.firstChild && eContainer.firstChild !== eChild) {\n eContainer.insertAdjacentElement(\"afterbegin\", eChild);\n }\n}\nfunction _setDomChildOrder(eContainer, orderedChildren) {\n for (let i = 0; i < orderedChildren.length; i++) {\n const correctCellAtIndex = orderedChildren[i];\n const actualCellAtIndex = eContainer.children[i];\n if (actualCellAtIndex !== correctCellAtIndex) {\n eContainer.insertBefore(correctCellAtIndex, actualCellAtIndex);\n }\n }\n}\nfunction _camelCaseToHyphenated(camelCase) {\n return camelCase.replace(/[A-Z]/g, (s) => `-${s.toLocaleLowerCase()}`);\n}\nfunction _addStylesToElement(eElement, styles) {\n if (!styles) {\n return;\n }\n for (const key of Object.keys(styles)) {\n const value = styles[key];\n if (!key?.length || value == null) {\n continue;\n }\n const parsedKey = _camelCaseToHyphenated(key);\n const valueAsString = value.toString();\n const parsedValue = valueAsString.replace(/\\s*!important/g, \"\");\n const priority = parsedValue.length != valueAsString.length ? \"important\" : void 0;\n eElement.style.setProperty(parsedKey, parsedValue, priority);\n }\n}\nfunction _isElementOverflowingCallback(getElement2) {\n return () => {\n const element = getElement2();\n if (!element) {\n return true;\n }\n return _isHorizontalScrollShowing(element) || _isVerticalScrollShowing(element);\n };\n}\nfunction _isHorizontalScrollShowing(element) {\n return element.clientWidth < element.scrollWidth;\n}\nfunction _isVerticalScrollShowing(element) {\n return element.clientHeight < element.scrollHeight;\n}\nfunction _setElementWidth(element, width) {\n if (width === \"flex\") {\n element.style.removeProperty(\"width\");\n element.style.removeProperty(\"minWidth\");\n element.style.removeProperty(\"maxWidth\");\n element.style.flex = \"1 1 auto\";\n } else {\n _setFixedWidth(element, width);\n }\n}\nfunction _setFixedWidth(element, width) {\n width = _formatSize(width);\n element.style.width = width;\n element.style.maxWidth = width;\n element.style.minWidth = width;\n}\nfunction _setFixedHeight(element, height) {\n height = _formatSize(height);\n element.style.height = height;\n element.style.maxHeight = height;\n element.style.minHeight = height;\n}\nfunction _formatSize(size) {\n return typeof size === \"number\" ? `${size}px` : size;\n}\nfunction _isNodeOrElement(o) {\n return o instanceof Node || o instanceof HTMLElement;\n}\nfunction _addOrRemoveAttribute(element, name, value) {\n if (value == null || value === \"\") {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value.toString());\n }\n}\nfunction _observeResize(beans, element, callback) {\n const win = _getWindow(beans);\n const ResizeObserverImpl = win.ResizeObserver;\n const resizeObserver = ResizeObserverImpl ? new ResizeObserverImpl(callback) : null;\n resizeObserver?.observe(element);\n return () => resizeObserver?.disconnect();\n}\nfunction _requestAnimationFrame(beans, callback) {\n const win = _getWindow(beans);\n if (win.requestAnimationFrame) {\n win.requestAnimationFrame(callback);\n } else if (win.webkitRequestAnimationFrame) {\n win.webkitRequestAnimationFrame(callback);\n } else {\n win.setTimeout(callback, 0);\n }\n}\nvar DataRefAttribute = \"data-ref\";\nvar whitespaceNode;\nfunction getWhitespaceNode() {\n whitespaceNode ?? (whitespaceNode = document.createTextNode(\" \"));\n return whitespaceNode.cloneNode();\n}\nfunction _createAgElement(params) {\n const { attrs, children, cls, ref, role, tag } = params;\n const element = document.createElement(tag);\n if (cls) {\n element.className = cls;\n }\n if (ref) {\n element.setAttribute(DataRefAttribute, ref);\n }\n if (role) {\n element.setAttribute(\"role\", role);\n }\n if (attrs) {\n for (const key of Object.keys(attrs)) {\n element.setAttribute(key, attrs[key]);\n }\n }\n if (children) {\n if (typeof children === \"string\") {\n element.textContent = children;\n } else {\n let addFirstWhitespace = true;\n for (const child of children) {\n if (child) {\n if (typeof child === \"string\") {\n element.appendChild(document.createTextNode(child));\n addFirstWhitespace = false;\n } else if (typeof child === \"function\") {\n element.appendChild(child());\n } else {\n if (addFirstWhitespace) {\n element.appendChild(getWhitespaceNode());\n addFirstWhitespace = false;\n }\n element.append(_createAgElement(child));\n element.appendChild(getWhitespaceNode());\n }\n }\n }\n }\n }\n return element;\n}\n\n// packages/ag-grid-community/src/agStack/utils/event.ts\nvar PASSIVE_EVENTS = [\"touchstart\", \"touchend\", \"touchmove\", \"touchcancel\", \"scroll\"];\nvar NON_PASSIVE_EVENTS = [\"wheel\"];\nvar supports = {};\nvar _isEventSupported = /* @__PURE__ */ (() => {\n const tags = {\n select: \"input\",\n change: \"input\",\n submit: \"form\",\n reset: \"form\",\n error: \"img\",\n load: \"img\",\n abort: \"img\"\n };\n const eventChecker = (eventName) => {\n if (typeof supports[eventName] === \"boolean\") {\n return supports[eventName];\n }\n const el = document.createElement(tags[eventName] || \"div\");\n eventName = \"on\" + eventName;\n return supports[eventName] = eventName in el;\n };\n return eventChecker;\n})();\nfunction _isElementInEventPath(element, event) {\n if (!event || !element) {\n return false;\n }\n return _getEventPath(event).indexOf(element) >= 0;\n}\nfunction _createEventPath(event) {\n const res = [];\n let pointer = event.target;\n while (pointer) {\n res.push(pointer);\n pointer = pointer.parentElement;\n }\n return res;\n}\nfunction _getEventPath(event) {\n const eventNoType = event;\n if (eventNoType.path) {\n return eventNoType.path;\n }\n if (eventNoType.composedPath) {\n return eventNoType.composedPath();\n }\n return _createEventPath(eventNoType);\n}\nfunction _addSafePassiveEventListener(eElement, event, listener) {\n const passive = getPassiveStateForEvent(event);\n let options;\n if (passive != null) {\n options = { passive };\n }\n eElement.addEventListener(event, listener, options);\n}\nvar getPassiveStateForEvent = (event) => {\n const isPassive = PASSIVE_EVENTS.includes(event);\n const isNonPassive = NON_PASSIVE_EVENTS.includes(event);\n if (isPassive) {\n return true;\n }\n if (isNonPassive) {\n return false;\n }\n};\nfunction _areEventsNear(e1, e2, pixelCount) {\n if (pixelCount === 0) {\n return false;\n }\n const diffX = Math.abs(e1.clientX - e2.clientX);\n const diffY = Math.abs(e1.clientY - e2.clientY);\n return Math.max(diffX, diffY) <= pixelCount;\n}\nvar _getFirstActiveTouch = (touch, touchList) => {\n const identifier = touch.identifier;\n for (let i = 0, len = touchList.length; i < len; ++i) {\n const item = touchList[i];\n if (item.identifier === identifier) {\n return item;\n }\n }\n return null;\n};\nfunction _isEventFromThisInstance(beans, event) {\n return beans.gos.isElementInThisInstance(event.target);\n}\nfunction _anchorElementToMouseMoveEvent(element, mouseMoveEvent, beans) {\n const eRect = element.getBoundingClientRect();\n const height = eRect.height;\n const browserWidth = _getBodyWidth(beans) - 2;\n const browserHeight = _getBodyHeight(beans) - 2;\n const offsetParent = element.offsetParent;\n if (!offsetParent) {\n return;\n }\n const offsetParentSize = _getElementRectWithOffset(element.offsetParent);\n const { clientY, clientX } = mouseMoveEvent;\n let top = clientY - offsetParentSize.top - height / 2;\n let left = clientX - offsetParentSize.left - 10;\n const eDocument = _getDocument(beans);\n const win = eDocument.defaultView || window;\n const windowScrollY = win.pageYOffset || eDocument.documentElement.scrollTop;\n const windowScrollX = win.pageXOffset || eDocument.documentElement.scrollLeft;\n if (browserWidth > 0 && left + element.clientWidth > browserWidth + windowScrollX) {\n left = browserWidth + windowScrollX - element.clientWidth;\n }\n if (left < 0) {\n left = 0;\n }\n if (browserHeight > 0 && top + element.clientHeight > browserHeight + windowScrollY) {\n top = browserHeight + windowScrollY - element.clientHeight;\n }\n if (top < 0) {\n top = 0;\n }\n element.style.left = `${left}px`;\n element.style.top = `${top}px`;\n}\nvar addTempEventHandlers = (list, ...handlers) => {\n for (const handler of handlers) {\n const [target, type, eventListener, options] = handler;\n target.addEventListener(type, eventListener, options);\n list.push(handler);\n }\n};\nvar clearTempEventHandlers = (list) => {\n if (list) {\n for (const [target, type, listener, options] of list) {\n target.removeEventListener(type, listener, options);\n }\n list.length = 0;\n }\n};\nvar preventEventDefault = (event) => {\n if (event.cancelable) {\n event.preventDefault();\n }\n};\n\n// packages/ag-grid-community/src/agStack/utils/locale.ts\nfunction defaultLocaleTextFunc(_key, defaultValue) {\n return defaultValue;\n}\nfunction _getLocaleTextFunc(localeSvc) {\n return localeSvc?.getLocaleTextFunc() ?? defaultLocaleTextFunc;\n}\nfunction _translate(bean, localeValues, key, variableValues) {\n const defaultValue = localeValues[key];\n return bean.getLocaleTextFunc()(\n key,\n typeof defaultValue === \"function\" ? defaultValue(variableValues) : defaultValue,\n variableValues\n );\n}\nfunction _getLocaleTextFromFunc(getLocaleText) {\n return (key, defaultValue, variableValues) => {\n return getLocaleText({\n key,\n defaultValue,\n variableValues\n });\n };\n}\nfunction _getLocaleTextFromMap(localeText) {\n return (key, defaultValue, variableValues) => {\n let localisedText = localeText?.[key];\n if (localisedText && variableValues?.length) {\n let found = 0;\n while (true) {\n if (found >= variableValues.length) {\n break;\n }\n const idx = localisedText.indexOf(\"${variable}\");\n if (idx === -1) {\n break;\n }\n localisedText = localisedText.replace(\"${variable}\", variableValues[found++]);\n }\n }\n return localisedText ?? defaultValue;\n };\n}\n\n// packages/ag-grid-community/src/agStack/core/agBeanStub.ts\nvar AgBeanStub = class {\n constructor() {\n // not named context to allow children to use 'context' as a variable name\n this.destroyFunctions = [];\n this.destroyed = false;\n // for vue 3 - prevents Vue from trying to make this (and obviously any sub classes) from being reactive\n // prevents vue from creating proxies for created objects and prevents identity related issues\n this.__v_skip = true;\n this.propertyListenerId = 0;\n // Enable multiple grid properties to be updated together by the user but only trigger shared logic once.\n // Closely related to logic in GridOptionsUtils.ts _processOnChange\n this.lastChangeSetIdLookup = {};\n this.isAlive = () => !this.destroyed;\n }\n preWireBeans(beans) {\n this.beans = beans;\n this.stubContext = beans.context;\n this.eventSvc = beans.eventSvc;\n this.gos = beans.gos;\n }\n // this was a test constructor niall built, when active, it prints after 5 seconds all beans/components that are\n // not destroyed. to use, create a new grid, then api.destroy() before 5 seconds. then anything that gets printed\n // points to a bean or component that was not properly disposed of.\n // constructor() {\n // setTimeout(()=> {\n // if (this.isAlive()) {\n // let prototype: any = Object.getPrototypeOf(this);\n // const constructor: any = prototype.constructor;\n // const constructorString = constructor.toString();\n // const beanName = constructorString.substring(9, constructorString.indexOf(\"(\"));\n // console.log('is alive ' + beanName);\n // }\n // }, 5000);\n // }\n destroy() {\n const { destroyFunctions } = this;\n for (let i = 0; i < destroyFunctions.length; i++) {\n destroyFunctions[i]();\n }\n destroyFunctions.length = 0;\n this.destroyed = true;\n this.dispatchLocalEvent({ type: \"destroyed\" });\n }\n /** Add a local event listener against this BeanStub */\n addEventListener(eventType, listener, async) {\n if (!this.localEventService) {\n this.localEventService = new LocalEventService();\n }\n this.localEventService.addEventListener(eventType, listener, async);\n }\n /** Remove a local event listener from this BeanStub */\n removeEventListener(eventType, listener, async) {\n this.localEventService?.removeEventListener(eventType, listener, async);\n }\n dispatchLocalEvent(event) {\n this.localEventService?.dispatchEvent(event);\n }\n addManagedElementListeners(object, handlers) {\n return this._setupListeners(object, handlers);\n }\n addManagedEventListeners(handlers) {\n return this._setupListeners(this.eventSvc, handlers);\n }\n addManagedListeners(object, handlers) {\n return this._setupListeners(object, handlers);\n }\n _setupListeners(object, handlers) {\n const destroyFuncs = [];\n for (const k of Object.keys(handlers)) {\n const handler = handlers[k];\n if (handler) {\n destroyFuncs.push(this._setupListener(object, k, handler));\n }\n }\n return destroyFuncs;\n }\n _setupListener(object, event, listener) {\n if (this.destroyed) {\n return () => null;\n }\n let destroyFunc;\n if (isAgEventEmitter(object)) {\n object.__addEventListener(event, listener);\n destroyFunc = () => {\n object.__removeEventListener(event, listener);\n return null;\n };\n } else {\n const objIsEventService = isEventService(object);\n if (object instanceof HTMLElement) {\n _addSafePassiveEventListener(object, event, listener);\n } else if (objIsEventService) {\n object.addListener(event, listener);\n } else {\n object.addEventListener(event, listener);\n }\n destroyFunc = objIsEventService ? () => {\n object.removeListener(event, listener);\n return null;\n } : () => {\n object.removeEventListener(event, listener);\n return null;\n };\n }\n this.destroyFunctions.push(destroyFunc);\n return () => {\n destroyFunc();\n this.destroyFunctions = this.destroyFunctions.filter((fn) => fn !== destroyFunc);\n return null;\n };\n }\n /**\n * Setup a managed property listener for the given property.\n * However, stores the destroy function in the beanStub so that if this bean\n * is a component the destroy function will be called when the component is destroyed\n * as opposed to being cleaned up only when the properties service is destroyed.\n */\n setupPropertyListener(event, listener) {\n const { gos } = this;\n gos.addPropertyEventListener(event, listener);\n const destroyFunc = () => {\n gos.removePropertyEventListener(event, listener);\n return null;\n };\n this.destroyFunctions.push(destroyFunc);\n return () => {\n destroyFunc();\n this.destroyFunctions = this.destroyFunctions.filter((fn) => fn !== destroyFunc);\n return null;\n };\n }\n /**\n * Setup a managed property listener for the given GridOption property.\n * @param event GridOption property to listen to changes for.\n * @param listener Listener to run when property value changes\n */\n addManagedPropertyListener(event, listener) {\n if (this.destroyed) {\n return () => null;\n }\n return this.setupPropertyListener(event, listener);\n }\n /**\n * Setup managed property listeners for the given set of GridOption properties.\n * The listener will be run if any of the property changes but will only run once if\n * multiple of the properties change within the same framework lifecycle event.\n * Works on the basis that GridOptionsService updates all properties *before* any property change events are fired.\n * @param events Array of GridOption properties to listen for changes too.\n * @param listener Shared listener to run if any of the properties change\n */\n addManagedPropertyListeners(events, listener) {\n if (this.destroyed) {\n return;\n }\n const eventsKey = events.join(\"-\") + this.propertyListenerId++;\n const wrappedListener = (event) => {\n if (event.changeSet) {\n if (event.changeSet && event.changeSet.id === this.lastChangeSetIdLookup[eventsKey]) {\n return;\n }\n this.lastChangeSetIdLookup[eventsKey] = event.changeSet.id;\n }\n const propertiesChangeEvent = {\n type: \"propertyChanged\",\n changeSet: event.changeSet,\n source: event.source\n };\n listener(propertiesChangeEvent);\n };\n for (const event of events) {\n this.setupPropertyListener(event, wrappedListener);\n }\n }\n getLocaleTextFunc() {\n return _getLocaleTextFunc(this.beans.localeSvc);\n }\n addDestroyFunc(func) {\n if (this.isAlive()) {\n this.destroyFunctions.push(func);\n } else {\n func();\n }\n }\n /** doesn't throw an error if `bean` is undefined */\n createOptionalManagedBean(bean, context) {\n return bean ? this.createManagedBean(bean, context) : void 0;\n }\n createManagedBean(bean, context) {\n const res = this.createBean(bean, context);\n this.addDestroyFunc(this.destroyBean.bind(this, bean, context));\n return res;\n }\n createBean(bean, context, afterPreCreateCallback) {\n return (context || this.stubContext).createBean(bean, afterPreCreateCallback);\n }\n /**\n * Destroys a bean and returns undefined to support destruction and clean up in a single line.\n * this.dateComp = this.context.destroyBean(this.dateComp);\n */\n destroyBean(bean, context) {\n return (context || this.stubContext).destroyBean(bean);\n }\n /**\n * Destroys an array of beans and returns an empty array to support destruction and clean up in a single line.\n * this.dateComps = this.context.destroyBeans(this.dateComps);\n */\n destroyBeans(beans, context) {\n return (context || this.stubContext).destroyBeans(beans);\n }\n};\nfunction isAgEventEmitter(object) {\n return object.__addEventListener !== void 0;\n}\nfunction isEventService(object) {\n return object.eventServiceType === \"global\";\n}\n\n// packages/ag-grid-community/src/context/beanStub.ts\nvar BeanStub = class extends AgBeanStub {\n};\n\n// packages/ag-grid-community/src/agStack/utils/function.ts\nvar doOnceFlags = {};\nfunction _doOnce(func, key) {\n if (doOnceFlags[key]) {\n return;\n }\n func();\n doOnceFlags[key] = true;\n}\nvar batchedCallsSetTimeout = {\n pending: false,\n funcs: []\n};\nvar batchedCallsRaf = {\n pending: false,\n funcs: []\n};\nfunction _batchCall(func, mode = \"setTimeout\", beans) {\n const batch = mode === \"raf\" ? batchedCallsRaf : batchedCallsSetTimeout;\n batch.funcs.push(func);\n if (batch.pending) {\n return;\n }\n batch.pending = true;\n const runBatch = () => {\n const funcsCopy = batch.funcs.slice();\n batch.funcs.length = 0;\n batch.pending = false;\n for (const func2 of funcsCopy) {\n func2();\n }\n };\n if (mode === \"raf\") {\n _requestAnimationFrame(beans, runBatch);\n } else {\n window.setTimeout(runBatch, 0);\n }\n}\nfunction _debounce(bean, func, delay) {\n let timeout;\n return function(...args) {\n const context = this;\n window.clearTimeout(timeout);\n timeout = window.setTimeout(function() {\n if (bean.isAlive()) {\n func.apply(context, args);\n }\n }, delay);\n };\n}\nfunction _throttle(func, wait) {\n let previousCall = 0;\n return function(...args) {\n const context = this;\n const currentCall = Date.now();\n if (currentCall - previousCall < wait) {\n return;\n }\n previousCall = currentCall;\n func.apply(context, args);\n };\n}\nfunction _waitUntil(bean, condition, callback, timeout = 100) {\n const timeStamp = Date.now();\n let interval = null;\n let executed = false;\n const clearWait = () => {\n if (interval != null) {\n window.clearInterval(interval);\n interval = null;\n }\n };\n bean.addDestroyFunc(clearWait);\n const internalCallback = () => {\n const reachedTimeout = Date.now() - timeStamp > timeout;\n if (condition() || reachedTimeout) {\n callback();\n executed = true;\n clearWait();\n }\n };\n internalCallback();\n if (!executed) {\n interval = window.setInterval(internalCallback, 10);\n }\n}\n\n// packages/ag-grid-community/src/utils/mergeDeep.ts\nvar SKIP_JS_BUILTINS = /* @__PURE__ */ new Set([\"__proto__\", \"constructor\", \"prototype\"]);\nfunction _iterateObject(object, callback) {\n if (object == null) {\n return;\n }\n if (Array.isArray(object)) {\n for (let i = 0; i < object.length; i++) {\n callback(i.toString(), object[i]);\n }\n return;\n }\n for (const key of Object.keys(object).filter((key2) => !SKIP_JS_BUILTINS.has(key2))) {\n callback(key, object[key]);\n }\n}\nfunction _mergeDeep(dest, source, copyUndefined = true, makeCopyOfSimpleObjects = false) {\n if (!_exists(source)) {\n return;\n }\n _iterateObject(source, (key, sourceValue) => {\n let destValue = dest[key];\n if (destValue === sourceValue) {\n return;\n }\n if (makeCopyOfSimpleObjects) {\n const objectIsDueToBeCopied = destValue == null && sourceValue != null;\n if (objectIsDueToBeCopied) {\n const doNotCopyAsSourceIsSimpleObject = typeof sourceValue === \"object\" && sourceValue.constructor === Object;\n if (doNotCopyAsSourceIsSimpleObject) {\n destValue = {};\n dest[key] = destValue;\n }\n }\n }\n if (_isNonNullObject(sourceValue) && _isNonNullObject(destValue) && !Array.isArray(destValue)) {\n _mergeDeep(destValue, sourceValue, copyUndefined, makeCopyOfSimpleObjects);\n } else if (copyUndefined || sourceValue !== void 0) {\n dest[key] = sourceValue;\n }\n });\n}\nfunction _isNonNullObject(value) {\n return typeof value === \"object\" && value !== null;\n}\n\n// packages/ag-grid-community/src/globalGridOptions.ts\nvar _GlobalGridOptions = class _GlobalGridOptions {\n /**\n * @param providedOptions\n * @returns Shallow copy of the provided options with global options merged in.\n */\n static applyGlobalGridOptions(providedOptions) {\n if (!_GlobalGridOptions.gridOptions) {\n return { ...providedOptions };\n }\n let mergedGridOps = {};\n _mergeDeep(mergedGridOps, _GlobalGridOptions.gridOptions, true, true);\n if (_GlobalGridOptions.mergeStrategy === \"deep\") {\n _mergeDeep(mergedGridOps, providedOptions, true, true);\n } else {\n mergedGridOps = { ...mergedGridOps, ...providedOptions };\n }\n if (_GlobalGridOptions.gridOptions.context) {\n mergedGridOps.context = _GlobalGridOptions.gridOptions.context;\n }\n if (providedOptions.context) {\n if (_GlobalGridOptions.mergeStrategy === \"deep\" && mergedGridOps.context) {\n _mergeDeep(providedOptions.context, mergedGridOps.context, true, true);\n }\n mergedGridOps.context = providedOptions.context;\n }\n return mergedGridOps;\n }\n /**\n * Apply global grid option for a specific option key.\n * If the merge strategy is 'deep' and both global and provided values are objects, they will be merged deeply.\n * Otherwise, the provided value is returned as is.\n * @param optionKey - The key of the grid option to apply.\n * @param providedValue - The value provided to the grid instance.\n * @returns The merged value if applicable, otherwise the provided value.\n */\n static applyGlobalGridOption(optionKey, providedValue) {\n if (_GlobalGridOptions.mergeStrategy === \"deep\")