@adyen/bento-vue2 1.78.1 → 1.78.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"data-grid.DpPIDzP-.js","sources":["../../src/composables/use-calculate-sticky-element-height/use-calculate-sticky-element-height.ts","../../src/components/data-grid/components/data-grid-columns/data-grid-columns.types.ts","../../src/components/data-grid/data-grid.types.ts","../../src/components/data-grid/composables/use-resizer.ts","../../src/components/data-grid/composables/use-calculate-column-width/use-calculate-column-width.ts","../../src/components/data-grid/composables/use-selector/use-selector.ts","../../src/components/data-grid/composables/use-sorter.ts","../../src/components/data-grid/composables/use-keyboard-navigator/use-keyboard-navigator.types.ts","../../src/components/data-grid/composables/use-keyboard-navigator/use-keyboard-navigator.ts","../../src/components/data-grid/composables/use-lazy-loading/use-lazy-loading.ts","../../src/components/data-grid/composables/use-column-reorderer/use-column-reorderer.ts","../../src/components/data-grid/composables/use-config-settings/use-config-settings.ts","../../src/components/data-grid/composables/use-scroller/use-scroller.ts","../../src/components/data-grid/composables/use-column-hovering/use-column-hovering.ts","../../src/components/data-grid/utils/focus-children/focus-children.ts","../../src/components/data-grid/utils/handle-clipboard/handle-clipboard.ts","../../../ui-assets/icons-16/dist/vue/arrow-up-down-sort.vue","../../../ui-assets/icons-16/dist/vue/arrow-right.vue","../../../ui-assets/icons-16/dist/vue/freeze.vue","../../../ui-assets/icons-16/dist/vue/sort-ascending.vue","../../../ui-assets/icons-16/dist/vue/sort-descending.vue","../../../ui-assets/icons-16/dist/vue/triangle-down.vue","../../src/components/data-grid/data-grid.keys.ts","../../src/components/data-grid/components/data-grid-columns/data-grid-columns.vue","../../src/components/data-grid/components/data-grid-config-settings/data-grid-config-settings.types.ts","../../../ui-assets/icons-16/dist/vue/settings.vue","../../src/components/data-grid/components/data-grid-config-settings/components/data-grid-config-settings-column-row/data-grid-config-settings-column-row.vue","../../src/components/data-grid/components/data-grid-config-settings/data-grid-config-settings.vue","../../src/components/data-grid/components/data-grid-lazy-load/data-grid-lazy-load.vue","../../../ui-assets/icons-16/dist/vue/edit-1.vue","../../src/components/data-grid/components/data-grid-cell-actions/data-grid-cell-actions.vue","../../src/components/data-grid/components/data-grid-cell/data-grid-cell.types.ts","../../src/utils/ts/focus-visible.ts","../../src/components/data-grid/components/data-grid-cell/data-grid-cell.vue","../../src/components/data-grid/components/data-grid-row/data-grid-row.vue","../../../ui-assets/icons-16/dist/vue/warning-circle-fill.vue","../../src/components/data-grid/components/data-grid-static-icon/data-grid-static-icon.vue","../../src/components/data-grid/components/data-grid-summary-cell/data-grid-summary-cell.vue","../../src/components/data-grid/data-grid.vue"],"sourcesContent":["import { nextTick, onMounted, onUnmounted, ref, type Ref, type UnwrapRef, watch } from 'vue';\nimport { observeSizeOfElement } from '@/utils/ts/resize';\n\nconst calculateHeightWithPseudo = (element: HTMLDivElement | null | undefined): number => {\n if (!element) {\n return 0;\n }\n const style = window.getComputedStyle(element);\n let height = element.offsetHeight;\n\n // Check for pseudo-element to calculate additional height\n const after = window.getComputedStyle(element, '::after');\n if (after.content !== 'none' && after.position === 'absolute') {\n const afterHeight = parseFloat(after.height);\n const afterBottom = parseFloat(after.bottom);\n\n // If pseudo-element is positioned entirely below the element, add its height to the calculation\n if (!isNaN(afterHeight) && !isNaN(afterBottom) && afterBottom < 0 && afterBottom + afterHeight <= 0) {\n height += afterHeight;\n }\n }\n\n const top = parseFloat(style.top);\n\n // If the element is positioned upwards (e.g., top: -1px for an intersection observer trick),\n // the space it occupies for layout purposes is effectively reduced by that amount.\n // The calculated height is adjusted to ensure elements positioned below it don't have a gap.\n if (!isNaN(top) && top < 0) {\n height += top;\n }\n\n return height;\n};\n\n/**\n * Calculates the height of an element based on its ref, whether it is sticky or not and the presence of another sticky element.\n * This calculation includes the height of `::before` and `::after` pseudo-elements if they are positioned absolutely outside the main element.\n *\n * @param elementRef Reference to the element\n * @param isSticky Reference to a sticky prop\n * @param isadditionalElementSticky Reference to an additional sticky element (optional)\n * @param additionalElementRef Reference to an additional element (optional)\n * @returns Height of the element\n */\nexport const useCalculateStickyElementHeight = (\n elementRef: Ref<UnwrapRef<HTMLDivElement>>,\n isSticky: Ref<boolean>,\n isAdditionalElementSticky: Ref<boolean> = ref(false),\n additionalElementRef: Ref<UnwrapRef<HTMLDivElement>> | null = null\n) => {\n const topPosition = ref(0);\n let elementObserver: ResizeObserver | null = null;\n let mutationObserver: MutationObserver | null = null;\n\n const setTopPosition = () => {\n const mainElementHeight = isSticky.value ? calculateHeightWithPseudo(elementRef.value) : 0;\n const additionalElHeight =\n isAdditionalElementSticky.value && additionalElementRef\n ? calculateHeightWithPseudo(additionalElementRef.value)\n : 0;\n topPosition.value = mainElementHeight + additionalElHeight;\n };\n\n onMounted(() => {\n nextTick(() => {\n // Keep watching element until it's defined, then observe its size\n const stop = watch(\n elementRef,\n () => {\n if (elementRef?.value) {\n nextTick(() => stop());\n elementObserver = observeSizeOfElement(elementRef.value, setTopPosition);\n mutationObserver = new MutationObserver(setTopPosition);\n mutationObserver.observe(elementRef.value, { attributes: true, attributeFilter: ['class'] });\n }\n },\n { immediate: true }\n );\n watch(\n [isSticky, isAdditionalElementSticky],\n () => {\n setTopPosition();\n },\n { immediate: true }\n );\n });\n });\n\n onUnmounted(() => {\n elementObserver?.disconnect();\n mutationObserver?.disconnect();\n });\n\n return topPosition;\n};\n","import { type BentoColumnCellActionsProp } from '../data-grid-cell-actions/data-grid-cell-actions.types';\n\nexport enum BentoColumnOverflow {\n WRAP = 'wrap',\n ELLIPSIS = 'ellipsis',\n}\n\nexport interface BentoColumn {\n field: string;\n label: string;\n width?: number;\n autoWidth?: boolean;\n minWidth?: number;\n flex?: number;\n sortable?: boolean;\n numeric?: boolean;\n infoIconTooltip?: string;\n padding?: {\n left?: boolean;\n right?: boolean;\n };\n overflow?: BentoColumnOverflow;\n visible?: boolean;\n mandatory?: boolean;\n frozen?: boolean;\n cellActions?: BentoColumnCellActionsProp;\n}\n\n/**\n * All the emit events provided by the DatagridColumns component\n */\nexport enum DatagridColumnsEvent {\n COLUMN_RESIZE = 'column-resize',\n COLUMN_RESIZING = 'column-resizing',\n SELECT_ALL_ROWS = 'select-all-rows',\n SELECT_ALL_ACROSS_PAGES = 'select-all-across-pages',\n SELECT_ALL_CURRENT_RESULTS = 'select-all-current-results',\n DESELECT_ALL = 'deselect-all',\n DESELECT_ALL_CURRENT_RESULTS = 'deselect-all-current-results',\n COLUMN_MOVE = 'column-move',\n COLUMN_UPDATE = 'column-update',\n COLUMN_MENU_OPEN = 'column-menu-open',\n COLUMN_MENU_CLOSE = 'column-menu-close',\n COLUMN_HOVER = 'column-hover',\n\n // Dragging events\n COLUMN_DRAG_START = 'column-dragstart',\n COLUMN_DRAG_ENTER = 'column-dragenter',\n COLUMN_DRAG_END = 'column-dragend',\n COLUMN_DROP = 'column-drop',\n}\n\nexport interface DatagridColumnsHeaderReferences {\n [key: string]: HTMLDivElement | null;\n}\n\n/**\n * The Datagrid column dragging state.\n * @interface BentoDatagridDraggingColumnState\n * @field dragging - The column currently being dragged.\n * @field target - The column being dragged over during dragging another column.\n */\nexport interface BentoDatagridDraggingColumnState {\n dragging?: BentoColumn;\n dragToLeft?: boolean;\n target?: BentoColumn;\n}\n\nexport type BentoDatagridColumnSelectionState = 'all' | 'page' | 'single' | 'unselected-page' | 'none';\n","import type { BentoPaginationProps } from '@/components/pagination/pagination.types';\nimport type { BentoEmptyStateProps } from '@/components/empty-state/empty-state.types';\nimport type { BentoColumn } from './components/data-grid-columns/data-grid-columns.types';\nimport type { BentoDatagridDataItem, BentoDatagridDataItemId } from './components/data-grid-row/data-grid-row.types';\n\nexport { type BentoColumn, BentoColumnOverflow } from './components/data-grid-columns/data-grid-columns.types';\nexport type { BentoDatagridDataItem, BentoDatagridDataItemId } from './components/data-grid-row/data-grid-row.types';\nexport type {\n BentoDataGridRowActionsProp,\n BentoDataGridRowActionsFn,\n BentoColumnCellActionsProp,\n BentoColumnCellAction,\n} from './components/data-grid-cell-actions/data-grid-cell-actions.types';\n\nexport enum BentoDatagridStyleState {\n OUTLINE = 'outline',\n SCROLL = 'scroll',\n STICKY_FILTERS = 'sticky-filters',\n OVERFLOW_SHADOW_LEFT = 'overflow-shadow-left',\n OVERFLOW_SHADOW_RIGHT = 'overflow-shadow-right',\n NO_SPACING_TOP = 'no-spacing-top',\n FIT_CONTENT = 'fit-content',\n ZEBRA_ROWS = 'zebra-rows',\n}\n\nexport enum BentoDatagridSortDirection {\n ASCENDING = 'asc',\n DESCENDING = 'desc',\n}\n\nexport interface BentoDatagridSortByColumn {\n field: BentoColumn['field'];\n direction: BentoDatagridSortDirection;\n}\n\nexport type BentoDatagridSelection = Array<BentoDatagridDataItemId>;\n\nexport type BentoDatagridData = Array<BentoDatagridDataItem>;\n\nexport type BentoDatagridGetDataItemIdFn = (item: BentoDatagridDataItem) => BentoDatagridDataItemId;\n\nexport type BentoDatagridIsDataItemDisabledFn = (item: BentoDatagridDataItem) => boolean;\n\nexport type BentoDatagridPaginationProps = BentoPaginationProps;\n\nexport interface BentoColumnWidthOverridesLookup {\n [field: string]: {\n width: BentoColumn['width'];\n };\n}\n\nexport interface BentoDatagridAllItemsSelectedState {\n allItemsSelected: boolean;\n isIndeterminate: boolean;\n}\nexport interface BentoDataGridVisibleRowsState {\n filtered: boolean;\n allRowsVisible: boolean;\n}\n\nexport enum BentoDatagridEvent {\n COLUMNS = 'columns',\n COLUMN_RESIZE = 'column-resize',\n ITEMS_PAGE = 'items-page',\n NAVIGATE = 'navigate',\n NESTED_CONTENT_TOGGLED = 'nested-content-toggled',\n FILTER_SEARCH_INPUT = 'filter-search-input',\n FILTER_SEARCH_CLEAR = 'filter-search-clear',\n UPDATE_COLUMNS = 'update:columns',\n UPDATE_CONDENSED = 'update:condensed',\n UPDATE_FILTERS = 'update:filters',\n UPDATE_FILTER_VALUES = 'update:filter-values',\n UPDATE_FILTER_VALUES_OBJECT = 'update:filter-values-object',\n UPDATE_FILTER_SEARCH_TERM = 'update:filter-search-term',\n UPDATE_PAGINATION = 'update:pagination',\n UPDATE_SELECTION = 'update:selection',\n UPDATE_SHOW_MORE = 'update:show-more',\n UPDATE_SORT_BY = 'update:sort-by',\n UPDATE_ZEBRA_ROWS = 'update:zebra-rows',\n ROW_CLICK = 'row-click',\n SELECT = 'select',\n SELECT_ALL_ACROSS_PAGES = 'select-all-across-pages',\n SELECT_ALL_CURRENT_RESULTS = 'select-all-current-results',\n DESELECT_ALL_CURRENT_RESULTS = 'deselect-all-current-results',\n SORT = 'sort',\n}\n\nexport enum BentoDatagridAriaSortValue {\n ASCENDING = 'ascending',\n DESCENDING = 'descending',\n NONE = 'none',\n}\n\nexport type BentoDatagridEmptyStateProps = BentoEmptyStateProps;\n\nexport type BentoDatagridShouldShowNestedContentFn = (item: BentoDatagridDataItem) => boolean;\n\nexport type BentoDatagridShouldShowNestedRowsFn = (item: BentoDatagridDataItem) => boolean;\n","import { computed, reactive, ref, type Ref, toRefs, watch, watchEffect } from 'vue';\nimport { listen } from '@/utils/ts/events';\nimport { DatagridColumnsEvent } from '../components/data-grid-columns/data-grid-columns.types';\nimport type { BentoColumn, BentoColumnWidthOverridesLookup } from '../data-grid.types';\n\n/**\n * Contains all the resize methods and logic to allow users to resize column widths.\n * We listen for 3 main events:\n * - startResize: when the user clicks on a column divider.\n * - onResize: the tracking of the user dragging the columns divider left or right.\n * - stopResize: when the user fires the mouseup event and the column needs to be resized.\n *\n * With these 3 events we can track and store users manually changing column width.\n *\n * @param columns An array of columns definitions\n * @param emit The `bento-data-grid` emit function\n * @returns All resize refs, variables and methods\n */\nexport const useResizer = (\n columns: Ref<Array<BentoColumn>>,\n emit: (event: DatagridColumnsEvent, ...args: Array<unknown>) => void\n) => {\n const columnHoverEventToEmitAfterResizing = ref<BentoColumn>(null);\n const isResizing = ref(false);\n const columnWidthOverridesLookup = ref<BentoColumnWidthOverridesLookup>(undefined);\n // Initalise resize refs, reactive obects and computed variables\n // Set up column refs for each column header identified by the key\n const colKeyLookup = columns.value.reduce((acc, col) => {\n acc[col.field] = null;\n return acc;\n }, {});\n const columnsRefs = reactive(colKeyLookup);\n const allColumnRefs = toRefs(columnsRefs);\n\n let stepPositionX = 0;\n let resizingColumnField = '';\n\n // Setup the reactive resize data object to be used in all the event methods\n const defaultResizedColumnWidths = computed(() =>\n Object.fromEntries(columns.value.map(({ field, width, minWidth }) => [field, { width, minWidth }]))\n );\n\n watchEffect(() => (columnWidthOverridesLookup.value = defaultResizedColumnWidths.value));\n\n // Intialise resize methods\n let removeMouseMoveResizeListener: () => void = null;\n let removeMouseUpResizeListener: () => void = null;\n\n // When the user is resizing the column keep track of mouse position and update column width\n const onResizeColumn = (event: MouseEvent) => {\n const sizeChange = event.clientX - stepPositionX;\n const currResizingColumnField = resizingColumnField;\n\n const resizedColumnWidth = columnWidthOverridesLookup.value[currResizingColumnField].width + sizeChange;\n // If the column width is more than the minWidth set the new resized width or else use the minWidth\n columnWidthOverridesLookup.value[currResizingColumnField].width =\n resizedColumnWidth > defaultResizedColumnWidths.value[currResizingColumnField].minWidth\n ? resizedColumnWidth\n : defaultResizedColumnWidths.value[currResizingColumnField].minWidth;\n\n /**\n * Triggered when a column is resized\n *\n * @event column-resizing\n * @property BentoColumnWidthOverridesLookup columnWidthOverridesLookup - the column width overrides.\n */\n emit(DatagridColumnsEvent.COLUMN_RESIZING, columnWidthOverridesLookup.value);\n\n stepPositionX = event.clientX;\n };\n\n // When the user fires the mouse up event, set the resizing column width\n const stopResize = () => {\n isResizing.value = false;\n removeMouseMoveResizeListener?.();\n removeMouseUpResizeListener?.();\n\n if (resizingColumnField) {\n /**\n * Triggered when a column is resized\n *\n * @event column-resize\n * @property {field: string; width: number;} resizedColumn - the resized columns field name and new width.\n */\n emit(DatagridColumnsEvent.COLUMN_RESIZE, {\n field: resizingColumnField,\n width: columnWidthOverridesLookup.value[resizingColumnField].width,\n });\n }\n\n // Reset all resize vars back to defaults\n removeMouseMoveResizeListener = null;\n removeMouseUpResizeListener = null;\n resizingColumnField = '';\n stepPositionX = null;\n };\n\n // When the user interacts with the column resizer, set it's start position and the column we are interacting with\n const startResize = (hasResizableColumns: boolean, field: BentoColumn['field'], event: MouseEvent) => {\n event.preventDefault();\n if (hasResizableColumns) {\n isResizing.value = true;\n if (event.buttons !== 1) {\n stopResize();\n return;\n }\n\n resizingColumnField = field;\n stepPositionX = event.clientX;\n\n removeMouseMoveResizeListener = listen(window, 'mousemove', onResizeColumn);\n removeMouseUpResizeListener = listen(window, 'mouseup', stopResize);\n }\n };\n\n // When resizing we need to keep track of what the last column-hover emit was so we can emit that when we're finished resizing\n watch(\n () => isResizing.value,\n (newIsResizing, oldIsResizing) => {\n if (!newIsResizing && oldIsResizing) {\n emit(DatagridColumnsEvent.COLUMN_HOVER, columnHoverEventToEmitAfterResizing.value);\n columnHoverEventToEmitAfterResizing.value = null;\n }\n }\n );\n return {\n resizeData: columnWidthOverridesLookup,\n allColumnRefs,\n startResize,\n isResizing,\n columnHoverEventToEmitAfterResizing,\n };\n};\n","import { computed, nextTick, onBeforeUpdate, onMounted, onUnmounted, type Ref, ref, watch } from 'vue';\nimport { observeSizeOfElement } from '@/utils/ts/resize';\nimport { isVue3 } from 'vue-demi';\nimport type { BentoColumn, BentoColumnWidthOverridesLookup, BentoDatagridData } from '../../data-grid.types';\nimport type { CalculateColumnWidthOptions, FlexColumnLookup } from './use-calculate-column-width.types';\nimport type { MaybeRef } from '@/types/maybe-ref';\nimport type { DatagridColumnsHeaderReferences } from '../../components/data-grid-columns/data-grid-columns.types';\n\n// Default constants\nexport const DEFAULT_COLUMN_WIDTH = 100;\nexport const DEFAULT_COLUMN_MIN_WIDTH = 50;\n\n// Select column constants\nexport const DATAGRID_ACTIONS_COLUMN_FIELD_NAME = 'b-actions-column';\n// If only row selection is enabled\nexport const DATAGRID_SELECT_WIDTH = 42;\n// If select all pages is enabled we need to make the select column larger\nexport const DATAGRID_SELECT_WIDTH_WITH_SELECT_ALL_PAGES_ENABLED = 56;\n// If row selection is enabled and nest rows are enabled\nexport const DATAGRID_SELECT_WIDTH_AND_NESTED_ROWS_ENABLED = 56;\n// If all row selection options enabled and nest rows are enabled\nexport const DATAGRID_SELECT_WIDTH_AND_SELECT_ALL_PAGES_AND_NESTED_ROWS_ENABLED = 80;\n// If only nested row are enabled\nexport const DATAGRID_NESTED_ROWS_ENABLED = 36;\n\n// Cell and Column header offset constants\nexport const DATAGRID_CELL_OFFSET_INITIAL = 1; // This needs to be 1 due to how offsetWidth rounds decimals\nexport const DATAGRID_CELL_OFFSET_PADDING = 16;\n\n// Data Grid template constant\nexport const DATAGRID_TEMPLATE_EXTRA_PADDING = 20;\n\n/**\n * For fluid width caclulations we adhere to the caclulations done for the CSS flexbox:\n * https://drafts.csswg.org/css-flexbox-1/#resolve-flexible-lengths\n *\n * @param initialFreeSpace The amount of freespace to allow flex columns within\n * @param totalFlexUnits The total amount of flex units to allocate\n * @param flexCols An array of columns with a flex unit assigned to them\n * @returns A keyed object of columns and their computed widths\n */\nconst computeFlexColumnsWidth = (initialFreeSpace: number, totalFlexUnits: number, flexCols: Array<BentoColumn>) => {\n const flexColumnsLookup: FlexColumnLookup = {};\n const frozenColumnKeys: Array<BentoColumn['field']> = [];\n\n const freezeColumn = (field: BentoColumn['field']) => {\n const value = flexColumnsLookup[field];\n if (value && value.frozen !== true) {\n flexColumnsLookup[field].frozen = true;\n frozenColumnKeys.push(field);\n }\n };\n\n // Step 5 of https://drafts.csswg.org/css-flexbox-1/#resolve-flexible-lengths\n function processFlexItems() {\n // 5a: If all the flex items on the line are frozen, free space has been distributed.\n if (frozenColumnKeys.length === flexCols.length) {\n return;\n }\n\n const violationsLookup: {\n min: Record<BentoColumn['field'], boolean>;\n max: Record<BentoColumn['field'], boolean>;\n } = { min: {}, max: {} };\n\n let remainingFreeSpace = initialFreeSpace;\n let flexUnits = totalFlexUnits;\n let totalViolation = 0;\n\n // 5b: Calculate the remaining free space\n frozenColumnKeys.forEach(field => {\n remainingFreeSpace -= flexColumnsLookup[field].computedWidth;\n flexUnits -= flexColumnsLookup[field].flex;\n });\n\n for (let i = 0, flexColsLength = flexCols.length; i < flexColsLength; i += 1) {\n const column = flexCols[i];\n\n // If this column is frozen no need to re-recalculate it's width\n if (flexColumnsLookup[column.field] && flexColumnsLookup[column.field].frozen === true) {\n // NOTE: the following eslint rule was disabled because we check each column's frozen status\n // and if one exists we need to keep recursively caclulating the flex column widths.\n continue;\n }\n\n // 5c: Distribute remaining free space proportional to the flex factors\n const widthPerFlexUnit = remainingFreeSpace / flexUnits;\n let computedWidth = widthPerFlexUnit * column.flex;\n\n // 5d: Fix minWidth violations\n if (computedWidth < column.minWidth) {\n totalViolation += column.minWidth - computedWidth;\n computedWidth = column.minWidth;\n violationsLookup.min[column.field] = true;\n }\n\n flexColumnsLookup[column.field] = {\n frozen: false,\n computedWidth,\n flex: column.flex,\n };\n }\n\n // 5e: Freeze over-flexed items\n if (totalViolation > 0) {\n // Freeze all the items with minWidth violations\n Object.keys(violationsLookup.min).forEach(field => {\n freezeColumn(field);\n });\n } else {\n // Freeze all items\n flexCols.forEach(({ field: key }) => {\n freezeColumn(key);\n });\n }\n\n // 5f: Return to the start of this loop\n processFlexItems();\n }\n\n processFlexItems();\n\n return flexColumnsLookup;\n};\n\n/**\n * Calculates width of HTMLDivElement including any additional offset depending on if:\n * - An edge occurs where sometimes the padding CSS has not loaded yet\n * - When calculating column header width, if the column panel is enabled\n *\n * @param el - an HTML Div element\n * @param hasColumnPanel - if provided and true will be used to calculate the offset\n * @returns the width of the element including offset values\n */\nconst getElementWidthIncludingOffset = (el: HTMLDivElement, hasColumnPanel?: boolean) => {\n let offset = DATAGRID_CELL_OFFSET_INITIAL;\n // If we include column panel in the calculation we should add 2 spacers to leave room for the contextual menu button\n if (hasColumnPanel) {\n offset += DATAGRID_CELL_OFFSET_PADDING * 2;\n }\n\n return el?.offsetWidth ? el.offsetWidth + offset : 0;\n};\n\n/**\n * Generates the column width for the actions column which contains actions like row selection or nested rows toggle button.\n * @param options - the datagrid calculation options.\n * @returns a column definition used in the column and cell components.\n */\nexport const getActionsColumnWidth = (options: CalculateColumnWidthOptions) => {\n if (options?.hasNestedContent?.value || options?.hasNestedRows?.value) {\n if (!options?.hasSelectableColumn?.value) {\n return DATAGRID_NESTED_ROWS_ENABLED;\n }\n return options?.hasSelectableAcrossPages?.value\n ? DATAGRID_SELECT_WIDTH_AND_SELECT_ALL_PAGES_AND_NESTED_ROWS_ENABLED\n : DATAGRID_SELECT_WIDTH_AND_NESTED_ROWS_ENABLED;\n }\n return options?.hasSelectableAcrossPages?.value\n ? DATAGRID_SELECT_WIDTH_WITH_SELECT_ALL_PAGES_ENABLED\n : DATAGRID_SELECT_WIDTH;\n};\n\n/**\n * Calculates the width of the columns using width, minWidth and/or a fluid number.\n *\n * @param newColumns An array of column definitions\n * @param newData An array of data objects to display.\n * @param bodyRef Ref to the `bento-data-grid` body container\n * @param gridCellRefs An array of Ref for each one of the cells available by Column\n * @param options Optional options for the calculator to be aware of.\n */\nexport const useCalculateColumnWidth = (\n newColumns: Ref<Array<BentoColumn>>,\n newData: MaybeRef<BentoDatagridData>,\n bodyRef: MaybeRef<HTMLDivElement | undefined>,\n gridColumnsComponentRefs: MaybeRef<DatagridColumnsHeaderReferences>,\n gridCellRefs: MaybeRef<{ [key: string]: Array<HTMLDivElement> } | undefined>,\n options?: CalculateColumnWidthOptions\n) => {\n const columns = ref(newColumns.value);\n const data = ref(newData);\n const body = ref(bodyRef);\n const gridColumnsComponents = ref(gridColumnsComponentRefs);\n const gridCells = ref(gridCellRefs);\n const isMeasuringColumnWidths = ref(false);\n const rowActionsMaxWidth = ref(0);\n\n // Watch for updates to columns property but don't change order or width\n watch(\n () => newColumns.value,\n (newDataGridColumnsProps, previousDataGridColumnsProps) => {\n const haveSameFieldsInSameOrder =\n newDataGridColumnsProps?.map(({ field }) => field).toString() ===\n previousDataGridColumnsProps?.map(({ field }) => field).toString();\n\n /**\n * No column order will be stored if drag & drop is disabled.\n * This is because in the case where users pass down different data sets\n * with different columns, there's no reason to store the order internally\n * and this functionality is delegated to the users which can listen to the\n * 'update:columns' if they'd like to handle the order of mutiple data sets.\n *\n * In the other case where a user is changing which columns are used and / or\n * their order as well, we must not presist the columns order.\n */\n if (!options?.allowColumnDragAndDrop?.value || !haveSameFieldsInSameOrder) {\n columns.value = newColumns.value;\n return;\n }\n\n /*\n * This is needed for the use case when:\n * 1. User provides a computed ref of columns (which have translations for labels)\n * 2. User re-orders the columns, changing the local state\n * 3. User changes the language, now the local state columns need to be updated BUT the local order must persist\n */\n columns.value =\n columns.value?.length === 0\n ? newColumns.value\n : newColumns.value\n // Keep the order the same as it was, adding any new columns to the end\n\n .sort((colA, colB) => {\n // Find the index of each item in the orderArray\n const indexA = columns.value.findIndex(item => item.field === colA.field);\n const indexB = columns.value.findIndex(item => item.field === colB.field);\n // Place items not in orderArray at the end\n if (indexA === -1) {\n return 1;\n }\n if (indexB === -1) {\n return -1;\n }\n return indexA - indexB;\n });\n }\n );\n\n // Observe the size of the table body and store the width for column and CSS width calculations\n const gridWidth = ref<number>();\n let bodyElementObserver: ResizeObserver | null = null;\n\n const calculatedWidths = computed(() => {\n // Setup vars\n const flexCols = [];\n let totalFlexUnits = 0;\n let widthAllocatedBeforeFlex = 0;\n // reduce columns into keyed object\n const columnsLookup: {\n [columnKey: string]: BentoColumn;\n } = {};\n let columnDefs: Array<BentoColumn> = columns.value.filter(col => col.visible !== false);\n const invisibleColumnDefs: Array<BentoColumn> = columns.value.filter(col => col.visible === false);\n // Prepend a column if needs row selecting functionality or nested rows functionality\n if (options?.hasSelectableColumn?.value || options?.hasNestedContent?.value || options?.hasNestedRows?.value) {\n const columnWidth = getActionsColumnWidth(options);\n\n columnDefs = [\n {\n field: DATAGRID_ACTIONS_COLUMN_FIELD_NAME,\n label: '',\n minWidth: columnWidth,\n width: columnWidth,\n frozen: true,\n padding: { left: false, right: false },\n },\n ...columnDefs,\n ];\n }\n\n // For the non-flex columns, compute their width\n // For the flex columns, compute there minimum width and how much width must be allocated during the flex allocation\n columnDefs.forEach(col => {\n const fluidCol: BentoColumn = { ...col };\n let width: number;\n if (fluidCol.flex && fluidCol.flex > 0) {\n // If a fluid column, add flex units to total and prepare them for calculation\n totalFlexUnits += fluidCol.flex;\n width = 0;\n flexCols.push(fluidCol);\n } else {\n // If not a fluid column use the width (or minWidth if this is a larger value)\n width = Math.max(\n fluidCol?.width ?? DEFAULT_COLUMN_WIDTH,\n fluidCol?.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH\n );\n }\n\n widthAllocatedBeforeFlex += width;\n fluidCol.width = width;\n fluidCol.minWidth = fluidCol?.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH;\n\n columnsLookup[fluidCol.field] = fluidCol;\n });\n\n // The row actions column has a fixed width, so we add it to the total allocated width before calculating flex column widths.\n widthAllocatedBeforeFlex += rowActionsMaxWidth.value;\n\n // Calculate how much space we have available for fluids widths by subtracting the non-fluid column widths\n const initialFreeSpace = Math.max(gridWidth.value - widthAllocatedBeforeFlex, 0);\n\n // Allocate the remaining space to the flex columns\n if (totalFlexUnits > 0 && gridWidth.value > 0) {\n const computedColumnWidths = computeFlexColumnsWidth(initialFreeSpace, totalFlexUnits, flexCols);\n\n Object.keys(computedColumnWidths).forEach(field => {\n columnsLookup[field].width = computedColumnWidths[field].computedWidth;\n });\n }\n\n // Add in invisible columns\n invisibleColumnDefs.forEach(col => {\n const fluidCol: BentoColumn = { ...col };\n columnsLookup[fluidCol.field] = fluidCol;\n });\n\n return Object.values(columnsLookup);\n });\n\n // RESIZE OBJECT\n const columnWidthOverridesLookup = ref<BentoColumnWidthOverridesLookup>(undefined);\n\n const onColumnWidthOverride = (newColumnWidthOverridesLookup: BentoColumnWidthOverridesLookup) => {\n columnWidthOverridesLookup.value = { ...columnWidthOverridesLookup.value, ...newColumnWidthOverridesLookup };\n };\n\n // Auto-width logic\n const measureAndAssignAutoWidths = async () => {\n if (columns.value.some(column => column?.autoWidth)) {\n // First we need to measure the row cells for each column after 1 tick\n isMeasuringColumnWidths.value = true;\n await nextTick();\n // Need to await an extra tick for vue 3 because of how vue 3 re-renders children component when changing props\n if (isVue3) {\n await nextTick();\n }\n\n // Now we find the biggest cell for each auto width column\n columns?.value\n .filter(column => column?.autoWidth)\n .forEach(({ field, minWidth }) => {\n const columnHeaderWidth = getElementWidthIncludingOffset(\n gridColumnsComponents.value?.[field],\n options?.hasColumnPanel?.value\n );\n\n const largestRowCellWidth = gridCells.value?.[field]?.reduce(\n (max, el) => Math.max(max, getElementWidthIncludingOffset(el)),\n 0\n );\n\n const largestColumnHeaderAndRowCellWidth = Math.max(columnHeaderWidth, largestRowCellWidth ?? 0);\n\n if (minWidth === undefined || largestColumnHeaderAndRowCellWidth > minWidth) {\n onColumnWidthOverride({\n [field]: {\n width: largestColumnHeaderAndRowCellWidth,\n },\n });\n }\n });\n\n isMeasuringColumnWidths.value = false;\n }\n };\n watch([() => columns.value, () => data.value], async () => {\n if (columns.value.some(column => column?.autoWidth)) {\n await measureAndAssignAutoWidths();\n }\n });\n\n const processedColumns = computed(() =>\n calculatedWidths.value.map(col => ({\n ...col,\n // Override column width with resized ones\n width: columnWidthOverridesLookup.value?.[col.field]?.width ?? col.width,\n }))\n );\n\n // Generate grid width styles\n const totalWidthOfAllColumns = computed(\n () =>\n processedColumns.value\n ?.filter(({ visible }) => visible !== false)\n .reduce((acc, val) => val.width + acc, 0) + rowActionsMaxWidth.value\n );\n\n const isTotalWidthOfColumnsTakingUpAllAvailableGridWidth = computed(\n () => gridWidth.value <= totalWidthOfAllColumns.value\n );\n\n const gridRowWidthStyle = computed(() => ({\n width: gridWidth.value > totalWidthOfAllColumns.value ? '100%' : 'fit-content',\n }));\n\n // Life cycle hooks\n onMounted(() => {\n const extraPadding = options?.isDataGridTemplate ? DATAGRID_TEMPLATE_EXTRA_PADDING : 0;\n\n nextTick(() => {\n if (body.value) {\n gridWidth.value = body.value.getBoundingClientRect().width - extraPadding;\n }\n // Keep watching element till it's defined, when it is observe element's width\n const stop = watch(\n body,\n () => {\n if (body.value) {\n nextTick(() => stop());\n bodyElementObserver = observeSizeOfElement(body.value, ({ width }) => {\n gridWidth.value = width - extraPadding;\n });\n }\n },\n { immediate: true }\n );\n });\n\n if (document?.fonts?.ready) {\n document.fonts.ready.then(() => {\n measureAndAssignAutoWidths();\n });\n } else {\n measureAndAssignAutoWidths();\n }\n });\n onUnmounted(() => {\n bodyElementObserver?.disconnect();\n });\n onBeforeUpdate(() => {\n if (gridCells.value && Object.keys(gridCells.value)?.length > 0) {\n const columnKeys = Object.keys(gridCells.value);\n columnKeys.forEach(key => {\n gridCells.value[key] = [];\n });\n }\n });\n\n return {\n columnDefs: processedColumns,\n gridRowWidthStyle,\n onColumnWidthOverride,\n isMeasuringColumnWidths,\n isTotalWidthOfColumnsTakingUpAllAvailableGridWidth,\n columns,\n totalWidthOfAllColumns,\n rowActionsMaxWidth,\n };\n};\n","import { computed, nextTick, reactive, ref, type Ref, watch } from 'vue';\nimport {\n type BentoDatagridAllItemsSelectedState,\n type BentoDatagridData,\n type BentoDatagridDataItem,\n type BentoDatagridDataItemId,\n BentoDatagridEvent,\n type BentoDatagridGetDataItemIdFn,\n type BentoDatagridIsDataItemDisabledFn,\n type BentoDatagridPaginationProps,\n} from '../../data-grid.types';\nimport { type BentoDatagridColumnSelectionState } from '../../components/data-grid-columns/data-grid-columns.types';\n\n/**\n * Exposed selection variables and methods for a data component to use and react to.\n * @param selection A list of unique IDs\n * @param emit The emit function to fire upon selection\n * @param data The list of data items\n * @param getDataItemId The method to retrieve the unique ID of a data item\n * @param isDataItemDisabled The method to determine if the data item is disabled for selection\n * @param isSelectableAcrossPages Determines if the grid rows are selectable across all pages\n * @param pagination The data grid pagination\n */\nexport const useSelector = (\n selection: Ref<Array<BentoDatagridDataItemId>>,\n emit: (event: string, emitedSelectedItems: Array<BentoDatagridDataItemId>) => void,\n data: Ref<BentoDatagridData>,\n getDataItemId: BentoDatagridGetDataItemIdFn,\n isDataItemDisabled: BentoDatagridIsDataItemDisabledFn,\n isSelectableAcrossPages?: Ref<boolean>,\n pagination?: Ref<BentoDatagridPaginationProps>\n) => {\n const selectedItems = ref<Array<BentoDatagridDataItemId>>(selection.value ?? []);\n const allItemsSelectedState = reactive<BentoDatagridAllItemsSelectedState>({\n allItemsSelected: false,\n isIndeterminate: false,\n });\n const allDataItemsIncludingChildren = computed(() =>\n data.value.flatMap(dataItem => [dataItem, dataItem?.children?.length > 0 ? dataItem?.children : []]).flat()\n );\n const isEveryItemInPageSelected = computed(\n () =>\n data.value?.length > 0 &&\n allDataItemsIncludingChildren.value?.every(item => selectedItems.value.includes(getDataItemId(item)))\n );\n const isEveryEnabledItemInPageSelected = computed(\n () =>\n data.value?.length > 0 &&\n allDataItemsIncludingChildren.value\n ?.filter(dataItem => !isDataItemDisabled(dataItem))\n .every(item => selectedItems.value.includes(getDataItemId(item)))\n );\n const isNoItemInPageSelected = computed(\n () =>\n data.value?.length > 0 &&\n !allDataItemsIncludingChildren.value?.some(item => selectedItems.value.includes(getDataItemId(item)))\n );\n\n const isNoEnabledItemInPageSelected = computed(\n () =>\n data.value?.length > 0 &&\n !allDataItemsIncludingChildren.value\n ?.filter(dataItem => !isDataItemDisabled(dataItem))\n .some(item => selectedItems.value.includes(getDataItemId(item)))\n );\n const isEveryItemAcrossPagesSelected = computed(() => {\n if (!isSelectableAcrossPages?.value || pagination?.value?.totalCount === undefined) {\n return false;\n }\n return selectedItems.value.length >= pagination.value.totalCount && isEveryEnabledItemInPageSelected.value;\n });\n\n const emitSelect = () => {\n emit(BentoDatagridEvent.SELECT, selectedItems.value);\n emit(BentoDatagridEvent.UPDATE_SELECTION, selectedItems.value);\n };\n\n // Update the selected items state & the select / de-select all column checkbox state by:\n // - Set the selected items state\n // - Set the \"select / de-select all\" checked state\n // - If all seletcted, set indeterminate to true if not all items were selected including disabled ones.\n // - If not all selected, set indeterminate to true if at least 1 item has been selected in the currently shown data.\n const updateSelectedItems = (value: Array<BentoDatagridDataItemId>) => {\n selectedItems.value = value;\n if (isEveryItemInPageSelected.value) {\n allItemsSelectedState.allItemsSelected = true;\n // if all items are selected, then indeterminate is false\n allItemsSelectedState.isIndeterminate = false;\n } else {\n allItemsSelectedState.allItemsSelected = false;\n // Check if at least 1 item in the currently shown data is selected\n allItemsSelectedState.isIndeterminate =\n selectedItems.value?.length > 0 &&\n data.value?.length > 0 &&\n data.value.some(\n item =>\n selectedItems.value.includes(getDataItemId(item)) ||\n item?.children?.some(childItem => selectedItems.value.includes(getDataItemId(childItem)))\n );\n }\n };\n\n // Reacts to the \"select this page / deselect this page\" menu updates\n // or checkbox with `selectable across pages` is not active\n // 1. Set the \"select / de-select all\" checked state to incoming parameter\n // 2. Set the selected items state\n // - If selecting all then interminate state to true if checked state is checked but not all items (including disabled ones) are selected\n // - If de-selecting all, then set interminate state to false\n // 3. Emit selected state\n const onAllRowSelect = (selectAllItems: boolean) => {\n nextTick(() => {\n // The allItemsSelected must be kept in sync with the checked checkbox state\n allItemsSelectedState.allItemsSelected = selectAllItems;\n // Check all undisabled rows\n const currentPageItems =\n allDataItemsIncludingChildren.value\n ?.filter(\n dataItem =>\n !isDataItemDisabled(dataItem) &&\n (dataItem?.children === undefined ||\n dataItem.children.every(childItem => !isDataItemDisabled(childItem)))\n )\n ?.map(dataItem => getDataItemId(dataItem)) ?? [];\n if (selectAllItems) {\n selectedItems.value = [...new Set([...selectedItems.value, ...currentPageItems])];\n allItemsSelectedState.isIndeterminate = !isEveryItemInPageSelected.value;\n } else {\n selectedItems.value = selectedItems.value.filter(item => !currentPageItems.includes(item));\n allItemsSelectedState.isIndeterminate = !isNoItemInPageSelected.value;\n }\n emitSelect();\n });\n };\n\n const onDeselectAll = () => {\n nextTick(() => {\n updateSelectedItems([]);\n emitSelect();\n });\n };\n\n const onRowSelect = (value: Array<BentoDatagridDataItemId>, rowData: BentoDatagridDataItem) => {\n nextTick(() => {\n updateSelectedItems(rowData?.children?.length > 0 ? onParentRowSelect(value, rowData) : value);\n emitSelect();\n });\n };\n\n // Selecting / deselecting a parent of nested rows\n const onParentRowSelect = (value: Array<BentoDatagridDataItemId>, parentRowData: BentoDatagridDataItem) => {\n const currentRowDateItemId = getDataItemId(parentRowData);\n const childrenDataItemIds = parentRowData.children\n ?.filter(childItem => !isDataItemDisabled(childItem))\n .map(childItem => getDataItemId(childItem));\n // Selecting\n if (value.includes(currentRowDateItemId)) {\n const parentIdAndChildrenIds = value;\n childrenDataItemIds.forEach(childDataItemId => {\n if (!parentIdAndChildrenIds.includes(childDataItemId)) {\n parentIdAndChildrenIds.push(childDataItemId);\n }\n });\n return parentIdAndChildrenIds;\n }\n return value.filter(selectedItemId => !childrenDataItemIds.includes(selectedItemId));\n };\n\n // Selecting / deselecting a nested row\n const onNestedRowSelect = (\n value: Array<BentoDatagridDataItemId>,\n parentRowData: BentoDatagridDataItem,\n rowData: BentoDatagridDataItem\n ) => {\n nextTick(() => {\n const currentRowDateItemId = getDataItemId(parentRowData);\n // Selecting\n if (value.includes(getDataItemId(rowData))) {\n updateSelectedItems(\n !value.includes(currentRowDateItemId) &&\n parentRowData?.children?.every(child => value.includes(getDataItemId(child)))\n ? [...value, currentRowDateItemId]\n : value\n );\n } else {\n // Deselecting\n updateSelectedItems(\n value.includes(currentRowDateItemId) &&\n !parentRowData?.children?.every(child => value.includes(getDataItemId(child)))\n ? value.filter(selectedItem => selectedItem !== currentRowDateItemId)\n : value\n );\n }\n emitSelect();\n });\n };\n\n const selectionState = computed<BentoDatagridColumnSelectionState>(() => {\n if (isEveryItemAcrossPagesSelected.value) {\n return 'all';\n }\n if (isEveryEnabledItemInPageSelected.value) {\n return 'page';\n }\n if (!selectedItems.value || selectedItems.value.length === 0) {\n return 'none';\n }\n if (isNoEnabledItemInPageSelected.value) {\n return 'unselected-page';\n }\n return 'single';\n });\n\n // If the selection prop is changed we should update local selection state\n watch(\n () => selection.value,\n () => {\n updateSelectedItems(selection.value ?? []);\n },\n { immediate: true }\n );\n\n // If the data is changed then we should update the select all checkbox if needed\n watch(\n () => data.value,\n () => {\n // Adds in missing children if parent is selected\n const allChildrenSelectedDataItems = data.value\n .filter(dataItem => selectedItems.value.includes(getDataItemId(dataItem)))\n .flatMap(dataItem =>\n dataItem?.children?.length > 0\n ? dataItem.children\n .map(childItem => getDataItemId(childItem))\n .filter(childItemId => !selectedItems.value.includes(childItemId))\n : []\n );\n\n if (allChildrenSelectedDataItems?.length > 0) {\n updateSelectedItems([...selectedItems.value, ...allChildrenSelectedDataItems]);\n emitSelect();\n } else {\n updateSelectedItems(selectedItems.value);\n }\n }\n );\n\n return {\n onAllRowSelect,\n onRowSelect,\n onNestedRowSelect,\n onDeselectAll,\n allItemsSelectedState,\n selectedItems,\n selectionState,\n };\n};\n","import { type Ref } from 'vue';\nimport { type BentoColumn, type BentoDatagridSortByColumn, BentoDatagridSortDirection } from '../data-grid.types';\n\n/**\n * Handles the sort direction logic of the columns in DataGrid.\n * Emits the `sort` event with the new direction when the field sort direction changes.\n * @param sortBy Sort directions per field that is `sortable: true`\n * @param columns Array of all columns in the grid\n * @param emit The `bento-data-grid` emit function\n */\nexport const useSorter = (\n sortBy: Ref<Array<BentoDatagridSortByColumn>>,\n columns: Ref<Array<BentoColumn>>,\n emit: (event: 'sort', updatedSortBy: Array<BentoDatagridSortByColumn>) => void\n) => {\n const isSorting = (field: string) => sortBy.value.some(sortedCol => sortedCol.field === field);\n\n const getSortingDirection = (field: string) => sortBy.value.find(sortedCol => sortedCol.field === field)?.direction;\n\n // The column head click event to sort data by certain field and direction\n const sortByColumnField = (field: string) => {\n // First check if column is sortable\n if (!columns.value.some(col => col.field === field && col.sortable)) {\n return;\n }\n\n // Return the updated sortBy array of sorted columns\n const newColumnSort: BentoDatagridSortByColumn = {\n field,\n direction:\n sortBy.value.find(sortedCol => sortedCol.field === field)?.direction ===\n BentoDatagridSortDirection.ASCENDING\n ? BentoDatagridSortDirection.DESCENDING\n : BentoDatagridSortDirection.ASCENDING,\n };\n\n const updatedSortBy = [newColumnSort];\n\n emit('sort', updatedSortBy);\n };\n\n return { isSorting, getSortingDirection, sortByColumnField };\n};\n","import { EventKey } from '@/types/utils-events';\n\nexport enum BentoDatagridNavigationKey {\n ARROW_DOWN = EventKey.ARROW_DOWN,\n ARROW_UP = EventKey.ARROW_UP,\n ARROW_LEFT = EventKey.ARROW_LEFT,\n ARROW_RIGHT = EventKey.ARROW_RIGHT,\n PAGE_UP = EventKey.PAGE_UP,\n PAGE_DOWN = EventKey.PAGE_DOWN,\n END = EventKey.END,\n HOME = EventKey.HOME,\n}\n","import { computed, type Ref } from 'vue';\nimport { BentoDatagridNavigationKey } from './use-keyboard-navigator.types';\nimport type { DatagridColumnsHeaderReferences } from '../../components/data-grid-columns/data-grid-columns.types';\nimport type { BentoColumn } from '../../data-grid.types';\n\n/**\n * Row action column field name\n */\nexport const DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME = 'b-row-actions-column';\n\n/**\n * A composable that handles all the keyboard navigation logic within the data-grid.\n * This provide grid navigation by moving focus among the column headers and data cells of the grid using the keyboard\n * @param gridcellRefs Array of references to the HTML elements of the cells.\n * @param columns The reference to the array of column configurations\n * @param selectable The reference to the selectable prop that enable row to be selected via a checkbox.\n */\nexport const useKeyboardNavigator = (\n gridcellRefs: Ref<{ [key: string]: Array<HTMLDivElement> }>,\n columnHeaderRefs: Ref<DatagridColumnsHeaderReferences>,\n columns: Ref<Array<BentoColumn>>,\n selectable: Ref<boolean>,\n rowActions: Ref<boolean>,\n hasColumnPanel: Ref<boolean>\n) => {\n const hasColumnActions = computed(() => {\n if (hasColumnPanel.value || selectable.value) {\n return true;\n }\n\n return columns.value.some((column: BentoColumn) => column.infoIconTooltip || column.sortable);\n });\n const visibleColumns = computed(() => {\n let visibleColumnsFromValue = columns.value.filter(({ visible }) => visible !== false);\n if (rowActions.value) {\n visibleColumnsFromValue = [\n ...visibleColumnsFromValue,\n { field: DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME, label: '' } as BentoColumn,\n ];\n }\n return visibleColumnsFromValue;\n });\n\n // Count the number of visible columns\n const visibleColumnsCount = computed(() => visibleColumns.value.length);\n\n const sortedColumnHeaderAndGridCellRefs = computed(() => {\n if (!gridcellRefs.value) {\n return [];\n }\n\n const firstColumnKey = Object.keys(gridcellRefs.value)[0];\n if (!firstColumnKey || !gridcellRefs.value[firstColumnKey]) {\n return [];\n }\n\n const cells: Array<HTMLDivElement> = [];\n\n if (hasColumnActions.value) {\n // Column header cells\n for (const column of visibleColumns.value) {\n const columnCoumnHeaderCell = columnHeaderRefs.value[column.field];\n cells.push(columnCoumnHeaderCell);\n }\n }\n\n // Data cell\n const numRows = gridcellRefs.value[firstColumnKey].length;\n for (let rowIndex = 0; rowIndex < numRows; rowIndex++) {\n for (const column of visibleColumns.value) {\n const columnCells = gridcellRefs.value[column.field];\n if (columnCells?.[rowIndex]) {\n cells.push(columnCells[rowIndex]);\n }\n }\n }\n\n return cells;\n });\n\n // Returns the index of the row that a given cell is found\n const getCurrentRowIndex = (currentIndex: number) => Math.floor(currentIndex / visibleColumnsCount.value);\n\n /**\n * Calculates the next focused cell index for edge navigation keys (e.g., Home, End, Page Up, Page Down).\n *\n * Note: Some keys will only navigate to data cells and not the column headers,\n * following the W3C data grid pattern.\n *\n * @param currentIndex The index of the currently focused cell.\n * @param direction The navigation key pressed.\n * @param ctrlKey Whether the Ctrl key was pressed.\n * @returns The index of the next cell to focus.\n */\n const getEdgeCellIndex = (currentIndex: number, direction: BentoDatagridNavigationKey, ctrlKey: boolean) => {\n const lastCellIndex = sortedColumnHeaderAndGridCellRefs.value.length - 1;\n const lastColumnIndex = visibleColumnsCount.value - 1;\n const currentRowIndex = getCurrentRowIndex(currentIndex);\n const currentColumn = currentIndex - visibleColumnsCount.value * currentRowIndex;\n\n const cellIndexByDirection = {\n [BentoDatagridNavigationKey.PAGE_UP]:\n currentColumn + (hasColumnActions.value ? visibleColumnsCount.value : 0),\n [BentoDatagridNavigationKey.PAGE_DOWN]: lastCellIndex - lastColumnIndex + currentColumn,\n [BentoDatagridNavigationKey.END]: ctrlKey\n ? lastCellIndex\n : visibleColumnsCount.value * currentRowIndex + lastColumnIndex,\n [BentoDatagridNavigationKey.HOME]: ctrlKey\n ? hasColumnActions.value\n ? visibleColumnsCount.value\n : 0\n : visibleColumnsCount.value * currentRowIndex,\n };\n\n return cellIndexByDirection[direction];\n };\n\n // Calculates the next focused cell index when users navigates using keys to navigate cell by cell\n // e.g. Arrow Right, Arrow Left, Arrow Up, Arrow Down\n const getCellIndex = (currentIndex: number, direction: BentoDatagridNavigationKey) => {\n const currentRowIndex = getCurrentRowIndex(currentIndex);\n\n const directionDiffMap = {\n [BentoDatagridNavigationKey.ARROW_DOWN]: visibleColumnsCount.value,\n [BentoDatagridNavigationKey.ARROW_UP]:\n currentRowIndex === 0 && !hasColumnActions.value ? 0 : -visibleColumnsCount.value,\n [BentoDatagridNavigationKey.ARROW_LEFT]: -1,\n [BentoDatagridNavigationKey.ARROW_RIGHT]: 1,\n };\n\n const directionDiff = directionDiffMap[direction];\n const newCellIndex = currentIndex + directionDiff;\n\n if (newCellIndex < 0 || newCellIndex >= sortedColumnHeaderAndGridCellRefs.value.length) {\n return currentIndex;\n }\n\n return newCellIndex;\n };\n\n // Verifies if a key is used to navigate on the edges of the data-grid\n const isEdgeNavigationKeyCode = (keyCode: BentoDatagridNavigationKey) =>\n [\n BentoDatagridNavigationKey.PAGE_UP,\n BentoDatagridNavigationKey.PAGE_DOWN,\n BentoDatagridNavigationKey.END,\n BentoDatagridNavigationKey.HOME,\n ].includes(keyCode);\n\n // Returns the next cell to be focused based on the keys pressed by the user\n const getTargetCellIndex = (\n target: EventTarget,\n directionKeyCode: BentoDatagridNavigationKey,\n ctrlKey: boolean\n ): number => {\n const currentCellIndex = sortedColumnHeaderAndGridCellRefs.value.indexOf(target as HTMLDivElement);\n\n if (isEdgeNavigationKeyCode(directionKeyCode)) {\n return getEdgeCellIndex(currentCellIndex, directionKeyCode, ctrlKey);\n }\n\n return getCellIndex(currentCellIndex, directionKeyCode);\n };\n\n // Find the next cell to be focused and apply the focus on it\n const focusOnNextGridcell = (target: EventTarget, key: BentoDatagridNavigationKey, ctrlKey: boolean) => {\n if (!sortedColumnHeaderAndGridCellRefs.value.includes(target as HTMLDivElement)) {\n return;\n }\n\n const cellIndex = getTargetCellIndex(target, key, ctrlKey);\n sortedColumnHeaderAndGridCellRefs.value[cellIndex].focus();\n };\n\n // Verifies if a key is used to navigate on the data-grid\n const isNavigationKeyCode = (key: string) => key in BentoDatagridNavigationKey;\n\n // On keyboard input for DataGrid row elements\n const navigationInput = (event: KeyboardEvent) => {\n const { ctrlKey, key, target } = event;\n const dataGridKeyboardNavigationsKey = key as BentoDatagridNavigationKey;\n\n let parentGridCell = target as HTMLDivElement;\n // If we're navigating inside a menu then don't change focus\n if (parentGridCell.getAttribute('role') === 'menuitem') {\n return;\n }\n if (!sortedColumnHeaderAndGridCellRefs.value.includes(parentGridCell)) {\n parentGridCell = (target as HTMLDivElement).closest('[role=\"gridcell\"], [role=\"columnheader\"]');\n }\n\n if (\n sortedColumnHeaderAndGridCellRefs.value.includes(parentGridCell) &&\n isNavigationKeyCode(dataGridKeyboardNavigationsKey)\n ) {\n focusOnNextGridcell(parentGridCell, dataGridKeyboardNavigationsKey, ctrlKey);\n }\n };\n\n return {\n isNavigationKeyCode,\n focusOnNextGridcell,\n navigationInput,\n };\n};\n","import { computed, ref, watch } from 'vue';\nimport { type SetupContext } from 'vue/types/v3-setup-context';\nimport { type BentoLazyLoadType } from '@/types/lazy-load';\nimport { type MaybeRef } from '@/types/maybe-ref';\nimport { BentoDatagridEvent } from '../../data-grid.types';\n\n/**\n * The percentage of how much height of the element that has been scrolled before a\n * `BentoDatagridEvent.UPDATE_SHOW_MORE` event is emitted.\n */\nconst LAZY_LOAD_BUFFER_PERCENTAGE = 90;\n\n/**\n * Handles the \"lazy load\" logic for the DataGrid so the data can be\n * loaded. If `lazyLoadTypeRef` is set to automatic, then the event `update:show-more`\n * is triggered when the scroll gets to the bottom of the DataGrid.\n *\n * @param lazyLoadTypeRef Lazy load type: automatic, button or none\n * @param verticalScrollPositionRef Current vertical position of the scroll\n * @param bodyRef Ref to the `bento-data-grid` body container\n * @param emit The `bento-data-grid` emit function\n */\nexport const useLazyLoading = (\n lazyLoadTypeRef: MaybeRef<BentoLazyLoadType>,\n verticalScrollPositionRef: MaybeRef<number>,\n bodyRef: MaybeRef<HTMLDivElement | undefined>,\n loading: MaybeRef<boolean>,\n emit: SetupContext['emit']\n) => {\n const lazyLoadType = ref(lazyLoadTypeRef);\n const verticalScrollPosition = ref(verticalScrollPositionRef);\n const body = ref(bodyRef);\n const isLoading = ref(loading);\n\n const isLazyLoad = computed(() => lazyLoadType.value !== 'none');\n\n const isInfiniteScroll = computed(() => lazyLoadType.value === 'automatic');\n\n const emitLazyLoadEvent = () => {\n emit(BentoDatagridEvent.UPDATE_SHOW_MORE);\n };\n\n watch(\n () => verticalScrollPosition.value,\n () => {\n if (isInfiniteScroll.value) {\n const height = body.value.offsetHeight;\n const percentageOffset = (height / verticalScrollPosition.value) * 100;\n if (percentageOffset > LAZY_LOAD_BUFFER_PERCENTAGE && !isLoading.value) {\n emitLazyLoadEvent();\n }\n }\n }\n );\n\n return { isLazyLoad, isInfiniteScroll, verticalScrollPosition, emitLazyLoadEvent };\n};\n","import { computed, reactive, ref } from 'vue';\nimport { type MaybeRef } from '@/types/maybe-ref';\nimport { type BentoColumn, BentoDatagridEvent } from '../../data-grid.types';\nimport type { SetupContext } from 'vue/types/v3-setup-context';\nimport {\n type BentoDatagridDraggingColumnState,\n DatagridColumnsEvent,\n} from '@/components/data-grid/components/data-grid-columns/data-grid-columns.types';\n\n/**\n * A composable that handles all the column dragging logic.\n * This allows users to re-arrange the column order.\n * @param columnsRef The reference to the array of columns.\n * @param hasDraggableColumnsRef The reference to the hasDraggableColumns prop.\n * @param emit The Datagrid emit function.\n */\nexport const useColumnReorderer = (\n columnsRef: MaybeRef<Array<BentoColumn>>,\n hasDraggableColumnsRef: MaybeRef<boolean>,\n emit: SetupContext['emit']\n) => {\n const columns = ref(columnsRef);\n const hasDraggableColumns = ref(hasDraggableColumnsRef);\n\n const draggingColumns = reactive<BentoDatagridDraggingColumnState>({\n dragging: null,\n dragToLeft: null,\n target: null,\n });\n\n const onMoveColumnByOffset = (movingColumn: BentoColumn, offset = 0) => {\n const fromIndex = columns.value.findIndex(c => c.field === movingColumn.field);\n const toIndex = fromIndex + offset;\n if (toIndex < 0 || toIndex > columns.value.length - 1) {\n return;\n }\n\n // If the move is inside the bounds of the columns array, we can move\n // const toColumn = columns.value[toIndex];\n const reorderedColumns = [...columns.value];\n reorderedColumns.splice(toIndex, 0, reorderedColumns.splice(fromIndex, 1)[0]);\n\n emit(BentoDatagridEvent.COLUMNS, reorderedColumns);\n emit(BentoDatagridEvent.UPDATE_COLUMNS, reorderedColumns);\n };\n\n const onDragStart = (column: BentoColumn, e: DragEvent & Event) => {\n draggingColumns.dragging = column;\n e.dataTransfer.setData('text', ''); // dataTransfer needed for firefox\n e.dataTransfer.dropEffect = 'move';\n };\n\n const onDragEnter = (column: BentoColumn, dragEvent: DragEvent) => {\n draggingColumns.target = column;\n const targetRect = (dragEvent.currentTarget as HTMLElement).getBoundingClientRect();\n const midpoint = targetRect.left + targetRect.width / 2;\n const clientX = dragEvent.clientX ?? 0;\n draggingColumns.dragToLeft = clientX <= midpoint;\n };\n\n const onDrop = (column: BentoColumn) => {\n if (draggingColumns.dragging?.field !== column.field) {\n // Re-order columns\n const fromIndex = columns.value.findIndex(c => c.field === draggingColumns.dragging?.field);\n const toIndexInitial = columns.value.findIndex(c => c.field === column.field);\n const toIndex = draggingColumns.dragToLeft ? toIndexInitial : toIndexInitial + 1;\n const toLeftOfToIndex = toIndex > fromIndex ? toIndex - 1 : toIndex;\n let reorderedColumns = [...columns.value];\n\n reorderedColumns.splice(\n toLeftOfToIndex === -1 ? 0 : toLeftOfToIndex,\n 0,\n reorderedColumns.splice(fromIndex, 1)[0]\n );\n\n const firstUnfrozenColumn = columns.value.findIndex(c => !c?.frozen);\n // Make sure to change the frozen state of the dragged column to the column the user is dropping on\n // However don't change the state if we are dragging over the first un-frozen column\n if (draggingColumns.dragging?.frozen !== column.frozen && toIndex !== firstUnfrozenColumn) {\n reorderedColumns = reorderedColumns.map(col =>\n draggingColumns.dragging?.field === col.field ? { ...col, frozen: !!column?.frozen } : col\n );\n }\n\n emit(BentoDatagridEvent.COLUMNS, reorderedColumns);\n emit(BentoDatagridEvent.UPDATE_COLUMNS, reorderedColumns);\n }\n\n draggingColumns.dragging = null;\n draggingColumns.target = null;\n };\n\n const onDragEnd = () => {\n draggingColumns.dragging = null;\n draggingColumns.dragToLeft = null;\n draggingColumns.target = null;\n };\n\n // Drag events for the `data-grid-columns`\n const draggingEventsForColumns = computed(() => {\n if (!hasDraggableColumns.value) {\n return {};\n }\n\n return {\n [DatagridColumnsEvent.COLUMN_DRAG_START]: (column: BentoColumn, e: DragEvent & Event) =>\n onDragStart(column, e),\n [DatagridColumnsEvent.COLUMN_DRAG_ENTER]: (column: BentoColumn, dragEvent: DragEvent) =>\n onDragEnter(column, dragEvent),\n [DatagridColumnsEvent.COLUMN_DROP]: (column: BentoColumn) => onDrop(column),\n [DatagridColumnsEvent.COLUMN_DRAG_END]: () => onDragEnd(),\n };\n });\n\n // Drag events for row cell\n const draggingEventsForRowCell = computed(() => (column: BentoColumn) => {\n if (!hasDraggableColumns.value) {\n return {};\n }\n\n return {\n dragenter: (e: DragEvent) => {\n e.preventDefault();\n onDragEnter(column, e);\n },\n drop: () => {\n onDrop(column);\n },\n dragover: (e: DragEvent) => {\n e.preventDefault();\n },\n };\n });\n\n return {\n // Values\n draggingColumns,\n\n // Methods\n draggingEventsForColumns,\n draggingEventsForRowCell,\n onMoveColumnByOffset,\n };\n};\n","import { type MaybeRef } from '@/types/maybe-ref';\nimport { type BentoColumn, BentoDatagridEvent } from '../../data-grid.types';\nimport { computed, type Ref, ref, watch } from 'vue';\nimport { DATAGRID_ACTIONS_COLUMN_FIELD_NAME } from '../use-calculate-column-width/use-calculate-column-width';\nimport type { SetupContext } from 'vue/types/v3-setup-context';\nimport { type DatagridConfigSettingsColumnSets } from './use-config.settings.types';\n\n/**\n * All Datagrid configuration settings logic:\n * - Condensed view toggle\n * - Frozen / unfrozen columns sorting and column sets\n * - Emitting a new array of colums with a new updated column\n * - Emitting new updated array of columns\n *\n * @param condensed Initial state of condensed view toggle\n * @param emit The `bento-data-grid` emit function\n * @returns Condensed view data & event handler\n */\nexport const useConfigSettings = (\n columnsRef: MaybeRef<Array<BentoColumn>>,\n isZebraRowsRef: Ref<boolean>,\n emit: SetupContext['emit']\n) => {\n const columns = ref(columnsRef);\n const internalZebraRows = ref(isZebraRowsRef.value);\n\n // Frozen and unfrozen columns\n const sortedColumnsByFreezeState = computed(() =>\n [...columns.value].sort((a, b) => {\n if (a.frozen === b.frozen) {\n return 0;\n }\n return a.frozen ? -1 : 1;\n })\n );\n const frozenColumns = computed(() =>\n sortedColumnsByFreezeState.value.filter(col => col.frozen && col.visible !== false)\n );\n const unfrozenColumns = computed(() =>\n sortedColumnsByFreezeState.value.filter(col => !col.frozen && col.visible !== false)\n );\n const columnSets = computed<DatagridConfigSettingsColumnSets>(() =>\n [\n { columnSet: frozenColumns.value, id: 'frozen', isFrozenColumns: true },\n { columnSet: unfrozenColumns.value, id: 'unfrozen' },\n ].filter(({ columnSet }) => columnSet.length)\n );\n const isOnlyOneVisibleColumn = computed(\n () =>\n columns.value.filter(col => col?.visible !== false && col?.field !== DATAGRID_ACTIONS_COLUMN_FIELD_NAME)\n .length === 1\n );\n\n const onConfigSettingsCondensedUpdate = (isCondensedView: boolean) =>\n emit(BentoDatagridEvent.UPDATE_CONDENSED, isCondensedView);\n\n const onConfigSettingsZebraRowsUpdate = (isZebraRows: boolean) => {\n internalZebraRows.value = isZebraRows;\n emit(BentoDatagridEvent.UPDATE_ZEBRA_ROWS, isZebraRows);\n };\n\n // Emits an updated array of columns\n const onConfigSettingsColumnsUpdate = (newColumns: Array<BentoColumn>) => {\n emit(BentoDatagridEvent.COLUMNS, newColumns);\n emit(BentoDatagridEvent.UPDATE_COLUMNS, newColumns);\n };\n\n // Updates and then emits an updated array of columns\n const onConfigSettingsColumnUpdate = (updatedColumn: BentoColumn) => {\n const updatedColumns = sortedColumnsByFreezeState.value.map(col =>\n col?.field === updatedColumn.field ? updatedColumn : col\n );\n onConfigSettingsColumnsUpdate(updatedColumns);\n };\n\n watch(isZebraRowsRef, newValue => {\n internalZebraRows.value = newValue;\n });\n\n return {\n // Values\n columnSets,\n isOnlyOneVisibleColumn,\n internalZebraRows,\n sortedColumns: sortedColumnsByFreezeState,\n\n // Methods\n onConfigSettingsColumnsUpdate,\n onConfigSettingsColumnUpdate,\n onConfigSettingsCondensedUpdate,\n onConfigSettingsZebraRowsUpdate,\n };\n};\n","import { computed, nextTick, onMounted, ref, type Ref, type UnwrapRef, watch } from 'vue';\nimport { isVue3 } from 'vue-demi';\nimport type { BentoDatagridPaginationProps } from '@/components/data-grid/data-grid.types';\n\n/**\n * Handles all scroll events & logic for the DataGrid.\n * @param body The reference to the DataGrid body element.\n * @param columnsRef The reference to the row of column headers element.\n * @param verticalScrollPosition The reference to scroll top position number.\n * @returns Update methods for updating the scroll ppsotion references & the body scroll & overflow attributes.\n */\nexport const useScroller = (\n body: Ref<UnwrapRef<HTMLDivElement>>,\n columnsRef: Ref<UnwrapRef<HTMLDivElement>>,\n verticalScrollPosition: Ref<number>,\n virtualHorizontalScrollbar: Ref<UnwrapRef<HTMLDivElement | undefined>>,\n paginationContainerRef: Ref<UnwrapRef<HTMLDivElement | undefined>>,\n totalWidthOfAllColumns: Ref<number>,\n options?: {\n isLazyLoad?: Ref<UnwrapRef<boolean>>;\n pagination?: Ref<UnwrapRef<BentoDatagridPaginationProps | undefined>>;\n stickyPagination: Ref<UnwrapRef<boolean>>;\n isDataGridTemplate?: boolean;\n }\n) => {\n const scrollLeftPosition = ref(0);\n const hasLeftOverflow = ref(false);\n const hasRightOverflow = ref(false);\n\n /* eslint-disable no-param-reassign */\n /* == Scrolling == */\n // Sync body and column headers scrolling\n watch([() => scrollLeftPosition.value, () => totalWidthOfAllColumns.value], ([currentScrollLeftPosition]) => {\n body.value.scrollLeft = currentScrollLeftPosition;\n columnsRef.value.scrollLeft = currentScrollLeftPosition;\n hasLeftOverflow.value = !!currentScrollLeftPosition;\n hasRightOverflow.value =\n columnsRef.value.scrollWidth - columnsRef.value.offsetWidth > currentScrollLeftPosition;\n });\n\n onMounted(async () => {\n await nextTick();\n // Because there is an extra nextTick() for vue3 when rendering fluid columns in `use-calculate-column-width`,\n // we also need to wait an extra tick here in order to get the right widths\n if (isVue3) {\n await nextTick();\n }\n if (columnsRef.value?.offsetWidth < columnsRef.value?.scrollWidth) {\n hasRightOverflow.value = true;\n }\n });\n\n const updateScrollPosition = (event: Event) => {\n scrollLeftPosition.value = (event.target as HTMLDivElement).scrollLeft;\n verticalScrollPosition.value = body.value.scrollHeight - (event.target as HTMLDivElement).scrollTop;\n\n if (virtualHorizontalScrollbar?.value) {\n const scrollLeftPos = (event.target as HTMLDivElement).scrollLeft;\n if (virtualHorizontalScrollbar.value.scrollLeft !== scrollLeftPos) {\n virtualHorizontalScrollbar.value.scrollLeft = scrollLeftPos;\n }\n }\n };\n\n const updateScrollPositionOnFrozenColumnsNavigation = (event: KeyboardEvent) => {\n if (event.key === 'Tab' || (event.key !== 'ArrowRight' && event.key !== 'ArrowLeft')) {\n return;\n }\n event.preventDefault();\n\n body.value.scrollLeft = 0;\n // Using setTimeout to override the browser behavior of scrolling the parent element when a child is focused\n body.value.style.overflowX = 'hidden';\n setTimeout(() => {\n if (body.value) {\n body.value.style.overflowX = 'auto';\n }\n });\n };\n\n // Virtual Horizontal scroller that is stickied\n const syncVirtualScrollerWithBody = (event: Event) => {\n const scrollLeftPos = (event.target as HTMLDivElement).scrollLeft;\n if (body.value.scrollLeft !== scrollLeftPos) {\n body.value.scrollLeft = scrollLeftPos;\n }\n };\n /* eslint-enable no-param-reassign */\n const horizontalScrollbarConditionalStyles = computed(() => {\n if (\n options?.pagination?.value &&\n (options?.stickyPagination?.value || options?.isDataGridTemplate) &&\n !options?.isLazyLoad?.value\n ) {\n return { bottom: `${(paginationContainerRef.value?.clientHeight ?? 0) + 1}px` };\n }\n return {};\n });\n\n return {\n // Values\n scrollLeftPosition,\n hasLeftOverflow,\n hasRightOverflow,\n horizontalScrollbarConditionalStyles,\n\n // Methods\n updateScrollPosition,\n updateScrollPositionOnFrozenColumnsNavigation,\n syncVirtualScrollerWithBody,\n };\n};\n","import { computed, type Ref, ref } from 'vue';\nimport { DATAGRID_ACTIONS_COLUMN_FIELD_NAME } from '../use-calculate-column-width';\nimport type { BentoColumn } from '@/components/data-grid/components/data-grid-columns/data-grid-columns.types';\nimport type { DatagridConfigSettingsColumnSets } from '../use-config-settings/use-config.settings.types';\nimport type { DatagridColumnHoveringState } from './use-column-hovering.types';\n\nexport const useColumnHovering = (\n columnSets: Ref<DatagridConfigSettingsColumnSets>,\n selectable: Ref<boolean>,\n outline: Ref<boolean>,\n isTotalWidthOfColumnsTakingUpAllAvailableGridWidth: Ref<boolean>\n) => {\n const hoveredOverColumn = ref<BentoColumn>(null);\n const hoveredOverColumnState = computed<DatagridColumnHoveringState>(() => {\n if (!hoveredOverColumn.value || hoveredOverColumn.value.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME) {\n return {\n hoveredOverColumnField: '',\n isSeparatorOffset: false,\n noBorderLeft: false,\n noBorderRight: false,\n };\n }\n\n const frozenColumnSet = columnSets.value\n .find(colSet => colSet.isFrozenColumns)\n ?.columnSet?.filter(col => col.field !== DATAGRID_ACTIONS_COLUMN_FIELD_NAME);\n const unFrozenColumnSet = columnSets.value.find(colSet => !colSet?.isFrozenColumns);\n\n const isFirstFrozenColumn =\n hoveredOverColumn.value.frozen && frozenColumnSet?.[0].field === hoveredOverColumn.value.field;\n const isFirstUnfrozenColumn =\n !hoveredOverColumn.value.frozen &&\n unFrozenColumnSet?.columnSet?.[0].field === hoveredOverColumn.value.field;\n\n // Cases where no left border should be shown\n // If Frozen, selectable off, outline on, first column\n const isFrozenSelectableOutlineOnFirstCol = (selectable.value || outline.value) && isFirstFrozenColumn;\n // If No frozen columns & not frozen, selectable off, outline on, first column\n const isNoFrozenColAndNotFrozenSelectableOutlineOnFirstCol =\n (selectable.value || outline.value) && !frozenColumnSet && isFirstUnfrozenColumn;\n // If are frozen columns & not frozen, first column\n const isFrozenColumnsAndNotFrozenFirstColumn = frozenColumnSet && isFirstUnfrozenColumn;\n\n // Cases where no right border should be shown\n // If frozen column, last column\n const isFrozenColumnsAndLastFrozenColumn =\n frozenColumnSet?.length > 0 &&\n hoveredOverColumn.value.frozen &&\n frozenColumnSet?.[frozenColumnSet.length - 1].field === hoveredOverColumn.value.field;\n // If outline is on, all columns are taking up width of the grid container and is last column\n const isOutlineOnAllColumnWidthFitContainerAndLastColumn =\n outline.value &&\n isTotalWidthOfColumnsTakingUpAllAvailableGridWidth.value &&\n !hoveredOverColumn.value.frozen &&\n unFrozenColumnSet?.columnSet?.[unFrozenColumnSet.columnSet.length - 1].field ===\n hoveredOverColumn.value.field;\n\n return {\n hoveredOverColumnField: hoveredOverColumn.value.field,\n isSeparatorOffset: isOutlineOnAllColumnWidthFitContainerAndLastColumn,\n noBorderLeft:\n !!isFrozenSelectableOutlineOnFirstCol ||\n !!isNoFrozenColAndNotFrozenSelectableOutlineOnFirstCol ||\n !!isFrozenColumnsAndNotFrozenFirstColumn,\n\n noBorderRight: !!isFrozenColumnsAndLastFrozenColumn || !!isOutlineOnAllColumnWidthFitContainerAndLastColumn,\n };\n });\n\n return {\n hoveredOverColumn,\n hoveredOverColumnState,\n };\n};\n\nexport default useColumnHovering;\n","import { getFocusableIn } from 'focus-lock';\n\n/**\n * Finds and focuses the first interactive child element within a given parent element.\n * @param childEl The parent HTML element to search for focusable children.\n * @returns `true` if a focusable element was found and focused, otherwise `false`.\n */\nexport const focusOnInteractiveChild = (childEl: HTMLElement) => {\n const focusableElements = getFocusableIn(childEl);\n const removedParentNodeFromList = focusableElements.filter(el => el.node !== childEl);\n\n if (removedParentNodeFromList?.length > 0) {\n removedParentNodeFromList[0].node.focus();\n return true;\n }\n return false;\n};\n\n/**\n * Finds all interactive child elements within a given parent element and makes them unfocusable.\n * This is achieved by setting their `tabindex` attribute to `-1`.\n * @param childEl The parent HTML element to search for focusable children.\n * @returns An array of the elements that were made unfocusable, or `undefined` if no focusable children were found.\n */\nexport const makeAllInteractiveChildrenUnFocusable = (childEl: HTMLElement): Array<{ node: HTMLElement }> | undefined => {\n const focusableElements = getFocusableIn(childEl);\n const removedParentNodeFromList = focusableElements?.filter(el => el.node !== childEl);\n\n if (removedParentNodeFromList?.length > 0) {\n removedParentNodeFromList.forEach(el => el.node.setAttribute('tabindex', '-1'));\n return removedParentNodeFromList;\n }\n return undefined;\n};\n\n/**\n * Makes a list of HTML elements focusable by setting their `tabindex` attribute to '0'.\n * @param focusNodes An array of objects, where each object contains a `node` property that is an HTMLElement.\n */\nexport const makeAllInteractiveChildrenFocusable = (focusNodes: Array<{ node: HTMLElement }>) => {\n if (focusNodes?.length > 0) {\n focusNodes.forEach(el => el?.node.setAttribute('tabindex', '0'));\n }\n};\n","export const handleClipboard = () => {\n const selectedContent = window.getSelection().getRangeAt(0).cloneContents();\n\n const rows = selectedContent.querySelectorAll('[role=\"row\"]');\n let tableCopy = '<table>';\n let plainCopy = '';\n\n const parseCells = (cells: NodeListOf<Element>) => {\n cells.forEach(cell => {\n const tag = cell.closest('[role]').getAttribute('role') === 'gridcell' ? 'td' : 'th';\n const text = (cell as HTMLElement).textContent.trim();\n if (text) {\n tableCopy += `<${tag}>${text}</${tag}>`;\n plainCopy += `${text}\\t`;\n }\n });\n };\n\n if (!rows.length) {\n const cells = selectedContent.querySelectorAll(\n '[role=\"gridcell\"] > .b-typography:first-of-type, [role=\"columnheader\"] .b-typography'\n );\n\n if (cells.length) {\n tableCopy += '<tr>';\n parseCells(cells);\n tableCopy += '</tr>';\n } else {\n navigator.clipboard.writeText(selectedContent.textContent);\n return;\n }\n }\n\n rows.forEach(row => {\n const cells = row.querySelectorAll(\n '[role=\"gridcell\"] > .b-typography:first-of-type, [role=\"columnheader\"] .b-typography'\n );\n tableCopy += '<tr>';\n if (cells.length) {\n parseCells(cells);\n } else {\n const text = (row as HTMLElement).textContent.trim();\n tableCopy += `<td>${text}</td>`;\n plainCopy += `${text}\\t`;\n }\n tableCopy += '</tr>';\n plainCopy += '\\n';\n });\n\n tableCopy += '</table>';\n\n navigator.clipboard.write([\n new ClipboardItem({\n 'text/html': new Blob([tableCopy], { type: 'text/html' }),\n 'text/plain': new Blob([plainCopy || selectedContent.textContent.trim()], { type: 'text/plain' }),\n }),\n ]);\n};\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><g fill=\"#001222\" :clip-path=\"'url(#uia-ui-assets/icons-16-arrow_up_down_sort__a' + uuid + ')'\"><path d=\"M9.06077 4.00011L5.00011 -0.0605469L0.939453 4.00011L2.00011 5.06077L4.25 2.81089V10.75H5.75V2.81066L8.00011 5.06077L9.06077 4.00011Z\"/><path d=\"M10.25 13.1893L8.00011 10.9395L6.93945 12.0001L11.0001 16.0608L15.0608 12.0001L14.0001 10.9395L11.75 13.1896V5.25H10.25V13.1893Z\"/></g><defs><clipPath :id=\"'uia-ui-assets/icons-16-arrow_up_down_sort__a' + uuid\"><rect width=\"16\" height=\"16\" fill=\"#fff\"/></clipPath></defs></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><path fill=\"#001222\" d=\"M12.1933 8.7454L7.93903 12.9996L8.99969 14.0603L15.0604 7.99963L8.99969 1.93896L7.93903 2.99963L12.1848 7.24541L1.24902 7.25658L1.25056 8.75658L12.1933 8.7454Z\"/></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><g :clip-path=\"'url(#uia-ui-assets/icons-16-freeze__a' + uuid + ')'\"><path fill=\"#001222\" d=\"M10.5605 14.5L9.94434 13.8838C9.6002 13.5397 9.18722 13.3072 8.75 13.1836V10.9336L10.1689 10.1162L11.6865 10.9941L12.1094 12.5605C12.1146 12.5821 12.1182 12.6044 12.124 12.626L12.1553 12.7441L12.3496 13.4688L13.7988 13.0801L13.6162 12.4004L13.6201 12.3984L13.5547 12.1592C13.4254 11.5178 13.8153 10.878 14.4561 10.7061L14.5742 10.6748L15.2988 10.4805L14.9102 9.03125L14.2295 9.21387L14.2285 9.20996L13.5049 9.40625L12.4346 9.69531L10.9199 8.81836V7.18262L12.8633 6.05762C13.1889 6.37496 13.597 6.61697 14.0674 6.74316L14.1855 6.77441L14.9102 6.96875L15.2988 5.52051L14.5742 5.32617L14.4561 5.29395C13.7894 5.11503 13.3935 4.4294 13.5723 3.7627L13.6045 3.64453L13.7988 2.91992L12.3496 2.53125L12.1553 3.25586L12.124 3.37402C11.9979 3.84406 12.0018 4.31824 12.1133 4.75879L10.1689 5.88477L8.75 5.06738V2.81738C9.18731 2.69384 9.60013 2.46036 9.94434 2.11621L10.5605 1.5L9.5 0.439453L8.88379 1.05566C8.39567 1.54362 7.60433 1.54362 7.11621 1.05566L6.5 0.439453L5.43945 1.5L6.05566 2.11621C6.39987 2.46036 6.81269 2.69384 7.25 2.81738V5.06738L5.83105 5.88477L3.88574 4.75879C3.99724 4.31819 4.00207 3.84412 3.87598 3.37402L3.84473 3.25586L3.65039 2.53125L2.20117 2.91992L2.39551 3.64453L2.42773 3.7627C2.60651 4.42942 2.21066 5.11507 1.54395 5.29395L1.42578 5.32617L0.701172 5.52051L1.08984 6.96875L1.81445 6.77441L1.93262 6.74316C2.40275 6.61703 2.81018 6.37474 3.13574 6.05762L5.08008 7.18262V8.81836L3.13574 9.94336C2.81015 9.62622 2.40287 9.38399 1.93262 9.25781L1.81445 9.22559L1.08984 9.03125L0.701172 10.4805L1.42578 10.6748L1.54395 10.7061C2.2106 10.8849 2.60644 11.5706 2.42773 12.2373L2.39551 12.3555L2.20117 13.0801L3.65039 13.4688L3.84473 12.7441L3.87598 12.626C4.00207 12.1559 3.99723 11.6817 3.88574 11.2412L5.83105 10.1162L7.25 10.9336V13.1836C6.81278 13.3072 6.3998 13.5397 6.05566 13.8838L5.43945 14.5L6.5 15.5605L7.11621 14.9443C7.60433 14.4564 8.39567 14.4564 8.88379 14.9443L9.5 15.5605L10.5605 14.5ZM6.58008 8.81641V7.18262L8 6.36426L9.41992 7.18262V8.81641L8 9.63477L6.58008 8.81641Z\"/></g><defs><clipPath :id=\"'uia-ui-assets/icons-16-freeze__a' + uuid\"><rect width=\"16\" height=\"16\" fill=\"#fff\" transform=\"matrix(1 0 0 -1 0 16)\"/></clipPath></defs></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><g fill=\"#001222\" :clip-path=\"'url(#uia-ui-assets/icons-16-sort_ascending__a' + uuid + ')'\"><path d=\"M12.0001 1.93945L16.0608 6.00011L15.0001 7.06077L12.75 4.81066V12.75H11.25V4.81089L9.00011 7.06077L7.93945 6.00011L12.0001 1.93945Z\"/><path d=\"M6.75 7.25H1.25V8.75H6.75V7.25Z\"/><path d=\"M1.25 11.25H8.75V12.75H1.25V11.25Z\"/><path d=\"M6.75 3.25H1.25V4.75H6.75V3.25Z\"/></g><defs><clipPath :id=\"'uia-ui-assets/icons-16-sort_ascending__a' + uuid\"><rect width=\"16\" height=\"16\" fill=\"#fff\"/></clipPath></defs></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><g fill=\"#001222\" :clip-path=\"'url(#uia-ui-assets/icons-16-sort_descending__a' + uuid + ')'\"><path d=\"M12.75 3.25V11.1896L15.0001 8.93945L16.0608 10.0001L12.0001 14.0608L7.93945 10.0001L9.00011 8.93945L11.25 11.1893V3.25H12.75Z\"/><path d=\"M6.75 7.25H1.25V8.75H6.75V7.25Z\"/><path d=\"M1.25 3.25H9.09V4.75H1.25V3.25Z\"/><path d=\"M6.75 11.25H1.25V12.75H6.75V11.25Z\"/></g><defs><clipPath :id=\"'uia-ui-assets/icons-16-sort_descending__a' + uuid\"><rect width=\"16\" height=\"16\" fill=\"#fff\"/></clipPath></defs></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><path fill=\"#001222\" d=\"M8 11.25L12.5 5.25H3.5L8 11.25Z\"/></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","export const DATA_GRID_SLASHED_ZERO = Symbol('data-grid slashed zero key');\nexport const DATA_GRID_SMALL_CONTAINER = Symbol('data-grid small container key');\nexport const DATA_GRID_TOUCH_DEVICE = Symbol('data-grid touch device key');\n","<template>\n <div\n ref=\"allColumnsRef\"\n class=\"b-data-grid-columns\"\n :class=\"conditionalColumnsClasses\"\n data-testid=\"data-grid-columns\"\n >\n <div\n v-for=\"(column, index) in columns\"\n :key=\"column.field\"\n :ref=\"el => registerColumnsRefs(el, column.field)\"\n :aria-colindex=\"index + 1\"\n :aria-label=\"column.label\"\n :aria-sort=\"getSortingColumnDirection(column)\"\n :class=\"conditionalColumnClasses(column, index)\"\n :data-testid=\"`${column.field}-column-header`\"\n :draggable=\"hasDraggableColumns && !isResizing && !isActionsColumn(column)\"\n class=\"b-data-grid-columns__column\"\n role=\"columnheader\"\n :tabindex=\"column.sortable || hasColumnPanel || column.infoIconTooltip ? '0' : '-1'\"\n :style=\"{ width: column.autoWidth && isMeasuringColumnWidths ? 'auto' : `${column.width}px` }\"\n v-on=\"dataGridColumnEvents(column)\"\n >\n <div\n v-if=\"isActionsColumn(column) && selectable\"\n class=\"b-data-grid-columns__select-column\"\n :class=\"conditionalSelectColumnClasses\"\n >\n <bento-checkbox\n v-if=\"!selectableAcrossPages\"\n :aria-label=\"t('selectAll')\"\n :model-value=\"allItemsSelectedState.allItemsSelected\"\n data-testid=\"checkbox-select-all\"\n :indeterminate=\"allItemsSelectedState.isIndeterminate\"\n value=\"data-grid-select-all\"\n @update:model-value=\"onAllRowSelect\"\n />\n <template v-if=\"selectableAcrossPages\">\n <bento-menu\n :button=\"{ variant: 'tertiary', condensed: true, 'aria-label': t('selectAllMenu') }\"\n :data=\"selectAllMenu\"\n class=\"b-data-grid-columns__select-column-menu\"\n disable-arrow-down-opening-menu\n menu-fixed-positioning\n menu-position=\"bottom-start\"\n >\n <template #iconLeft>\n <div class=\"b-data-grid-columns__select-column-menu-button\">\n <decorative-checkbox\n :indeterminate=\"allItemsSelectedState.isIndeterminate\"\n :checked=\"allItemsSelectedState.allItemsSelected\"\n :all-selected=\"isAllSelectionState\"\n class=\"b-data-grid-columns__select-column-menu-checkbox\"\n data-testid=\"checkbox-select-all\"\n />\n\n <triangle-down :svg-title=\"t('selectionMenu')\" aria-hidden=\"true\" />\n </div>\n </template>\n </bento-menu>\n </template>\n </div>\n <template v-else>\n <div\n :aria-label=\"t('columnActions', { name: column.label })\"\n aria-live=\"polite\"\n role=\"region\"\n class=\"b-data-grid-columns__column-header-and-actions\"\n :class=\"conditionalColumnHeaderAndActionsClasses(column)\"\n >\n <bento-typography\n el=\"div\"\n strongest\n class=\"b-data-grid-columns__column-header\"\n :class=\"conditionalColumnHeaderClasses\"\n >\n <slot :column=\"column\" :name=\"`head-${column.field}`\">\n <span class=\"b-data-grid-columns__label\">{{ column.label }}</span>\n </slot>\n </bento-typography>\n <div\n v-if=\"hasColumnActions(column)\"\n class=\"b-data-grid-columns__column-actions\"\n :class=\"conditionalColumnActionsClasses(column)\"\n >\n <div v-if=\"column.infoIconTooltip\" class=\"b-data-grid-columns__column-info-icon\">\n <bento-info-icon :tooltip-text=\"column.infoIconTooltip\" />\n </div>\n <div v-if=\"column.sortable\" class=\"b-data-grid-columns__column-sort\">\n <bento-toggle-button\n condensed\n :toggled=\"isSorting(column.field)\"\n variant=\"tertiary\"\n @click=\"sortByColumnField(column.field)\"\n >\n <template #iconLeft>\n <arrow-up-and-down-sort-icon\n v-if=\"!getSortingDirection(column.field)\"\n :svg-title=\"t('sortColumn', { name: column.label })\"\n />\n <sort-ascending-icon\n v-else-if=\"\n getSortingDirection(column.field) === BentoDatagridSortDirection.ASCENDING\n \"\n :svg-title=\"t('sortColumnInDescendingOrder', { name: column.label })\"\n />\n <sort-descending-icon\n v-else-if=\"\n getSortingDirection(column.field) === BentoDatagridSortDirection.DESCENDING\n \"\n :svg-title=\"t('sortColumnInAscendingOrder', { name: column.label })\"\n />\n </template>\n </bento-toggle-button>\n </div>\n <bento-menu\n v-if=\"hasColumnPanel\"\n :ref=\"el => (contextMenuRef[column.field] = el)\"\n class=\"b-data-grid-columns__menu\"\n :class=\"conditionalColumnMenuClasses(column)\"\n disable-arrow-down-opening-menu\n :data=\"contextualMenuData(column)\"\n :menu-position=\"computeMenuPosition(hasFirstColumnPanelRightAligned, index)\"\n :menu-fixed-positioning=\"true\"\n :button=\"{ variant: 'tertiary', condensed: true }\"\n @open=\"$emit(DatagridColumnsEvent.COLUMN_MENU_OPEN)\"\n @close=\"$emit(DatagridColumnsEvent.COLUMN_MENU_CLOSE)\"\n />\n </div>\n </div>\n <div\n :data-testid=\"`data-grid-column-${column.field}`\"\n class=\"b-data-grid-columns__column-separator-container\"\n :class=\"conditionalColumnSeparatorClasses(column)\"\n role=\"presentation\"\n @mousedown=\"startResize(hasResizableColumns, column.field, $event)\"\n @click.stop\n >\n <div\n v-if=\"!isFrozenColumns || (isFrozenColumns && index !== columns.length - 1)\"\n class=\"b-data-grid-columns__column-separator\"\n ></div>\n </div>\n </template>\n </div>\n <template v-if=\"rowActionsMaximumWidth && !isFrozenColumns\">\n <div role=\"presentation\" class=\"b-data-grid-columns__row-actions-filler\"></div>\n <div\n :ref=\"el => registerColumnsRefs(el, DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME)\"\n :aria-label=\"t('rowActionsColumn')\"\n :aria-colindex=\"columns.length + 1\"\n class=\"b-data-grid-columns__column\"\n role=\"columnheader\"\n tabindex=\"0\"\n :style=\"{ minWidth: `${rowActionsMaximumWidth}px` }\"\n ></div>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\n import { computed, type ComputedRef, inject, type PropType, type Ref, ref, toRefs } from 'vue';\n import { BentoCheckbox } from '@/components/checkbox';\n import {\n type BentoColumn,\n type BentoColumnWidthOverridesLookup,\n type BentoDatagridAllItemsSelectedState,\n BentoDatagridAriaSortValue,\n type BentoDatagridSortByColumn,\n BentoDatagridSortDirection,\n type BentoDataGridVisibleRowsState,\n } from '../../data-grid.types';\n import { BentoTypography } from '@/components/typography';\n import {\n DATAGRID_ACTIONS_COLUMN_FIELD_NAME,\n DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME,\n useResizer,\n useSorter,\n } from '../../composables';\n import { focusOnInteractiveChild } from '../../utils';\n import { BentoInfoIcon } from '@/components/info-icon';\n import {\n type BentoDatagridColumnSelectionState,\n type BentoDatagridDraggingColumnState,\n DatagridColumnsEvent,\n type DatagridColumnsHeaderReferences,\n } from './data-grid-columns.types';\n import { BentoMenu } from '@/components/menu';\n import { BentoToggleButton } from '@/components/button';\n import { DecorativeCheckbox } from '@/internal/decorative-checkbox';\n import { useI18n } from '@/utils/ts/i18n';\n import type { BentoMenuItem } from '@/components/menu/components';\n import type { DatagridColumnHoveringState } from '@/components/data-grid/composables/use-column-hovering/use-column-hovering.types';\n import { BentoPopoverPositions } from '@/components/popover/popover.types';\n import ArrowUpAndDownSortIcon from '@adyen/ui-assets-icons-16/vue/arrow-up-down-sort';\n import ArrowLeftIcon from '@adyen/ui-assets-icons-16/vue/arrow-left';\n import ArrowRightIcon from '@adyen/ui-assets-icons-16/vue/arrow-right';\n import FreezeIcon from '@adyen/ui-assets-icons-16/vue/freeze';\n import HideIcon from '@adyen/ui-assets-icons-16/vue/hide';\n import SortAscendingIcon from '@adyen/ui-assets-icons-16/vue/sort-ascending';\n import SortDescendingIcon from '@adyen/ui-assets-icons-16/vue/sort-descending';\n import ShowIcon from '@adyen/ui-assets-icons-16/vue/show';\n import TriangleDown from '@adyen/ui-assets-icons-16/vue/triangle-down';\n import messages from './messages.json';\n import { DATA_GRID_SMALL_CONTAINER, DATA_GRID_TOUCH_DEVICE } from '@/components/data-grid/data-grid.keys';\n\n type MessageSchema = (typeof messages)['en-US'];\n\n const props = defineProps({\n /**\n * Column definitions using 'key' to relate to data object.\n */\n columns: {\n type: Array as PropType<Array<BentoColumn>>,\n required: true,\n },\n\n /**\n * Columns being dragged, contains dragging column and a target column\n */\n draggingColumns: {\n type: Object as PropType<BentoDatagridDraggingColumnState>,\n default: undefined,\n },\n\n /**\n * Determines the state of the current results: { filtered: boolean, allItemsVisible: boolean } to render the correct select all menu options\n */\n visibleRowsState: {\n type: Object as PropType<BentoDataGridVisibleRowsState>,\n default: undefined,\n },\n\n /**\n * Toggle the columns draggable events.\n */\n hasDraggableColumns: {\n type: Boolean,\n default: true,\n },\n\n /**\n * If resize is enabled\n */\n hasResizableColumns: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Signifies if the column panel is enabled.\n */\n hasColumnPanel: {\n type: Boolean,\n default: false,\n },\n\n /**\n * If set to true, aligns the first column panel to the right of its button.\n */\n hasFirstColumnPanelRightAligned: {\n type: Boolean,\n default: false,\n },\n\n /**\n * If the data grid has overflow on the left side\n */\n hasLeftOverflow: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The column hovered over state and whether the hovered over column should show a border right or left.\n */\n hoveredOverColumnState: {\n type: Object as PropType<DatagridColumnHoveringState>,\n required: true,\n },\n\n /**\n * Toggled to true when the DataGrid has auto width columns and is measuring the\n */\n isMeasuringColumnWidths: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Used to disable hiding the last visible column.\n */\n isOnlyOneVisibleColumn: {\n type: Boolean,\n default: false,\n },\n\n /**\n * If these columns are frozen (pinned) columns\n */\n isFrozenColumns: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Show frozen columns separator\n */\n showFrozenColumnsSeparator: {\n type: Boolean,\n default: false,\n },\n /**\n * The column all items selected state\n */\n allItemsSelectedState: {\n type: Object as PropType<BentoDatagridAllItemsSelectedState>,\n default: undefined,\n },\n\n /**\n * Determines if the user has enabled row selection\n */\n selectable: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Adds an extra option when selecting all, to select items in other pages too\n */\n selectableAcrossPages: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines which state of row selection is currently active. Used to display the \"Select all\" menu options.\n */\n selectionState: {\n type: String as PropType<BentoDatagridColumnSelectionState>,\n default: undefined,\n },\n\n /**\n * Sortby handles proper rendering of sort icon in header. Sorting currently is only supported server side.\n * It does make sure the currently sorted column has a more visible sort icon, and the sort icon points in the right direction.\n */\n sortBy: {\n type: Array as PropType<Array<BentoDatagridSortByColumn>>, // NOTE: is an array to allow multi-sorting in the future\n default: () => [],\n },\n\n /**\n * Truncates all data grid column headers\n */\n truncateColumnHeaders: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The maximum width of the row actions in all rows\n */\n rowActionsMaximumWidth: {\n type: Number,\n default: 0,\n },\n });\n\n const emit = defineEmits([\"sort\", \"column-hover\"]);\n\n const CLOSING_CONTEXTUAL_MENU_DELAY_MS = 100;\n const { t } = useI18n<{ message: MessageSchema }>({ messages });\n const { columns, sortBy } = toRefs(props);\n const allColumnsRef = ref<HTMLDivElement>();\n const columnHeaderRefs = ref<DatagridColumnsHeaderReferences>({});\n const contextMenuRef = ref({});\n const hoveredColumnField = ref();\n const closingTimeOutId = ref();\n\n // Selecting\n const onAllRowSelect = (areAllItemsSelected: boolean) =>\n emit(DatagridColumnsEvent.SELECT_ALL_ROWS, areAllItemsSelected);\n const isActionsColumn = (column: BentoColumn) => column.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME;\n const isAllSelectionState = computed(() => props.selectionState === 'all');\n\n // Select all menu\n const selectAllMenu = computed(() =>\n [\n {\n text: t('selectPage') as string,\n handler: () => onAllRowSelect(true),\n disabled: props.selectionState === 'page' || props.selectionState === 'all',\n },\n props.visibleRowsState?.filtered\n ? {\n text: t('selectAllCurrentResults') as string,\n handler: () => emit(DatagridColumnsEvent.SELECT_ALL_CURRENT_RESULTS),\n addDivider: props.selectionState !== 'none',\n disabled: props.selectionState === 'all',\n }\n : {\n text: t('selectAll') as string,\n handler: () => emit(DatagridColumnsEvent.SELECT_ALL_ACROSS_PAGES),\n addDivider: props.selectionState !== 'none',\n disabled: props.selectionState === 'all',\n },\n props.selectionState !== 'none' && {\n text: t('deselectPage') as string,\n handler: () => onAllRowSelect(false),\n addDivider: !props.visibleRowsState?.filtered, // otherwise divider shown in deselect all in current results\n disabled: props.selectionState === 'unselected-page',\n },\n props.visibleRowsState?.filtered &&\n props.selectionState !== 'none' && {\n text: t('deselectAllCurrentResults') as string,\n handler: () => emit(DatagridColumnsEvent.DESELECT_ALL_CURRENT_RESULTS),\n addDivider: true,\n disabled: props.selectionState === 'unselected-page' && props.visibleRowsState.allRowsVisible,\n },\n props.selectionState !== 'none' && {\n text: t('deselectAll') as string,\n handler: () => emit(DatagridColumnsEvent.DESELECT_ALL),\n },\n ].filter(Boolean)\n );\n\n // Resizing\n const { startResize, isResizing, columnHoverEventToEmitAfterResizing } = useResizer(columns, emit);\n\n // Sorting\n const { isSorting, getSortingDirection, sortByColumnField } = useSorter(sortBy, columns, emit);\n const getSortingColumnDirection = (column: BentoColumn): BentoDatagridAriaSortValue => {\n if (!column.sortable) {\n return null;\n }\n\n const sortingDirection = props.sortBy.find(({ field }) => field === column.field)?.direction;\n\n if (!sortingDirection) {\n return BentoDatagridAriaSortValue.NONE;\n }\n\n const ariaSortingDirectionMap: { [key in BentoDatagridSortDirection]: BentoDatagridAriaSortValue } = {\n [BentoDatagridSortDirection.ASCENDING]: BentoDatagridAriaSortValue.ASCENDING,\n [BentoDatagridSortDirection.DESCENDING]: BentoDatagridAriaSortValue.DESCENDING,\n };\n\n return ariaSortingDirectionMap[sortingDirection];\n };\n\n // Dragging emit events and methods\n const draggingEventsForColumn = computed(() => (column: BentoColumn) => {\n if (!props.hasDraggableColumns) {\n return {};\n }\n\n return {\n dragstart: (e: DragEvent & Event) => {\n emit(DatagridColumnsEvent.COLUMN_DRAG_START, column, e);\n },\n dragover: (e: DragEvent) => {\n e.preventDefault();\n },\n dragenter: (e: DragEvent) => {\n e.preventDefault();\n emit(DatagridColumnsEvent.COLUMN_DRAG_ENTER, column, e);\n },\n drop: () => {\n emit(DatagridColumnsEvent.COLUMN_DROP, column);\n },\n dragend: () => {\n emit(DatagridColumnsEvent.COLUMN_DRAG_END);\n },\n };\n });\n\n // Contextual menu (moving, visiblity and freezing)\n const contextualMenuData = computed<(col: BentoColumn) => Array<BentoMenuItem>>(\n () => (column: BentoColumn) =>\n [\n {\n text: t('moveColumnLeft') as string,\n handler: () => emit(DatagridColumnsEvent.COLUMN_MOVE, column, -1),\n icon: ArrowLeftIcon,\n disabled: props.columns[0].field === column.field,\n },\n {\n text: t('moveColumnRight') as string,\n handler: () => emit(DatagridColumnsEvent.COLUMN_MOVE, column, 1),\n icon: ArrowRightIcon,\n disabled: props.columns[props.columns.length - 1].field === column.field,\n },\n !isSmallContainer.value && {\n text: (column?.frozen ? t('unfreezeColumn') : t('freezeColumn')) as string,\n handler: () => emit(DatagridColumnsEvent.COLUMN_UPDATE, { ...column, frozen: !column?.frozen }),\n icon: FreezeIcon,\n },\n {\n text: (column?.visible !== false ? t('hideColumn') : t('showColumn')) as string,\n handler: () => {\n emit(DatagridColumnsEvent.COLUMN_UPDATE, {\n ...column,\n visible: !(column?.visible !== false),\n });\n },\n icon: column?.visible !== false ? HideIcon : ShowIcon,\n disabled: column?.mandatory || (column?.visible !== false && props.isOnlyOneVisibleColumn),\n },\n ].filter(Boolean)\n );\n const showContextualMenu = (column: BentoColumn) => {\n hoveredColumnField.value = column.field;\n if (closingTimeOutId.value) {\n clearTimeout(closingTimeOutId.value);\n }\n };\n const hideContextualMenu = (column: BentoColumn) => {\n // We want to delay closing for a couple of seconds so\n // it doesn't flicker if a user hovers over the icon and then inside the popover.\n const timeOutId = setTimeout(() => {\n if (column.field === hoveredColumnField.value) {\n hoveredColumnField.value = '';\n }\n }, CLOSING_CONTEXTUAL_MENU_DELAY_MS);\n closingTimeOutId.value = timeOutId;\n };\n\n /**\n * Generates events for a Datagrid Column.\n * @param column - the BentoColumn we are attaching events onto.\n */\n const dataGridColumnEvents = (column: BentoColumn) => {\n let events: { [eventName: string]: (e: Event) => void } = {\n mouseenter: () => {\n showContextualMenu(column);\n if (!isResizing.value) {\n emit('column-hover', column);\n } else {\n columnHoverEventToEmitAfterResizing.value = column;\n }\n },\n mouseleave: () => {\n hideContextualMenu(column);\n if (!isResizing.value) {\n emit('column-hover', null);\n } else {\n columnHoverEventToEmitAfterResizing.value = null;\n }\n },\n focus: () => {\n showContextualMenu(column);\n if (isActionsColumn(column)) {\n focusOnInteractiveChild(columnHeaderRefs.value[column.field]);\n }\n },\n focusout: (e: FocusEvent) => {\n if (!allColumnsRef.value?.contains(e?.relatedTarget as Node)) {\n hideContextualMenu(column);\n }\n },\n };\n if (!isActionsColumn(column)) {\n events = {\n ...events,\n ...draggingEventsForColumn.value(column),\n };\n }\n return events;\n };\n\n const hasColumnActions = (column: BentoColumn) => column.infoIconTooltip || column.sortable || props.hasColumnPanel;\n\n const registerColumnsRefs = (el: unknown, field: string) => {\n if (columnHeaderRefs.value?.[field] === undefined) {\n columnHeaderRefs.value = { ...columnHeaderRefs.value, [field]: null };\n }\n if (el !== null) {\n columnHeaderRefs.value[field] = el as HTMLDivElement;\n }\n };\n\n const isSmallContainer: ComputedRef<boolean> = inject(\n DATA_GRID_SMALL_CONTAINER,\n computed(() => false)\n );\n\n const isTouchDevice: Ref<boolean> = inject(DATA_GRID_TOUCH_DEVICE, ref(false));\n\n // Conditional column styles\n // Conditional styles\n const conditionalColumnsClasses = computed(() => {\n const defaultConditionalClasses = {\n 'b-data-grid-columns--is-measuring': props.isMeasuringColumnWidths,\n };\n return columns.value[0]?.frozen && !isSmallContainer.value\n ? {\n ...defaultConditionalClasses,\n 'b-data-grid-columns--frozen': true,\n 'b-data-grid-columns--frozen-separator': props.showFrozenColumnsSeparator,\n 'b-data-grid-columns--overflow-shadow-left': props.hasLeftOverflow,\n }\n : {\n ...defaultConditionalClasses,\n 'b-data-grid-columns--unfrozen': true,\n };\n });\n const conditionalSelectColumnClasses = computed(() => ({\n 'b-data-grid-columns__select-column--all': props.selectableAcrossPages,\n }));\n\n const computeMenuPosition = (hasFirstColumnPanelRightAligned, index) =>\n hasFirstColumnPanelRightAligned && index === 0\n ? BentoPopoverPositions.BOTTOM_START\n : BentoPopoverPositions.BOTTOM_END;\n\n const conditionalColumnClasses = (column: BentoColumn, columnIndex: number) => ({\n 'b-data-grid-columns__column--column-hovered':\n column.field === props.hoveredOverColumnState.hoveredOverColumnField,\n 'b-data-grid-columns__column--column-hovered-no-border-left':\n column.field === props.hoveredOverColumnState.hoveredOverColumnField &&\n props.hoveredOverColumnState.noBorderLeft,\n 'b-data-grid-columns__column--column-hovered-no-border-right':\n column.field === props.hoveredOverColumnState.hoveredOverColumnField &&\n props.hoveredOverColumnState.noBorderRight,\n 'b-data-grid-columns__column--last-frozen-frozen-column':\n props.isFrozenColumns && columnIndex === columns.value.length - 1,\n 'b-data-grid-columns__column--sortable': column.sortable,\n 'b-data-grid-columns__column--padding-left-unset': column?.padding?.left === false,\n 'b-data-grid-columns__column--padding-right-unset': column?.padding?.right === false,\n 'b-data-grid-columns__column--numeric': column?.numeric,\n 'b-data-grid-columns__column--frozen': column?.frozen,\n 'b-data-grid-columns__column--is-re-ordering': column?.field === props.draggingColumns?.dragging?.field,\n 'b-data-grid-columns__column--is-re-ordering-target-left':\n column?.field === props.draggingColumns?.target?.field && props.draggingColumns?.dragToLeft,\n 'b-data-grid-columns__column--is-re-ordering-target-right':\n column?.field === props.draggingColumns?.target?.field && !props.draggingColumns?.dragToLeft,\n 'b-data-grid-columns__column--with-sorting-or-column-panel':\n column.sortable || column.infoIconTooltip || props.hasColumnPanel || props.selectableAcrossPages,\n 'b-data-grid-columns--small-container': isSmallContainer.value,\n });\n\n const conditionalColumnHeaderAndActionsClasses = (column: BentoColumn) => ({\n 'b-data-grid-columns__column-header-and-actions--numeric': column?.numeric,\n });\n\n const conditionalColumnActionsClasses = (column: BentoColumn) => ({\n 'b-data-grid-columns__column-actions--numeric': column?.numeric,\n });\n\n const conditionalColumnSeparatorClasses = (column: BentoColumn) => ({\n 'b-data-grid-columns__column-separator-container--is-resizeable': props.hasResizableColumns,\n 'b-data-grid-columns__column-separator-container--is-offset':\n props.hoveredOverColumnState.hoveredOverColumnField === column.field &&\n props.hoveredOverColumnState.isSeparatorOffset,\n });\n\n const conditionalColumnHeaderClasses = computed(() => ({\n 'b-data-grid-columns__column-header--truncated': props.truncateColumnHeaders,\n }));\n\n const conditionalColumnMenuClasses = (column: BentoColumn) => ({\n 'b-data-grid-columns__menu--hovered': hoveredColumnField.value === column.field || isTouchDevice.value,\n });\n\n // Exposed refs\n defineExpose({\n columnHeaderRefs,\n });\n</script>\n\n<script lang=\"ts\">\n /**\n * A component to display the BentoDataGrid columns\n *\n * @example\n *\n * export default {\n * components: { DataGridColumns },\n * template: `\n * <data-grid-columns\n * v-if=\"columnSet?.length\"\n * :key=\"`data-grid-columns-${id}`\"\n * :columns=\"columnSet\"\n * :has-resizable-columns=\"hasResizableColumns\"\n * :sort-by=\"sortBy\"\n * :all-items-selected-state=\"allItemsSelectedState\"\n * :is-frozen-columns=\"isFrozenColumns\"\n * :show-frozen-columns-separator=\"showFrozenColumnsSeparator\"\n * :dragging-columns=\"draggingColumns\"\n * :has-draggable-columns=\"allowColumnDragAndDrop\"\n * :has-column-panel=\"columnPanel\"\n * :has-left-overflow=\"hasLeftOverflow\"\n * :has-first-column-panel-right-aligned=\"index === computedColumnPanelAlignment\"\n * :is-only-one-visible-column=\"isOnlyOneVisibleColumn\"\n * :selectable=\"selectable\"\n * :selectable-across-pages=\"selectableAcrossPagesComputed\"\n * :truncate-column-headers=\"truncateColumnHeaders\"\n * v-on=\"draggingEventsForColumns\"\n * @column-move=\"onMoveColumnByOffset\"\n * @column-update=\"onConfigSettingsColumnUpdate\"\n * @column-resize=\"onColumnResized\"\n * @column-resizing=\"onColumnWidthOverride\"\n * @select-all-rows=\"onAllRowSelect\"\n * @select-all-across-pages=\"emit(BentoDatagridEvent.SELECT_ALL_ACROSS_PAGES)\"\n * @sort=\"onSort\"\n * >\n * <template v-for=\"(_, innerSlot) of slots\" #[innerSlot]=\"scope\">\n * <slot :name=\"innerSlot\" v-bind=\"scope\" />\n * </template>\n * </data-grid-columns>\n * `\n * }\n */\n export default {\n i18n: { messages },\n name: 'data-grid-columns',\n };\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-columns.scss\" />\n","/**\n * All the emit events provided by the DatagridConfigSettings component\n */\nexport enum DatagridConfigSettingsEvent {\n UPDATE_CONDENSED = 'update:condensed',\n UPDATE_COLUMNS = 'update:columns',\n UPDATE_ZEBRA_ROWS = 'update:zebra-rows',\n}\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><g fill=\"#001222\" :clip-path=\"'url(#uia-ui-assets/icons-16-settings__a' + uuid + ')'\"><path d=\"M8 5.25C6.48122 5.25 5.25 6.48122 5.25 8C5.25 9.51878 6.48122 10.75 8 10.75C9.51878 10.75 10.75 9.51878 10.75 8C10.75 6.48122 9.51878 5.25 8 5.25ZM6.75 8C6.75 7.30964 7.30964 6.75 8 6.75C8.69036 6.75 9.25 7.30964 9.25 8C9.25 8.69036 8.69036 9.25 8 9.25C7.30964 9.25 6.75 8.69036 6.75 8Z\"/><path d=\"M6.84701 0.973015L6.59985 0.35083L5.9537 0.526056C4.64534 0.880867 3.48225 1.56808 2.55285 2.48641L2.07533 2.95826L2.49158 3.48495C2.79648 3.87074 2.85279 4.419 2.58992 4.87589C2.32905 5.32931 1.82436 5.55631 1.33473 5.48726L0.677319 5.39455L0.505539 6.03586C0.33838 6.65992 0.25 7.32519 0.25 7.99991C0.25 8.67463 0.33838 9.3399 0.505539 9.96396L0.677319 10.6053L1.33473 10.5126C1.82436 10.4435 2.32905 10.6705 2.58992 11.1239C2.85279 11.5808 2.79648 12.1291 2.49158 12.5149L2.07533 13.0416L2.55285 13.5134C3.48225 14.4317 4.64534 15.119 5.9537 15.4738L6.59985 15.649L6.84701 15.0268C7.02659 14.5748 7.47549 14.2499 8 14.2499C8.52452 14.2499 8.97341 14.5748 9.15299 15.0268L9.40016 15.649L10.0463 15.4738C11.3547 15.119 12.5177 14.4317 13.4471 13.5134L13.9247 13.0416L13.5084 12.5149C13.2035 12.1291 13.1472 11.5808 13.4101 11.1239C13.671 10.6705 14.1756 10.4435 14.6653 10.5126L15.3227 10.6053L15.4945 9.96396C15.6616 9.3399 15.75 8.67463 15.75 7.99991C15.75 7.32519 15.6616 6.65992 15.4945 6.03586L15.3227 5.39455L14.6653 5.48726C14.1756 5.55631 13.671 5.32931 13.4101 4.87589C13.1472 4.419 13.2035 3.87074 13.5084 3.48495L13.9247 2.95826L13.4471 2.48641C12.5177 1.56808 11.3547 0.880867 10.0463 0.526056L9.40016 0.35083L9.15299 0.973015C8.97341 1.42506 8.52452 1.74991 8 1.74991C7.47549 1.74991 7.02659 1.42506 6.84701 0.973015ZM3.89008 5.62393C4.33946 4.84286 4.36394 3.9353 4.03405 3.16853C4.55803 2.73795 5.15349 2.39116 5.80146 2.14902C6.30062 2.81653 7.10051 3.24991 8 3.24991C8.89949 3.24991 9.69938 2.81653 10.1985 2.14902C10.8465 2.39116 11.442 2.73795 11.966 3.16853C11.6361 3.9353 11.6605 4.84287 12.1099 5.62393C12.5612 6.40839 13.3382 6.88092 14.1658 6.97982C14.221 7.31075 14.25 7.65319 14.25 7.99991C14.25 8.34663 14.221 8.68908 14.1658 9.02001C13.3382 9.11891 12.5612 9.59143 12.1099 10.3759C11.6605 11.157 11.6361 12.0645 11.9659 12.8313C11.442 13.2619 10.8465 13.6087 10.1985 13.8508C9.69938 13.1833 8.89949 12.7499 8 12.7499C7.10051 12.7499 6.30062 13.1833 5.80146 13.8508C5.15349 13.6087 4.55803 13.2619 4.03405 12.8313C4.36394 12.0645 4.33946 11.157 3.89008 10.3759C3.43875 9.59143 2.66177 9.1189 1.8342 9.02C1.77896 8.68908 1.75 8.34663 1.75 7.99991C1.75 7.65319 1.77896 7.31074 1.8342 6.97982C2.66177 6.88092 3.43875 6.40839 3.89008 5.62393Z\"/></g><defs><clipPath :id=\"'uia-ui-assets/icons-16-settings__a' + uuid\"><rect width=\"16\" height=\"16\" fill=\"#fff\"/></clipPath></defs></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","<template>\n <div class=\"b-data-grid-config-settings-column-row\" @mouseover=\"showFreezeIcon\" @mouseleave=\"hideFreezeIcon\">\n <bento-toggle\n :aria-label=\"t('toggleColumnVisibility', { label: column.label })\"\n :disabled=\"isColumnVisibilityToggleDisabled\"\n label-position=\"after\"\n :value=\"isColumnVisible\"\n @input=\"toggleColumnVisibility\"\n >\n {{ column.label }}\n </bento-toggle>\n <bento-freeze-icon\n v-show=\"(isColumnFrozen || isFreezeIconOptionShown) && !isSmallContainer\"\n :aria-label=\"t('toggleColumnFreeze', { label: column.label })\"\n class=\"b-data-grid-config-settings-column-row__freeze-icon\"\n :class=\"freezeIconConditionalClasses\"\n @click.native=\"toggleColumnFreeze\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\n import { computed, type ComputedRef, defineComponent, inject, type PropType, ref } from 'vue';\n import { BentoToggle } from '@/components/toggle';\n import { useI18n } from '@/utils/ts/i18n';\n import { DATA_GRID_SMALL_CONTAINER } from '@/components/data-grid/data-grid.keys';\n import type { BentoColumn } from '@/components/data-grid/components/data-grid-columns/data-grid-columns.types';\n import BentoFreezeIcon from '@adyen/ui-assets-icons-16/vue/freeze';\n import messages from './messages.json';\n\n type MessageSchema = (typeof messages)['en-US'];\n\n export default defineComponent({\n i18n: { messages },\n name: 'bento-data-grid',\n components: {\n BentoFreezeIcon,\n BentoToggle,\n },\n props: {\n /**\n * Is column visibitlity toggle disabled\n */\n isColumnVisibilityToggleDisabled: {\n type: Boolean,\n required: true,\n },\n /**\n * Column definition\n */\n column: {\n type: Object as PropType<BentoColumn>,\n required: true,\n },\n },\n emits: ['visible-column', 'updated-column'],\n setup(props, { emit }) {\n const { t } = useI18n<{ message: MessageSchema }>({ messages });\n const isFreezeIconOptionShown = ref(false);\n const isColumnFrozen = computed(() => props.column?.frozen);\n const isColumnVisible = computed(() => props.column?.visible !== false);\n const isSmallContainer: ComputedRef<boolean> = inject(\n DATA_GRID_SMALL_CONTAINER,\n computed(() => false)\n );\n\n const toggleColumnVisibility = () => {\n emit('visible-column', { ...props.column, visible: !isColumnVisible.value });\n };\n\n const toggleColumnFreeze = () => {\n emit('updated-column', { ...props.column, frozen: !isColumnFrozen.value });\n };\n\n const showFreezeIcon = () => {\n if (!isColumnFrozen.value) {\n isFreezeIconOptionShown.value = true;\n }\n };\n\n const hideFreezeIcon = () => {\n if (!isColumnFrozen.value) {\n isFreezeIconOptionShown.value = false;\n }\n };\n\n const freezeIconConditionalClasses = computed(() => ({\n [`b-data-grid-config-settings-column-row__freeze-icon--frozen`]: isColumnFrozen.value,\n }));\n\n return {\n // Values\n isFreezeIconOptionShown,\n isColumnFrozen,\n freezeIconConditionalClasses,\n isColumnVisible,\n isSmallContainer,\n\n // Methods\n toggleColumnVisibility,\n showFreezeIcon,\n hideFreezeIcon,\n toggleColumnFreeze,\n\n // Translations\n t,\n };\n },\n });\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-config-settings-column-row.scss\" />\n","<!-- TODO: Remove aria props from search-bar as these name clashes with JSX type /vue/types/jsx.d.ts -->\n<!-- eslint-disable vue/attribute-hyphenation -->\n<template>\n <div v-bento-click-outside-directive=\"onClickOutside\" class=\"b-data-grid-config-settings\">\n <div class=\"b-data-grid-config-settings__button-and-separator\">\n <div ref=\"configSettingsButtonRef\" class=\"b-data-grid-config-settings__button-container\">\n <bento-toggle-button\n :aria-controls=\"isConfigSettingsPanelOpen ? popoverId : null\"\n variant=\"tertiary\"\n condensed\n :toggled=\"isConfigSettingsPanelOpen\"\n @click=\"setConfigSettingsPanelVisibility(!isConfigSettingsPanelOpen)\"\n >\n <template #iconLeft>\n <bento-settings-icon :svg-title=\"t('toggleConfigSettingsPanelVisibility')\" />\n </template>\n </bento-toggle-button>\n </div>\n </div>\n <bento-popover\n v-if=\"configSettingsButtonRef\"\n :id=\"popoverId\"\n :open=\"isConfigSettingsPanelOpen\"\n class=\"b-data-grid-config-settings__panel\"\n :aria-label=\"t('configSettingsPanel')\"\n :target-element=\"configSettingsButtonRef\"\n position=\"bottom-end\"\n >\n <div class=\"b-data-grid-config-settings__panel-header\">\n <bento-typography el=\"span\" strongest>\n {{ t('displayOptions') }}\n </bento-typography>\n <bento-button variant=\"tertiary\" @click=\"setConfigSettingsPanelVisibility(false)\">\n <template #iconLeft>\n <bento-cross-icon :svg-title=\"t('closeConfigSettingsPanel')\" />\n </template>\n </bento-button>\n </div>\n <div class=\"b-data-grid-config-settings__appearance\">\n <bento-typography class=\"b-data-grid-config-settings__appearance-title\" el=\"span\" stronger>\n {{ t('appearance') }}\n </bento-typography>\n <div class=\"b-data-grid-config-settings__appearance-button\">\n <bento-toggle\n label-position=\"after\"\n :aria-label=\"t('condensedToggle')\"\n :value=\"condensed\"\n @input=\"emitCondensedToggle\"\n >\n {{ t('condensed') }}\n </bento-toggle>\n </div>\n <div class=\"b-data-grid-config-settings__appearance-button\">\n <bento-toggle\n label-position=\"after\"\n :aria-label=\"t('zebraRowsToggle')\"\n :value=\"zebraRows\"\n @input=\"emitZebraRowsToggle\"\n >\n {{ t('zebraRows') }}\n </bento-toggle>\n </div>\n </div>\n <div class=\"b-data-grid-config-settings__column-visibility-settings\">\n <div class=\"b-data-grid-config-settings__column-visibility-header\">\n <bento-typography class=\"b-data-grid-config-settings__column-visibility-title\" el=\"span\" stronger>\n {{ t('columns') }}\n </bento-typography>\n <bento-button\n v-if=\"!isColumnVisibilityFilterShown\"\n ref=\"searchButtonRef\"\n variant=\"tertiary\"\n @click=\"toggleColumnFilter\"\n >\n <template #iconLeft><bento-search-icon /> </template>{{ t('search') }}</bento-button\n >\n <bento-button v-else variant=\"tertiary\" @click=\"toggleColumnFilter\">\n <template #iconLeft>\n <bento-cross-icon />\n </template>\n {{ t('closeSearch') }}\n </bento-button>\n </div>\n <div v-if=\"isColumnVisibilityFilterShown\" class=\"b-data-grid-config-settings__column-visibility-search\">\n <bento-search-bar\n ref=\"searchBarRef\"\n :value=\"searchTerm\"\n :input-field-aria-label=\"t('columnVisibilitySearchFilter').toString()\"\n @input=\"searchTerm = $event\"\n @clear=\"clearAction\"\n @escape-pressed=\"toggleColumnFilter\"\n />\n </div>\n <div v-else class=\"b-data-grid-config-settings__column-visibility-show-all\">\n <bento-toggle\n label-position=\"after\"\n :value=\"allColumnsVisbilityToggleState\"\n @input=\"toggleAllColumnVisibility\"\n >\n {{ t('showAllColumns', { numberOfColumns: columns.length }) }}\n </bento-toggle>\n </div>\n <div class=\"b-data-grid-config-settings__column-visibility-toggles\">\n <div v-for=\"column of filteredColumnVisibilityColumns\" :key=\"column.field\">\n <bento-data-grid-config-settings-config-row\n v-if=\"column.field !== DATAGRID_ACTIONS_COLUMN_FIELD_NAME\"\n :column=\"column\"\n :is-column-visibility-toggle-disabled=\"isColumnVisibilityToggleDisabled(column)\"\n @visible-column=\"emitVisibleColumns\"\n @updated-column=\"emitFrozenColumns\"\n />\n </div>\n <bento-typography\n v-if=\"filteredColumnVisibilityColumns.length === 0\"\n el=\"span\"\n class=\"b-data-grid-config-settings__column-visibility-empty-search-message\"\n >\n {{ t('noColumnsMatch') }}\n </bento-typography>\n </div>\n </div>\n </bento-popover>\n </div>\n</template>\n\n<script lang=\"ts\">\n import { computed, defineComponent, nextTick, type PropType, ref, toRef } from 'vue';\n import { BentoPopover } from '@/components/popover';\n import { BentoButton, BentoToggleButton } from '@/components/button';\n import { BentoTypography } from '@/components/typography';\n import { BentoToggle } from '@/components/toggle';\n import { type BentoColumn } from '../../data-grid.types';\n import BentoSearchBar from '@/components/search-bar/search-bar.vue';\n import { BentoClickOutsideDirective } from '@/directives';\n import { DatagridConfigSettingsEvent } from './data-grid-config-settings.types';\n import { useSearchBarFilter } from '@/components/search-bar';\n import { generateUid } from '@/core/utils/ts';\n import { DATAGRID_ACTIONS_COLUMN_FIELD_NAME } from '../../composables';\n import { useI18n } from '@/utils/ts/i18n';\n\n import BentoSettingsIcon from '@adyen/ui-assets-icons-16/vue/settings';\n import BentoCrossIcon from '@adyen/ui-assets-icons-16/vue/cross';\n import BentoSearchIcon from '@adyen/ui-assets-icons-16/vue/search';\n import BentoDataGridConfigSettingsConfigRow from './components/data-grid-config-settings-column-row/data-grid-config-settings-column-row.vue';\n import messages from './messages.json';\n\n type MessageSchema = (typeof messages)['en-US'];\n\n export default defineComponent({\n i18n: { messages },\n name: 'bento-data-grid',\n components: {\n BentoButton,\n BentoCrossIcon,\n BentoPopover,\n BentoSettingsIcon,\n BentoToggleButton,\n BentoDataGridConfigSettingsConfigRow,\n BentoSearchBar,\n BentoSearchIcon,\n BentoToggle,\n BentoTypography,\n },\n directives: { BentoClickOutsideDirective },\n props: {\n /**\n * Column definitions\n */\n columns: {\n type: Array as PropType<Array<BentoColumn>>,\n required: true,\n },\n\n /**\n * Sets the row cells to the condensed padding state.\n */\n condensed: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Sets a different background color for even rows.\n */\n zebraRows: {\n type: Boolean,\n default: false,\n },\n },\n emits: [\n DatagridConfigSettingsEvent.UPDATE_CONDENSED,\n DatagridConfigSettingsEvent.UPDATE_COLUMNS,\n DatagridConfigSettingsEvent.UPDATE_ZEBRA_ROWS,\n ],\n setup(props, { emit }) {\n const { t } = useI18n<{ message: MessageSchema }>({ messages });\n const configSettingsButtonRef = ref(null);\n const popoverId = generateUid('data-grid-config-settings-popover');\n const searchBarRef = ref(null);\n const isConfigSettingsPanelOpen = ref<boolean>(false);\n const allColumnsVisbilityToggleState = ref<boolean>(true);\n const searchButtonRef = ref(null);\n const searchTerm = ref<string>('');\n const columnsRef = toRef(props, 'columns');\n const isColumnVisibilityFilterShown = ref<boolean>(false);\n\n // Column Visibility Filtering\n const filteredColumnVisibilityColumns = useSearchBarFilter<BentoColumn>(searchTerm, columnsRef);\n const clearAction = () => {\n searchTerm.value = '';\n };\n const areAllNonMandatoryColumnsHidden = computed(\n () => !props.columns.some(col => col.visible === false && !col.mandatory)\n );\n const toggleColumnFilter = () => {\n clearAction();\n isColumnVisibilityFilterShown.value = !isColumnVisibilityFilterShown.value;\n if (isColumnVisibilityFilterShown.value) {\n nextTick(() => searchBarRef.value.$refs.bentoInputField?.focusInput());\n } else {\n nextTick(() => searchButtonRef?.value?.$el?.focus());\n }\n allColumnsVisbilityToggleState.value = areAllNonMandatoryColumnsHidden.value;\n };\n\n // Column visibility\n const isColumnVisibilityToggleDisabled = (column: BentoColumn) => column.mandatory ?? false;\n\n const emitVisibleColumns = (updatedColumn: BentoColumn) => {\n const updatedColumns = props.columns.map(col => ({\n ...col,\n visible: updatedColumn.field === col.field ? updatedColumn.visible : col.visible,\n }));\n\n emit(DatagridConfigSettingsEvent.UPDATE_COLUMNS, updatedColumns);\n };\n\n const toggleAllColumnVisibility = (toggleState: boolean) => {\n if (toggleState) {\n // Show all columns\n emit(\n DatagridConfigSettingsEvent.UPDATE_COLUMNS,\n props.columns.map(col => ({ ...col, visible: true }))\n );\n } else {\n // Hide all columns except for mandatory columns\n emit(\n DatagridConfigSettingsEvent.UPDATE_COLUMNS,\n props.columns.map(col => ({ ...col, visible: col?.mandatory === true }))\n );\n }\n };\n\n // Column freeze\n // TODO to convert this function to 'emitUpdatedColumns', that will emit both: visible and frozen columns\n const emitFrozenColumns = (updatedColumn: BentoColumn) => {\n const updatedColumns = props.columns.map(col => ({\n ...col,\n frozen: updatedColumn.field === col.field ? !!updatedColumn?.frozen : !!col?.frozen,\n }));\n\n emit(DatagridConfigSettingsEvent.UPDATE_COLUMNS, updatedColumns);\n };\n\n // Panel visibility\n const setConfigSettingsPanelVisibility = (isVisible: boolean) => {\n isConfigSettingsPanelOpen.value = isVisible;\n allColumnsVisbilityToggleState.value = areAllNonMandatoryColumnsHidden.value;\n };\n const onClickOutside = () => setConfigSettingsPanelVisibility(false);\n // Condensed view\n const emitCondensedToggle = (isCondensedView: boolean) =>\n emit(DatagridConfigSettingsEvent.UPDATE_CONDENSED, isCondensedView);\n\n const emitZebraRowsToggle = (isZebraRows: boolean) =>\n emit(DatagridConfigSettingsEvent.UPDATE_ZEBRA_ROWS, isZebraRows);\n\n return {\n // Values\n configSettingsButtonRef,\n popoverId,\n isConfigSettingsPanelOpen,\n allColumnsVisbilityToggleState,\n filteredColumnVisibilityColumns,\n searchTerm,\n isColumnVisibilityFilterShown,\n searchBarRef,\n searchButtonRef,\n DATAGRID_ACTIONS_COLUMN_FIELD_NAME,\n\n // Methods\n setConfigSettingsPanelVisibility,\n emitCondensedToggle,\n toggleAllColumnVisibility,\n clearAction,\n toggleColumnFilter,\n emitVisibleColumns,\n emitFrozenColumns,\n onClickOutside,\n isColumnVisibilityToggleDisabled,\n emitZebraRowsToggle,\n\n // Translations\n t,\n };\n },\n });\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-config-settings.scss\" />\n","<template>\n <div class=\"b-data-grid-lazy-load\">\n <bento-loading-indicator v-if=\"loading && isInfiniteScroll\" />\n <bento-loading-button\n v-if=\"loading && !isInfiniteScroll\"\n variant=\"secondary\"\n :state=\"BentoLoadingButtonState.LOADING\"\n >{{ t('loading') }}</bento-loading-button\n >\n <bento-loading-button\n v-if=\"!loading && !isInfiniteScroll\"\n :state=\"BentoLoadingButtonState.START\"\n variant=\"secondary\"\n @click=\"$emit(BentoDatagridEvent.UPDATE_SHOW_MORE)\"\n >{{ t('showMore') }}</bento-loading-button\n >\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { BentoLoadingButton, BentoLoadingButtonState } from '@/components/button';\n import { BentoLoadingIndicator } from '@/components/loading-indicator';\n import { BentoDatagridEvent } from '../../data-grid.types';\n import { useI18n } from '@/utils/ts/i18n';\n import messages from '../../messages.json';\n\n type MessageSchema = (typeof messages)['en-US'];\n\n defineProps({\n loading: { type: Boolean },\n isInfiniteScroll: { type: Boolean }\n});\n\n const { t } = useI18n<{ message: MessageSchema }>({ messages });\n</script>\n\n<script lang=\"ts\">\n /**\n * Internal component to display the bento-data-grid's lazy loading.\n * The component can render a 'Show more' loading button or a loading indicator.\n */\n export default {\n i18n: { messages },\n };\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-lazy-load.scss\" />\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><path fill=\"#001222\" d=\"M9.38867 2.21717C10.4626 1.14323 12.2044 1.14323 13.2783 2.21717L13.7832 2.72205C14.857 3.79601 14.8571 5.53782 13.7832 6.6117L5.64355 14.7504H1.25V10.3558L9.38867 2.21717ZM2.75 10.9769V13.2504H5.02246L11.2715 6.9994L8.99902 4.72693L2.75 10.9769ZM12.2168 3.27772C11.7286 2.78987 10.9373 2.78967 10.4492 3.27772L10.0596 3.66639L12.332 5.93885L12.7217 5.55018C13.2098 5.06203 13.2098 4.27076 12.7217 3.7826L12.2168 3.27772Z\"/></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","<template>\n <Transition name=\"b-data-grid-cell-actions__animation\" appear>\n <div class=\"b-data-grid-cell-actions\">\n <div\n v-if=\"showGradientElement && !isTouchDevice\"\n class=\"b-data-grid-cell-actions__background-gradient\"\n :class=\"conditionalCellActionsBackgroundGradientClasses\"\n ></div>\n <div class=\"b-data-grid-cell-actions__actions\" :class=\"conditionalCellActionsClasses\" role=\"group\">\n <div\n v-for=\"(button, index) in computedCellActions\"\n :key=\"index\"\n class=\"b-data-grid-cell-actions__action\"\n >\n <bento-menu\n v-if=\"button.menuData\"\n :data=\"transformMenuEvents(button.menuData)\"\n :button=\"{\n condensed: true,\n variant: 'secondary',\n disabled: button.disabled,\n }\"\n :disable-arrow-down-opening-menu=\"disableArrowDownOpeningMenu\"\n :teleport=\"teleportMenu\"\n @open=\"emit('menu-open')\"\n @close=\"emit('menu-close')\"\n @menu-item-click=\"emit('menu-item-click')\"\n >\n <template v-if=\"shouldShowMenuIconLeft(button)\" #iconLeft>\n <options-vertical-icon\n v-if=\"button?.variant === 'more'\"\n :svg-title=\"getButtonTitle(button, true)\"\n />\n <component :is=\"button.iconLeft\" v-else :svg-title=\"getButtonTitle(button, true)\" />\n </template>\n <template v-if=\"!button?.isShort\" #default>\n {{ getButtonTitle(button) }}\n </template>\n </bento-menu>\n <copy\n v-else-if=\"button.variant === 'copy'\"\n :text=\"getCopyText(button)\"\n :button-text=\"getButtonTitle(button)\"\n :button=\"{\n condensed: true,\n variant: 'secondary',\n }\"\n />\n <bento-button\n v-else\n condensed\n variant=\"secondary\"\n :critical=\"button.critical\"\n :disabled=\"button.disabled\"\n :link=\"button.link\"\n v-on=\"generateButtonEvents(button)\"\n >\n <template v-if=\"button.iconLeft || button.variant === 'edit'\" #iconLeft>\n <edit1-icon v-if=\"button?.variant === 'edit'\" :svg-title=\"getButtonTitle(button, true)\" />\n <component :is=\"button.iconLeft\" v-else :svg-title=\"button.title\" />\n </template>\n <template v-if=\"!button?.isShort\" #default>\n {{ getButtonTitle(button) }}\n </template>\n <template v-if=\"button.iconRight || button.variant === 'open'\" #iconRight>\n <external-link-icon\n v-if=\"button?.variant === 'open'\"\n :svg-title=\"getButtonTitle(button, true)\"\n />\n <component :is=\"button.iconRight\" v-else :svg-title=\"button.title\" />\n </template>\n </bento-button>\n </div>\n </div>\n </div>\n </Transition>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, inject, type PropType, ref, type Ref } from 'vue';\n import { BentoButton } from '@/components/button';\n import { BentoMenu, type BentoMenuItem } from '@/components/menu';\n import { Copy } from '@/internal/copy';\n import { printDevelopmentWarning } from '@/utils/ts/print-development-warning';\n import { type BentoDatagridDataItem } from '@/components/data-grid/data-grid.types';\n import { DATA_GRID_TOUCH_DEVICE } from '@/components/data-grid/data-grid.keys';\n import Edit1Icon from '@adyen/ui-assets-icons-16/vue/edit-1';\n import ExternalLinkIcon from '@adyen/ui-assets-icons-16/vue/external-link';\n import OptionsVerticalIcon from '@adyen/ui-assets-icons-16/vue/options-vertical';\n\n // Types\n import type {\n BentoColumnCellAction,\n BentoColumnCellActionMenuItem,\n BentoColumnCellActions,\n BentoColumnCellActionsByCellDataFn,\n BentoColumnCellActionsProp,\n BentoDataGridRowActionsProp,\n } from './data-grid-cell-actions.types';\n\n // Translations\n import messages from './messages.json';\n import { useI18n } from '@/utils/ts/i18n';\n\n type MessageSchema = (typeof messages)['en-US'];\n const { t } = useI18n<{ message: MessageSchema }>({ messages });\n\n const props = defineProps({\n /**\n * Column definitions using 'key' to relate to data object.\n */\n cellActions: {\n type: [Array, Function] as PropType<BentoColumnCellActionsProp | BentoDataGridRowActionsProp>,\n required: true,\n validator: (value: BentoColumnCellActions) => value?.length <= 2,\n },\n\n /**\n * The column field key.\n */\n columnKey: {\n type: String,\n default: undefined,\n },\n\n /**\n * Disables any opening of the cell actions menus using the down arrow key.\n */\n disableArrowDownOpeningMenu: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Set to true if the datagrid has been scrolled and the right side has overflowing space.\n */\n hasRightOverflow: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Set to true if the row has a darker background when zebra rows is enabled.\n */\n hasZebraBackground: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Set to true if the row is selected.\n */\n isSelected: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Set to true if the row is highlighted.\n */\n isHighlighted: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Set if set to true will teleport the action menu component\n */\n teleportMenu: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The row data item object.\n */\n rowDataItem: {\n type: Object as PropType<BentoDatagridDataItem>,\n required: true,\n },\n });\n\n const emit = defineEmits([\"menu-open\", \"menu-close\", \"menu-item-click\"]);\n\n const isTouchDevice: Ref<boolean> = inject(DATA_GRID_TOUCH_DEVICE, ref(false));\n\n // Helper to get text for menu items, always returning a string\n const getMenuItemText = (action: BentoColumnCellAction | BentoColumnCellActionMenuItem) => {\n // If it's already a menu item with a text property, use it\n if ('text' in action && action.text !== undefined) {\n return action.text;\n }\n // Otherwise, derive from variant or title\n switch ((action as BentoColumnCellAction).variant) {\n case 'copy':\n return t('copy');\n case 'edit':\n return t('edit');\n case 'open':\n return t('open');\n case 'more':\n return t('more');\n default:\n return (action as BentoColumnCellAction).title;\n }\n };\n\n const getMenuItemIcon = (action: BentoColumnCellAction) => {\n switch (action.variant) {\n case 'copy':\n return Copy;\n case 'edit':\n return Edit1Icon;\n case 'open':\n return ExternalLinkIcon;\n default:\n return undefined;\n }\n };\n\n const isRowActions = computed(() => props.columnKey === undefined);\n const conditionalCellActionsBackgroundGradientClasses = computed(() => ({\n 'b-data-grid-cell-actions__background-gradient--with-row-actions-and-overflow':\n isRowActions.value && props.hasRightOverflow,\n 'b-data-grid-cell-actions__background-gradient--zebra': props.hasZebraBackground,\n 'b-data-grid-cell-actions__background-gradient--highlighted': props.isHighlighted,\n 'b-data-grid-cell-actions__background-gradient--selected': props.isSelected,\n }));\n const conditionalCellActionsClasses = computed(() => ({\n 'b-data-grid-cell-actions__actions--with-row-actions': isRowActions.value,\n 'b-data-grid-cell-actions__actions--zebra': props.hasZebraBackground,\n 'b-data-grid-cell-actions__actions--highlighted': props.isHighlighted,\n 'b-data-grid-cell-actions__actions--selected': props.isSelected,\n }));\n const showGradientElement = computed(() => !isRowActions.value || (isRowActions.value && props.hasRightOverflow));\n\n /**\n * Checks if the passed object is a cell actions function that returns an cell actions array.\n * @param cellActions - a cell actions array or function\n */\n function isBentoColumnCellActionsByCellValueDataFn(\n cellActions: BentoColumnCellActionsProp\n ): cellActions is BentoColumnCellActionsByCellDataFn {\n return typeof cellActions === 'function';\n }\n const computedCellActions = computed(() => {\n const cellActions = isBentoColumnCellActionsByCellValueDataFn(props.cellActions)\n ? props.cellActions?.(props.rowDataItem, props.columnKey)\n : props.cellActions;\n\n if (isTouchDevice.value && !isRowActions.value && cellActions) {\n const flattenedMenuItems: Array<BentoColumnCellActionMenuItem> = [];\n\n cellActions.forEach(action => {\n if (action.menuData) {\n action.menuData.forEach(subMenuItem => {\n flattenedMenuItems.push(subMenuItem);\n });\n } else {\n flattenedMenuItems.push({\n text: getMenuItemText(action),\n event: action.event,\n critical: action.critical,\n disabled: action.disabled,\n icon: getMenuItemIcon(action),\n });\n }\n });\n\n return [\n {\n variant: 'more',\n isShort: true,\n iconLeft: OptionsVerticalIcon,\n menuData: transformMenuEvents(flattenedMenuItems),\n },\n ] as BentoColumnCellActions;\n }\n\n // Do not allow users to provide more than 2 cell action buttons\n if (!isTouchDevice.value && cellActions?.length > 2) {\n printDevelopmentWarning(\n 'WARNING: BentoDataGrid Cell actions can only have a maximum of 2 actions, if you need more consider using the menuData property instead.'\n );\n }\n\n return cellActions?.slice(0, 2);\n });\n\n const getButtonTitle = computed(() => (button: BentoColumnCellAction, isForSvgTitle?: boolean) => {\n if ((!isForSvgTitle && button.isShort) || (isForSvgTitle && !button.isShort)) {\n return undefined;\n }\n\n switch (button.variant) {\n case 'copy':\n return t('copy');\n case 'edit':\n return t('edit');\n case 'open':\n return t('open');\n case 'more':\n return t('more');\n default:\n return button.title;\n }\n });\n\n const generateButtonEvents = (button: BentoColumnCellAction) =>\n button?.event !== undefined\n ? {\n click: (event: MouseEvent) => {\n event.stopPropagation();\n button.event(props.rowDataItem, props.columnKey);\n },\n }\n : {};\n\n const generateMenuEvents = (menuDataItem: BentoColumnCellActionMenuItem): BentoMenuItem => ({\n ...menuDataItem,\n handler: () => {\n if (menuDataItem?.handler && typeof menuDataItem.handler === 'function') {\n menuDataItem?.handler();\n }\n if (menuDataItem?.event && typeof menuDataItem.event === 'function') {\n menuDataItem?.event(props.rowDataItem, props.columnKey);\n }\n },\n });\n\n const transformMenuEvents = (menuData: Array<BentoColumnCellActionMenuItem>) =>\n menuData.map(menuDataItem => {\n const transformedMenuData = menuDataItem;\n if (transformedMenuData?.items) {\n transformedMenuData.items = transformMenuEvents(transformedMenuData.items);\n }\n return { ...generateMenuEvents(transformedMenuData) };\n });\n\n const getCopyText = (button: BentoColumnCellAction) =>\n button?.getCopyData !== undefined\n ? button.getCopyData(props.rowDataItem, props.columnKey)\n : props.columnKey\n ? (props.rowDataItem?.[props.columnKey]?.toString() as string)\n : '';\n\n const shouldShowMenuIconLeft = (button: BentoColumnCellAction) => button.iconLeft || button?.variant === 'more';\n</script>\n\n<script lang=\"ts\">\n /**\n * Internal component to display the data-grid actions.\n * There are 4 different pre-defined buttons that can be used by using the `variant` property.\n *\n * The component renders buttons or a menu depending on the actions provided.\n *\n * @example\n * <data-grid-cell-actions\n * :cell-actions=\"[\n * { variant: 'edit', event: () => {} },\n * {\n * variant: 'more',\n * isShort: true,\n * menuData: [\n * {\n * text: 'Cancel payment',\n * handler: () => {}),\n * critical: true,\n * },\n * {\n * text: 'Transfer payment',\n * handler: () => {},\n * },\n * {\n * text: 'Delete payment',\n * handler: () => {},\n * disabled: true,\n * },\n * ],\n * },\n * ]\"\n * column-key=\"payment\"\n * :row-data-item=\"rowData\"\n * />\n */\n export default {\n i18n: { messages },\n name: 'data-grid-cell-actions',\n };\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-cell-actions.scss\" />\n","import { type BentoColumn } from '../data-grid-columns/data-grid-columns.types';\n\nexport enum DataGridCellPropClass {\n ACTION_COL_NESTED_CONTENT_AND_SELECTION_ENABLED = 'action-col-nested-content-and-selection-enabled',\n ACTION_COL_NESTED_CONTENT_ENABLED = 'action-col-nested-content-enabled',\n ACTION_COL_SELECTION_ENABLED = 'action-col-selection-enabled',\n COLUMN_HOVERED = 'column-hovered',\n COLUMN_HOVERED_NO_BORDER_LEFT = 'column-hovered-no-border-left',\n COLUMN_HOVERED_NO_BORDER_RIGHT = 'column-hovered-no-border-right',\n CONDENSED = 'condensed',\n FROZEN = 'frozen',\n IS_COLUMN_REORDERING = 'is-column-re-ordering',\n IS_COLUMN_REORDERING_TARGET_LEFT = 'is-column-re-order-target-left',\n IS_COLUMN_REORDERING_TARGET_RIGHT = 'is-column-re-order-target-right',\n LAST_FROZEN_COLUMN_CELL = 'last-frozen-column-cell',\n NESTED_CONTENT_ENABLED = 'nested-content-toggle-enabled',\n NUMERIC = 'numeric',\n OVERFLOW_ELLIPSIS = 'overflow-ellipsis',\n PADDING_LEFT_UNSET = 'padding-left-unset',\n PADDING_RIGHT_UNSET = 'padding-right-unset',\n SLASHED_ZERO = 'slashed-zero',\n}\n\nexport interface DataGridCellDragEvents {\n dragenter?: (e: DragEvent) => void;\n drop?: () => void;\n dragover?: (e: DragEvent) => void;\n}\n\nexport type DataGridCellDragEventsForColumn = (column: BentoColumn) => {\n dragenter?: (e: DragEvent) => void;\n drop?: () => void;\n dragover?: (e: DragEvent) => void;\n};\n\nexport interface DataGridCellColumnSet {\n columnSet: Array<BentoColumn>;\n id: string;\n isFrozenColumns?: boolean;\n}\n\nexport interface DataGridCellEvents extends DataGridCellDragEvents {\n keyup?: (event: KeyboardEvent) => void;\n keydown?: (event: KeyboardEvent) => void;\n mouseenter?: () => void;\n mouseleave?: (e: MouseEvent) => void;\n focus?: (e: FocusEvent) => void;\n focusout?: (e: FocusEvent) => void;\n}\n\nexport type DataGridCellEventsForColumn = (column: BentoColumn) => DataGridCellEvents;\n","/**\n * Checks if the currently focused element has a visible focus state.\n * This is useful for determining whether to show a focus ring, especially\n * for accessibility purposes. It checks for the `:focus-visible` pseudo-class\n * or the `.focus-visible` class used by polyfills.\n *\n * @returns True if the active element has a visible focus, false otherwise.\n */\nexport const isFocusVisible = () => {\n const activeElement = document.activeElement;\n\n if (!activeElement) {\n return false;\n }\n\n // Check for the modern pseudo-class OR the older polyfill class\n return activeElement.matches(':focus-visible') || activeElement.matches('.focus-visible');\n};\n","<template>\n <div\n :key=\"`cell-${column.field}`\"\n ref=\"gridcellRef\"\n :aria-hidden=\"ariaHidden\"\n :data-testid=\"`cell-${column.field}`\"\n :data-cellindex=\"getCellIndex(rowIndex, colIndex, columnSetIndex)\"\n class=\"b-data-grid-cell\"\n :class=\"conditionalRowCellClasses(column)\"\n role=\"gridcell\"\n :tabindex=\"tabIndex\"\n :aria-colindex=\"getColIndex(colIndex, columnSetIndex) + 1\"\n :style=\"{\n width: column.autoWidth && isMeasuringColumnWidths ? 'auto' : `${column.width}px`,\n }\"\n v-on=\"getGridcellEvents(column)\"\n >\n <template v-if=\"column.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME\">\n <template v-if=\"selectable\">\n <bento-checkbox\n class=\"b-data-grid-cell__select-cell\"\n :aria-label=\"t('selectRow')\"\n :disabled=\"isDataItemDisabled(rowData)\"\n :indeterminate=\"selectionIsIndeterminate\"\n :model-value=\"selectedItems\"\n :value=\"getDataItemId(rowData)\"\n :tabindex=\"isFocused ? 0 : -1\"\n @update:model-value=\"$emit('select-row', $event)\"\n />\n </template>\n <template v-if=\"nestedContent\">\n <bento-toggle-button\n ref=\"menuButtonRef\"\n aria-haspopup=\"true\"\n :aria-controls=\"controlledNestedRowElementIds\"\n condensed\n variant=\"tertiary\"\n :toggled=\"isNestedContentExpanded\"\n @click=\"toggleNestedContent\"\n >\n <template #iconLeft>\n <chevron-up-icon\n v-if=\"isNestedContentExpanded\"\n class=\"b-accordion-item__icon\"\n :svg-title=\"t('collapseNestedContent')\"\n />\n <chevron-down-icon\n v-else\n class=\"b-accordion-item__icon\"\n :svg-title=\"t('expandNestedContent')\"\n />\n </template>\n </bento-toggle-button>\n </template>\n </template>\n <template v-else>\n <bento-typography\n el=\"div\"\n class=\"b-data-grid-cell__cell-content\"\n :class=\"computedCellContentClasses\"\n data-testid=\"cell-content\"\n >\n <slot :item=\"rowData\" :row-index=\"rowIndex\" :name=\"`item-${column.field}`\">\n <span :title=\"conditionalTitleAttribute(column, rowData[column.field])\">{{\n getRowData(rowData[column.field])\n }}</span>\n </slot>\n </bento-typography>\n <div v-if=\"column.cellActions?.length > 0\" class=\"b-data-grid-cell__cell-actions\">\n <data-grid-cell-actions\n v-if=\"(shouldShowCellActions || isTouchDevice) && (hasRowData || hasSlot(`item-${column.field}`))\"\n ref=\"cellActionsRef\"\n :cell-actions=\"column.cellActions\"\n :column-key=\"column.field\"\n :row-data-item=\"rowData\"\n :has-zebra-background=\"hasZebraBackground\"\n :is-highlighted=\"isHighlighted\"\n :is-selected=\"isSelected\"\n teleport-menu\n @menu-item-click=\"onMenuClose\"\n />\n </div>\n </template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import {\n computed,\n type ComputedRef,\n inject,\n nextTick,\n onMounted,\n type PropType,\n provide,\n type Ref,\n ref,\n type UnwrapRef,\n useSlots,\n watch,\n } from 'vue';\n import {\n focusOnInteractiveChild,\n makeAllInteractiveChildrenFocusable,\n makeAllInteractiveChildrenUnFocusable,\n } from '../../utils';\n import { DATAGRID_ACTIONS_COLUMN_FIELD_NAME } from '../../composables/use-calculate-column-width';\n import { BentoCheckbox } from '@/components/checkbox';\n import { BentoTypography } from '@/components/typography';\n import { BentoToggleButton } from '@/components/button';\n import DataGridCellActions from '../data-grid-cell-actions/data-grid-cell-actions.vue';\n import { DATA_GRID_SLASHED_ZERO, DATA_GRID_SMALL_CONTAINER, DATA_GRID_TOUCH_DEVICE } from '../../data-grid.keys';\n import ChevronDownIcon from '@adyen/ui-assets-icons-16/vue/chevron-down';\n import ChevronUpIcon from '@adyen/ui-assets-icons-16/vue/chevron-up';\n import { DATA_GRID_CELL_MENU_REGISTERING_INJECTION_KEY } from '@/components/data-grid/components/data-grid-cell/data-grid-cell.keys';\n\n // Types and enums\n import {\n type BentoColumn,\n BentoColumnOverflow,\n type BentoDatagridDataItem,\n type BentoDatagridDataItemId,\n type BentoDatagridGetDataItemIdFn,\n type BentoDatagridIsDataItemDisabledFn,\n } from '@/components/data-grid/data-grid.types';\n import {\n type DataGridCellColumnSet,\n type DataGridCellDragEventsForColumn,\n type DataGridCellEvents,\n type DataGridCellEventsForColumn,\n DataGridCellPropClass,\n } from './data-grid-cell.types';\n import type { BentoDatagridDraggingColumnState } from '../data-grid-columns/data-grid-columns.types';\n import type { DatagridColumnHoveringState } from '@/components/data-grid/composables/use-column-hovering/use-column-hovering.types';\n\n // Utils\n import { useHasSlot } from '@/composables';\n import { useI18n } from '@/utils/ts/i18n';\n import { isFocusVisible } from '@/utils/ts/focus-visible';\n import { EventKey } from '@/types/utils-events';\n\n // Translations\n import messages from './messages.json';\n\n const slots = useSlots();\n const hasSlot = useHasSlot(slots);\n\n type MessageSchema = (typeof messages)['en-US'];\n const { t } = useI18n<{ message: MessageSchema }>({ messages });\n\n const props = defineProps({\n draggingEventsForRowCell: {\n type: Function as PropType<DataGridCellDragEventsForColumn>,\n required: true,\n },\n\n /**\n * The columns sets including\n */\n columnSets: {\n type: Array as PropType<Array<DataGridCellColumnSet>>,\n required: true,\n },\n\n /**\n * The columns set we are iterating over\n */\n column: {\n type: Object as PropType<BentoColumn>,\n required: true,\n },\n\n colIndex: {\n type: Number,\n required: true,\n },\n\n columnSetIndex: {\n type: Number,\n required: true,\n },\n\n /**\n * Sets the row cells to the condensed padding state.\n */\n condensed: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Columns being dragged, contains dragging column and a target column\n */\n draggingColumns: {\n type: Object as PropType<BentoDatagridDraggingColumnState>,\n default: undefined,\n },\n\n /**\n * A customisable method to retrieve a unique identifier for a data item in the array of data supplied.\n * This is used selecting and performance reasons and must exist in each data item.\n */\n getDataItemId: {\n type: Function as PropType<BentoDatagridGetDataItemIdFn>,\n default: (item: BentoDatagridDataItem) => item.id,\n },\n\n /**\n * Set to true if the cell has a darker background when zebra rows is enabled.\n */\n hasZebraBackground: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Set to true if the row is selected.\n */\n isSelected: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Set to true if the row is highlighted.\n */\n isHighlighted: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The column hovered over state and whether the hovered over column should show a border right or left.\n */\n hoveredOverColumnState: {\n type: Object as PropType<DatagridColumnHoveringState>,\n required: true,\n },\n\n /**\n * A customisable method to determine if a row is not selectable.\n * The default is that every row is selectable.\n */\n isDataItemDisabled: {\n type: Function as PropType<BentoDatagridIsDataItemDisabledFn>,\n default: () => false,\n },\n\n isMeasuringColumnWidths: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines if the nested content is visible.\n */\n isNestedContentExpanded: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines if the nest content slot is enabled for this data row.\n */\n nestedContent: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The IDs of the rows this cell controls to show / hide them.\n */\n nestedRowsElementIds: {\n type: Array as PropType<Array<string>>,\n default: () => [],\n },\n\n /**\n * The row data object\n */\n rowData: {\n type: Object as PropType<BentoDatagridDataItem>,\n required: true,\n },\n\n rowIndex: {\n type: Number,\n required: true,\n },\n\n /**\n * The row selection checkbox indeterminate state.\n */\n selectionIsIndeterminate: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines if the row selection is enabled.\n */\n selectable: {\n type: Boolean,\n default: false,\n },\n\n selectedItems: {\n type: Array as PropType<Array<BentoDatagridDataItemId>>,\n required: true,\n },\n });\n\n const emit = defineEmits([\"on-frozen-columns-key-press\", \"select-row\", \"register-row-cell-element\", \"cell-hovered\", \"nested-content-toggled\"]);\n\n // References\n const gridcellRef = ref<HTMLDivElement | null>(null);\n const cellActionsRef = ref<InstanceType<typeof DataGridCellActions>>(null);\n const shouldShowCellActions = ref(false);\n const childrenMenuContainerElements = ref<Array<Ref<UnwrapRef<HTMLDivElement>>>>([]);\n const isFocused = ref(false);\n const focusableItems = ref<Array<{ node: HTMLElement }>>();\n const hasEverBeenFocused = ref(false);\n\n // Computed\n const hasRowData = computed(() => !!props.rowData?.[props.column.field]);\n const controlledNestedRowElementIds = computed(() =>\n props.column.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME && props.nestedRowsElementIds?.length > 0\n ? props.nestedRowsElementIds.join(' ')\n : undefined\n );\n const ariaHidden = computed(\n () => props.column.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME && !props.selectable && !props.nestedContent\n );\n const tabIndex = computed(() => {\n if (!ariaHidden.value) {\n // The first cell of the grid should be tabbable on initial render to allow keyboard navigation into the grid.\n if (getCellIndex(props.rowIndex, props.colIndex, props.columnSetIndex) === 0 && !hasEverBeenFocused.value) {\n return '0';\n }\n\n // A cell becomes part of the tab order only when it is focused.\n if (isFocused.value) {\n return '0';\n }\n }\n\n // Action cells are not directly tabbable; they are accessed via cell navigation.\n if (props.column.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME) {\n return '-1';\n }\n\n // By default, cells are not in the tab order.\n return '-1';\n });\n\n // Row data retrieval methods\n const conditionalTitleAttribute = (column: BentoColumn, content: unknown) =>\n column?.overflow === BentoColumnOverflow.ELLIPSIS ? `${content}` : undefined;\n const getRowData = (rowData: unknown) => rowData ?? '-';\n\n // Cell and Columns index calculation\n const sumColumnAmountsInColumnSets = (limitIndex?: number) =>\n props.columnSets.slice(0, limitIndex).reduce((total, { columnSet }) => total + columnSet.length, 0);\n // Sums the amount of columns on every previous column set to find\n // the absolute column index (useful for frozen columns use case)\n const getColIndex = (colIndex: number, colSetIndex: number) => colIndex + sumColumnAmountsInColumnSets(colSetIndex);\n const getCellIndex = (rowIndex: number, colIndex: number, colSetIndex: number) =>\n sumColumnAmountsInColumnSets() * rowIndex + getColIndex(colIndex, colSetIndex);\n\n /**\n * We check here if we are leaving the cell but mouse into a child menu\n * If this is the case we don't want to hide the cell actions.\n * @param relatedTarget\n */\n const isLeavingCellFocus = (relatedTarget: EventTarget) => {\n if (\n relatedTarget === null ||\n (!gridcellRef.value.contains(relatedTarget as Node) &&\n !childrenMenuContainerElements.value\n ?.map(registeredMenuRef => registeredMenuRef.value)\n .some(menuElement => menuElement === relatedTarget || menuElement?.contains(relatedTarget as Node)))\n ) {\n shouldShowCellActions.value = false;\n }\n };\n\n /**\n * Hides the cell actions when a menu item is clicked. This is necessary as relying solely on\n * focus-out events is not reliable, especially when the menu is teleported or an action\n * causes focus to leave the window.\n */\n const onMenuClose = () => {\n shouldShowCellActions.value = false;\n };\n\n // Events\n const hasInteractiveElFocusedInside = ref(false);\n const getGridcellEvents: DataGridCellEventsForColumn = (column: BentoColumn) => {\n const defaultEvents: DataGridCellEvents = {\n ...props.draggingEventsForRowCell(column),\n // Focus on the first interactive child in the grid cell if one exists\n focus: async () => {\n if (!isFocusVisible()) {\n return;\n }\n\n isFocused.value = true;\n hasEverBeenFocused.value = true;\n makeAllInteractiveChildrenFocusable(focusableItems.value);\n await nextTick();\n const hasFocusedOnInteractiveChild = focusOnInteractiveChild(gridcellRef.value);\n if (hasFocusedOnInteractiveChild) {\n hasInteractiveElFocusedInside.value = true;\n }\n },\n focusout: () => {\n if (!isFocusVisible()) {\n return;\n }\n hasInteractiveElFocusedInside.value = false;\n },\n keydown: (event: KeyboardEvent) => {\n if (event.key !== EventKey.TAB) {\n hasInteractiveElFocusedInside.value = false;\n isFocused.value = false;\n makeAllInteractiveChildrenUnFocusable(gridcellRef.value);\n }\n },\n };\n\n const gridCellEvents: DataGridCellEvents = { ...defaultEvents };\n\n if (column.frozen) {\n gridCellEvents.keyup = (event: Event) => emit('on-frozen-columns-key-press', event);\n gridCellEvents.keydown = (event: KeyboardEvent) => {\n defaultEvents.keydown(event);\n emit('on-frozen-columns-key-press', event);\n };\n }\n if (column.cellActions) {\n gridCellEvents.mouseenter = () => {\n shouldShowCellActions.value = true;\n };\n gridCellEvents.mouseleave = (e: MouseEvent) => {\n isLeavingCellFocus(e?.relatedTarget);\n };\n gridCellEvents.focus = async (e: FocusEvent) => {\n defaultEvents.focus(e);\n\n await nextTick();\n shouldShowCellActions.value = true;\n };\n gridCellEvents.focusout = (e: FocusEvent) => {\n defaultEvents.focusout(e);\n isLeavingCellFocus(e?.relatedTarget);\n };\n }\n return gridCellEvents;\n };\n\n onMounted(() => {\n focusableItems.value = makeAllInteractiveChildrenUnFocusable(gridcellRef.value);\n });\n\n const toggleNestedContent = () => {\n emit('nested-content-toggled');\n };\n // Each cell knows it's on hover state but this state needs to be emitted up\n // in order for the DataGrid to know which row to set the hovered state on.\n watch(\n () => shouldShowCellActions.value,\n () => {\n if (shouldShowCellActions.value === true) {\n emit('cell-hovered', props.rowIndex);\n } else {\n emit('cell-hovered', -1);\n }\n }\n );\n\n const registerMenuContainerElement = (menuContainerElement: Ref<UnwrapRef<HTMLDivElement>>) => {\n childrenMenuContainerElements.value.push(menuContainerElement);\n };\n\n const menuMouseLeave = (e: MouseEvent) => {\n if (!gridcellRef.value.contains(e?.relatedTarget as Node)) {\n shouldShowCellActions.value = false;\n }\n };\n\n provide<{\n registerMenuContainerElement: (menuContainerElement: Ref<UnwrapRef<HTMLDivElement>>) => void;\n menuMouseLeave: (e: MouseEvent) => void;\n }>(DATA_GRID_CELL_MENU_REGISTERING_INJECTION_KEY, {\n registerMenuContainerElement,\n menuMouseLeave,\n });\n\n const hasSlashedZero = inject(DATA_GRID_SLASHED_ZERO, ref(false));\n\n const isSmallContainer: ComputedRef<boolean> = inject(\n DATA_GRID_SMALL_CONTAINER,\n computed(() => false)\n );\n\n const isTouchDevice: Ref<boolean> = inject(DATA_GRID_TOUCH_DEVICE, ref(false));\n\n // Styling\n const conditionalRowCellClasses = (column: BentoColumn) => ({\n [`b-data-grid-cell--${DataGridCellPropClass.COLUMN_HOVERED}`]:\n column?.field === props.hoveredOverColumnState.hoveredOverColumnField,\n [`b-data-grid-cell--${DataGridCellPropClass.COLUMN_HOVERED_NO_BORDER_LEFT}`]:\n column?.field === props.hoveredOverColumnState.hoveredOverColumnField &&\n props.hoveredOverColumnState.noBorderLeft,\n [`b-data-grid-cell--${DataGridCellPropClass.COLUMN_HOVERED_NO_BORDER_RIGHT}`]:\n column?.field === props.hoveredOverColumnState.hoveredOverColumnField &&\n props.hoveredOverColumnState.noBorderRight,\n [`b-data-grid-cell--${DataGridCellPropClass.PADDING_LEFT_UNSET}`]: column?.padding?.left === false,\n [`b-data-grid-cell--${DataGridCellPropClass.PADDING_RIGHT_UNSET}`]: column?.padding?.right === false,\n [`b-data-grid-cell--${DataGridCellPropClass.NUMERIC}`]: column?.numeric,\n [`b-data-grid-cell--${DataGridCellPropClass.CONDENSED}`]: props.condensed,\n [`b-data-grid-cell--${DataGridCellPropClass.OVERFLOW_ELLIPSIS}`]:\n column?.overflow === BentoColumnOverflow.ELLIPSIS,\n [`b-data-grid-cell--${DataGridCellPropClass.IS_COLUMN_REORDERING}`]:\n props.draggingColumns.dragging?.field === column.field,\n [`b-data-grid-cell--${DataGridCellPropClass.IS_COLUMN_REORDERING_TARGET_LEFT}`]:\n props.draggingColumns.target?.field === column.field && props.draggingColumns?.dragToLeft,\n [`b-data-grid-cell--${DataGridCellPropClass.IS_COLUMN_REORDERING_TARGET_RIGHT}`]:\n props.draggingColumns.target?.field === column.field && !props.draggingColumns?.dragToLeft,\n [`b-data-grid-cell--${DataGridCellPropClass.FROZEN}`]: column?.frozen,\n [`b-data-grid-cell--${DataGridCellPropClass.NESTED_CONTENT_ENABLED}`]: props.nestedContent,\n [`b-data-grid-cell--${DataGridCellPropClass.ACTION_COL_NESTED_CONTENT_ENABLED}`]:\n props.nestedContent && !props.selectable && column.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME,\n [`b-data-grid-cell--${DataGridCellPropClass.ACTION_COL_NESTED_CONTENT_AND_SELECTION_ENABLED}`]:\n props.nestedContent && props.selectable && column.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME,\n [`b-data-grid-cell--${DataGridCellPropClass.ACTION_COL_SELECTION_ENABLED}`]:\n column.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME && props.selectable,\n [`b-data-grid-cell--${DataGridCellPropClass.SLASHED_ZERO}`]: hasSlashedZero.value,\n 'b-data-grid-cell--small-container': isSmallContainer.value,\n });\n const computedCellContentClasses = computed(() => ({\n 'b-data-grid-cell__cell-content--is-focused-on-inside-interactive-element': hasInteractiveElFocusedInside.value,\n }));\n\n // Exposed refs\n defineExpose({\n gridcellRef,\n });\n</script>\n\n<script lang=\"ts\">\n /**\n * Internal component to display the BentoDataGrid cells.\n *\n * The component can also render the selecting row checkbox as well as cell actions.\n *\n * @example\n * <data-grid-cell\n *\n * />\n */\n export default {\n i18n: { messages },\n name: 'data-grid-cell',\n };\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-cell.scss\" />\n","<template>\n <div class=\"b-data-grid-row-container\" role=\"presentation\">\n <div\n v-bind=\"ariaRowAttributes\"\n :id=\"rowId?.toString()\"\n :key=\"rowIndex\"\n class=\"b-data-grid-row-container__row\"\n :class=\"conditionalRowClasses(rowData, rowIndex)\"\n role=\"row\"\n :aria-selected=\"getRowAriaSelectedValue(rowData)\"\n @click=\"onRowClick\"\n @keyup.enter=\"onRowClick\"\n @keyup.space=\"onRowClick\"\n >\n <template v-for=\"({ columnSet, id, isFrozenColumns }, columnSetIndex) of columnSets\">\n <div\n v-if=\"columnSet?.length\"\n :key=\"`data-grid-rows-${id}`\"\n class=\"b-data-grid-row-container__cells\"\n :class=\"conditionalRowSetClasses(isFrozenColumns, isSmallContainer)\"\n :data-testid=\"`data-grid-${id}-rows`\"\n >\n <data-grid-cell\n v-for=\"(column, colIndex) in columnSet\"\n :key=\"`cell-${column.field}`\"\n :ref=\"el => registerRowCellRef(el, column.field)\"\n class=\"b-data-grid-row-container__cell\"\n :column=\"column\"\n :column-set-index=\"columnSetIndex\"\n :col-index=\"colIndex\"\n :column-sets=\"columnSets\"\n :condensed=\"condensed\"\n :dragging-columns=\"draggingColumns\"\n :dragging-events-for-row-cell=\"draggingEventsForRowCell\"\n :get-data-item-id=\"getDataItemId\"\n :has-zebra-background=\"isRowEven\"\n :is-highlighted=\"isHighlightedRow(rowData)\"\n :is-selected=\"isSelectedRow(rowData)\"\n :hovered-over-column-state=\"hoveredOverColumnState\"\n :is-data-item-disabled=\"isDataItemDisabled\"\n :is-measuring-column-widths=\"isMeasuringColumnWidths\"\n :is-nested-content-expanded=\"isNestedContentShown\"\n :nested-content=\"shouldShowNestedContentToggle\"\n :nested-rows-element-ids=\"allNestedRowIds\"\n :row-data=\"rowData\"\n :row-index=\"rowIndex\"\n :selection-is-indeterminate=\"hasUnSelectedNestedRows\"\n :selectable=\"selectable\"\n :selected-items=\"selectedItems\"\n @cell-hovered=\"emit('cell-hovered', $event)\"\n @on-frozen-columns-key-press=\"emit('on-frozen-columns-key-press', $event)\"\n @select-row=\"onRowSelect\"\n @nested-content-toggled=\"nestedContentToggled\"\n >\n <template v-for=\"(_, innerSlot) of slots\" #[innerSlot]=\"scope\">\n <slot :name=\"innerSlot\" v-bind=\"scope\" />\n </template>\n </data-grid-cell>\n </div>\n <div\n v-if=\"!isFrozenColumns && rowActions\"\n :key=\"`data-grid-row-actions-${id}`\"\n ref=\"rowActionsRef\"\n :aria-colindex=\"sumColumnAmountsInColumnSets().toString()\"\n class=\"b-data-grid-row-container__row-actions-container\"\n :class=\"conditionalRowActionsContainerClasses\"\n :style=\"computedRowActionsStyles\"\n :data-cellindex=\"getRowActionsCellIndex()\"\n tabindex=\"-1\"\n role=\"gridcell\"\n @focus=\"onRowActionsCellFocus\"\n @focusOut=\"onRowActionsCellFocusOut\"\n @keydown=\"onRowActionsCellOnKeyDown\"\n >\n <data-grid-cell-actions\n class=\"b-data-grid-row-container__row-actions\"\n disable-arrow-down-opening-menu\n :cell-actions=\"rowActions\"\n :has-right-overflow=\"hasRightOverflow\"\n :row-data-item=\"rowData\"\n teleport-menu\n @menu-open=\"onRowActionMenuOpen\"\n @menu-close=\"onRowActionMenuClose\"\n />\n </div>\n </template>\n </div>\n\n <Transition\n v-if=\"\n (hasNestedContent && hasSlot('nested-slot') && shouldShowNestedContent(rowData)) ||\n (hasNestedRows && shouldShowNestedRowsBooleanResult)\n \"\n :key=\"`${rowIndex}-nest-content`\"\n name=\"b-data-grid-row-container__animation--nested-content\"\n >\n <div\n v-if=\"isNestedContentShown && shouldShowRenderNestedRows\"\n :class=\"conditionalNestedRowClasses\"\n data-testid=\"nested-content-container\"\n :style=\"nestedContentStyles\"\n role=\"presentation\"\n >\n <div ref=\"nestedContentRef\">\n <div\n v-if=\"isLoadingNestedRows\"\n class=\"b-data-grid-row-container__row-nested-rows-loading-container\"\n >\n <bento-loading-indicator />\n </div>\n <data-grid-row\n v-for=\"(childRowData, childRowIndex) in rowData.children\"\n v-bind=\"props\"\n :id=\"getRowId(childRowIndex)\"\n :key=\"`child-${childRowIndex}`\"\n :row-data=\"childRowData\"\n :row-index=\"childRowIndex\"\n :row-set-size=\"rowData.children.length\"\n is-nested-row\n @cell-hovered=\"emit('cell-hovered', $event)\"\n @row-click=\"emit('row-click', ...$event)\"\n @on-frozen-columns-key-press=\"emit('on-frozen-columns-key-press', $event)\"\n @select-row=\"onNestedRowSelect(childRowData, $event)\"\n >\n <template v-for=\"(_, innerSlot) of slots\" #[innerSlot]=\"scope\">\n <slot :name=\"innerSlot\" v-bind=\"scope\" />\n </template>\n </data-grid-row>\n </div>\n </div>\n\n <div\n v-else-if=\"isNestedContentShown\"\n v-bind=\"nestedContentContainerDivAriaAttributes\"\n :class=\"conditionalNestedRowClasses\"\n data-testid=\"nested-content-container\"\n :style=\"nestedContentStyles\"\n role=\"row\"\n tabindex=\"-1\"\n >\n <div ref=\"nestedContentRef\" role=\"gridcell\">\n <div\n v-if=\"isLoadingNestedRows\"\n class=\"b-data-grid-row-container__row-nested-rows-loading-container\"\n >\n <bento-loading-indicator />\n </div>\n <div v-else-if=\"hasSlot('nested-slot') && shouldShowNestedContent(rowData)\">\n <slot :item=\"rowData\" name=\"nested-slot\" />\n </div>\n </div>\n </div>\n </Transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import {\n type ComponentPublicInstance,\n computed,\n type ComputedRef,\n inject,\n onMounted,\n type PropType,\n ref,\n useSlots,\n watch,\n } from 'vue';\n\n import { BentoLoadingIndicator } from '@/components/loading-indicator';\n import {\n focusOnInteractiveChild,\n makeAllInteractiveChildrenFocusable,\n makeAllInteractiveChildrenUnFocusable,\n } from '@/components/data-grid/utils';\n import DataGridRow from '@/components/data-grid/components/data-grid-row/data-grid-row.vue';\n import DataGridCell from '@/components/data-grid/components/data-grid-cell/data-grid-cell.vue';\n import DataGridCellActions from '@/components/data-grid/components/data-grid-cell-actions/data-grid-cell-actions.vue';\n\n // Types and enums\n import {\n type BentoDatagridDataItem,\n type BentoDatagridDataItemId,\n type BentoDatagridGetDataItemIdFn,\n type BentoDatagridIsDataItemDisabledFn,\n type BentoDatagridShouldShowNestedContentFn,\n type BentoDatagridShouldShowNestedRowsFn,\n BentoDatagridStyleState,\n } from '@/components/data-grid/data-grid.types';\n import type {\n DataGridCellColumnSet,\n DataGridCellDragEventsForColumn,\n } from '../data-grid-cell/data-grid-cell.types';\n import type { BentoDatagridDraggingColumnState } from '../data-grid-columns/data-grid-columns.types';\n import type { DatagridColumnHoveringState } from '@/components/data-grid/composables/use-column-hovering';\n\n // Translations\n import { type Booleanish } from '@/types/prop-types';\n import { useHasSlot } from '@/composables/use-has-slot/use-has-slot';\n import { useExpandableContentHeight } from '@/composables/use-expandable-content-height/use-expandable-content-height';\n import { observeSizeOfElement } from '@/utils/ts/resize';\n import {\n DATAGRID_ACTIONS_COLUMN_FIELD_NAME,\n DATAGRID_CELL_OFFSET_PADDING,\n } from '@/components/data-grid/composables/use-calculate-column-width/use-calculate-column-width';\n import { generateUid } from '@/core/utils/ts';\n import { type BentoDataGridRowActionsProp } from '@/components/data-grid/components/data-grid-cell-actions/data-grid-cell-actions.types';\n import type { HTMLAttributes } from 'vue/types/jsx';\n import { EventKey } from '@/types/utils-events';\n import { DATA_GRID_SMALL_CONTAINER } from '@/components/data-grid/data-grid.keys';\n\n const slots = useSlots();\n const hasSlot = useHasSlot(slots);\n\n const props = defineProps({\n /**\n * Row actions property that generates which button to show in row actions area\n */\n rowActions: {\n type: [Function, Array] as PropType<BentoDataGridRowActionsProp>,\n default: undefined,\n },\n\n /**\n * When true, will emit a 'rowClick' event when a row is clicked. Will add cursor: pointer to rows.\n */\n allowRowClicks: { type: Boolean, default: false },\n\n /**\n * The columns sets including\n */\n columnSets: {\n type: Array as PropType<Array<DataGridCellColumnSet>>,\n required: true,\n },\n\n /**\n * Sets the row cells to the condensed padding state.\n */\n condensed: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Columns being dragged, contains dragging column and a target column\n */\n draggingColumns: {\n type: Object as PropType<BentoDatagridDraggingColumnState>,\n default: undefined,\n },\n\n /**\n * Dragging event handlers for each row cell\n */\n draggingEventsForRowCell: {\n type: Function as PropType<DataGridCellDragEventsForColumn>,\n required: true,\n },\n\n /**\n * A customisable method to retrieve a unique identifier for a data item in the array of data supplied.\n * This is used selecting and performance reasons and must exist in each data item.\n */\n getDataItemId: {\n type: Function as PropType<BentoDatagridGetDataItemIdFn>,\n default: (item: BentoDatagridDataItem) => item.id,\n },\n\n /**\n * Set to true if the datagrid has been scrolled and the left side has overflowing space.\n */\n hasLeftOverflow: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Enables the nested content slot functionality.\n */\n hasNestedContent: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Enables the nested content slot functionality.\n */\n hasNestedRows: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Set to true if the datagrid has been scrolled and the right side has overflowing space.\n */\n hasRightOverflow: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Highlighted row IDs.\n */\n highlightedRows: {\n type: Array as PropType<Array<BentoDatagridDataItemId>>,\n default: () => [],\n },\n\n /**\n * The row index of a currently hovered row.\n */\n hoveredRowIndex: {\n type: Number,\n default: -1,\n },\n\n /**\n * The column hovered over state and whether the hovered over column should show a border right or left.\n */\n hoveredOverColumnState: {\n type: Object as PropType<DatagridColumnHoveringState>,\n required: true,\n },\n\n /**\n * A customisable method to determine if a row is not selectable.\n * The default is that every row is selectable.\n */\n isDataItemDisabled: {\n type: Function as PropType<BentoDatagridIsDataItemDisabledFn>,\n default: () => false,\n },\n\n /**\n * If the row is of an even number.\n * Rows are 0th based index e.g. index 0 is an odd-numbered row.\n */\n isRowEven: {\n type: Boolean,\n default: false,\n },\n\n /**\n * If the row is the last child in it's parent container.\n */\n isRowLastChild: {\n type: Boolean,\n default: false,\n },\n\n /**\n * If columns are being measured for the autoWidth functionality.\n */\n isMeasuringColumnWidths: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines if this row is nested inside another row.\n */\n isNestedRow: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The maximum width of the row actions in all rows\n */\n rowActionsMaximumWidth: {\n type: Number,\n default: 0,\n },\n\n /**\n * The row data object\n */\n rowData: {\n type: Object as PropType<BentoDatagridDataItem>,\n required: true,\n },\n\n /**\n * The row index.\n */\n rowIndex: {\n type: Number,\n required: true,\n },\n\n /**\n * The row ID to be using for the ID attribute.\n */\n rowId: {\n type: Number,\n default: undefined,\n },\n\n /**\n * The number of rows that this row is within.\n */\n rowSetSize: {\n type: Number,\n default: 0,\n },\n\n /**\n * Determines whether to render frozen seperator on the row.\n */\n showFrozenColumnsSeparator: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines if the row selection is enabled.\n */\n selectable: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The array of IDs for the selected rows.\n */\n selectedItems: {\n type: Array as PropType<Array<BentoDatagridDataItemId>>,\n required: true,\n },\n\n /**\n * Enables / Disables the nested-content slot\n */\n shouldShowNestedContent: {\n type: Function as PropType<BentoDatagridShouldShowNestedContentFn>,\n default: (_item: BentoDatagridDataItem) => true,\n },\n\n /**\n * Returns the nested rows for a given BentoDatagridDataItem.\n */\n shouldShowNestedRows: {\n type: Function as PropType<BentoDatagridShouldShowNestedRowsFn>,\n default: (_item: BentoDatagridDataItem) => true,\n },\n });\n\n const emit = defineEmits([\"cell-hovered\", \"on-frozen-columns-key-press\", \"select-row\", \"select-nested-row\", \"row-click\", \"nested-content-toggled\"]);\n\n // Refs\n const gridcellRefs = ref<{ [key: string]: HTMLDivElement }>({});\n const isNestedContentShown = ref(false);\n const nestedContentRef = ref();\n const rowActionsRef = ref();\n const nestedContentSlotId = generateUid('nested-content-slot');\n const isRowActionMenuOpen = ref(false);\n const focusableItems = ref<Array<{ node: HTMLElement }>>();\n\n onMounted(() => {\n if (rowActionsRef.value) {\n focusableItems.value = makeAllInteractiveChildrenUnFocusable(rowActionsRef.value);\n }\n });\n\n const shouldShowNestedRowsBooleanResult = computed(() => props.shouldShowNestedRows(props.rowData));\n const shouldShowRenderNestedRows = computed(\n () =>\n !props.isNestedRow &&\n props.hasNestedRows &&\n shouldShowNestedRowsBooleanResult.value &&\n props.rowData?.children?.length > 0\n );\n const isLoadingNestedRows = computed(\n () =>\n !props.isNestedRow &&\n props.hasNestedRows &&\n shouldShowNestedRowsBooleanResult.value &&\n (props.rowData?.children === undefined || props?.rowData?.children.length === 0)\n );\n const shouldShowNestedContentToggle = computed(\n () =>\n (props.hasNestedContent && props.shouldShowNestedContent(props.rowData)) ||\n (props.hasNestedRows && shouldShowNestedRowsBooleanResult.value && !props.isNestedRow)\n );\n const ariaRowAttributes = computed<HTMLAttributes>(() => {\n if (props.hasNestedContent || props.hasNestedRows) {\n const isNestedContentShownBooleanishVal = isNestedContentShown.value.toString() as Booleanish;\n return {\n 'aria-expanded': shouldShowNestedContentToggle.value ? isNestedContentShownBooleanishVal : undefined,\n 'aria-level': props.isNestedRow ? '2' : '1',\n 'aria-posinset': props.rowIndex + 1,\n 'aria-setsize': props.rowSetSize,\n };\n }\n return { 'aria-rowindex': props.rowIndex + 1 };\n });\n const nestedContentContainerDivAriaAttributes = computed<HTMLAttributes>(() => {\n if (isLoadingNestedRows.value) {\n return {\n 'aria-busy': 'true',\n 'aria-live': 'polite',\n };\n }\n if (\n shouldShowRenderNestedRows.value ||\n !props.hasNestedContent ||\n !props.shouldShowNestedContent(props.rowData)\n ) {\n return undefined;\n }\n return {\n 'aria-level': props.isNestedRow ? '3' : '2',\n 'aria-posinset': '1',\n 'aria-setsize': '1',\n id: nestedContentSlotId,\n role: 'row',\n tabindex: '-1',\n };\n });\n const nestedRowIds = computed(() => {\n if (shouldShowRenderNestedRows.value) {\n return props.rowData?.children?.reduce((acc, _val, index) => {\n acc[index] = generateUid('nested-row');\n return acc;\n }, {});\n }\n return [];\n });\n const allNestedRowIds = computed(() => {\n if (!isNestedContentShown.value) {\n return undefined;\n }\n if (props.hasNestedContent && props.shouldShowNestedContent(props.rowData)) {\n return [nestedContentSlotId];\n }\n\n if (shouldShowRenderNestedRows.value && Object.keys(nestedRowIds.value)?.length > 0) {\n const generatedRowIds = Object.values(nestedRowIds.value);\n if (generatedRowIds?.length > 0) {\n return generatedRowIds;\n }\n }\n return [];\n });\n const hasUnSelectedNestedRows = computed(() => {\n const childrendDataItemIds = props.rowData?.children?.map(nestedItem => props.getDataItemId(nestedItem));\n if (childrendDataItemIds?.length > 0) {\n const everyChildIsSelected = childrendDataItemIds.every(childId => props?.selectedItems?.includes(childId));\n const someItemsAreSelected = childrendDataItemIds.some(childId => props?.selectedItems?.includes(childId));\n return !everyChildIsSelected && someItemsAreSelected;\n }\n return false;\n });\n\n // Methods\n const registerRowCellRef = (el: Element | ComponentPublicInstance, field: string) => {\n // We always know this will be used on a DataGridCell component so we can cast it\n const gridCellComponent = el as InstanceType<typeof DataGridCell>;\n\n if (el !== null && gridCellComponent?.gridcellRef) {\n gridcellRefs.value[field] = gridCellComponent.gridcellRef as HTMLDivElement;\n }\n };\n const getRowId = (childRowIndex: number) => {\n return nestedRowIds.value[childRowIndex];\n };\n const getRowAriaSelectedValue = (row: BentoDatagridDataItem): Booleanish => {\n if (!props.selectable) {\n return null;\n }\n\n const id = props.getDataItemId(row);\n return props.selectedItems.includes(id).toString() as Booleanish;\n };\n\n /**\n * Handles row clicks when the `allowRowClicks` prop is true.\n *\n * This method also prevents the `row-click` event from firing if the click\n * originated from an interactive element (like a button, input, or link)\n * within the row. This is to avoid unintended behavior when a user\n * interacts with controls inside a row.\n *\n * @param event The mouse or keyboard event from the click or key press.\n */\n const onRowClick = (event: MouseEvent | KeyboardEvent) => {\n // Only proceed if allowRowClicks is true\n if (!props.allowRowClicks) {\n return;\n }\n\n let isEventTargetInteractiveElement = false;\n const dataGridRowInteractiveTypes = ['button', 'input', 'a'];\n for (let i = 0; i < dataGridRowInteractiveTypes.length; i++) {\n if ((event?.target as HTMLElement)?.closest(dataGridRowInteractiveTypes[i])) {\n isEventTargetInteractiveElement = true;\n break;\n }\n }\n // Only trigger if element is NOT interactive\n if (!isEventTargetInteractiveElement) {\n emit('row-click', props.rowData, event);\n }\n };\n\n const onRowSelect = (value: Array<BentoDatagridDataItemId>) => {\n emit('select-row', value, props.rowData);\n };\n\n const onNestedRowSelect = (rowData: BentoDatagridDataItem, value: Array<BentoDatagridDataItemId>) => {\n emit('select-nested-row', value, props.rowData, rowData);\n };\n\n /**\n * Sets the state to indicate that a row action menu is open. This is used to apply a higher\n * z-index to the row's action container, ensuring the menu displays correctly above\n * subsequent rows.\n */\n const onRowActionMenuOpen = () => {\n isRowActionMenuOpen.value = true;\n };\n\n /**\n * Resets the state when a row action menu is closed, removing the elevated z-index from the\n * row's action container.\n */\n const onRowActionMenuClose = () => {\n isRowActionMenuOpen.value = false;\n };\n\n /**\n * When the row actions cell is focused, make the first interactive child focusable and focus it.\n * This allows for keyboard navigation into the cell's actions.\n */\n const onRowActionsCellFocus = () => {\n makeAllInteractiveChildrenFocusable([focusableItems.value?.[0]]);\n focusOnInteractiveChild(rowActionsRef.value);\n };\n\n /**\n * When focus leaves the row actions cell, make all interactive children unfocusable.\n * This ensures that tabbing through the grid skips over the individual actions within the cell.\n */\n const onRowActionsCellFocusOut = () => {\n makeAllInteractiveChildrenUnFocusable(rowActionsRef.value);\n };\n\n /**\n * Handles keyboard navigation within the row actions cell.\n * Allows using left and right arrow keys to move between interactive elements (e.g., buttons) in the cell.\n * @param e The keyboard event.\n */\n const onRowActionsCellOnKeyDown = (e: KeyboardEvent) => {\n if (e.key !== EventKey.TAB) {\n makeAllInteractiveChildrenUnFocusable(rowActionsRef.value);\n }\n if (\n e.key === EventKey.ARROW_RIGHT &&\n focusableItems.value?.length > 1 &&\n focusableItems.value[0].node === document.activeElement\n ) {\n makeAllInteractiveChildrenUnFocusable(rowActionsRef.value);\n focusableItems.value[1].node.setAttribute('tabindex', '0');\n focusableItems.value[1].node.focus();\n e.stopPropagation();\n e.preventDefault();\n } else if (\n e.key === EventKey.ARROW_LEFT &&\n focusableItems.value?.length > 1 &&\n focusableItems.value[1].node === document.activeElement\n ) {\n makeAllInteractiveChildrenUnFocusable(rowActionsRef.value);\n focusableItems.value[0].node.setAttribute('tabindex', '0');\n focusableItems.value[0].node.focus();\n e.stopPropagation();\n e.preventDefault();\n }\n };\n\n // Cell and Columns index calculation\n const sumColumnAmountsInColumnSets = () =>\n props.columnSets.reduce((total, { columnSet }) => total + columnSet.length, 0);\n const getRowActionsCellIndex = () =>\n sumColumnAmountsInColumnSets() * props.rowIndex + sumColumnAmountsInColumnSets();\n\n // Nested content expanding logic\n const { updateContentHeight, contentHeight } = useExpandableContentHeight(nestedContentRef, isNestedContentShown);\n const nestedContentStyles = computed(() => {\n if (props.hasNestedContent || props.hasNestedRows) {\n // calculate the padding by getting the action column width and the first column left padding:\n const paddingLeft =\n shouldShowRenderNestedRows.value || isLoadingNestedRows.value\n ? 0\n : gridcellRefs.value[DATAGRID_ACTIONS_COLUMN_FIELD_NAME].offsetWidth + DATAGRID_CELL_OFFSET_PADDING;\n\n return {\n paddingLeft: `${paddingLeft}px`,\n 'max-height':\n (props.hasNestedContent || props.hasNestedRows) &&\n contentHeight.value &&\n !contentHeight?.value?.includes('null')\n ? contentHeight.value\n : 0,\n };\n }\n return undefined;\n });\n watch(\n () => nestedContentRef.value,\n () => {\n let observer: ResizeObserver | null = null;\n if (!observer && nestedContentRef.value) {\n observer = observeSizeOfElement(nestedContentRef.value, () => {\n if (nestedContentRef.value) {\n updateContentHeight();\n }\n });\n }\n }\n );\n const nestedContentToggled = () => {\n isNestedContentShown.value = !isNestedContentShown.value;\n updateContentHeight();\n emit('nested-content-toggled', props.rowData);\n };\n\n watch(\n () => props.rowData?.children,\n (_newChildren, oldChildren) => {\n if (props?.rowData?.children?.length > 0 && oldChildren === undefined && !isNestedContentShown.value) {\n updateContentHeight();\n }\n }\n );\n\n const isSmallContainer: ComputedRef<boolean> = inject(\n DATA_GRID_SMALL_CONTAINER,\n computed(() => false)\n );\n\n const isHighlightedRow = row => props.highlightedRows.includes(props.getDataItemId(row));\n const isSelectedRow = row => props.selectedItems.includes(props.getDataItemId(row));\n\n // Styling\n const conditionalRowClasses = (row: BentoDatagridDataItem, rowIndex: number) => ({\n 'b-data-grid-row-container__row--disabled': props.isDataItemDisabled(row),\n 'b-data-grid-row-container__row--row-clicks-enabled': props.allowRowClicks,\n 'b-data-grid-row-container__row--highlighted': isHighlightedRow(row),\n 'b-data-grid-row-container__row--selected': isSelectedRow(row),\n 'b-data-grid-row-container__row--hovered': props.hoveredRowIndex === rowIndex,\n 'b-data-grid-row-container__row--is-last-child': props.isRowLastChild && !isNestedContentShown.value,\n 'b-data-grid-row-container__row--nested-row': props.isNestedRow,\n 'b-data-grid-row-container__row--zebra': props.isRowEven,\n });\n const conditionalRowSetClasses = (isFrozenRowSet: boolean, isSmallContainer: boolean) => ({\n 'b-data-grid-row-container__row-cell-set--frozen': isFrozenRowSet && !isSmallContainer,\n [`b-data-grid-row-container__row-cell-set--${BentoDatagridStyleState.OVERFLOW_SHADOW_LEFT}`]:\n !isSmallContainer && isFrozenRowSet && props.hasLeftOverflow,\n 'b-data-grid-row-container__row-cell-set--frozen-separator':\n !isSmallContainer && isFrozenRowSet && props.showFrozenColumnsSeparator,\n 'b-data-grid-row-container__row-cell-set--unfrozen': !isFrozenRowSet || isSmallContainer,\n 'b-data-grid-row-container__row-cell-set--is-measuring': props.isMeasuringColumnWidths,\n });\n const conditionalNestedRowClasses = computed(() => ({\n 'b-data-grid-row-container__row-nested-slot--is-last-child': props.isRowLastChild,\n 'b-data-grid-row-container__row-nested-slot':\n !shouldShowRenderNestedRows.value && props.shouldShowNestedContent(props.rowData),\n }));\n const conditionalRowActionsContainerClasses = computed(() => ({\n 'b-data-grid-row-container__row-actions-container--row-actions-menu-open': isRowActionMenuOpen.value,\n }));\n const computedRowActionsStyles = computed(() => ({\n minWidth: `${props.rowActionsMaximumWidth}px`,\n }));\n\n // Exposed refs\n defineExpose({\n gridcellRefs,\n rowActionsRef,\n });\n</script>\n\n<script lang=\"ts\">\n /**\n * Internal component to display the BentoDataGrid data rows containig the data row cells.\n *\n * @example\n *\n * export default {\n * components: { DataGridRow },\n * template: `\n * <data-grid-row\n * :ref=\"el => registerRowCellRefs(el, rowIndex)\"\n * :style=\"gridColumnWidthStyle\"\n * :allow-row-clicks=\"allowRowClicks\"\n * :column-sets=\"columnSets\"\n * :condensed=\"condensed\"\n * :dragging-columns=\"draggingColumns\"\n * :dragging-events-for-row-cell=\"draggingEventsForRowCell\"\n * :get-data-item-id=\"getDataItemId\"\n * :has-left-overflow=\"hasLeftOverflow\"\n * :highlighted-rows=\"highlightedRows\"\n * :hovered-row-index=\"hoveredRowIndex\"\n * :hovered-over-column-state=\"hoveredOverColumnState\"\n * :is-data-item-disabled=\"isDataItemDisabled\"\n * :is-measuring-column-widths=\"isMeasuringColumnWidths\"\n * :row-data=\"rowData\"\n * :row-index=\"rowIndex\"\n * :show-frozen-columns-separator=\"showFrozenColumnsSeparator\"\n * :selectable=\"selectable\"\n * :selected-items=\"selectedItems\"\n * @cell-hovered=\"onCellHover\"\n * @row-click=\"onRowClick\"\n * @on-frozen-columns-key-press=\"updateScrollPositionOnFrozenColumnsNavigation\"\n * @select-row=\"onRowSelect\"\n * >\n * <template v-for=\"(_, innerSlot) of slots\" #[innerSlot]=\"scope\">\n * <slot :name=\"innerSlot\" v-bind=\"scope\" />\n * </template>\n * </data-grid-row>\n * `\n */\n export default {\n name: 'data-grid-row',\n };\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-row.scss\" />\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><g :clip-path=\"'url(#uia-ui-assets/icons-16-warning_circle_fill__a' + uuid + ')'\"><path fill=\"#001222\" d=\"M8 0.25C12.2802 0.25 15.75 3.71979 15.75 8C15.75 12.2802 12.2802 15.75 8 15.75C3.71979 15.75 0.25 12.2802 0.25 8C0.25 3.71979 3.71979 0.25 8 0.25ZM8 9.75C7.44772 9.75 7 10.1977 7 10.75C7 11.3023 7.44772 11.75 8 11.75C8.55228 11.75 9 11.3023 9 10.75C9 10.1977 8.55228 9.75 8 9.75ZM7.25 4.25V8.75H8.75V4.25H7.25Z\"/></g><defs><clipPath :id=\"'uia-ui-assets/icons-16-warning_circle_fill__a' + uuid\"><rect width=\"16\" height=\"16\" fill=\"#fff\"/></clipPath></defs></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","<template>\n <div\n v-bento-tooltip-directive:[tooltipPosition]=\"tooltipText\"\n :aria-label=\"tooltipText\"\n class=\"b-data-grid-static-icon\"\n :class=\"conditionalClasses\"\n tabindex=\"0\"\n >\n <component :is=\"computedIcon\" :class=\"computedIconClass\" :svg-title=\"tooltipText\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue';\n import CheckmarkIcon from '@adyen/ui-assets-icons-16/vue/checkmark-circle-fill';\n import WarningIcon from '@adyen/ui-assets-icons-16/vue/warning-filled';\n import ErrorIcon from '@adyen/ui-assets-icons-16/vue/warning-circle-fill';\n import CrossIcon from '@adyen/ui-assets-icons-16/vue/cross';\n import NoValueIcon from '@adyen/ui-assets-icons-16/vue/minus-small';\n import { BentoTooltipDirective as vBentoTooltipDirective } from '@/directives';\n import { PopperContainerPosition } from '@/components/popper-container';\n import { type BentoDataGridStaticIconVariant } from './data-grid-static-icon.types';\n\n const props = defineProps({\n colored: { type: Boolean, default: false },\n tooltipText: null,\n variant: { default: 'no-value' }\n});\n\n const computedIcon = computed(() => {\n switch (props.variant) {\n case 'checkmark':\n return CheckmarkIcon;\n case 'warning':\n return WarningIcon;\n case 'error':\n return ErrorIcon;\n case 'cross':\n return CrossIcon;\n case 'no-value':\n return NoValueIcon;\n default:\n return NoValueIcon;\n }\n });\n\n const conditionalClasses = computed(() => ({\n [`b-data-grid-static-icon--colored`]: props.colored && props.variant !== 'no-value',\n }));\n\n const computedIconClass = computed(() => `b-data-grid-static-icon__${props.variant}`);\n\n const tooltipPosition = computed(() => PopperContainerPosition.AUTO);\n</script>\n\n<script lang=\"ts\">\n /**\n * The bento-data-grid-static-icon is an icon component with an associated toltip to be used within cellls of the bento-data-grid\n *\n * @example\n * import { BentoDataGridStaticIcon } from '@adyen/bento-vue2';\n *\n * export default {\n * components: { BentoDataGridStaticIcon },\n * template: `\n * <bento-data-grid-static-icon variant=\"warning\" text=\"Your tooltip text\" />\n * `\n * }\n */\n export default {};\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-static-icon.scss\" />\n","<template>\n <div class=\"b-data-grid-summary-cell\">\n <bento-dashed-underline v-if=\"items.length > 1\" ref=\"dashedUnderlineRef\" v-bind=\"dashedUnderlineProps\">\n {{ label }}\n <template #popover-content>\n <bento-typography class=\"b-data-grid-summary-cell__popover-content\">\n <ul class=\"b-data-grid-summary-cell__list\">\n <li v-for=\"item in items\" :key=\"item\">\n <component :is=\"highlightedComponent(item)\">{{ item }}</component>\n </li>\n </ul>\n </bento-typography>\n </template>\n </bento-dashed-underline>\n <template v-else>{{ items[0] }}</template>\n <tooltip\n v-if=\"dashedUnderlineRef && computedToolTipText\"\n :content=\"computedToolTipText\"\n :disabled-focus-trap=\"true\"\n :position=\"BentoTooltipPosition.RIGHT\"\n :fallback-position=\"['left', 'bottom']\"\n :is-shown=\"!!computedToolTipText\"\n :target-element=\"dashedUnderlineRef\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, ref } from 'vue';\n import { BentoDashedUnderline, type BentoDashedUnderlineProps } from '@/components/dashed-underline';\n import { BentoTypography } from '@/components/typography';\n import { Tooltip } from '@/components/internal';\n import { BentoTooltipPosition } from '../../../internal/tooltip/tooltip.types';\n import { useI18n } from '@/utils/ts/i18n';\n import messages from './messages.json';\n import type { BentoDataGridSummaryCellProps } from './data-grid-summary-cell.types';\n\n type MessageSchema = (typeof messages)['en-US'];\n\n const { tc } = useI18n<{ message: MessageSchema }>({ messages });\n\n const props = defineProps({\n label: null,\n items: null,\n dashedUnderline: { default: () => ({}) },\n searchTerm: { default: '' },\n tooltipText: { default: null }\n});\n const dashedUnderlineRef = ref();\n\n const dashedUnderlineProps = computed<BentoDashedUnderlineProps>(() => ({\n popoverPosition: 'right', // Setting popover defaults, but they are overriden if used passes dashedUnderline prop\n popoverTitle: props.label,\n popoverSize: 'small',\n ...props.dashedUnderline,\n // We force teleport as this is needed for the popover to appear above all the data grid elements\n teleport: {\n disabled: false,\n },\n }));\n\n const lowerCaseSearchTerm = computed(() => props.searchTerm?.toLowerCase() ?? '');\n const highlightedComponent = (item: string) =>\n props.searchTerm && item.toLowerCase().includes(lowerCaseSearchTerm.value) ? 'mark' : 'span';\n\n const highlightedItemsCount = computed(() => {\n if (!props.searchTerm) {\n return 0;\n }\n return props.items.filter(item => item.toLowerCase().includes(lowerCaseSearchTerm.value)).length;\n });\n const computedToolTipText = computed(\n () =>\n props.tooltipText ??\n (highlightedItemsCount.value > 0 ? tc('numberResults', highlightedItemsCount.value) : '')\n );\n</script>\n\n<script lang=\"ts\">\n /**\n * A specialized cell for `bento-data-grid` to display a summary of multiple items.\n *\n * @example\n * import { BentoDataGridSummaryCell } from '@adyen/bento-vue2';\n *\n * export default {\n * components: { BentoDataGridSummaryCell },\n * template: `\n * <bento-data-grid-summary-cell\n * label=\"2 merchants\"\n * :items=\"['Merchant A', 'Merchant B']\"\n * />\n * `\n * }\n */\n export default {\n i18n: { messages },\n };\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-summary-cell.scss\" />\n","<template>\n <div\n ref=\"dataGridRef\"\n class=\"b-data-grid\"\n data-testid=\"data-grid\"\n :class=\"conditionalGridClasses\"\n aria-live=\"polite\"\n :aria-busy=\"loading\"\n @copy=\"handleClipboard\"\n >\n <div\n v-if=\"filters\"\n ref=\"filtersRef\"\n class=\"b-data-grid__filters\"\n :class=\"conditionalFilterClasses\"\n :style=\"{ top: computedStickyFiltersTopPosition }\"\n :aria-controls=\"dataGridUid\"\n :aria-label=\"t('filterBar')\"\n role=\"region\"\n >\n <bento-filter-bar\n v-if=\"filters\"\n ref=\"filterBarRef\"\n :config=\"filters\"\n :container-size-layout=\"filtersContainerSizeLayout\"\n :filter-values=\"filterValues\"\n :filter-values-object=\"filterValuesObject\"\n :search=\"filterSearchConfig\"\n :search-term=\"filterSearchTerm\"\n @search-input=\"onSearchTermInput\"\n @search-clear=\"onSearchTermCleared\"\n @input=\"filters => $emit(BentoDatagridEvent.UPDATE_FILTERS, filters)\"\n @update:filter-values=\"filterValues => $emit(BentoDatagridEvent.UPDATE_FILTER_VALUES, filterValues)\"\n @update:filter-values-object=\"\n filterValueObject => $emit(BentoDatagridEvent.UPDATE_FILTER_VALUES_OBJECT, filterValueObject)\n \"\n />\n </div>\n <div v-if=\"$slots.header\" class=\"b-data-grid__header\">\n <slot name=\"header\"></slot>\n </div>\n <div\n :id=\"dataGridUid\"\n :role=\"ariaGridRole\"\n :aria-rowcount=\"data.length\"\n :aria-colcount=\"columns.length\"\n :aria-label=\"emptyState ? t('noResults') : null\"\n class=\"b-data-grid__wrapper\"\n :style=\"{ top: computedColumnHeadersTopPosition }\"\n >\n <div class=\"b-data-grid__column-headers\" :style=\"{ top: computedColumnHeadersTopPosition }\">\n <div\n ref=\"columnsRef\"\n role=\"rowgroup\"\n class=\"b-data-grid__columns-row\"\n @scroll=\"updateScrollPosition\"\n @keydown=\"navigationInput\"\n >\n <div v-if=\"columnPanel\" role=\"row\">\n <bento-data-grid-config-settings\n class=\"b-data-grid__config-settings\"\n role=\"gridcell\"\n :columns=\"localColumnsState\"\n :condensed=\"condensed\"\n :zebra-rows=\"internalZebraRows\"\n @update:condensed=\"onConfigSettingsCondensedUpdate\"\n @update:zebra-rows=\"onConfigSettingsZebraRowsUpdate\"\n @update:columns=\"onConfigSettingsColumnsUpdate\"\n />\n </div>\n <div :style=\"gridRowWidthStyle\" class=\"b-data-grid__columns\" role=\"row\">\n <template v-for=\"({ columnSet, id, isFrozenColumns }, index) of columnSets\">\n <data-grid-columns\n v-if=\"columnSet?.length\"\n :key=\"`data-grid-columns-${id}`\"\n :ref=\"el => registerColumnHeaderRefs(el)\"\n :columns=\"columnSet\"\n :has-resizable-columns=\"hasResizableColumns\"\n :sort-by=\"sortBy\"\n :all-items-selected-state=\"allItemsSelectedState\"\n :is-frozen-columns=\"isFrozenColumns\"\n :show-frozen-columns-separator=\"showFrozenColumnsSeparator\"\n :dragging-columns=\"draggingColumns\"\n :has-draggable-columns=\"allowColumnDragAndDrop\"\n :has-column-panel=\"columnPanel\"\n :has-left-overflow=\"hasLeftOverflow\"\n :has-first-column-panel-right-aligned=\"index === computedColumnPanelAlignment\"\n :hovered-over-column-state=\"hoveredOverColumnState\"\n :is-measuring-column-widths=\"isMeasuringColumnWidths\"\n :is-only-one-visible-column=\"isOnlyOneVisibleColumn\"\n :selectable=\"data?.length > 0 && selectable\"\n :selectable-across-pages=\"selectableAcrossPagesComputed\"\n :selected-items=\"selectedItems\"\n :visible-rows-state=\"visibleRowsState\"\n :selection-state=\"selectionState\"\n :truncate-column-headers=\"truncateColumnHeaders\"\n :row-actions-maximum-width=\"rowActionsMaxWidth\"\n v-on=\"draggingEventsForColumns\"\n @column-hover=\"hoveredOverColumn = $event\"\n @column-move=\"onMoveColumnByOffset\"\n @column-update=\"onConfigSettingsColumnUpdate\"\n @column-resize=\"onColumnResized\"\n @column-resizing=\"onColumnWidthOverride\"\n @select-all-rows=\"onAllRowSelect\"\n @select-all-across-pages=\"emit(BentoDatagridEvent.SELECT_ALL_ACROSS_PAGES)\"\n @select-all-current-results=\"emit(BentoDatagridEvent.SELECT_ALL_CURRENT_RESULTS)\"\n @deselect-all-current-results=\"emit(BentoDatagridEvent.DESELECT_ALL_CURRENT_RESULTS)\"\n @deselect-all=\"onDeselectAll\"\n @sort=\"onSort\"\n >\n <template v-for=\"(_, innerSlot) of slots\" #[innerSlot]=\"scope\">\n <slot :name=\"innerSlot\" v-bind=\"scope\" />\n </template>\n </data-grid-columns>\n </template>\n </div>\n </div>\n </div>\n <div\n ref=\"body\"\n data-testid=\"data-grid-body\"\n class=\"b-data-grid__body\"\n :class=\"conditionalGridBodyClasses\"\n @scroll=\"updateScrollPosition\"\n >\n <div v-if=\"loading && !isLazyLoad\" class=\"b-data-grid__loading\">\n <bento-loading-indicator class=\"b-data-grid__loading-indicator\" large />\n <bento-typography el=\"span\" variant=\"caption\">{{ t('gettingYourData') }}</bento-typography>\n </div>\n\n <div v-else role=\"rowgroup\" @keydown=\"navigationInput\">\n <template v-if=\"data?.length === 0 && emptyState\">\n <div role=\"row\" tabindex=\"-1\">\n <div role=\"gridcell\" :aria-colspan=\"columns.length\" tabindex=\"-1\">\n <bento-empty-state class=\"b-data-grid__empty-state\" v-bind=\"limitedEmptyStateProps\" />\n </div>\n </div>\n </template>\n <data-grid-row\n v-for=\"(rowData, rowIndex) in data\"\n v-else\n :key=\"rowIndex\"\n :ref=\"el => registerRowCellRefs(el, rowIndex)\"\n :style=\"gridRowWidthStyle\"\n :allow-row-clicks=\"allowRowClicks\"\n :column-sets=\"columnSets\"\n :condensed=\"condensed\"\n :dragging-columns=\"draggingColumns\"\n :dragging-events-for-row-cell=\"draggingEventsForRowCell\"\n :get-data-item-id=\"getDataItemId\"\n :has-nested-content=\"hasNestedContent\"\n :has-nested-rows=\"hasNestedRows\"\n :has-left-overflow=\"hasLeftOverflow\"\n :has-right-overflow=\"hasRightOverflow\"\n :highlighted-rows=\"highlightedRows\"\n :hovered-row-index=\"hoveredRowIndex\"\n :hovered-over-column-state=\"hoveredOverColumnState\"\n :is-data-item-disabled=\"isDataItemDisabled\"\n :is-row-even=\"internalZebraRows ? rowIndex % 2 !== 0 : false\"\n :is-row-last-child=\"rowIndex + 1 === data?.length\"\n :is-measuring-column-widths=\"isMeasuringColumnWidths\"\n :row-actions-maximum-width=\"rowActionsMaxWidth\"\n :row-actions=\"rowActions\"\n :row-data=\"rowData\"\n :row-index=\"rowIndex\"\n :row-set-size=\"data?.length\"\n :show-frozen-columns-separator=\"showFrozenColumnsSeparator\"\n :should-show-nested-content=\"shouldShowNestedContent\"\n :should-show-nested-rows=\"shouldShowNestedRows\"\n :selectable=\"selectable\"\n :selected-items=\"selectedItems\"\n @cell-hovered=\"onCellHover\"\n @nested-content-toggled=\"emit(BentoDatagridEvent.NESTED_CONTENT_TOGGLED, $event)\"\n @row-click=\"onRowClick\"\n @on-frozen-columns-key-press=\"updateScrollPositionOnFrozenColumnsNavigation\"\n @select-row=\"onRowSelect\"\n @select-nested-row=\"onNestedRowSelect\"\n >\n <template v-for=\"(_, innerSlot) of slots\" #[innerSlot]=\"scope\">\n <slot :name=\"innerSlot\" v-bind=\"scope\" />\n </template>\n </data-grid-row>\n </div>\n </div>\n </div>\n\n <data-grid-lazy-load\n v-if=\"isLazyLoad\"\n :loading=\"loading\"\n :is-infinite-scroll=\"isInfiniteScroll\"\n @update:show-more=\"emitLazyLoadEvent\"\n />\n\n <div\n v-if=\"stickyHorizontalScrollbar\"\n ref=\"virtualHorizontalScrollbarRef\"\n class=\"b-data-grid__horizontal-scrollbar\"\n aria-hidden=\"true\"\n data-testid=\"sticky-horizontal-scrollbar\"\n :style=\"horizontalScrollbarConditionalStyles\"\n @scroll=\"syncVirtualScrollerWithBody\"\n >\n <div :style=\"{ width: `${totalWidthOfAllColumns}px`, height: '15px' }\"></div>\n </div>\n <div\n v-if=\"pagination && !isLazyLoad\"\n ref=\"paginationContainerRef\"\n data-testid=\"pagination-container\"\n class=\"b-data-grid__pagination\"\n :class=\"conditionalPaginationClasses\"\n >\n <bento-pagination\n v-bind=\"pagination\"\n :aria-label=\"$t('pagination')\"\n :aria-controls=\"dataGridUid\"\n @navigate=\"onPaginationNavigate\"\n @items-page=\"onItemsPerPageChange\"\n >\n <slot v-if=\"hasSlot('pagination-slot')\" name=\"pagination-slot\"></slot>\n </bento-pagination>\n </div>\n <div v-if=\"$slots.footer\" class=\"b-data-grid__footer\"><slot name=\"footer\"></slot></div>\n <bento-action-bar\n v-if=\"showActionBar\"\n :actions=\"bulkActions\"\n :item-counter=\"itemsSelectedCounter\"\n :extra-bottom-spacing=\"stickyPagination\"\n @close=\"onDeselectAll\"\n />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\n import {\n type ComponentPublicInstance,\n computed,\n inject,\n onMounted,\n type PropType,\n provide,\n ref,\n toRef,\n toRefs,\n useSlots,\n } from 'vue';\n\n // Components\n import { BentoActionBar } from '@/components/action-bar';\n import { BentoPagination } from '@/components/pagination';\n import { BentoLoadingIndicator } from '@/components/loading-indicator';\n import { BentoTypography } from '@/components/typography';\n import { BentoDataGridConfigSettings, DataGridColumns, DataGridLazyLoad, DataGridRow } from './components';\n\n // Composables\n import {\n DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME,\n useCalculateColumnWidth,\n useColumnHovering,\n useColumnReorderer,\n useConfigSettings,\n useKeyboardNavigator,\n useLazyLoading,\n useScroller,\n useSelector,\n } from './composables';\n import { useCalculateStickyElementHeight, useHasSlot } from '@/composables';\n\n // Utils\n import { generateUid } from '@/core/utils/ts/generate-uid';\n import { useI18n } from '@/utils/ts/i18n';\n import { printDevelopmentWarning } from '@/utils/ts/print-development-warning';\n import { handleClipboard } from '@/components/data-grid/utils/handle-clipboard/handle-clipboard';\n\n // Types\n import {\n type BentoColumn,\n type BentoDatagridData,\n type BentoDatagridDataItem,\n type BentoDatagridDataItemId,\n type BentoDatagridEmptyStateProps,\n BentoDatagridEvent,\n type BentoDatagridGetDataItemIdFn,\n type BentoDatagridIsDataItemDisabledFn,\n type BentoDatagridPaginationProps,\n type BentoDatagridShouldShowNestedContentFn,\n type BentoDatagridShouldShowNestedRowsFn,\n type BentoDatagridSortByColumn,\n BentoDatagridStyleState,\n type BentoDataGridVisibleRowsState,\n } from './data-grid.types';\n import { type BentoTabProvidedTitle } from '../tabs/components/tab.types';\n import { type BentoDataGridTemplateDataGrid } from '@/templates/data-grid-template/data-grid-template.types';\n import { type BentoLazyLoadType } from '@/types/lazy-load';\n import type { BentoButtonActionsList } from '@/components/button';\n import {\n BentoFilterBar,\n type BentoFilterBarContainerSizeLayout,\n type BentoFilterBarModel,\n type BentoFilterBarSearchBarProps,\n type BentoFilterValueObject,\n } from '@/components/filter-bar';\n import { BentoEmptyState } from '@/components/empty-state';\n import type { DatagridColumnsHeaderReferences } from '@/components/data-grid/components/data-grid-columns/data-grid-columns.types';\n import type { BentoDataGridRowActionsProp } from '@/components/data-grid/components/data-grid-cell-actions/data-grid-cell-actions.types';\n\n // Keys\n import { EXTERNAL_TITLE_REGISTER_ENTRY_INJECTION_KEY } from '@/components/tabs/tabs.keys';\n import { DATA_GRID_REGISTER_TEMPLATE_INJECTION_KEY } from '@/templates/data-grid-template/data-grid-template.keys';\n import { DATA_GRID_SLASHED_ZERO, DATA_GRID_SMALL_CONTAINER, DATA_GRID_TOUCH_DEVICE } from './data-grid.keys';\n\n // Translations\n import messages from './messages.json';\n import { useElementSize } from '@vueuse/core';\n\n type MessageSchema = (typeof messages)['en-US'];\n\n const props = defineProps({\n /**\n * When true, will emit a 'rowClick' event when a row is clicked. Will add cursor: pointer to rows.\n */\n allowRowClicks: { type: Boolean, default: false },\n\n /**\n * When true, column headers will become draggable, allowing users to rearrange columns.\n */\n allowColumnDragAndDrop: { type: Boolean, default: true },\n\n /**\n * List of actions that will be rendered in the action bar when user selects items.\n *\n * Each object in the list should have a `title`, an `event` and,\n * optionally, an `icon`.\n *\n * The component will display 4 actions and the hide the rest inside a menu.\n *\n * @see BentoButton for a list of all the other props supported by each button action.\n */\n bulkActions: {\n type: Array as PropType<BentoButtonActionsList>,\n default: null,\n },\n\n /**\n * Sets the row cells to the condensed padding state.\n */\n condensed: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Column definitions using 'key' to relate to data object.\n */\n columns: {\n type: Array as PropType<Array<BentoColumn>>,\n required: true,\n },\n\n /**\n * Enables / hides the display options panel and the column contextual menu functionality.\n */\n columnPanel: { type: Boolean, default: false },\n\n /**\n * An array of data objects to display.\n */\n data: {\n type: Array as PropType<BentoDatagridData>,\n required: true,\n },\n\n /**\n * Empty state props that will be passed down to inner empty-state component\n */\n emptyState: {\n type: Object as PropType<BentoDatagridEmptyStateProps>,\n default: undefined,\n },\n\n /**\n * filter-bar value (i.e. filters) that will be passed down to inner filter-bar component\n * {@see BentoFilterBarModel}\n */\n filters: {\n // TODO: Change this to BentoFilterBarProps['value'] when the interface is available\n type: Array as PropType<BentoFilterBarModel>,\n default: undefined,\n },\n\n /**\n * Defines the layout (multi-line or one-line) to be used in the filter bar for different\n * container sizes:\n * - Large (>=700px): Always multi-line\n * - Medium (>=430px & <700px)\n * - Small (<430px)\n *\n * @default\n * {\n * medium: 'multi-line',\n * small: 'one-line'\n * }\n */\n filtersContainerSizeLayout: {\n type: Object as PropType<BentoFilterBarContainerSizeLayout>,\n default: undefined,\n },\n\n /**\n * An array of the values for each filter set in `value`.\n * {@see BentoFilterValues}\n */\n filterValues: {\n type: BentoFilterBar.props.filterValues.type,\n default: () => [],\n },\n\n /**\n * An object of the values for each filter in the filter bar where key is a the field name and the value is the BentoFilterBarValue.\n *\n * @example\n * {\n * 'company': '200',\n * 'name': 'some text'\n * },\n */\n filterValuesObject: {\n type: Object as PropType<BentoFilterValueObject>,\n default: () => undefined,\n },\n\n // TODO: Move this prop as a part of \"config\" BentoFilterBarModel = Array<BentoFilterModel | BentoFilterSearchModel> in Bento 2.0.\n // It was not done now because it's a breaking change for the types.\n /**\n * Filter's search bar properties with which the placeholder, hint and other\n * \"bento-search-bar\" properties can be set. @see {@link BentoFilterBarSearchBarProps}\n */\n filterSearchConfig: {\n type: Object as PropType<BentoFilterBarSearchBarProps>,\n default: undefined,\n },\n\n /**\n * Filter bar search term useful to filter all the data by text\n */\n filterSearchTerm: {\n type: BentoFilterBar.props.searchTerm.type,\n default: undefined,\n },\n\n /**\n * Allows the grid to be rendered inside a confined space.\n * This makes the data-grid expand to fill the height of its parent container, with the grid body becoming scrollable.\n */\n fitContent: { type: Boolean, default: false },\n\n /**\n * A customisable method to retrieve a unique identifier for a data item in the array of data supplied.\n * This is used selecting and performance reasons and must exist in each data item.\n */\n getDataItemId: {\n type: Function as PropType<BentoDatagridGetDataItemIdFn>,\n default: (item: BentoDatagridDataItem) => item.id,\n },\n\n /**\n * Row actions propery that generates which button to show in row actions area\n */\n rowActions: {\n type: [Function, Array] as PropType<BentoDataGridRowActionsProp>,\n default: undefined,\n },\n\n /**\n * If resize is enabled\n */\n hasResizableColumns: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Enables the nested content slot functionality.\n */\n hasNestedContent: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Enables the nested content slot functionality.\n */\n hasNestedRows: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Highlighted items\n */\n highlightedRows: {\n type: Array as PropType<Array<BentoDatagridDataItemId>>,\n default: () => [],\n },\n\n /**\n * A customisable method to determine if a row is not selectable.\n * The default is that every row is selectable.\n */\n isDataItemDisabled: {\n type: Function as PropType<BentoDatagridIsDataItemDisabledFn>,\n default: () => false,\n },\n\n /**\n * The type of `Lazy Load`.\n * Type \"automatic\" will enable infinite scrolling\n * Type \"button\" will enable lazy loading with \"Show more\" button\n * @values automatic, button, none\n */\n lazyLoadType: {\n type: String as PropType<BentoLazyLoadType>,\n default: 'none',\n validator: (value: BentoLazyLoadType) => ['automatic', 'button', 'none'].includes(value),\n },\n\n /**\n * If the loading indicator should be shown.\n */\n loading: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Enables / Disables the table's surrounding border.\n */\n outline: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Renders the data grid with no top spacing, to render inside containers that already have spacing\n */\n noSpacingTop: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Pagination props that will be passed down to inner pagination component\n */\n pagination: {\n type: Object as PropType<BentoDatagridPaginationProps>,\n default: undefined,\n },\n\n /**\n * Adds an extra option when selecting all items that allows user to select items in other pages too.\n * Needs pagination.totalCount to be set.\n */\n selectableAcrossPages: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Renders a font numeric style with slashed zeros instead of normal ones.\n */\n slashedZero: { type: Boolean, default: false },\n\n /**\n * Sticks the horizontal scrollbar to the bottom of the screen if the data-grid is larger than the screen height.\n */\n stickyHorizontalScrollbar: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Make pagination stick to the bottom of the page when the data-grid is bigger than the screen.\n * Because styles have to be applied to pagination container element, this has to be a data-grid prop (rather than a pagination prop).\n */\n stickyPagination: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Make data-grid filters stick to the top of the page along with the data-grid headers.\n * Defaults to true.\n */\n stickyFilters: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Enables / Disables rows to be selected via a checkbox. On select the \"select\" event will be emitted.\n */\n selectable: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Selected items\n */\n selection: {\n type: Array as PropType<Array<BentoDatagridDataItemId>>,\n default: () => [],\n },\n\n /**\n * Enables / Disables the nested-content slot\n */\n shouldShowNestedContent: {\n type: Function as PropType<BentoDatagridShouldShowNestedContentFn>,\n default: (_item: BentoDatagridDataItem) => true,\n },\n\n /**\n * Returns the nested rows for a given BentoDatagridDataItem.\n */\n shouldShowNestedRows: {\n type: Function as PropType<BentoDatagridShouldShowNestedRowsFn>,\n default: (_item: BentoDatagridDataItem) => true,\n },\n\n /**\n * Sortby handles proper rendering of sort icon in header. Sorting currently is only supported server side.\n * It does make sure the currently sorted column has a more visible sort icon, and the sort icon points in the right direction.\n */\n sortBy: {\n type: Array as PropType<Array<BentoDatagridSortByColumn>>, // NOTE: is an array to allow multi-sorting in the future\n default: () => [],\n },\n /**\n * Title of the data grid to be rendered as tab title when a data grid is passed in a tab layout.\n */\n tabTitle: {\n type: String,\n default: null,\n },\n\n /**\n * Truncates all data grid column headers\n */\n truncateColumnHeaders: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Toggles the alternating background color of rows.\n */\n zebraRows: {\n type: Boolean,\n default: false,\n },\n });\n\n const slots = useSlots();\n const hasSlot = useHasSlot(slots);\n\n /* == Variables and references == */\n // Create refs for elements\n const body = ref<HTMLDivElement>(null);\n const columnsRef = ref<HTMLDivElement>();\n const columnHeaderRefs = ref<DatagridColumnsHeaderReferences>({});\n const dataGridUid = ref<string>(generateUid('data-grid'));\n const gridcellRefs = ref<{ [key: string]: Array<HTMLDivElement> }>(null);\n const filtersRef = ref<HTMLDivElement>(null);\n const filterBarRef = ref<InstanceType<typeof BentoFilterBar>>();\n const paginationContainerRef = ref<HTMLDivElement>(null);\n const verticalScrollPositionRef = ref(null);\n const virtualHorizontalScrollbarRef = ref<HTMLDivElement>(null);\n const {\n allowColumnDragAndDrop,\n columns,\n columnPanel,\n data,\n lazyLoadType,\n loading,\n hasNestedContent,\n hasNestedRows,\n selectable,\n selection,\n selectableAcrossPages,\n stickyPagination,\n outline,\n pagination,\n zebraRows,\n } = toRefs(props);\n const hoveredRowIndex = ref(-1);\n\n const { t } = useI18n<{ message: MessageSchema }>({ messages });\n const frozenColumnsLength = computed(() => columnDefs.value.filter(column => column.frozen).length);\n\n /* == Responsive behaviour == */\n // Identifies if the data-grid is in a container smaller than 550px\n const MOBILE_BREAKPOINT = 550;\n const dataGridRef = ref();\n const { width } = useElementSize(dataGridRef);\n const isSmallContainer = computed(() => width.value <= MOBILE_BREAKPOINT);\n provide(DATA_GRID_SMALL_CONTAINER, isSmallContainer);\n\n /* == Touch device behaviour == */\n // Identifies if the data-grid is rendered on a touch device\n const isTouchDevice = ref(false);\n onMounted(() => {\n if (typeof window !== 'undefined') {\n isTouchDevice.value = 'ontouchstart' in window || navigator?.maxTouchPoints > 0;\n }\n });\n provide(DATA_GRID_TOUCH_DEVICE, isTouchDevice);\n\n /* == Data-grid template == */\n const registerDatagridInDataGridTemplate: BentoDataGridTemplateDataGrid = inject(\n DATA_GRID_REGISTER_TEMPLATE_INJECTION_KEY,\n () => ({\n additionalContentSlotRef: ref(null),\n isDataGridTemplate: false,\n stickyAditionalContent: ref(false),\n stickyTabs: ref(false),\n tabsRef: ref(null),\n })\n );\n const { additionalContentSlotRef, isDataGridTemplate, stickyTabs, tabsRef, stickyAdditionalContent } =\n registerDatagridInDataGridTemplate();\n\n /* == Composable logic == */\n // Column width calculation\n const {\n columnDefs,\n onColumnWidthOverride,\n gridRowWidthStyle,\n isMeasuringColumnWidths,\n isTotalWidthOfColumnsTakingUpAllAvailableGridWidth,\n columns: localColumnsState,\n totalWidthOfAllColumns,\n rowActionsMaxWidth,\n } = useCalculateColumnWidth(columns, data, body, columnHeaderRefs, gridcellRefs, {\n hasColumnPanel: columnPanel,\n hasSelectableColumn: selectable,\n hasSelectableAcrossPages: selectableAcrossPages,\n hasNestedContent,\n hasNestedRows,\n allowColumnDragAndDrop,\n isDataGridTemplate: isDataGridTemplate,\n });\n\n /* == Emitting logic == */\n const definedEmitsFunction = defineEmits([\n BentoDatagridEvent.COLUMNS,\n BentoDatagridEvent.COLUMN_RESIZE,\n BentoDatagridEvent.ITEMS_PAGE,\n BentoDatagridEvent.FILTER_SEARCH_INPUT,\n BentoDatagridEvent.FILTER_SEARCH_CLEAR,\n BentoDatagridEvent.NAVIGATE,\n BentoDatagridEvent.NESTED_CONTENT_TOGGLED,\n BentoDatagridEvent.UPDATE_COLUMNS,\n BentoDatagridEvent.UPDATE_CONDENSED,\n BentoDatagridEvent.UPDATE_FILTER_VALUES,\n BentoDatagridEvent.UPDATE_FILTER_VALUES_OBJECT,\n BentoDatagridEvent.UPDATE_FILTERS,\n BentoDatagridEvent.UPDATE_FILTER_SEARCH_TERM,\n BentoDatagridEvent.UPDATE_SHOW_MORE,\n BentoDatagridEvent.UPDATE_PAGINATION,\n BentoDatagridEvent.UPDATE_SELECTION,\n BentoDatagridEvent.UPDATE_SORT_BY,\n BentoDatagridEvent.ROW_CLICK,\n BentoDatagridEvent.SELECT,\n BentoDatagridEvent.SELECT_ALL_ACROSS_PAGES,\n BentoDatagridEvent.SELECT_ALL_CURRENT_RESULTS,\n BentoDatagridEvent.DESELECT_ALL_CURRENT_RESULTS,\n BentoDatagridEvent.SORT,\n ]);\n\n /**\n * Hooks into the emit function and updates the local columns state if we're updating columns.\n * This is so if users use a computed ref with the columns property the ordering / toggling visibility will still function correctly.\n */\n const emit: typeof definedEmitsFunction = (event, ...args) => {\n // If we updating columns update the local columns state\n if (event === BentoDatagridEvent.COLUMNS || event === BentoDatagridEvent.UPDATE_COLUMNS) {\n [localColumnsState.value] = args;\n }\n definedEmitsFunction(event, ...args);\n };\n\n // Calculate dynamic top position of sticky filters\n const stickyFiltersHeight = useCalculateStickyElementHeight(\n tabsRef,\n stickyTabs,\n stickyAdditionalContent,\n additionalContentSlotRef\n );\n const computedStickyFiltersTopPosition = computed(() =>\n props.stickyFilters ? `${stickyFiltersHeight.value}px` : null\n );\n // Calculate dynamic top position of column headers\n const columnHeadersHeight = useCalculateStickyElementHeight(filtersRef, toRef(props, 'stickyFilters'));\n const computedColumnHeadersTopPosition = computed(\n () => `${columnHeadersHeight.value + stickyFiltersHeight.value}px`\n );\n\n // Config Settings (condensed, visbility and freezing settings)\n const {\n sortedColumns,\n columnSets,\n isOnlyOneVisibleColumn,\n internalZebraRows,\n onConfigSettingsColumnsUpdate,\n onConfigSettingsColumnUpdate,\n onConfigSettingsCondensedUpdate,\n onConfigSettingsZebraRowsUpdate,\n } = useConfigSettings(columnDefs, zebraRows, emit);\n\n // Column hovering\n const { hoveredOverColumn, hoveredOverColumnState } = useColumnHovering(\n columnSets,\n selectable,\n outline,\n isTotalWidthOfColumnsTakingUpAllAvailableGridWidth\n );\n\n // Re-ordering column (dragging)\n const { draggingColumns, draggingEventsForColumns, draggingEventsForRowCell, onMoveColumnByOffset } =\n useColumnReorderer(sortedColumns, allowColumnDragAndDrop, emit);\n\n // Selecting\n const selectableAcrossPagesComputed = computed(\n () =>\n props.data?.length > 0 &&\n !!props.selectableAcrossPages &&\n !!props.pagination &&\n props.pagination.totalCount > 0\n );\n const {\n onAllRowSelect,\n onRowSelect,\n onNestedRowSelect,\n onDeselectAll,\n allItemsSelectedState,\n selectedItems,\n selectionState,\n } = useSelector(\n selection,\n emit,\n data,\n props.getDataItemId,\n props.isDataItemDisabled,\n selectableAcrossPagesComputed,\n pagination\n );\n\n const visibleRowsState = computed<BentoDataGridVisibleRowsState>(() => ({\n filtered:\n filterBarRef.value?.isClearAllVisible || filterBarRef.value?.isResetAllVisible || !!props.filterSearchTerm,\n allRowsVisible: pagination.value?.size >= pagination.value?.totalCount,\n }));\n\n // Keyboard navigation\n const { navigationInput } = useKeyboardNavigator(\n gridcellRefs,\n columnHeaderRefs,\n sortedColumns,\n selectable,\n computed(() => props.rowActions !== undefined),\n columnPanel\n );\n\n // Lazy loading\n const { isLazyLoad, isInfiniteScroll, verticalScrollPosition, emitLazyLoadEvent } = useLazyLoading(\n lazyLoadType,\n verticalScrollPositionRef,\n body,\n loading,\n emit\n );\n\n // Scrolling\n const {\n updateScrollPosition,\n updateScrollPositionOnFrozenColumnsNavigation,\n syncVirtualScrollerWithBody,\n hasLeftOverflow,\n hasRightOverflow,\n horizontalScrollbarConditionalStyles,\n } = useScroller(\n body,\n columnsRef,\n verticalScrollPosition,\n virtualHorizontalScrollbarRef,\n paginationContainerRef,\n totalWidthOfAllColumns,\n {\n isLazyLoad,\n pagination,\n stickyPagination,\n isDataGridTemplate,\n }\n );\n\n /* == Empty State == */\n const onEmptyStateClearResetButtonClick = () => {\n if (filterBarRef.value.isClearAllVisible) {\n filterBarRef.value.clearAllFilters();\n } else if (filterBarRef.value.isResetAllVisible) {\n filterBarRef.value.resetAllFilters();\n }\n };\n const limitedEmptyStateProps = computed<BentoDatagridEmptyStateProps>(() => ({\n ...props.emptyState,\n variant:\n props.emptyState?.variant === 'embedded' || props.emptyState?.variant === 'basic'\n ? props.emptyState.variant\n : 'basic',\n }));\n\n /* == Styles == */\n // Conditional grid classes\n const conditionalGridClasses = computed(() => ({\n [`b-data-grid--${BentoDatagridStyleState.OUTLINE}`]: props.outline,\n [`b-data-grid--${BentoDatagridStyleState.SCROLL}`]: props.fitContent || isLazyLoad.value,\n [`b-data-grid--${BentoDatagridStyleState.STICKY_FILTERS}`]: props.filters && props.stickyFilters,\n [`b-data-grid--${BentoDatagridStyleState.OVERFLOW_SHADOW_LEFT}`]:\n hasLeftOverflow.value && !frozenColumnsLength.value,\n [`b-data-grid--${BentoDatagridStyleState.OVERFLOW_SHADOW_RIGHT}`]:\n hasRightOverflow.value && props.rowActions === undefined,\n [`b-data-grid--${BentoDatagridStyleState.NO_SPACING_TOP}`]: props.noSpacingTop,\n [`b-data-grid--${BentoDatagridStyleState.FIT_CONTENT}`]: props.fitContent,\n [`b-data-grid--${BentoDatagridStyleState.ZEBRA_ROWS}`]: internalZebraRows.value,\n 'b-data-grid--lazy-load': isLazyLoad.value,\n }));\n\n // Conditional grid body classes\n const conditionalGridBodyClasses = computed(() => ({\n 'b-data-grid__body--sticky-horizontal-scrollbar': props.stickyHorizontalScrollbar,\n }));\n\n const computedColumnPanelAlignment = computed(() => columnSets.value.findIndex(el => el.columnSet.length));\n const showFrozenColumnsSeparator = computed(() => {\n const isSelectionOnlyFrozenColumn =\n (props.selectable || props.hasNestedContent || props.hasNestedRows) && frozenColumnsLength.value === 1;\n return !isSelectionOnlyFrozenColumn || hasLeftOverflow.value;\n });\n\n // Conditional filter classes\n const conditionalFilterClasses = computed(() => ({\n 'b-data-grid__filters--sticky': !!props.stickyFilters || isDataGridTemplate,\n }));\n\n // Conditional pagination classes\n const conditionalPaginationClasses = computed(() => ({\n 'b-data-grid__pagination--padding-left-unset': props.columns?.[0]?.padding?.left === false,\n 'b-data-grid__pagination--padding-right-unset':\n props.columns?.[props.columns.length - 1]?.padding?.right === false,\n 'b-data-grid__pagination--sticky': !!props.stickyPagination || isDataGridTemplate,\n }));\n\n /* == Ref registration methods == */\n const registerColumnHeaderRefs = (el: Element | ComponentPublicInstance) => {\n // We always know this will be used on a DataGridColumns component so we can cast it\n const datagridColumnsComponent = el as InstanceType<typeof DataGridColumns>;\n if (el !== null && datagridColumnsComponent?.columnHeaderRefs) {\n Object.entries(datagridColumnsComponent?.columnHeaderRefs).forEach(([fieldName, colHeaderEl]) => {\n columnHeaderRefs.value[fieldName] = colHeaderEl as HTMLDivElement;\n });\n }\n };\n const registerRowCellRefs = (el: Element | ComponentPublicInstance, rowIndex: number) => {\n // We always know this will be used on a DataGridCell component so we can cast it\n const gridRowComponent = el as InstanceType<typeof DataGridRow>;\n if (el !== null) {\n if (gridRowComponent?.gridcellRefs) {\n const areRowActions = props.rowActions !== undefined && gridRowComponent?.rowActionsRef;\n Object.entries(gridRowComponent?.gridcellRefs).map(([field, cell]) => {\n if (gridcellRefs.value?.[field] === undefined) {\n gridcellRefs.value = { ...gridcellRefs.value, [field]: [] };\n }\n gridcellRefs.value[field][rowIndex] = cell as HTMLDivElement;\n });\n // This calculates the maxium width of the row actions column so we can add the same padding to the columns keep everything aligned\n if (areRowActions) {\n if (gridcellRefs.value?.[DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME] === undefined) {\n gridcellRefs.value = { ...gridcellRefs.value, [DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME]: [] };\n }\n gridcellRefs.value[DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME][rowIndex] = gridRowComponent\n .rowActionsRef?.[0] as HTMLDivElement;\n rowActionsMaxWidth.value = Math.max(\n rowActionsMaxWidth.value,\n gridRowComponent.rowActionsRef?.[0]?.offsetWidth ?? 0\n );\n }\n }\n }\n };\n\n /* == Row methods == */\n // Row selecting\n const onRowClick = (row: BentoDatagridDataItem, event: MouseEvent) => {\n if (props.allowRowClicks) {\n emit(BentoDatagridEvent.ROW_CLICK, row, event);\n }\n };\n // Programmatically set the hover state on a row\n const onCellHover = (rowIndex: number) => {\n hoveredRowIndex.value = rowIndex;\n };\n\n /* == a11y == */\n const ariaGridRole = computed(() => (props.hasNestedContent || props.hasNestedRows ? 'treegrid' : 'grid'));\n\n /* == Action bar == */\n const itemsSelectedCounter = computed(() => selectedItems.value?.length ?? 0);\n const showActionBar = computed(() => props.bulkActions && itemsSelectedCounter.value > 0);\n\n /* == Emits & Events == */\n // Resizing\n const onColumnResized = (resizeEvent: { field: string; width: number }) =>\n emit(BentoDatagridEvent.COLUMN_RESIZE, resizeEvent);\n // Sorting\n const onSort = (updatedSortBy: Array<BentoDatagridSortByColumn>) => {\n emit(BentoDatagridEvent.UPDATE_SORT_BY, updatedSortBy);\n emit(BentoDatagridEvent.SORT, updatedSortBy);\n };\n // Pagination\n const onPaginationNavigate = (page: number, size: number) => {\n emit(BentoDatagridEvent.NAVIGATE, page);\n emit(BentoDatagridEvent.UPDATE_PAGINATION, {\n ...props.pagination,\n size,\n page,\n });\n };\n const onItemsPerPageChange = (itemsPerPage: number) => {\n emit(BentoDatagridEvent.ITEMS_PAGE, itemsPerPage);\n };\n // Filter bar\n const onSearchTermCleared = () => {\n emit(BentoDatagridEvent.FILTER_SEARCH_CLEAR);\n };\n const onSearchTermInput = newSearchTerm => {\n emit(BentoDatagridEvent.UPDATE_FILTER_SEARCH_TERM, newSearchTerm);\n emit(BentoDatagridEvent.FILTER_SEARCH_INPUT, newSearchTerm);\n };\n\n /* == Warnings == */\n const hasMandatoryColumn = computed(() => columns.value.some(column => column.mandatory));\n if (!hasMandatoryColumn.value) {\n printDevelopmentWarning(\n 'WARNING: At least one BentoDataGrid column should be set as mandatory to ensure data is always displayed correctly.'\n );\n }\n\n /* == Provide/inject == */\n const setTitle: BentoTabProvidedTitle = inject(EXTERNAL_TITLE_REGISTER_ENTRY_INJECTION_KEY, () => null);\n setTitle(props.tabTitle);\n\n provide(DATA_GRID_SLASHED_ZERO, toRef(props, 'slashedZero'));\n\n /* == Expose methods == */\n defineExpose({ onEmptyStateClearResetButtonClick });\n</script>\n\n<script lang=\"ts\">\n /**\n * A component to display data in columns and row format with a whole array of configuration for visualization and interaction.\n *\n * @example\n * import { BentoDataGrid } from '@adyen/bento-vue2';\n *\n * export default {\n * components: { BentoDataGrid },\n * template: `\n * <bento-data-grid\n * :data=\"[\n * { id: '123', name: 'John', company: 'TestCompany', 'payment': 200 }\n * { id: '321', name: 'Jane', company: 'Adyen', 'payment': 300 }\n * ]\"\n * :columns=\"[\n * { field: 'name', label: 'Name', minWidth: 300, mandatory: true },\n * { field: 'company', label: 'Reference' },\n * { field: 'payment', label: 'Payment', width: 200, minWidth: 150 },\n * ]\"\n * />\n * `\n * }\n */\n export default {\n i18n: { messages },\n name: 'bento-data-grid',\n };\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid.scss\" />\n"],"names":["calculateHeightWithPseudo","element","style","height","after","afterHeight","afterBottom","top","useCalculateStickyElementHeight","elementRef","isSticky","isAdditionalElementSticky","ref","additionalElementRef","topPosition","elementObserver","mutationObserver","setTopPosition","mainElementHeight","additionalElHeight","onMounted","nextTick","stop","watch","observeSizeOfElement","onUnmounted","BentoColumnOverflow","BentoColumnOverflow2","DatagridColumnsEvent","DatagridColumnsEvent2","BentoDatagridStyleState","BentoDatagridStyleState2","BentoDatagridSortDirection","BentoDatagridSortDirection2","BentoDatagridEvent","BentoDatagridEvent2","BentoDatagridAriaSortValue","BentoDatagridAriaSortValue2","useResizer","columns","emit","columnHoverEventToEmitAfterResizing","isResizing","columnWidthOverridesLookup","colKeyLookup","acc","col","columnsRefs","reactive","allColumnRefs","toRefs","stepPositionX","resizingColumnField","defaultResizedColumnWidths","computed","field","width","minWidth","watchEffect","removeMouseMoveResizeListener","removeMouseUpResizeListener","onResizeColumn","event","sizeChange","currResizingColumnField","resizedColumnWidth","stopResize","startResize","hasResizableColumns","listen","newIsResizing","oldIsResizing","DEFAULT_COLUMN_WIDTH","DEFAULT_COLUMN_MIN_WIDTH","DATAGRID_ACTIONS_COLUMN_FIELD_NAME","DATAGRID_SELECT_WIDTH","DATAGRID_SELECT_WIDTH_WITH_SELECT_ALL_PAGES_ENABLED","DATAGRID_SELECT_WIDTH_AND_NESTED_ROWS_ENABLED","DATAGRID_SELECT_WIDTH_AND_SELECT_ALL_PAGES_AND_NESTED_ROWS_ENABLED","DATAGRID_NESTED_ROWS_ENABLED","DATAGRID_CELL_OFFSET_INITIAL","DATAGRID_CELL_OFFSET_PADDING","DATAGRID_TEMPLATE_EXTRA_PADDING","computeFlexColumnsWidth","initialFreeSpace","totalFlexUnits","flexCols","flexColumnsLookup","frozenColumnKeys","freezeColumn","value","processFlexItems","violationsLookup","remainingFreeSpace","flexUnits","totalViolation","i","flexColsLength","column","computedWidth","key","getElementWidthIncludingOffset","el","hasColumnPanel","offset","getActionsColumnWidth","options","_a","_b","_c","_d","_e","useCalculateColumnWidth","newColumns","newData","bodyRef","gridColumnsComponentRefs","gridCellRefs","data","body","gridColumnsComponents","gridCells","isMeasuringColumnWidths","rowActionsMaxWidth","newDataGridColumnsProps","previousDataGridColumnsProps","haveSameFieldsInSameOrder","colA","colB","indexA","item","indexB","gridWidth","bodyElementObserver","calculatedWidths","widthAllocatedBeforeFlex","columnsLookup","columnDefs","invisibleColumnDefs","columnWidth","fluidCol","computedColumnWidths","onColumnWidthOverride","newColumnWidthOverridesLookup","measureAndAssignAutoWidths","columnHeaderWidth","largestRowCellWidth","max","largestColumnHeaderAndRowCellWidth","processedColumns","totalWidthOfAllColumns","visible","val","isTotalWidthOfColumnsTakingUpAllAvailableGridWidth","gridRowWidthStyle","extraPadding","onBeforeUpdate","useSelector","selection","getDataItemId","isDataItemDisabled","isSelectableAcrossPages","pagination","selectedItems","allItemsSelectedState","allDataItemsIncludingChildren","dataItem","isEveryItemInPageSelected","isEveryEnabledItemInPageSelected","isNoItemInPageSelected","isNoEnabledItemInPageSelected","isEveryItemAcrossPagesSelected","emitSelect","updateSelectedItems","childItem","onAllRowSelect","selectAllItems","currentPageItems","onDeselectAll","onRowSelect","rowData","onParentRowSelect","parentRowData","currentRowDateItemId","childrenDataItemIds","parentIdAndChildrenIds","childDataItemId","selectedItemId","onNestedRowSelect","child","selectedItem","selectionState","allChildrenSelectedDataItems","childItemId","useSorter","sortBy","sortedCol","updatedSortBy","BentoDatagridNavigationKey","BentoDatagridNavigationKey2","EventKey","DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME","useKeyboardNavigator","gridcellRefs","columnHeaderRefs","selectable","rowActions","hasColumnActions","visibleColumns","visibleColumnsFromValue","visibleColumnsCount","sortedColumnHeaderAndGridCellRefs","firstColumnKey","cells","columnCoumnHeaderCell","numRows","rowIndex","columnCells","getCurrentRowIndex","currentIndex","getEdgeCellIndex","direction","ctrlKey","lastCellIndex","lastColumnIndex","currentRowIndex","currentColumn","getCellIndex","directionDiff","newCellIndex","isEdgeNavigationKeyCode","keyCode","getTargetCellIndex","target","directionKeyCode","currentCellIndex","focusOnNextGridcell","cellIndex","isNavigationKeyCode","dataGridKeyboardNavigationsKey","parentGridCell","LAZY_LOAD_BUFFER_PERCENTAGE","useLazyLoading","lazyLoadTypeRef","verticalScrollPositionRef","loading","lazyLoadType","verticalScrollPosition","isLoading","isLazyLoad","isInfiniteScroll","emitLazyLoadEvent","useColumnReorderer","columnsRef","hasDraggableColumnsRef","hasDraggableColumns","draggingColumns","onMoveColumnByOffset","movingColumn","fromIndex","c","toIndex","reorderedColumns","onDragStart","e","onDragEnter","dragEvent","targetRect","midpoint","clientX","onDrop","toIndexInitial","toLeftOfToIndex","firstUnfrozenColumn","onDragEnd","draggingEventsForColumns","draggingEventsForRowCell","useConfigSettings","isZebraRowsRef","internalZebraRows","sortedColumnsByFreezeState","a","b","frozenColumns","unfrozenColumns","columnSets","columnSet","isOnlyOneVisibleColumn","onConfigSettingsCondensedUpdate","isCondensedView","onConfigSettingsZebraRowsUpdate","isZebraRows","onConfigSettingsColumnsUpdate","onConfigSettingsColumnUpdate","updatedColumn","updatedColumns","newValue","useScroller","virtualHorizontalScrollbar","paginationContainerRef","scrollLeftPosition","hasLeftOverflow","hasRightOverflow","currentScrollLeftPosition","updateScrollPosition","scrollLeftPos","updateScrollPositionOnFrozenColumnsNavigation","syncVirtualScrollerWithBody","horizontalScrollbarConditionalStyles","useColumnHovering","outline","hoveredOverColumn","hoveredOverColumnState","frozenColumnSet","colSet","unFrozenColumnSet","isFirstFrozenColumn","isFirstUnfrozenColumn","isFrozenSelectableOutlineOnFirstCol","isNoFrozenColAndNotFrozenSelectableOutlineOnFirstCol","isFrozenColumnsAndNotFrozenFirstColumn","isFrozenColumnsAndLastFrozenColumn","isOutlineOnAllColumnWidthFitContainerAndLastColumn","focusOnInteractiveChild","childEl","removedParentNodeFromList","getFocusableIn","makeAllInteractiveChildrenUnFocusable","focusableElements","makeAllInteractiveChildrenFocusable","focusNodes","handleClipboard","selectedContent","rows","tableCopy","plainCopy","parseCells","cell","tag","text","row","uuid$8","_sfc_main$i","uuid$7","_sfc_main$h","uuid$6","_sfc_main$g","uuid$5","_sfc_main$f","uuid$4","_sfc_main$e","uuid$3","_sfc_main$d","DATA_GRID_SLASHED_ZERO","DATA_GRID_SMALL_CONTAINER","DATA_GRID_TOUCH_DEVICE","__default__$7","messages$6","CLOSING_CONTEXTUAL_MENU_DELAY_MS","t","useI18n","props","allColumnsRef","contextMenuRef","hoveredColumnField","closingTimeOutId","areAllItemsSelected","isActionsColumn","isAllSelectionState","selectAllMenu","isSorting","getSortingDirection","sortByColumnField","getSortingColumnDirection","sortingDirection","draggingEventsForColumn","contextualMenuData","ArrowLeftIcon","ArrowRightIcon","isSmallContainer","BentoFreezeIcon","HideIcon","ShowIcon","showContextualMenu","hideContextualMenu","timeOutId","dataGridColumnEvents","events","registerColumnsRefs","inject","isTouchDevice","conditionalColumnsClasses","defaultConditionalClasses","conditionalSelectColumnClasses","computeMenuPosition","hasFirstColumnPanelRightAligned","index","BentoPopoverPositions","conditionalColumnClasses","columnIndex","_f","_g","_i","_h","_j","conditionalColumnHeaderAndActionsClasses","conditionalColumnActionsClasses","conditionalColumnSeparatorClasses","conditionalColumnHeaderClasses","conditionalColumnMenuClasses","expose","DatagridConfigSettingsEvent","DatagridConfigSettingsEvent2","uuid$2","_sfc_main$b","_sfc_main$a","defineComponent","messages$5","BentoToggle","isFreezeIconOptionShown","isColumnFrozen","isColumnVisible","toggleColumnVisibility","toggleColumnFreeze","showFreezeIcon","hideFreezeIcon","freezeIconConditionalClasses","_sfc_main$9","messages$4","BentoButton","CrossIcon","BentoPopover","BentoSettingsIcon","BentoToggleButton","BentoDataGridConfigSettingsConfigRow","BentoSearchBar","SearchIcon","BentoTypography","BentoClickOutsideDirective","configSettingsButtonRef","popoverId","generateUid","searchBarRef","isConfigSettingsPanelOpen","allColumnsVisbilityToggleState","searchButtonRef","searchTerm","toRef","isColumnVisibilityFilterShown","filteredColumnVisibilityColumns","useSearchBarFilter","clearAction","areAllNonMandatoryColumnsHidden","toggleColumnFilter","isColumnVisibilityToggleDisabled","emitVisibleColumns","toggleAllColumnVisibility","toggleState","emitFrozenColumns","setConfigSettingsPanelVisibility","isVisible","__default__$6","messages$3","uuid$1","_sfc_main$7","__default__$5","messages$2","getMenuItemText","action","getMenuItemIcon","Copy","Edit1Icon","ExternalLinkIcon","isRowActions","conditionalCellActionsBackgroundGradientClasses","conditionalCellActionsClasses","showGradientElement","isBentoColumnCellActionsByCellValueDataFn","cellActions","computedCellActions","flattenedMenuItems","subMenuItem","OptionsVerticalIcon","transformMenuEvents","printDevelopmentWarning","getButtonTitle","button","isForSvgTitle","generateButtonEvents","generateMenuEvents","menuDataItem","menuData","transformedMenuData","DataGridCellPropClass","DataGridCellPropClass2","isFocusVisible","activeElement","__default__$4","messages$1","slots","useSlots","hasSlot","useHasSlot","gridcellRef","cellActionsRef","shouldShowCellActions","childrenMenuContainerElements","isFocused","focusableItems","hasEverBeenFocused","hasRowData","controlledNestedRowElementIds","ariaHidden","tabIndex","conditionalTitleAttribute","content","getRowData","sumColumnAmountsInColumnSets","limitIndex","total","getColIndex","colIndex","colSetIndex","isLeavingCellFocus","relatedTarget","registeredMenuRef","menuElement","onMenuClose","hasInteractiveElFocusedInside","getGridcellEvents","defaultEvents","gridCellEvents","toggleNestedContent","registerMenuContainerElement","menuContainerElement","menuMouseLeave","provide","DATA_GRID_CELL_MENU_REGISTERING_INJECTION_KEY","hasSlashedZero","conditionalRowCellClasses","computedCellContentClasses","__default__$3","isNestedContentShown","nestedContentRef","rowActionsRef","nestedContentSlotId","isRowActionMenuOpen","shouldShowNestedRowsBooleanResult","shouldShowRenderNestedRows","isLoadingNestedRows","shouldShowNestedContentToggle","ariaRowAttributes","isNestedContentShownBooleanishVal","nestedContentContainerDivAriaAttributes","nestedRowIds","_val","allNestedRowIds","generatedRowIds","hasUnSelectedNestedRows","childrendDataItemIds","nestedItem","everyChildIsSelected","childId","someItemsAreSelected","registerRowCellRef","gridCellComponent","getRowId","childRowIndex","getRowAriaSelectedValue","id","onRowClick","isEventTargetInteractiveElement","dataGridRowInteractiveTypes","onRowActionMenuOpen","onRowActionMenuClose","onRowActionsCellFocus","onRowActionsCellFocusOut","onRowActionsCellOnKeyDown","getRowActionsCellIndex","updateContentHeight","contentHeight","useExpandableContentHeight","nestedContentStyles","observer","nestedContentToggled","_newChildren","oldChildren","isHighlightedRow","isSelectedRow","conditionalRowClasses","conditionalRowSetClasses","isFrozenRowSet","isSmallContainer2","conditionalNestedRowClasses","conditionalRowActionsContainerClasses","computedRowActionsStyles","uuid","_sfc_main$3","__default__$2","computedIcon","CheckmarkCircleFillIcon","WarningFilledIcon","ErrorIcon","NoValueIcon","conditionalClasses","computedIconClass","tooltipPosition","PopperContainerPosition","__default__$1","messages","tc","dashedUnderlineRef","dashedUnderlineProps","lowerCaseSearchTerm","highlightedComponent","highlightedItemsCount","computedToolTipText","__default__","dataGridUid","filtersRef","filterBarRef","virtualHorizontalScrollbarRef","allowColumnDragAndDrop","columnPanel","hasNestedContent","hasNestedRows","selectableAcrossPages","stickyPagination","zebraRows","hoveredRowIndex","frozenColumnsLength","MOBILE_BREAKPOINT","dataGridRef","useElementSize","registerDatagridInDataGridTemplate","DATA_GRID_REGISTER_TEMPLATE_INJECTION_KEY","additionalContentSlotRef","isDataGridTemplate","stickyTabs","tabsRef","stickyAdditionalContent","localColumnsState","args","definedEmitsFunction","stickyFiltersHeight","computedStickyFiltersTopPosition","columnHeadersHeight","computedColumnHeadersTopPosition","sortedColumns","selectableAcrossPagesComputed","visibleRowsState","navigationInput","onEmptyStateClearResetButtonClick","limitedEmptyStateProps","conditionalGridClasses","conditionalGridBodyClasses","computedColumnPanelAlignment","showFrozenColumnsSeparator","conditionalFilterClasses","conditionalPaginationClasses","registerColumnHeaderRefs","datagridColumnsComponent","fieldName","colHeaderEl","registerRowCellRefs","gridRowComponent","areRowActions","onCellHover","ariaGridRole","itemsSelectedCounter","showActionBar","onColumnResized","resizeEvent","onSort","onPaginationNavigate","page","size","onItemsPerPageChange","itemsPerPage","onSearchTermCleared","onSearchTermInput","newSearchTerm","hasMandatoryColumn","setTitle","EXTERNAL_TITLE_REGISTER_ENTRY_INJECTION_KEY"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,MAAAA,KAAA,CAAAC,MAAA;AACI,MAAA,CAAAA;AACI,WAAA;AAEJ,QAAAC,IAAA,OAAA,iBAAAD,CAAA;AACA,MAAAE,IAAAF,EAAA;AAGA,QAAAG,IAAA,OAAA,iBAAAH,GAAA,SAAA;AACA,MAAAG,EAAA,YAAA,UAAAA,EAAA,aAAA,YAAA;AACI,UAAAC,IAAA,WAAAD,EAAA,MAAA,GACAE,IAAA,WAAAF,EAAA,MAAA;AAGA,IAAA,CAAA,MAAAC,CAAA,KAAA,CAAA,MAAAC,CAAA,KAAAA,IAAA,KAAAA,IAAAD,KAAA,MACIF,KAAAE;AAAA,EACJ;AAGJ,QAAAE,IAAA,WAAAL,EAAA,GAAA;AAKA,SAAA,CAAA,MAAAK,CAAA,KAAAA,IAAA,MACIJ,KAAAI,IAGJJ;AACJ,GAYaK,KAAA,CAAAC,GAAAC,GAAAC,IAAAC,EAAA,EAAA,GAAAC,IAAA,SAAA;AAMT,QAAAC,IAAAF,EAAA,CAAA;AACA,MAAAG,IAAA,MACAC,IAAA;AAEA,QAAAC,IAAA,MAAA;AACI,UAAAC,IAAAR,EAAA,QAAAV,GAAAS,EAAA,KAAA,IAAA,GACAU,IAAAR,EAAA,SAAAE,IAAAb,GAAAa,EAAA,KAAA,IAAA;AAIA,IAAAC,EAAA,QAAAI,IAAAC;AAAA,EAAwC;AAG5C,SAAAC,GAAA,MAAA;AACI,IAAAC,GAAA,MAAA;AAEI,YAAAC,IAAAC;AAAA,QAAad;AAAA,QACT,MAAA;AAEI,UAAAA,KAAA,QAAAA,EAAA,UACIY,GAAA,MAAAC,EAAA,CAAA,GACAP,IAAAS,GAAAf,EAAA,OAAAQ,CAAA,GACAD,IAAA,IAAA,iBAAAC,CAAA,GACAD,EAAA,QAAAP,EAAA,OAAA,EAAA,YAAA,IAAA,iBAAA,CAAA,OAAA,EAAA,CAAA;AAAA,QACJ;AAAA,QACJ,EAAA,WAAA,GAAA;AAAA,MACkB;AAEtB,MAAAc;AAAA,QAAA,CAAAb,GAAAC,CAAA;AAAA,QACwC,MAAA;AAEhC,UAAAM,EAAA;AAAA,QAAe;AAAA,QACnB,EAAA,WAAA,GAAA;AAAA,MACkB;AAAA,IACtB,CAAA;AAAA,EACH,CAAA,GAGLQ,GAAA,MAAA;AACI,IAAAV,KAAA,QAAAA,EAAA,cACAC,KAAA,QAAAA,EAAA;AAAA,EAA6B,CAAA,GAGjCF;AACJ;AC5FY,IAAAY,KAAA,kBAAAC,OACRA,EAAA,OAAA,QACAA,EAAA,WAAA,YAFQA,IAAAD,MAAA,CAAA,CAAA,GA6BAE,IAAA,kBAAAC,OACRA,EAAA,gBAAA,iBACAA,EAAA,kBAAA,mBACAA,EAAA,kBAAA,mBACAA,EAAA,0BAAA,2BACAA,EAAA,6BAAA,8BACAA,EAAA,eAAA,gBACAA,EAAA,+BAAA,gCACAA,EAAA,cAAA,eACAA,EAAA,gBAAA,iBACAA,EAAA,mBAAA,oBACAA,EAAA,oBAAA,qBACAA,EAAA,eAAA,gBAGAA,EAAA,oBAAA,oBACAA,EAAA,oBAAA,oBACAA,EAAA,kBAAA,kBACAA,EAAA,cAAA,eAlBQA,IAAAD,KAAA,CAAA,CAAA,GCjBAE,KAAA,kBAAAC,OACRA,EAAA,UAAA,WACAA,EAAA,SAAA,UACAA,EAAA,iBAAA,kBACAA,EAAA,uBAAA,wBACAA,EAAA,wBAAA,yBACAA,EAAA,iBAAA,kBACAA,EAAA,cAAA,eACAA,EAAA,aAAA,cARQA,IAAAD,MAAA,CAAA,CAAA,GAWAE,KAAA,kBAAAC,OACRA,EAAA,YAAA,OACAA,EAAA,aAAA,QAFQA,IAAAD,MAAA,CAAA,CAAA,GAmCAE,IAAA,kBAAAC,OACRA,EAAA,UAAA,WACAA,EAAA,gBAAA,iBACAA,EAAA,aAAA,cACAA,EAAA,WAAA,YACAA,EAAA,yBAAA,0BACAA,EAAA,sBAAA,uBACAA,EAAA,sBAAA,uBACAA,EAAA,iBAAA,kBACAA,EAAA,mBAAA,oBACAA,EAAA,iBAAA,kBACAA,EAAA,uBAAA,wBACAA,EAAA,8BAAA,+BACAA,EAAA,4BAAA,6BACAA,EAAA,oBAAA,qBACAA,EAAA,mBAAA,oBACAA,EAAA,mBAAA,oBACAA,EAAA,iBAAA,kBACAA,EAAA,oBAAA,qBACAA,EAAA,YAAA,aACAA,EAAA,SAAA,UACAA,EAAA,0BAAA,2BACAA,EAAA,6BAAA,8BACAA,EAAA,+BAAA,gCACAA,EAAA,OAAA,QAxBQA,IAAAD,KAAA,CAAA,CAAA,GA2BAE,KAAA,kBAAAC,OACRA,EAAA,YAAA,aACAA,EAAA,aAAA,cACAA,EAAA,OAAA,QAHQA,IAAAD,MAAA,CAAA,CAAA;ACrEC,MAAAE,KAAA,CAAAC,GAAAC,MAAA;AAIT,QAAAC,IAAA7B,EAAA,IAAA,GACA8B,IAAA9B,EAAA,EAAA,GACA+B,IAAA/B,EAAA,MAAA,GAGAgC,IAAAL,EAAA,MAAA,OAAA,CAAAM,GAAAC,OACID,EAAAC,EAAA,KAAA,IAAA,MACAD,IAAO,CAAA,CAAA,GAEXE,IAAAC,GAAAJ,CAAA,GACAK,IAAAC,GAAAH,CAAA;AAEA,MAAAI,IAAA,GACAC,IAAA;AAGA,QAAAC,IAAAC;AAAA,IAAmC,MAAA,OAAA,YAAAf,EAAA,MAAA,IAAA,CAAA,EAAA,OAAAgB,GAAA,OAAAC,GAAA,UAAAC,EAAA,MAAA,CAAAF,GAAA,EAAA,OAAAC,GAAA,UAAAC,EAAA,CAAA,CAAA,CAAA;AAAA,EACmE;AAGtG,EAAAC,GAAA,MAAAf,EAAA,QAAAU,EAAA,KAAA;AAGA,MAAAM,IAAA,MACAC,IAAA;AAGA,QAAAC,IAAA,CAAAC,MAAA;AACI,UAAAC,IAAAD,EAAA,UAAAX,GACAa,IAAAZ,GAEAa,IAAAtB,EAAA,MAAAqB,CAAA,EAAA,QAAAD;AAEA,IAAApB,EAAA,MAAAqB,CAAA,EAAA,QAAAC,IAAAZ,EAAA,MAAAW,CAAA,EAAA,WAAAC,IAAAZ,EAAA,MAAAW,CAAA,EAAA,UAWAxB,EAAAZ,EAAA,iBAAAe,EAAA,KAAA,GAEAQ,IAAAW,EAAA;AAAA,EAAsB,GAI1BI,IAAA,MAAA;AACI,IAAAxB,EAAA,QAAA,IACAiB,KAAA,QAAAA,KACAC,KAAA,QAAAA,KAEAR,KAOIZ,EAAAZ,EAAA,eAAA;AAAA,MAAyC,OAAAwB;AAAA,MAC9B,OAAAT,EAAA,MAAAS,CAAA,EAAA;AAAA,IACsD,CAAA,GAKrEO,IAAA,MACAC,IAAA,MACAR,IAAA,IACAD,IAAA;AAAA,EAAgB,GAIpBgB,IAAA,CAAAC,GAAAb,GAAAO,MAAA;AAEI,QADAA,EAAA,eAAA,GACAM,GAAA;AAEI,UADA1B,EAAA,QAAA,IACAoB,EAAA,YAAA,GAAA;AACI,QAAAI,EAAA;AACA;AAAA,MAAA;AAGJ,MAAAd,IAAAG,GACAJ,IAAAW,EAAA,SAEAH,IAAAU,GAAA,QAAA,aAAAR,CAAA,GACAD,IAAAS,GAAA,QAAA,WAAAH,CAAA;AAAA,IAAkE;AAAA,EACtE;AAIJ,SAAA3C;AAAA,IAAA,MAAAmB,EAAA;AAAA,IACqB,CAAA4B,GAAAC,MAAA;AAEb,MAAA,CAAAD,KAAAC,MACI/B,EAAAZ,EAAA,cAAAa,EAAA,KAAA,GACAA,EAAA,QAAA;AAAA,IACJ;AAAA,EACJ,GAEJ;AAAA,IAAO,YAAAE;AAAA,IACS,eAAAM;AAAA,IACZ,aAAAkB;AAAA,IACA,YAAAzB;AAAA,IACA,qCAAAD;AAAA,EACA;AAER,GC3HO+B,KAAA,KACAC,KAAA,IAGAC,KAAA,oBAEAC,KAAA,IAEAC,KAAA,IAEAC,KAAA,IAEAC,KAAA,IAEAC,KAAA,IAGAC,KAAA,GACAC,KAAA,IAGAC,KAAA,IAWPC,KAAA,CAAAC,GAAAC,GAAAC,MAAA;AACI,QAAAC,IAAA,CAAA,GACAC,IAAA,CAAA,GAEAC,IAAA,CAAAlC,MAAA;AACI,UAAAmC,IAAAH,EAAAhC,CAAA;AACA,IAAAmC,KAAAA,EAAA,WAAA,OACIH,EAAAhC,CAAA,EAAA,SAAA,IACAiC,EAAA,KAAAjC,CAAA;AAAA,EACJ;AAIJ,WAAAoC,IAAA;AAEI,QAAAH,EAAA,WAAAF,EAAA;AACI;AAGJ,UAAAM,IAAA,EAAA,KAAA,CAAA,EAAA;AAKA,QAAAC,IAAAT,GACAU,IAAAT,GACAU,IAAA;AAGA,IAAAP,EAAA,QAAA,CAAAjC,MAAA;AACI,MAAAsC,KAAAN,EAAAhC,CAAA,EAAA,eACAuC,KAAAP,EAAAhC,CAAA,EAAA;AAAA,IAAsC,CAAA;AAG1C,aAAAyC,IAAA,GAAAC,IAAAX,EAAA,QAAAU,IAAAC,GAAAD,KAAA,GAAA;AACI,YAAAE,IAAAZ,EAAAU,CAAA;AAGA,UAAAT,EAAAW,EAAA,KAAA,KAAAX,EAAAW,EAAA,KAAA,EAAA,WAAA;AAGI;AAKJ,UAAAC,IADAN,IAAAC,IACAI,EAAA;AAGA,MAAAC,IAAAD,EAAA,aACIH,KAAAG,EAAA,WAAAC,GACAA,IAAAD,EAAA,UACAN,EAAA,IAAAM,EAAA,KAAA,IAAA,KAGJX,EAAAW,EAAA,KAAA,IAAA;AAAA,QAAkC,QAAA;AAAA,QACtB,eAAAC;AAAA,QACR,MAAAD,EAAA;AAAA,MACa;AAAA,IACjB;AAIJ,IAAAH,IAAA,IAEI,OAAA,KAAAH,EAAA,GAAA,EAAA,QAAA,CAAArC,MAAA;AACI,MAAAkC,EAAAlC,CAAA;AAAA,IAAkB,CAAA,IAItB+B,EAAA,QAAA,CAAA,EAAA,OAAAc,EAAA,MAAA;AACI,MAAAX,EAAAW,CAAA;AAAA,IAAgB,CAAA,GAKxBT,EAAA;AAAA,EAAiB;AAGrB,SAAAA,EAAA,GAEAJ;AACJ,GAWAc,KAAA,CAAAC,GAAAC,MAAA;AACI,MAAAC,IAAAxB;AAEA,SAAAuB,MACIC,KAAAvB,KAAA,IAGJqB,KAAA,QAAAA,EAAA,cAAAA,EAAA,cAAAE,IAAA;AACJ,GAOaC,KAAA,CAAAC,MAAA;;AACT,UAAAC,IAAAD,KAAA,gBAAAA,EAAA,qBAAA,QAAAC,EAAA,UAAAC,IAAAF,KAAA,gBAAAA,EAAA,kBAAA,QAAAE,EAAA,SACIC,IAAAH,KAAA,gBAAAA,EAAA,wBAAA,QAAAG,EAAA,SAGAC,IAAAJ,KAAA,gBAAAA,EAAA,6BAAA,QAAAI,EAAA,QAAAhC,KAAAD,KAFIE,MAMRgC,IAAAL,KAAA,gBAAAA,EAAA,6BAAA,QAAAK,EAAA,QAAAnC,KAAAD;AAGJ,GAWOqC,KAAA,CAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAX,MAAA;AAQH,QAAAnE,IAAA3B,EAAAqG,EAAA,KAAA,GACAK,IAAA1G,EAAAsG,CAAA,GACAK,IAAA3G,EAAAuG,CAAA,GACAK,IAAA5G,EAAAwG,CAAA,GACAK,IAAA7G,EAAAyG,CAAA,GACAK,IAAA9G,EAAA,EAAA,GACA+G,IAAA/G,EAAA,CAAA;AAGA,EAAAW;AAAA,IAAA,MAAA0F,EAAA;AAAA,IACqB,CAAAW,GAAAC,MAAA;;AAEb,YAAAC,KAAAF,KAAA,gBAAAA,EAAA,IAAA,CAAA,EAAA,OAAArE,EAAA,MAAAA,GAAA,iBAAAsE,KAAA,gBAAAA,EAAA,IAAA,CAAA,EAAA,OAAAtE,EAAA,MAAAA,GAAA;AAcA,UAAA,GAAAoD,IAAAD,KAAA,gBAAAA,EAAA,2BAAA,QAAAC,EAAA,UAAA,CAAAmB,GAAA;AACI,QAAAvF,EAAA,QAAA0E,EAAA;AACA;AAAA,MAAA;AASJ,MAAA1E,EAAA,UAAAqE,IAAArE,EAAA,UAAA,gBAAAqE,EAAA,YAAA,IAAAK,EAAA,QAAAA,EAAA,MAAA,KAAA,CAAAc,GAAAC,MAAA;AAQkB,cAAAC,IAAA1F,EAAA,MAAA,UAAA,CAAA2F,OAAAA,GAAA,UAAAH,EAAA,KAAA,GACAI,IAAA5F,EAAA,MAAA,UAAA,CAAA2F,OAAAA,GAAA,UAAAF,EAAA,KAAA;AAEA,eAAAC,MAAA,KACI,IAEJE,MAAA,KACI,KAEJF,IAAAE;AAAA,MAAgB,CAAA;AAAA,IACnB;AAAA,EACnB;AAIJ,QAAAC,IAAAxH,EAAA;AACA,MAAAyH,IAAA;AAEA,QAAAC,IAAAhF,EAAA,MAAA;;AAEI,UAAAgC,IAAA,CAAA;AACA,QAAAD,IAAA,GACAkD,IAAA;AAEA,UAAAC,IAAA,CAAA;AAGA,QAAAC,IAAAlG,EAAA,MAAA,OAAA,CAAAO,MAAAA,EAAA,YAAA,EAAA;AACA,UAAA4F,IAAAnG,EAAA,MAAA,OAAA,CAAAO,MAAAA,EAAA,YAAA,EAAA;AAEA,SAAA6D,IAAAD,KAAA,gBAAAA,EAAA,wBAAA,QAAAC,EAAA,UAAAC,IAAAF,KAAA,gBAAAA,EAAA,qBAAA,QAAAE,EAAA,UAAAC,KAAAH,KAAA,gBAAAA,EAAA,kBAAA,QAAAG,GAAA,OAAA;AACI,YAAA8B,IAAAlC,GAAAC,CAAA;AAEA,MAAA+B,IAAA;AAAA,QAAa;AAAA,UACT,OAAA/D;AAAA,UACW,OAAA;AAAA,UACA,UAAAiE;AAAA,UACG,OAAAA;AAAA,UACH,QAAA;AAAA,UACC,SAAA,EAAA,MAAA,IAAA,OAAA,GAAA;AAAA,QAC6B;AAAA,QACzC,GAAAF;AAAA,MACG;AAAA,IACP;AAKJ,IAAAA,EAAA,QAAA,CAAA3F,MAAA;AACI,YAAA8F,IAAA,EAAA,GAAA9F,EAAA;AACA,UAAAU;AACA,MAAAoF,EAAA,QAAAA,EAAA,OAAA,KAEIvD,KAAAuD,EAAA,MACApF,IAAA,GACA8B,EAAA,KAAAsD,CAAA,KAGApF,IAAA,KAAA;AAAA,SAAaoF,KAAA,gBAAAA,EAAA,UAAApE;AAAA,SACUoE,KAAA,gBAAAA,EAAA,aAAAnE;AAAA,MACG,GAI9B8D,KAAA/E,GACAoF,EAAA,QAAApF,GACAoF,EAAA,YAAAA,KAAA,gBAAAA,EAAA,aAAAnE,IAEA+D,EAAAI,EAAA,KAAA,IAAAA;AAAA,IAAgC,CAAA,GAIpCL,KAAAZ,EAAA;AAGA,UAAAvC,IAAA,KAAA,IAAAgD,EAAA,QAAAG,GAAA,CAAA;AAGA,QAAAlD,IAAA,KAAA+C,EAAA,QAAA,GAAA;AACI,YAAAS,IAAA1D,GAAAC,GAAAC,GAAAC,CAAA;AAEA,aAAA,KAAAuD,CAAA,EAAA,QAAA,CAAAtF,MAAA;AACI,QAAAiF,EAAAjF,CAAA,EAAA,QAAAsF,EAAAtF,CAAA,EAAA;AAAA,MAAyD,CAAA;AAAA,IAC5D;AAIL,WAAAmF,EAAA,QAAA,CAAA5F,MAAA;AACI,YAAA8F,IAAA,EAAA,GAAA9F,EAAA;AACA,MAAA0F,EAAAI,EAAA,KAAA,IAAAA;AAAA,IAAgC,CAAA,GAGpC,OAAA,OAAAJ,CAAA;AAAA,EAAkC,CAAA,GAItC7F,IAAA/B,EAAA,MAAA,GAEAkI,IAAA,CAAAC,MAAA;AACI,IAAApG,EAAA,QAAA,EAAA,GAAAA,EAAA,OAAA,GAAAoG,EAAA;AAAA,EAA2G,GAI/GC,IAAA,YAAA;AACI,IAAAzG,EAAA,MAAA,KAAA,CAAA2D,MAAAA,KAAA,gBAAAA,EAAA,SAAA,MAEIwB,EAAA,QAAA,IACA,MAAArG,GAAA,GAOAkB,KAAA,QAAAA,EAAA,MAAA,OAAA,CAAA2D,MAAAA,KAAA,gBAAAA,EAAA,WAAA,QAAA,CAAA,EAAA,OAAA3C,GAAA,UAAAE,EAAA,MAAA;;AAGQ,YAAAwF,IAAA5C;AAAA,SAA0BM,IAAAa,EAAA,UAAA,gBAAAb,EAAApD;AAAA,SACaqD,IAAAF,KAAA,gBAAAA,EAAA,mBAAA,gBAAAE,EAAA;AAAA,MACV,GAG7BsC,KAAApC,KAAAD,IAAAY,EAAA,UAAA,gBAAAZ,EAAAtD,OAAA,gBAAAuD,EAAA;AAAA,QAAsD,CAAAqC,IAAA7C,MAAA,KAAA,IAAA6C,IAAA9C,GAAAC,CAAA,CAAA;AAAA,QACW;AAAA,SAIjE8C,IAAA,KAAA,IAAAH,GAAAC,KAAA,CAAA;AAEA,OAAAzF,MAAA,UAAA2F,IAAA3F,MACIqF,EAAA;AAAA,QAAsB,CAAAvF,CAAA,GAAA;AAAA,UACT,OAAA6F;AAAA,QACE;AAAA,MACX,CAAA;AAAA,IAER,IAGR1B,EAAA,QAAA;AAAA,EACJ;AAEJ,EAAAnG,GAAA,CAAA,MAAAgB,EAAA,OAAA,MAAA+E,EAAA,KAAA,GAAA,YAAA;AACI,IAAA/E,EAAA,MAAA,KAAA,CAAA2D,MAAAA,KAAA,gBAAAA,EAAA,SAAA,KACI,MAAA8C,EAAA;AAAA,EACJ,CAAA;AAGJ,QAAAK,IAAA/F;AAAA,IAAyB,MAAAgF,EAAA,MAAA,IAAA,CAAAxF,MAAA;;AAAA;AAAA,QACc,GAAAA;AAAA;AAAA,QAC5B,SAAA8D,KAAAD,IAAAhE,EAAA,UAAA,gBAAAgE,EAAA7D,EAAA,WAAA,gBAAA8D,EAAA,UAAA9D,EAAA;AAAA,MAEgE;AAAA,KAAA;AAAA,EACrE,GAINwG,IAAAhG;AAAA,IAA+B,MAAA;;AAAA,eAAAqD,IAAA0C,EAAA,UAAA,gBAAA1C,EAAA,OAAA,CAAA,EAAA,SAAA4C,EAAA,MAAAA,MAAA,IAAA,OAAA,CAAA1G,GAAA2G,MAAAA,EAAA,QAAA3G,GAAA,MAAA8E,EAAA;AAAA;AAAA,EAI4C,GAG3E8B,IAAAnG;AAAA,IAA2D,MAAA8E,EAAA,SAAAkB,EAAA;AAAA,EACP,GAGpDI,IAAApG,EAAA,OAAA;AAAA,IAA0C,OAAA8E,EAAA,QAAAkB,EAAA,QAAA,SAAA;AAAA,EAC2B,EAAA;AAIrE,SAAAlI,GAAA,MAAA;;AACI,UAAAuI,IAAAjD,KAAA,QAAAA,EAAA,qBAAAxB,KAAA;AAEA,IAAA7D,GAAA,MAAA;AACI,MAAAkG,EAAA,UACIa,EAAA,QAAAb,EAAA,MAAA,sBAAA,EAAA,QAAAoC;AAGJ,YAAArI,IAAAC;AAAA,QAAagG;AAAA,QACT,MAAA;AAEI,UAAAA,EAAA,UACIlG,GAAA,MAAAC,EAAA,CAAA,GACA+G,IAAA7G,GAAA+F,EAAA,OAAA,CAAA,EAAA,OAAA/D,EAAA,MAAA;AACI,YAAA4E,EAAA,QAAA5E,IAAAmG;AAAA,UAA0B,CAAA;AAAA,QAElC;AAAA,QACJ,EAAA,WAAA,GAAA;AAAA,MACkB;AAAA,IACtB,CAAA,IAGJhD,IAAA,qCAAA,UAAA,QAAAA,EAAA,QACI,SAAA,MAAA,MAAA,KAAA,MAAA;AACI,MAAAqC,EAAA;AAAA,IAA2B,CAAA,IAG/BA,EAAA;AAAA,EACJ,CAAA,GAEJvH,GAAA,MAAA;AACI,IAAA4G,KAAA,QAAAA,EAAA;AAAA,EAAgC,CAAA,GAEpCuB,GAAA,MAAA;;AACI,IAAAnC,EAAA,WAAAd,IAAA,OAAA,KAAAc,EAAA,KAAA,MAAA,gBAAAd,EAAA,UAAA,KACI,OAAA,KAAAc,EAAA,KAAA,EACA,QAAA,CAAArB,MAAA;AACI,MAAAqB,EAAA,MAAArB,CAAA,IAAA,CAAA;AAAA,IAAwB,CAAA;AAAA,EAEhC,CAAA,GAGJ;AAAA,IAAO,YAAAiD;AAAA,IACS,mBAAAK;AAAA,IACZ,uBAAAZ;AAAA,IACA,yBAAApB;AAAA,IACA,oDAAA+B;AAAA,IACA,SAAAlH;AAAA,IACA,wBAAA+G;AAAA,IACA,oBAAA3B;AAAA,EACA;AAER,GC1aakC,KAAA,CAAAC,GAAAtH,GAAA8E,GAAAyC,GAAAC,GAAAC,GAAAC,MAAA;AAST,QAAAC,IAAAvJ,EAAAkJ,EAAA,SAAA,CAAA,CAAA,GACAM,IAAApH,GAAA;AAAA,IAA2E,kBAAA;AAAA,IACrD,iBAAA;AAAA,EACD,CAAA,GAErBqH,IAAA/G;AAAA,IAAsC,MAAAgE,EAAA,MAAA,QAAA,CAAAgD,MAAA;;AAAA,cAAAA,KAAA3D,IAAA2D,KAAA,gBAAAA,EAAA,aAAA,gBAAA3D,EAAA,UAAA,IAAA2D,KAAA,gBAAAA,EAAA,WAAA,CAAA,CAAA;AAAA,KAAA,EAAA,KAAA;AAAA,EACwE,GAE9GC,IAAAjH;AAAA,IAAkC,MAAA;;AAAA,eAAAqD,IAAAW,EAAA,UAAA,gBAAAX,EAAA,UAAA,OAAAC,IAAAyD,EAAA,UAAA,gBAAAzD,EAAA,MAAA,CAAAsB,MAAAiC,EAAA,MAAA,SAAAJ,EAAA7B,CAAA,CAAA;AAAA;AAAA,EAG0E,GAE5GsC,IAAAlH;AAAA,IAAyC,MAAA;;AAAA,eAAAqD,IAAAW,EAAA,UAAA,gBAAAX,EAAA,UAAA,OAAAC,IAAAyD,EAAA,UAAA,gBAAAzD,EAAA,OAAA,CAAA0D,MAAA,CAAAN,EAAAM,CAAA,GAAA,MAAA,CAAApC,MAAAiC,EAAA,MAAA,SAAAJ,EAAA7B,CAAA,CAAA;AAAA;AAAA,EAKmC,GAE5EuC,IAAAnH;AAAA,IAA+B,MAAA;;AAAA,eAAAqD,IAAAW,EAAA,UAAA,gBAAAX,EAAA,UAAA,KAAA,GAAAC,IAAAyD,EAAA,UAAA,QAAAzD,EAAA,KAAA,CAAAsB,MAAAiC,EAAA,MAAA,SAAAJ,EAAA7B,CAAA,CAAA;AAAA;AAAA,EAG6E,GAG5GwC,IAAApH;AAAA,IAAsC,MAAA;;AAAA,eAAAqD,IAAAW,EAAA,UAAA,gBAAAX,EAAA,UAAA,KAAA,GAAAC,IAAAyD,EAAA,UAAA,QAAAzD,EAAA,OAAA,CAAA0D,MAAA,CAAAN,EAAAM,CAAA,GAAA,KAAA,CAAApC,MAAAiC,EAAA,MAAA,SAAAJ,EAAA7B,CAAA,CAAA;AAAA;AAAA,EAKqC,GAE3EyC,IAAArH,EAAA,MAAA;;AACI,WAAA,EAAA2G,KAAA,QAAAA,EAAA,YAAAtD,IAAAuD,KAAA,gBAAAA,EAAA,UAAA,gBAAAvD,EAAA,gBAAA,SACI,KAEJwD,EAAA,MAAA,UAAAD,EAAA,MAAA,cAAAM,EAAA;AAAA,EAAqG,CAAA,GAGzGI,IAAA,MAAA;AACI,IAAApI,EAAAN,EAAA,QAAAiI,EAAA,KAAA,GACA3H,EAAAN,EAAA,kBAAAiI,EAAA,KAAA;AAAA,EAA6D,GAQjEU,IAAA,CAAAnF,MAAA;;AACI,IAAAyE,EAAA,QAAAzE,GACA6E,EAAA,SACIH,EAAA,mBAAA,IAEAA,EAAA,kBAAA,OAEAA,EAAA,mBAAA,IAEAA,EAAA,oBAAAzD,IAAAwD,EAAA,UAAA,gBAAAxD,EAAA,UAAA,OAAAC,IAAAU,EAAA,UAAA,gBAAAV,EAAA,UAAA,KAAAU,EAAA,MAAA;AAAA,MAGe,CAAAY,MAAA;;AAAA,eAAAiC,EAAA,MAAA,SAAAJ,EAAA7B,CAAA,CAAA,OAAAvB,IAAAuB,KAAA,gBAAAA,EAAA,aAAA,gBAAAvB,EAAA,KAAA,CAAAmE,MAAAX,EAAA,MAAA,SAAAJ,EAAAe,CAAA,CAAA;AAAA;AAAA,IAGqF;AAAA,EAExG,GAUJC,IAAA,CAAAC,MAAA;AACI,IAAA3J,GAAA,MAAA;;AAEI,MAAA+I,EAAA,mBAAAY;AAEA,YAAAC,MAAArE,KAAAD,IAAA0D,EAAA,UAAA,gBAAA1D,EAAA;AAAA,QAEU,CAAA2D,MAAA,CAAAN,EAAAM,CAAA,OAAAA,KAAA,gBAAAA,EAAA,cAAA,UAAAA,EAAA,SAAA,MAAA,CAAAQ,MAAA,CAAAd,EAAAc,CAAA,CAAA;AAAA,YAFV,gBAAAlE,EAMuF,IAAA,CAAA0D,MAAAP,EAAAO,CAAA,OAAA,CAAA;AAGvF,MAAAU,KACIb,EAAA,QAAA,CAAA,GAAA,oBAAA,IAAA,CAAA,GAAAA,EAAA,OAAA,GAAAc,CAAA,CAAA,CAAA,GACAb,EAAA,kBAAA,CAAAG,EAAA,UAEAJ,EAAA,QAAAA,EAAA,MAAA,OAAA,CAAAjC,MAAA,CAAA+C,EAAA,SAAA/C,CAAA,CAAA,GACAkC,EAAA,kBAAA,CAAAK,EAAA,QAEJG,EAAA;AAAA,IAAW,CAAA;AAAA,EACd,GAGLM,IAAA,MAAA;AACI,IAAA7J,GAAA,MAAA;AACI,MAAAwJ,EAAA,CAAA,CAAA,GACAD,EAAA;AAAA,IAAW,CAAA;AAAA,EACd,GAGLO,IAAA,CAAAzF,GAAA0F,MAAA;AACI,IAAA/J,GAAA,MAAA;;AACI,MAAAwJ,IAAAlE,IAAAyE,KAAA,gBAAAA,EAAA,aAAA,gBAAAzE,EAAA,UAAA,IAAA0E,EAAA3F,GAAA0F,CAAA,IAAA1F,CAAA,GACAkF,EAAA;AAAA,IAAW,CAAA;AAAA,EACd,GAILS,IAAA,CAAA3F,GAAA4F,MAAA;;AACI,UAAAC,IAAAxB,EAAAuB,CAAA,GACAE,KAAA7E,IAAA2E,EAAA,aAAA,gBAAA3E,EAAA,OAAA,CAAAmE,MAAA,CAAAd,EAAAc,CAAA,GAAA,IAAA,CAAAA,MAAAf,EAAAe,CAAA;AAIA,QAAApF,EAAA,SAAA6F,CAAA,GAAA;AACI,YAAAE,IAAA/F;AACA,aAAA8F,EAAA,QAAA,CAAAE,MAAA;AACI,QAAAD,EAAA,SAAAC,CAAA,KACID,EAAA,KAAAC,CAAA;AAAA,MACJ,CAAA,GAEJD;AAAA,IAAO;AAEX,WAAA/F,EAAA,OAAA,CAAAiG,MAAA,CAAAH,EAAA,SAAAG,CAAA,CAAA;AAAA,EAAmF,GAIvFC,IAAA,CAAAlG,GAAA4F,GAAAF,MAAA;AAKI,IAAA/J,GAAA,MAAA;;AACI,YAAAkK,IAAAxB,EAAAuB,CAAA;AAEA,MAAA5F,EAAA,SAAAqE,EAAAqB,CAAA,CAAA,IACIP;AAAA,QAAA,CAAAnF,EAAA,SAAA6F,CAAA,OAAA5E,IAAA2E,KAAA,gBAAAA,EAAA,aAAA,QAAA3E,EAAA,MAAA,CAAAkF,MAAAnG,EAAA,SAAAqE,EAAA8B,CAAA,CAAA,MAAA,CAAA,GAAAnG,GAAA6F,CAAA,IAAA7F;AAAA,MAIU,IAIVmF;AAAA,QAAAnF,EAAA,SAAA6F,CAAA,KAAA,GAAA3E,IAAA0E,KAAA,gBAAAA,EAAA,aAAA,QAAA1E,EAAA,MAAA,CAAAiF,MAAAnG,EAAA,SAAAqE,EAAA8B,CAAA,CAAA,MAAAnG,EAAA,OAAA,CAAAoG,MAAAA,MAAAP,CAAA,IAAA7F;AAAA,MAIU,GAGdkF,EAAA;AAAA,IAAW,CAAA;AAAA,EACd,GAGLmB,IAAAzI,EAAA,MACIqH,EAAA,QACI,QAEJH,EAAA,QACI,SAEJ,CAAAL,EAAA,SAAAA,EAAA,MAAA,WAAA,IACI,SAEJO,EAAA,QACI,oBAEJ,QAAO;AAIX,SAAAnJ;AAAA,IAAA,MAAAuI,EAAA;AAAA,IACoB,MAAA;AAEZ,MAAAe,EAAAf,EAAA,SAAA,CAAA,CAAA;AAAA,IAAyC;AAAA,IAC7C,EAAA,WAAA,GAAA;AAAA,EACkB,GAItBvI;AAAA,IAAA,MAAA+F,EAAA;AAAA,IACe,MAAA;AAGP,YAAA0E,IAAA1E,EAAA,MAAA,OAAA,CAAAgD,MAAAH,EAAA,MAAA,SAAAJ,EAAAO,CAAA,CAAA,CAAA,EAAA;AAAA,QAEK,CAAAA,MAAA;;AAAA,mBAAA3D,IAAA2D,KAAA,gBAAAA,EAAA,aAAA,gBAAA3D,EAAA,UAAA,IAAA2D,EAAA,SAAA,IAAA,CAAAQ,MAAAf,EAAAe,CAAA,CAAA,EAAA,OAAA,CAAAmB,MAAA,CAAA9B,EAAA,MAAA,SAAA8B,CAAA,CAAA,IAAA,CAAA;AAAA;AAAA,MAKU;AAGf,OAAAD,KAAA,gBAAAA,EAAA,UAAA,KACInB,EAAA,CAAA,GAAAV,EAAA,OAAA,GAAA6B,CAAA,CAAA,GACApB,EAAA,KAEAC,EAAAV,EAAA,KAAA;AAAA,IACJ;AAAA,EACJ,GAGJ;AAAA,IAAO,gBAAAY;AAAA,IACH,aAAAI;AAAA,IACA,mBAAAS;AAAA,IACA,eAAAV;AAAA,IACA,uBAAAd;AAAA,IACA,eAAAD;AAAA,IACA,gBAAA4B;AAAA,EACA;AAER,GCpPOG,KAAA,CAAAC,GAAA5J,GAAAC,OA+BH,EAAA,WA1BA,CAAAe,MAAA4I,EAAA,MAAA,KAAA,CAAAC,MAAAA,EAAA,UAAA7I,CAAA,GA0BA,qBAxBA,CAAAA,MAAA;;AAAA,UAAAoD,IAAAwF,EAAA,MAAA,KAAA,CAAAC,MAAAA,EAAA,UAAA7I,CAAA,MAAA,gBAAAoD,EAAA;AAAA,GAwBA,mBArBA,CAAApD,MAAA;;AAEI,MAAA,CAAAhB,EAAA,MAAA,KAAA,CAAAO,MAAAA,EAAA,UAAAS,KAAAT,EAAA,QAAA;AACI;AAaJ,QAAAuJ,IAAA,CATA;AAAA,IAAiD,OAAA9I;AAAA,IAC7C,aAAAoD,IAAAwF,EAAA,MAAA,KAAA,CAAAC,MAAAA,EAAA,UAAA7I,CAAA,MAAA,gBAAAoD,EAAA,eAAA3E,GAAA,YAAAA,GAAA,aAAAA,GAAA;AAAA,EAKqC,CAGzC;AAEA,EAAAQ,EAAA,QAAA6J,CAAA;AAA0B,EAG9B;ACvCQ,IAAAC,MAAA,CAAAC,OACRA,EAAAA,EAAA,aAAAC,GAAA,UAAA,IAAA,cACAD,EAAAA,EAAA,WAAAC,GAAA,QAAA,IAAA,YACAD,EAAAA,EAAA,aAAAC,GAAA,UAAA,IAAA,cACAD,EAAAA,EAAA,cAAAC,GAAA,WAAA,IAAA,eACAD,EAAAA,EAAA,UAAAC,GAAA,OAAA,IAAA,WACAD,EAAAA,EAAA,YAAAC,GAAA,SAAA,IAAA,aACAD,EAAAA,EAAA,MAAAC,GAAA,GAAA,IAAA,OACAD,EAAAA,EAAA,OAAAC,GAAA,IAAA,IAAA,QARQD,IAAAD,MAAA,CAAA,CAAA;ACML,MAAAG,KAAA,wBASAC,KAAA,CAAAC,GAAAC,GAAArK,GAAAsK,GAAAC,GAAAvG,MAAA;AAQH,QAAAwG,IAAAzJ,EAAA,MACIiD,EAAA,SAAAsG,EAAA,QACI,KAGJtK,EAAA,MAAA,KAAA,CAAA2D,MAAAA,EAAA,mBAAAA,EAAA,QAAA,CAA4F,GAEhG8G,IAAA1J,EAAA,MAAA;AACI,QAAA2J,IAAA1K,EAAA,MAAA,OAAA,CAAA,EAAA,SAAAgH,EAAA,MAAAA,MAAA,EAAA;AACA,WAAAuD,EAAA,UACIG,IAAA;AAAA,MAA0B,GAAAA;AAAA,MACnB,EAAA,OAAAR,IAAA,OAAA,GAAA;AAAA,IACwD,IAGnEQ;AAAA,EAAO,CAAA,GAIXC,IAAA5J,EAAA,MAAA0J,EAAA,MAAA,MAAA,GAEAG,IAAA7J,EAAA,MAAA;AACI,QAAA,CAAAqJ,EAAA;AACI,aAAA,CAAA;AAGJ,UAAAS,IAAA,OAAA,KAAAT,EAAA,KAAA,EAAA,CAAA;AACA,QAAA,CAAAS,KAAA,CAAAT,EAAA,MAAAS,CAAA;AACI,aAAA,CAAA;AAGJ,UAAAC,IAAA,CAAA;AAEA,QAAAN,EAAA;AAEI,iBAAA7G,KAAA8G,EAAA,OAAA;AACI,cAAAM,IAAAV,EAAA,MAAA1G,EAAA,KAAA;AACA,QAAAmH,EAAA,KAAAC,CAAA;AAAA,MAAgC;AAKxC,UAAAC,IAAAZ,EAAA,MAAAS,CAAA,EAAA;AACA,aAAAI,IAAA,GAAAA,IAAAD,GAAAC;AACI,iBAAAtH,KAAA8G,EAAA,OAAA;AACI,cAAAS,IAAAd,EAAA,MAAAzG,EAAA,KAAA;AACA,QAAAuH,KAAA,QAAAA,EAAAD,MACIH,EAAA,KAAAI,EAAAD,CAAA,CAAA;AAAA,MACJ;AAIR,WAAAH;AAAA,EAAO,CAAA,GAIXK,IAAA,CAAAC,MAAA,KAAA,MAAAA,IAAAT,EAAA,KAAA,GAaAU,IAAA,CAAAD,GAAAE,GAAAC,MAAA;AACI,UAAAC,IAAAZ,EAAA,MAAA,SAAA,GACAa,IAAAd,EAAA,QAAA,GACAe,IAAAP,EAAAC,CAAA,GACAO,IAAAP,IAAAT,EAAA,QAAAe;AAgBA,WAdA;AAAA,MAA6B,CAAA3B,GAAA,OAAA,GAAA4B,KAAAnB,EAAA,QAAAG,EAAA,QAAA;AAAA,MAEiD,CAAAZ,GAAA,SAAA,GAAAyB,IAAAC,IAAAE;AAAA,MACA,CAAA5B,GAAA,GAAA,GAAAwB,IAAAC,IAAAb,EAAA,QAAAe,IAAAD;AAAA,MAGtB,CAAA1B,GAAA,IAAA,GAAAwB,IAAAf,EAAA,QAAAG,EAAA,QAAA,IAAAA,EAAA,QAAAe;AAAA,IAKlB,EAGtCJ,CAAA;AAAA,EAAqC,GAKzCM,IAAA,CAAAR,GAAAE,MAAA;AACI,UAAAI,IAAAP,EAAAC,CAAA,GAUAS,IARA;AAAA,MAAyB,CAAA9B,GAAA,UAAA,GAAAY,EAAA;AAAA,MACwC,CAAAZ,GAAA,QAAA,GAAA2B,MAAA,KAAA,CAAAlB,EAAA,QAAA,IAAA,CAAAG,EAAA;AAAA,MAEmB,CAAAZ,GAAA,UAAA,GAAA;AAAA,MACvC,CAAAA,GAAA,WAAA,GAAA;AAAA,IACC,EAG9CuB,CAAA,GACAQ,IAAAV,IAAAS;AAEA,WAAAC,IAAA,KAAAA,KAAAlB,EAAA,MAAA,SACIQ,IAGJU;AAAA,EAAO,GAIXC,IAAA,CAAAC,MAAA;AAAA,IACIjC,GAAA;AAAA,IAC+BA,GAAA;AAAA,IACAA,GAAA;AAAA,IACAA,GAAA;AAAA,EACA,EAAA,SAAAiC,CAAA,GAInCC,IAAA,CAAAC,GAAAC,GAAAZ,MAAA;AAKI,UAAAa,IAAAxB,EAAA,MAAA,QAAAsB,CAAA;AAEA,WAAAH,EAAAI,CAAA,IACId,EAAAe,GAAAD,GAAAZ,CAAA,IAGJK,EAAAQ,GAAAD,CAAA;AAAA,EAAsD,GAI1DE,IAAA,CAAAH,GAAArI,GAAA0H,MAAA;AACI,QAAA,CAAAX,EAAA,MAAA,SAAAsB,CAAA;AACI;AAGJ,UAAAI,IAAAL,EAAAC,GAAArI,GAAA0H,CAAA;AACA,IAAAX,EAAA,MAAA0B,CAAA,EAAA,MAAA;AAAA,EAAyD,GAI7DC,IAAA,CAAA1I,MAAAA,KAAAkG;AAwBA,SAAA;AAAA,IAAO,qBAAAwC;AAAA,IACH,qBAAAF;AAAA,IACA,iBAvBJ,CAAA9K,MAAA;AACI,YAAA,EAAA,SAAAgK,GAAA,KAAA1H,GAAA,QAAAqI,EAAA,IAAA3K,GACAiL,IAAA3I;AAEA,UAAA4I,IAAAP;AAEA,MAAAO,EAAA,aAAA,MAAA,MAAA,eAGA7B,EAAA,MAAA,SAAA6B,CAAA,MACIA,IAAAP,EAAA,QAAA,0CAAA,IAGJtB,EAAA,MAAA,SAAA6B,CAAA,KAAAF,EAAAC,CAAA,KAIIH,EAAAI,GAAAD,GAAAjB,CAAA;AAAA,IACJ;AAAA,EAMA;AAER,GClMAmB,KAAA,IAYOC,KAAA,CAAAC,GAAAC,GAAAjI,GAAAkI,GAAA7M,MAAA;AAOH,QAAA8M,IAAA1O,EAAAuO,CAAA,GACAI,IAAA3O,EAAAwO,CAAA,GACA7H,IAAA3G,EAAAuG,CAAA,GACAqI,IAAA5O,EAAAyO,CAAA,GAEAI,IAAAnM,EAAA,MAAAgM,EAAA,UAAA,MAAA,GAEAI,IAAApM,EAAA,MAAAgM,EAAA,UAAA,WAAA,GAEAK,IAAA,MAAA;AACI,IAAAnN,EAAAN,EAAA,gBAAA;AAAA,EAAwC;AAG5C,SAAAX;AAAA,IAAA,MAAAgO,EAAA;AAAA,IACiC,MAAA;AAEzB,MAAAG,EAAA,SACInI,EAAA,MAAA,eACAgI,EAAA,QAAA,MACAN,MAAA,CAAAO,EAAA,SACIG,EAAA;AAAA,IAER;AAAA,EACJ,GAGJ,EAAA,YAAAF,GAAA,kBAAAC,GAAA,wBAAAH,GAAA,mBAAAI,EAAA;AACJ,GCxCOC,KAAA,CAAAC,GAAAC,GAAAtN,MAAA;AAKH,QAAAD,IAAA3B,EAAAiP,CAAA,GACAE,IAAAnP,EAAAkP,CAAA,GAEAE,IAAAhN,GAAA;AAAA,IAAmE,UAAA;AAAA,IACrD,YAAA;AAAA,IACE,QAAA;AAAA,EACJ,CAAA,GAGZiN,IAAA,CAAAC,GAAA1J,IAAA,MAAA;AACI,UAAA2J,IAAA5N,EAAA,MAAA,UAAA,CAAA6N,MAAAA,EAAA,UAAAF,EAAA,KAAA,GACAG,IAAAF,IAAA3J;AACA,QAAA6J,IAAA,KAAAA,IAAA9N,EAAA,MAAA,SAAA;AACI;AAKJ,UAAA+N,IAAA,CAAA,GAAA/N,EAAA,KAAA;AACA,IAAA+N,EAAA,OAAAD,GAAA,GAAAC,EAAA,OAAAH,GAAA,CAAA,EAAA,CAAA,CAAA,GAEA3N,EAAAN,EAAA,SAAAoO,CAAA,GACA9N,EAAAN,EAAA,gBAAAoO,CAAA;AAAA,EAAwD,GAG5DC,IAAA,CAAArK,GAAAsK,MAAA;AACI,IAAAR,EAAA,WAAA9J,GACAsK,EAAA,aAAA,QAAA,QAAA,EAAA,GACAA,EAAA,aAAA,aAAA;AAAA,EAA4B,GAGhCC,IAAA,CAAAvK,GAAAwK,MAAA;AACI,IAAAV,EAAA,SAAA9J;AACA,UAAAyK,IAAAD,EAAA,cAAA,sBAAA,GACAE,IAAAD,EAAA,OAAAA,EAAA,QAAA,GACAE,IAAAH,EAAA,WAAA;AACA,IAAAV,EAAA,aAAAa,KAAAD;AAAA,EAAwC,GAG5CE,IAAA,CAAA5K,MAAA;;AACI,UAAAS,IAAAqJ,EAAA,aAAA,gBAAArJ,EAAA,WAAAT,EAAA,OAAA;AAEI,YAAAiK,IAAA5N,EAAA,MAAA,UAAA,CAAA6N,MAAA;;AAAA,eAAAA,EAAA,YAAAzJ,IAAAqJ,EAAA,aAAA,gBAAArJ,EAAA;AAAA,OAAA,GACAoK,IAAAxO,EAAA,MAAA,UAAA,CAAA6N,MAAAA,EAAA,UAAAlK,EAAA,KAAA,GACAmK,IAAAL,EAAA,aAAAe,IAAAA,IAAA,GACAC,IAAAX,IAAAF,IAAAE,IAAA,IAAAA;AACA,UAAAC,IAAA,CAAA,GAAA/N,EAAA,KAAA;AAEA,MAAA+N,EAAA;AAAA,QAAiBU,MAAA,KAAA,IAAAA;AAAA,QACgB;AAAA,QAC7BV,EAAA,OAAAH,GAAA,CAAA,EAAA,CAAA;AAAA,MACuC;AAG3C,YAAAc,IAAA1O,EAAA,MAAA,UAAA,CAAA6N,MAAA,EAAAA,KAAA,QAAAA,EAAA,OAAA;AAGA,QAAAxJ,IAAAoJ,EAAA,aAAA,gBAAApJ,EAAA,YAAAV,EAAA,UAAAmK,MAAAY,MACIX,IAAAA,EAAA;AAAA,QAAoC,CAAAxN,MAAA;;AAAA,mBAAA6D,IAAAqJ,EAAA,aAAA,gBAAArJ,EAAA,WAAA7D,EAAA,QAAA,EAAA,GAAAA,GAAA,QAAA,CAAA,EAAAoD,KAAA,QAAAA,EAAA,QAAA,IAAApD;AAAA;AAAA,MACuD,IAI/FN,EAAAN,EAAA,SAAAoO,CAAA,GACA9N,EAAAN,EAAA,gBAAAoO,CAAA;AAAA,IAAwD;AAG5D,IAAAN,EAAA,WAAA,MACAA,EAAA,SAAA;AAAA,EAAyB,GAG7BkB,IAAA,MAAA;AACI,IAAAlB,EAAA,WAAA,MACAA,EAAA,aAAA,MACAA,EAAA,SAAA;AAAA,EAAyB,GAI7BmB,IAAA7N,EAAA,MACIyM,EAAA,QAIA;AAAA,IAAO,CAAAnO,EAAA,iBAAA,GAAA,CAAAsE,GAAAsK,MAAAD,EAAArK,GAAAsK,CAAA;AAAA,IAEsB,CAAA5O,EAAA,iBAAA,GAAA,CAAAsE,GAAAwK,MAAAD,EAAAvK,GAAAwK,CAAA;AAAA,IAEQ,CAAA9O,EAAA,WAAA,GAAA,CAAAsE,MAAA4K,EAAA5K,CAAA;AAAA,IACyC,CAAAtE,EAAA,eAAA,GAAA,MAAAsP,EAAA;AAAA,EAClB,IATxD,CAAA,CAUJ,GAIJE,IAAA9N,EAAA,MAAA,CAAA4C,MACI6J,EAAA,QAIA;AAAA,IAAO,WAAA,CAAAS,MAAA;AAEC,MAAAA,EAAA,eAAA,GACAC,EAAAvK,GAAAsK,CAAA;AAAA,IAAqB;AAAA,IACzB,MAAA,MAAA;AAEI,MAAAM,EAAA5K,CAAA;AAAA,IAAa;AAAA,IACjB,UAAA,CAAAsK,MAAA;AAEI,MAAAA,EAAA,eAAA;AAAA,IAAiB;AAAA,EACrB,IAbA,CAAA,CAcJ;AAGJ,SAAA;AAAA;AAAA,IAAO,iBAAAR;AAAA;AAAA,IAEH,0BAAAmB;AAAA,IAGA,0BAAAC;AAAA,IACA,sBAAAnB;AAAA,EACA;AAER,GC7HOoB,KAAA,CAAAxB,GAAAyB,GAAA9O,MAAA;AAKH,QAAAD,IAAA3B,EAAAiP,CAAA,GACA0B,IAAA3Q,EAAA0Q,EAAA,KAAA,GAGAE,IAAAlO;AAAA,IAAmC,MAAA,CAAA,GAAAf,EAAA,KAAA,EAAA,KAAA,CAAAkP,GAAAC,MAE3BD,EAAA,WAAAC,EAAA,SACI,IAEJD,EAAA,SAAA,KAAA,CAAuB;AAAA,EAC1B,GAELE,IAAArO;AAAA,IAAsB,MAAAkO,EAAA,MAAA,OAAA,CAAA1O,MAAAA,EAAA,UAAAA,EAAA,YAAA,EAAA;AAAA,EACgE,GAEtF8O,IAAAtO;AAAA,IAAwB,MAAAkO,EAAA,MAAA,OAAA,CAAA1O,MAAA,CAAAA,EAAA,UAAAA,EAAA,YAAA,EAAA;AAAA,EAC+D,GAEvF+O,IAAAvO;AAAA,IAAmB,MAAA;AAAA,MACf,EAAA,WAAAqO,EAAA,OAAA,IAAA,UAAA,iBAAA,GAAA;AAAA,MAC0E,EAAA,WAAAC,EAAA,OAAA,IAAA,WAAA;AAAA,IACnB,EAAA,OAAA,CAAA,EAAA,WAAAE,EAAA,MAAAA,EAAA,MAAA;AAAA,EACX,GAEhDC,IAAAzO;AAAA,IAA+B,MAAAf,EAAA,MAAA,OAAA,CAAAO,OAAAA,KAAA,gBAAAA,EAAA,aAAA,OAAAA,KAAA,gBAAAA,EAAA,WAAA4B,EAAA,EAAA,WAAA;AAAA,EAGP,GAGxBsN,IAAA,CAAAC,MAAAzP,EAAAN,EAAA,kBAAA+P,CAAA,GAGAC,IAAA,CAAAC,MAAA;AACI,IAAAZ,EAAA,QAAAY,GACA3P,EAAAN,EAAA,mBAAAiQ,CAAA;AAAA,EAAsD,GAI1DC,IAAA,CAAAnL,MAAA;AACI,IAAAzE,EAAAN,EAAA,SAAA+E,CAAA,GACAzE,EAAAN,EAAA,gBAAA+E,CAAA;AAAA,EAAkD,GAItDoL,IAAA,CAAAC,MAAA;AACI,UAAAC,IAAAf,EAAA,MAAA;AAAA,MAAwD,CAAA1O,OAAAA,KAAA,gBAAAA,EAAA,WAAAwP,EAAA,QAAAA,IAAAxP;AAAA,IACC;AAEzD,IAAAsP,EAAAG,CAAA;AAAA,EAA4C;AAGhD,SAAAhR,GAAA+P,GAAA,CAAAkB,MAAA;AACI,IAAAjB,EAAA,QAAAiB;AAAA,EAA0B,CAAA,GAG9B;AAAA;AAAA,IAAO,YAAAX;AAAA,IAEH,wBAAAE;AAAA,IACA,mBAAAR;AAAA,IACA,eAAAC;AAAA;AAAA,IACe,+BAAAY;AAAA,IAGf,8BAAAC;AAAA,IACA,iCAAAL;AAAA,IACA,iCAAAE;AAAA,EACA;AAER,GCjFaO,KAAA,CAAAlL,GAAAsI,GAAAN,GAAAmD,GAAAC,GAAArJ,GAAA5C,MAAA;AAcT,QAAAkM,IAAAhS,EAAA,CAAA,GACAiS,IAAAjS,EAAA,EAAA,GACAkS,IAAAlS,EAAA,EAAA;AAKA,EAAAW,GAAA,CAAA,MAAAqR,EAAA,OAAA,MAAAtJ,EAAA,KAAA,GAAA,CAAA,CAAAyJ,CAAA,MAAA;AACI,IAAAxL,EAAA,MAAA,aAAAwL,GACAlD,EAAA,MAAA,aAAAkD,GACAF,EAAA,QAAA,CAAA,CAAAE,GACAD,EAAA,QAAAjD,EAAA,MAAA,cAAAA,EAAA,MAAA,cAAAkD;AAAA,EACkE,CAAA,GAGtE3R,GAAA,YAAA;;AACI,UAAAC,GAAA,KAMAsF,IAAAkJ,EAAA,UAAA,gBAAAlJ,EAAA,iBAAAC,IAAAiJ,EAAA,UAAA,gBAAAjJ,EAAA,iBACIkM,EAAA,QAAA;AAAA,EACJ,CAAA;AAGJ,QAAAE,IAAA,CAAAlP,MAAA;AAII,QAHA8O,EAAA,QAAA9O,EAAA,OAAA,YACAyL,EAAA,QAAAhI,EAAA,MAAA,eAAAzD,EAAA,OAAA,WAEA4O,KAAA,QAAAA,EAAA,OAAA;AACI,YAAAO,IAAAnP,EAAA,OAAA;AACA,MAAA4O,EAAA,MAAA,eAAAO,MACIP,EAAA,MAAA,aAAAO;AAAA,IACJ;AAAA,EACJ,GAGJC,IAAA,CAAApP,MAAA;AACI,IAAAA,EAAA,QAAA,SAAAA,EAAA,QAAA,gBAAAA,EAAA,QAAA,gBAGAA,EAAA,eAAA,GAEAyD,EAAA,MAAA,aAAA,GAEAA,EAAA,MAAA,MAAA,YAAA,UACA,WAAA,MAAA;AACI,MAAAA,EAAA,UACIA,EAAA,MAAA,MAAA,YAAA;AAAA,IACJ,CAAA;AAAA,EACH,GAIL4L,IAAA,CAAArP,MAAA;AACI,UAAAmP,IAAAnP,EAAA,OAAA;AACA,IAAAyD,EAAA,MAAA,eAAA0L,MACI1L,EAAA,MAAA,aAAA0L;AAAA,EACJ,GAGJG,IAAA9P,EAAA,MAAA;;AACI,YAAAqD,IAAAD,KAAA,gBAAAA,EAAA,eAAA,QAAAC,EAAA,WAAAC,IAAAF,KAAA,gBAAAA,EAAA,qBAAA,QAAAE,EAAA,SAAAF,KAAA,QAAAA,EAAA,uBAAA,GAAAG,IAAAH,KAAA,gBAAAA,EAAA,eAAA,QAAAG,EAAA,SAKI,EAAA,QAAA,MAAAC,IAAA6L,EAAA,UAAA,gBAAA7L,EAAA,iBAAA,KAAA,CAAA,KAAA,IAEJ,CAAA;AAAA,EAAQ,CAAA;AAGZ,SAAA;AAAA;AAAA,IAAO,oBAAA8L;AAAA,IAEH,iBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,sCAAAM;AAAA;AAAA,IACA,sBAAAJ;AAAA,IAGA,+CAAAE;AAAA,IACA,6BAAAC;AAAA,EACA;AAER,GCzGOE,KAAA,CAAAxB,GAAAhF,GAAAyG,GAAA7J,MAAA;AAMH,QAAA8J,IAAA3S,EAAA,IAAA,GACA4S,IAAAlQ,EAAA,MAAA;;AACI,QAAA,CAAAiQ,EAAA,SAAAA,EAAA,MAAA,UAAA7O;AACI,aAAA;AAAA,QAAO,wBAAA;AAAA,QACqB,mBAAA;AAAA,QACL,cAAA;AAAA,QACL,eAAA;AAAA,MACC;AAIvB,UAAA+O,KAAA7M,KAAAD,IAAAkL,EAAA,MAAA,KAAA,CAAA6B,MAAAA,EAAA,eAAA,MAAA,gBAAA/M,EAAA,cAAA,gBAAAC,EAAA,OAAA,CAAA9D,MAAAA,EAAA,UAAA4B,KAGAiP,IAAA9B,EAAA,MAAA,KAAA,CAAA6B,MAAA,EAAAA,KAAA,QAAAA,EAAA,gBAAA,GAEAE,IAAAL,EAAA,MAAA,WAAAE,KAAA,gBAAAA,EAAA,GAAA,WAAAF,EAAA,MAAA,OAEAM,IAAA,CAAAN,EAAA,MAAA,YAAA1M,IAAA8M,KAAA,gBAAAA,EAAA,cAAA,gBAAA9M,EAAA,GAAA,WAAA0M,EAAA,MAAA,OAMAO,KAAAjH,EAAA,SAAAyG,EAAA,UAAAM,GAEAG,KAAAlH,EAAA,SAAAyG,EAAA,UAAA,CAAAG,KAAAI,GAGAG,IAAAP,KAAAI,GAIAI,KAAAR,KAAA,gBAAAA,EAAA,UAAA,KAAAF,EAAA,MAAA,WAAAE,KAAA,gBAAAA,EAAAA,EAAA,SAAA,GAAA,WAAAF,EAAA,MAAA,OAKAW,IAAAZ,EAAA,SAAA7J,EAAA,SAAA,CAAA8J,EAAA,MAAA,YAAAzM,IAAA6M,KAAA,gBAAAA,EAAA,cAAA,gBAAA7M,EAAA6M,EAAA,UAAA,SAAA,GAAA,WAAAJ,EAAA,MAAA;AAOA,WAAA;AAAA,MAAO,wBAAAA,EAAA,MAAA;AAAA,MAC6C,mBAAAW;AAAA,MAC7B,cAAA,CAAA,CAAAJ,KAAA,CAAA,CAAAC,KAAA,CAAA,CAAAC;AAAA,MAIb,eAAA,CAAA,CAAAC,KAAA,CAAA,CAAAC;AAAA,IAEmD;AAAA,EAC7D,CAAA;AAGJ,SAAA;AAAA,IAAO,mBAAAX;AAAA,IACH,wBAAAC;AAAA,EACA;AAER,GClEaW,KAAA,CAAAC,MAAA;AAET,QAAAC,IADAC,GAAAF,CAAA,EACA,OAAA,CAAA9N,MAAAA,EAAA,SAAA8N,CAAA;AAEA,UAAAC,KAAA,gBAAAA,EAAA,UAAA,KACIA,EAAA,CAAA,EAAA,KAAA,MAAA,GACA,MAEJ;AACJ,GAQaE,KAAA,CAAAH,MAAA;AACT,QAAAI,IAAAF,GAAAF,CAAA,GACAC,IAAAG,KAAA,gBAAAA,EAAA,OAAA,CAAAlO,MAAAA,EAAA,SAAA8N;AAEA,OAAAC,KAAA,gBAAAA,EAAA,UAAA;AACI,WAAAA,EAAA,QAAA,CAAA/N,MAAAA,EAAA,KAAA,aAAA,YAAA,IAAA,CAAA,GACA+N;AAGR,GAMaI,KAAA,CAAAC,MAAA;AACT,GAAAA,KAAA,gBAAAA,EAAA,UAAA,KACIA,EAAA,QAAA,CAAApO,MAAAA,KAAA,gBAAAA,EAAA,KAAA,aAAA,YAAA,IAAA;AAER,GC3COqO,KAAA,MAAA;AACH,QAAAC,IAAA,OAAA,aAAA,EAAA,WAAA,CAAA,EAAA,cAAA,GAEAC,IAAAD,EAAA,iBAAA,cAAA;AACA,MAAAE,IAAA,WACAC,IAAA;AAEA,QAAAC,IAAA,CAAA3H,MAAA;AACI,IAAAA,EAAA,QAAA,CAAA4H,MAAA;AACI,YAAAC,IAAAD,EAAA,QAAA,QAAA,EAAA,aAAA,MAAA,MAAA,aAAA,OAAA,MACAE,IAAAF,EAAA,YAAA,KAAA;AACA,MAAAE,MACIL,KAAA,IAAAI,CAAA,IAAAC,CAAA,KAAAD,CAAA,KACAH,KAAA,GAAAI,CAAA;AAAA,IACJ,CAAA;AAAA,EACH;AAGL,MAAA,CAAAN,EAAA,QAAA;AACI,UAAAxH,IAAAuH,EAAA;AAAA,MAA8B;AAAA,IAC1B;AAGJ,QAAAvH,EAAA;AACI,MAAAyH,KAAA,QACAE,EAAA3H,CAAA,GACAyH,KAAA;AAAA,SAAa;AAEb,gBAAA,UAAA,UAAAF,EAAA,WAAA;AACA;AAAA,IAAA;AAAA,EACJ;AAGJ,EAAAC,EAAA,QAAA,CAAAO,MAAA;AACI,UAAA/H,IAAA+H,EAAA;AAAA,MAAkB;AAAA,IACd;AAGJ,QADAN,KAAA,QACAzH,EAAA;AACI,MAAA2H,EAAA3H,CAAA;AAAA,SAAgB;AAEhB,YAAA8H,IAAAC,EAAA,YAAA,KAAA;AACA,MAAAN,KAAA,OAAAK,CAAA,SACAJ,KAAA,GAAAI,CAAA;AAAA,IAAoB;AAExB,IAAAL,KAAA,SACAC,KAAA;AAAA;AAAA,EAAa,CAAA,GAGjBD,KAAA,YAEA,UAAA,UAAA,MAAA;AAAA,IAA0B,IAAA,cAAA;AAAA,MACJ,aAAA,IAAA,KAAA,CAAAA,CAAA,GAAA,EAAA,MAAA,YAAA,CAAA;AAAA,MAC0C,cAAA,IAAA,KAAA,CAAAC,KAAAH,EAAA,YAAA,KAAA,CAAA,GAAA,EAAA,MAAA,aAAA,CAAA;AAAA,IACwC,CAAA;AAAA,EACnG,CAAA;AAET;AClDA,IAAAS,KAAA;AAEA,MAAAC,KAAA;AAAA,EACA,eAAA;AACA,SAAA,OAAAD,GAAA,SAAA,GACAA,MAAA;AAAA,EACA;AACA;;;;;;;;;;;;;ACPA,IAAAE,KAAA;AAEA,MAAAC,KAAA;AAAA,EACA,eAAA;AACA,SAAA,OAAAD,GAAA,SAAA,GACAA,MAAA;AAAA,EACA;AACA;;;;;;;;;;;;;ACPA,IAAAE,KAAA;AAEA,MAAAC,KAAA;AAAA,EACA,eAAA;AACA,SAAA,OAAAD,GAAA,SAAA,GACAA,MAAA;AAAA,EACA;AACA;;;;;;;;;;;;;ACPA,IAAAE,KAAA;AAEA,MAAAC,KAAA;AAAA,EACA,eAAA;AACA,SAAA,OAAAD,GAAA,SAAA,GACAA,MAAA;AAAA,EACA;AACA;;;;;;;;;;;;;ACPA,IAAAE,KAAA;AAEA,MAAAC,KAAA;AAAA,EACA,eAAA;AACA,SAAA,OAAAD,GAAA,SAAA,GACAA,MAAA;AAAA,EACA;AACA;;;;;;;;;;;;;ACPA,IAAAE,KAAA;AAEA,MAAAC,KAAA;AAAA,EACA,eAAA;AACA,SAAA,OAAAD,GAAA,SAAA,GACAA,MAAA;AAAA,EACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GCdaE,KAAA,OAAA,4BAAA,GACAC,KAAA,OAAA,+BAAA,GACAC,KAAA,OAAA,4BAAA,GCysBTC,KAAA;AAAA,EAAe,MAAA,EAAA,UAAAC,GAAA;AAAA,EACM,MAAA;AAErB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA1VAC,IAAA,KACA,EAAA,GAAAC,EAAA,IAAAC,GAAA,GACA,EAAA,SAAAjU,GAAA,QAAA4J,EAAA,IAAAjJ,GAAAuT,CAAA,GACAC,IAAA9V,EAAA,GACAgM,IAAAhM,EAAA,CAAA,CAAA,GACA+V,IAAA/V,EAAA,CAAA,CAAA,GACAgW,IAAAhW,EAAA,GACAiW,IAAAjW,EAAA,GAGAmK,IAAA,CAAA+L,MAAAtU,EAAAZ,EAAA,iBAAAkV,CAAA,GAEAC,IAAA,CAAA7Q,MAAAA,EAAA,UAAAxB,IACAsS,IAAA1T,EAAA,MAAAmT,EAAA,mBAAA,KAAA,GAGAQ,IAAA3T;AAAA,MAAsB,MAAA;;AAAA;AAAA,UAClB;AAAA,YACI,MAAAiT,EAAA,YAAA;AAAA,YACwB,SAAA,MAAAxL,EAAA,EAAA;AAAA,YACc,UAAA0L,EAAA,mBAAA,UAAAA,EAAA,mBAAA;AAAA,UACoC;AAAA,WAC1E9P,IAAA8P,EAAA,qBAAA,QAAA9P,EAAA,WAAA;AAAA,YAEM,MAAA4P,EAAA,yBAAA;AAAA,YACqC,SAAA,MAAA/T,EAAAZ,EAAA,0BAAA;AAAA,YACkC,YAAA6U,EAAA,mBAAA;AAAA,YAC9B,UAAAA,EAAA,mBAAA;AAAA,UACF,IAAA;AAAA,YAEvC,MAAAF,EAAA,WAAA;AAAA,YACuB,SAAA,MAAA/T,EAAAZ,EAAA,uBAAA;AAAA,YAC6C,YAAA6U,EAAA,mBAAA;AAAA,YAC3B,UAAAA,EAAA,mBAAA;AAAA,UACF;AAAA,UACvCA,EAAA,mBAAA,UAAA;AAAA,YAC6B,MAAAF,EAAA,cAAA;AAAA,YACT,SAAA,MAAAxL,EAAA,EAAA;AAAA,YACa,YAAA,GAAAnE,IAAA6P,EAAA,qBAAA,QAAA7P,EAAA;AAAA;AAAA,YACE,UAAA6P,EAAA,mBAAA;AAAA,UACF;AAAA,YACvC5P,IAAA4P,EAAA,qBAAA,gBAAA5P,EAAA,aAAA4P,EAAA,mBAAA,UAAA;AAAA,YAEuC,MAAAF,EAAA,2BAAA;AAAA,YACI,SAAA,MAAA/T,EAAAZ,EAAA,4BAAA;AAAA,YACkC,YAAA;AAAA,YACzD,UAAA6U,EAAA,mBAAA,qBAAAA,EAAA,iBAAA;AAAA,UACmE;AAAA,UACnFA,EAAA,mBAAA,UAAA;AAAA,YAC+B,MAAAF,EAAA,aAAA;AAAA,YACV,SAAA,MAAA/T,EAAAZ,EAAA,YAAA;AAAA,UACgC;AAAA,QACzD,EAAA,OAAA,OAAA;AAAA;AAAA,IACY,GAIpB,EAAA,aAAAuC,GAAA,YAAAzB,GAAA,qCAAAD,EAAA,IAAAH,GAAAC,GAAAC,CAAA,GAGA,EAAA,WAAA0U,GAAA,qBAAAC,GAAA,mBAAAC,EAAA,IAAAlL,GAAAC,GAAA5J,GAAAC,CAAA,GACA6U,IAAA,CAAAnR,MAAA;;AACI,UAAA,CAAAA,EAAA;AACI,eAAA;AAGJ,YAAAoR,KAAA3Q,KAAA8P,EAAA,OAAA,KAAA,CAAA,EAAA,OAAAlT,GAAA,MAAAA,OAAA2C,EAAA,KAAA,MAAA,gBAAAS,GAAA;AAEA,aAAA2Q,IAIA;AAAA,QAAqG,CAAAtV,GAAA,SAAA,GAAAI,GAAA;AAAA,QAC9B,CAAAJ,GAAA,UAAA,GAAAI,GAAA;AAAA,MACC,EAGxEkV,CAAA,IARIlV,GAAA;AAAA,IAQ2C,GAInDmV,IAAAjU,EAAA,MAAA,CAAA4C,MACIuQ,EAAA,sBAIA;AAAA,MAAO,WAAA,CAAAjG,MAAA;AAEC,QAAAhO,EAAAZ,EAAA,mBAAAsE,GAAAsK,CAAA;AAAA,MAAsD;AAAA,MAC1D,UAAA,CAAAA,MAAA;AAEI,QAAAA,EAAA,eAAA;AAAA,MAAiB;AAAA,MACrB,WAAA,CAAAA,MAAA;AAEI,QAAAA,EAAA,eAAA,GACAhO,EAAAZ,EAAA,mBAAAsE,GAAAsK,CAAA;AAAA,MAAsD;AAAA,MAC1D,MAAA,MAAA;AAEI,QAAAhO,EAAAZ,EAAA,aAAAsE,CAAA;AAAA,MAA6C;AAAA,MACjD,SAAA,MAAA;AAEI,QAAA1D,EAAAZ,EAAA,eAAA;AAAA,MAAyC;AAAA,IAC7C,IAnBA,CAAA,CAoBJ,GAIJ4V,IAAAlU;AAAA,MAA2B,MAAA,CAAA4C,MAAA;AAAA,QAEnB;AAAA,UACI,MAAAqQ,EAAA,gBAAA;AAAA,UAC4B,SAAA,MAAA/T,EAAAZ,EAAA,aAAAsE,GAAA,EAAA;AAAA,UACwC,MAAAuR;AAAA,UAC1D,UAAAhB,EAAA,QAAA,CAAA,EAAA,UAAAvQ,EAAA;AAAA,QACsC;AAAA,QAChD;AAAA,UACA,MAAAqQ,EAAA,iBAAA;AAAA,UAC6B,SAAA,MAAA/T,EAAAZ,EAAA,aAAAsE,GAAA,CAAA;AAAA,UACsC,MAAAwR;AAAA,UACzD,UAAAjB,EAAA,QAAAA,EAAA,QAAA,SAAA,CAAA,EAAA,UAAAvQ,EAAA;AAAA,QAC6D;AAAA,QACvE,CAAAyR,EAAA,SAAA;AAAA,UAC2B,MAAAzR,KAAA,QAAAA,EAAA,SAAAqQ,EAAA,gBAAA,IAAAA,EAAA,cAAA;AAAA,UACuC,SAAA,MAAA/T,EAAAZ,EAAA,eAAA,EAAA,GAAAsE,GAAA,QAAA,EAAAA,KAAA,QAAAA,EAAA,QAAA,CAAA;AAAA,UACgC,MAAA0R;AAAA,QACxF;AAAA,QACV;AAAA,UACA,OAAA1R,KAAA,gBAAAA,EAAA,aAAA,KAAAqQ,EAAA,YAAA,IAAAA,EAAA,YAAA;AAAA,UACuE,SAAA,MAAA;AAE/D,YAAA/T,EAAAZ,EAAA,eAAA;AAAA,cAAyC,GAAAsE;AAAA,cAClC,UAAAA,KAAA,gBAAAA,EAAA,aAAA;AAAA,YAC4B,CAAA;AAAA,UAClC;AAAA,UACL,OAAAA,KAAA,gBAAAA,EAAA,aAAA,KAAA2R,KAAAC;AAAA,UAC6C,WAAA5R,KAAA,gBAAAA,EAAA,eAAAA,KAAA,gBAAAA,EAAA,aAAA,MAAAuQ,EAAA;AAAA,QACsB;AAAA,MACvE,EAAA,OAAA,OAAA;AAAA,IACY,GAExBsB,IAAA,CAAA7R,MAAA;AACI,MAAA0Q,EAAA,QAAA1Q,EAAA,OACA2Q,EAAA,SACI,aAAAA,EAAA,KAAA;AAAA,IACJ,GAEJmB,IAAA,CAAA9R,MAAA;AAGI,YAAA+R,IAAA,WAAA,MAAA;AACI,QAAA/R,EAAA,UAAA0Q,EAAA,UACIA,EAAA,QAAA;AAAA,MACJ,GAAAN,CAAA;AAEJ,MAAAO,EAAA,QAAAoB;AAAA,IAAyB,GAO7BC,IAAA,CAAAhS,MAAA;AACI,UAAAiS,IAAA;AAAA,QAA0D,YAAA,MAAA;AAElD,UAAAJ,EAAA7R,CAAA,GACAxD,EAAA,QAGID,EAAA,QAAAyD,IAFA1D,EAAA,gBAAA0D,CAAA;AAAA,QAGJ;AAAA,QACJ,YAAA,MAAA;AAEI,UAAA8R,EAAA9R,CAAA,GACAxD,EAAA,QAGID,EAAA,QAAA,OAFAD,EAAA,gBAAA,IAAA;AAAA,QAGJ;AAAA,QACJ,OAAA,MAAA;AAEI,UAAAuV,EAAA7R,CAAA,GACA6Q,EAAA7Q,CAAA,KACIiO,GAAAvH,EAAA,MAAA1G,EAAA,KAAA,CAAA;AAAA,QACJ;AAAA,QACJ,UAAA,CAAAsK,MAAA;;AAEI,WAAA7J,KAAA+P,EAAA,UAAA,QAAA/P,GAAA,SAAA6J,KAAA,gBAAAA,EAAA,kBACIwH,EAAA9R,CAAA;AAAA,QACJ;AAAA,MACJ;AAEJ,aAAA6Q,EAAA7Q,CAAA,MACIiS,IAAA;AAAA,QAAS,GAAAA;AAAA,QACF,GAAAZ,EAAA,MAAArR,CAAA;AAAA,MACoC,IAG/CiS;AAAA,IAAO,GAGXpL,IAAA,CAAA7G,MAAAA,EAAA,mBAAAA,EAAA,YAAAuQ,EAAA,gBAEA2B,IAAA,CAAA9R,GAAA/C,MAAA;;AACI,QAAAoD,IAAAiG,EAAA,UAAA,gBAAAjG,EAAApD,QAAA,WACIqJ,EAAA,QAAA,EAAA,GAAAA,EAAA,OAAA,CAAArJ,CAAA,GAAA,KAAA,IAEJ+C,MAAA,SACIsG,EAAA,MAAArJ,CAAA,IAAA+C;AAAA,IACJ,GAGJqR,IAAAU;AAAA,MAA+CnC;AAAA,MAC3C5S,EAAA,MAAA,EAAA;AAAA,IACoB,GAGxBgV,KAAAD,GAAAlC,IAAAvV,EAAA,EAAA,CAAA,GAIA2X,IAAAjV,EAAA,MAAA;;AACI,YAAAkV,IAAA;AAAA,QAAkC,qCAAA/B,EAAA;AAAA,MACa;AAE/C,cAAA9P,IAAApE,EAAA,MAAA,CAAA,MAAA,QAAAoE,EAAA,UAAA,CAAAgR,EAAA,QAAA;AAAA,QACM,GAAAa;AAAA,QACO,+BAAA;AAAA,QAC4B,yCAAA/B,EAAA;AAAA,QACgB,6CAAAA,EAAA;AAAA,MACI,IAAA;AAAA,QAEvD,GAAA+B;AAAA,QACO,iCAAA;AAAA,MAC8B;AAAA,IACrC,CAAA,GAEVC,IAAAnV,EAAA,OAAA;AAAA,MAAuD,2CAAAmT,EAAA;AAAA,IACF,EAAA,GAGrDiC,IAAA,CAAAC,GAAAC,MAAAD,KAAAC,MAAA,IAAAC,GAAA,eAAAA,GAAA,YAKAC,IAAA,CAAA5S,GAAA6S,MAAA;;AAAA;AAAA,QAAgF,+CAAA7S,EAAA,UAAAuQ,EAAA,uBAAA;AAAA,QAE1B,8DAAAvQ,EAAA,UAAAuQ,EAAA,uBAAA,0BAAAA,EAAA,uBAAA;AAAA,QAGjB,+DAAAvQ,EAAA,UAAAuQ,EAAA,uBAAA,0BAAAA,EAAA,uBAAA;AAAA,QAGA,0DAAAA,EAAA,mBAAAsC,MAAAxW,EAAA,MAAA,SAAA;AAAA,QAEmC,yCAAA2D,EAAA;AAAA,QACpB,qDAAAS,IAAAT,KAAA,gBAAAA,EAAA,YAAA,gBAAAS,EAAA,UAAA;AAAA,QAC6B,sDAAAC,KAAAV,KAAA,gBAAAA,EAAA,YAAA,gBAAAU,GAAA,WAAA;AAAA,QACE,wCAAAV,KAAA,gBAAAA,EAAA;AAAA,QAC/B,uCAAAA,KAAA,gBAAAA,EAAA;AAAA,QACD,gDAAAA,KAAA,gBAAAA,EAAA,aAAAY,KAAAD,KAAA4P,EAAA,oBAAA,gBAAA5P,GAAA,aAAA,gBAAAC,EAAA;AAAA,QACmD,4DAAAZ,KAAA,gBAAAA,EAAA,aAAA8S,KAAAjS,IAAA0P,EAAA,oBAAA,gBAAA1P,EAAA,WAAA,gBAAAiS,EAAA,YAAAC,KAAAxC,EAAA,oBAAA,gBAAAwC,GAAA;AAAA,QAEb,6DAAA/S,KAAA,gBAAAA,EAAA,aAAAgT,MAAAC,KAAA1C,EAAA,oBAAA,gBAAA0C,GAAA,WAAA,gBAAAD,GAAA,UAAA,GAAAE,IAAA3C,EAAA,oBAAA,QAAA2C,EAAA;AAAA,QAEC,6DAAAlT,EAAA,YAAAA,EAAA,mBAAAuQ,EAAA,kBAAAA,EAAA;AAAA,QAEP,wCAAAkB,EAAA;AAAA,MACtB;AAAA,OAG7D0B,IAAA,CAAAnT,OAAA;AAAA,MAA2E,2DAAAA,KAAA,gBAAAA,EAAA;AAAA,IACJ,IAGvEoT,IAAA,CAAApT,OAAA;AAAA,MAAkE,gDAAAA,KAAA,gBAAAA,EAAA;AAAA,IACN,IAG5DqT,KAAA,CAAArT,OAAA;AAAA,MAAoE,kEAAAuQ,EAAA;AAAA,MACQ,8DAAAA,EAAA,uBAAA,2BAAAvQ,EAAA,SAAAuQ,EAAA,uBAAA;AAAA,IAGvC,IAGrC+C,KAAAlW,EAAA,OAAA;AAAA,MAAuD,iDAAAmT,EAAA;AAAA,IACI,EAAA,GAG3DgD,KAAA,CAAAvT,OAAA;AAAA,MAA+D,sCAAA0Q,EAAA,UAAA1Q,EAAA,SAAAoS,GAAA;AAAA,IACsC;AAIrG,WAAAoB,EAAA;AAAA,MAAa,kBAAA9M;AAAA,IACT,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzpBI,IAAA+M,KAAA,kBAAAC,OACRA,EAAA,mBAAA,oBACAA,EAAA,iBAAA,kBACAA,EAAA,oBAAA,qBAHQA,IAAAD,MAAA,CAAA,CAAA;ACIZ,IAAAE,KAAA;AAEA,MAAAC,KAAA;AAAA,EACA,eAAA;AACA,SAAA,OAAAD,GAAA,SAAA,GACAA,MAAA;AAAA,EACA;AACA;;;;;;;;;;;;;;;;;GCkBAE,KAAAC,GAAA;AAAA,EAAA,MAAA,EAAA,UAAAC,GAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,IACA,iBAAArC;AAAA,IACA,aAAAsC;AAAA,EACA;AAAA,EACA,OAAA;AAAA;AAAA;AAAA;AAAA,IACA,kCAAA;AAAA,MAIA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,IACA,QAAA;AAAA,MAIA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA,EACA;AAAA,EACA,OAAA,CAAA,kBAAA,gBAAA;AAAA,EACA,MAAAzD,GAAA,EAAA,MAAAjU,EAAA,GAAA;AAEA,UAAA,EAAA,GAAA+T,EAAA,IAAAC,GAAA,GACA2D,IAAAvZ,EAAA,EAAA,GACAwZ,IAAA9W,EAAA,MAAA;;AAAA,cAAAqD,IAAA8P,EAAA,WAAA,gBAAA9P,EAAA;AAAA,KAAA,GACA0T,IAAA/W,EAAA,MAAA;;AAAA,eAAAqD,IAAA8P,EAAA,WAAA,gBAAA9P,EAAA,aAAA;AAAA,KAAA,GACAgR,IAAAU;AAAA,MAAAnC;AAAA,MACA5S,EAAA,MAAA,EAAA;AAAA,IACA,GAGAgX,IAAA,MAAA;AACA,MAAA9X,EAAA,kBAAA,EAAA,GAAAiU,EAAA,QAAA,SAAA,CAAA4D,EAAA,MAAA,CAAA;AAAA,IAAA,GAGAE,IAAA,MAAA;AACA,MAAA/X,EAAA,kBAAA,EAAA,GAAAiU,EAAA,QAAA,QAAA,CAAA2D,EAAA,MAAA,CAAA;AAAA,IAAA,GAGAI,IAAA,MAAA;AACA,MAAAJ,EAAA,UACAD,EAAA,QAAA;AAAA,IACA,GAGAM,IAAA,MAAA;AACA,MAAAL,EAAA,UACAD,EAAA,QAAA;AAAA,IACA,GAGAO,IAAApX,EAAA,OAAA;AAAA,MAAA,+DAAA8W,EAAA;AAAA,IACA,EAAA;AAGA,WAAA;AAAA;AAAA,MAAA,yBAAAD;AAAA,MAEA,gBAAAC;AAAA,MACA,8BAAAM;AAAA,MACA,iBAAAL;AAAA,MACA,kBAAA1C;AAAA;AAAA,MACA,wBAAA2C;AAAA,MAGA,gBAAAE;AAAA,MACA,gBAAAC;AAAA,MACA,oBAAAF;AAAA;AAAA,MACA,GAAAhE;AAAA,IAGA;AAAA,EACA;AAEA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GCwCAoE,KAAAX,GAAA;AAAA,EAAA,MAAA,EAAA,UAAAY,GAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,sCAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,aAAAlB;AAAA,IACA,iBAAAmB;AAAA,EACA;AAAA,EACA,YAAA,EAAA,4BAAAC,GAAA;AAAA,EACA,OAAA;AAAA;AAAA;AAAA;AAAA,IACA,SAAA;AAAA,MAIA,MAAA;AAAA,MACA,UAAA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,IACA,WAAA;AAAA,MAKA,MAAA;AAAA,MACA,SAAA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,IACA,WAAA;AAAA,MAKA,MAAA;AAAA,MACA,SAAA;AAAA,IACA;AAAA,EACA;AAAA,EACA,OAAA;AAAA,IACA3B,GAAA;AAAA,IACAA,GAAA;AAAA,IACAA,GAAA;AAAA,EACA;AAAA,EACA,MAAAlD,GAAA,EAAA,MAAAjU,EAAA,GAAA;AAEA,UAAA,EAAA,GAAA+T,EAAA,IAAAC,GAAA,GACA+E,IAAA3a,EAAA,IAAA,GACA4a,IAAAC,GAAA,mCAAA,GACAC,IAAA9a,EAAA,IAAA,GACA+a,IAAA/a,EAAA,EAAA,GACAgb,IAAAhb,EAAA,EAAA,GACAib,IAAAjb,EAAA,IAAA,GACAkb,IAAAlb,EAAA,EAAA,GACAiP,IAAAkM,GAAAtF,GAAA,SAAA,GACAuF,IAAApb,EAAA,EAAA,GAGAqb,IAAAC,GAAAJ,GAAAjM,CAAA,GACAsM,IAAA,MAAA;AACA,MAAAL,EAAA,QAAA;AAAA,IAAA,GAEAM,IAAA9Y;AAAA,MAAA,MAAA,CAAAmT,EAAA,QAAA,KAAA,CAAA3T,MAAAA,EAAA,YAAA,MAAA,CAAAA,EAAA,SAAA;AAAA,IACA,GAEAuZ,IAAA,MAAA;AACA,MAAAF,EAAA,GACAH,EAAA,QAAA,CAAAA,EAAA,OACAA,EAAA,QACA3a,GAAA,MAAA;;AAAA,gBAAAsF,IAAA+U,EAAA,MAAA,MAAA,oBAAA,gBAAA/U,EAAA;AAAA,OAAA,IAEAtF,GAAA,MAAA;;AAAA,gBAAAuF,KAAAD,IAAAkV,KAAA,gBAAAA,EAAA,UAAA,gBAAAlV,EAAA,QAAA,gBAAAC,EAAA;AAAA,OAAA,GAEAgV,EAAA,QAAAQ,EAAA;AAAA,IAAA,GAIAE,IAAA,CAAApW,MAAAA,EAAA,aAAA,IAEAqW,IAAA,CAAAjK,MAAA;AACA,YAAAC,IAAAkE,EAAA,QAAA,IAAA,CAAA3T,OAAA;AAAA,QAAA,GAAAA;AAAA,QACA,SAAAwP,EAAA,UAAAxP,EAAA,QAAAwP,EAAA,UAAAxP,EAAA;AAAA,MACA,EAAA;AAGA,MAAAN,EAAAmX,GAAA,gBAAApH,CAAA;AAAA,IAAA,GAGAiK,IAAA,CAAAC,MAAA;AACA,MAAAA,IAEAja;AAAA,QAAAmX,GAAA;AAAA,QACAlD,EAAA,QAAA,IAAA,CAAA3T,OAAA,EAAA,GAAAA,GAAA,SAAA,GAAA,EAAA;AAAA,MACA,IAIAN;AAAA,QAAAmX,GAAA;AAAA,QACAlD,EAAA,QAAA,IAAA,CAAA3T,OAAA,EAAA,GAAAA,GAAA,UAAAA,KAAA,gBAAAA,EAAA,eAAA,GAAA,EAAA;AAAA,MACA;AAAA,IAEA,GAKA4Z,IAAA,CAAApK,MAAA;AACA,YAAAC,IAAAkE,EAAA,QAAA,IAAA,CAAA3T,OAAA;AAAA,QAAA,GAAAA;AAAA,QACA,QAAAwP,EAAA,UAAAxP,EAAA,QAAA,CAAA,EAAAwP,KAAA,QAAAA,EAAA,UAAA,CAAA,EAAAxP,KAAA,QAAAA,EAAA;AAAA,MACA,EAAA;AAGA,MAAAN,EAAAmX,GAAA,gBAAApH,CAAA;AAAA,IAAA,GAIAoK,IAAA,CAAAC,MAAA;AACA,MAAAjB,EAAA,QAAAiB,GACAhB,EAAA,QAAAQ,EAAA;AAAA,IAAA;AAUA,WAAA;AAAA;AAAA,MAAA,yBAAAb;AAAA,MAEA,WAAAC;AAAA,MACA,2BAAAG;AAAA,MACA,gCAAAC;AAAA,MACA,iCAAAK;AAAA,MACA,YAAAH;AAAA,MACA,+BAAAE;AAAA,MACA,cAAAN;AAAA,MACA,iBAAAG;AAAA,MACA,oCAAAnX;AAAA;AAAA,MACA,kCAAAiY;AAAA,MAGA,qBApBA,CAAA1K,MAAAzP,EAAAmX,GAAA,kBAAA1H,CAAA;AAAA,MAqBA,2BAAAuK;AAAA,MACA,aAAAL;AAAA,MACA,oBAAAE;AAAA,MACA,oBAAAE;AAAA,MACA,mBAAAG;AAAA,MACA,gBA5BA,MAAAC,EAAA,EAAA;AAAA,MA6BA,kCAAAL;AAAA,MACA,qBAzBA,CAAAnK,MAAA3P,EAAAmX,GAAA,mBAAAxH,CAAA;AAAA;AAAA,MA0BA,GAAAoE;AAAA,IAGA;AAAA,EACA;AAEA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GCzQIsG,KAAA;AAAA,EAAe,MAAA,EAAA,UAAAC,GAAA;AAEf;;;;;;;;AAVA,UAAA,EAAA,EAAA,IAAAtG,GAAA;;;;;;;;;;;;;;;;;;AC1BJ,IAAAuG,KAAA;AAEA,MAAAC,KAAA;AAAA,EACA,eAAA;AACA,SAAA,OAAAD,GAAA,SAAA,GACAA,MAAA;AAAA,EACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GCmXIE,KAAA;AAAA,EAAe,MAAA,EAAA,UAAAC,GAAA;AAAA,EACM,MAAA;AAErB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA3RA,EAAA,GAAA3G,EAAA,IAAAC,GAAA,GA+EA8B,IAAAD,GAAAlC,IAAAvV,EAAA,EAAA,CAAA,GAGAuc,IAAA,CAAAC,MAAA;AAEI,UAAA,UAAAA,KAAAA,EAAA,SAAA;AACI,eAAAA,EAAA;AAGJ,cAAAA,EAAA,SAAA;AAAA,QAAmD,KAAA;AAE3C,iBAAA7G,EAAA,MAAA;AAAA,QAAe,KAAA;AAEf,iBAAAA,EAAA,MAAA;AAAA,QAAe,KAAA;AAEf,iBAAAA,EAAA,MAAA;AAAA,QAAe,KAAA;AAEf,iBAAAA,EAAA,MAAA;AAAA,QAAe;AAEf,iBAAA6G,EAAA;AAAA,MAAyC;AAAA,IACjD,GAGJC,IAAA,CAAAD,MAAA;AACI,cAAAA,EAAA,SAAA;AAAA,QAAwB,KAAA;AAEhB,iBAAAE;AAAA,QAAO,KAAA;AAEP,iBAAAC;AAAA,QAAO,KAAA;AAEP,iBAAAC;AAAA,QAAO;AAEP;AAAA,MAAO;AAAA,IACf,GAGJC,IAAAna,EAAA,MAAAmT,EAAA,cAAA,MAAA,GACAiH,IAAApa,EAAA,OAAA;AAAA,MAAwE,gFAAAma,EAAA,SAAAhH,EAAA;AAAA,MAEpC,wDAAAA,EAAA;AAAA,MAC8B,8DAAAA,EAAA;AAAA,MACM,2DAAAA,EAAA;AAAA,IACH,EAAA,GAErEkH,IAAAra,EAAA,OAAA;AAAA,MAAsD,uDAAAma,EAAA;AAAA,MACkB,4CAAAhH,EAAA;AAAA,MAClB,kDAAAA,EAAA;AAAA,MACM,+CAAAA,EAAA;AAAA,IACH,EAAA,GAEzDmH,IAAAta,EAAA,MAAA,CAAAma,EAAA,SAAAA,EAAA,SAAAhH,EAAA,gBAAA;AAMA,aAAAoH,EAAAC,GAAA;AAGI,aAAA,OAAAA,KAAA;AAAA,IAA8B;AAElC,UAAAC,IAAAza,EAAA,MAAA;;AACI,YAAAwa,IAAAD,EAAApH,EAAA,WAAA,KAAA9P,IAAA8P,EAAA,gBAAA,gBAAA9P,EAAA,KAAA8P,GAAAA,EAAA,aAAAA,EAAA,aAAAA,EAAA;AAIA,UAAA6B,EAAA,SAAA,CAAAmF,EAAA,SAAAK,GAAA;AACI,cAAAE,IAAA,CAAA;AAEA,eAAAF,EAAA,QAAA,CAAAV,MAAA;AACI,UAAAA,EAAA,WACIA,EAAA,SAAA,QAAA,CAAAa,MAAA;AACI,YAAAD,EAAA,KAAAC,CAAA;AAAA,UAAmC,CAAA,IAGvCD,EAAA,KAAA;AAAA,YAAwB,MAAAb,EAAAC,CAAA;AAAA,YACQ,OAAAA,EAAA;AAAA,YACd,UAAAA,EAAA;AAAA,YACG,UAAAA,EAAA;AAAA,YACA,MAAAC,EAAAD,CAAA;AAAA,UACW,CAAA;AAAA,QAEpC,CAAA,GAGJ;AAAA,UAAO;AAAA,YACH,SAAA;AAAA,YACa,SAAA;AAAA,YACA,UAAAc;AAAA,YACC,UAAAC,EAAAH,CAAA;AAAA,UACsC;AAAA,QACpD;AAAA,MACJ;AAIJ,aAAA,CAAA1F,EAAA,UAAAwF,KAAA,gBAAAA,EAAA,UAAA,KACIM;AAAA,QAAA;AAAA,MACI,GAIRN,KAAA,gBAAAA,EAAA,MAAA,GAAA;AAAA,IAA8B,CAAA,GAGlCO,IAAA/a,EAAA,MAAA,CAAAgb,GAAAC,MAAA;AACI,UAAA,GAAAA,KAAAD,EAAA,WAAAC,KAAA,CAAAD,EAAA;AAIA,gBAAAA,EAAA,SAAA;AAAA,UAAwB,KAAA;AAEhB,mBAAA/H,EAAA,MAAA;AAAA,UAAe,KAAA;AAEf,mBAAAA,EAAA,MAAA;AAAA,UAAe,KAAA;AAEf,mBAAAA,EAAA,MAAA;AAAA,UAAe,KAAA;AAEf,mBAAAA,EAAA,MAAA;AAAA,UAAe;AAEf,mBAAA+H,EAAA;AAAA,QAAc;AAAA,IACtB,CAAA,GAGJE,IAAA,CAAAF,OAAAA,KAAA,gBAAAA,EAAA,WAAA,SAAA;AAAA,MAEU,OAAA,CAAAxa,MAAA;AAEQ,QAAAA,EAAA,gBAAA,GACAwa,EAAA,MAAA7H,EAAA,aAAAA,EAAA,SAAA;AAAA,MAA+C;AAAA,IACnD,IAAA,CAAA,GAIdgI,IAAA,CAAAC,OAAA;AAAA,MAA4F,GAAAA;AAAA,MACrF,SAAA,MAAA;AAEC,QAAAA,KAAA,QAAAA,EAAA,WAAA,OAAAA,EAAA,WAAA,eACIA,KAAA,QAAAA,EAAA,YAEJA,KAAA,QAAAA,EAAA,SAAA,OAAAA,EAAA,SAAA,eACIA,KAAA,QAAAA,EAAA,MAAAjI,EAAA,aAAAA,EAAA;AAAA,MACJ;AAAA,IACJ,IAGJ0H,IAAA,CAAAQ,MAAAA,EAAA,IAAA,CAAAD,MAAA;AAEQ,YAAAE,IAAAF;AACA,aAAAE,KAAA,QAAAA,EAAA,UACIA,EAAA,QAAAT,EAAAS,EAAA,KAAA,IAEJ,EAAA,GAAAH,EAAAG,CAAA,EAAA;AAAA,IAAoD,CAAA;wZAG5D,CAAAN,MAAA;;AAAA,cAAAA,KAAA,gBAAAA,EAAA,iBAAA,SAAAA,EAAA,YAAA7H,EAAA,aAAAA,EAAA,SAAA,IAAAA,EAAA,aAAA7P,KAAAD,IAAA8P,EAAA,gBAAA,gBAAA9P,EAAA8P,EAAA,eAAA,gBAAA7P,EAAA,aAAA;AAAA,+BAOA,CAAA0X,MAAAA,EAAA,aAAAA,KAAA,gBAAAA,EAAA,aAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxVQ,IAAAO,IAAA,kBAAAC,OACRA,EAAA,kDAAA,mDACAA,EAAA,oCAAA,qCACAA,EAAA,+BAAA,gCACAA,EAAA,iBAAA,kBACAA,EAAA,gCAAA,iCACAA,EAAA,iCAAA,kCACAA,EAAA,YAAA,aACAA,EAAA,SAAA,UACAA,EAAA,uBAAA,yBACAA,EAAA,mCAAA,kCACAA,EAAA,oCAAA,mCACAA,EAAA,0BAAA,2BACAA,EAAA,yBAAA,iCACAA,EAAA,UAAA,WACAA,EAAA,oBAAA,qBACAA,EAAA,qBAAA,sBACAA,EAAA,sBAAA,uBACAA,EAAA,eAAA,gBAlBQA,IAAAD,KAAA,CAAA,CAAA;ACML,MAAAE,KAAA,MAAA;AACH,QAAAC,IAAA,SAAA;AAEA,SAAAA,IAKAA,EAAA,QAAA,gBAAA,KAAAA,EAAA,QAAA,gBAAA,IAJI;AAKR;;;;;;GCgiBIC,KAAA;AAAA,EAAe,MAAA,EAAA,UAAAC,GAAA;AAAA,EACM,MAAA;AAErB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBApaAC,IAAAC,GAAA,GACAC,IAAAC,GAAAH,CAAA,GAGA,EAAA,GAAA5I,EAAA,IAAAC,GAAA,GAuKA+I,IAAA3e,EAAA,IAAA,GACA4e,IAAA5e,EAAA,IAAA,GACA6e,IAAA7e,EAAA,EAAA,GACA8e,IAAA9e,EAAA,CAAA,CAAA,GACA+e,IAAA/e,EAAA,EAAA,GACAgf,IAAAhf,EAAA,GACAif,IAAAjf,EAAA,EAAA,GAGAkf,IAAAxc,EAAA,MAAA;;AAAA,cAAA,GAAAqD,IAAA8P,EAAA,YAAA,QAAA9P,EAAA8P,EAAA,OAAA;AAAA,KAAA,GACAsJ,IAAAzc;AAAA,MAAsC,MAAA;;AAAA,eAAAmT,EAAA,OAAA,UAAA/R,QAAAiC,IAAA8P,EAAA,yBAAA,gBAAA9P,EAAA,UAAA,IAAA8P,EAAA,qBAAA,KAAA,GAAA,IAAA;AAAA;AAAA,IAG5B,GAEVuJ,IAAA1c;AAAA,MAAmB,MAAAmT,EAAA,OAAA,UAAA/R,MAAA,CAAA+R,EAAA,cAAA,CAAAA,EAAA;AAAA,IACgF,GAEnGwJ,IAAA3c,EAAA,MACI,CAAA0c,EAAA,UAEI7R,EAAAsI,EAAA,UAAAA,EAAA,UAAAA,EAAA,cAAA,MAAA,KAAA,CAAAoJ,EAAA,SAKAF,EAAA,SACI,OAKRlJ,EAAA,OAAA,UAAA/R,IACI,KAIG,GAIXwb,IAAA,CAAAha,GAAAia,OAAAja,KAAA,gBAAAA,EAAA,cAAAxE,GAAA,WAAA,GAAAye,CAAA,KAAA,QAEAC,IAAA,CAAAhV,MAAAA,KAAA,KAGAiV,IAAA,CAAAC,MAAA7J,EAAA,WAAA,MAAA,GAAA6J,CAAA,EAAA,OAAA,CAAAC,GAAA,EAAA,WAAAzO,EAAA,MAAAyO,IAAAzO,EAAA,QAAA,CAAA,GAIA0O,IAAA,CAAAC,GAAAC,MAAAD,IAAAJ,EAAAK,CAAA,GACAvS,IAAA,CAAAX,GAAAiT,GAAAC,MAAAL,EAAA,IAAA7S,IAAAgT,EAAAC,GAAAC,CAAA,GAQAC,IAAA,CAAAC,MAAA;;AACI,OAAAA,MAAA,QAAA,CAAArB,EAAA,MAAA,SAAAqB,CAAA,KAAA,GAAAja,IAAA+Y,EAAA,UAAA,QAAA/Y,EAAA,IAAA,CAAAka,MAAAA,EAAA,OAAA,KAAA,CAAAC,MAAAA,MAAAF,MAAAE,KAAA,gBAAAA,EAAA,SAAAF,WAOInB,EAAA,QAAA;AAAA,IACJ,GAQJsB,IAAA,MAAA;AACI,MAAAtB,EAAA,QAAA;AAAA,IAA8B,GAIlCuB,IAAApgB,EAAA,EAAA,GACAqgB,IAAA,CAAA/a,MAAA;AACI,YAAAgb,IAAA;AAAA,QAA0C,GAAAzK,EAAA,yBAAAvQ,CAAA;AAAA;AAAA,QACE,OAAA,YAAA;AAGpC,cAAA,CAAA6Y,GAAA;AACI;AAGJ,UAAAY,EAAA,QAAA,IACAE,EAAA,QAAA,IACApL,GAAAmL,EAAA,KAAA,GACA,MAAAve,GAAA,GACA8S,GAAAoL,EAAA,KAAA,MAEIyB,EAAA,QAAA;AAAA,QACJ;AAAA,QACJ,UAAA,MAAA;AAEI,UAAAjC,GAAA,MAGAiC,EAAA,QAAA;AAAA,QAAsC;AAAA,QAC1C,SAAA,CAAAld,MAAA;AAEI,UAAAA,EAAA,QAAA0I,GAAA,QACIwU,EAAA,QAAA,IACArB,EAAA,QAAA,IACApL,GAAAgL,EAAA,KAAA;AAAA,QACJ;AAAA,MACJ,GAGJ4B,IAAA,EAAA,GAAAD,EAAA;AAEA,aAAAhb,EAAA,WACIib,EAAA,QAAA,CAAArd,MAAAtB,EAAA,+BAAAsB,CAAA,GACAqd,EAAA,UAAA,CAAArd,MAAA;AACI,QAAAod,EAAA,QAAApd,CAAA,GACAtB,EAAA,+BAAAsB,CAAA;AAAA,MAAyC,IAGjDoC,EAAA,gBACIib,EAAA,aAAA,MAAA;AACI,QAAA1B,EAAA,QAAA;AAAA,MAA8B,GAElC0B,EAAA,aAAA,CAAA3Q,MAAA;AACI,QAAAmQ,EAAAnQ,KAAA,gBAAAA,EAAA,aAAA;AAAA,MAAmC,GAEvC2Q,EAAA,QAAA,OAAA3Q,MAAA;AACI,QAAA0Q,EAAA,MAAA1Q,CAAA,GAEA,MAAAnP,GAAA,GACAoe,EAAA,QAAA;AAAA,MAA8B,GAElC0B,EAAA,WAAA,CAAA3Q,MAAA;AACI,QAAA0Q,EAAA,SAAA1Q,CAAA,GACAmQ,EAAAnQ,KAAA,gBAAAA,EAAA,aAAA;AAAA,MAAmC,IAG3C2Q;AAAA,IAAO;AAGX,IAAA/f,GAAA,MAAA;AACI,MAAAwe,EAAA,QAAArL,GAAAgL,EAAA,KAAA;AAAA,IAA8E,CAAA;AAGlF,UAAA6B,IAAA,MAAA;AACI,MAAA5e,EAAA,wBAAA;AAAA,IAA6B;AAIjC,IAAAjB;AAAA,MAAA,MAAAke,EAAA;AAAA,MACgC,MAAA;AAExB,QAAAA,EAAA,UAAA,KACIjd,EAAA,gBAAAiU,EAAA,QAAA,IAEAjU,EAAA,gBAAA,EAAA;AAAA,MACJ;AAAA,IACJ;AAGJ,UAAA6e,IAAA,CAAAC,MAAA;AACI,MAAA5B,EAAA,MAAA,KAAA4B,CAAA;AAAA,IAA6D,GAGjEC,IAAA,CAAA/Q,MAAA;AACI,MAAA+O,EAAA,MAAA,SAAA/O,KAAA,gBAAAA,EAAA,aAAA,MACIiP,EAAA,QAAA;AAAA,IACJ;AAGJ,IAAA+B,GAAAC,IAAA;AAAA,MAGkD,8BAAAJ;AAAA,MAC9C,gBAAAE;AAAA,IACA,CAAA;AAGJ,UAAAG,IAAArJ,GAAApC,IAAArV,EAAA,EAAA,CAAA,GAEA+W,IAAAU;AAAA,MAA+CnC;AAAA,MAC3C5S,EAAA,MAAA,EAAA;AAAA,IACoB,GAGxBgV,KAAAD,GAAAlC,IAAAvV,EAAA,EAAA,CAAA,GAGA+gB,IAAA,CAAAzb,MAAA;;AAAA;AAAA,QAA4D,CAAA,qBAAA2Y,EAAA,cAAA,EAAA,IAAA3Y,KAAA,gBAAAA,EAAA,WAAAuQ,EAAA,uBAAA;AAAA,QAEL,CAAA,qBAAAoI,EAAA,6BAAA,EAAA,IAAA3Y,KAAA,gBAAAA,EAAA,WAAAuQ,EAAA,uBAAA,0BAAAA,EAAA,uBAAA;AAAA,QAGlB,CAAA,qBAAAoI,EAAA,8BAAA,EAAA,IAAA3Y,KAAA,gBAAAA,EAAA,WAAAuQ,EAAA,uBAAA,0BAAAA,EAAA,uBAAA;AAAA,QAGA,CAAA,qBAAAoI,EAAA,kBAAA,EAAA,KAAAlY,IAAAT,KAAA,gBAAAA,EAAA,YAAA,gBAAAS,EAAA,UAAA;AAAA,QAC4D,CAAA,qBAAAkY,EAAA,mBAAA,EAAA,KAAAjY,IAAAV,KAAA,gBAAAA,EAAA,YAAA,gBAAAU,EAAA,WAAA;AAAA,QACE,CAAA,qBAAAiY,EAAA,OAAA,EAAA,GAAA3Y,KAAA,gBAAAA,EAAA;AAAA,QAC/B,CAAA,qBAAA2Y,EAAA,SAAA,EAAA,GAAApI,EAAA;AAAA,QACA,CAAA,qBAAAoI,EAAA,iBAAA,EAAA,IAAA3Y,KAAA,gBAAAA,EAAA,cAAAxE,GAAA;AAAA,QAEnB,CAAA,qBAAAmd,EAAA,oBAAA,EAAA,KAAAhY,IAAA4P,EAAA,gBAAA,aAAA,gBAAA5P,EAAA,WAAAX,EAAA;AAAA,QAEQ,CAAA,qBAAA2Y,EAAA,gCAAA,EAAA,KAAA/X,KAAA2P,EAAA,gBAAA,WAAA,gBAAA3P,GAAA,WAAAZ,EAAA,WAAAa,KAAA0P,EAAA,oBAAA,gBAAA1P,GAAA;AAAA,QAE8B,CAAA,qBAAA8X,EAAA,iCAAA,EAAA,KAAA7F,KAAAvC,EAAA,gBAAA,WAAA,gBAAAuC,GAAA,WAAA9S,EAAA,SAAA,GAAA+S,IAAAxC,EAAA,oBAAA,QAAAwC,EAAA;AAAA,QAEC,CAAA,qBAAA4F,EAAA,MAAA,EAAA,GAAA3Y,KAAA,gBAAAA,EAAA;AAAA,QACrB,CAAA,qBAAA2Y,EAAA,sBAAA,EAAA,GAAApI,EAAA;AAAA,QACc,CAAA,qBAAAoI,EAAA,iCAAA,EAAA,GAAApI,EAAA,iBAAA,CAAAA,EAAA,cAAAvQ,EAAA,UAAAxB;AAAA,QAEZ,CAAA,qBAAAma,EAAA,+CAAA,EAAA,GAAApI,EAAA,iBAAAA,EAAA,cAAAvQ,EAAA,UAAAxB;AAAA,QAED,CAAA,qBAAAma,EAAA,4BAAA,EAAA,GAAA3Y,EAAA,UAAAxB,MAAA+R,EAAA;AAAA,QAEC,CAAA,qBAAAoI,EAAA,YAAA,EAAA,GAAA6C,EAAA;AAAA,QACW,qCAAA/J,EAAA;AAAA,MACtB;AAAA,OAE1DiK,IAAAte,EAAA,OAAA;AAAA,MAAmD,4EAAA0d,EAAA;AAAA,IAC2D,EAAA;AAI9G,WAAAtH,EAAA;AAAA,MAAa,aAAA6F;AAAA,IACT,CAAA;;;;;;;;;;;;;;;;;;;;;;;uBCqRJsC,KAAA;AAAA,EAAe,MAAA;AAEf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAtmBA1C,IAAAC,GAAA,GACAC,IAAAC,GAAAH,CAAA,GA+OAxS,IAAA/L,EAAA,CAAA,CAAA,GACAkhB,IAAAlhB,EAAA,EAAA,GACAmhB,IAAAnhB,EAAA,GACAohB,IAAAphB,EAAA,GACAqhB,IAAAxG,GAAA,qBAAA,GACAyG,IAAAthB,EAAA,EAAA,GACAgf,IAAAhf,EAAA;AAEA,IAAAQ,GAAA,MAAA;AACI,MAAA4gB,EAAA,UACIpC,EAAA,QAAArL,GAAAyN,EAAA,KAAA;AAAA,IACJ,CAAA;AAGJ,UAAAG,IAAA7e,EAAA,MAAAmT,EAAA,qBAAAA,EAAA,OAAA,CAAA,GACA2L,IAAA9e;AAAA,MAAmC,MAAA;;AAAA,gBAAAmT,EAAA,eAAAA,EAAA,iBAAA0L,EAAA,WAAAvb,KAAAD,IAAA8P,EAAA,YAAA,gBAAA9P,EAAA,aAAA,gBAAAC,EAAA,UAAA;AAAA;AAAA,IAKO,GAE1Cyb,IAAA/e;AAAA,MAA4B,MAAA;;AAAA,gBAAAmT,EAAA,eAAAA,EAAA,iBAAA0L,EAAA,YAAAxb,IAAA8P,EAAA,YAAA,gBAAA9P,EAAA,cAAA,YAAAC,IAAA6P,KAAA,gBAAAA,EAAA,YAAA,gBAAA7P,EAAA,SAAA,YAAA;AAAA;AAAA,IAK0D,GAEtF0b,IAAAhf;AAAA,MAAsC,MAAAmT,EAAA,oBAAAA,EAAA,wBAAAA,EAAA,OAAA,KAAAA,EAAA,iBAAA0L,EAAA,SAAA,CAAA1L,EAAA;AAAA,IAG4C,GAElF8L,IAAAjf,EAAA,MAAA;AACI,UAAAmT,EAAA,oBAAAA,EAAA,eAAA;AACI,cAAA+L,IAAAV,EAAA,MAAA,SAAA;AACA,eAAA;AAAA,UAAO,iBAAAQ,EAAA,QAAAE,IAAA;AAAA,UACwF,cAAA/L,EAAA,cAAA,MAAA;AAAA,UACnD,iBAAAA,EAAA,WAAA;AAAA,UACN,gBAAAA,EAAA;AAAA,QACZ;AAAA,MAC1B;AAEJ,aAAA,EAAA,iBAAAA,EAAA,WAAA,EAAA;AAAA,IAA6C,CAAA,GAEjDgM,IAAAnf,EAAA,MAAA;AACI,UAAA+e,EAAA;AACI,eAAA;AAAA,UAAO,aAAA;AAAA,UACU,aAAA;AAAA,QACA;AAGrB,UAAA,EAAAD,EAAA,SAAA,CAAA3L,EAAA,oBAAA,CAAAA,EAAA,wBAAAA,EAAA,OAAA;AAOA,eAAA;AAAA,UAAO,cAAAA,EAAA,cAAA,MAAA;AAAA,UACqC,iBAAA;AAAA,UACvB,gBAAA;AAAA,UACD,IAAAwL;AAAA,UACZ,MAAA;AAAA,UACE,UAAA;AAAA,QACI;AAAA,IACd,CAAA,GAEJS,IAAApf,EAAA,MAAA;;AACI,aAAA8e,EAAA,SACIxb,KAAAD,IAAA8P,EAAA,YAAA,gBAAA9P,EAAA,aAAA,gBAAAC,EAAA,OAAA,CAAA/D,GAAA8f,IAAA/J,QACI/V,EAAA+V,EAAA,IAAA6C,GAAA,YAAA,GACA5Y,IAAO,CAAA,KAGf,CAAA;AAAA,IAAQ,CAAA,GAEZ+f,IAAAtf,EAAA,MAAA;;AACI,UAAAwe,EAAA,OAGA;AAAA,YAAArL,EAAA,oBAAAA,EAAA,wBAAAA,EAAA,OAAA;AACI,iBAAA,CAAAwL,CAAA;AAGJ,YAAAG,EAAA,WAAAzb,IAAA,OAAA,KAAA+b,EAAA,KAAA,MAAA,gBAAA/b,EAAA,UAAA,GAAA;AACI,gBAAAkc,IAAA,OAAA,OAAAH,EAAA,KAAA;AACA,eAAAG,KAAA,gBAAAA,EAAA,UAAA;AACI,mBAAAA;AAAA,QACJ;AAEJ,eAAA,CAAA;AAAA;AAAA,IAAQ,CAAA,GAEZC,IAAAxf,EAAA,MAAA;;AACI,YAAAyf,KAAAnc,KAAAD,IAAA8P,EAAA,YAAA,gBAAA9P,EAAA,aAAA,gBAAAC,EAAA,IAAA,CAAAoc,OAAAvM,EAAA,cAAAuM,EAAA;AACA,WAAAD,KAAA,gBAAAA,EAAA,UAAA,GAAA;AACI,cAAAE,KAAAF,EAAA,MAAA,CAAAG,OAAA;;AAAA,kBAAAvc,IAAA8P,KAAA,gBAAAA,EAAA,kBAAA,gBAAA9P,EAAA,SAAAuc;AAAA,SAAA,GACAC,KAAAJ,EAAA,KAAA,CAAAG,OAAA;;AAAA,kBAAAvc,IAAA8P,KAAA,gBAAAA,EAAA,kBAAA,gBAAA9P,EAAA,SAAAuc;AAAA,SAAA;AACA,eAAA,CAAAD,MAAAE;AAAA,MAAgC;AAEpC,aAAA;AAAA,IAAO,CAAA,GAIXC,IAAA,CAAA9c,GAAA/C,MAAA;AAEI,YAAA8f,IAAA/c;AAEA,MAAAA,MAAA,SAAA+c,KAAA,QAAAA,EAAA,iBACI1W,EAAA,MAAApJ,CAAA,IAAA8f,EAAA;AAAA,IACJ,GAEJC,IAAA,CAAAC,MACIb,EAAA,MAAAa,CAAA,GAEJC,IAAA,CAAApO,MAAA;AACI,UAAA,CAAAqB,EAAA;AACI,eAAA;AAGJ,YAAAgN,IAAAhN,EAAA,cAAArB,CAAA;AACA,aAAAqB,EAAA,cAAA,SAAAgN,CAAA,EAAA,SAAA;AAAA,IAAiD,GAarDC,IAAA,CAAA5f,MAAA;;AAEI,UAAA,CAAA2S,EAAA;AACI;AAGJ,UAAAkN,IAAA;AACA,YAAAC,IAAA,CAAA,UAAA,SAAA,GAAA;AACA,eAAA5d,KAAA,GAAAA,KAAA4d,EAAA,QAAA5d;AACI,aAAAW,KAAA7C,KAAA,gBAAAA,EAAA,WAAA,QAAA6C,GAAA,QAAAid,EAAA5d,EAAA,IAAA;AACI,UAAA2d,IAAA;AACA;AAAA,QAAA;AAIR,MAAAA,KACInhB,EAAA,aAAAiU,EAAA,SAAA3S,CAAA;AAAA,IACJ,GAGJqH,IAAA,CAAAzF,MAAA;AACI,MAAAlD,EAAA,cAAAkD,GAAA+Q,EAAA,OAAA;AAAA,IAAuC,GAG3C7K,IAAA,CAAAR,GAAA1F,MAAA;AACI,MAAAlD,EAAA,qBAAAkD,GAAA+Q,EAAA,SAAArL,CAAA;AAAA,IAAuD,GAQ3DyY,IAAA,MAAA;AACI,MAAA3B,EAAA,QAAA;AAAA,IAA4B,GAOhC4B,IAAA,MAAA;AACI,MAAA5B,EAAA,QAAA;AAAA,IAA4B,GAOhC6B,IAAA,MAAA;;AACI,MAAAtP,GAAA,EAAA9N,IAAAiZ,EAAA,UAAA,gBAAAjZ,EAAA,EAAA,CAAA,GACAwN,GAAA6N,EAAA,KAAA;AAAA,IAA2C,GAO/CgC,IAAA,MAAA;AACI,MAAAzP,GAAAyN,EAAA,KAAA;AAAA,IAAyD,GAQ7DiC,KAAA,CAAAzT,MAAA;;AACI,MAAAA,EAAA,QAAAhE,GAAA,OACI+H,GAAAyN,EAAA,KAAA,GAEJxR,EAAA,QAAAhE,GAAA,iBAAA7F,IAAAiZ,EAAA,UAAA,gBAAAjZ,EAAA,UAAA,KAAAiZ,EAAA,MAAA,CAAA,EAAA,SAAA,SAAA,iBAKIrL,GAAAyN,EAAA,KAAA,GACApC,EAAA,MAAA,CAAA,EAAA,KAAA,aAAA,YAAA,GAAA,GACAA,EAAA,MAAA,CAAA,EAAA,KAAA,MAAA,GACApP,EAAA,gBAAA,GACAA,EAAA,eAAA,KAAiBA,EAAA,QAAAhE,GAAA,gBAAA5F,IAAAgZ,EAAA,UAAA,gBAAAhZ,EAAA,UAAA,KAAAgZ,EAAA,MAAA,CAAA,EAAA,SAAA,SAAA,kBAMjBrL,GAAAyN,EAAA,KAAA,GACApC,EAAA,MAAA,CAAA,EAAA,KAAA,aAAA,YAAA,GAAA,GACAA,EAAA,MAAA,CAAA,EAAA,KAAA,MAAA,GACApP,EAAA,gBAAA,GACAA,EAAA,eAAA;AAAA,IACJ,GAIJ6P,IAAA,MAAA5J,EAAA,WAAA,OAAA,CAAA8J,GAAA,EAAA,WAAAzO,EAAA,MAAAyO,IAAAzO,EAAA,QAAA,CAAA,GAEAoS,IAAA,MAAA7D,EAAA,IAAA5J,EAAA,WAAA4J,EAAA,GAIA,EAAA,qBAAA8D,GAAA,eAAAC,EAAA,IAAAC,GAAAtC,GAAAD,CAAA,GACAwC,IAAAhhB,EAAA,MAAA;;AACI,UAAAmT,EAAA,oBAAAA,EAAA;AAOI,eAAA;AAAA,UAAO,aAAA,GALP2L,EAAA,SAAAC,EAAA,QAAA,IAAA1V,EAAA,MAAAjI,EAAA,EAAA,cAAAO,EAKO;AAAA,UACwB,eAAAwR,EAAA,oBAAAA,EAAA,kBAAA2N,EAAA,SAAA,GAAAzd,IAAAyd,KAAA,gBAAAA,EAAA,UAAA,QAAAzd,EAAA,SAAA,WAAAyd,EAAA,QAAA;AAAA,QAMjB;AAAA,IAGX,CAAA;AAEX,IAAA7iB;AAAA,MAAA,MAAAwgB,EAAA;AAAA,MAC2B,MAAA;AAEnB,YAAAwC,IAAA;AACA,QAAA,CAAAA,KAAAxC,EAAA,UACIwC,IAAA/iB,GAAAugB,EAAA,OAAA,MAAA;AACI,UAAAA,EAAA,SACIoC,EAAA;AAAA,QACJ,CAAA;AAAA,MAER;AAAA,IACJ;AAEJ,UAAAK,IAAA,MAAA;AACI,MAAA1C,EAAA,QAAA,CAAAA,EAAA,OACAqC,EAAA,GACA3hB,EAAA,0BAAAiU,EAAA,OAAA;AAAA,IAA4C;AAGhD,IAAAlV;AAAA,MAAA,MAAA;;AAAA,gBAAAoF,IAAA8P,EAAA,YAAA,gBAAA9P,EAAA;AAAA;AAAA,MACyB,CAAA8d,GAAAC,MAAA;;AAEjB,UAAA9d,MAAAD,IAAA8P,KAAA,gBAAAA,EAAA,YAAA,gBAAA9P,EAAA,aAAA,gBAAAC,GAAA,UAAA,KAAA8d,MAAA,UAAA,CAAA5C,EAAA,SACIqC,EAAA;AAAA,MACJ;AAAA,IACJ;AAGJ,UAAAxM,KAAAU;AAAA,MAA+CnC;AAAA,MAC3C5S,EAAA,MAAA,EAAA;AAAA,IACoB,GAGxBqhB,KAAA,CAAAvP,MAAAqB,EAAA,gBAAA,SAAAA,EAAA,cAAArB,CAAA,CAAA,GACAwP,KAAA,CAAAxP,MAAAqB,EAAA,cAAA,SAAAA,EAAA,cAAArB,CAAA,CAAA,GAGAyP,IAAA,CAAAzP,GAAA5H,OAAA;AAAA,MAAiF,4CAAAiJ,EAAA,mBAAArB,CAAA;AAAA,MACL,sDAAAqB,EAAA;AAAA,MACZ,+CAAAkO,GAAAvP,CAAA;AAAA,MACO,4CAAAwP,GAAAxP,CAAA;AAAA,MACN,2CAAAqB,EAAA,oBAAAjJ;AAAA,MACQ,iDAAAiJ,EAAA,kBAAA,CAAAqL,EAAA;AAAA,MAC0B,8CAAArL,EAAA;AAAA,MAC3C,yCAAAA,EAAA;AAAA,IACL,IAEnDqO,IAAA,CAAAC,GAAAC,OAAA;AAAA,MAA0F,mDAAAD,KAAA,CAAAC;AAAA,MAChB,CAAA,4CAAAljB,GAAA,oBAAA,EAAA,GAAA,CAAAkjB,KAAAD,KAAAtO,EAAA;AAAA,MAErB,6DAAA,CAAAuO,KAAAD,KAAAtO,EAAA;AAAA,MAEA,qDAAA,CAAAsO,KAAAC;AAAA,MACuB,yDAAAvO,EAAA;AAAA,IACT,IAEnEwO,IAAA3hB,EAAA,OAAA;AAAA,MAAoD,6DAAAmT,EAAA;AAAA,MACmB,8CAAA,CAAA2L,EAAA,SAAA3L,EAAA,wBAAAA,EAAA,OAAA;AAAA,IAEiB,EAAA,GAExFyO,KAAA5hB,EAAA,OAAA;AAAA,MAA8D,2EAAA4e,EAAA;AAAA,IACqC,EAAA,GAEnGiD,KAAA7hB,EAAA,OAAA;AAAA,MAAiD,UAAA,GAAAmT,EAAA,sBAAA;AAAA,IACJ,EAAA;AAI7C,WAAAiD,EAAA;AAAA,MAAa,cAAA/M;AAAA,MACT,eAAAqV;AAAA,IACA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpwBR,IAAAoD,KAAA;AAEA,MAAAC,KAAA;AAAA,EACA,eAAA;AACA,SAAA,OAAAD,GAAA,SAAA,GACAA,MAAA;AAAA,EACA;AACA;;;;;;;;;;;;uBCuDIE,KAAA,CAAA;;;;;;;;;iBAxCAC,IAAAjiB,EAAA,MAAA;AACI,cAAAmT,EAAA,SAAA;AAAA,QAAuB,KAAA;AAEf,iBAAA+O;AAAA,QAAO,KAAA;AAEP,iBAAAC;AAAA,QAAO,KAAA;AAEP,iBAAAC;AAAA,QAAO,KAAA;AAEP,iBAAA5K;AAAA,QAAO,KAAA;AAEP,iBAAA6K;AAAA,QAAO;AAEP,iBAAAA;AAAA,MAAO;AAAA,IACf,CAAA,GAGJC,IAAAtiB,EAAA,OAAA;AAAA,MAA2C,oCAAAmT,EAAA,WAAAA,EAAA,YAAA;AAAA,IACkC,EAAA,GAG7EoP,IAAAviB,EAAA,MAAA,4BAAAmT,EAAA,OAAA,EAAA,GAEAqP,IAAAxiB,EAAA,MAAAyiB,GAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GC2CAC,KAAA;AAAA,EAAe,MAAA,EAAA,UAAAC,GAAA;AAEf;;;;;;;;;;;iBA1DA,EAAA,IAAAC,EAAA,IAAA1P,GAAA,GASA2P,IAAAvlB,EAAA,GAEAwlB,IAAA9iB,EAAA,OAAA;AAAA,MAAwE,iBAAA;AAAA;AAAA,MACnD,cAAAmT,EAAA;AAAA,MACG,aAAA;AAAA,MACP,GAAAA,EAAA;AAAA;AAAA,MACJ,UAAA;AAAA,QAEC,UAAA;AAAA,MACI;AAAA,IACd,EAAA,GAGJ4P,IAAA/iB,EAAA,MAAA;;AAAA,eAAAqD,IAAA8P,EAAA,eAAA,gBAAA9P,EAAA,kBAAA;AAAA,KAAA,GACA2f,IAAA,CAAApe,MAAAuO,EAAA,cAAAvO,EAAA,YAAA,EAAA,SAAAme,EAAA,KAAA,IAAA,SAAA,QAGAE,IAAAjjB,EAAA,MACImT,EAAA,aAGAA,EAAA,MAAA,OAAA,CAAAvO,MAAAA,EAAA,YAAA,EAAA,SAAAme,EAAA,KAAA,CAAA,EAAA,SAFI,CAEsF,GAE9FG,IAAAljB;AAAA,MAA4B,MAAAmT,EAAA,gBAAA8P,EAAA,QAAA,IAAAL,EAAA,iBAAAK,EAAA,KAAA,IAAA;AAAA,IAGkE;;;;;;;;;;;;;;;;;;;uBCy/B9FE,KAAA;AAAA,EAAe,MAAA,EAAA,UAAA3J,GAAA;AAAA,EACM,MAAA;AAErB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAhbAqC,IAAAC,GAAA,GACAC,IAAAC,GAAAH,CAAA,GAIA5X,IAAA3G,EAAA,IAAA,GACAiP,IAAAjP,EAAA,GACAgM,IAAAhM,EAAA,CAAA,CAAA,GACA8lB,IAAA9lB,EAAA6a,GAAA,WAAA,CAAA,GACA9O,IAAA/L,EAAA,IAAA,GACA+lB,IAAA/lB,EAAA,IAAA,GACAgmB,IAAAhmB,EAAA,GACA+R,IAAA/R,EAAA,IAAA,GACAwO,IAAAxO,EAAA,IAAA,GACAimB,IAAAjmB,EAAA,IAAA,GACA;AAAA,MAAM,wBAAAkmB;AAAA,MACF,SAAAvkB;AAAA,MACA,aAAAwkB;AAAA,MACA,MAAAzf;AAAA,MACA,cAAAgI;AAAA,MACA,SAAAD;AAAA,MACA,kBAAA2X;AAAA,MACA,eAAAC;AAAA,MACA,YAAApa;AAAA,MACA,WAAA/C;AAAA,MACA,uBAAAod;AAAA,MACA,kBAAAC;AAAA,MACA,SAAA7T;AAAA,MACA,YAAApJ;AAAA,MACA,WAAAkd;AAAA,IACA,IAAAlkB,GAAAuT,CAAA,GAEJ4Q,IAAAzmB,EAAA,EAAA,GAEA,EAAA,GAAA2V,GAAA,IAAAC,GAAA,GACA8Q,IAAAhkB,EAAA,MAAAmF,GAAA,MAAA,OAAA,CAAAvC,MAAAA,EAAA,MAAA,EAAA,MAAA,GAIAqhB,IAAA,KACAC,IAAA5mB,EAAA,GACA,EAAA,OAAA4C,EAAA,IAAAikB,GAAAD,CAAA,GACA7P,IAAArU,EAAA,MAAAE,EAAA,SAAA+jB,CAAA;AACA,IAAA/F,GAAAtL,IAAAyB,CAAA;AAIA,UAAAW,IAAA1X,EAAA,EAAA;AACA,IAAAQ,GAAA,MAAA;AACI,MAAA,OAAA,SAAA,QACIkX,EAAA,QAAA,kBAAA,WAAA,uCAAA,kBAAA;AAAA,IACJ,CAAA,GAEJkJ,GAAArL,IAAAmC,CAAA;AAGA,UAAAoP,KAAArP;AAAA,MAA0EsP;AAAA,MACtE,OAAA;AAAA,QACO,0BAAA/mB,EAAA,IAAA;AAAA,QAC+B,oBAAA;AAAA,QACd,wBAAAA,EAAA,EAAA;AAAA,QACa,YAAAA,EAAA,EAAA;AAAA,QACZ,SAAAA,EAAA,IAAA;AAAA,MACJ;AAAA,IACrB,GAEJ,EAAA,0BAAAgnB,IAAA,oBAAAC,IAAA,YAAAC,GAAA,SAAAC,GAAA,yBAAAC,EAAA,IAAAN,GAAA,GAKA;AAAA,MAAM,YAAAjf;AAAA,MACF,uBAAAK;AAAA,MACA,mBAAAY;AAAA,MACA,yBAAAhC;AAAA,MACA,oDAAA+B;AAAA,MACA,SAAAwe;AAAA,MACS,wBAAA3e;AAAA,MACT,oBAAA3B;AAAA,IACA,IAAAX,GAAAzE,GAAA+E,GAAAC,GAAAqF,GAAAD,GAAA;AAAA,MAC6E,gBAAAoa;AAAA,MAC7D,qBAAAla;AAAA,MACK,0BAAAqa;AAAA,MACK,kBAAAF;AAAA,MAC1B,eAAAC;AAAA,MACA,wBAAAH;AAAA,MACA,oBAAAe;AAAA,IACA,CAAA,GAkCJrlB,IAAA,CAAAsB,MAAAokB,MAAA;AAEI,OAAApkB,MAAA5B,EAAA,WAAA4B,MAAA5B,EAAA,oBACI,CAAA+lB,GAAA,KAAA,IAAAC,IAEJC,EAAArkB,GAAA,GAAAokB,CAAA;AAAA,IAAmC,GAIvCE,KAAA5nB;AAAA,MAA4BunB;AAAA,MACxBD;AAAA,MACAE;AAAA,MACAJ;AAAA,IACA,GAEJS,KAAA/kB;AAAA,MAAyC,MAAAmT,EAAA,gBAAA,GAAA2R,GAAA,KAAA,OAAA;AAAA,IACoB,GAG7DE,KAAA9nB,GAAAmmB,GAAA5K,GAAAtF,GAAA,eAAA,CAAA,GACA8R,KAAAjlB;AAAA,MAAyC,MAAA,GAAAglB,GAAA,QAAAF,GAAA,KAAA;AAAA,IACyB,GAIlE;AAAA,MAAM,eAAAI;AAAA,MACF,YAAA3W;AAAA,MACA,wBAAAE;AAAA,MACA,mBAAAR;AAAA,MACA,+BAAAa;AAAA,MACA,8BAAAC;AAAA,MACA,iCAAAL;AAAA,MACA,iCAAAE;AAAA,IACA,IAAAb,GAAA5I,IAAA2e,GAAA5kB,CAAA,GAIJ,EAAA,mBAAA+Q,IAAA,wBAAAC,GAAA,IAAAH;AAAA,MAAsDxB;AAAA,MAClDhF;AAAA,MACAyG;AAAA,MACA7J;AAAA,IACA,GAIJ,EAAA,iBAAAuG,IAAA,0BAAAmB,IAAA,0BAAAC,IAAA,sBAAAnB,GAAA,IAAAL,GAAA4Y,IAAA1B,GAAAtkB,CAAA,GAIAimB,KAAAnlB;AAAA,MAAsC,MAAA;;AAAA,iBAAAqD,IAAA8P,EAAA,SAAA,gBAAA9P,EAAA,UAAA,KAAA,CAAA,CAAA8P,EAAA,yBAAA,CAAA,CAAAA,EAAA,cAAAA,EAAA,WAAA,aAAA;AAAA;AAAA,IAKA,GAEtC;AAAA,MAAM,gBAAA1L;AAAA,MACF,aAAAI;AAAA,MACA,mBAAAS;AAAA,MACA,eAAAV;AAAA,MACA,uBAAAd;AAAA,MACA,eAAAD;AAAA,MACA,gBAAA4B;AAAA,IACA,IAAAlC;AAAA,MACAC;AAAA,MACAtH;AAAA,MACA8E;AAAA,MACAmP,EAAA;AAAA,MACMA,EAAA;AAAA,MACAgS;AAAA,MACNve;AAAA,IACA,GAGJwe,KAAAplB,EAAA,MAAA;;AAAA;AAAA,QAAwE,YAAAqD,IAAAigB,EAAA,UAAA,gBAAAjgB,EAAA,wBAAAC,IAAAggB,EAAA,UAAA,gBAAAhgB,EAAA,sBAAA,CAAA,CAAA6P,EAAA;AAAA,QAE0B,kBAAA5P,IAAAqD,EAAA,UAAA,gBAAArD,EAAA,WAAAC,KAAAoD,EAAA,UAAA,gBAAApD,GAAA;AAAA,MAClC;AAAA,KAAA,GAIhE,EAAA,iBAAA6hB,GAAA,IAAAjc;AAAA,MAA4BC;AAAA,MACxBC;AAAA,MACA4b;AAAA,MACA3b;AAAA,MACAvJ,EAAA,MAAAmT,EAAA,eAAA,MAAA;AAAA,MAC6CsQ;AAAA,IAC7C,GAIJ,EAAA,YAAAtX,IAAA,kBAAAC,IAAA,wBAAAH,IAAA,mBAAAI,GAAA,IAAAT;AAAA,MAAoFI;AAAA,MAChFF;AAAA,MACA7H;AAAA,MACA8H;AAAA,MACA7M;AAAA,IACA,GAIJ;AAAA,MAAM,sBAAAwQ;AAAA,MACF,+CAAAE;AAAA,MACA,6BAAAC;AAAA,MACA,iBAAAN;AAAA,MACA,kBAAAC;AAAA,MACA,sCAAAM;AAAA,IACA,IAAAX;AAAA,MACAlL;AAAA,MACAsI;AAAA,MACAN;AAAA,MACAsX;AAAA,MACAlU;AAAA,MACArJ;AAAA,MACA;AAAA,QACA,YAAAmG;AAAA,QACI,YAAAvF;AAAA,QACA,kBAAAid;AAAA,QACA,oBAAAU;AAAA,MACA;AAAA,IACJ,GAIJe,KAAA,MAAA;AACI,MAAAhC,EAAA,MAAA,oBACIA,EAAA,MAAA,gBAAA,IAAmCA,EAAA,MAAA,qBAEnCA,EAAA,MAAA,gBAAA;AAAA,IACJ,GAEJiC,KAAAvlB,EAAA,MAAA;;AAAA;AAAA,QAA6E,GAAAmT,EAAA;AAAA,QAChE,WAAA9P,IAAA8P,EAAA,eAAA,gBAAA9P,EAAA,aAAA,gBAAAC,IAAA6P,EAAA,eAAA,gBAAA7P,EAAA,aAAA,UAAA6P,EAAA,WAAA,UAAA;AAAA,MAIC;AAAA,KAAA,GAKdqS,KAAAxlB,EAAA,OAAA;AAAA,MAA+C,CAAA,gBAAAxB,GAAA,OAAA,EAAA,GAAA2U,EAAA;AAAA,MACgB,CAAA,gBAAA3U,GAAA,MAAA,EAAA,GAAA2U,EAAA,cAAAhH,GAAA;AAAA,MACwB,CAAA,gBAAA3N,GAAA,cAAA,EAAA,GAAA2U,EAAA,WAAAA,EAAA;AAAA,MACA,CAAA,gBAAA3U,GAAA,oBAAA,EAAA,GAAA+Q,GAAA,SAAA,CAAAyU,EAAA;AAAA,MAEjC,CAAA,gBAAAxlB,GAAA,qBAAA,EAAA,GAAAgR,GAAA,SAAA2D,EAAA,eAAA;AAAA,MAEC,CAAA,gBAAA3U,GAAA,cAAA,EAAA,GAAA2U,EAAA;AAAA,MACe,CAAA,gBAAA3U,GAAA,WAAA,EAAA,GAAA2U,EAAA;AAAA,MACH,CAAA,gBAAA3U,GAAA,UAAA,EAAA,GAAAyP,GAAA;AAAA,MACW,0BAAA9B,GAAA;AAAA,IACrC,EAAA,GAIzCsZ,KAAAzlB,EAAA,OAAA;AAAA,MAAmD,kDAAAmT,EAAA;AAAA,IACS,EAAA,GAG5DuS,KAAA1lB,EAAA,MAAAuO,GAAA,MAAA,UAAA,CAAAvL,MAAAA,EAAA,UAAA,MAAA,CAAA,GACA2iB,KAAA3lB,EAAA,MAGI,GAFAmT,EAAA,cAAAA,EAAA,oBAAAA,EAAA,kBAAA6Q,EAAA,UAAA,MAEAzU,GAAA,KAAuD,GAI3DqW,KAAA5lB,EAAA,OAAA;AAAA,MAAiD,gCAAA,CAAA,CAAAmT,EAAA,iBAAAoR;AAAA,IACY,EAAA,GAI7DsB,KAAA7lB,EAAA,MAAA;;AAAA;AAAA,QAAqD,iDAAAuD,KAAAD,KAAAD,IAAA8P,EAAA,YAAA,gBAAA9P,EAAA,OAAA,gBAAAC,EAAA,YAAA,gBAAAC,EAAA,UAAA;AAAA,QACoC,kDAAAmS,MAAAjS,MAAAD,KAAA2P,EAAA,YAAA,gBAAA3P,GAAA2P,EAAA,QAAA,SAAA,OAAA,gBAAA1P,GAAA,YAAA,gBAAAiS,GAAA,WAAA;AAAA,QAEnB,mCAAA,CAAA,CAAAvC,EAAA,oBAAAoR;AAAA,MACH;AAAA,KAAA,GAInEuB,KAAA,CAAA9iB,MAAA;AAEI,YAAA+iB,IAAA/iB;AACA,MAAAA,MAAA,SAAA+iB,KAAA,QAAAA,EAAA,qBACI,OAAA,QAAAA,KAAA,gBAAAA,EAAA,gBAAA,EAAA,QAAA,CAAA,CAAAC,GAAAC,EAAA,MAAA;AACI,QAAA3c,EAAA,MAAA0c,CAAA,IAAAC;AAAA,MAAoC,CAAA;AAAA,IAE5C,GAEJC,KAAA,CAAAljB,GAAAkH,MAAA;;AAEI,YAAAic,IAAAnjB;AACA,UAAAA,MAAA,QACImjB,KAAA,QAAAA,EAAA,cAAA;AACI,cAAAC,KAAAjT,EAAA,eAAA,WAAAgT,KAAA,gBAAAA,EAAA;AACA,eAAA,QAAAA,KAAA,gBAAAA,EAAA,YAAA,EAAA,IAAA,CAAA,CAAAlmB,IAAA0R,EAAA,MAAA;;AACI,YAAAtO,KAAAgG,EAAA,UAAA,gBAAAhG,GAAApD,SAAA,WACIoJ,EAAA,QAAA,EAAA,GAAAA,EAAA,OAAA,CAAApJ,EAAA,GAAA,CAAA,EAAA,IAEJoJ,EAAA,MAAApJ,EAAA,EAAAiK,CAAA,IAAAyH;AAAA,QAAsC,CAAA,GAG1CyU,SACI/iB,KAAAgG,EAAA,UAAA,gBAAAhG,GAAA8F,SAAA,WACIE,EAAA,QAAA,EAAA,GAAAA,EAAA,OAAA,CAAAF,EAAA,GAAA,CAAA,EAAA,IAEJE,EAAA,MAAAF,EAAA,EAAAe,CAAA,KAAA5G,KAAA6iB,EAAA,kBAAA,gBAAA7iB,GAAA,IAEAe,GAAA,QAAA,KAAA;AAAA,UAAgCA,GAAA;AAAA,YACTb,MAAAD,KAAA4iB,EAAA,kBAAA,gBAAA5iB,GAAA,OAAA,gBAAAC,GAAA,gBAAA;AAAA,QACiC;AAAA,MAE5D;AAAA,IAER,GAKJ4c,KAAA,CAAAtO,GAAAtR,MAAA;AACI,MAAA2S,EAAA,kBACIjU,EAAAN,EAAA,WAAAkT,GAAAtR,CAAA;AAAA,IACJ,GAGJ6lB,KAAA,CAAAnc,MAAA;AACI,MAAA6Z,EAAA,QAAA7Z;AAAA,IAAwB,GAI5Boc,KAAAtmB,EAAA,MAAAmT,EAAA,oBAAAA,EAAA,gBAAA,aAAA,MAAA,GAGAoT,KAAAvmB,EAAA,MAAA;;AAAA,eAAAqD,IAAAwD,GAAA,UAAA,gBAAAxD,EAAA,WAAA;AAAA,KAAA,GACAmjB,KAAAxmB,EAAA,MAAAmT,EAAA,eAAAoT,GAAA,QAAA,CAAA,GAIAE,KAAA,CAAAC,MAAAxnB,EAAAN,EAAA,eAAA8nB,CAAA,GAGAC,KAAA,CAAA5d,MAAA;AACI,MAAA7J,EAAAN,EAAA,gBAAAmK,CAAA,GACA7J,EAAAN,EAAA,MAAAmK,CAAA;AAAA,IAA2C,GAG/C6d,KAAA,CAAAC,GAAAC,MAAA;AACI,MAAA5nB,EAAAN,EAAA,UAAAioB,CAAA,GACA3nB,EAAAN,EAAA,mBAAA;AAAA,QAA2C,GAAAuU,EAAA;AAAA,QAC9B,MAAA2T;AAAA,QACT,MAAAD;AAAA,MACA,CAAA;AAAA,IACH,GAELE,KAAA,CAAAC,MAAA;AACI,MAAA9nB,EAAAN,EAAA,YAAAooB,CAAA;AAAA,IAAgD,GAGpDC,KAAA,MAAA;AACI,MAAA/nB,EAAAN,EAAA,mBAAA;AAAA,IAA2C,GAE/CsoB,KAAA,CAAAC,MAAA;AACI,MAAAjoB,EAAAN,EAAA,2BAAAuoB,CAAA,GACAjoB,EAAAN,EAAA,qBAAAuoB,CAAA;AAAA,IAA0D,GAI9DC,KAAApnB,EAAA,MAAAf,EAAA,MAAA,KAAA,CAAA2D,MAAAA,EAAA,SAAA,CAAA;AACA,IAAAwkB,GAAA,SACItM;AAAA,MAAA;AAAA,IACI;AAKR,UAAAuM,KAAAtS,GAAAuS,IAAA,MAAA,IAAA;AACA,WAAAD,GAAAlU,EAAA,QAAA,GAEA+K,GAAAvL,IAAA8F,GAAAtF,GAAA,aAAA,CAAA,GAGAiD,EAAA,EAAA,mCAAAkP,GAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"data-grid.CS7Q8EWs.js","sources":["../../src/composables/use-calculate-sticky-element-height/use-calculate-sticky-element-height.ts","../../src/components/data-grid/components/data-grid-columns/data-grid-columns.types.ts","../../src/components/data-grid/data-grid.types.ts","../../src/components/data-grid/composables/use-resizer.ts","../../src/components/data-grid/composables/use-calculate-column-width/use-calculate-column-width.ts","../../src/components/data-grid/composables/use-selector/use-selector.ts","../../src/components/data-grid/composables/use-sorter.ts","../../src/components/data-grid/composables/use-keyboard-navigator/use-keyboard-navigator.types.ts","../../src/components/data-grid/composables/use-keyboard-navigator/use-keyboard-navigator.ts","../../src/components/data-grid/composables/use-lazy-loading/use-lazy-loading.ts","../../src/components/data-grid/composables/use-column-reorderer/use-column-reorderer.ts","../../src/components/data-grid/composables/use-config-settings/use-config-settings.ts","../../src/components/data-grid/composables/use-scroller/use-scroller.ts","../../src/components/data-grid/composables/use-column-hovering/use-column-hovering.ts","../../src/components/data-grid/utils/focus-children/focus-children.ts","../../src/components/data-grid/utils/handle-clipboard/handle-clipboard.ts","../../../ui-assets/icons-16/dist/vue/arrow-up-down-sort.vue","../../../ui-assets/icons-16/dist/vue/arrow-right.vue","../../../ui-assets/icons-16/dist/vue/freeze.vue","../../../ui-assets/icons-16/dist/vue/sort-ascending.vue","../../../ui-assets/icons-16/dist/vue/sort-descending.vue","../../../ui-assets/icons-16/dist/vue/triangle-down.vue","../../src/components/data-grid/data-grid.keys.ts","../../src/components/data-grid/components/data-grid-columns/data-grid-columns.vue","../../src/components/data-grid/components/data-grid-config-settings/data-grid-config-settings.types.ts","../../../ui-assets/icons-16/dist/vue/settings.vue","../../src/components/data-grid/components/data-grid-config-settings/components/data-grid-config-settings-column-row/data-grid-config-settings-column-row.vue","../../src/components/data-grid/components/data-grid-config-settings/data-grid-config-settings.vue","../../src/components/data-grid/components/data-grid-lazy-load/data-grid-lazy-load.vue","../../../ui-assets/icons-16/dist/vue/edit-1.vue","../../src/components/data-grid/components/data-grid-cell-actions/data-grid-cell-actions.vue","../../src/components/data-grid/components/data-grid-cell/data-grid-cell.types.ts","../../src/utils/ts/focus-visible.ts","../../src/components/data-grid/components/data-grid-cell/data-grid-cell.vue","../../src/components/data-grid/components/data-grid-row/data-grid-row.vue","../../../ui-assets/icons-16/dist/vue/warning-circle-fill.vue","../../src/components/data-grid/components/data-grid-static-icon/data-grid-static-icon.vue","../../src/components/data-grid/components/data-grid-summary-cell/data-grid-summary-cell.vue","../../src/components/data-grid/data-grid.vue"],"sourcesContent":["import { nextTick, onMounted, onUnmounted, ref, type Ref, type UnwrapRef, watch } from 'vue';\nimport { observeSizeOfElement } from '@/utils/ts/resize';\n\nconst calculateHeightWithPseudo = (element: HTMLDivElement | null | undefined): number => {\n if (!element) {\n return 0;\n }\n const style = window.getComputedStyle(element);\n let height = element.offsetHeight;\n\n // Check for pseudo-element to calculate additional height\n const after = window.getComputedStyle(element, '::after');\n if (after.content !== 'none' && after.position === 'absolute') {\n const afterHeight = parseFloat(after.height);\n const afterBottom = parseFloat(after.bottom);\n\n // If pseudo-element is positioned entirely below the element, add its height to the calculation\n if (!isNaN(afterHeight) && !isNaN(afterBottom) && afterBottom < 0 && afterBottom + afterHeight <= 0) {\n height += afterHeight;\n }\n }\n\n const top = parseFloat(style.top);\n\n // If the element is positioned upwards (e.g., top: -1px for an intersection observer trick),\n // the space it occupies for layout purposes is effectively reduced by that amount.\n // The calculated height is adjusted to ensure elements positioned below it don't have a gap.\n if (!isNaN(top) && top < 0) {\n height += top;\n }\n\n return height;\n};\n\n/**\n * Calculates the height of an element based on its ref, whether it is sticky or not and the presence of another sticky element.\n * This calculation includes the height of `::before` and `::after` pseudo-elements if they are positioned absolutely outside the main element.\n *\n * @param elementRef Reference to the element\n * @param isSticky Reference to a sticky prop\n * @param isadditionalElementSticky Reference to an additional sticky element (optional)\n * @param additionalElementRef Reference to an additional element (optional)\n * @returns Height of the element\n */\nexport const useCalculateStickyElementHeight = (\n elementRef: Ref<UnwrapRef<HTMLDivElement>>,\n isSticky: Ref<boolean>,\n isAdditionalElementSticky: Ref<boolean> = ref(false),\n additionalElementRef: Ref<UnwrapRef<HTMLDivElement>> | null = null\n) => {\n const topPosition = ref(0);\n let elementObserver: ResizeObserver | null = null;\n let mutationObserver: MutationObserver | null = null;\n\n const setTopPosition = () => {\n const mainElementHeight = isSticky.value ? calculateHeightWithPseudo(elementRef.value) : 0;\n const additionalElHeight =\n isAdditionalElementSticky.value && additionalElementRef\n ? calculateHeightWithPseudo(additionalElementRef.value)\n : 0;\n topPosition.value = mainElementHeight + additionalElHeight;\n };\n\n onMounted(() => {\n nextTick(() => {\n // Keep watching element until it's defined, then observe its size\n const stop = watch(\n elementRef,\n () => {\n if (elementRef?.value) {\n nextTick(() => stop());\n elementObserver = observeSizeOfElement(elementRef.value, setTopPosition);\n mutationObserver = new MutationObserver(setTopPosition);\n mutationObserver.observe(elementRef.value, { attributes: true, attributeFilter: ['class'] });\n }\n },\n { immediate: true }\n );\n watch(\n [isSticky, isAdditionalElementSticky],\n () => {\n setTopPosition();\n },\n { immediate: true }\n );\n });\n });\n\n onUnmounted(() => {\n elementObserver?.disconnect();\n mutationObserver?.disconnect();\n });\n\n return topPosition;\n};\n","import { type BentoColumnCellActionsProp } from '../data-grid-cell-actions/data-grid-cell-actions.types';\n\nexport enum BentoColumnOverflow {\n WRAP = 'wrap',\n ELLIPSIS = 'ellipsis',\n}\n\nexport interface BentoColumn {\n field: string;\n label: string;\n width?: number;\n autoWidth?: boolean;\n minWidth?: number;\n flex?: number;\n sortable?: boolean;\n numeric?: boolean;\n infoIconTooltip?: string;\n padding?: {\n left?: boolean;\n right?: boolean;\n };\n overflow?: BentoColumnOverflow;\n visible?: boolean;\n mandatory?: boolean;\n frozen?: boolean;\n cellActions?: BentoColumnCellActionsProp;\n}\n\n/**\n * All the emit events provided by the DatagridColumns component\n */\nexport enum DatagridColumnsEvent {\n COLUMN_RESIZE = 'column-resize',\n COLUMN_RESIZING = 'column-resizing',\n SELECT_ALL_ROWS = 'select-all-rows',\n SELECT_ALL_ACROSS_PAGES = 'select-all-across-pages',\n SELECT_ALL_CURRENT_RESULTS = 'select-all-current-results',\n DESELECT_ALL = 'deselect-all',\n DESELECT_ALL_CURRENT_RESULTS = 'deselect-all-current-results',\n COLUMN_MOVE = 'column-move',\n COLUMN_UPDATE = 'column-update',\n COLUMN_MENU_OPEN = 'column-menu-open',\n COLUMN_MENU_CLOSE = 'column-menu-close',\n COLUMN_HOVER = 'column-hover',\n\n // Dragging events\n COLUMN_DRAG_START = 'column-dragstart',\n COLUMN_DRAG_ENTER = 'column-dragenter',\n COLUMN_DRAG_END = 'column-dragend',\n COLUMN_DROP = 'column-drop',\n}\n\nexport interface DatagridColumnsHeaderReferences {\n [key: string]: HTMLDivElement | null;\n}\n\n/**\n * The Datagrid column dragging state.\n * @interface BentoDatagridDraggingColumnState\n * @field dragging - The column currently being dragged.\n * @field target - The column being dragged over during dragging another column.\n */\nexport interface BentoDatagridDraggingColumnState {\n dragging?: BentoColumn;\n dragToLeft?: boolean;\n target?: BentoColumn;\n}\n\nexport type BentoDatagridColumnSelectionState = 'all' | 'page' | 'single' | 'unselected-page' | 'none';\n","import type { BentoPaginationProps } from '@/components/pagination/pagination.types';\nimport type { BentoEmptyStateProps } from '@/components/empty-state/empty-state.types';\nimport type { BentoColumn } from './components/data-grid-columns/data-grid-columns.types';\nimport type { BentoDatagridDataItem, BentoDatagridDataItemId } from './components/data-grid-row/data-grid-row.types';\n\nexport { type BentoColumn, BentoColumnOverflow } from './components/data-grid-columns/data-grid-columns.types';\nexport type { BentoDatagridDataItem, BentoDatagridDataItemId } from './components/data-grid-row/data-grid-row.types';\nexport type {\n BentoDataGridRowActionsProp,\n BentoDataGridRowActionsFn,\n BentoColumnCellActionsProp,\n BentoColumnCellAction,\n} from './components/data-grid-cell-actions/data-grid-cell-actions.types';\n\nexport enum BentoDatagridStyleState {\n OUTLINE = 'outline',\n SCROLL = 'scroll',\n STICKY_FILTERS = 'sticky-filters',\n OVERFLOW_SHADOW_LEFT = 'overflow-shadow-left',\n OVERFLOW_SHADOW_RIGHT = 'overflow-shadow-right',\n NO_SPACING_TOP = 'no-spacing-top',\n FIT_CONTENT = 'fit-content',\n ZEBRA_ROWS = 'zebra-rows',\n}\n\nexport enum BentoDatagridSortDirection {\n ASCENDING = 'asc',\n DESCENDING = 'desc',\n}\n\nexport interface BentoDatagridSortByColumn {\n field: BentoColumn['field'];\n direction: BentoDatagridSortDirection;\n}\n\nexport type BentoDatagridSelection = Array<BentoDatagridDataItemId>;\n\nexport type BentoDatagridData = Array<BentoDatagridDataItem>;\n\nexport type BentoDatagridGetDataItemIdFn = (item: BentoDatagridDataItem) => BentoDatagridDataItemId;\n\nexport type BentoDatagridIsDataItemDisabledFn = (item: BentoDatagridDataItem) => boolean;\n\nexport type BentoDatagridPaginationProps = BentoPaginationProps;\n\nexport interface BentoColumnWidthOverridesLookup {\n [field: string]: {\n width: BentoColumn['width'];\n };\n}\n\nexport interface BentoDatagridAllItemsSelectedState {\n allItemsSelected: boolean;\n isIndeterminate: boolean;\n}\nexport interface BentoDataGridVisibleRowsState {\n filtered: boolean;\n allRowsVisible: boolean;\n}\n\nexport enum BentoDatagridEvent {\n COLUMNS = 'columns',\n COLUMN_RESIZE = 'column-resize',\n ITEMS_PAGE = 'items-page',\n NAVIGATE = 'navigate',\n NESTED_CONTENT_TOGGLED = 'nested-content-toggled',\n FILTER_SEARCH_INPUT = 'filter-search-input',\n FILTER_SEARCH_CLEAR = 'filter-search-clear',\n UPDATE_COLUMNS = 'update:columns',\n UPDATE_CONDENSED = 'update:condensed',\n UPDATE_FILTERS = 'update:filters',\n UPDATE_FILTER_VALUES = 'update:filter-values',\n UPDATE_FILTER_VALUES_OBJECT = 'update:filter-values-object',\n UPDATE_FILTER_SEARCH_TERM = 'update:filter-search-term',\n UPDATE_PAGINATION = 'update:pagination',\n UPDATE_SELECTION = 'update:selection',\n UPDATE_SHOW_MORE = 'update:show-more',\n UPDATE_SORT_BY = 'update:sort-by',\n UPDATE_ZEBRA_ROWS = 'update:zebra-rows',\n ROW_CLICK = 'row-click',\n SELECT = 'select',\n SELECT_ALL_ACROSS_PAGES = 'select-all-across-pages',\n SELECT_ALL_CURRENT_RESULTS = 'select-all-current-results',\n DESELECT_ALL_CURRENT_RESULTS = 'deselect-all-current-results',\n SORT = 'sort',\n}\n\nexport enum BentoDatagridAriaSortValue {\n ASCENDING = 'ascending',\n DESCENDING = 'descending',\n NONE = 'none',\n}\n\nexport type BentoDatagridEmptyStateProps = BentoEmptyStateProps;\n\nexport type BentoDatagridShouldShowNestedContentFn = (item: BentoDatagridDataItem) => boolean;\n\nexport type BentoDatagridShouldShowNestedRowsFn = (item: BentoDatagridDataItem) => boolean;\n","import { computed, reactive, ref, type Ref, toRefs, watch, watchEffect } from 'vue';\nimport { listen } from '@/utils/ts/events';\nimport { DatagridColumnsEvent } from '../components/data-grid-columns/data-grid-columns.types';\nimport type { BentoColumn, BentoColumnWidthOverridesLookup } from '../data-grid.types';\n\n/**\n * Contains all the resize methods and logic to allow users to resize column widths.\n * We listen for 3 main events:\n * - startResize: when the user clicks on a column divider.\n * - onResize: the tracking of the user dragging the columns divider left or right.\n * - stopResize: when the user fires the mouseup event and the column needs to be resized.\n *\n * With these 3 events we can track and store users manually changing column width.\n *\n * @param columns An array of columns definitions\n * @param emit The `bento-data-grid` emit function\n * @returns All resize refs, variables and methods\n */\nexport const useResizer = (\n columns: Ref<Array<BentoColumn>>,\n emit: (event: DatagridColumnsEvent, ...args: Array<unknown>) => void\n) => {\n const columnHoverEventToEmitAfterResizing = ref<BentoColumn>(null);\n const isResizing = ref(false);\n const columnWidthOverridesLookup = ref<BentoColumnWidthOverridesLookup>(undefined);\n // Initalise resize refs, reactive obects and computed variables\n // Set up column refs for each column header identified by the key\n const colKeyLookup = columns.value.reduce((acc, col) => {\n acc[col.field] = null;\n return acc;\n }, {});\n const columnsRefs = reactive(colKeyLookup);\n const allColumnRefs = toRefs(columnsRefs);\n\n let stepPositionX = 0;\n let resizingColumnField = '';\n\n // Setup the reactive resize data object to be used in all the event methods\n const defaultResizedColumnWidths = computed(() =>\n Object.fromEntries(columns.value.map(({ field, width, minWidth }) => [field, { width, minWidth }]))\n );\n\n watchEffect(() => (columnWidthOverridesLookup.value = defaultResizedColumnWidths.value));\n\n // Intialise resize methods\n let removeMouseMoveResizeListener: () => void = null;\n let removeMouseUpResizeListener: () => void = null;\n\n // When the user is resizing the column keep track of mouse position and update column width\n const onResizeColumn = (event: MouseEvent) => {\n const sizeChange = event.clientX - stepPositionX;\n const currResizingColumnField = resizingColumnField;\n\n const resizedColumnWidth = columnWidthOverridesLookup.value[currResizingColumnField].width + sizeChange;\n // If the column width is more than the minWidth set the new resized width or else use the minWidth\n columnWidthOverridesLookup.value[currResizingColumnField].width =\n resizedColumnWidth > defaultResizedColumnWidths.value[currResizingColumnField].minWidth\n ? resizedColumnWidth\n : defaultResizedColumnWidths.value[currResizingColumnField].minWidth;\n\n /**\n * Triggered when a column is resized\n *\n * @event column-resizing\n * @property BentoColumnWidthOverridesLookup columnWidthOverridesLookup - the column width overrides.\n */\n emit(DatagridColumnsEvent.COLUMN_RESIZING, columnWidthOverridesLookup.value);\n\n stepPositionX = event.clientX;\n };\n\n // When the user fires the mouse up event, set the resizing column width\n const stopResize = () => {\n isResizing.value = false;\n removeMouseMoveResizeListener?.();\n removeMouseUpResizeListener?.();\n\n if (resizingColumnField) {\n /**\n * Triggered when a column is resized\n *\n * @event column-resize\n * @property {field: string; width: number;} resizedColumn - the resized columns field name and new width.\n */\n emit(DatagridColumnsEvent.COLUMN_RESIZE, {\n field: resizingColumnField,\n width: columnWidthOverridesLookup.value[resizingColumnField].width,\n });\n }\n\n // Reset all resize vars back to defaults\n removeMouseMoveResizeListener = null;\n removeMouseUpResizeListener = null;\n resizingColumnField = '';\n stepPositionX = null;\n };\n\n // When the user interacts with the column resizer, set it's start position and the column we are interacting with\n const startResize = (hasResizableColumns: boolean, field: BentoColumn['field'], event: MouseEvent) => {\n event.preventDefault();\n if (hasResizableColumns) {\n isResizing.value = true;\n if (event.buttons !== 1) {\n stopResize();\n return;\n }\n\n resizingColumnField = field;\n stepPositionX = event.clientX;\n\n removeMouseMoveResizeListener = listen(window, 'mousemove', onResizeColumn);\n removeMouseUpResizeListener = listen(window, 'mouseup', stopResize);\n }\n };\n\n // When resizing we need to keep track of what the last column-hover emit was so we can emit that when we're finished resizing\n watch(\n () => isResizing.value,\n (newIsResizing, oldIsResizing) => {\n if (!newIsResizing && oldIsResizing) {\n emit(DatagridColumnsEvent.COLUMN_HOVER, columnHoverEventToEmitAfterResizing.value);\n columnHoverEventToEmitAfterResizing.value = null;\n }\n }\n );\n return {\n resizeData: columnWidthOverridesLookup,\n allColumnRefs,\n startResize,\n isResizing,\n columnHoverEventToEmitAfterResizing,\n };\n};\n","import { computed, nextTick, onBeforeUpdate, onMounted, onUnmounted, type Ref, ref, watch } from 'vue';\nimport { observeSizeOfElement } from '@/utils/ts/resize';\nimport { isVue3 } from 'vue-demi';\nimport type { BentoColumn, BentoColumnWidthOverridesLookup, BentoDatagridData } from '../../data-grid.types';\nimport type { CalculateColumnWidthOptions, FlexColumnLookup } from './use-calculate-column-width.types';\nimport type { MaybeRef } from '@/types/maybe-ref';\nimport type { DatagridColumnsHeaderReferences } from '../../components/data-grid-columns/data-grid-columns.types';\n\n// Default constants\nexport const DEFAULT_COLUMN_WIDTH = 100;\nexport const DEFAULT_COLUMN_MIN_WIDTH = 50;\n\n// Select column constants\nexport const DATAGRID_ACTIONS_COLUMN_FIELD_NAME = 'b-actions-column';\n// If only row selection is enabled\nexport const DATAGRID_SELECT_WIDTH = 42;\n// If select all pages is enabled we need to make the select column larger\nexport const DATAGRID_SELECT_WIDTH_WITH_SELECT_ALL_PAGES_ENABLED = 56;\n// If row selection is enabled and nest rows are enabled\nexport const DATAGRID_SELECT_WIDTH_AND_NESTED_ROWS_ENABLED = 56;\n// If all row selection options enabled and nest rows are enabled\nexport const DATAGRID_SELECT_WIDTH_AND_SELECT_ALL_PAGES_AND_NESTED_ROWS_ENABLED = 80;\n// If only nested row are enabled\nexport const DATAGRID_NESTED_ROWS_ENABLED = 36;\n\n// Cell and Column header offset constants\nexport const DATAGRID_CELL_OFFSET_INITIAL = 1; // This needs to be 1 due to how offsetWidth rounds decimals\nexport const DATAGRID_CELL_OFFSET_PADDING = 16;\n\n// Data Grid template constant\nexport const DATAGRID_TEMPLATE_EXTRA_PADDING = 20;\n\n/**\n * For fluid width caclulations we adhere to the caclulations done for the CSS flexbox:\n * https://drafts.csswg.org/css-flexbox-1/#resolve-flexible-lengths\n *\n * @param initialFreeSpace The amount of freespace to allow flex columns within\n * @param totalFlexUnits The total amount of flex units to allocate\n * @param flexCols An array of columns with a flex unit assigned to them\n * @returns A keyed object of columns and their computed widths\n */\nconst computeFlexColumnsWidth = (initialFreeSpace: number, totalFlexUnits: number, flexCols: Array<BentoColumn>) => {\n const flexColumnsLookup: FlexColumnLookup = {};\n const frozenColumnKeys: Array<BentoColumn['field']> = [];\n\n const freezeColumn = (field: BentoColumn['field']) => {\n const value = flexColumnsLookup[field];\n if (value && value.frozen !== true) {\n flexColumnsLookup[field].frozen = true;\n frozenColumnKeys.push(field);\n }\n };\n\n // Step 5 of https://drafts.csswg.org/css-flexbox-1/#resolve-flexible-lengths\n function processFlexItems() {\n // 5a: If all the flex items on the line are frozen, free space has been distributed.\n if (frozenColumnKeys.length === flexCols.length) {\n return;\n }\n\n const violationsLookup: {\n min: Record<BentoColumn['field'], boolean>;\n max: Record<BentoColumn['field'], boolean>;\n } = { min: {}, max: {} };\n\n let remainingFreeSpace = initialFreeSpace;\n let flexUnits = totalFlexUnits;\n let totalViolation = 0;\n\n // 5b: Calculate the remaining free space\n frozenColumnKeys.forEach(field => {\n remainingFreeSpace -= flexColumnsLookup[field].computedWidth;\n flexUnits -= flexColumnsLookup[field].flex;\n });\n\n for (let i = 0, flexColsLength = flexCols.length; i < flexColsLength; i += 1) {\n const column = flexCols[i];\n\n // If this column is frozen no need to re-recalculate it's width\n if (flexColumnsLookup[column.field] && flexColumnsLookup[column.field].frozen === true) {\n // NOTE: the following eslint rule was disabled because we check each column's frozen status\n // and if one exists we need to keep recursively caclulating the flex column widths.\n continue;\n }\n\n // 5c: Distribute remaining free space proportional to the flex factors\n const widthPerFlexUnit = remainingFreeSpace / flexUnits;\n let computedWidth = widthPerFlexUnit * column.flex;\n\n // 5d: Fix minWidth violations\n if (computedWidth < column.minWidth) {\n totalViolation += column.minWidth - computedWidth;\n computedWidth = column.minWidth;\n violationsLookup.min[column.field] = true;\n }\n\n flexColumnsLookup[column.field] = {\n frozen: false,\n computedWidth,\n flex: column.flex,\n };\n }\n\n // 5e: Freeze over-flexed items\n if (totalViolation > 0) {\n // Freeze all the items with minWidth violations\n Object.keys(violationsLookup.min).forEach(field => {\n freezeColumn(field);\n });\n } else {\n // Freeze all items\n flexCols.forEach(({ field: key }) => {\n freezeColumn(key);\n });\n }\n\n // 5f: Return to the start of this loop\n processFlexItems();\n }\n\n processFlexItems();\n\n return flexColumnsLookup;\n};\n\n/**\n * Calculates width of HTMLDivElement including any additional offset depending on if:\n * - An edge occurs where sometimes the padding CSS has not loaded yet\n * - When calculating column header width, if the column panel is enabled\n *\n * @param el - an HTML Div element\n * @param hasColumnPanel - if provided and true will be used to calculate the offset\n * @returns the width of the element including offset values\n */\nconst getElementWidthIncludingOffset = (el: HTMLDivElement, hasColumnPanel?: boolean) => {\n let offset = DATAGRID_CELL_OFFSET_INITIAL;\n // If we include column panel in the calculation we should add 2 spacers to leave room for the contextual menu button\n if (hasColumnPanel) {\n offset += DATAGRID_CELL_OFFSET_PADDING * 2;\n }\n\n return el?.offsetWidth ? el.offsetWidth + offset : 0;\n};\n\n/**\n * Generates the column width for the actions column which contains actions like row selection or nested rows toggle button.\n * @param options - the datagrid calculation options.\n * @returns a column definition used in the column and cell components.\n */\nexport const getActionsColumnWidth = (options: CalculateColumnWidthOptions) => {\n if (options?.hasNestedContent?.value || options?.hasNestedRows?.value) {\n if (!options?.hasSelectableColumn?.value) {\n return DATAGRID_NESTED_ROWS_ENABLED;\n }\n return options?.hasSelectableAcrossPages?.value\n ? DATAGRID_SELECT_WIDTH_AND_SELECT_ALL_PAGES_AND_NESTED_ROWS_ENABLED\n : DATAGRID_SELECT_WIDTH_AND_NESTED_ROWS_ENABLED;\n }\n return options?.hasSelectableAcrossPages?.value\n ? DATAGRID_SELECT_WIDTH_WITH_SELECT_ALL_PAGES_ENABLED\n : DATAGRID_SELECT_WIDTH;\n};\n\n/**\n * Calculates the width of the columns using width, minWidth and/or a fluid number.\n *\n * @param newColumns An array of column definitions\n * @param newData An array of data objects to display.\n * @param bodyRef Ref to the `bento-data-grid` body container\n * @param gridCellRefs An array of Ref for each one of the cells available by Column\n * @param options Optional options for the calculator to be aware of.\n */\nexport const useCalculateColumnWidth = (\n newColumns: Ref<Array<BentoColumn>>,\n newData: MaybeRef<BentoDatagridData>,\n bodyRef: MaybeRef<HTMLDivElement | undefined>,\n gridColumnsComponentRefs: MaybeRef<DatagridColumnsHeaderReferences>,\n gridCellRefs: MaybeRef<{ [key: string]: Array<HTMLDivElement> } | undefined>,\n options?: CalculateColumnWidthOptions\n) => {\n const columns = ref(newColumns.value);\n const data = ref(newData);\n const body = ref(bodyRef);\n const gridColumnsComponents = ref(gridColumnsComponentRefs);\n const gridCells = ref(gridCellRefs);\n const isMeasuringColumnWidths = ref(false);\n const rowActionsMaxWidth = ref(0);\n\n // Watch for updates to columns property but don't change order or width\n watch(\n () => newColumns.value,\n (newDataGridColumnsProps, previousDataGridColumnsProps) => {\n const haveSameFieldsInSameOrder =\n newDataGridColumnsProps?.map(({ field }) => field).toString() ===\n previousDataGridColumnsProps?.map(({ field }) => field).toString();\n\n /**\n * No column order will be stored if drag & drop is disabled.\n * This is because in the case where users pass down different data sets\n * with different columns, there's no reason to store the order internally\n * and this functionality is delegated to the users which can listen to the\n * 'update:columns' if they'd like to handle the order of mutiple data sets.\n *\n * In the other case where a user is changing which columns are used and / or\n * their order as well, we must not presist the columns order.\n */\n if (!options?.allowColumnDragAndDrop?.value || !haveSameFieldsInSameOrder) {\n columns.value = newColumns.value;\n return;\n }\n\n /*\n * This is needed for the use case when:\n * 1. User provides a computed ref of columns (which have translations for labels)\n * 2. User re-orders the columns, changing the local state\n * 3. User changes the language, now the local state columns need to be updated BUT the local order must persist\n */\n columns.value =\n columns.value?.length === 0\n ? newColumns.value\n : newColumns.value\n // Keep the order the same as it was, adding any new columns to the end\n\n .sort((colA, colB) => {\n // Find the index of each item in the orderArray\n const indexA = columns.value.findIndex(item => item.field === colA.field);\n const indexB = columns.value.findIndex(item => item.field === colB.field);\n // Place items not in orderArray at the end\n if (indexA === -1) {\n return 1;\n }\n if (indexB === -1) {\n return -1;\n }\n return indexA - indexB;\n });\n }\n );\n\n // Observe the size of the table body and store the width for column and CSS width calculations\n const gridWidth = ref<number>();\n let bodyElementObserver: ResizeObserver | null = null;\n\n const calculatedWidths = computed(() => {\n // Setup vars\n const flexCols = [];\n let totalFlexUnits = 0;\n let widthAllocatedBeforeFlex = 0;\n // reduce columns into keyed object\n const columnsLookup: {\n [columnKey: string]: BentoColumn;\n } = {};\n let columnDefs: Array<BentoColumn> = columns.value.filter(col => col.visible !== false);\n const invisibleColumnDefs: Array<BentoColumn> = columns.value.filter(col => col.visible === false);\n // Prepend a column if needs row selecting functionality or nested rows functionality\n if (options?.hasSelectableColumn?.value || options?.hasNestedContent?.value || options?.hasNestedRows?.value) {\n const columnWidth = getActionsColumnWidth(options);\n\n columnDefs = [\n {\n field: DATAGRID_ACTIONS_COLUMN_FIELD_NAME,\n label: '',\n minWidth: columnWidth,\n width: columnWidth,\n frozen: true,\n padding: { left: false, right: false },\n },\n ...columnDefs,\n ];\n }\n\n // For the non-flex columns, compute their width\n // For the flex columns, compute there minimum width and how much width must be allocated during the flex allocation\n columnDefs.forEach(col => {\n const fluidCol: BentoColumn = { ...col };\n let width: number;\n if (fluidCol.flex && fluidCol.flex > 0) {\n // If a fluid column, add flex units to total and prepare them for calculation\n totalFlexUnits += fluidCol.flex;\n width = 0;\n flexCols.push(fluidCol);\n } else {\n // If not a fluid column use the width (or minWidth if this is a larger value)\n width = Math.max(\n fluidCol?.width ?? DEFAULT_COLUMN_WIDTH,\n fluidCol?.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH\n );\n }\n\n widthAllocatedBeforeFlex += width;\n fluidCol.width = width;\n fluidCol.minWidth = fluidCol?.minWidth ?? DEFAULT_COLUMN_MIN_WIDTH;\n\n columnsLookup[fluidCol.field] = fluidCol;\n });\n\n // The row actions column has a fixed width, so we add it to the total allocated width before calculating flex column widths.\n widthAllocatedBeforeFlex += rowActionsMaxWidth.value;\n\n // Calculate how much space we have available for fluids widths by subtracting the non-fluid column widths\n const initialFreeSpace = Math.max(gridWidth.value - widthAllocatedBeforeFlex, 0);\n\n // Allocate the remaining space to the flex columns\n if (totalFlexUnits > 0 && gridWidth.value > 0) {\n const computedColumnWidths = computeFlexColumnsWidth(initialFreeSpace, totalFlexUnits, flexCols);\n\n Object.keys(computedColumnWidths).forEach(field => {\n columnsLookup[field].width = computedColumnWidths[field].computedWidth;\n });\n }\n\n // Add in invisible columns\n invisibleColumnDefs.forEach(col => {\n const fluidCol: BentoColumn = { ...col };\n columnsLookup[fluidCol.field] = fluidCol;\n });\n\n return Object.values(columnsLookup);\n });\n\n // RESIZE OBJECT\n const columnWidthOverridesLookup = ref<BentoColumnWidthOverridesLookup>(undefined);\n\n const onColumnWidthOverride = (newColumnWidthOverridesLookup: BentoColumnWidthOverridesLookup) => {\n columnWidthOverridesLookup.value = { ...columnWidthOverridesLookup.value, ...newColumnWidthOverridesLookup };\n };\n\n // Auto-width logic\n const measureAndAssignAutoWidths = async () => {\n if (columns.value.some(column => column?.autoWidth)) {\n // First we need to measure the row cells for each column after 1 tick\n isMeasuringColumnWidths.value = true;\n await nextTick();\n // Need to await an extra tick for vue 3 because of how vue 3 re-renders children component when changing props\n if (isVue3) {\n await nextTick();\n }\n\n // Now we find the biggest cell for each auto width column\n columns?.value\n .filter(column => column?.autoWidth)\n .forEach(({ field, minWidth }) => {\n const columnHeaderWidth = getElementWidthIncludingOffset(\n gridColumnsComponents.value?.[field],\n options?.hasColumnPanel?.value\n );\n\n const largestRowCellWidth = gridCells.value?.[field]?.reduce(\n (max, el) => Math.max(max, getElementWidthIncludingOffset(el)),\n 0\n );\n\n const largestColumnHeaderAndRowCellWidth = Math.max(columnHeaderWidth, largestRowCellWidth ?? 0);\n\n if (minWidth === undefined || largestColumnHeaderAndRowCellWidth > minWidth) {\n onColumnWidthOverride({\n [field]: {\n width: largestColumnHeaderAndRowCellWidth,\n },\n });\n }\n });\n\n isMeasuringColumnWidths.value = false;\n }\n };\n watch([() => columns.value, () => data.value], async () => {\n if (columns.value.some(column => column?.autoWidth)) {\n await measureAndAssignAutoWidths();\n }\n });\n\n const processedColumns = computed(() =>\n calculatedWidths.value.map(col => ({\n ...col,\n // Override column width with resized ones\n width: columnWidthOverridesLookup.value?.[col.field]?.width ?? col.width,\n }))\n );\n\n // Generate grid width styles\n const totalWidthOfAllColumns = computed(\n () =>\n processedColumns.value\n ?.filter(({ visible }) => visible !== false)\n .reduce((acc, val) => val.width + acc, 0) + rowActionsMaxWidth.value\n );\n\n const isTotalWidthOfColumnsTakingUpAllAvailableGridWidth = computed(\n () => gridWidth.value <= totalWidthOfAllColumns.value\n );\n\n const gridRowWidthStyle = computed(() => ({\n width: gridWidth.value > totalWidthOfAllColumns.value ? '100%' : 'fit-content',\n }));\n\n // Life cycle hooks\n onMounted(() => {\n const extraPadding = options?.isDataGridTemplate ? DATAGRID_TEMPLATE_EXTRA_PADDING : 0;\n\n nextTick(() => {\n if (body.value) {\n gridWidth.value = body.value.getBoundingClientRect().width - extraPadding;\n }\n // Keep watching element till it's defined, when it is observe element's width\n const stop = watch(\n body,\n () => {\n if (body.value) {\n nextTick(() => stop());\n bodyElementObserver = observeSizeOfElement(body.value, ({ width }) => {\n gridWidth.value = width - extraPadding;\n });\n }\n },\n { immediate: true }\n );\n });\n\n if (document?.fonts?.ready) {\n document.fonts.ready.then(() => {\n measureAndAssignAutoWidths();\n });\n } else {\n measureAndAssignAutoWidths();\n }\n });\n onUnmounted(() => {\n bodyElementObserver?.disconnect();\n });\n onBeforeUpdate(() => {\n if (gridCells.value && Object.keys(gridCells.value)?.length > 0) {\n const columnKeys = Object.keys(gridCells.value);\n columnKeys.forEach(key => {\n gridCells.value[key] = [];\n });\n }\n });\n\n return {\n columnDefs: processedColumns,\n gridRowWidthStyle,\n onColumnWidthOverride,\n isMeasuringColumnWidths,\n isTotalWidthOfColumnsTakingUpAllAvailableGridWidth,\n columns,\n totalWidthOfAllColumns,\n rowActionsMaxWidth,\n };\n};\n","import { computed, nextTick, reactive, ref, type Ref, watch } from 'vue';\nimport {\n type BentoDatagridAllItemsSelectedState,\n type BentoDatagridData,\n type BentoDatagridDataItem,\n type BentoDatagridDataItemId,\n BentoDatagridEvent,\n type BentoDatagridGetDataItemIdFn,\n type BentoDatagridIsDataItemDisabledFn,\n type BentoDatagridPaginationProps,\n} from '../../data-grid.types';\nimport { type BentoDatagridColumnSelectionState } from '../../components/data-grid-columns/data-grid-columns.types';\n\n/**\n * Exposed selection variables and methods for a data component to use and react to.\n * @param selection A list of unique IDs\n * @param emit The emit function to fire upon selection\n * @param data The list of data items\n * @param getDataItemId The method to retrieve the unique ID of a data item\n * @param isDataItemDisabled The method to determine if the data item is disabled for selection\n * @param isSelectableAcrossPages Determines if the grid rows are selectable across all pages\n * @param pagination The data grid pagination\n */\nexport const useSelector = (\n selection: Ref<Array<BentoDatagridDataItemId>>,\n emit: (event: string, emitedSelectedItems: Array<BentoDatagridDataItemId>) => void,\n data: Ref<BentoDatagridData>,\n getDataItemId: BentoDatagridGetDataItemIdFn,\n isDataItemDisabled: BentoDatagridIsDataItemDisabledFn,\n isSelectableAcrossPages?: Ref<boolean>,\n pagination?: Ref<BentoDatagridPaginationProps>\n) => {\n const selectedItems = ref<Array<BentoDatagridDataItemId>>(selection.value ?? []);\n const allItemsSelectedState = reactive<BentoDatagridAllItemsSelectedState>({\n allItemsSelected: false,\n isIndeterminate: false,\n });\n const allDataItemsIncludingChildren = computed(() =>\n data.value.flatMap(dataItem => [dataItem, dataItem?.children?.length > 0 ? dataItem?.children : []]).flat()\n );\n const isEveryItemInPageSelected = computed(\n () =>\n data.value?.length > 0 &&\n allDataItemsIncludingChildren.value?.every(item => selectedItems.value.includes(getDataItemId(item)))\n );\n const isEveryEnabledItemInPageSelected = computed(\n () =>\n data.value?.length > 0 &&\n allDataItemsIncludingChildren.value\n ?.filter(dataItem => !isDataItemDisabled(dataItem))\n .every(item => selectedItems.value.includes(getDataItemId(item)))\n );\n const isNoItemInPageSelected = computed(\n () =>\n data.value?.length > 0 &&\n !allDataItemsIncludingChildren.value?.some(item => selectedItems.value.includes(getDataItemId(item)))\n );\n\n const isNoEnabledItemInPageSelected = computed(\n () =>\n data.value?.length > 0 &&\n !allDataItemsIncludingChildren.value\n ?.filter(dataItem => !isDataItemDisabled(dataItem))\n .some(item => selectedItems.value.includes(getDataItemId(item)))\n );\n const isEveryItemAcrossPagesSelected = computed(() => {\n if (!isSelectableAcrossPages?.value || pagination?.value?.totalCount === undefined) {\n return false;\n }\n return selectedItems.value.length >= pagination.value.totalCount && isEveryEnabledItemInPageSelected.value;\n });\n\n const emitSelect = () => {\n emit(BentoDatagridEvent.SELECT, selectedItems.value);\n emit(BentoDatagridEvent.UPDATE_SELECTION, selectedItems.value);\n };\n\n // Update the selected items state & the select / de-select all column checkbox state by:\n // - Set the selected items state\n // - Set the \"select / de-select all\" checked state\n // - If all seletcted, set indeterminate to true if not all items were selected including disabled ones.\n // - If not all selected, set indeterminate to true if at least 1 item has been selected in the currently shown data.\n const updateSelectedItems = (value: Array<BentoDatagridDataItemId>) => {\n selectedItems.value = value;\n if (isEveryItemInPageSelected.value) {\n allItemsSelectedState.allItemsSelected = true;\n // if all items are selected, then indeterminate is false\n allItemsSelectedState.isIndeterminate = false;\n } else {\n allItemsSelectedState.allItemsSelected = false;\n // Check if at least 1 item in the currently shown data is selected\n allItemsSelectedState.isIndeterminate =\n selectedItems.value?.length > 0 &&\n data.value?.length > 0 &&\n data.value.some(\n item =>\n selectedItems.value.includes(getDataItemId(item)) ||\n item?.children?.some(childItem => selectedItems.value.includes(getDataItemId(childItem)))\n );\n }\n };\n\n // Reacts to the \"select this page / deselect this page\" menu updates\n // or checkbox with `selectable across pages` is not active\n // 1. Set the \"select / de-select all\" checked state to incoming parameter\n // 2. Set the selected items state\n // - If selecting all then interminate state to true if checked state is checked but not all items (including disabled ones) are selected\n // - If de-selecting all, then set interminate state to false\n // 3. Emit selected state\n const onAllRowSelect = (selectAllItems: boolean) => {\n nextTick(() => {\n // The allItemsSelected must be kept in sync with the checked checkbox state\n allItemsSelectedState.allItemsSelected = selectAllItems;\n // Check all undisabled rows\n const currentPageItems =\n allDataItemsIncludingChildren.value\n ?.filter(\n dataItem =>\n !isDataItemDisabled(dataItem) &&\n (dataItem?.children === undefined ||\n dataItem.children.every(childItem => !isDataItemDisabled(childItem)))\n )\n ?.map(dataItem => getDataItemId(dataItem)) ?? [];\n if (selectAllItems) {\n selectedItems.value = [...new Set([...selectedItems.value, ...currentPageItems])];\n allItemsSelectedState.isIndeterminate = !isEveryItemInPageSelected.value;\n } else {\n selectedItems.value = selectedItems.value.filter(item => !currentPageItems.includes(item));\n allItemsSelectedState.isIndeterminate = !isNoItemInPageSelected.value;\n }\n emitSelect();\n });\n };\n\n const onDeselectAll = () => {\n nextTick(() => {\n updateSelectedItems([]);\n emitSelect();\n });\n };\n\n const onRowSelect = (value: Array<BentoDatagridDataItemId>, rowData: BentoDatagridDataItem) => {\n nextTick(() => {\n updateSelectedItems(rowData?.children?.length > 0 ? onParentRowSelect(value, rowData) : value);\n emitSelect();\n });\n };\n\n // Selecting / deselecting a parent of nested rows\n const onParentRowSelect = (value: Array<BentoDatagridDataItemId>, parentRowData: BentoDatagridDataItem) => {\n const currentRowDateItemId = getDataItemId(parentRowData);\n const childrenDataItemIds = parentRowData.children\n ?.filter(childItem => !isDataItemDisabled(childItem))\n .map(childItem => getDataItemId(childItem));\n // Selecting\n if (value.includes(currentRowDateItemId)) {\n const parentIdAndChildrenIds = value;\n childrenDataItemIds.forEach(childDataItemId => {\n if (!parentIdAndChildrenIds.includes(childDataItemId)) {\n parentIdAndChildrenIds.push(childDataItemId);\n }\n });\n return parentIdAndChildrenIds;\n }\n return value.filter(selectedItemId => !childrenDataItemIds.includes(selectedItemId));\n };\n\n // Selecting / deselecting a nested row\n const onNestedRowSelect = (\n value: Array<BentoDatagridDataItemId>,\n parentRowData: BentoDatagridDataItem,\n rowData: BentoDatagridDataItem\n ) => {\n nextTick(() => {\n const currentRowDateItemId = getDataItemId(parentRowData);\n // Selecting\n if (value.includes(getDataItemId(rowData))) {\n updateSelectedItems(\n !value.includes(currentRowDateItemId) &&\n parentRowData?.children?.every(child => value.includes(getDataItemId(child)))\n ? [...value, currentRowDateItemId]\n : value\n );\n } else {\n // Deselecting\n updateSelectedItems(\n value.includes(currentRowDateItemId) &&\n !parentRowData?.children?.every(child => value.includes(getDataItemId(child)))\n ? value.filter(selectedItem => selectedItem !== currentRowDateItemId)\n : value\n );\n }\n emitSelect();\n });\n };\n\n const selectionState = computed<BentoDatagridColumnSelectionState>(() => {\n if (isEveryItemAcrossPagesSelected.value) {\n return 'all';\n }\n if (isEveryEnabledItemInPageSelected.value) {\n return 'page';\n }\n if (!selectedItems.value || selectedItems.value.length === 0) {\n return 'none';\n }\n if (isNoEnabledItemInPageSelected.value) {\n return 'unselected-page';\n }\n return 'single';\n });\n\n // If the selection prop is changed we should update local selection state\n watch(\n () => selection.value,\n () => {\n updateSelectedItems(selection.value ?? []);\n },\n { immediate: true }\n );\n\n // If the data is changed then we should update the select all checkbox if needed\n watch(\n () => data.value,\n () => {\n // Adds in missing children if parent is selected\n const allChildrenSelectedDataItems = data.value\n .filter(dataItem => selectedItems.value.includes(getDataItemId(dataItem)))\n .flatMap(dataItem =>\n dataItem?.children?.length > 0\n ? dataItem.children\n .map(childItem => getDataItemId(childItem))\n .filter(childItemId => !selectedItems.value.includes(childItemId))\n : []\n );\n\n if (allChildrenSelectedDataItems?.length > 0) {\n updateSelectedItems([...selectedItems.value, ...allChildrenSelectedDataItems]);\n emitSelect();\n } else {\n updateSelectedItems(selectedItems.value);\n }\n }\n );\n\n return {\n onAllRowSelect,\n onRowSelect,\n onNestedRowSelect,\n onDeselectAll,\n allItemsSelectedState,\n selectedItems,\n selectionState,\n };\n};\n","import { type Ref } from 'vue';\nimport { type BentoColumn, type BentoDatagridSortByColumn, BentoDatagridSortDirection } from '../data-grid.types';\n\n/**\n * Handles the sort direction logic of the columns in DataGrid.\n * Emits the `sort` event with the new direction when the field sort direction changes.\n * @param sortBy Sort directions per field that is `sortable: true`\n * @param columns Array of all columns in the grid\n * @param emit The `bento-data-grid` emit function\n */\nexport const useSorter = (\n sortBy: Ref<Array<BentoDatagridSortByColumn>>,\n columns: Ref<Array<BentoColumn>>,\n emit: (event: 'sort', updatedSortBy: Array<BentoDatagridSortByColumn>) => void\n) => {\n const isSorting = (field: string) => sortBy.value.some(sortedCol => sortedCol.field === field);\n\n const getSortingDirection = (field: string) => sortBy.value.find(sortedCol => sortedCol.field === field)?.direction;\n\n // The column head click event to sort data by certain field and direction\n const sortByColumnField = (field: string) => {\n // First check if column is sortable\n if (!columns.value.some(col => col.field === field && col.sortable)) {\n return;\n }\n\n // Return the updated sortBy array of sorted columns\n const newColumnSort: BentoDatagridSortByColumn = {\n field,\n direction:\n sortBy.value.find(sortedCol => sortedCol.field === field)?.direction ===\n BentoDatagridSortDirection.ASCENDING\n ? BentoDatagridSortDirection.DESCENDING\n : BentoDatagridSortDirection.ASCENDING,\n };\n\n const updatedSortBy = [newColumnSort];\n\n emit('sort', updatedSortBy);\n };\n\n return { isSorting, getSortingDirection, sortByColumnField };\n};\n","import { EventKey } from '@/types/utils-events';\n\nexport enum BentoDatagridNavigationKey {\n ARROW_DOWN = EventKey.ARROW_DOWN,\n ARROW_UP = EventKey.ARROW_UP,\n ARROW_LEFT = EventKey.ARROW_LEFT,\n ARROW_RIGHT = EventKey.ARROW_RIGHT,\n PAGE_UP = EventKey.PAGE_UP,\n PAGE_DOWN = EventKey.PAGE_DOWN,\n END = EventKey.END,\n HOME = EventKey.HOME,\n}\n","import { computed, type Ref } from 'vue';\nimport { BentoDatagridNavigationKey } from './use-keyboard-navigator.types';\nimport type { DatagridColumnsHeaderReferences } from '../../components/data-grid-columns/data-grid-columns.types';\nimport type { BentoColumn } from '../../data-grid.types';\n\n/**\n * Row action column field name\n */\nexport const DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME = 'b-row-actions-column';\n\n/**\n * A composable that handles all the keyboard navigation logic within the data-grid.\n * This provide grid navigation by moving focus among the column headers and data cells of the grid using the keyboard\n * @param gridcellRefs Array of references to the HTML elements of the cells.\n * @param columns The reference to the array of column configurations\n * @param selectable The reference to the selectable prop that enable row to be selected via a checkbox.\n */\nexport const useKeyboardNavigator = (\n gridcellRefs: Ref<{ [key: string]: Array<HTMLDivElement> }>,\n columnHeaderRefs: Ref<DatagridColumnsHeaderReferences>,\n columns: Ref<Array<BentoColumn>>,\n selectable: Ref<boolean>,\n rowActions: Ref<boolean>,\n hasColumnPanel: Ref<boolean>\n) => {\n const hasColumnActions = computed(() => {\n if (hasColumnPanel.value || selectable.value) {\n return true;\n }\n\n return columns.value.some((column: BentoColumn) => column.infoIconTooltip || column.sortable);\n });\n const visibleColumns = computed(() => {\n let visibleColumnsFromValue = columns.value.filter(({ visible }) => visible !== false);\n if (rowActions.value) {\n visibleColumnsFromValue = [\n ...visibleColumnsFromValue,\n { field: DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME, label: '' } as BentoColumn,\n ];\n }\n return visibleColumnsFromValue;\n });\n\n // Count the number of visible columns\n const visibleColumnsCount = computed(() => visibleColumns.value.length);\n\n const sortedColumnHeaderAndGridCellRefs = computed(() => {\n if (!gridcellRefs.value) {\n return [];\n }\n\n const firstColumnKey = Object.keys(gridcellRefs.value)[0];\n if (!firstColumnKey || !gridcellRefs.value[firstColumnKey]) {\n return [];\n }\n\n const cells: Array<HTMLDivElement> = [];\n\n if (hasColumnActions.value) {\n // Column header cells\n for (const column of visibleColumns.value) {\n const columnCoumnHeaderCell = columnHeaderRefs.value[column.field];\n cells.push(columnCoumnHeaderCell);\n }\n }\n\n // Data cell\n const numRows = gridcellRefs.value[firstColumnKey].length;\n for (let rowIndex = 0; rowIndex < numRows; rowIndex++) {\n for (const column of visibleColumns.value) {\n const columnCells = gridcellRefs.value[column.field];\n if (columnCells?.[rowIndex]) {\n cells.push(columnCells[rowIndex]);\n }\n }\n }\n\n return cells;\n });\n\n // Returns the index of the row that a given cell is found\n const getCurrentRowIndex = (currentIndex: number) => Math.floor(currentIndex / visibleColumnsCount.value);\n\n /**\n * Calculates the next focused cell index for edge navigation keys (e.g., Home, End, Page Up, Page Down).\n *\n * Note: Some keys will only navigate to data cells and not the column headers,\n * following the W3C data grid pattern.\n *\n * @param currentIndex The index of the currently focused cell.\n * @param direction The navigation key pressed.\n * @param ctrlKey Whether the Ctrl key was pressed.\n * @returns The index of the next cell to focus.\n */\n const getEdgeCellIndex = (currentIndex: number, direction: BentoDatagridNavigationKey, ctrlKey: boolean) => {\n const lastCellIndex = sortedColumnHeaderAndGridCellRefs.value.length - 1;\n const lastColumnIndex = visibleColumnsCount.value - 1;\n const currentRowIndex = getCurrentRowIndex(currentIndex);\n const currentColumn = currentIndex - visibleColumnsCount.value * currentRowIndex;\n\n const cellIndexByDirection = {\n [BentoDatagridNavigationKey.PAGE_UP]:\n currentColumn + (hasColumnActions.value ? visibleColumnsCount.value : 0),\n [BentoDatagridNavigationKey.PAGE_DOWN]: lastCellIndex - lastColumnIndex + currentColumn,\n [BentoDatagridNavigationKey.END]: ctrlKey\n ? lastCellIndex\n : visibleColumnsCount.value * currentRowIndex + lastColumnIndex,\n [BentoDatagridNavigationKey.HOME]: ctrlKey\n ? hasColumnActions.value\n ? visibleColumnsCount.value\n : 0\n : visibleColumnsCount.value * currentRowIndex,\n };\n\n return cellIndexByDirection[direction];\n };\n\n // Calculates the next focused cell index when users navigates using keys to navigate cell by cell\n // e.g. Arrow Right, Arrow Left, Arrow Up, Arrow Down\n const getCellIndex = (currentIndex: number, direction: BentoDatagridNavigationKey) => {\n const currentRowIndex = getCurrentRowIndex(currentIndex);\n\n const directionDiffMap = {\n [BentoDatagridNavigationKey.ARROW_DOWN]: visibleColumnsCount.value,\n [BentoDatagridNavigationKey.ARROW_UP]:\n currentRowIndex === 0 && !hasColumnActions.value ? 0 : -visibleColumnsCount.value,\n [BentoDatagridNavigationKey.ARROW_LEFT]: -1,\n [BentoDatagridNavigationKey.ARROW_RIGHT]: 1,\n };\n\n const directionDiff = directionDiffMap[direction];\n const newCellIndex = currentIndex + directionDiff;\n\n if (newCellIndex < 0 || newCellIndex >= sortedColumnHeaderAndGridCellRefs.value.length) {\n return currentIndex;\n }\n\n return newCellIndex;\n };\n\n // Verifies if a key is used to navigate on the edges of the data-grid\n const isEdgeNavigationKeyCode = (keyCode: BentoDatagridNavigationKey) =>\n [\n BentoDatagridNavigationKey.PAGE_UP,\n BentoDatagridNavigationKey.PAGE_DOWN,\n BentoDatagridNavigationKey.END,\n BentoDatagridNavigationKey.HOME,\n ].includes(keyCode);\n\n // Returns the next cell to be focused based on the keys pressed by the user\n const getTargetCellIndex = (\n target: EventTarget,\n directionKeyCode: BentoDatagridNavigationKey,\n ctrlKey: boolean\n ): number => {\n const currentCellIndex = sortedColumnHeaderAndGridCellRefs.value.indexOf(target as HTMLDivElement);\n\n if (isEdgeNavigationKeyCode(directionKeyCode)) {\n return getEdgeCellIndex(currentCellIndex, directionKeyCode, ctrlKey);\n }\n\n return getCellIndex(currentCellIndex, directionKeyCode);\n };\n\n // Find the next cell to be focused and apply the focus on it\n const focusOnNextGridcell = (target: EventTarget, key: BentoDatagridNavigationKey, ctrlKey: boolean) => {\n if (!sortedColumnHeaderAndGridCellRefs.value.includes(target as HTMLDivElement)) {\n return;\n }\n\n const cellIndex = getTargetCellIndex(target, key, ctrlKey);\n sortedColumnHeaderAndGridCellRefs.value[cellIndex].focus();\n };\n\n // Verifies if a key is used to navigate on the data-grid\n const isNavigationKeyCode = (key: string) => key in BentoDatagridNavigationKey;\n\n // On keyboard input for DataGrid row elements\n const navigationInput = (event: KeyboardEvent) => {\n const { ctrlKey, key, target } = event;\n const dataGridKeyboardNavigationsKey = key as BentoDatagridNavigationKey;\n\n let parentGridCell = target as HTMLDivElement;\n // If we're navigating inside a menu then don't change focus\n if (parentGridCell.getAttribute('role') === 'menuitem') {\n return;\n }\n if (!sortedColumnHeaderAndGridCellRefs.value.includes(parentGridCell)) {\n parentGridCell = (target as HTMLDivElement).closest('[role=\"gridcell\"], [role=\"columnheader\"]');\n }\n\n if (\n sortedColumnHeaderAndGridCellRefs.value.includes(parentGridCell) &&\n isNavigationKeyCode(dataGridKeyboardNavigationsKey)\n ) {\n focusOnNextGridcell(parentGridCell, dataGridKeyboardNavigationsKey, ctrlKey);\n }\n };\n\n return {\n isNavigationKeyCode,\n focusOnNextGridcell,\n navigationInput,\n };\n};\n","import { computed, ref, watch } from 'vue';\nimport { type SetupContext } from 'vue/types/v3-setup-context';\nimport { type BentoLazyLoadType } from '@/types/lazy-load';\nimport { type MaybeRef } from '@/types/maybe-ref';\nimport { BentoDatagridEvent } from '../../data-grid.types';\n\n/**\n * The percentage of how much height of the element that has been scrolled before a\n * `BentoDatagridEvent.UPDATE_SHOW_MORE` event is emitted.\n */\nconst LAZY_LOAD_BUFFER_PERCENTAGE = 90;\n\n/**\n * Handles the \"lazy load\" logic for the DataGrid so the data can be\n * loaded. If `lazyLoadTypeRef` is set to automatic, then the event `update:show-more`\n * is triggered when the scroll gets to the bottom of the DataGrid.\n *\n * @param lazyLoadTypeRef Lazy load type: automatic, button or none\n * @param verticalScrollPositionRef Current vertical position of the scroll\n * @param bodyRef Ref to the `bento-data-grid` body container\n * @param emit The `bento-data-grid` emit function\n */\nexport const useLazyLoading = (\n lazyLoadTypeRef: MaybeRef<BentoLazyLoadType>,\n verticalScrollPositionRef: MaybeRef<number>,\n bodyRef: MaybeRef<HTMLDivElement | undefined>,\n loading: MaybeRef<boolean>,\n emit: SetupContext['emit']\n) => {\n const lazyLoadType = ref(lazyLoadTypeRef);\n const verticalScrollPosition = ref(verticalScrollPositionRef);\n const body = ref(bodyRef);\n const isLoading = ref(loading);\n\n const isLazyLoad = computed(() => lazyLoadType.value !== 'none');\n\n const isInfiniteScroll = computed(() => lazyLoadType.value === 'automatic');\n\n const emitLazyLoadEvent = () => {\n emit(BentoDatagridEvent.UPDATE_SHOW_MORE);\n };\n\n watch(\n () => verticalScrollPosition.value,\n () => {\n if (isInfiniteScroll.value) {\n const height = body.value.offsetHeight;\n const percentageOffset = (height / verticalScrollPosition.value) * 100;\n if (percentageOffset > LAZY_LOAD_BUFFER_PERCENTAGE && !isLoading.value) {\n emitLazyLoadEvent();\n }\n }\n }\n );\n\n return { isLazyLoad, isInfiniteScroll, verticalScrollPosition, emitLazyLoadEvent };\n};\n","import { computed, reactive, ref } from 'vue';\nimport { type MaybeRef } from '@/types/maybe-ref';\nimport { type BentoColumn, BentoDatagridEvent } from '../../data-grid.types';\nimport type { SetupContext } from 'vue/types/v3-setup-context';\nimport {\n type BentoDatagridDraggingColumnState,\n DatagridColumnsEvent,\n} from '@/components/data-grid/components/data-grid-columns/data-grid-columns.types';\n\n/**\n * A composable that handles all the column dragging logic.\n * This allows users to re-arrange the column order.\n * @param columnsRef The reference to the array of columns.\n * @param hasDraggableColumnsRef The reference to the hasDraggableColumns prop.\n * @param emit The Datagrid emit function.\n */\nexport const useColumnReorderer = (\n columnsRef: MaybeRef<Array<BentoColumn>>,\n hasDraggableColumnsRef: MaybeRef<boolean>,\n emit: SetupContext['emit']\n) => {\n const columns = ref(columnsRef);\n const hasDraggableColumns = ref(hasDraggableColumnsRef);\n\n const draggingColumns = reactive<BentoDatagridDraggingColumnState>({\n dragging: null,\n dragToLeft: null,\n target: null,\n });\n\n const onMoveColumnByOffset = (movingColumn: BentoColumn, offset = 0) => {\n const fromIndex = columns.value.findIndex(c => c.field === movingColumn.field);\n const toIndex = fromIndex + offset;\n if (toIndex < 0 || toIndex > columns.value.length - 1) {\n return;\n }\n\n // If the move is inside the bounds of the columns array, we can move\n // const toColumn = columns.value[toIndex];\n const reorderedColumns = [...columns.value];\n reorderedColumns.splice(toIndex, 0, reorderedColumns.splice(fromIndex, 1)[0]);\n\n emit(BentoDatagridEvent.COLUMNS, reorderedColumns);\n emit(BentoDatagridEvent.UPDATE_COLUMNS, reorderedColumns);\n };\n\n const onDragStart = (column: BentoColumn, e: DragEvent & Event) => {\n draggingColumns.dragging = column;\n e.dataTransfer.setData('text', ''); // dataTransfer needed for firefox\n e.dataTransfer.dropEffect = 'move';\n };\n\n const onDragEnter = (column: BentoColumn, dragEvent: DragEvent) => {\n draggingColumns.target = column;\n const targetRect = (dragEvent.currentTarget as HTMLElement).getBoundingClientRect();\n const midpoint = targetRect.left + targetRect.width / 2;\n const clientX = dragEvent.clientX ?? 0;\n draggingColumns.dragToLeft = clientX <= midpoint;\n };\n\n const onDrop = (column: BentoColumn) => {\n if (draggingColumns.dragging?.field !== column.field) {\n // Re-order columns\n const fromIndex = columns.value.findIndex(c => c.field === draggingColumns.dragging?.field);\n const toIndexInitial = columns.value.findIndex(c => c.field === column.field);\n const toIndex = draggingColumns.dragToLeft ? toIndexInitial : toIndexInitial + 1;\n const toLeftOfToIndex = toIndex > fromIndex ? toIndex - 1 : toIndex;\n let reorderedColumns = [...columns.value];\n\n reorderedColumns.splice(\n toLeftOfToIndex === -1 ? 0 : toLeftOfToIndex,\n 0,\n reorderedColumns.splice(fromIndex, 1)[0]\n );\n\n const firstUnfrozenColumn = columns.value.findIndex(c => !c?.frozen);\n // Make sure to change the frozen state of the dragged column to the column the user is dropping on\n // However don't change the state if we are dragging over the first un-frozen column\n if (draggingColumns.dragging?.frozen !== column.frozen && toIndex !== firstUnfrozenColumn) {\n reorderedColumns = reorderedColumns.map(col =>\n draggingColumns.dragging?.field === col.field ? { ...col, frozen: !!column?.frozen } : col\n );\n }\n\n emit(BentoDatagridEvent.COLUMNS, reorderedColumns);\n emit(BentoDatagridEvent.UPDATE_COLUMNS, reorderedColumns);\n }\n\n draggingColumns.dragging = null;\n draggingColumns.target = null;\n };\n\n const onDragEnd = () => {\n draggingColumns.dragging = null;\n draggingColumns.dragToLeft = null;\n draggingColumns.target = null;\n };\n\n // Drag events for the `data-grid-columns`\n const draggingEventsForColumns = computed(() => {\n if (!hasDraggableColumns.value) {\n return {};\n }\n\n return {\n [DatagridColumnsEvent.COLUMN_DRAG_START]: (column: BentoColumn, e: DragEvent & Event) =>\n onDragStart(column, e),\n [DatagridColumnsEvent.COLUMN_DRAG_ENTER]: (column: BentoColumn, dragEvent: DragEvent) =>\n onDragEnter(column, dragEvent),\n [DatagridColumnsEvent.COLUMN_DROP]: (column: BentoColumn) => onDrop(column),\n [DatagridColumnsEvent.COLUMN_DRAG_END]: () => onDragEnd(),\n };\n });\n\n // Drag events for row cell\n const draggingEventsForRowCell = computed(() => (column: BentoColumn) => {\n if (!hasDraggableColumns.value) {\n return {};\n }\n\n return {\n dragenter: (e: DragEvent) => {\n e.preventDefault();\n onDragEnter(column, e);\n },\n drop: () => {\n onDrop(column);\n },\n dragover: (e: DragEvent) => {\n e.preventDefault();\n },\n };\n });\n\n return {\n // Values\n draggingColumns,\n\n // Methods\n draggingEventsForColumns,\n draggingEventsForRowCell,\n onMoveColumnByOffset,\n };\n};\n","import { type MaybeRef } from '@/types/maybe-ref';\nimport { type BentoColumn, BentoDatagridEvent } from '../../data-grid.types';\nimport { computed, type Ref, ref, watch } from 'vue';\nimport { DATAGRID_ACTIONS_COLUMN_FIELD_NAME } from '../use-calculate-column-width/use-calculate-column-width';\nimport type { SetupContext } from 'vue/types/v3-setup-context';\nimport { type DatagridConfigSettingsColumnSets } from './use-config.settings.types';\n\n/**\n * All Datagrid configuration settings logic:\n * - Condensed view toggle\n * - Frozen / unfrozen columns sorting and column sets\n * - Emitting a new array of colums with a new updated column\n * - Emitting new updated array of columns\n *\n * @param condensed Initial state of condensed view toggle\n * @param emit The `bento-data-grid` emit function\n * @returns Condensed view data & event handler\n */\nexport const useConfigSettings = (\n columnsRef: MaybeRef<Array<BentoColumn>>,\n isZebraRowsRef: Ref<boolean>,\n emit: SetupContext['emit']\n) => {\n const columns = ref(columnsRef);\n const internalZebraRows = ref(isZebraRowsRef.value);\n\n // Frozen and unfrozen columns\n const sortedColumnsByFreezeState = computed(() =>\n [...columns.value].sort((a, b) => {\n if (a.frozen === b.frozen) {\n return 0;\n }\n return a.frozen ? -1 : 1;\n })\n );\n const frozenColumns = computed(() =>\n sortedColumnsByFreezeState.value.filter(col => col.frozen && col.visible !== false)\n );\n const unfrozenColumns = computed(() =>\n sortedColumnsByFreezeState.value.filter(col => !col.frozen && col.visible !== false)\n );\n const columnSets = computed<DatagridConfigSettingsColumnSets>(() =>\n [\n { columnSet: frozenColumns.value, id: 'frozen', isFrozenColumns: true },\n { columnSet: unfrozenColumns.value, id: 'unfrozen' },\n ].filter(({ columnSet }) => columnSet.length)\n );\n const isOnlyOneVisibleColumn = computed(\n () =>\n columns.value.filter(col => col?.visible !== false && col?.field !== DATAGRID_ACTIONS_COLUMN_FIELD_NAME)\n .length === 1\n );\n\n const onConfigSettingsCondensedUpdate = (isCondensedView: boolean) =>\n emit(BentoDatagridEvent.UPDATE_CONDENSED, isCondensedView);\n\n const onConfigSettingsZebraRowsUpdate = (isZebraRows: boolean) => {\n internalZebraRows.value = isZebraRows;\n emit(BentoDatagridEvent.UPDATE_ZEBRA_ROWS, isZebraRows);\n };\n\n // Emits an updated array of columns\n const onConfigSettingsColumnsUpdate = (newColumns: Array<BentoColumn>) => {\n emit(BentoDatagridEvent.COLUMNS, newColumns);\n emit(BentoDatagridEvent.UPDATE_COLUMNS, newColumns);\n };\n\n // Updates and then emits an updated array of columns\n const onConfigSettingsColumnUpdate = (updatedColumn: BentoColumn) => {\n const updatedColumns = sortedColumnsByFreezeState.value.map(col =>\n col?.field === updatedColumn.field ? updatedColumn : col\n );\n onConfigSettingsColumnsUpdate(updatedColumns);\n };\n\n watch(isZebraRowsRef, newValue => {\n internalZebraRows.value = newValue;\n });\n\n return {\n // Values\n columnSets,\n isOnlyOneVisibleColumn,\n internalZebraRows,\n sortedColumns: sortedColumnsByFreezeState,\n\n // Methods\n onConfigSettingsColumnsUpdate,\n onConfigSettingsColumnUpdate,\n onConfigSettingsCondensedUpdate,\n onConfigSettingsZebraRowsUpdate,\n };\n};\n","import { computed, nextTick, onMounted, ref, type Ref, type UnwrapRef, watch } from 'vue';\nimport { isVue3 } from 'vue-demi';\nimport type { BentoDatagridPaginationProps } from '@/components/data-grid/data-grid.types';\n\n/**\n * Handles all scroll events & logic for the DataGrid.\n * @param body The reference to the DataGrid body element.\n * @param columnsRef The reference to the row of column headers element.\n * @param verticalScrollPosition The reference to scroll top position number.\n * @returns Update methods for updating the scroll ppsotion references & the body scroll & overflow attributes.\n */\nexport const useScroller = (\n body: Ref<UnwrapRef<HTMLDivElement>>,\n columnsRef: Ref<UnwrapRef<HTMLDivElement>>,\n verticalScrollPosition: Ref<number>,\n virtualHorizontalScrollbar: Ref<UnwrapRef<HTMLDivElement | undefined>>,\n paginationContainerRef: Ref<UnwrapRef<HTMLDivElement | undefined>>,\n totalWidthOfAllColumns: Ref<number>,\n options?: {\n isLazyLoad?: Ref<UnwrapRef<boolean>>;\n pagination?: Ref<UnwrapRef<BentoDatagridPaginationProps | undefined>>;\n stickyPagination: Ref<UnwrapRef<boolean>>;\n isDataGridTemplate?: boolean;\n }\n) => {\n const scrollLeftPosition = ref(0);\n const hasLeftOverflow = ref(false);\n const hasRightOverflow = ref(false);\n\n /* eslint-disable no-param-reassign */\n /* == Scrolling == */\n // Sync body and column headers scrolling\n watch([() => scrollLeftPosition.value, () => totalWidthOfAllColumns.value], ([currentScrollLeftPosition]) => {\n body.value.scrollLeft = currentScrollLeftPosition;\n columnsRef.value.scrollLeft = currentScrollLeftPosition;\n hasLeftOverflow.value = !!currentScrollLeftPosition;\n hasRightOverflow.value =\n columnsRef.value.scrollWidth - columnsRef.value.offsetWidth > currentScrollLeftPosition;\n });\n\n onMounted(async () => {\n await nextTick();\n // Because there is an extra nextTick() for vue3 when rendering fluid columns in `use-calculate-column-width`,\n // we also need to wait an extra tick here in order to get the right widths\n if (isVue3) {\n await nextTick();\n }\n if (columnsRef.value?.offsetWidth < columnsRef.value?.scrollWidth) {\n hasRightOverflow.value = true;\n }\n });\n\n const updateScrollPosition = (event: Event) => {\n scrollLeftPosition.value = (event.target as HTMLDivElement).scrollLeft;\n verticalScrollPosition.value = body.value.scrollHeight - (event.target as HTMLDivElement).scrollTop;\n\n if (virtualHorizontalScrollbar?.value) {\n const scrollLeftPos = (event.target as HTMLDivElement).scrollLeft;\n if (virtualHorizontalScrollbar.value.scrollLeft !== scrollLeftPos) {\n virtualHorizontalScrollbar.value.scrollLeft = scrollLeftPos;\n }\n }\n };\n\n const updateScrollPositionOnFrozenColumnsNavigation = (event: KeyboardEvent) => {\n if (event.key === 'Tab' || (event.key !== 'ArrowRight' && event.key !== 'ArrowLeft')) {\n return;\n }\n event.preventDefault();\n\n body.value.scrollLeft = 0;\n // Using setTimeout to override the browser behavior of scrolling the parent element when a child is focused\n body.value.style.overflowX = 'hidden';\n setTimeout(() => {\n if (body.value) {\n body.value.style.overflowX = 'auto';\n }\n });\n };\n\n // Virtual Horizontal scroller that is stickied\n const syncVirtualScrollerWithBody = (event: Event) => {\n const scrollLeftPos = (event.target as HTMLDivElement).scrollLeft;\n if (body.value.scrollLeft !== scrollLeftPos) {\n body.value.scrollLeft = scrollLeftPos;\n }\n };\n /* eslint-enable no-param-reassign */\n const horizontalScrollbarConditionalStyles = computed(() => {\n if (\n options?.pagination?.value &&\n (options?.stickyPagination?.value || options?.isDataGridTemplate) &&\n !options?.isLazyLoad?.value\n ) {\n return { bottom: `${(paginationContainerRef.value?.clientHeight ?? 0) + 1}px` };\n }\n return {};\n });\n\n return {\n // Values\n scrollLeftPosition,\n hasLeftOverflow,\n hasRightOverflow,\n horizontalScrollbarConditionalStyles,\n\n // Methods\n updateScrollPosition,\n updateScrollPositionOnFrozenColumnsNavigation,\n syncVirtualScrollerWithBody,\n };\n};\n","import { computed, type Ref, ref } from 'vue';\nimport { DATAGRID_ACTIONS_COLUMN_FIELD_NAME } from '../use-calculate-column-width';\nimport type { BentoColumn } from '@/components/data-grid/components/data-grid-columns/data-grid-columns.types';\nimport type { DatagridConfigSettingsColumnSets } from '../use-config-settings/use-config.settings.types';\nimport type { DatagridColumnHoveringState } from './use-column-hovering.types';\n\nexport const useColumnHovering = (\n columnSets: Ref<DatagridConfigSettingsColumnSets>,\n selectable: Ref<boolean>,\n outline: Ref<boolean>,\n isTotalWidthOfColumnsTakingUpAllAvailableGridWidth: Ref<boolean>\n) => {\n const hoveredOverColumn = ref<BentoColumn>(null);\n const hoveredOverColumnState = computed<DatagridColumnHoveringState>(() => {\n if (!hoveredOverColumn.value || hoveredOverColumn.value.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME) {\n return {\n hoveredOverColumnField: '',\n isSeparatorOffset: false,\n noBorderLeft: false,\n noBorderRight: false,\n };\n }\n\n const frozenColumnSet = columnSets.value\n .find(colSet => colSet.isFrozenColumns)\n ?.columnSet?.filter(col => col.field !== DATAGRID_ACTIONS_COLUMN_FIELD_NAME);\n const unFrozenColumnSet = columnSets.value.find(colSet => !colSet?.isFrozenColumns);\n\n const isFirstFrozenColumn =\n hoveredOverColumn.value.frozen && frozenColumnSet?.[0].field === hoveredOverColumn.value.field;\n const isFirstUnfrozenColumn =\n !hoveredOverColumn.value.frozen &&\n unFrozenColumnSet?.columnSet?.[0].field === hoveredOverColumn.value.field;\n\n // Cases where no left border should be shown\n // If Frozen, selectable off, outline on, first column\n const isFrozenSelectableOutlineOnFirstCol = (selectable.value || outline.value) && isFirstFrozenColumn;\n // If No frozen columns & not frozen, selectable off, outline on, first column\n const isNoFrozenColAndNotFrozenSelectableOutlineOnFirstCol =\n (selectable.value || outline.value) && !frozenColumnSet && isFirstUnfrozenColumn;\n // If are frozen columns & not frozen, first column\n const isFrozenColumnsAndNotFrozenFirstColumn = frozenColumnSet && isFirstUnfrozenColumn;\n\n // Cases where no right border should be shown\n // If frozen column, last column\n const isFrozenColumnsAndLastFrozenColumn =\n frozenColumnSet?.length > 0 &&\n hoveredOverColumn.value.frozen &&\n frozenColumnSet?.[frozenColumnSet.length - 1].field === hoveredOverColumn.value.field;\n // If outline is on, all columns are taking up width of the grid container and is last column\n const isOutlineOnAllColumnWidthFitContainerAndLastColumn =\n outline.value &&\n isTotalWidthOfColumnsTakingUpAllAvailableGridWidth.value &&\n !hoveredOverColumn.value.frozen &&\n unFrozenColumnSet?.columnSet?.[unFrozenColumnSet.columnSet.length - 1].field ===\n hoveredOverColumn.value.field;\n\n return {\n hoveredOverColumnField: hoveredOverColumn.value.field,\n isSeparatorOffset: isOutlineOnAllColumnWidthFitContainerAndLastColumn,\n noBorderLeft:\n !!isFrozenSelectableOutlineOnFirstCol ||\n !!isNoFrozenColAndNotFrozenSelectableOutlineOnFirstCol ||\n !!isFrozenColumnsAndNotFrozenFirstColumn,\n\n noBorderRight: !!isFrozenColumnsAndLastFrozenColumn || !!isOutlineOnAllColumnWidthFitContainerAndLastColumn,\n };\n });\n\n return {\n hoveredOverColumn,\n hoveredOverColumnState,\n };\n};\n\nexport default useColumnHovering;\n","import { getFocusableIn } from 'focus-lock';\n\n/**\n * Finds and focuses the first interactive child element within a given parent element.\n * @param childEl The parent HTML element to search for focusable children.\n * @returns `true` if a focusable element was found and focused, otherwise `false`.\n */\nexport const focusOnInteractiveChild = (childEl: HTMLElement) => {\n const focusableElements = getFocusableIn(childEl);\n const removedParentNodeFromList = focusableElements.filter(el => el.node !== childEl);\n\n if (removedParentNodeFromList?.length > 0) {\n removedParentNodeFromList[0].node.focus();\n return true;\n }\n return false;\n};\n\n/**\n * Finds all interactive child elements within a given parent element and makes them unfocusable.\n * This is achieved by setting their `tabindex` attribute to `-1`.\n * @param childEl The parent HTML element to search for focusable children.\n * @returns An array of the elements that were made unfocusable, or `undefined` if no focusable children were found.\n */\nexport const makeAllInteractiveChildrenUnFocusable = (childEl: HTMLElement): Array<{ node: HTMLElement }> | undefined => {\n const focusableElements = getFocusableIn(childEl);\n const removedParentNodeFromList = focusableElements?.filter(el => el.node !== childEl);\n\n if (removedParentNodeFromList?.length > 0) {\n removedParentNodeFromList.forEach(el => el.node.setAttribute('tabindex', '-1'));\n return removedParentNodeFromList;\n }\n return undefined;\n};\n\n/**\n * Makes a list of HTML elements focusable by setting their `tabindex` attribute to '0'.\n * @param focusNodes An array of objects, where each object contains a `node` property that is an HTMLElement.\n */\nexport const makeAllInteractiveChildrenFocusable = (focusNodes: Array<{ node: HTMLElement }>) => {\n if (focusNodes?.length > 0) {\n focusNodes.forEach(el => el?.node.setAttribute('tabindex', '0'));\n }\n};\n","export const handleClipboard = () => {\n const selectedContent = window.getSelection().getRangeAt(0).cloneContents();\n\n const rows = selectedContent.querySelectorAll('[role=\"row\"]');\n let tableCopy = '<table>';\n let plainCopy = '';\n\n const parseCells = (cells: NodeListOf<Element>) => {\n cells.forEach(cell => {\n const tag = cell.closest('[role]').getAttribute('role') === 'gridcell' ? 'td' : 'th';\n const text = (cell as HTMLElement).textContent.trim();\n if (text) {\n tableCopy += `<${tag}>${text}</${tag}>`;\n plainCopy += `${text}\\t`;\n }\n });\n };\n\n if (!rows.length) {\n const cells = selectedContent.querySelectorAll(\n '[role=\"gridcell\"] > .b-typography:first-of-type, [role=\"columnheader\"] .b-typography'\n );\n\n if (cells.length) {\n tableCopy += '<tr>';\n parseCells(cells);\n tableCopy += '</tr>';\n } else {\n navigator.clipboard.writeText(selectedContent.textContent);\n return;\n }\n }\n\n rows.forEach(row => {\n const cells = row.querySelectorAll(\n '[role=\"gridcell\"] > .b-typography:first-of-type, [role=\"columnheader\"] .b-typography'\n );\n tableCopy += '<tr>';\n if (cells.length) {\n parseCells(cells);\n } else {\n const text = (row as HTMLElement).textContent.trim();\n tableCopy += `<td>${text}</td>`;\n plainCopy += `${text}\\t`;\n }\n tableCopy += '</tr>';\n plainCopy += '\\n';\n });\n\n tableCopy += '</table>';\n\n navigator.clipboard.write([\n new ClipboardItem({\n 'text/html': new Blob([tableCopy], { type: 'text/html' }),\n 'text/plain': new Blob([plainCopy || selectedContent.textContent.trim()], { type: 'text/plain' }),\n }),\n ]);\n};\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><g fill=\"#001222\" :clip-path=\"'url(#uia-ui-assets/icons-16-arrow_up_down_sort__a' + uuid + ')'\"><path d=\"M9.06077 4.00011L5.00011 -0.0605469L0.939453 4.00011L2.00011 5.06077L4.25 2.81089V10.75H5.75V2.81066L8.00011 5.06077L9.06077 4.00011Z\"/><path d=\"M10.25 13.1893L8.00011 10.9395L6.93945 12.0001L11.0001 16.0608L15.0608 12.0001L14.0001 10.9395L11.75 13.1896V5.25H10.25V13.1893Z\"/></g><defs><clipPath :id=\"'uia-ui-assets/icons-16-arrow_up_down_sort__a' + uuid\"><rect width=\"16\" height=\"16\" fill=\"#fff\"/></clipPath></defs></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><path fill=\"#001222\" d=\"M12.1933 8.7454L7.93903 12.9996L8.99969 14.0603L15.0604 7.99963L8.99969 1.93896L7.93903 2.99963L12.1848 7.24541L1.24902 7.25658L1.25056 8.75658L12.1933 8.7454Z\"/></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><g :clip-path=\"'url(#uia-ui-assets/icons-16-freeze__a' + uuid + ')'\"><path fill=\"#001222\" d=\"M10.5605 14.5L9.94434 13.8838C9.6002 13.5397 9.18722 13.3072 8.75 13.1836V10.9336L10.1689 10.1162L11.6865 10.9941L12.1094 12.5605C12.1146 12.5821 12.1182 12.6044 12.124 12.626L12.1553 12.7441L12.3496 13.4688L13.7988 13.0801L13.6162 12.4004L13.6201 12.3984L13.5547 12.1592C13.4254 11.5178 13.8153 10.878 14.4561 10.7061L14.5742 10.6748L15.2988 10.4805L14.9102 9.03125L14.2295 9.21387L14.2285 9.20996L13.5049 9.40625L12.4346 9.69531L10.9199 8.81836V7.18262L12.8633 6.05762C13.1889 6.37496 13.597 6.61697 14.0674 6.74316L14.1855 6.77441L14.9102 6.96875L15.2988 5.52051L14.5742 5.32617L14.4561 5.29395C13.7894 5.11503 13.3935 4.4294 13.5723 3.7627L13.6045 3.64453L13.7988 2.91992L12.3496 2.53125L12.1553 3.25586L12.124 3.37402C11.9979 3.84406 12.0018 4.31824 12.1133 4.75879L10.1689 5.88477L8.75 5.06738V2.81738C9.18731 2.69384 9.60013 2.46036 9.94434 2.11621L10.5605 1.5L9.5 0.439453L8.88379 1.05566C8.39567 1.54362 7.60433 1.54362 7.11621 1.05566L6.5 0.439453L5.43945 1.5L6.05566 2.11621C6.39987 2.46036 6.81269 2.69384 7.25 2.81738V5.06738L5.83105 5.88477L3.88574 4.75879C3.99724 4.31819 4.00207 3.84412 3.87598 3.37402L3.84473 3.25586L3.65039 2.53125L2.20117 2.91992L2.39551 3.64453L2.42773 3.7627C2.60651 4.42942 2.21066 5.11507 1.54395 5.29395L1.42578 5.32617L0.701172 5.52051L1.08984 6.96875L1.81445 6.77441L1.93262 6.74316C2.40275 6.61703 2.81018 6.37474 3.13574 6.05762L5.08008 7.18262V8.81836L3.13574 9.94336C2.81015 9.62622 2.40287 9.38399 1.93262 9.25781L1.81445 9.22559L1.08984 9.03125L0.701172 10.4805L1.42578 10.6748L1.54395 10.7061C2.2106 10.8849 2.60644 11.5706 2.42773 12.2373L2.39551 12.3555L2.20117 13.0801L3.65039 13.4688L3.84473 12.7441L3.87598 12.626C4.00207 12.1559 3.99723 11.6817 3.88574 11.2412L5.83105 10.1162L7.25 10.9336V13.1836C6.81278 13.3072 6.3998 13.5397 6.05566 13.8838L5.43945 14.5L6.5 15.5605L7.11621 14.9443C7.60433 14.4564 8.39567 14.4564 8.88379 14.9443L9.5 15.5605L10.5605 14.5ZM6.58008 8.81641V7.18262L8 6.36426L9.41992 7.18262V8.81641L8 9.63477L6.58008 8.81641Z\"/></g><defs><clipPath :id=\"'uia-ui-assets/icons-16-freeze__a' + uuid\"><rect width=\"16\" height=\"16\" fill=\"#fff\" transform=\"matrix(1 0 0 -1 0 16)\"/></clipPath></defs></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><g fill=\"#001222\" :clip-path=\"'url(#uia-ui-assets/icons-16-sort_ascending__a' + uuid + ')'\"><path d=\"M12.0001 1.93945L16.0608 6.00011L15.0001 7.06077L12.75 4.81066V12.75H11.25V4.81089L9.00011 7.06077L7.93945 6.00011L12.0001 1.93945Z\"/><path d=\"M6.75 7.25H1.25V8.75H6.75V7.25Z\"/><path d=\"M1.25 11.25H8.75V12.75H1.25V11.25Z\"/><path d=\"M6.75 3.25H1.25V4.75H6.75V3.25Z\"/></g><defs><clipPath :id=\"'uia-ui-assets/icons-16-sort_ascending__a' + uuid\"><rect width=\"16\" height=\"16\" fill=\"#fff\"/></clipPath></defs></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><g fill=\"#001222\" :clip-path=\"'url(#uia-ui-assets/icons-16-sort_descending__a' + uuid + ')'\"><path d=\"M12.75 3.25V11.1896L15.0001 8.93945L16.0608 10.0001L12.0001 14.0608L7.93945 10.0001L9.00011 8.93945L11.25 11.1893V3.25H12.75Z\"/><path d=\"M6.75 7.25H1.25V8.75H6.75V7.25Z\"/><path d=\"M1.25 3.25H9.09V4.75H1.25V3.25Z\"/><path d=\"M6.75 11.25H1.25V12.75H6.75V11.25Z\"/></g><defs><clipPath :id=\"'uia-ui-assets/icons-16-sort_descending__a' + uuid\"><rect width=\"16\" height=\"16\" fill=\"#fff\"/></clipPath></defs></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><path fill=\"#001222\" d=\"M8 11.25L12.5 5.25H3.5L8 11.25Z\"/></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","export const DATA_GRID_SLASHED_ZERO = Symbol('data-grid slashed zero key');\nexport const DATA_GRID_SMALL_CONTAINER = Symbol('data-grid small container key');\nexport const DATA_GRID_TOUCH_DEVICE = Symbol('data-grid touch device key');\n","<template>\n <div\n ref=\"allColumnsRef\"\n class=\"b-data-grid-columns\"\n :class=\"conditionalColumnsClasses\"\n data-testid=\"data-grid-columns\"\n >\n <div\n v-for=\"(column, index) in columns\"\n :key=\"column.field\"\n :ref=\"el => registerColumnsRefs(el, column.field)\"\n :aria-colindex=\"index + 1\"\n :aria-label=\"column.label\"\n :aria-sort=\"getSortingColumnDirection(column)\"\n :class=\"conditionalColumnClasses(column, index)\"\n :data-testid=\"`${column.field}-column-header`\"\n :draggable=\"hasDraggableColumns && !isResizing && !isActionsColumn(column)\"\n class=\"b-data-grid-columns__column\"\n role=\"columnheader\"\n :tabindex=\"column.sortable || hasColumnPanel || column.infoIconTooltip ? '0' : '-1'\"\n :style=\"{ width: column.autoWidth && isMeasuringColumnWidths ? 'auto' : `${column.width}px` }\"\n v-on=\"dataGridColumnEvents(column)\"\n >\n <div\n v-if=\"isActionsColumn(column) && selectable\"\n class=\"b-data-grid-columns__select-column\"\n :class=\"conditionalSelectColumnClasses\"\n >\n <bento-checkbox\n v-if=\"!selectableAcrossPages\"\n :aria-label=\"t('selectAll')\"\n :model-value=\"allItemsSelectedState.allItemsSelected\"\n data-testid=\"checkbox-select-all\"\n :indeterminate=\"allItemsSelectedState.isIndeterminate\"\n value=\"data-grid-select-all\"\n @update:model-value=\"onAllRowSelect\"\n />\n <template v-if=\"selectableAcrossPages\">\n <bento-menu\n :button=\"{ variant: 'tertiary', condensed: true, 'aria-label': t('selectAllMenu') }\"\n :data=\"selectAllMenu\"\n class=\"b-data-grid-columns__select-column-menu\"\n disable-arrow-down-opening-menu\n menu-fixed-positioning\n menu-position=\"bottom-start\"\n >\n <template #iconLeft>\n <div class=\"b-data-grid-columns__select-column-menu-button\">\n <decorative-checkbox\n :indeterminate=\"allItemsSelectedState.isIndeterminate\"\n :checked=\"allItemsSelectedState.allItemsSelected\"\n :all-selected=\"isAllSelectionState\"\n class=\"b-data-grid-columns__select-column-menu-checkbox\"\n data-testid=\"checkbox-select-all\"\n />\n\n <triangle-down :svg-title=\"t('selectionMenu')\" aria-hidden=\"true\" />\n </div>\n </template>\n </bento-menu>\n </template>\n </div>\n <template v-else>\n <div\n :aria-label=\"t('columnActions', { name: column.label })\"\n aria-live=\"polite\"\n role=\"region\"\n class=\"b-data-grid-columns__column-header-and-actions\"\n :class=\"conditionalColumnHeaderAndActionsClasses(column)\"\n >\n <bento-typography\n el=\"div\"\n strongest\n class=\"b-data-grid-columns__column-header\"\n :class=\"conditionalColumnHeaderClasses\"\n >\n <slot :column=\"column\" :name=\"`head-${column.field}`\">\n <span class=\"b-data-grid-columns__label\">{{ column.label }}</span>\n </slot>\n </bento-typography>\n <div\n v-if=\"hasColumnActions(column)\"\n class=\"b-data-grid-columns__column-actions\"\n :class=\"conditionalColumnActionsClasses(column)\"\n >\n <div v-if=\"column.infoIconTooltip\" class=\"b-data-grid-columns__column-info-icon\">\n <bento-info-icon :tooltip-text=\"column.infoIconTooltip\" />\n </div>\n <div v-if=\"column.sortable\" class=\"b-data-grid-columns__column-sort\">\n <bento-toggle-button\n condensed\n :toggled=\"isSorting(column.field)\"\n variant=\"tertiary\"\n @click=\"sortByColumnField(column.field)\"\n >\n <template #iconLeft>\n <arrow-up-and-down-sort-icon\n v-if=\"!getSortingDirection(column.field)\"\n :svg-title=\"t('sortColumn', { name: column.label })\"\n />\n <sort-ascending-icon\n v-else-if=\"\n getSortingDirection(column.field) === BentoDatagridSortDirection.ASCENDING\n \"\n :svg-title=\"t('sortColumnInDescendingOrder', { name: column.label })\"\n />\n <sort-descending-icon\n v-else-if=\"\n getSortingDirection(column.field) === BentoDatagridSortDirection.DESCENDING\n \"\n :svg-title=\"t('sortColumnInAscendingOrder', { name: column.label })\"\n />\n </template>\n </bento-toggle-button>\n </div>\n <bento-menu\n v-if=\"hasColumnPanel\"\n :ref=\"el => (contextMenuRef[column.field] = el)\"\n class=\"b-data-grid-columns__menu\"\n :class=\"conditionalColumnMenuClasses(column)\"\n disable-arrow-down-opening-menu\n :data=\"contextualMenuData(column)\"\n :menu-position=\"computeMenuPosition(hasFirstColumnPanelRightAligned, index)\"\n :menu-fixed-positioning=\"true\"\n :button=\"{ variant: 'tertiary', condensed: true }\"\n @open=\"$emit(DatagridColumnsEvent.COLUMN_MENU_OPEN)\"\n @close=\"$emit(DatagridColumnsEvent.COLUMN_MENU_CLOSE)\"\n />\n </div>\n </div>\n <div\n :data-testid=\"`data-grid-column-${column.field}`\"\n class=\"b-data-grid-columns__column-separator-container\"\n :class=\"conditionalColumnSeparatorClasses(column)\"\n role=\"presentation\"\n @mousedown=\"startResize(hasResizableColumns, column.field, $event)\"\n @click.stop\n >\n <div\n v-if=\"!isFrozenColumns || (isFrozenColumns && index !== columns.length - 1)\"\n class=\"b-data-grid-columns__column-separator\"\n ></div>\n </div>\n </template>\n </div>\n <template v-if=\"rowActionsMaximumWidth && !isFrozenColumns\">\n <div role=\"presentation\" class=\"b-data-grid-columns__row-actions-filler\"></div>\n <div\n :ref=\"el => registerColumnsRefs(el, DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME)\"\n :aria-label=\"t('rowActionsColumn')\"\n :aria-colindex=\"columns.length + 1\"\n class=\"b-data-grid-columns__column\"\n role=\"columnheader\"\n tabindex=\"0\"\n :style=\"{ minWidth: `${rowActionsMaximumWidth}px` }\"\n ></div>\n </template>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\n import { computed, type ComputedRef, inject, type PropType, type Ref, ref, toRefs } from 'vue';\n import { BentoCheckbox } from '@/components/checkbox';\n import {\n type BentoColumn,\n type BentoColumnWidthOverridesLookup,\n type BentoDatagridAllItemsSelectedState,\n BentoDatagridAriaSortValue,\n type BentoDatagridSortByColumn,\n BentoDatagridSortDirection,\n type BentoDataGridVisibleRowsState,\n } from '../../data-grid.types';\n import { BentoTypography } from '@/components/typography';\n import {\n DATAGRID_ACTIONS_COLUMN_FIELD_NAME,\n DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME,\n useResizer,\n useSorter,\n } from '../../composables';\n import { focusOnInteractiveChild } from '../../utils';\n import { BentoInfoIcon } from '@/components/info-icon';\n import {\n type BentoDatagridColumnSelectionState,\n type BentoDatagridDraggingColumnState,\n DatagridColumnsEvent,\n type DatagridColumnsHeaderReferences,\n } from './data-grid-columns.types';\n import { BentoMenu } from '@/components/menu';\n import { BentoToggleButton } from '@/components/button';\n import { DecorativeCheckbox } from '@/internal/decorative-checkbox';\n import { useI18n } from '@/utils/ts/i18n';\n import type { BentoMenuItem } from '@/components/menu/components';\n import type { DatagridColumnHoveringState } from '@/components/data-grid/composables/use-column-hovering/use-column-hovering.types';\n import { BentoPopoverPositions } from '@/components/popover/popover.types';\n import ArrowUpAndDownSortIcon from '@adyen/ui-assets-icons-16/vue/arrow-up-down-sort';\n import ArrowLeftIcon from '@adyen/ui-assets-icons-16/vue/arrow-left';\n import ArrowRightIcon from '@adyen/ui-assets-icons-16/vue/arrow-right';\n import FreezeIcon from '@adyen/ui-assets-icons-16/vue/freeze';\n import HideIcon from '@adyen/ui-assets-icons-16/vue/hide';\n import SortAscendingIcon from '@adyen/ui-assets-icons-16/vue/sort-ascending';\n import SortDescendingIcon from '@adyen/ui-assets-icons-16/vue/sort-descending';\n import ShowIcon from '@adyen/ui-assets-icons-16/vue/show';\n import TriangleDown from '@adyen/ui-assets-icons-16/vue/triangle-down';\n import messages from './messages.json';\n import { DATA_GRID_SMALL_CONTAINER, DATA_GRID_TOUCH_DEVICE } from '@/components/data-grid/data-grid.keys';\n\n type MessageSchema = (typeof messages)['en-US'];\n\n const props = defineProps({\n /**\n * Column definitions using 'key' to relate to data object.\n */\n columns: {\n type: Array as PropType<Array<BentoColumn>>,\n required: true,\n },\n\n /**\n * Columns being dragged, contains dragging column and a target column\n */\n draggingColumns: {\n type: Object as PropType<BentoDatagridDraggingColumnState>,\n default: undefined,\n },\n\n /**\n * Determines the state of the current results: { filtered: boolean, allItemsVisible: boolean } to render the correct select all menu options\n */\n visibleRowsState: {\n type: Object as PropType<BentoDataGridVisibleRowsState>,\n default: undefined,\n },\n\n /**\n * Toggle the columns draggable events.\n */\n hasDraggableColumns: {\n type: Boolean,\n default: true,\n },\n\n /**\n * If resize is enabled\n */\n hasResizableColumns: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Signifies if the column panel is enabled.\n */\n hasColumnPanel: {\n type: Boolean,\n default: false,\n },\n\n /**\n * If set to true, aligns the first column panel to the right of its button.\n */\n hasFirstColumnPanelRightAligned: {\n type: Boolean,\n default: false,\n },\n\n /**\n * If the data grid has overflow on the left side\n */\n hasLeftOverflow: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The column hovered over state and whether the hovered over column should show a border right or left.\n */\n hoveredOverColumnState: {\n type: Object as PropType<DatagridColumnHoveringState>,\n required: true,\n },\n\n /**\n * Toggled to true when the DataGrid has auto width columns and is measuring the\n */\n isMeasuringColumnWidths: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Used to disable hiding the last visible column.\n */\n isOnlyOneVisibleColumn: {\n type: Boolean,\n default: false,\n },\n\n /**\n * If these columns are frozen (pinned) columns\n */\n isFrozenColumns: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Show frozen columns separator\n */\n showFrozenColumnsSeparator: {\n type: Boolean,\n default: false,\n },\n /**\n * The column all items selected state\n */\n allItemsSelectedState: {\n type: Object as PropType<BentoDatagridAllItemsSelectedState>,\n default: undefined,\n },\n\n /**\n * Determines if the user has enabled row selection\n */\n selectable: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Adds an extra option when selecting all, to select items in other pages too\n */\n selectableAcrossPages: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines which state of row selection is currently active. Used to display the \"Select all\" menu options.\n */\n selectionState: {\n type: String as PropType<BentoDatagridColumnSelectionState>,\n default: undefined,\n },\n\n /**\n * Sortby handles proper rendering of sort icon in header. Sorting currently is only supported server side.\n * It does make sure the currently sorted column has a more visible sort icon, and the sort icon points in the right direction.\n */\n sortBy: {\n type: Array as PropType<Array<BentoDatagridSortByColumn>>, // NOTE: is an array to allow multi-sorting in the future\n default: () => [],\n },\n\n /**\n * Truncates all data grid column headers\n */\n truncateColumnHeaders: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The maximum width of the row actions in all rows\n */\n rowActionsMaximumWidth: {\n type: Number,\n default: 0,\n },\n });\n\n const emit = defineEmits([\"sort\", \"column-hover\"]);\n\n const CLOSING_CONTEXTUAL_MENU_DELAY_MS = 100;\n const { t } = useI18n<{ message: MessageSchema }>({ messages });\n const { columns, sortBy } = toRefs(props);\n const allColumnsRef = ref<HTMLDivElement>();\n const columnHeaderRefs = ref<DatagridColumnsHeaderReferences>({});\n const contextMenuRef = ref({});\n const hoveredColumnField = ref();\n const closingTimeOutId = ref();\n\n // Selecting\n const onAllRowSelect = (areAllItemsSelected: boolean) =>\n emit(DatagridColumnsEvent.SELECT_ALL_ROWS, areAllItemsSelected);\n const isActionsColumn = (column: BentoColumn) => column.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME;\n const isAllSelectionState = computed(() => props.selectionState === 'all');\n\n // Select all menu\n const selectAllMenu = computed(() =>\n [\n {\n text: t('selectPage') as string,\n handler: () => onAllRowSelect(true),\n disabled: props.selectionState === 'page' || props.selectionState === 'all',\n },\n props.visibleRowsState?.filtered\n ? {\n text: t('selectAllCurrentResults') as string,\n handler: () => emit(DatagridColumnsEvent.SELECT_ALL_CURRENT_RESULTS),\n addDivider: props.selectionState !== 'none',\n disabled: props.selectionState === 'all',\n }\n : {\n text: t('selectAll') as string,\n handler: () => emit(DatagridColumnsEvent.SELECT_ALL_ACROSS_PAGES),\n addDivider: props.selectionState !== 'none',\n disabled: props.selectionState === 'all',\n },\n props.selectionState !== 'none' && {\n text: t('deselectPage') as string,\n handler: () => onAllRowSelect(false),\n addDivider: !props.visibleRowsState?.filtered, // otherwise divider shown in deselect all in current results\n disabled: props.selectionState === 'unselected-page',\n },\n props.visibleRowsState?.filtered &&\n props.selectionState !== 'none' && {\n text: t('deselectAllCurrentResults') as string,\n handler: () => emit(DatagridColumnsEvent.DESELECT_ALL_CURRENT_RESULTS),\n addDivider: true,\n disabled: props.selectionState === 'unselected-page' && props.visibleRowsState.allRowsVisible,\n },\n props.selectionState !== 'none' && {\n text: t('deselectAll') as string,\n handler: () => emit(DatagridColumnsEvent.DESELECT_ALL),\n },\n ].filter(Boolean)\n );\n\n // Resizing\n const { startResize, isResizing, columnHoverEventToEmitAfterResizing } = useResizer(columns, emit);\n\n // Sorting\n const { isSorting, getSortingDirection, sortByColumnField } = useSorter(sortBy, columns, emit);\n const getSortingColumnDirection = (column: BentoColumn): BentoDatagridAriaSortValue => {\n if (!column.sortable) {\n return null;\n }\n\n const sortingDirection = props.sortBy.find(({ field }) => field === column.field)?.direction;\n\n if (!sortingDirection) {\n return BentoDatagridAriaSortValue.NONE;\n }\n\n const ariaSortingDirectionMap: { [key in BentoDatagridSortDirection]: BentoDatagridAriaSortValue } = {\n [BentoDatagridSortDirection.ASCENDING]: BentoDatagridAriaSortValue.ASCENDING,\n [BentoDatagridSortDirection.DESCENDING]: BentoDatagridAriaSortValue.DESCENDING,\n };\n\n return ariaSortingDirectionMap[sortingDirection];\n };\n\n // Dragging emit events and methods\n const draggingEventsForColumn = computed(() => (column: BentoColumn) => {\n if (!props.hasDraggableColumns) {\n return {};\n }\n\n return {\n dragstart: (e: DragEvent & Event) => {\n emit(DatagridColumnsEvent.COLUMN_DRAG_START, column, e);\n },\n dragover: (e: DragEvent) => {\n e.preventDefault();\n },\n dragenter: (e: DragEvent) => {\n e.preventDefault();\n emit(DatagridColumnsEvent.COLUMN_DRAG_ENTER, column, e);\n },\n drop: () => {\n emit(DatagridColumnsEvent.COLUMN_DROP, column);\n },\n dragend: () => {\n emit(DatagridColumnsEvent.COLUMN_DRAG_END);\n },\n };\n });\n\n // Contextual menu (moving, visiblity and freezing)\n const contextualMenuData = computed<(col: BentoColumn) => Array<BentoMenuItem>>(\n () => (column: BentoColumn) =>\n [\n {\n text: t('moveColumnLeft') as string,\n handler: () => emit(DatagridColumnsEvent.COLUMN_MOVE, column, -1),\n icon: ArrowLeftIcon,\n disabled: props.columns[0].field === column.field,\n },\n {\n text: t('moveColumnRight') as string,\n handler: () => emit(DatagridColumnsEvent.COLUMN_MOVE, column, 1),\n icon: ArrowRightIcon,\n disabled: props.columns[props.columns.length - 1].field === column.field,\n },\n !isSmallContainer.value && {\n text: (column?.frozen ? t('unfreezeColumn') : t('freezeColumn')) as string,\n handler: () => emit(DatagridColumnsEvent.COLUMN_UPDATE, { ...column, frozen: !column?.frozen }),\n icon: FreezeIcon,\n },\n {\n text: (column?.visible !== false ? t('hideColumn') : t('showColumn')) as string,\n handler: () => {\n emit(DatagridColumnsEvent.COLUMN_UPDATE, {\n ...column,\n visible: !(column?.visible !== false),\n });\n },\n icon: column?.visible !== false ? HideIcon : ShowIcon,\n disabled: column?.mandatory || (column?.visible !== false && props.isOnlyOneVisibleColumn),\n },\n ].filter(Boolean)\n );\n const showContextualMenu = (column: BentoColumn) => {\n hoveredColumnField.value = column.field;\n if (closingTimeOutId.value) {\n clearTimeout(closingTimeOutId.value);\n }\n };\n const hideContextualMenu = (column: BentoColumn) => {\n // We want to delay closing for a couple of seconds so\n // it doesn't flicker if a user hovers over the icon and then inside the popover.\n const timeOutId = setTimeout(() => {\n if (column.field === hoveredColumnField.value) {\n hoveredColumnField.value = '';\n }\n }, CLOSING_CONTEXTUAL_MENU_DELAY_MS);\n closingTimeOutId.value = timeOutId;\n };\n\n /**\n * Generates events for a Datagrid Column.\n * @param column - the BentoColumn we are attaching events onto.\n */\n const dataGridColumnEvents = (column: BentoColumn) => {\n let events: { [eventName: string]: (e: Event) => void } = {\n mouseenter: () => {\n showContextualMenu(column);\n if (!isResizing.value) {\n emit('column-hover', column);\n } else {\n columnHoverEventToEmitAfterResizing.value = column;\n }\n },\n mouseleave: () => {\n hideContextualMenu(column);\n if (!isResizing.value) {\n emit('column-hover', null);\n } else {\n columnHoverEventToEmitAfterResizing.value = null;\n }\n },\n focus: () => {\n showContextualMenu(column);\n if (isActionsColumn(column)) {\n focusOnInteractiveChild(columnHeaderRefs.value[column.field]);\n }\n },\n focusout: (e: FocusEvent) => {\n if (!allColumnsRef.value?.contains(e?.relatedTarget as Node)) {\n hideContextualMenu(column);\n }\n },\n };\n if (!isActionsColumn(column)) {\n events = {\n ...events,\n ...draggingEventsForColumn.value(column),\n };\n }\n return events;\n };\n\n const hasColumnActions = (column: BentoColumn) => column.infoIconTooltip || column.sortable || props.hasColumnPanel;\n\n const registerColumnsRefs = (el: unknown, field: string) => {\n if (columnHeaderRefs.value?.[field] === undefined) {\n columnHeaderRefs.value = { ...columnHeaderRefs.value, [field]: null };\n }\n if (el !== null) {\n columnHeaderRefs.value[field] = el as HTMLDivElement;\n }\n };\n\n const isSmallContainer: ComputedRef<boolean> = inject(\n DATA_GRID_SMALL_CONTAINER,\n computed(() => false)\n );\n\n const isTouchDevice: Ref<boolean> = inject(DATA_GRID_TOUCH_DEVICE, ref(false));\n\n // Conditional column styles\n // Conditional styles\n const conditionalColumnsClasses = computed(() => {\n const defaultConditionalClasses = {\n 'b-data-grid-columns--is-measuring': props.isMeasuringColumnWidths,\n };\n return columns.value[0]?.frozen && !isSmallContainer.value\n ? {\n ...defaultConditionalClasses,\n 'b-data-grid-columns--frozen': true,\n 'b-data-grid-columns--frozen-separator': props.showFrozenColumnsSeparator,\n 'b-data-grid-columns--overflow-shadow-left': props.hasLeftOverflow,\n }\n : {\n ...defaultConditionalClasses,\n 'b-data-grid-columns--unfrozen': true,\n };\n });\n const conditionalSelectColumnClasses = computed(() => ({\n 'b-data-grid-columns__select-column--all': props.selectableAcrossPages,\n }));\n\n const computeMenuPosition = (hasFirstColumnPanelRightAligned, index) =>\n hasFirstColumnPanelRightAligned && index === 0\n ? BentoPopoverPositions.BOTTOM_START\n : BentoPopoverPositions.BOTTOM_END;\n\n const conditionalColumnClasses = (column: BentoColumn, columnIndex: number) => ({\n 'b-data-grid-columns__column--column-hovered':\n column.field === props.hoveredOverColumnState.hoveredOverColumnField,\n 'b-data-grid-columns__column--column-hovered-no-border-left':\n column.field === props.hoveredOverColumnState.hoveredOverColumnField &&\n props.hoveredOverColumnState.noBorderLeft,\n 'b-data-grid-columns__column--column-hovered-no-border-right':\n column.field === props.hoveredOverColumnState.hoveredOverColumnField &&\n props.hoveredOverColumnState.noBorderRight,\n 'b-data-grid-columns__column--last-frozen-frozen-column':\n props.isFrozenColumns && columnIndex === columns.value.length - 1,\n 'b-data-grid-columns__column--sortable': column.sortable,\n 'b-data-grid-columns__column--padding-left-unset': column?.padding?.left === false,\n 'b-data-grid-columns__column--padding-right-unset': column?.padding?.right === false,\n 'b-data-grid-columns__column--numeric': column?.numeric,\n 'b-data-grid-columns__column--frozen': column?.frozen,\n 'b-data-grid-columns__column--is-re-ordering': column?.field === props.draggingColumns?.dragging?.field,\n 'b-data-grid-columns__column--is-re-ordering-target-left':\n column?.field === props.draggingColumns?.target?.field && props.draggingColumns?.dragToLeft,\n 'b-data-grid-columns__column--is-re-ordering-target-right':\n column?.field === props.draggingColumns?.target?.field && !props.draggingColumns?.dragToLeft,\n 'b-data-grid-columns__column--with-sorting-or-column-panel':\n column.sortable || column.infoIconTooltip || props.hasColumnPanel || props.selectableAcrossPages,\n 'b-data-grid-columns--small-container': isSmallContainer.value,\n });\n\n const conditionalColumnHeaderAndActionsClasses = (column: BentoColumn) => ({\n 'b-data-grid-columns__column-header-and-actions--numeric': column?.numeric,\n });\n\n const conditionalColumnActionsClasses = (column: BentoColumn) => ({\n 'b-data-grid-columns__column-actions--numeric': column?.numeric,\n });\n\n const conditionalColumnSeparatorClasses = (column: BentoColumn) => ({\n 'b-data-grid-columns__column-separator-container--is-resizeable': props.hasResizableColumns,\n 'b-data-grid-columns__column-separator-container--is-offset':\n props.hoveredOverColumnState.hoveredOverColumnField === column.field &&\n props.hoveredOverColumnState.isSeparatorOffset,\n });\n\n const conditionalColumnHeaderClasses = computed(() => ({\n 'b-data-grid-columns__column-header--truncated': props.truncateColumnHeaders,\n }));\n\n const conditionalColumnMenuClasses = (column: BentoColumn) => ({\n 'b-data-grid-columns__menu--hovered': hoveredColumnField.value === column.field || isTouchDevice.value,\n });\n\n // Exposed refs\n defineExpose({\n columnHeaderRefs,\n });\n</script>\n\n<script lang=\"ts\">\n /**\n * A component to display the BentoDataGrid columns\n *\n * @example\n *\n * export default {\n * components: { DataGridColumns },\n * template: `\n * <data-grid-columns\n * v-if=\"columnSet?.length\"\n * :key=\"`data-grid-columns-${id}`\"\n * :columns=\"columnSet\"\n * :has-resizable-columns=\"hasResizableColumns\"\n * :sort-by=\"sortBy\"\n * :all-items-selected-state=\"allItemsSelectedState\"\n * :is-frozen-columns=\"isFrozenColumns\"\n * :show-frozen-columns-separator=\"showFrozenColumnsSeparator\"\n * :dragging-columns=\"draggingColumns\"\n * :has-draggable-columns=\"allowColumnDragAndDrop\"\n * :has-column-panel=\"columnPanel\"\n * :has-left-overflow=\"hasLeftOverflow\"\n * :has-first-column-panel-right-aligned=\"index === computedColumnPanelAlignment\"\n * :is-only-one-visible-column=\"isOnlyOneVisibleColumn\"\n * :selectable=\"selectable\"\n * :selectable-across-pages=\"selectableAcrossPagesComputed\"\n * :truncate-column-headers=\"truncateColumnHeaders\"\n * v-on=\"draggingEventsForColumns\"\n * @column-move=\"onMoveColumnByOffset\"\n * @column-update=\"onConfigSettingsColumnUpdate\"\n * @column-resize=\"onColumnResized\"\n * @column-resizing=\"onColumnWidthOverride\"\n * @select-all-rows=\"onAllRowSelect\"\n * @select-all-across-pages=\"emit(BentoDatagridEvent.SELECT_ALL_ACROSS_PAGES)\"\n * @sort=\"onSort\"\n * >\n * <template v-for=\"(_, innerSlot) of slots\" #[innerSlot]=\"scope\">\n * <slot :name=\"innerSlot\" v-bind=\"scope\" />\n * </template>\n * </data-grid-columns>\n * `\n * }\n */\n export default {\n i18n: { messages },\n name: 'data-grid-columns',\n };\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-columns.scss\" />\n","/**\n * All the emit events provided by the DatagridConfigSettings component\n */\nexport enum DatagridConfigSettingsEvent {\n UPDATE_CONDENSED = 'update:condensed',\n UPDATE_COLUMNS = 'update:columns',\n UPDATE_ZEBRA_ROWS = 'update:zebra-rows',\n}\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><g fill=\"#001222\" :clip-path=\"'url(#uia-ui-assets/icons-16-settings__a' + uuid + ')'\"><path d=\"M8 5.25C6.48122 5.25 5.25 6.48122 5.25 8C5.25 9.51878 6.48122 10.75 8 10.75C9.51878 10.75 10.75 9.51878 10.75 8C10.75 6.48122 9.51878 5.25 8 5.25ZM6.75 8C6.75 7.30964 7.30964 6.75 8 6.75C8.69036 6.75 9.25 7.30964 9.25 8C9.25 8.69036 8.69036 9.25 8 9.25C7.30964 9.25 6.75 8.69036 6.75 8Z\"/><path d=\"M6.84701 0.973015L6.59985 0.35083L5.9537 0.526056C4.64534 0.880867 3.48225 1.56808 2.55285 2.48641L2.07533 2.95826L2.49158 3.48495C2.79648 3.87074 2.85279 4.419 2.58992 4.87589C2.32905 5.32931 1.82436 5.55631 1.33473 5.48726L0.677319 5.39455L0.505539 6.03586C0.33838 6.65992 0.25 7.32519 0.25 7.99991C0.25 8.67463 0.33838 9.3399 0.505539 9.96396L0.677319 10.6053L1.33473 10.5126C1.82436 10.4435 2.32905 10.6705 2.58992 11.1239C2.85279 11.5808 2.79648 12.1291 2.49158 12.5149L2.07533 13.0416L2.55285 13.5134C3.48225 14.4317 4.64534 15.119 5.9537 15.4738L6.59985 15.649L6.84701 15.0268C7.02659 14.5748 7.47549 14.2499 8 14.2499C8.52452 14.2499 8.97341 14.5748 9.15299 15.0268L9.40016 15.649L10.0463 15.4738C11.3547 15.119 12.5177 14.4317 13.4471 13.5134L13.9247 13.0416L13.5084 12.5149C13.2035 12.1291 13.1472 11.5808 13.4101 11.1239C13.671 10.6705 14.1756 10.4435 14.6653 10.5126L15.3227 10.6053L15.4945 9.96396C15.6616 9.3399 15.75 8.67463 15.75 7.99991C15.75 7.32519 15.6616 6.65992 15.4945 6.03586L15.3227 5.39455L14.6653 5.48726C14.1756 5.55631 13.671 5.32931 13.4101 4.87589C13.1472 4.419 13.2035 3.87074 13.5084 3.48495L13.9247 2.95826L13.4471 2.48641C12.5177 1.56808 11.3547 0.880867 10.0463 0.526056L9.40016 0.35083L9.15299 0.973015C8.97341 1.42506 8.52452 1.74991 8 1.74991C7.47549 1.74991 7.02659 1.42506 6.84701 0.973015ZM3.89008 5.62393C4.33946 4.84286 4.36394 3.9353 4.03405 3.16853C4.55803 2.73795 5.15349 2.39116 5.80146 2.14902C6.30062 2.81653 7.10051 3.24991 8 3.24991C8.89949 3.24991 9.69938 2.81653 10.1985 2.14902C10.8465 2.39116 11.442 2.73795 11.966 3.16853C11.6361 3.9353 11.6605 4.84287 12.1099 5.62393C12.5612 6.40839 13.3382 6.88092 14.1658 6.97982C14.221 7.31075 14.25 7.65319 14.25 7.99991C14.25 8.34663 14.221 8.68908 14.1658 9.02001C13.3382 9.11891 12.5612 9.59143 12.1099 10.3759C11.6605 11.157 11.6361 12.0645 11.9659 12.8313C11.442 13.2619 10.8465 13.6087 10.1985 13.8508C9.69938 13.1833 8.89949 12.7499 8 12.7499C7.10051 12.7499 6.30062 13.1833 5.80146 13.8508C5.15349 13.6087 4.55803 13.2619 4.03405 12.8313C4.36394 12.0645 4.33946 11.157 3.89008 10.3759C3.43875 9.59143 2.66177 9.1189 1.8342 9.02C1.77896 8.68908 1.75 8.34663 1.75 7.99991C1.75 7.65319 1.77896 7.31074 1.8342 6.97982C2.66177 6.88092 3.43875 6.40839 3.89008 5.62393Z\"/></g><defs><clipPath :id=\"'uia-ui-assets/icons-16-settings__a' + uuid\"><rect width=\"16\" height=\"16\" fill=\"#fff\"/></clipPath></defs></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","<template>\n <div class=\"b-data-grid-config-settings-column-row\" @mouseover=\"showFreezeIcon\" @mouseleave=\"hideFreezeIcon\">\n <bento-toggle\n :aria-label=\"t('toggleColumnVisibility', { label: column.label })\"\n :disabled=\"isColumnVisibilityToggleDisabled\"\n label-position=\"after\"\n :value=\"isColumnVisible\"\n @input=\"toggleColumnVisibility\"\n >\n {{ column.label }}\n </bento-toggle>\n <bento-freeze-icon\n v-show=\"(isColumnFrozen || isFreezeIconOptionShown) && !isSmallContainer\"\n :aria-label=\"t('toggleColumnFreeze', { label: column.label })\"\n class=\"b-data-grid-config-settings-column-row__freeze-icon\"\n :class=\"freezeIconConditionalClasses\"\n @click.native=\"toggleColumnFreeze\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\n import { computed, type ComputedRef, defineComponent, inject, type PropType, ref } from 'vue';\n import { BentoToggle } from '@/components/toggle';\n import { useI18n } from '@/utils/ts/i18n';\n import { DATA_GRID_SMALL_CONTAINER } from '@/components/data-grid/data-grid.keys';\n import type { BentoColumn } from '@/components/data-grid/components/data-grid-columns/data-grid-columns.types';\n import BentoFreezeIcon from '@adyen/ui-assets-icons-16/vue/freeze';\n import messages from './messages.json';\n\n type MessageSchema = (typeof messages)['en-US'];\n\n export default defineComponent({\n i18n: { messages },\n name: 'bento-data-grid',\n components: {\n BentoFreezeIcon,\n BentoToggle,\n },\n props: {\n /**\n * Is column visibitlity toggle disabled\n */\n isColumnVisibilityToggleDisabled: {\n type: Boolean,\n required: true,\n },\n /**\n * Column definition\n */\n column: {\n type: Object as PropType<BentoColumn>,\n required: true,\n },\n },\n emits: ['visible-column', 'updated-column'],\n setup(props, { emit }) {\n const { t } = useI18n<{ message: MessageSchema }>({ messages });\n const isFreezeIconOptionShown = ref(false);\n const isColumnFrozen = computed(() => props.column?.frozen);\n const isColumnVisible = computed(() => props.column?.visible !== false);\n const isSmallContainer: ComputedRef<boolean> = inject(\n DATA_GRID_SMALL_CONTAINER,\n computed(() => false)\n );\n\n const toggleColumnVisibility = () => {\n emit('visible-column', { ...props.column, visible: !isColumnVisible.value });\n };\n\n const toggleColumnFreeze = () => {\n emit('updated-column', { ...props.column, frozen: !isColumnFrozen.value });\n };\n\n const showFreezeIcon = () => {\n if (!isColumnFrozen.value) {\n isFreezeIconOptionShown.value = true;\n }\n };\n\n const hideFreezeIcon = () => {\n if (!isColumnFrozen.value) {\n isFreezeIconOptionShown.value = false;\n }\n };\n\n const freezeIconConditionalClasses = computed(() => ({\n [`b-data-grid-config-settings-column-row__freeze-icon--frozen`]: isColumnFrozen.value,\n }));\n\n return {\n // Values\n isFreezeIconOptionShown,\n isColumnFrozen,\n freezeIconConditionalClasses,\n isColumnVisible,\n isSmallContainer,\n\n // Methods\n toggleColumnVisibility,\n showFreezeIcon,\n hideFreezeIcon,\n toggleColumnFreeze,\n\n // Translations\n t,\n };\n },\n });\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-config-settings-column-row.scss\" />\n","<!-- TODO: Remove aria props from search-bar as these name clashes with JSX type /vue/types/jsx.d.ts -->\n<!-- eslint-disable vue/attribute-hyphenation -->\n<template>\n <div v-bento-click-outside-directive=\"onClickOutside\" class=\"b-data-grid-config-settings\">\n <div class=\"b-data-grid-config-settings__button-and-separator\">\n <div ref=\"configSettingsButtonRef\" class=\"b-data-grid-config-settings__button-container\">\n <bento-toggle-button\n :aria-controls=\"isConfigSettingsPanelOpen ? popoverId : null\"\n variant=\"tertiary\"\n condensed\n :toggled=\"isConfigSettingsPanelOpen\"\n @click=\"setConfigSettingsPanelVisibility(!isConfigSettingsPanelOpen)\"\n >\n <template #iconLeft>\n <bento-settings-icon :svg-title=\"t('toggleConfigSettingsPanelVisibility')\" />\n </template>\n </bento-toggle-button>\n </div>\n </div>\n <bento-popover\n v-if=\"configSettingsButtonRef\"\n :id=\"popoverId\"\n :open=\"isConfigSettingsPanelOpen\"\n class=\"b-data-grid-config-settings__panel\"\n :aria-label=\"t('configSettingsPanel')\"\n :target-element=\"configSettingsButtonRef\"\n position=\"bottom-end\"\n >\n <div class=\"b-data-grid-config-settings__panel-header\">\n <bento-typography el=\"span\" strongest>\n {{ t('displayOptions') }}\n </bento-typography>\n <bento-button variant=\"tertiary\" @click=\"setConfigSettingsPanelVisibility(false)\">\n <template #iconLeft>\n <bento-cross-icon :svg-title=\"t('closeConfigSettingsPanel')\" />\n </template>\n </bento-button>\n </div>\n <div class=\"b-data-grid-config-settings__appearance\">\n <bento-typography class=\"b-data-grid-config-settings__appearance-title\" el=\"span\" stronger>\n {{ t('appearance') }}\n </bento-typography>\n <div class=\"b-data-grid-config-settings__appearance-button\">\n <bento-toggle\n label-position=\"after\"\n :aria-label=\"t('condensedToggle')\"\n :value=\"condensed\"\n @input=\"emitCondensedToggle\"\n >\n {{ t('condensed') }}\n </bento-toggle>\n </div>\n <div class=\"b-data-grid-config-settings__appearance-button\">\n <bento-toggle\n label-position=\"after\"\n :aria-label=\"t('zebraRowsToggle')\"\n :value=\"zebraRows\"\n @input=\"emitZebraRowsToggle\"\n >\n {{ t('zebraRows') }}\n </bento-toggle>\n </div>\n </div>\n <div class=\"b-data-grid-config-settings__column-visibility-settings\">\n <div class=\"b-data-grid-config-settings__column-visibility-header\">\n <bento-typography class=\"b-data-grid-config-settings__column-visibility-title\" el=\"span\" stronger>\n {{ t('columns') }}\n </bento-typography>\n <bento-button\n v-if=\"!isColumnVisibilityFilterShown\"\n ref=\"searchButtonRef\"\n variant=\"tertiary\"\n @click=\"toggleColumnFilter\"\n >\n <template #iconLeft><bento-search-icon /> </template>{{ t('search') }}</bento-button\n >\n <bento-button v-else variant=\"tertiary\" @click=\"toggleColumnFilter\">\n <template #iconLeft>\n <bento-cross-icon />\n </template>\n {{ t('closeSearch') }}\n </bento-button>\n </div>\n <div v-if=\"isColumnVisibilityFilterShown\" class=\"b-data-grid-config-settings__column-visibility-search\">\n <bento-search-bar\n ref=\"searchBarRef\"\n :value=\"searchTerm\"\n :input-field-aria-label=\"t('columnVisibilitySearchFilter').toString()\"\n @input=\"searchTerm = $event\"\n @clear=\"clearAction\"\n @escape-pressed=\"toggleColumnFilter\"\n />\n </div>\n <div v-else class=\"b-data-grid-config-settings__column-visibility-show-all\">\n <bento-toggle\n label-position=\"after\"\n :value=\"allColumnsVisbilityToggleState\"\n @input=\"toggleAllColumnVisibility\"\n >\n {{ t('showAllColumns', { numberOfColumns: columns.length }) }}\n </bento-toggle>\n </div>\n <div class=\"b-data-grid-config-settings__column-visibility-toggles\">\n <div v-for=\"column of filteredColumnVisibilityColumns\" :key=\"column.field\">\n <bento-data-grid-config-settings-config-row\n v-if=\"column.field !== DATAGRID_ACTIONS_COLUMN_FIELD_NAME\"\n :column=\"column\"\n :is-column-visibility-toggle-disabled=\"isColumnVisibilityToggleDisabled(column)\"\n @visible-column=\"emitVisibleColumns\"\n @updated-column=\"emitFrozenColumns\"\n />\n </div>\n <bento-typography\n v-if=\"filteredColumnVisibilityColumns.length === 0\"\n el=\"span\"\n class=\"b-data-grid-config-settings__column-visibility-empty-search-message\"\n >\n {{ t('noColumnsMatch') }}\n </bento-typography>\n </div>\n </div>\n </bento-popover>\n </div>\n</template>\n\n<script lang=\"ts\">\n import { computed, defineComponent, nextTick, type PropType, ref, toRef } from 'vue';\n import { BentoPopover } from '@/components/popover';\n import { BentoButton, BentoToggleButton } from '@/components/button';\n import { BentoTypography } from '@/components/typography';\n import { BentoToggle } from '@/components/toggle';\n import { type BentoColumn } from '../../data-grid.types';\n import BentoSearchBar from '@/components/search-bar/search-bar.vue';\n import { BentoClickOutsideDirective } from '@/directives';\n import { DatagridConfigSettingsEvent } from './data-grid-config-settings.types';\n import { useSearchBarFilter } from '@/components/search-bar';\n import { generateUid } from '@/core/utils/ts';\n import { DATAGRID_ACTIONS_COLUMN_FIELD_NAME } from '../../composables';\n import { useI18n } from '@/utils/ts/i18n';\n\n import BentoSettingsIcon from '@adyen/ui-assets-icons-16/vue/settings';\n import BentoCrossIcon from '@adyen/ui-assets-icons-16/vue/cross';\n import BentoSearchIcon from '@adyen/ui-assets-icons-16/vue/search';\n import BentoDataGridConfigSettingsConfigRow from './components/data-grid-config-settings-column-row/data-grid-config-settings-column-row.vue';\n import messages from './messages.json';\n\n type MessageSchema = (typeof messages)['en-US'];\n\n export default defineComponent({\n i18n: { messages },\n name: 'bento-data-grid',\n components: {\n BentoButton,\n BentoCrossIcon,\n BentoPopover,\n BentoSettingsIcon,\n BentoToggleButton,\n BentoDataGridConfigSettingsConfigRow,\n BentoSearchBar,\n BentoSearchIcon,\n BentoToggle,\n BentoTypography,\n },\n directives: { BentoClickOutsideDirective },\n props: {\n /**\n * Column definitions\n */\n columns: {\n type: Array as PropType<Array<BentoColumn>>,\n required: true,\n },\n\n /**\n * Sets the row cells to the condensed padding state.\n */\n condensed: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Sets a different background color for even rows.\n */\n zebraRows: {\n type: Boolean,\n default: false,\n },\n },\n emits: [\n DatagridConfigSettingsEvent.UPDATE_CONDENSED,\n DatagridConfigSettingsEvent.UPDATE_COLUMNS,\n DatagridConfigSettingsEvent.UPDATE_ZEBRA_ROWS,\n ],\n setup(props, { emit }) {\n const { t } = useI18n<{ message: MessageSchema }>({ messages });\n const configSettingsButtonRef = ref(null);\n const popoverId = generateUid('data-grid-config-settings-popover');\n const searchBarRef = ref(null);\n const isConfigSettingsPanelOpen = ref<boolean>(false);\n const allColumnsVisbilityToggleState = ref<boolean>(true);\n const searchButtonRef = ref(null);\n const searchTerm = ref<string>('');\n const columnsRef = toRef(props, 'columns');\n const isColumnVisibilityFilterShown = ref<boolean>(false);\n\n // Column Visibility Filtering\n const filteredColumnVisibilityColumns = useSearchBarFilter<BentoColumn>(searchTerm, columnsRef);\n const clearAction = () => {\n searchTerm.value = '';\n };\n const areAllNonMandatoryColumnsHidden = computed(\n () => !props.columns.some(col => col.visible === false && !col.mandatory)\n );\n const toggleColumnFilter = () => {\n clearAction();\n isColumnVisibilityFilterShown.value = !isColumnVisibilityFilterShown.value;\n if (isColumnVisibilityFilterShown.value) {\n nextTick(() => searchBarRef.value.$refs.bentoInputField?.focusInput());\n } else {\n nextTick(() => searchButtonRef?.value?.$el?.focus());\n }\n allColumnsVisbilityToggleState.value = areAllNonMandatoryColumnsHidden.value;\n };\n\n // Column visibility\n const isColumnVisibilityToggleDisabled = (column: BentoColumn) => column.mandatory ?? false;\n\n const emitVisibleColumns = (updatedColumn: BentoColumn) => {\n const updatedColumns = props.columns.map(col => ({\n ...col,\n visible: updatedColumn.field === col.field ? updatedColumn.visible : col.visible,\n }));\n\n emit(DatagridConfigSettingsEvent.UPDATE_COLUMNS, updatedColumns);\n };\n\n const toggleAllColumnVisibility = (toggleState: boolean) => {\n if (toggleState) {\n // Show all columns\n emit(\n DatagridConfigSettingsEvent.UPDATE_COLUMNS,\n props.columns.map(col => ({ ...col, visible: true }))\n );\n } else {\n // Hide all columns except for mandatory columns\n emit(\n DatagridConfigSettingsEvent.UPDATE_COLUMNS,\n props.columns.map(col => ({ ...col, visible: col?.mandatory === true }))\n );\n }\n };\n\n // Column freeze\n // TODO to convert this function to 'emitUpdatedColumns', that will emit both: visible and frozen columns\n const emitFrozenColumns = (updatedColumn: BentoColumn) => {\n const updatedColumns = props.columns.map(col => ({\n ...col,\n frozen: updatedColumn.field === col.field ? !!updatedColumn?.frozen : !!col?.frozen,\n }));\n\n emit(DatagridConfigSettingsEvent.UPDATE_COLUMNS, updatedColumns);\n };\n\n // Panel visibility\n const setConfigSettingsPanelVisibility = (isVisible: boolean) => {\n isConfigSettingsPanelOpen.value = isVisible;\n allColumnsVisbilityToggleState.value = areAllNonMandatoryColumnsHidden.value;\n };\n const onClickOutside = () => setConfigSettingsPanelVisibility(false);\n // Condensed view\n const emitCondensedToggle = (isCondensedView: boolean) =>\n emit(DatagridConfigSettingsEvent.UPDATE_CONDENSED, isCondensedView);\n\n const emitZebraRowsToggle = (isZebraRows: boolean) =>\n emit(DatagridConfigSettingsEvent.UPDATE_ZEBRA_ROWS, isZebraRows);\n\n return {\n // Values\n configSettingsButtonRef,\n popoverId,\n isConfigSettingsPanelOpen,\n allColumnsVisbilityToggleState,\n filteredColumnVisibilityColumns,\n searchTerm,\n isColumnVisibilityFilterShown,\n searchBarRef,\n searchButtonRef,\n DATAGRID_ACTIONS_COLUMN_FIELD_NAME,\n\n // Methods\n setConfigSettingsPanelVisibility,\n emitCondensedToggle,\n toggleAllColumnVisibility,\n clearAction,\n toggleColumnFilter,\n emitVisibleColumns,\n emitFrozenColumns,\n onClickOutside,\n isColumnVisibilityToggleDisabled,\n emitZebraRowsToggle,\n\n // Translations\n t,\n };\n },\n });\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-config-settings.scss\" />\n","<template>\n <div class=\"b-data-grid-lazy-load\">\n <bento-loading-indicator v-if=\"loading && isInfiniteScroll\" />\n <bento-loading-button\n v-if=\"loading && !isInfiniteScroll\"\n variant=\"secondary\"\n :state=\"BentoLoadingButtonState.LOADING\"\n >{{ t('loading') }}</bento-loading-button\n >\n <bento-loading-button\n v-if=\"!loading && !isInfiniteScroll\"\n :state=\"BentoLoadingButtonState.START\"\n variant=\"secondary\"\n @click=\"$emit(BentoDatagridEvent.UPDATE_SHOW_MORE)\"\n >{{ t('showMore') }}</bento-loading-button\n >\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { BentoLoadingButton, BentoLoadingButtonState } from '@/components/button';\n import { BentoLoadingIndicator } from '@/components/loading-indicator';\n import { BentoDatagridEvent } from '../../data-grid.types';\n import { useI18n } from '@/utils/ts/i18n';\n import messages from '../../messages.json';\n\n type MessageSchema = (typeof messages)['en-US'];\n\n defineProps({\n loading: { type: Boolean },\n isInfiniteScroll: { type: Boolean }\n});\n\n const { t } = useI18n<{ message: MessageSchema }>({ messages });\n</script>\n\n<script lang=\"ts\">\n /**\n * Internal component to display the bento-data-grid's lazy loading.\n * The component can render a 'Show more' loading button or a loading indicator.\n */\n export default {\n i18n: { messages },\n };\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-lazy-load.scss\" />\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><path fill=\"#001222\" d=\"M9.38867 2.21717C10.4626 1.14323 12.2044 1.14323 13.2783 2.21717L13.7832 2.72205C14.857 3.79601 14.8571 5.53782 13.7832 6.6117L5.64355 14.7504H1.25V10.3558L9.38867 2.21717ZM2.75 10.9769V13.2504H5.02246L11.2715 6.9994L8.99902 4.72693L2.75 10.9769ZM12.2168 3.27772C11.7286 2.78987 10.9373 2.78967 10.4492 3.27772L10.0596 3.66639L12.332 5.93885L12.7217 5.55018C13.2098 5.06203 13.2098 4.27076 12.7217 3.7826L12.2168 3.27772Z\"/></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","<template>\n <Transition name=\"b-data-grid-cell-actions__animation\" appear>\n <div class=\"b-data-grid-cell-actions\">\n <div\n v-if=\"showGradientElement && !isTouchDevice\"\n class=\"b-data-grid-cell-actions__background-gradient\"\n :class=\"conditionalCellActionsBackgroundGradientClasses\"\n ></div>\n <div class=\"b-data-grid-cell-actions__actions\" :class=\"conditionalCellActionsClasses\" role=\"group\">\n <div\n v-for=\"(button, index) in computedCellActions\"\n :key=\"index\"\n class=\"b-data-grid-cell-actions__action\"\n >\n <bento-menu\n v-if=\"button.menuData\"\n :data=\"transformMenuEvents(button.menuData)\"\n :button=\"{\n condensed: true,\n variant: 'secondary',\n disabled: button.disabled,\n }\"\n :disable-arrow-down-opening-menu=\"disableArrowDownOpeningMenu\"\n :teleport=\"teleportMenu\"\n @open=\"emit('menu-open')\"\n @close=\"emit('menu-close')\"\n @menu-item-click=\"emit('menu-item-click')\"\n >\n <template v-if=\"shouldShowMenuIconLeft(button)\" #iconLeft>\n <options-vertical-icon\n v-if=\"button?.variant === 'more'\"\n :svg-title=\"getButtonTitle(button, true)\"\n />\n <component :is=\"button.iconLeft\" v-else :svg-title=\"getButtonTitle(button, true)\" />\n </template>\n <template v-if=\"!button?.isShort\" #default>\n {{ getButtonTitle(button) }}\n </template>\n </bento-menu>\n <copy\n v-else-if=\"button.variant === 'copy'\"\n :text=\"getCopyText(button)\"\n :button-text=\"getButtonTitle(button)\"\n :button=\"{\n condensed: true,\n variant: 'secondary',\n }\"\n />\n <bento-button\n v-else\n condensed\n variant=\"secondary\"\n :critical=\"button.critical\"\n :disabled=\"button.disabled\"\n :link=\"button.link\"\n v-on=\"generateButtonEvents(button)\"\n >\n <template v-if=\"button.iconLeft || button.variant === 'edit'\" #iconLeft>\n <edit1-icon v-if=\"button?.variant === 'edit'\" :svg-title=\"getButtonTitle(button, true)\" />\n <component :is=\"button.iconLeft\" v-else :svg-title=\"button.title\" />\n </template>\n <template v-if=\"!button?.isShort\" #default>\n {{ getButtonTitle(button) }}\n </template>\n <template v-if=\"button.iconRight || button.variant === 'open'\" #iconRight>\n <external-link-icon\n v-if=\"button?.variant === 'open'\"\n :svg-title=\"getButtonTitle(button, true)\"\n />\n <component :is=\"button.iconRight\" v-else :svg-title=\"button.title\" />\n </template>\n </bento-button>\n </div>\n </div>\n </div>\n </Transition>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, inject, type PropType, ref, type Ref } from 'vue';\n import { BentoButton } from '@/components/button';\n import { BentoMenu, type BentoMenuItem } from '@/components/menu';\n import { Copy } from '@/internal/copy';\n import { printDevelopmentWarning } from '@/utils/ts/print-development-warning';\n import { type BentoDatagridDataItem } from '@/components/data-grid/data-grid.types';\n import { DATA_GRID_TOUCH_DEVICE } from '@/components/data-grid/data-grid.keys';\n import Edit1Icon from '@adyen/ui-assets-icons-16/vue/edit-1';\n import ExternalLinkIcon from '@adyen/ui-assets-icons-16/vue/external-link';\n import OptionsVerticalIcon from '@adyen/ui-assets-icons-16/vue/options-vertical';\n\n // Types\n import type {\n BentoColumnCellAction,\n BentoColumnCellActionMenuItem,\n BentoColumnCellActions,\n BentoColumnCellActionsByCellDataFn,\n BentoColumnCellActionsProp,\n BentoDataGridRowActionsProp,\n } from './data-grid-cell-actions.types';\n\n // Translations\n import messages from './messages.json';\n import { useI18n } from '@/utils/ts/i18n';\n\n type MessageSchema = (typeof messages)['en-US'];\n const { t } = useI18n<{ message: MessageSchema }>({ messages });\n\n const props = defineProps({\n /**\n * Column definitions using 'key' to relate to data object.\n */\n cellActions: {\n type: [Array, Function] as PropType<BentoColumnCellActionsProp | BentoDataGridRowActionsProp>,\n required: true,\n validator: (value: BentoColumnCellActions) => value?.length <= 2,\n },\n\n /**\n * The column field key.\n */\n columnKey: {\n type: String,\n default: undefined,\n },\n\n /**\n * Disables any opening of the cell actions menus using the down arrow key.\n */\n disableArrowDownOpeningMenu: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Set to true if the datagrid has been scrolled and the right side has overflowing space.\n */\n hasRightOverflow: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Set to true if the row has a darker background when zebra rows is enabled.\n */\n hasZebraBackground: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Set to true if the row is selected.\n */\n isSelected: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Set to true if the row is highlighted.\n */\n isHighlighted: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Set if set to true will teleport the action menu component\n */\n teleportMenu: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The row data item object.\n */\n rowDataItem: {\n type: Object as PropType<BentoDatagridDataItem>,\n required: true,\n },\n });\n\n const emit = defineEmits([\"menu-open\", \"menu-close\", \"menu-item-click\"]);\n\n const isTouchDevice: Ref<boolean> = inject(DATA_GRID_TOUCH_DEVICE, ref(false));\n\n // Helper to get text for menu items, always returning a string\n const getMenuItemText = (action: BentoColumnCellAction | BentoColumnCellActionMenuItem) => {\n // If it's already a menu item with a text property, use it\n if ('text' in action && action.text !== undefined) {\n return action.text;\n }\n // Otherwise, derive from variant or title\n switch ((action as BentoColumnCellAction).variant) {\n case 'copy':\n return t('copy');\n case 'edit':\n return t('edit');\n case 'open':\n return t('open');\n case 'more':\n return t('more');\n default:\n return (action as BentoColumnCellAction).title;\n }\n };\n\n const getMenuItemIcon = (action: BentoColumnCellAction) => {\n switch (action.variant) {\n case 'copy':\n return Copy;\n case 'edit':\n return Edit1Icon;\n case 'open':\n return ExternalLinkIcon;\n default:\n return undefined;\n }\n };\n\n const isRowActions = computed(() => props.columnKey === undefined);\n const conditionalCellActionsBackgroundGradientClasses = computed(() => ({\n 'b-data-grid-cell-actions__background-gradient--with-row-actions-and-overflow':\n isRowActions.value && props.hasRightOverflow,\n 'b-data-grid-cell-actions__background-gradient--zebra': props.hasZebraBackground,\n 'b-data-grid-cell-actions__background-gradient--highlighted': props.isHighlighted,\n 'b-data-grid-cell-actions__background-gradient--selected': props.isSelected,\n }));\n const conditionalCellActionsClasses = computed(() => ({\n 'b-data-grid-cell-actions__actions--with-row-actions': isRowActions.value,\n 'b-data-grid-cell-actions__actions--zebra': props.hasZebraBackground,\n 'b-data-grid-cell-actions__actions--highlighted': props.isHighlighted,\n 'b-data-grid-cell-actions__actions--selected': props.isSelected,\n }));\n const showGradientElement = computed(() => !isRowActions.value || (isRowActions.value && props.hasRightOverflow));\n\n /**\n * Checks if the passed object is a cell actions function that returns an cell actions array.\n * @param cellActions - a cell actions array or function\n */\n function isBentoColumnCellActionsByCellValueDataFn(\n cellActions: BentoColumnCellActionsProp\n ): cellActions is BentoColumnCellActionsByCellDataFn {\n return typeof cellActions === 'function';\n }\n const computedCellActions = computed(() => {\n const cellActions = isBentoColumnCellActionsByCellValueDataFn(props.cellActions)\n ? props.cellActions?.(props.rowDataItem, props.columnKey)\n : props.cellActions;\n\n if (isTouchDevice.value && !isRowActions.value && cellActions) {\n const flattenedMenuItems: Array<BentoColumnCellActionMenuItem> = [];\n\n cellActions.forEach(action => {\n if (action.menuData) {\n action.menuData.forEach(subMenuItem => {\n flattenedMenuItems.push(subMenuItem);\n });\n } else {\n flattenedMenuItems.push({\n text: getMenuItemText(action),\n event: action.event,\n critical: action.critical,\n disabled: action.disabled,\n icon: getMenuItemIcon(action),\n });\n }\n });\n\n return [\n {\n variant: 'more',\n isShort: true,\n iconLeft: OptionsVerticalIcon,\n menuData: transformMenuEvents(flattenedMenuItems),\n },\n ] as BentoColumnCellActions;\n }\n\n // Do not allow users to provide more than 2 cell action buttons\n if (!isTouchDevice.value && cellActions?.length > 2) {\n printDevelopmentWarning(\n 'WARNING: BentoDataGrid Cell actions can only have a maximum of 2 actions, if you need more consider using the menuData property instead.'\n );\n }\n\n return cellActions?.slice(0, 2);\n });\n\n const getButtonTitle = computed(() => (button: BentoColumnCellAction, isForSvgTitle?: boolean) => {\n if ((!isForSvgTitle && button.isShort) || (isForSvgTitle && !button.isShort)) {\n return undefined;\n }\n\n switch (button.variant) {\n case 'copy':\n return t('copy');\n case 'edit':\n return t('edit');\n case 'open':\n return t('open');\n case 'more':\n return t('more');\n default:\n return button.title;\n }\n });\n\n const generateButtonEvents = (button: BentoColumnCellAction) =>\n button?.event !== undefined\n ? {\n click: (event: MouseEvent) => {\n event.stopPropagation();\n button.event(props.rowDataItem, props.columnKey);\n },\n }\n : {};\n\n const generateMenuEvents = (menuDataItem: BentoColumnCellActionMenuItem): BentoMenuItem => ({\n ...menuDataItem,\n handler: () => {\n if (menuDataItem?.handler && typeof menuDataItem.handler === 'function') {\n menuDataItem?.handler();\n }\n if (menuDataItem?.event && typeof menuDataItem.event === 'function') {\n menuDataItem?.event(props.rowDataItem, props.columnKey);\n }\n },\n });\n\n const transformMenuEvents = (menuData: Array<BentoColumnCellActionMenuItem>) =>\n menuData.map(menuDataItem => {\n const transformedMenuData = menuDataItem;\n if (transformedMenuData?.items) {\n transformedMenuData.items = transformMenuEvents(transformedMenuData.items);\n }\n return { ...generateMenuEvents(transformedMenuData) };\n });\n\n const getCopyText = (button: BentoColumnCellAction) =>\n button?.getCopyData !== undefined\n ? button.getCopyData(props.rowDataItem, props.columnKey)\n : props.columnKey\n ? (props.rowDataItem?.[props.columnKey]?.toString() as string)\n : '';\n\n const shouldShowMenuIconLeft = (button: BentoColumnCellAction) => button.iconLeft || button?.variant === 'more';\n</script>\n\n<script lang=\"ts\">\n /**\n * Internal component to display the data-grid actions.\n * There are 4 different pre-defined buttons that can be used by using the `variant` property.\n *\n * The component renders buttons or a menu depending on the actions provided.\n *\n * @example\n * <data-grid-cell-actions\n * :cell-actions=\"[\n * { variant: 'edit', event: () => {} },\n * {\n * variant: 'more',\n * isShort: true,\n * menuData: [\n * {\n * text: 'Cancel payment',\n * handler: () => {}),\n * critical: true,\n * },\n * {\n * text: 'Transfer payment',\n * handler: () => {},\n * },\n * {\n * text: 'Delete payment',\n * handler: () => {},\n * disabled: true,\n * },\n * ],\n * },\n * ]\"\n * column-key=\"payment\"\n * :row-data-item=\"rowData\"\n * />\n */\n export default {\n i18n: { messages },\n name: 'data-grid-cell-actions',\n };\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-cell-actions.scss\" />\n","import { type BentoColumn } from '../data-grid-columns/data-grid-columns.types';\n\nexport enum DataGridCellPropClass {\n ACTION_COL_NESTED_CONTENT_AND_SELECTION_ENABLED = 'action-col-nested-content-and-selection-enabled',\n ACTION_COL_NESTED_CONTENT_ENABLED = 'action-col-nested-content-enabled',\n ACTION_COL_SELECTION_ENABLED = 'action-col-selection-enabled',\n COLUMN_HOVERED = 'column-hovered',\n COLUMN_HOVERED_NO_BORDER_LEFT = 'column-hovered-no-border-left',\n COLUMN_HOVERED_NO_BORDER_RIGHT = 'column-hovered-no-border-right',\n CONDENSED = 'condensed',\n FROZEN = 'frozen',\n IS_COLUMN_REORDERING = 'is-column-re-ordering',\n IS_COLUMN_REORDERING_TARGET_LEFT = 'is-column-re-order-target-left',\n IS_COLUMN_REORDERING_TARGET_RIGHT = 'is-column-re-order-target-right',\n LAST_FROZEN_COLUMN_CELL = 'last-frozen-column-cell',\n NESTED_CONTENT_ENABLED = 'nested-content-toggle-enabled',\n NUMERIC = 'numeric',\n OVERFLOW_ELLIPSIS = 'overflow-ellipsis',\n PADDING_LEFT_UNSET = 'padding-left-unset',\n PADDING_RIGHT_UNSET = 'padding-right-unset',\n SLASHED_ZERO = 'slashed-zero',\n}\n\nexport interface DataGridCellDragEvents {\n dragenter?: (e: DragEvent) => void;\n drop?: () => void;\n dragover?: (e: DragEvent) => void;\n}\n\nexport type DataGridCellDragEventsForColumn = (column: BentoColumn) => {\n dragenter?: (e: DragEvent) => void;\n drop?: () => void;\n dragover?: (e: DragEvent) => void;\n};\n\nexport interface DataGridCellColumnSet {\n columnSet: Array<BentoColumn>;\n id: string;\n isFrozenColumns?: boolean;\n}\n\nexport interface DataGridCellEvents extends DataGridCellDragEvents {\n keyup?: (event: KeyboardEvent) => void;\n keydown?: (event: KeyboardEvent) => void;\n mouseenter?: () => void;\n mouseleave?: (e: MouseEvent) => void;\n focus?: (e: FocusEvent) => void;\n focusout?: (e: FocusEvent) => void;\n}\n\nexport type DataGridCellEventsForColumn = (column: BentoColumn) => DataGridCellEvents;\n","/**\n * Checks if the currently focused element has a visible focus state.\n * This is useful for determining whether to show a focus ring, especially\n * for accessibility purposes. It checks for the `:focus-visible` pseudo-class\n * or the `.focus-visible` class used by polyfills.\n *\n * @returns True if the active element has a visible focus, false otherwise.\n */\nexport const isFocusVisible = () => {\n const activeElement = document.activeElement;\n\n if (!activeElement) {\n return false;\n }\n\n // Check for the modern pseudo-class OR the older polyfill class\n return activeElement.matches(':focus-visible') || activeElement.matches('.focus-visible');\n};\n","<template>\n <div\n :key=\"`cell-${column.field}`\"\n ref=\"gridcellRef\"\n :aria-hidden=\"ariaHidden\"\n :data-testid=\"`cell-${column.field}`\"\n :data-cellindex=\"getCellIndex(rowIndex, colIndex, columnSetIndex)\"\n class=\"b-data-grid-cell\"\n :class=\"conditionalRowCellClasses(column)\"\n role=\"gridcell\"\n :tabindex=\"tabIndex\"\n :aria-colindex=\"getColIndex(colIndex, columnSetIndex) + 1\"\n :style=\"{\n width: column.autoWidth && isMeasuringColumnWidths ? 'auto' : `${column.width}px`,\n }\"\n v-on=\"getGridcellEvents(column)\"\n >\n <template v-if=\"column.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME\">\n <template v-if=\"selectable\">\n <bento-checkbox\n class=\"b-data-grid-cell__select-cell\"\n :aria-label=\"t('selectRow')\"\n :disabled=\"isDataItemDisabled(rowData)\"\n :indeterminate=\"selectionIsIndeterminate\"\n :model-value=\"selectedItems\"\n :value=\"getDataItemId(rowData)\"\n :tabindex=\"isFocused ? 0 : -1\"\n @update:model-value=\"$emit('select-row', $event)\"\n />\n </template>\n <template v-if=\"nestedContent\">\n <bento-toggle-button\n ref=\"menuButtonRef\"\n aria-haspopup=\"true\"\n :aria-controls=\"controlledNestedRowElementIds\"\n condensed\n variant=\"tertiary\"\n :toggled=\"isNestedContentExpanded\"\n @click=\"toggleNestedContent\"\n >\n <template #iconLeft>\n <chevron-up-icon\n v-if=\"isNestedContentExpanded\"\n class=\"b-accordion-item__icon\"\n :svg-title=\"t('collapseNestedContent')\"\n />\n <chevron-down-icon\n v-else\n class=\"b-accordion-item__icon\"\n :svg-title=\"t('expandNestedContent')\"\n />\n </template>\n </bento-toggle-button>\n </template>\n </template>\n <template v-else>\n <bento-typography\n el=\"div\"\n class=\"b-data-grid-cell__cell-content\"\n :class=\"computedCellContentClasses\"\n data-testid=\"cell-content\"\n >\n <slot :item=\"rowData\" :row-index=\"rowIndex\" :name=\"`item-${column.field}`\">\n <span :title=\"conditionalTitleAttribute(column, rowData[column.field])\">{{\n getRowData(rowData[column.field])\n }}</span>\n </slot>\n </bento-typography>\n <div v-if=\"column.cellActions?.length > 0\" class=\"b-data-grid-cell__cell-actions\">\n <data-grid-cell-actions\n v-if=\"(shouldShowCellActions || isTouchDevice) && (hasRowData || hasSlot(`item-${column.field}`))\"\n ref=\"cellActionsRef\"\n :cell-actions=\"column.cellActions\"\n :column-key=\"column.field\"\n :row-data-item=\"rowData\"\n :has-zebra-background=\"hasZebraBackground\"\n :is-highlighted=\"isHighlighted\"\n :is-selected=\"isSelected\"\n teleport-menu\n @menu-item-click=\"onMenuClose\"\n />\n </div>\n </template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import {\n computed,\n type ComputedRef,\n inject,\n nextTick,\n onMounted,\n type PropType,\n provide,\n type Ref,\n ref,\n type UnwrapRef,\n useSlots,\n watch,\n } from 'vue';\n import {\n focusOnInteractiveChild,\n makeAllInteractiveChildrenFocusable,\n makeAllInteractiveChildrenUnFocusable,\n } from '../../utils';\n import { DATAGRID_ACTIONS_COLUMN_FIELD_NAME } from '../../composables/use-calculate-column-width';\n import { BentoCheckbox } from '@/components/checkbox';\n import { BentoTypography } from '@/components/typography';\n import { BentoToggleButton } from '@/components/button';\n import DataGridCellActions from '../data-grid-cell-actions/data-grid-cell-actions.vue';\n import { DATA_GRID_SLASHED_ZERO, DATA_GRID_SMALL_CONTAINER, DATA_GRID_TOUCH_DEVICE } from '../../data-grid.keys';\n import ChevronDownIcon from '@adyen/ui-assets-icons-16/vue/chevron-down';\n import ChevronUpIcon from '@adyen/ui-assets-icons-16/vue/chevron-up';\n import { DATA_GRID_CELL_MENU_REGISTERING_INJECTION_KEY } from '@/components/data-grid/components/data-grid-cell/data-grid-cell.keys';\n\n // Types and enums\n import {\n type BentoColumn,\n BentoColumnOverflow,\n type BentoDatagridDataItem,\n type BentoDatagridDataItemId,\n type BentoDatagridGetDataItemIdFn,\n type BentoDatagridIsDataItemDisabledFn,\n } from '@/components/data-grid/data-grid.types';\n import {\n type DataGridCellColumnSet,\n type DataGridCellDragEventsForColumn,\n type DataGridCellEvents,\n type DataGridCellEventsForColumn,\n DataGridCellPropClass,\n } from './data-grid-cell.types';\n import type { BentoDatagridDraggingColumnState } from '../data-grid-columns/data-grid-columns.types';\n import type { DatagridColumnHoveringState } from '@/components/data-grid/composables/use-column-hovering/use-column-hovering.types';\n\n // Utils\n import { useHasSlot } from '@/composables';\n import { useI18n } from '@/utils/ts/i18n';\n import { isFocusVisible } from '@/utils/ts/focus-visible';\n import { EventKey } from '@/types/utils-events';\n\n // Translations\n import messages from './messages.json';\n\n const slots = useSlots();\n const hasSlot = useHasSlot(slots);\n\n type MessageSchema = (typeof messages)['en-US'];\n const { t } = useI18n<{ message: MessageSchema }>({ messages });\n\n const props = defineProps({\n draggingEventsForRowCell: {\n type: Function as PropType<DataGridCellDragEventsForColumn>,\n required: true,\n },\n\n /**\n * The columns sets including\n */\n columnSets: {\n type: Array as PropType<Array<DataGridCellColumnSet>>,\n required: true,\n },\n\n /**\n * The columns set we are iterating over\n */\n column: {\n type: Object as PropType<BentoColumn>,\n required: true,\n },\n\n colIndex: {\n type: Number,\n required: true,\n },\n\n columnSetIndex: {\n type: Number,\n required: true,\n },\n\n /**\n * Sets the row cells to the condensed padding state.\n */\n condensed: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Columns being dragged, contains dragging column and a target column\n */\n draggingColumns: {\n type: Object as PropType<BentoDatagridDraggingColumnState>,\n default: undefined,\n },\n\n /**\n * A customisable method to retrieve a unique identifier for a data item in the array of data supplied.\n * This is used selecting and performance reasons and must exist in each data item.\n */\n getDataItemId: {\n type: Function as PropType<BentoDatagridGetDataItemIdFn>,\n default: (item: BentoDatagridDataItem) => item.id,\n },\n\n /**\n * Set to true if the cell has a darker background when zebra rows is enabled.\n */\n hasZebraBackground: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Set to true if the row is selected.\n */\n isSelected: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Set to true if the row is highlighted.\n */\n isHighlighted: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The column hovered over state and whether the hovered over column should show a border right or left.\n */\n hoveredOverColumnState: {\n type: Object as PropType<DatagridColumnHoveringState>,\n required: true,\n },\n\n /**\n * A customisable method to determine if a row is not selectable.\n * The default is that every row is selectable.\n */\n isDataItemDisabled: {\n type: Function as PropType<BentoDatagridIsDataItemDisabledFn>,\n default: () => false,\n },\n\n isMeasuringColumnWidths: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines if the nested content is visible.\n */\n isNestedContentExpanded: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines if the nest content slot is enabled for this data row.\n */\n nestedContent: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The IDs of the rows this cell controls to show / hide them.\n */\n nestedRowsElementIds: {\n type: Array as PropType<Array<string>>,\n default: () => [],\n },\n\n /**\n * The row data object\n */\n rowData: {\n type: Object as PropType<BentoDatagridDataItem>,\n required: true,\n },\n\n rowIndex: {\n type: Number,\n required: true,\n },\n\n /**\n * The row selection checkbox indeterminate state.\n */\n selectionIsIndeterminate: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines if the row selection is enabled.\n */\n selectable: {\n type: Boolean,\n default: false,\n },\n\n selectedItems: {\n type: Array as PropType<Array<BentoDatagridDataItemId>>,\n required: true,\n },\n });\n\n const emit = defineEmits([\"on-frozen-columns-key-press\", \"select-row\", \"register-row-cell-element\", \"cell-hovered\", \"nested-content-toggled\"]);\n\n // References\n const gridcellRef = ref<HTMLDivElement | null>(null);\n const cellActionsRef = ref<InstanceType<typeof DataGridCellActions>>(null);\n const shouldShowCellActions = ref(false);\n const childrenMenuContainerElements = ref<Array<Ref<UnwrapRef<HTMLDivElement>>>>([]);\n const isFocused = ref(false);\n const focusableItems = ref<Array<{ node: HTMLElement }>>();\n const hasEverBeenFocused = ref(false);\n\n // Computed\n const hasRowData = computed(() => !!props.rowData?.[props.column.field]);\n const controlledNestedRowElementIds = computed(() =>\n props.column.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME && props.nestedRowsElementIds?.length > 0\n ? props.nestedRowsElementIds.join(' ')\n : undefined\n );\n const ariaHidden = computed(\n () => props.column.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME && !props.selectable && !props.nestedContent\n );\n const tabIndex = computed(() => {\n if (!ariaHidden.value) {\n // The first cell of the grid should be tabbable on initial render to allow keyboard navigation into the grid.\n if (getCellIndex(props.rowIndex, props.colIndex, props.columnSetIndex) === 0 && !hasEverBeenFocused.value) {\n return '0';\n }\n\n // A cell becomes part of the tab order only when it is focused.\n if (isFocused.value) {\n return '0';\n }\n }\n\n // Action cells are not directly tabbable; they are accessed via cell navigation.\n if (props.column.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME) {\n return '-1';\n }\n\n // By default, cells are not in the tab order.\n return '-1';\n });\n\n // Row data retrieval methods\n const conditionalTitleAttribute = (column: BentoColumn, content: unknown) =>\n column?.overflow === BentoColumnOverflow.ELLIPSIS ? `${content}` : undefined;\n const getRowData = (rowData: unknown) => rowData ?? '-';\n\n // Cell and Columns index calculation\n const sumColumnAmountsInColumnSets = (limitIndex?: number) =>\n props.columnSets.slice(0, limitIndex).reduce((total, { columnSet }) => total + columnSet.length, 0);\n // Sums the amount of columns on every previous column set to find\n // the absolute column index (useful for frozen columns use case)\n const getColIndex = (colIndex: number, colSetIndex: number) => colIndex + sumColumnAmountsInColumnSets(colSetIndex);\n const getCellIndex = (rowIndex: number, colIndex: number, colSetIndex: number) =>\n sumColumnAmountsInColumnSets() * rowIndex + getColIndex(colIndex, colSetIndex);\n\n /**\n * We check here if we are leaving the cell but mouse into a child menu\n * If this is the case we don't want to hide the cell actions.\n * @param relatedTarget\n */\n const isLeavingCellFocus = (relatedTarget: EventTarget) => {\n if (\n relatedTarget === null ||\n (!gridcellRef.value.contains(relatedTarget as Node) &&\n !childrenMenuContainerElements.value\n ?.map(registeredMenuRef => registeredMenuRef.value)\n .some(menuElement => menuElement === relatedTarget || menuElement?.contains(relatedTarget as Node)))\n ) {\n shouldShowCellActions.value = false;\n }\n };\n\n /**\n * Hides the cell actions when a menu item is clicked. This is necessary as relying solely on\n * focus-out events is not reliable, especially when the menu is teleported or an action\n * causes focus to leave the window.\n */\n const onMenuClose = () => {\n shouldShowCellActions.value = false;\n };\n\n // Events\n const hasInteractiveElFocusedInside = ref(false);\n const getGridcellEvents: DataGridCellEventsForColumn = (column: BentoColumn) => {\n const defaultEvents: DataGridCellEvents = {\n ...props.draggingEventsForRowCell(column),\n // Focus on the first interactive child in the grid cell if one exists\n focus: async () => {\n if (!isFocusVisible()) {\n return;\n }\n\n isFocused.value = true;\n hasEverBeenFocused.value = true;\n makeAllInteractiveChildrenFocusable(focusableItems.value);\n await nextTick();\n const hasFocusedOnInteractiveChild = focusOnInteractiveChild(gridcellRef.value);\n if (hasFocusedOnInteractiveChild) {\n hasInteractiveElFocusedInside.value = true;\n }\n },\n focusout: () => {\n if (!isFocusVisible()) {\n return;\n }\n hasInteractiveElFocusedInside.value = false;\n },\n keydown: (event: KeyboardEvent) => {\n if (event.key !== EventKey.TAB) {\n hasInteractiveElFocusedInside.value = false;\n isFocused.value = false;\n makeAllInteractiveChildrenUnFocusable(gridcellRef.value);\n }\n },\n };\n\n const gridCellEvents: DataGridCellEvents = { ...defaultEvents };\n\n if (column.frozen) {\n gridCellEvents.keyup = (event: Event) => emit('on-frozen-columns-key-press', event);\n gridCellEvents.keydown = (event: KeyboardEvent) => {\n defaultEvents.keydown(event);\n emit('on-frozen-columns-key-press', event);\n };\n }\n if (column.cellActions) {\n gridCellEvents.mouseenter = () => {\n shouldShowCellActions.value = true;\n };\n gridCellEvents.mouseleave = (e: MouseEvent) => {\n isLeavingCellFocus(e?.relatedTarget);\n };\n gridCellEvents.focus = async (e: FocusEvent) => {\n defaultEvents.focus(e);\n\n await nextTick();\n shouldShowCellActions.value = true;\n };\n gridCellEvents.focusout = (e: FocusEvent) => {\n defaultEvents.focusout(e);\n isLeavingCellFocus(e?.relatedTarget);\n };\n }\n return gridCellEvents;\n };\n\n onMounted(() => {\n focusableItems.value = makeAllInteractiveChildrenUnFocusable(gridcellRef.value);\n });\n\n const toggleNestedContent = () => {\n emit('nested-content-toggled');\n };\n // Each cell knows it's on hover state but this state needs to be emitted up\n // in order for the DataGrid to know which row to set the hovered state on.\n watch(\n () => shouldShowCellActions.value,\n () => {\n if (shouldShowCellActions.value === true) {\n emit('cell-hovered', props.rowIndex);\n } else {\n emit('cell-hovered', -1);\n }\n }\n );\n\n const registerMenuContainerElement = (menuContainerElement: Ref<UnwrapRef<HTMLDivElement>>) => {\n childrenMenuContainerElements.value.push(menuContainerElement);\n };\n\n const menuMouseLeave = (e: MouseEvent) => {\n if (!gridcellRef.value.contains(e?.relatedTarget as Node)) {\n shouldShowCellActions.value = false;\n }\n };\n\n provide<{\n registerMenuContainerElement: (menuContainerElement: Ref<UnwrapRef<HTMLDivElement>>) => void;\n menuMouseLeave: (e: MouseEvent) => void;\n }>(DATA_GRID_CELL_MENU_REGISTERING_INJECTION_KEY, {\n registerMenuContainerElement,\n menuMouseLeave,\n });\n\n const hasSlashedZero = inject(DATA_GRID_SLASHED_ZERO, ref(false));\n\n const isSmallContainer: ComputedRef<boolean> = inject(\n DATA_GRID_SMALL_CONTAINER,\n computed(() => false)\n );\n\n const isTouchDevice: Ref<boolean> = inject(DATA_GRID_TOUCH_DEVICE, ref(false));\n\n // Styling\n const conditionalRowCellClasses = (column: BentoColumn) => ({\n [`b-data-grid-cell--${DataGridCellPropClass.COLUMN_HOVERED}`]:\n column?.field === props.hoveredOverColumnState.hoveredOverColumnField,\n [`b-data-grid-cell--${DataGridCellPropClass.COLUMN_HOVERED_NO_BORDER_LEFT}`]:\n column?.field === props.hoveredOverColumnState.hoveredOverColumnField &&\n props.hoveredOverColumnState.noBorderLeft,\n [`b-data-grid-cell--${DataGridCellPropClass.COLUMN_HOVERED_NO_BORDER_RIGHT}`]:\n column?.field === props.hoveredOverColumnState.hoveredOverColumnField &&\n props.hoveredOverColumnState.noBorderRight,\n [`b-data-grid-cell--${DataGridCellPropClass.PADDING_LEFT_UNSET}`]: column?.padding?.left === false,\n [`b-data-grid-cell--${DataGridCellPropClass.PADDING_RIGHT_UNSET}`]: column?.padding?.right === false,\n [`b-data-grid-cell--${DataGridCellPropClass.NUMERIC}`]: column?.numeric,\n [`b-data-grid-cell--${DataGridCellPropClass.CONDENSED}`]: props.condensed,\n [`b-data-grid-cell--${DataGridCellPropClass.OVERFLOW_ELLIPSIS}`]:\n column?.overflow === BentoColumnOverflow.ELLIPSIS,\n [`b-data-grid-cell--${DataGridCellPropClass.IS_COLUMN_REORDERING}`]:\n props.draggingColumns.dragging?.field === column.field,\n [`b-data-grid-cell--${DataGridCellPropClass.IS_COLUMN_REORDERING_TARGET_LEFT}`]:\n props.draggingColumns.target?.field === column.field && props.draggingColumns?.dragToLeft,\n [`b-data-grid-cell--${DataGridCellPropClass.IS_COLUMN_REORDERING_TARGET_RIGHT}`]:\n props.draggingColumns.target?.field === column.field && !props.draggingColumns?.dragToLeft,\n [`b-data-grid-cell--${DataGridCellPropClass.FROZEN}`]: column?.frozen,\n [`b-data-grid-cell--${DataGridCellPropClass.NESTED_CONTENT_ENABLED}`]: props.nestedContent,\n [`b-data-grid-cell--${DataGridCellPropClass.ACTION_COL_NESTED_CONTENT_ENABLED}`]:\n props.nestedContent && !props.selectable && column.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME,\n [`b-data-grid-cell--${DataGridCellPropClass.ACTION_COL_NESTED_CONTENT_AND_SELECTION_ENABLED}`]:\n props.nestedContent && props.selectable && column.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME,\n [`b-data-grid-cell--${DataGridCellPropClass.ACTION_COL_SELECTION_ENABLED}`]:\n column.field === DATAGRID_ACTIONS_COLUMN_FIELD_NAME && props.selectable,\n [`b-data-grid-cell--${DataGridCellPropClass.SLASHED_ZERO}`]: hasSlashedZero.value,\n 'b-data-grid-cell--small-container': isSmallContainer.value,\n });\n const computedCellContentClasses = computed(() => ({\n 'b-data-grid-cell__cell-content--is-focused-on-inside-interactive-element': hasInteractiveElFocusedInside.value,\n }));\n\n // Exposed refs\n defineExpose({\n gridcellRef,\n });\n</script>\n\n<script lang=\"ts\">\n /**\n * Internal component to display the BentoDataGrid cells.\n *\n * The component can also render the selecting row checkbox as well as cell actions.\n *\n * @example\n * <data-grid-cell\n *\n * />\n */\n export default {\n i18n: { messages },\n name: 'data-grid-cell',\n };\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-cell.scss\" />\n","<template>\n <div class=\"b-data-grid-row-container\" role=\"presentation\">\n <div\n v-bind=\"ariaRowAttributes\"\n :id=\"rowId?.toString()\"\n :key=\"rowIndex\"\n class=\"b-data-grid-row-container__row\"\n :class=\"conditionalRowClasses(rowData, rowIndex)\"\n role=\"row\"\n :aria-selected=\"getRowAriaSelectedValue(rowData)\"\n @click=\"onRowClick\"\n @keyup.enter=\"onRowClick\"\n @keyup.space=\"onRowClick\"\n >\n <template v-for=\"({ columnSet, id, isFrozenColumns }, columnSetIndex) of columnSets\">\n <div\n v-if=\"columnSet?.length\"\n :key=\"`data-grid-rows-${id}`\"\n class=\"b-data-grid-row-container__cells\"\n :class=\"conditionalRowSetClasses(isFrozenColumns, isSmallContainer)\"\n :data-testid=\"`data-grid-${id}-rows`\"\n >\n <data-grid-cell\n v-for=\"(column, colIndex) in columnSet\"\n :key=\"`cell-${column.field}`\"\n :ref=\"el => registerRowCellRef(el, column.field)\"\n class=\"b-data-grid-row-container__cell\"\n :column=\"column\"\n :column-set-index=\"columnSetIndex\"\n :col-index=\"colIndex\"\n :column-sets=\"columnSets\"\n :condensed=\"condensed\"\n :dragging-columns=\"draggingColumns\"\n :dragging-events-for-row-cell=\"draggingEventsForRowCell\"\n :get-data-item-id=\"getDataItemId\"\n :has-zebra-background=\"isRowEven\"\n :is-highlighted=\"isHighlightedRow(rowData)\"\n :is-selected=\"isSelectedRow(rowData)\"\n :hovered-over-column-state=\"hoveredOverColumnState\"\n :is-data-item-disabled=\"isDataItemDisabled\"\n :is-measuring-column-widths=\"isMeasuringColumnWidths\"\n :is-nested-content-expanded=\"isNestedContentShown\"\n :nested-content=\"shouldShowNestedContentToggle\"\n :nested-rows-element-ids=\"allNestedRowIds\"\n :row-data=\"rowData\"\n :row-index=\"rowIndex\"\n :selection-is-indeterminate=\"hasUnSelectedNestedRows\"\n :selectable=\"selectable\"\n :selected-items=\"selectedItems\"\n @cell-hovered=\"emit('cell-hovered', $event)\"\n @on-frozen-columns-key-press=\"emit('on-frozen-columns-key-press', $event)\"\n @select-row=\"onRowSelect\"\n @nested-content-toggled=\"nestedContentToggled\"\n >\n <template v-for=\"(_, innerSlot) of slots\" #[innerSlot]=\"scope\">\n <slot :name=\"innerSlot\" v-bind=\"scope\" />\n </template>\n </data-grid-cell>\n </div>\n <div\n v-if=\"!isFrozenColumns && rowActions\"\n :key=\"`data-grid-row-actions-${id}`\"\n ref=\"rowActionsRef\"\n :aria-colindex=\"sumColumnAmountsInColumnSets().toString()\"\n class=\"b-data-grid-row-container__row-actions-container\"\n :class=\"conditionalRowActionsContainerClasses\"\n :style=\"computedRowActionsStyles\"\n :data-cellindex=\"getRowActionsCellIndex()\"\n tabindex=\"-1\"\n role=\"gridcell\"\n @focus=\"onRowActionsCellFocus\"\n @focusOut=\"onRowActionsCellFocusOut\"\n @keydown=\"onRowActionsCellOnKeyDown\"\n >\n <data-grid-cell-actions\n class=\"b-data-grid-row-container__row-actions\"\n disable-arrow-down-opening-menu\n :cell-actions=\"rowActions\"\n :has-right-overflow=\"hasRightOverflow\"\n :row-data-item=\"rowData\"\n teleport-menu\n @menu-open=\"onRowActionMenuOpen\"\n @menu-close=\"onRowActionMenuClose\"\n />\n </div>\n </template>\n </div>\n\n <Transition\n v-if=\"\n (hasNestedContent && hasSlot('nested-slot') && shouldShowNestedContent(rowData)) ||\n (hasNestedRows && shouldShowNestedRowsBooleanResult)\n \"\n :key=\"`${rowIndex}-nest-content`\"\n name=\"b-data-grid-row-container__animation--nested-content\"\n >\n <div\n v-if=\"isNestedContentShown && shouldShowRenderNestedRows\"\n :class=\"conditionalNestedRowClasses\"\n data-testid=\"nested-content-container\"\n :style=\"nestedContentStyles\"\n role=\"presentation\"\n >\n <div ref=\"nestedContentRef\">\n <div\n v-if=\"isLoadingNestedRows\"\n class=\"b-data-grid-row-container__row-nested-rows-loading-container\"\n >\n <bento-loading-indicator />\n </div>\n <data-grid-row\n v-for=\"(childRowData, childRowIndex) in rowData.children\"\n v-bind=\"props\"\n :id=\"getRowId(childRowIndex)\"\n :key=\"`child-${childRowIndex}`\"\n :row-data=\"childRowData\"\n :row-index=\"childRowIndex\"\n :row-set-size=\"rowData.children.length\"\n is-nested-row\n @cell-hovered=\"emit('cell-hovered', $event)\"\n @row-click=\"emit('row-click', ...$event)\"\n @on-frozen-columns-key-press=\"emit('on-frozen-columns-key-press', $event)\"\n @select-row=\"onNestedRowSelect(childRowData, $event)\"\n >\n <template v-for=\"(_, innerSlot) of slots\" #[innerSlot]=\"scope\">\n <slot :name=\"innerSlot\" v-bind=\"scope\" />\n </template>\n </data-grid-row>\n </div>\n </div>\n\n <div\n v-else-if=\"isNestedContentShown\"\n v-bind=\"nestedContentContainerDivAriaAttributes\"\n :class=\"conditionalNestedRowClasses\"\n data-testid=\"nested-content-container\"\n :style=\"nestedContentStyles\"\n role=\"row\"\n tabindex=\"-1\"\n >\n <div ref=\"nestedContentRef\" role=\"gridcell\">\n <div\n v-if=\"isLoadingNestedRows\"\n class=\"b-data-grid-row-container__row-nested-rows-loading-container\"\n >\n <bento-loading-indicator />\n </div>\n <div v-else-if=\"hasSlot('nested-slot') && shouldShowNestedContent(rowData)\">\n <slot :item=\"rowData\" name=\"nested-slot\" />\n </div>\n </div>\n </div>\n </Transition>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import {\n type ComponentPublicInstance,\n computed,\n type ComputedRef,\n inject,\n onMounted,\n type PropType,\n ref,\n useSlots,\n watch,\n } from 'vue';\n\n import { BentoLoadingIndicator } from '@/components/loading-indicator';\n import {\n focusOnInteractiveChild,\n makeAllInteractiveChildrenFocusable,\n makeAllInteractiveChildrenUnFocusable,\n } from '@/components/data-grid/utils';\n import DataGridRow from '@/components/data-grid/components/data-grid-row/data-grid-row.vue';\n import DataGridCell from '@/components/data-grid/components/data-grid-cell/data-grid-cell.vue';\n import DataGridCellActions from '@/components/data-grid/components/data-grid-cell-actions/data-grid-cell-actions.vue';\n\n // Types and enums\n import {\n type BentoDatagridDataItem,\n type BentoDatagridDataItemId,\n type BentoDatagridGetDataItemIdFn,\n type BentoDatagridIsDataItemDisabledFn,\n type BentoDatagridShouldShowNestedContentFn,\n type BentoDatagridShouldShowNestedRowsFn,\n BentoDatagridStyleState,\n } from '@/components/data-grid/data-grid.types';\n import type {\n DataGridCellColumnSet,\n DataGridCellDragEventsForColumn,\n } from '../data-grid-cell/data-grid-cell.types';\n import type { BentoDatagridDraggingColumnState } from '../data-grid-columns/data-grid-columns.types';\n import type { DatagridColumnHoveringState } from '@/components/data-grid/composables/use-column-hovering';\n\n // Translations\n import { type Booleanish } from '@/types/prop-types';\n import { useHasSlot } from '@/composables/use-has-slot/use-has-slot';\n import { useExpandableContentHeight } from '@/composables/use-expandable-content-height/use-expandable-content-height';\n import { observeSizeOfElement } from '@/utils/ts/resize';\n import {\n DATAGRID_ACTIONS_COLUMN_FIELD_NAME,\n DATAGRID_CELL_OFFSET_PADDING,\n } from '@/components/data-grid/composables/use-calculate-column-width/use-calculate-column-width';\n import { generateUid } from '@/core/utils/ts';\n import { type BentoDataGridRowActionsProp } from '@/components/data-grid/components/data-grid-cell-actions/data-grid-cell-actions.types';\n import type { HTMLAttributes } from 'vue/types/jsx';\n import { EventKey } from '@/types/utils-events';\n import { DATA_GRID_SMALL_CONTAINER } from '@/components/data-grid/data-grid.keys';\n\n const slots = useSlots();\n const hasSlot = useHasSlot(slots);\n\n const props = defineProps({\n /**\n * Row actions property that generates which button to show in row actions area\n */\n rowActions: {\n type: [Function, Array] as PropType<BentoDataGridRowActionsProp>,\n default: undefined,\n },\n\n /**\n * When true, will emit a 'rowClick' event when a row is clicked. Will add cursor: pointer to rows.\n */\n allowRowClicks: { type: Boolean, default: false },\n\n /**\n * The columns sets including\n */\n columnSets: {\n type: Array as PropType<Array<DataGridCellColumnSet>>,\n required: true,\n },\n\n /**\n * Sets the row cells to the condensed padding state.\n */\n condensed: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Columns being dragged, contains dragging column and a target column\n */\n draggingColumns: {\n type: Object as PropType<BentoDatagridDraggingColumnState>,\n default: undefined,\n },\n\n /**\n * Dragging event handlers for each row cell\n */\n draggingEventsForRowCell: {\n type: Function as PropType<DataGridCellDragEventsForColumn>,\n required: true,\n },\n\n /**\n * A customisable method to retrieve a unique identifier for a data item in the array of data supplied.\n * This is used selecting and performance reasons and must exist in each data item.\n */\n getDataItemId: {\n type: Function as PropType<BentoDatagridGetDataItemIdFn>,\n default: (item: BentoDatagridDataItem) => item.id,\n },\n\n /**\n * Set to true if the datagrid has been scrolled and the left side has overflowing space.\n */\n hasLeftOverflow: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Enables the nested content slot functionality.\n */\n hasNestedContent: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Enables the nested content slot functionality.\n */\n hasNestedRows: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Set to true if the datagrid has been scrolled and the right side has overflowing space.\n */\n hasRightOverflow: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Highlighted row IDs.\n */\n highlightedRows: {\n type: Array as PropType<Array<BentoDatagridDataItemId>>,\n default: () => [],\n },\n\n /**\n * The row index of a currently hovered row.\n */\n hoveredRowIndex: {\n type: Number,\n default: -1,\n },\n\n /**\n * The column hovered over state and whether the hovered over column should show a border right or left.\n */\n hoveredOverColumnState: {\n type: Object as PropType<DatagridColumnHoveringState>,\n required: true,\n },\n\n /**\n * A customisable method to determine if a row is not selectable.\n * The default is that every row is selectable.\n */\n isDataItemDisabled: {\n type: Function as PropType<BentoDatagridIsDataItemDisabledFn>,\n default: () => false,\n },\n\n /**\n * If the row is of an even number.\n * Rows are 0th based index e.g. index 0 is an odd-numbered row.\n */\n isRowEven: {\n type: Boolean,\n default: false,\n },\n\n /**\n * If the row is the last child in it's parent container.\n */\n isRowLastChild: {\n type: Boolean,\n default: false,\n },\n\n /**\n * If columns are being measured for the autoWidth functionality.\n */\n isMeasuringColumnWidths: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines if this row is nested inside another row.\n */\n isNestedRow: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The maximum width of the row actions in all rows\n */\n rowActionsMaximumWidth: {\n type: Number,\n default: 0,\n },\n\n /**\n * The row data object\n */\n rowData: {\n type: Object as PropType<BentoDatagridDataItem>,\n required: true,\n },\n\n /**\n * The row index.\n */\n rowIndex: {\n type: Number,\n required: true,\n },\n\n /**\n * The row ID to be using for the ID attribute.\n */\n rowId: {\n type: Number,\n default: undefined,\n },\n\n /**\n * The number of rows that this row is within.\n */\n rowSetSize: {\n type: Number,\n default: 0,\n },\n\n /**\n * Determines whether to render frozen seperator on the row.\n */\n showFrozenColumnsSeparator: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Determines if the row selection is enabled.\n */\n selectable: {\n type: Boolean,\n default: false,\n },\n\n /**\n * The array of IDs for the selected rows.\n */\n selectedItems: {\n type: Array as PropType<Array<BentoDatagridDataItemId>>,\n required: true,\n },\n\n /**\n * Enables / Disables the nested-content slot\n */\n shouldShowNestedContent: {\n type: Function as PropType<BentoDatagridShouldShowNestedContentFn>,\n default: (_item: BentoDatagridDataItem) => true,\n },\n\n /**\n * Returns the nested rows for a given BentoDatagridDataItem.\n */\n shouldShowNestedRows: {\n type: Function as PropType<BentoDatagridShouldShowNestedRowsFn>,\n default: (_item: BentoDatagridDataItem) => true,\n },\n });\n\n const emit = defineEmits([\"cell-hovered\", \"on-frozen-columns-key-press\", \"select-row\", \"select-nested-row\", \"row-click\", \"nested-content-toggled\"]);\n\n // Refs\n const gridcellRefs = ref<{ [key: string]: HTMLDivElement }>({});\n const isNestedContentShown = ref(false);\n const nestedContentRef = ref();\n const rowActionsRef = ref();\n const nestedContentSlotId = generateUid('nested-content-slot');\n const isRowActionMenuOpen = ref(false);\n const focusableItems = ref<Array<{ node: HTMLElement }>>();\n\n onMounted(() => {\n if (rowActionsRef.value) {\n focusableItems.value = makeAllInteractiveChildrenUnFocusable(rowActionsRef.value);\n }\n });\n\n const shouldShowNestedRowsBooleanResult = computed(() => props.shouldShowNestedRows(props.rowData));\n const shouldShowRenderNestedRows = computed(\n () =>\n !props.isNestedRow &&\n props.hasNestedRows &&\n shouldShowNestedRowsBooleanResult.value &&\n props.rowData?.children?.length > 0\n );\n const isLoadingNestedRows = computed(\n () =>\n !props.isNestedRow &&\n props.hasNestedRows &&\n shouldShowNestedRowsBooleanResult.value &&\n (props.rowData?.children === undefined || props?.rowData?.children.length === 0)\n );\n const shouldShowNestedContentToggle = computed(\n () =>\n (props.hasNestedContent && props.shouldShowNestedContent(props.rowData)) ||\n (props.hasNestedRows && shouldShowNestedRowsBooleanResult.value && !props.isNestedRow)\n );\n const ariaRowAttributes = computed<HTMLAttributes>(() => {\n if (props.hasNestedContent || props.hasNestedRows) {\n const isNestedContentShownBooleanishVal = isNestedContentShown.value.toString() as Booleanish;\n return {\n 'aria-expanded': shouldShowNestedContentToggle.value ? isNestedContentShownBooleanishVal : undefined,\n 'aria-level': props.isNestedRow ? '2' : '1',\n 'aria-posinset': props.rowIndex + 1,\n 'aria-setsize': props.rowSetSize,\n };\n }\n return { 'aria-rowindex': props.rowIndex + 1 };\n });\n const nestedContentContainerDivAriaAttributes = computed<HTMLAttributes>(() => {\n if (isLoadingNestedRows.value) {\n return {\n 'aria-busy': 'true',\n 'aria-live': 'polite',\n };\n }\n if (\n shouldShowRenderNestedRows.value ||\n !props.hasNestedContent ||\n !props.shouldShowNestedContent(props.rowData)\n ) {\n return undefined;\n }\n return {\n 'aria-level': props.isNestedRow ? '3' : '2',\n 'aria-posinset': '1',\n 'aria-setsize': '1',\n id: nestedContentSlotId,\n role: 'row',\n tabindex: '-1',\n };\n });\n const nestedRowIds = computed(() => {\n if (shouldShowRenderNestedRows.value) {\n return props.rowData?.children?.reduce((acc, _val, index) => {\n acc[index] = generateUid('nested-row');\n return acc;\n }, {});\n }\n return [];\n });\n const allNestedRowIds = computed(() => {\n if (!isNestedContentShown.value) {\n return undefined;\n }\n if (props.hasNestedContent && props.shouldShowNestedContent(props.rowData)) {\n return [nestedContentSlotId];\n }\n\n if (shouldShowRenderNestedRows.value && Object.keys(nestedRowIds.value)?.length > 0) {\n const generatedRowIds = Object.values(nestedRowIds.value);\n if (generatedRowIds?.length > 0) {\n return generatedRowIds;\n }\n }\n return [];\n });\n const hasUnSelectedNestedRows = computed(() => {\n const childrendDataItemIds = props.rowData?.children?.map(nestedItem => props.getDataItemId(nestedItem));\n if (childrendDataItemIds?.length > 0) {\n const everyChildIsSelected = childrendDataItemIds.every(childId => props?.selectedItems?.includes(childId));\n const someItemsAreSelected = childrendDataItemIds.some(childId => props?.selectedItems?.includes(childId));\n return !everyChildIsSelected && someItemsAreSelected;\n }\n return false;\n });\n\n // Methods\n const registerRowCellRef = (el: Element | ComponentPublicInstance, field: string) => {\n // We always know this will be used on a DataGridCell component so we can cast it\n const gridCellComponent = el as InstanceType<typeof DataGridCell>;\n\n if (el !== null && gridCellComponent?.gridcellRef) {\n gridcellRefs.value[field] = gridCellComponent.gridcellRef as HTMLDivElement;\n }\n };\n const getRowId = (childRowIndex: number) => {\n return nestedRowIds.value[childRowIndex];\n };\n const getRowAriaSelectedValue = (row: BentoDatagridDataItem): Booleanish => {\n if (!props.selectable) {\n return null;\n }\n\n const id = props.getDataItemId(row);\n return props.selectedItems.includes(id).toString() as Booleanish;\n };\n\n /**\n * Handles row clicks when the `allowRowClicks` prop is true.\n *\n * This method also prevents the `row-click` event from firing if the click\n * originated from an interactive element (like a button, input, or link)\n * within the row. This is to avoid unintended behavior when a user\n * interacts with controls inside a row.\n *\n * @param event The mouse or keyboard event from the click or key press.\n */\n const onRowClick = (event: MouseEvent | KeyboardEvent) => {\n // Only proceed if allowRowClicks is true\n if (!props.allowRowClicks) {\n return;\n }\n\n let isEventTargetInteractiveElement = false;\n const dataGridRowInteractiveTypes = ['button', 'input', 'a'];\n for (let i = 0; i < dataGridRowInteractiveTypes.length; i++) {\n if ((event?.target as HTMLElement)?.closest(dataGridRowInteractiveTypes[i])) {\n isEventTargetInteractiveElement = true;\n break;\n }\n }\n // Only trigger if element is NOT interactive\n if (!isEventTargetInteractiveElement) {\n emit('row-click', props.rowData, event);\n }\n };\n\n const onRowSelect = (value: Array<BentoDatagridDataItemId>) => {\n emit('select-row', value, props.rowData);\n };\n\n const onNestedRowSelect = (rowData: BentoDatagridDataItem, value: Array<BentoDatagridDataItemId>) => {\n emit('select-nested-row', value, props.rowData, rowData);\n };\n\n /**\n * Sets the state to indicate that a row action menu is open. This is used to apply a higher\n * z-index to the row's action container, ensuring the menu displays correctly above\n * subsequent rows.\n */\n const onRowActionMenuOpen = () => {\n isRowActionMenuOpen.value = true;\n };\n\n /**\n * Resets the state when a row action menu is closed, removing the elevated z-index from the\n * row's action container.\n */\n const onRowActionMenuClose = () => {\n isRowActionMenuOpen.value = false;\n };\n\n /**\n * When the row actions cell is focused, make the first interactive child focusable and focus it.\n * This allows for keyboard navigation into the cell's actions.\n */\n const onRowActionsCellFocus = () => {\n makeAllInteractiveChildrenFocusable([focusableItems.value?.[0]]);\n focusOnInteractiveChild(rowActionsRef.value);\n };\n\n /**\n * When focus leaves the row actions cell, make all interactive children unfocusable.\n * This ensures that tabbing through the grid skips over the individual actions within the cell.\n */\n const onRowActionsCellFocusOut = () => {\n makeAllInteractiveChildrenUnFocusable(rowActionsRef.value);\n };\n\n /**\n * Handles keyboard navigation within the row actions cell.\n * Allows using left and right arrow keys to move between interactive elements (e.g., buttons) in the cell.\n * @param e The keyboard event.\n */\n const onRowActionsCellOnKeyDown = (e: KeyboardEvent) => {\n if (e.key !== EventKey.TAB) {\n makeAllInteractiveChildrenUnFocusable(rowActionsRef.value);\n }\n if (\n e.key === EventKey.ARROW_RIGHT &&\n focusableItems.value?.length > 1 &&\n focusableItems.value[0].node === document.activeElement\n ) {\n makeAllInteractiveChildrenUnFocusable(rowActionsRef.value);\n focusableItems.value[1].node.setAttribute('tabindex', '0');\n focusableItems.value[1].node.focus();\n e.stopPropagation();\n e.preventDefault();\n } else if (\n e.key === EventKey.ARROW_LEFT &&\n focusableItems.value?.length > 1 &&\n focusableItems.value[1].node === document.activeElement\n ) {\n makeAllInteractiveChildrenUnFocusable(rowActionsRef.value);\n focusableItems.value[0].node.setAttribute('tabindex', '0');\n focusableItems.value[0].node.focus();\n e.stopPropagation();\n e.preventDefault();\n }\n };\n\n // Cell and Columns index calculation\n const sumColumnAmountsInColumnSets = () =>\n props.columnSets.reduce((total, { columnSet }) => total + columnSet.length, 0);\n const getRowActionsCellIndex = () =>\n sumColumnAmountsInColumnSets() * props.rowIndex + sumColumnAmountsInColumnSets();\n\n // Nested content expanding logic\n const { updateContentHeight, contentHeight } = useExpandableContentHeight(nestedContentRef, isNestedContentShown);\n const nestedContentStyles = computed(() => {\n if (props.hasNestedContent || props.hasNestedRows) {\n // calculate the padding by getting the action column width and the first column left padding:\n const paddingLeft =\n shouldShowRenderNestedRows.value || isLoadingNestedRows.value\n ? 0\n : gridcellRefs.value[DATAGRID_ACTIONS_COLUMN_FIELD_NAME].offsetWidth + DATAGRID_CELL_OFFSET_PADDING;\n\n return {\n paddingLeft: `${paddingLeft}px`,\n 'max-height':\n (props.hasNestedContent || props.hasNestedRows) &&\n contentHeight.value &&\n !contentHeight?.value?.includes('null')\n ? contentHeight.value\n : 0,\n };\n }\n return undefined;\n });\n watch(\n () => nestedContentRef.value,\n () => {\n let observer: ResizeObserver | null = null;\n if (!observer && nestedContentRef.value) {\n observer = observeSizeOfElement(nestedContentRef.value, () => {\n if (nestedContentRef.value) {\n updateContentHeight();\n }\n });\n }\n }\n );\n const nestedContentToggled = () => {\n isNestedContentShown.value = !isNestedContentShown.value;\n updateContentHeight();\n emit('nested-content-toggled', props.rowData);\n };\n\n watch(\n () => props.rowData?.children,\n (_newChildren, oldChildren) => {\n if (props?.rowData?.children?.length > 0 && oldChildren === undefined && !isNestedContentShown.value) {\n updateContentHeight();\n }\n }\n );\n\n const isSmallContainer: ComputedRef<boolean> = inject(\n DATA_GRID_SMALL_CONTAINER,\n computed(() => false)\n );\n\n const isHighlightedRow = row => props.highlightedRows.includes(props.getDataItemId(row));\n const isSelectedRow = row => props.selectedItems.includes(props.getDataItemId(row));\n\n // Styling\n const conditionalRowClasses = (row: BentoDatagridDataItem, rowIndex: number) => ({\n 'b-data-grid-row-container__row--disabled': props.isDataItemDisabled(row),\n 'b-data-grid-row-container__row--row-clicks-enabled': props.allowRowClicks,\n 'b-data-grid-row-container__row--highlighted': isHighlightedRow(row),\n 'b-data-grid-row-container__row--selected': isSelectedRow(row),\n 'b-data-grid-row-container__row--hovered': props.hoveredRowIndex === rowIndex,\n 'b-data-grid-row-container__row--is-last-child': props.isRowLastChild && !isNestedContentShown.value,\n 'b-data-grid-row-container__row--nested-row': props.isNestedRow,\n 'b-data-grid-row-container__row--zebra': props.isRowEven,\n });\n const conditionalRowSetClasses = (isFrozenRowSet: boolean, isSmallContainer: boolean) => ({\n 'b-data-grid-row-container__row-cell-set--frozen': isFrozenRowSet && !isSmallContainer,\n [`b-data-grid-row-container__row-cell-set--${BentoDatagridStyleState.OVERFLOW_SHADOW_LEFT}`]:\n !isSmallContainer && isFrozenRowSet && props.hasLeftOverflow,\n 'b-data-grid-row-container__row-cell-set--frozen-separator':\n !isSmallContainer && isFrozenRowSet && props.showFrozenColumnsSeparator,\n 'b-data-grid-row-container__row-cell-set--unfrozen': !isFrozenRowSet || isSmallContainer,\n 'b-data-grid-row-container__row-cell-set--is-measuring': props.isMeasuringColumnWidths,\n });\n const conditionalNestedRowClasses = computed(() => ({\n 'b-data-grid-row-container__row-nested-slot--is-last-child': props.isRowLastChild,\n 'b-data-grid-row-container__row-nested-slot':\n !shouldShowRenderNestedRows.value && props.shouldShowNestedContent(props.rowData),\n }));\n const conditionalRowActionsContainerClasses = computed(() => ({\n 'b-data-grid-row-container__row-actions-container--row-actions-menu-open': isRowActionMenuOpen.value,\n }));\n const computedRowActionsStyles = computed(() => ({\n minWidth: `${props.rowActionsMaximumWidth}px`,\n }));\n\n // Exposed refs\n defineExpose({\n gridcellRefs,\n rowActionsRef,\n });\n</script>\n\n<script lang=\"ts\">\n /**\n * Internal component to display the BentoDataGrid data rows containig the data row cells.\n *\n * @example\n *\n * export default {\n * components: { DataGridRow },\n * template: `\n * <data-grid-row\n * :ref=\"el => registerRowCellRefs(el, rowIndex)\"\n * :style=\"gridColumnWidthStyle\"\n * :allow-row-clicks=\"allowRowClicks\"\n * :column-sets=\"columnSets\"\n * :condensed=\"condensed\"\n * :dragging-columns=\"draggingColumns\"\n * :dragging-events-for-row-cell=\"draggingEventsForRowCell\"\n * :get-data-item-id=\"getDataItemId\"\n * :has-left-overflow=\"hasLeftOverflow\"\n * :highlighted-rows=\"highlightedRows\"\n * :hovered-row-index=\"hoveredRowIndex\"\n * :hovered-over-column-state=\"hoveredOverColumnState\"\n * :is-data-item-disabled=\"isDataItemDisabled\"\n * :is-measuring-column-widths=\"isMeasuringColumnWidths\"\n * :row-data=\"rowData\"\n * :row-index=\"rowIndex\"\n * :show-frozen-columns-separator=\"showFrozenColumnsSeparator\"\n * :selectable=\"selectable\"\n * :selected-items=\"selectedItems\"\n * @cell-hovered=\"onCellHover\"\n * @row-click=\"onRowClick\"\n * @on-frozen-columns-key-press=\"updateScrollPositionOnFrozenColumnsNavigation\"\n * @select-row=\"onRowSelect\"\n * >\n * <template v-for=\"(_, innerSlot) of slots\" #[innerSlot]=\"scope\">\n * <slot :name=\"innerSlot\" v-bind=\"scope\" />\n * </template>\n * </data-grid-row>\n * `\n */\n export default {\n name: 'data-grid-row',\n };\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-row.scss\" />\n","\n<template>\n <svg role=\"img\" v-bind=\"$attrs\" class=\"ui-assets-icons-16\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\"><title v-if=\"$attrs['svg-title']\">{{ $attrs['svg-title'] }}</title><g :clip-path=\"'url(#uia-ui-assets/icons-16-warning_circle_fill__a' + uuid + ')'\"><path fill=\"#001222\" d=\"M8 0.25C12.2802 0.25 15.75 3.71979 15.75 8C15.75 12.2802 12.2802 15.75 8 15.75C3.71979 15.75 0.25 12.2802 0.25 8C0.25 3.71979 3.71979 0.25 8 0.25ZM8 9.75C7.44772 9.75 7 10.1977 7 10.75C7 11.3023 7.44772 11.75 8 11.75C8.55228 11.75 9 11.3023 9 10.75C9 10.1977 8.55228 9.75 8 9.75ZM7.25 4.25V8.75H8.75V4.25H7.25Z\"/></g><defs><clipPath :id=\"'uia-ui-assets/icons-16-warning_circle_fill__a' + uuid\"><rect width=\"16\" height=\"16\" fill=\"#fff\"/></clipPath></defs></svg>\n</template>\n<script>\n import '../css/main.css';\n\n let uuid = 0;\n\n export default {\n beforeCreate() {\n this.uuid = uuid.toString();\n uuid += 1;\n },\n };\n</script>\n","<template>\n <div\n v-bento-tooltip-directive:[tooltipPosition]=\"tooltipText\"\n :aria-label=\"tooltipText\"\n class=\"b-data-grid-static-icon\"\n :class=\"conditionalClasses\"\n tabindex=\"0\"\n >\n <component :is=\"computedIcon\" :class=\"computedIconClass\" :svg-title=\"tooltipText\" />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue';\n import CheckmarkIcon from '@adyen/ui-assets-icons-16/vue/checkmark-circle-fill';\n import WarningIcon from '@adyen/ui-assets-icons-16/vue/warning-filled';\n import ErrorIcon from '@adyen/ui-assets-icons-16/vue/warning-circle-fill';\n import CrossIcon from '@adyen/ui-assets-icons-16/vue/cross';\n import NoValueIcon from '@adyen/ui-assets-icons-16/vue/minus-small';\n import { BentoTooltipDirective as vBentoTooltipDirective } from '@/directives';\n import { PopperContainerPosition } from '@/components/popper-container';\n import { type BentoDataGridStaticIconVariant } from './data-grid-static-icon.types';\n\n const props = defineProps({\n colored: { type: Boolean, default: false },\n tooltipText: null,\n variant: { default: 'no-value' }\n});\n\n const computedIcon = computed(() => {\n switch (props.variant) {\n case 'checkmark':\n return CheckmarkIcon;\n case 'warning':\n return WarningIcon;\n case 'error':\n return ErrorIcon;\n case 'cross':\n return CrossIcon;\n case 'no-value':\n return NoValueIcon;\n default:\n return NoValueIcon;\n }\n });\n\n const conditionalClasses = computed(() => ({\n [`b-data-grid-static-icon--colored`]: props.colored && props.variant !== 'no-value',\n }));\n\n const computedIconClass = computed(() => `b-data-grid-static-icon__${props.variant}`);\n\n const tooltipPosition = computed(() => PopperContainerPosition.AUTO);\n</script>\n\n<script lang=\"ts\">\n /**\n * The bento-data-grid-static-icon is an icon component with an associated toltip to be used within cellls of the bento-data-grid\n *\n * @example\n * import { BentoDataGridStaticIcon } from '@adyen/bento-vue2';\n *\n * export default {\n * components: { BentoDataGridStaticIcon },\n * template: `\n * <bento-data-grid-static-icon variant=\"warning\" text=\"Your tooltip text\" />\n * `\n * }\n */\n export default {};\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-static-icon.scss\" />\n","<template>\n <div class=\"b-data-grid-summary-cell\">\n <bento-dashed-underline v-if=\"items.length > 1\" ref=\"dashedUnderlineRef\" v-bind=\"dashedUnderlineProps\">\n {{ label }}\n <template #popover-content>\n <bento-typography class=\"b-data-grid-summary-cell__popover-content\">\n <ul class=\"b-data-grid-summary-cell__list\">\n <li v-for=\"item in items\" :key=\"item\">\n <component :is=\"highlightedComponent(item)\">{{ item }}</component>\n </li>\n </ul>\n </bento-typography>\n </template>\n </bento-dashed-underline>\n <template v-else>{{ items[0] }}</template>\n <tooltip\n v-if=\"dashedUnderlineRef && computedToolTipText\"\n :content=\"computedToolTipText\"\n :disabled-focus-trap=\"true\"\n :position=\"BentoTooltipPosition.RIGHT\"\n :fallback-position=\"['left', 'bottom']\"\n :is-shown=\"!!computedToolTipText\"\n :target-element=\"dashedUnderlineRef\"\n />\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, ref } from 'vue';\n import { BentoDashedUnderline, type BentoDashedUnderlineProps } from '@/components/dashed-underline';\n import { BentoTypography } from '@/components/typography';\n import { Tooltip } from '@/components/internal';\n import { BentoTooltipPosition } from '../../../internal/tooltip/tooltip.types';\n import { useI18n } from '@/utils/ts/i18n';\n import messages from './messages.json';\n import type { BentoDataGridSummaryCellProps } from './data-grid-summary-cell.types';\n\n type MessageSchema = (typeof messages)['en-US'];\n\n const { tc } = useI18n<{ message: MessageSchema }>({ messages });\n\n const props = defineProps({\n label: null,\n items: null,\n dashedUnderline: { default: () => ({}) },\n searchTerm: { default: '' },\n tooltipText: { default: null }\n});\n const dashedUnderlineRef = ref();\n\n const dashedUnderlineProps = computed<BentoDashedUnderlineProps>(() => ({\n popoverPosition: 'right', // Setting popover defaults, but they are overriden if used passes dashedUnderline prop\n popoverTitle: props.label,\n popoverSize: 'small',\n ...props.dashedUnderline,\n // We force teleport as this is needed for the popover to appear above all the data grid elements\n teleport: {\n disabled: false,\n },\n }));\n\n const lowerCaseSearchTerm = computed(() => props.searchTerm?.toLowerCase() ?? '');\n const highlightedComponent = (item: string) =>\n props.searchTerm && item.toLowerCase().includes(lowerCaseSearchTerm.value) ? 'mark' : 'span';\n\n const highlightedItemsCount = computed(() => {\n if (!props.searchTerm) {\n return 0;\n }\n return props.items.filter(item => item.toLowerCase().includes(lowerCaseSearchTerm.value)).length;\n });\n const computedToolTipText = computed(\n () =>\n props.tooltipText ??\n (highlightedItemsCount.value > 0 ? tc('numberResults', highlightedItemsCount.value) : '')\n );\n</script>\n\n<script lang=\"ts\">\n /**\n * A specialized cell for `bento-data-grid` to display a summary of multiple items.\n *\n * @example\n * import { BentoDataGridSummaryCell } from '@adyen/bento-vue2';\n *\n * export default {\n * components: { BentoDataGridSummaryCell },\n * template: `\n * <bento-data-grid-summary-cell\n * label=\"2 merchants\"\n * :items=\"['Merchant A', 'Merchant B']\"\n * />\n * `\n * }\n */\n export default {\n i18n: { messages },\n };\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid-summary-cell.scss\" />\n","<template>\n <div\n ref=\"dataGridRef\"\n class=\"b-data-grid\"\n data-testid=\"data-grid\"\n :class=\"conditionalGridClasses\"\n aria-live=\"polite\"\n :aria-busy=\"loading\"\n @copy=\"handleClipboard\"\n >\n <div\n v-if=\"filters\"\n ref=\"filtersRef\"\n class=\"b-data-grid__filters\"\n :class=\"conditionalFilterClasses\"\n :style=\"{ top: computedStickyFiltersTopPosition }\"\n :aria-controls=\"dataGridUid\"\n :aria-label=\"t('filterBar')\"\n role=\"region\"\n >\n <bento-filter-bar\n v-if=\"filters\"\n ref=\"filterBarRef\"\n :config=\"filters\"\n :container-size-layout=\"filtersContainerSizeLayout\"\n :filter-values=\"filterValues\"\n :filter-values-object=\"filterValuesObject\"\n :search=\"filterSearchConfig\"\n :search-term=\"filterSearchTerm\"\n @search-input=\"onSearchTermInput\"\n @search-clear=\"onSearchTermCleared\"\n @input=\"filters => $emit(BentoDatagridEvent.UPDATE_FILTERS, filters)\"\n @update:filter-values=\"filterValues => $emit(BentoDatagridEvent.UPDATE_FILTER_VALUES, filterValues)\"\n @update:filter-values-object=\"\n filterValueObject => $emit(BentoDatagridEvent.UPDATE_FILTER_VALUES_OBJECT, filterValueObject)\n \"\n />\n </div>\n <div v-if=\"$slots.header\" class=\"b-data-grid__header\">\n <slot name=\"header\"></slot>\n </div>\n <div\n :id=\"dataGridUid\"\n :role=\"ariaGridRole\"\n :aria-rowcount=\"data.length\"\n :aria-colcount=\"columns.length\"\n :aria-label=\"emptyState ? t('noResults') : null\"\n class=\"b-data-grid__wrapper\"\n :style=\"{ top: computedColumnHeadersTopPosition }\"\n >\n <div class=\"b-data-grid__column-headers\" :style=\"{ top: computedColumnHeadersTopPosition }\">\n <div\n ref=\"columnsRef\"\n role=\"rowgroup\"\n class=\"b-data-grid__columns-row\"\n @scroll=\"updateScrollPosition\"\n @keydown=\"navigationInput\"\n >\n <div v-if=\"columnPanel\" role=\"row\">\n <bento-data-grid-config-settings\n class=\"b-data-grid__config-settings\"\n role=\"gridcell\"\n :columns=\"localColumnsState\"\n :condensed=\"condensed\"\n :zebra-rows=\"internalZebraRows\"\n @update:condensed=\"onConfigSettingsCondensedUpdate\"\n @update:zebra-rows=\"onConfigSettingsZebraRowsUpdate\"\n @update:columns=\"onConfigSettingsColumnsUpdate\"\n />\n </div>\n <div :style=\"gridRowWidthStyle\" class=\"b-data-grid__columns\" role=\"row\">\n <template v-for=\"({ columnSet, id, isFrozenColumns }, index) of columnSets\">\n <data-grid-columns\n v-if=\"columnSet?.length\"\n :key=\"`data-grid-columns-${id}`\"\n :ref=\"el => registerColumnHeaderRefs(el)\"\n :columns=\"columnSet\"\n :has-resizable-columns=\"hasResizableColumns\"\n :sort-by=\"sortBy\"\n :all-items-selected-state=\"allItemsSelectedState\"\n :is-frozen-columns=\"isFrozenColumns\"\n :show-frozen-columns-separator=\"showFrozenColumnsSeparator\"\n :dragging-columns=\"draggingColumns\"\n :has-draggable-columns=\"allowColumnDragAndDrop\"\n :has-column-panel=\"columnPanel\"\n :has-left-overflow=\"hasLeftOverflow\"\n :has-first-column-panel-right-aligned=\"index === computedColumnPanelAlignment\"\n :hovered-over-column-state=\"hoveredOverColumnState\"\n :is-measuring-column-widths=\"isMeasuringColumnWidths\"\n :is-only-one-visible-column=\"isOnlyOneVisibleColumn\"\n :selectable=\"data?.length > 0 && selectable\"\n :selectable-across-pages=\"selectableAcrossPagesComputed\"\n :selected-items=\"selectedItems\"\n :visible-rows-state=\"visibleRowsState\"\n :selection-state=\"selectionState\"\n :truncate-column-headers=\"truncateColumnHeaders\"\n :row-actions-maximum-width=\"rowActionsMaxWidth\"\n v-on=\"draggingEventsForColumns\"\n @column-hover=\"hoveredOverColumn = $event\"\n @column-move=\"onMoveColumnByOffset\"\n @column-update=\"onConfigSettingsColumnUpdate\"\n @column-resize=\"onColumnResized\"\n @column-resizing=\"onColumnWidthOverride\"\n @select-all-rows=\"onAllRowSelect\"\n @select-all-across-pages=\"emit(BentoDatagridEvent.SELECT_ALL_ACROSS_PAGES)\"\n @select-all-current-results=\"emit(BentoDatagridEvent.SELECT_ALL_CURRENT_RESULTS)\"\n @deselect-all-current-results=\"emit(BentoDatagridEvent.DESELECT_ALL_CURRENT_RESULTS)\"\n @deselect-all=\"onDeselectAll\"\n @sort=\"onSort\"\n >\n <template v-for=\"(_, innerSlot) of slots\" #[innerSlot]=\"scope\">\n <slot :name=\"innerSlot\" v-bind=\"scope\" />\n </template>\n </data-grid-columns>\n </template>\n </div>\n </div>\n </div>\n <div\n ref=\"body\"\n data-testid=\"data-grid-body\"\n class=\"b-data-grid__body\"\n :class=\"conditionalGridBodyClasses\"\n @scroll=\"updateScrollPosition\"\n >\n <div v-if=\"loading && !isLazyLoad\" class=\"b-data-grid__loading\">\n <bento-loading-indicator class=\"b-data-grid__loading-indicator\" large />\n <bento-typography el=\"span\" variant=\"caption\">{{ t('gettingYourData') }}</bento-typography>\n </div>\n\n <div v-else role=\"rowgroup\" @keydown=\"navigationInput\">\n <template v-if=\"data?.length === 0 && emptyState\">\n <div role=\"row\" tabindex=\"-1\">\n <div role=\"gridcell\" :aria-colspan=\"columns.length\" tabindex=\"-1\">\n <bento-empty-state class=\"b-data-grid__empty-state\" v-bind=\"limitedEmptyStateProps\" />\n </div>\n </div>\n </template>\n <data-grid-row\n v-for=\"(rowData, rowIndex) in data\"\n v-else\n :key=\"rowIndex\"\n :ref=\"el => registerRowCellRefs(el, rowIndex)\"\n :style=\"gridRowWidthStyle\"\n :allow-row-clicks=\"allowRowClicks\"\n :column-sets=\"columnSets\"\n :condensed=\"condensed\"\n :dragging-columns=\"draggingColumns\"\n :dragging-events-for-row-cell=\"draggingEventsForRowCell\"\n :get-data-item-id=\"getDataItemId\"\n :has-nested-content=\"hasNestedContent\"\n :has-nested-rows=\"hasNestedRows\"\n :has-left-overflow=\"hasLeftOverflow\"\n :has-right-overflow=\"hasRightOverflow\"\n :highlighted-rows=\"highlightedRows\"\n :hovered-row-index=\"hoveredRowIndex\"\n :hovered-over-column-state=\"hoveredOverColumnState\"\n :is-data-item-disabled=\"isDataItemDisabled\"\n :is-row-even=\"internalZebraRows ? rowIndex % 2 !== 0 : false\"\n :is-row-last-child=\"rowIndex + 1 === data?.length\"\n :is-measuring-column-widths=\"isMeasuringColumnWidths\"\n :row-actions-maximum-width=\"rowActionsMaxWidth\"\n :row-actions=\"rowActions\"\n :row-data=\"rowData\"\n :row-index=\"rowIndex\"\n :row-set-size=\"data?.length\"\n :show-frozen-columns-separator=\"showFrozenColumnsSeparator\"\n :should-show-nested-content=\"shouldShowNestedContent\"\n :should-show-nested-rows=\"shouldShowNestedRows\"\n :selectable=\"selectable\"\n :selected-items=\"selectedItems\"\n @cell-hovered=\"onCellHover\"\n @nested-content-toggled=\"emit(BentoDatagridEvent.NESTED_CONTENT_TOGGLED, $event)\"\n @row-click=\"onRowClick\"\n @on-frozen-columns-key-press=\"updateScrollPositionOnFrozenColumnsNavigation\"\n @select-row=\"onRowSelect\"\n @select-nested-row=\"onNestedRowSelect\"\n >\n <template v-for=\"(_, innerSlot) of slots\" #[innerSlot]=\"scope\">\n <slot :name=\"innerSlot\" v-bind=\"scope\" />\n </template>\n </data-grid-row>\n </div>\n </div>\n </div>\n\n <data-grid-lazy-load\n v-if=\"isLazyLoad\"\n :loading=\"loading\"\n :is-infinite-scroll=\"isInfiniteScroll\"\n @update:show-more=\"emitLazyLoadEvent\"\n />\n\n <div\n v-if=\"stickyHorizontalScrollbar\"\n ref=\"virtualHorizontalScrollbarRef\"\n class=\"b-data-grid__horizontal-scrollbar\"\n aria-hidden=\"true\"\n data-testid=\"sticky-horizontal-scrollbar\"\n :style=\"horizontalScrollbarConditionalStyles\"\n @scroll=\"syncVirtualScrollerWithBody\"\n >\n <div :style=\"{ width: `${totalWidthOfAllColumns}px`, height: '15px' }\"></div>\n </div>\n <div\n v-if=\"pagination && !isLazyLoad\"\n ref=\"paginationContainerRef\"\n data-testid=\"pagination-container\"\n class=\"b-data-grid__pagination\"\n :class=\"conditionalPaginationClasses\"\n >\n <bento-pagination\n v-bind=\"pagination\"\n :aria-label=\"$t('pagination')\"\n :aria-controls=\"dataGridUid\"\n @navigate=\"onPaginationNavigate\"\n @items-page=\"onItemsPerPageChange\"\n >\n <slot v-if=\"hasSlot('pagination-slot')\" name=\"pagination-slot\"></slot>\n </bento-pagination>\n </div>\n <div v-if=\"$slots.footer\" class=\"b-data-grid__footer\"><slot name=\"footer\"></slot></div>\n <bento-action-bar\n v-if=\"showActionBar\"\n :actions=\"bulkActions\"\n :item-counter=\"itemsSelectedCounter\"\n :extra-bottom-spacing=\"stickyPagination\"\n @close=\"onDeselectAll\"\n />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\n import {\n type ComponentPublicInstance,\n computed,\n inject,\n onMounted,\n type PropType,\n provide,\n ref,\n toRef,\n toRefs,\n useSlots,\n } from 'vue';\n\n // Components\n import { BentoActionBar } from '@/components/action-bar';\n import { BentoPagination } from '@/components/pagination';\n import { BentoLoadingIndicator } from '@/components/loading-indicator';\n import { BentoTypography } from '@/components/typography';\n import { BentoDataGridConfigSettings, DataGridColumns, DataGridLazyLoad, DataGridRow } from './components';\n\n // Composables\n import {\n DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME,\n useCalculateColumnWidth,\n useColumnHovering,\n useColumnReorderer,\n useConfigSettings,\n useKeyboardNavigator,\n useLazyLoading,\n useScroller,\n useSelector,\n } from './composables';\n import { useCalculateStickyElementHeight, useHasSlot } from '@/composables';\n\n // Utils\n import { generateUid } from '@/core/utils/ts/generate-uid';\n import { useI18n } from '@/utils/ts/i18n';\n import { printDevelopmentWarning } from '@/utils/ts/print-development-warning';\n import { handleClipboard } from '@/components/data-grid/utils/handle-clipboard/handle-clipboard';\n\n // Types\n import {\n type BentoColumn,\n type BentoDatagridData,\n type BentoDatagridDataItem,\n type BentoDatagridDataItemId,\n type BentoDatagridEmptyStateProps,\n BentoDatagridEvent,\n type BentoDatagridGetDataItemIdFn,\n type BentoDatagridIsDataItemDisabledFn,\n type BentoDatagridPaginationProps,\n type BentoDatagridShouldShowNestedContentFn,\n type BentoDatagridShouldShowNestedRowsFn,\n type BentoDatagridSortByColumn,\n BentoDatagridStyleState,\n type BentoDataGridVisibleRowsState,\n } from './data-grid.types';\n import { type BentoTabProvidedTitle } from '../tabs/components/tab.types';\n import { type BentoDataGridTemplateDataGrid } from '@/templates/data-grid-template/data-grid-template.types';\n import { type BentoLazyLoadType } from '@/types/lazy-load';\n import type { BentoButtonActionsList } from '@/components/button';\n import {\n BentoFilterBar,\n type BentoFilterBarContainerSizeLayout,\n type BentoFilterBarModel,\n type BentoFilterBarSearchBarProps,\n type BentoFilterValueObject,\n } from '@/components/filter-bar';\n import { BentoEmptyState } from '@/components/empty-state';\n import type { DatagridColumnsHeaderReferences } from '@/components/data-grid/components/data-grid-columns/data-grid-columns.types';\n import type { BentoDataGridRowActionsProp } from '@/components/data-grid/components/data-grid-cell-actions/data-grid-cell-actions.types';\n\n // Keys\n import { EXTERNAL_TITLE_REGISTER_ENTRY_INJECTION_KEY } from '@/components/tabs/tabs.keys';\n import { DATA_GRID_REGISTER_TEMPLATE_INJECTION_KEY } from '@/templates/data-grid-template/data-grid-template.keys';\n import { DATA_GRID_SLASHED_ZERO, DATA_GRID_SMALL_CONTAINER, DATA_GRID_TOUCH_DEVICE } from './data-grid.keys';\n\n // Translations\n import messages from './messages.json';\n import { useElementSize } from '@vueuse/core';\n\n type MessageSchema = (typeof messages)['en-US'];\n\n const props = defineProps({\n /**\n * When true, will emit a 'rowClick' event when a row is clicked. Will add cursor: pointer to rows.\n */\n allowRowClicks: { type: Boolean, default: false },\n\n /**\n * When true, column headers will become draggable, allowing users to rearrange columns.\n */\n allowColumnDragAndDrop: { type: Boolean, default: true },\n\n /**\n * List of actions that will be rendered in the action bar when user selects items.\n *\n * Each object in the list should have a `title`, an `event` and,\n * optionally, an `icon`.\n *\n * The component will display 4 actions and the hide the rest inside a menu.\n *\n * @see BentoButton for a list of all the other props supported by each button action.\n */\n bulkActions: {\n type: Array as PropType<BentoButtonActionsList>,\n default: null,\n },\n\n /**\n * Sets the row cells to the condensed padding state.\n */\n condensed: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Column definitions using 'key' to relate to data object.\n */\n columns: {\n type: Array as PropType<Array<BentoColumn>>,\n required: true,\n },\n\n /**\n * Enables / hides the display options panel and the column contextual menu functionality.\n */\n columnPanel: { type: Boolean, default: false },\n\n /**\n * An array of data objects to display.\n */\n data: {\n type: Array as PropType<BentoDatagridData>,\n required: true,\n },\n\n /**\n * Empty state props that will be passed down to inner empty-state component\n */\n emptyState: {\n type: Object as PropType<BentoDatagridEmptyStateProps>,\n default: undefined,\n },\n\n /**\n * filter-bar value (i.e. filters) that will be passed down to inner filter-bar component\n * {@see BentoFilterBarModel}\n */\n filters: {\n // TODO: Change this to BentoFilterBarProps['value'] when the interface is available\n type: Array as PropType<BentoFilterBarModel>,\n default: undefined,\n },\n\n /**\n * Defines the layout (multi-line or one-line) to be used in the filter bar for different\n * container sizes:\n * - Large (>=700px): Always multi-line\n * - Medium (>=430px & <700px)\n * - Small (<430px)\n *\n * @default\n * {\n * medium: 'multi-line',\n * small: 'one-line'\n * }\n */\n filtersContainerSizeLayout: {\n type: Object as PropType<BentoFilterBarContainerSizeLayout>,\n default: undefined,\n },\n\n /**\n * An array of the values for each filter set in `value`.\n * {@see BentoFilterValues}\n */\n filterValues: {\n type: BentoFilterBar.props.filterValues.type,\n default: () => [],\n },\n\n /**\n * An object of the values for each filter in the filter bar where key is a the field name and the value is the BentoFilterBarValue.\n *\n * @example\n * {\n * 'company': '200',\n * 'name': 'some text'\n * },\n */\n filterValuesObject: {\n type: Object as PropType<BentoFilterValueObject>,\n default: () => undefined,\n },\n\n // TODO: Move this prop as a part of \"config\" BentoFilterBarModel = Array<BentoFilterModel | BentoFilterSearchModel> in Bento 2.0.\n // It was not done now because it's a breaking change for the types.\n /**\n * Filter's search bar properties with which the placeholder, hint and other\n * \"bento-search-bar\" properties can be set. @see {@link BentoFilterBarSearchBarProps}\n */\n filterSearchConfig: {\n type: Object as PropType<BentoFilterBarSearchBarProps>,\n default: undefined,\n },\n\n /**\n * Filter bar search term useful to filter all the data by text\n */\n filterSearchTerm: {\n type: BentoFilterBar.props.searchTerm.type,\n default: undefined,\n },\n\n /**\n * Allows the grid to be rendered inside a confined space.\n * This makes the data-grid expand to fill the height of its parent container, with the grid body becoming scrollable.\n */\n fitContent: { type: Boolean, default: false },\n\n /**\n * A customisable method to retrieve a unique identifier for a data item in the array of data supplied.\n * This is used selecting and performance reasons and must exist in each data item.\n */\n getDataItemId: {\n type: Function as PropType<BentoDatagridGetDataItemIdFn>,\n default: (item: BentoDatagridDataItem) => item.id,\n },\n\n /**\n * Row actions propery that generates which button to show in row actions area\n */\n rowActions: {\n type: [Function, Array] as PropType<BentoDataGridRowActionsProp>,\n default: undefined,\n },\n\n /**\n * If resize is enabled\n */\n hasResizableColumns: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Enables the nested content slot functionality.\n */\n hasNestedContent: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Enables the nested content slot functionality.\n */\n hasNestedRows: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Highlighted items\n */\n highlightedRows: {\n type: Array as PropType<Array<BentoDatagridDataItemId>>,\n default: () => [],\n },\n\n /**\n * A customisable method to determine if a row is not selectable.\n * The default is that every row is selectable.\n */\n isDataItemDisabled: {\n type: Function as PropType<BentoDatagridIsDataItemDisabledFn>,\n default: () => false,\n },\n\n /**\n * The type of `Lazy Load`.\n * Type \"automatic\" will enable infinite scrolling\n * Type \"button\" will enable lazy loading with \"Show more\" button\n * @values automatic, button, none\n */\n lazyLoadType: {\n type: String as PropType<BentoLazyLoadType>,\n default: 'none',\n validator: (value: BentoLazyLoadType) => ['automatic', 'button', 'none'].includes(value),\n },\n\n /**\n * If the loading indicator should be shown.\n */\n loading: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Enables / Disables the table's surrounding border.\n */\n outline: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Renders the data grid with no top spacing, to render inside containers that already have spacing\n */\n noSpacingTop: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Pagination props that will be passed down to inner pagination component\n */\n pagination: {\n type: Object as PropType<BentoDatagridPaginationProps>,\n default: undefined,\n },\n\n /**\n * Adds an extra option when selecting all items that allows user to select items in other pages too.\n * Needs pagination.totalCount to be set.\n */\n selectableAcrossPages: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Renders a font numeric style with slashed zeros instead of normal ones.\n */\n slashedZero: { type: Boolean, default: false },\n\n /**\n * Sticks the horizontal scrollbar to the bottom of the screen if the data-grid is larger than the screen height.\n */\n stickyHorizontalScrollbar: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Make pagination stick to the bottom of the page when the data-grid is bigger than the screen.\n * Because styles have to be applied to pagination container element, this has to be a data-grid prop (rather than a pagination prop).\n */\n stickyPagination: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Make data-grid filters stick to the top of the page along with the data-grid headers.\n * Defaults to true.\n */\n stickyFilters: {\n type: Boolean,\n default: true,\n },\n\n /**\n * Enables / Disables rows to be selected via a checkbox. On select the \"select\" event will be emitted.\n */\n selectable: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Selected items\n */\n selection: {\n type: Array as PropType<Array<BentoDatagridDataItemId>>,\n default: () => [],\n },\n\n /**\n * Enables / Disables the nested-content slot\n */\n shouldShowNestedContent: {\n type: Function as PropType<BentoDatagridShouldShowNestedContentFn>,\n default: (_item: BentoDatagridDataItem) => true,\n },\n\n /**\n * Returns the nested rows for a given BentoDatagridDataItem.\n */\n shouldShowNestedRows: {\n type: Function as PropType<BentoDatagridShouldShowNestedRowsFn>,\n default: (_item: BentoDatagridDataItem) => true,\n },\n\n /**\n * Sortby handles proper rendering of sort icon in header. Sorting currently is only supported server side.\n * It does make sure the currently sorted column has a more visible sort icon, and the sort icon points in the right direction.\n */\n sortBy: {\n type: Array as PropType<Array<BentoDatagridSortByColumn>>, // NOTE: is an array to allow multi-sorting in the future\n default: () => [],\n },\n /**\n * Title of the data grid to be rendered as tab title when a data grid is passed in a tab layout.\n */\n tabTitle: {\n type: String,\n default: null,\n },\n\n /**\n * Truncates all data grid column headers\n */\n truncateColumnHeaders: {\n type: Boolean,\n default: false,\n },\n\n /**\n * Toggles the alternating background color of rows.\n */\n zebraRows: {\n type: Boolean,\n default: false,\n },\n });\n\n const slots = useSlots();\n const hasSlot = useHasSlot(slots);\n\n /* == Variables and references == */\n // Create refs for elements\n const body = ref<HTMLDivElement>(null);\n const columnsRef = ref<HTMLDivElement>();\n const columnHeaderRefs = ref<DatagridColumnsHeaderReferences>({});\n const dataGridUid = ref<string>(generateUid('data-grid'));\n const gridcellRefs = ref<{ [key: string]: Array<HTMLDivElement> }>(null);\n const filtersRef = ref<HTMLDivElement>(null);\n const filterBarRef = ref<InstanceType<typeof BentoFilterBar>>();\n const paginationContainerRef = ref<HTMLDivElement>(null);\n const verticalScrollPositionRef = ref(null);\n const virtualHorizontalScrollbarRef = ref<HTMLDivElement>(null);\n const {\n allowColumnDragAndDrop,\n columns,\n columnPanel,\n data,\n lazyLoadType,\n loading,\n hasNestedContent,\n hasNestedRows,\n selectable,\n selection,\n selectableAcrossPages,\n stickyPagination,\n outline,\n pagination,\n zebraRows,\n } = toRefs(props);\n const hoveredRowIndex = ref(-1);\n\n const { t } = useI18n<{ message: MessageSchema }>({ messages });\n const frozenColumnsLength = computed(() => columnDefs.value.filter(column => column.frozen).length);\n\n /* == Responsive behaviour == */\n // Identifies if the data-grid is in a container smaller than 550px\n const MOBILE_BREAKPOINT = 550;\n const dataGridRef = ref();\n const { width } = useElementSize(dataGridRef);\n const isSmallContainer = computed(() => width.value <= MOBILE_BREAKPOINT);\n provide(DATA_GRID_SMALL_CONTAINER, isSmallContainer);\n\n /* == Touch device behaviour == */\n // Identifies if the data-grid is rendered on a touch device\n const isTouchDevice = ref(false);\n onMounted(() => {\n if (typeof window !== 'undefined') {\n isTouchDevice.value = 'ontouchstart' in window || navigator?.maxTouchPoints > 0;\n }\n });\n provide(DATA_GRID_TOUCH_DEVICE, isTouchDevice);\n\n /* == Data-grid template == */\n const registerDatagridInDataGridTemplate: BentoDataGridTemplateDataGrid = inject(\n DATA_GRID_REGISTER_TEMPLATE_INJECTION_KEY,\n () => ({\n additionalContentSlotRef: ref(null),\n isDataGridTemplate: false,\n stickyAditionalContent: ref(false),\n stickyTabs: ref(false),\n tabsRef: ref(null),\n })\n );\n const { additionalContentSlotRef, isDataGridTemplate, stickyTabs, tabsRef, stickyAdditionalContent } =\n registerDatagridInDataGridTemplate();\n\n /* == Composable logic == */\n // Column width calculation\n const {\n columnDefs,\n onColumnWidthOverride,\n gridRowWidthStyle,\n isMeasuringColumnWidths,\n isTotalWidthOfColumnsTakingUpAllAvailableGridWidth,\n columns: localColumnsState,\n totalWidthOfAllColumns,\n rowActionsMaxWidth,\n } = useCalculateColumnWidth(columns, data, body, columnHeaderRefs, gridcellRefs, {\n hasColumnPanel: columnPanel,\n hasSelectableColumn: selectable,\n hasSelectableAcrossPages: selectableAcrossPages,\n hasNestedContent,\n hasNestedRows,\n allowColumnDragAndDrop,\n isDataGridTemplate: isDataGridTemplate,\n });\n\n /* == Emitting logic == */\n const definedEmitsFunction = defineEmits([\n BentoDatagridEvent.COLUMNS,\n BentoDatagridEvent.COLUMN_RESIZE,\n BentoDatagridEvent.ITEMS_PAGE,\n BentoDatagridEvent.FILTER_SEARCH_INPUT,\n BentoDatagridEvent.FILTER_SEARCH_CLEAR,\n BentoDatagridEvent.NAVIGATE,\n BentoDatagridEvent.NESTED_CONTENT_TOGGLED,\n BentoDatagridEvent.UPDATE_COLUMNS,\n BentoDatagridEvent.UPDATE_CONDENSED,\n BentoDatagridEvent.UPDATE_FILTER_VALUES,\n BentoDatagridEvent.UPDATE_FILTER_VALUES_OBJECT,\n BentoDatagridEvent.UPDATE_FILTERS,\n BentoDatagridEvent.UPDATE_FILTER_SEARCH_TERM,\n BentoDatagridEvent.UPDATE_SHOW_MORE,\n BentoDatagridEvent.UPDATE_PAGINATION,\n BentoDatagridEvent.UPDATE_SELECTION,\n BentoDatagridEvent.UPDATE_SORT_BY,\n BentoDatagridEvent.ROW_CLICK,\n BentoDatagridEvent.SELECT,\n BentoDatagridEvent.SELECT_ALL_ACROSS_PAGES,\n BentoDatagridEvent.SELECT_ALL_CURRENT_RESULTS,\n BentoDatagridEvent.DESELECT_ALL_CURRENT_RESULTS,\n BentoDatagridEvent.SORT,\n ]);\n\n /**\n * Hooks into the emit function and updates the local columns state if we're updating columns.\n * This is so if users use a computed ref with the columns property the ordering / toggling visibility will still function correctly.\n */\n const emit: typeof definedEmitsFunction = (event, ...args) => {\n // If we updating columns update the local columns state\n if (event === BentoDatagridEvent.COLUMNS || event === BentoDatagridEvent.UPDATE_COLUMNS) {\n [localColumnsState.value] = args;\n }\n definedEmitsFunction(event, ...args);\n };\n\n // Calculate dynamic top position of sticky filters\n const stickyFiltersHeight = useCalculateStickyElementHeight(\n tabsRef,\n stickyTabs,\n stickyAdditionalContent,\n additionalContentSlotRef\n );\n const computedStickyFiltersTopPosition = computed(() =>\n props.stickyFilters ? `${stickyFiltersHeight.value}px` : null\n );\n // Calculate dynamic top position of column headers\n const columnHeadersHeight = useCalculateStickyElementHeight(filtersRef, toRef(props, 'stickyFilters'));\n const computedColumnHeadersTopPosition = computed(\n () => `${columnHeadersHeight.value + stickyFiltersHeight.value}px`\n );\n\n // Config Settings (condensed, visbility and freezing settings)\n const {\n sortedColumns,\n columnSets,\n isOnlyOneVisibleColumn,\n internalZebraRows,\n onConfigSettingsColumnsUpdate,\n onConfigSettingsColumnUpdate,\n onConfigSettingsCondensedUpdate,\n onConfigSettingsZebraRowsUpdate,\n } = useConfigSettings(columnDefs, zebraRows, emit);\n\n // Column hovering\n const { hoveredOverColumn, hoveredOverColumnState } = useColumnHovering(\n columnSets,\n selectable,\n outline,\n isTotalWidthOfColumnsTakingUpAllAvailableGridWidth\n );\n\n // Re-ordering column (dragging)\n const { draggingColumns, draggingEventsForColumns, draggingEventsForRowCell, onMoveColumnByOffset } =\n useColumnReorderer(sortedColumns, allowColumnDragAndDrop, emit);\n\n // Selecting\n const selectableAcrossPagesComputed = computed(\n () =>\n props.data?.length > 0 &&\n !!props.selectableAcrossPages &&\n !!props.pagination &&\n props.pagination.totalCount > 0\n );\n const {\n onAllRowSelect,\n onRowSelect,\n onNestedRowSelect,\n onDeselectAll,\n allItemsSelectedState,\n selectedItems,\n selectionState,\n } = useSelector(\n selection,\n emit,\n data,\n props.getDataItemId,\n props.isDataItemDisabled,\n selectableAcrossPagesComputed,\n pagination\n );\n\n const visibleRowsState = computed<BentoDataGridVisibleRowsState>(() => ({\n filtered:\n filterBarRef.value?.isClearAllVisible || filterBarRef.value?.isResetAllVisible || !!props.filterSearchTerm,\n allRowsVisible: pagination.value?.size >= pagination.value?.totalCount,\n }));\n\n // Keyboard navigation\n const { navigationInput } = useKeyboardNavigator(\n gridcellRefs,\n columnHeaderRefs,\n sortedColumns,\n selectable,\n computed(() => props.rowActions !== undefined),\n columnPanel\n );\n\n // Lazy loading\n const { isLazyLoad, isInfiniteScroll, verticalScrollPosition, emitLazyLoadEvent } = useLazyLoading(\n lazyLoadType,\n verticalScrollPositionRef,\n body,\n loading,\n emit\n );\n\n // Scrolling\n const {\n updateScrollPosition,\n updateScrollPositionOnFrozenColumnsNavigation,\n syncVirtualScrollerWithBody,\n hasLeftOverflow,\n hasRightOverflow,\n horizontalScrollbarConditionalStyles,\n } = useScroller(\n body,\n columnsRef,\n verticalScrollPosition,\n virtualHorizontalScrollbarRef,\n paginationContainerRef,\n totalWidthOfAllColumns,\n {\n isLazyLoad,\n pagination,\n stickyPagination,\n isDataGridTemplate,\n }\n );\n\n /* == Empty State == */\n const onEmptyStateClearResetButtonClick = () => {\n if (filterBarRef.value.isClearAllVisible) {\n filterBarRef.value.clearAllFilters();\n } else if (filterBarRef.value.isResetAllVisible) {\n filterBarRef.value.resetAllFilters();\n }\n };\n const limitedEmptyStateProps = computed<BentoDatagridEmptyStateProps>(() => ({\n ...props.emptyState,\n variant:\n props.emptyState?.variant === 'embedded' || props.emptyState?.variant === 'basic'\n ? props.emptyState.variant\n : 'basic',\n }));\n\n /* == Styles == */\n // Conditional grid classes\n const conditionalGridClasses = computed(() => ({\n [`b-data-grid--${BentoDatagridStyleState.OUTLINE}`]: props.outline,\n [`b-data-grid--${BentoDatagridStyleState.SCROLL}`]: props.fitContent || isLazyLoad.value,\n [`b-data-grid--${BentoDatagridStyleState.STICKY_FILTERS}`]: props.filters && props.stickyFilters,\n [`b-data-grid--${BentoDatagridStyleState.OVERFLOW_SHADOW_LEFT}`]:\n hasLeftOverflow.value && !frozenColumnsLength.value,\n [`b-data-grid--${BentoDatagridStyleState.OVERFLOW_SHADOW_RIGHT}`]:\n hasRightOverflow.value && props.rowActions === undefined,\n [`b-data-grid--${BentoDatagridStyleState.NO_SPACING_TOP}`]: props.noSpacingTop,\n [`b-data-grid--${BentoDatagridStyleState.FIT_CONTENT}`]: props.fitContent,\n [`b-data-grid--${BentoDatagridStyleState.ZEBRA_ROWS}`]: internalZebraRows.value,\n 'b-data-grid--lazy-load': isLazyLoad.value,\n }));\n\n // Conditional grid body classes\n const conditionalGridBodyClasses = computed(() => ({\n 'b-data-grid__body--sticky-horizontal-scrollbar': props.stickyHorizontalScrollbar,\n }));\n\n const computedColumnPanelAlignment = computed(() => columnSets.value.findIndex(el => el.columnSet.length));\n const showFrozenColumnsSeparator = computed(() => {\n const isSelectionOnlyFrozenColumn =\n (props.selectable || props.hasNestedContent || props.hasNestedRows) && frozenColumnsLength.value === 1;\n return !isSelectionOnlyFrozenColumn || hasLeftOverflow.value;\n });\n\n // Conditional filter classes\n const conditionalFilterClasses = computed(() => ({\n 'b-data-grid__filters--sticky': !!props.stickyFilters || isDataGridTemplate,\n }));\n\n // Conditional pagination classes\n const conditionalPaginationClasses = computed(() => ({\n 'b-data-grid__pagination--padding-left-unset': props.columns?.[0]?.padding?.left === false,\n 'b-data-grid__pagination--padding-right-unset':\n props.columns?.[props.columns.length - 1]?.padding?.right === false,\n 'b-data-grid__pagination--sticky': !!props.stickyPagination || isDataGridTemplate,\n }));\n\n /* == Ref registration methods == */\n const registerColumnHeaderRefs = (el: Element | ComponentPublicInstance) => {\n // We always know this will be used on a DataGridColumns component so we can cast it\n const datagridColumnsComponent = el as InstanceType<typeof DataGridColumns>;\n if (el !== null && datagridColumnsComponent?.columnHeaderRefs) {\n Object.entries(datagridColumnsComponent?.columnHeaderRefs).forEach(([fieldName, colHeaderEl]) => {\n columnHeaderRefs.value[fieldName] = colHeaderEl as HTMLDivElement;\n });\n }\n };\n const registerRowCellRefs = (el: Element | ComponentPublicInstance, rowIndex: number) => {\n // We always know this will be used on a DataGridCell component so we can cast it\n const gridRowComponent = el as InstanceType<typeof DataGridRow>;\n if (el !== null) {\n if (gridRowComponent?.gridcellRefs) {\n const areRowActions = props.rowActions !== undefined && gridRowComponent?.rowActionsRef;\n Object.entries(gridRowComponent?.gridcellRefs).map(([field, cell]) => {\n if (gridcellRefs.value?.[field] === undefined) {\n gridcellRefs.value = { ...gridcellRefs.value, [field]: [] };\n }\n gridcellRefs.value[field][rowIndex] = cell as HTMLDivElement;\n });\n // This calculates the maxium width of the row actions column so we can add the same padding to the columns keep everything aligned\n if (areRowActions) {\n if (gridcellRefs.value?.[DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME] === undefined) {\n gridcellRefs.value = { ...gridcellRefs.value, [DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME]: [] };\n }\n gridcellRefs.value[DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME][rowIndex] = gridRowComponent\n .rowActionsRef?.[0] as HTMLDivElement;\n rowActionsMaxWidth.value = Math.max(\n rowActionsMaxWidth.value,\n gridRowComponent.rowActionsRef?.[0]?.offsetWidth ?? 0\n );\n }\n }\n }\n };\n\n /* == Row methods == */\n // Row selecting\n const onRowClick = (row: BentoDatagridDataItem, event: MouseEvent) => {\n if (props.allowRowClicks) {\n emit(BentoDatagridEvent.ROW_CLICK, row, event);\n }\n };\n // Programmatically set the hover state on a row\n const onCellHover = (rowIndex: number) => {\n hoveredRowIndex.value = rowIndex;\n };\n\n /* == a11y == */\n const ariaGridRole = computed(() => (props.hasNestedContent || props.hasNestedRows ? 'treegrid' : 'grid'));\n\n /* == Action bar == */\n const itemsSelectedCounter = computed(() => selectedItems.value?.length ?? 0);\n const showActionBar = computed(() => props.bulkActions && itemsSelectedCounter.value > 0);\n\n /* == Emits & Events == */\n // Resizing\n const onColumnResized = (resizeEvent: { field: string; width: number }) =>\n emit(BentoDatagridEvent.COLUMN_RESIZE, resizeEvent);\n // Sorting\n const onSort = (updatedSortBy: Array<BentoDatagridSortByColumn>) => {\n emit(BentoDatagridEvent.UPDATE_SORT_BY, updatedSortBy);\n emit(BentoDatagridEvent.SORT, updatedSortBy);\n };\n // Pagination\n const onPaginationNavigate = (page: number, size: number) => {\n emit(BentoDatagridEvent.NAVIGATE, page);\n emit(BentoDatagridEvent.UPDATE_PAGINATION, {\n ...props.pagination,\n size,\n page,\n });\n };\n const onItemsPerPageChange = (itemsPerPage: number) => {\n emit(BentoDatagridEvent.ITEMS_PAGE, itemsPerPage);\n };\n // Filter bar\n const onSearchTermCleared = () => {\n emit(BentoDatagridEvent.FILTER_SEARCH_CLEAR);\n };\n const onSearchTermInput = newSearchTerm => {\n emit(BentoDatagridEvent.UPDATE_FILTER_SEARCH_TERM, newSearchTerm);\n emit(BentoDatagridEvent.FILTER_SEARCH_INPUT, newSearchTerm);\n };\n\n /* == Warnings == */\n const hasMandatoryColumn = computed(() => columns.value.some(column => column.mandatory));\n if (!hasMandatoryColumn.value) {\n printDevelopmentWarning(\n 'WARNING: At least one BentoDataGrid column should be set as mandatory to ensure data is always displayed correctly.'\n );\n }\n\n /* == Provide/inject == */\n const setTitle: BentoTabProvidedTitle = inject(EXTERNAL_TITLE_REGISTER_ENTRY_INJECTION_KEY, () => null);\n setTitle(props.tabTitle);\n\n provide(DATA_GRID_SLASHED_ZERO, toRef(props, 'slashedZero'));\n\n /* == Expose methods == */\n defineExpose({ onEmptyStateClearResetButtonClick });\n</script>\n\n<script lang=\"ts\">\n /**\n * A component to display data in columns and row format with a whole array of configuration for visualization and interaction.\n *\n * @example\n * import { BentoDataGrid } from '@adyen/bento-vue2';\n *\n * export default {\n * components: { BentoDataGrid },\n * template: `\n * <bento-data-grid\n * :data=\"[\n * { id: '123', name: 'John', company: 'TestCompany', 'payment': 200 }\n * { id: '321', name: 'Jane', company: 'Adyen', 'payment': 300 }\n * ]\"\n * :columns=\"[\n * { field: 'name', label: 'Name', minWidth: 300, mandatory: true },\n * { field: 'company', label: 'Reference' },\n * { field: 'payment', label: 'Payment', width: 200, minWidth: 150 },\n * ]\"\n * />\n * `\n * }\n */\n export default {\n i18n: { messages },\n name: 'bento-data-grid',\n };\n</script>\n\n<style lang=\"scss\" scoped src=\"./data-grid.scss\" />\n"],"names":["calculateHeightWithPseudo","element","style","height","after","afterHeight","afterBottom","top","useCalculateStickyElementHeight","elementRef","isSticky","isAdditionalElementSticky","ref","additionalElementRef","topPosition","elementObserver","mutationObserver","setTopPosition","mainElementHeight","additionalElHeight","onMounted","nextTick","stop","watch","observeSizeOfElement","onUnmounted","BentoColumnOverflow","BentoColumnOverflow2","DatagridColumnsEvent","DatagridColumnsEvent2","BentoDatagridStyleState","BentoDatagridStyleState2","BentoDatagridSortDirection","BentoDatagridSortDirection2","BentoDatagridEvent","BentoDatagridEvent2","BentoDatagridAriaSortValue","BentoDatagridAriaSortValue2","useResizer","columns","emit","columnHoverEventToEmitAfterResizing","isResizing","columnWidthOverridesLookup","colKeyLookup","acc","col","columnsRefs","reactive","allColumnRefs","toRefs","stepPositionX","resizingColumnField","defaultResizedColumnWidths","computed","field","width","minWidth","watchEffect","removeMouseMoveResizeListener","removeMouseUpResizeListener","onResizeColumn","event","sizeChange","currResizingColumnField","resizedColumnWidth","stopResize","startResize","hasResizableColumns","listen","newIsResizing","oldIsResizing","DEFAULT_COLUMN_WIDTH","DEFAULT_COLUMN_MIN_WIDTH","DATAGRID_ACTIONS_COLUMN_FIELD_NAME","DATAGRID_SELECT_WIDTH","DATAGRID_SELECT_WIDTH_WITH_SELECT_ALL_PAGES_ENABLED","DATAGRID_SELECT_WIDTH_AND_NESTED_ROWS_ENABLED","DATAGRID_SELECT_WIDTH_AND_SELECT_ALL_PAGES_AND_NESTED_ROWS_ENABLED","DATAGRID_NESTED_ROWS_ENABLED","DATAGRID_CELL_OFFSET_INITIAL","DATAGRID_CELL_OFFSET_PADDING","DATAGRID_TEMPLATE_EXTRA_PADDING","computeFlexColumnsWidth","initialFreeSpace","totalFlexUnits","flexCols","flexColumnsLookup","frozenColumnKeys","freezeColumn","value","processFlexItems","violationsLookup","remainingFreeSpace","flexUnits","totalViolation","i","flexColsLength","column","computedWidth","key","getElementWidthIncludingOffset","el","hasColumnPanel","offset","getActionsColumnWidth","options","_a","_b","_c","_d","_e","useCalculateColumnWidth","newColumns","newData","bodyRef","gridColumnsComponentRefs","gridCellRefs","data","body","gridColumnsComponents","gridCells","isMeasuringColumnWidths","rowActionsMaxWidth","newDataGridColumnsProps","previousDataGridColumnsProps","haveSameFieldsInSameOrder","colA","colB","indexA","item","indexB","gridWidth","bodyElementObserver","calculatedWidths","widthAllocatedBeforeFlex","columnsLookup","columnDefs","invisibleColumnDefs","columnWidth","fluidCol","computedColumnWidths","onColumnWidthOverride","newColumnWidthOverridesLookup","measureAndAssignAutoWidths","columnHeaderWidth","largestRowCellWidth","max","largestColumnHeaderAndRowCellWidth","processedColumns","totalWidthOfAllColumns","visible","val","isTotalWidthOfColumnsTakingUpAllAvailableGridWidth","gridRowWidthStyle","extraPadding","onBeforeUpdate","useSelector","selection","getDataItemId","isDataItemDisabled","isSelectableAcrossPages","pagination","selectedItems","allItemsSelectedState","allDataItemsIncludingChildren","dataItem","isEveryItemInPageSelected","isEveryEnabledItemInPageSelected","isNoItemInPageSelected","isNoEnabledItemInPageSelected","isEveryItemAcrossPagesSelected","emitSelect","updateSelectedItems","childItem","onAllRowSelect","selectAllItems","currentPageItems","onDeselectAll","onRowSelect","rowData","onParentRowSelect","parentRowData","currentRowDateItemId","childrenDataItemIds","parentIdAndChildrenIds","childDataItemId","selectedItemId","onNestedRowSelect","child","selectedItem","selectionState","allChildrenSelectedDataItems","childItemId","useSorter","sortBy","sortedCol","updatedSortBy","BentoDatagridNavigationKey","BentoDatagridNavigationKey2","EventKey","DATAGRID_ROW_ACTIONS_COLUMN_FIELD_NAME","useKeyboardNavigator","gridcellRefs","columnHeaderRefs","selectable","rowActions","hasColumnActions","visibleColumns","visibleColumnsFromValue","visibleColumnsCount","sortedColumnHeaderAndGridCellRefs","firstColumnKey","cells","columnCoumnHeaderCell","numRows","rowIndex","columnCells","getCurrentRowIndex","currentIndex","getEdgeCellIndex","direction","ctrlKey","lastCellIndex","lastColumnIndex","currentRowIndex","currentColumn","getCellIndex","directionDiff","newCellIndex","isEdgeNavigationKeyCode","keyCode","getTargetCellIndex","target","directionKeyCode","currentCellIndex","focusOnNextGridcell","cellIndex","isNavigationKeyCode","dataGridKeyboardNavigationsKey","parentGridCell","LAZY_LOAD_BUFFER_PERCENTAGE","useLazyLoading","lazyLoadTypeRef","verticalScrollPositionRef","loading","lazyLoadType","verticalScrollPosition","isLoading","isLazyLoad","isInfiniteScroll","emitLazyLoadEvent","useColumnReorderer","columnsRef","hasDraggableColumnsRef","hasDraggableColumns","draggingColumns","onMoveColumnByOffset","movingColumn","fromIndex","c","toIndex","reorderedColumns","onDragStart","e","onDragEnter","dragEvent","targetRect","midpoint","clientX","onDrop","toIndexInitial","toLeftOfToIndex","firstUnfrozenColumn","onDragEnd","draggingEventsForColumns","draggingEventsForRowCell","useConfigSettings","isZebraRowsRef","internalZebraRows","sortedColumnsByFreezeState","a","b","frozenColumns","unfrozenColumns","columnSets","columnSet","isOnlyOneVisibleColumn","onConfigSettingsCondensedUpdate","isCondensedView","onConfigSettingsZebraRowsUpdate","isZebraRows","onConfigSettingsColumnsUpdate","onConfigSettingsColumnUpdate","updatedColumn","updatedColumns","newValue","useScroller","virtualHorizontalScrollbar","paginationContainerRef","scrollLeftPosition","hasLeftOverflow","hasRightOverflow","currentScrollLeftPosition","updateScrollPosition","scrollLeftPos","updateScrollPositionOnFrozenColumnsNavigation","syncVirtualScrollerWithBody","horizontalScrollbarConditionalStyles","useColumnHovering","outline","hoveredOverColumn","hoveredOverColumnState","frozenColumnSet","colSet","unFrozenColumnSet","isFirstFrozenColumn","isFirstUnfrozenColumn","isFrozenSelectableOutlineOnFirstCol","isNoFrozenColAndNotFrozenSelectableOutlineOnFirstCol","isFrozenColumnsAndNotFrozenFirstColumn","isFrozenColumnsAndLastFrozenColumn","isOutlineOnAllColumnWidthFitContainerAndLastColumn","focusOnInteractiveChild","childEl","removedParentNodeFromList","getFocusableIn","makeAllInteractiveChildrenUnFocusable","focusableElements","makeAllInteractiveChildrenFocusable","focusNodes","handleClipboard","selectedContent","rows","tableCopy","plainCopy","parseCells","cell","tag","text","row","uuid$8","_sfc_main$i","uuid$7","_sfc_main$h","uuid$6","_sfc_main$g","uuid$5","_sfc_main$f","uuid$4","_sfc_main$e","uuid$3","_sfc_main$d","DATA_GRID_SLASHED_ZERO","DATA_GRID_SMALL_CONTAINER","DATA_GRID_TOUCH_DEVICE","__default__$7","messages$6","CLOSING_CONTEXTUAL_MENU_DELAY_MS","t","useI18n","props","allColumnsRef","contextMenuRef","hoveredColumnField","closingTimeOutId","areAllItemsSelected","isActionsColumn","isAllSelectionState","selectAllMenu","isSorting","getSortingDirection","sortByColumnField","getSortingColumnDirection","sortingDirection","draggingEventsForColumn","contextualMenuData","ArrowLeftIcon","ArrowRightIcon","isSmallContainer","BentoFreezeIcon","HideIcon","ShowIcon","showContextualMenu","hideContextualMenu","timeOutId","dataGridColumnEvents","events","registerColumnsRefs","inject","isTouchDevice","conditionalColumnsClasses","defaultConditionalClasses","conditionalSelectColumnClasses","computeMenuPosition","hasFirstColumnPanelRightAligned","index","BentoPopoverPositions","conditionalColumnClasses","columnIndex","_f","_g","_i","_h","_j","conditionalColumnHeaderAndActionsClasses","conditionalColumnActionsClasses","conditionalColumnSeparatorClasses","conditionalColumnHeaderClasses","conditionalColumnMenuClasses","expose","DatagridConfigSettingsEvent","DatagridConfigSettingsEvent2","uuid$2","_sfc_main$b","_sfc_main$a","defineComponent","messages$5","BentoToggle","isFreezeIconOptionShown","isColumnFrozen","isColumnVisible","toggleColumnVisibility","toggleColumnFreeze","showFreezeIcon","hideFreezeIcon","freezeIconConditionalClasses","_sfc_main$9","messages$4","BentoButton","CrossIcon","BentoPopover","BentoSettingsIcon","BentoToggleButton","BentoDataGridConfigSettingsConfigRow","BentoSearchBar","SearchIcon","BentoTypography","BentoClickOutsideDirective","configSettingsButtonRef","popoverId","generateUid","searchBarRef","isConfigSettingsPanelOpen","allColumnsVisbilityToggleState","searchButtonRef","searchTerm","toRef","isColumnVisibilityFilterShown","filteredColumnVisibilityColumns","useSearchBarFilter","clearAction","areAllNonMandatoryColumnsHidden","toggleColumnFilter","isColumnVisibilityToggleDisabled","emitVisibleColumns","toggleAllColumnVisibility","toggleState","emitFrozenColumns","setConfigSettingsPanelVisibility","isVisible","__default__$6","messages$3","uuid$1","_sfc_main$7","__default__$5","messages$2","getMenuItemText","action","getMenuItemIcon","Copy","Edit1Icon","ExternalLinkIcon","isRowActions","conditionalCellActionsBackgroundGradientClasses","conditionalCellActionsClasses","showGradientElement","isBentoColumnCellActionsByCellValueDataFn","cellActions","computedCellActions","flattenedMenuItems","subMenuItem","OptionsVerticalIcon","transformMenuEvents","printDevelopmentWarning","getButtonTitle","button","isForSvgTitle","generateButtonEvents","generateMenuEvents","menuDataItem","menuData","transformedMenuData","DataGridCellPropClass","DataGridCellPropClass2","isFocusVisible","activeElement","__default__$4","messages$1","slots","useSlots","hasSlot","useHasSlot","gridcellRef","cellActionsRef","shouldShowCellActions","childrenMenuContainerElements","isFocused","focusableItems","hasEverBeenFocused","hasRowData","controlledNestedRowElementIds","ariaHidden","tabIndex","conditionalTitleAttribute","content","getRowData","sumColumnAmountsInColumnSets","limitIndex","total","getColIndex","colIndex","colSetIndex","isLeavingCellFocus","relatedTarget","registeredMenuRef","menuElement","onMenuClose","hasInteractiveElFocusedInside","getGridcellEvents","defaultEvents","gridCellEvents","toggleNestedContent","registerMenuContainerElement","menuContainerElement","menuMouseLeave","provide","DATA_GRID_CELL_MENU_REGISTERING_INJECTION_KEY","hasSlashedZero","conditionalRowCellClasses","computedCellContentClasses","__default__$3","isNestedContentShown","nestedContentRef","rowActionsRef","nestedContentSlotId","isRowActionMenuOpen","shouldShowNestedRowsBooleanResult","shouldShowRenderNestedRows","isLoadingNestedRows","shouldShowNestedContentToggle","ariaRowAttributes","isNestedContentShownBooleanishVal","nestedContentContainerDivAriaAttributes","nestedRowIds","_val","allNestedRowIds","generatedRowIds","hasUnSelectedNestedRows","childrendDataItemIds","nestedItem","everyChildIsSelected","childId","someItemsAreSelected","registerRowCellRef","gridCellComponent","getRowId","childRowIndex","getRowAriaSelectedValue","id","onRowClick","isEventTargetInteractiveElement","dataGridRowInteractiveTypes","onRowActionMenuOpen","onRowActionMenuClose","onRowActionsCellFocus","onRowActionsCellFocusOut","onRowActionsCellOnKeyDown","getRowActionsCellIndex","updateContentHeight","contentHeight","useExpandableContentHeight","nestedContentStyles","observer","nestedContentToggled","_newChildren","oldChildren","isHighlightedRow","isSelectedRow","conditionalRowClasses","conditionalRowSetClasses","isFrozenRowSet","isSmallContainer2","conditionalNestedRowClasses","conditionalRowActionsContainerClasses","computedRowActionsStyles","uuid","_sfc_main$3","__default__$2","computedIcon","CheckmarkCircleFillIcon","WarningFilledIcon","ErrorIcon","NoValueIcon","conditionalClasses","computedIconClass","tooltipPosition","PopperContainerPosition","__default__$1","messages","tc","dashedUnderlineRef","dashedUnderlineProps","lowerCaseSearchTerm","highlightedComponent","highlightedItemsCount","computedToolTipText","__default__","dataGridUid","filtersRef","filterBarRef","virtualHorizontalScrollbarRef","allowColumnDragAndDrop","columnPanel","hasNestedContent","hasNestedRows","selectableAcrossPages","stickyPagination","zebraRows","hoveredRowIndex","frozenColumnsLength","MOBILE_BREAKPOINT","dataGridRef","useElementSize","registerDatagridInDataGridTemplate","DATA_GRID_REGISTER_TEMPLATE_INJECTION_KEY","additionalContentSlotRef","isDataGridTemplate","stickyTabs","tabsRef","stickyAdditionalContent","localColumnsState","args","definedEmitsFunction","stickyFiltersHeight","computedStickyFiltersTopPosition","columnHeadersHeight","computedColumnHeadersTopPosition","sortedColumns","selectableAcrossPagesComputed","visibleRowsState","navigationInput","onEmptyStateClearResetButtonClick","limitedEmptyStateProps","conditionalGridClasses","conditionalGridBodyClasses","computedColumnPanelAlignment","showFrozenColumnsSeparator","conditionalFilterClasses","conditionalPaginationClasses","registerColumnHeaderRefs","datagridColumnsComponent","fieldName","colHeaderEl","registerRowCellRefs","gridRowComponent","areRowActions","onCellHover","ariaGridRole","itemsSelectedCounter","showActionBar","onColumnResized","resizeEvent","onSort","onPaginationNavigate","page","size","onItemsPerPageChange","itemsPerPage","onSearchTermCleared","onSearchTermInput","newSearchTerm","hasMandatoryColumn","setTitle","EXTERNAL_TITLE_REGISTER_ENTRY_INJECTION_KEY"],"mappings":"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"}