@bwp-web/components 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/BiampWrapper/BiampWrapper.tsx","../src/BiampSidebar/BiampSidebar.tsx","../src/BiampHeader/BiampHeader.tsx","../src/BiampLayout/BiampLayout.tsx","../src/BiampTable/BiampTable.tsx","../src/BiampTable/BiampTableEmptyState.tsx","../src/BiampTable/BiampTableStatusMessage.tsx","../src/BiampTable/BiampTableErrorState.tsx","../src/BiampTable/BiampTableTruncatedCell.tsx","../src/BiampTable/useLoadingDelay.ts","../src/BiampTable/BiampTableContainer.tsx","../src/BiampTable/BiampTableCellActionButton.tsx","../src/BiampTable/BiampTableColumnVisibility.tsx","../src/BiampTable/BiampTableToolbarColumnVisibility.tsx","../src/BiampTable/BiampTableToolbarActionButton.tsx","../src/BiampTable/BiampTablePagination.tsx","../src/BiampTable/BiampTableToolbar.tsx","../src/BiampTable/BiampTableToolbarActions.tsx","../src/BiampTable/BiampTableToolbarExport.tsx","../src/BiampTable/BiampTableToolbarFilters.tsx","../src/BiampTable/BiampTableToolbarSearch.tsx","../src/BiampTable/useDebouncedCallback.ts","../src/BiampTable/useBiampServerSideTable.ts","../src/BiampTable/serverSideTableUtils.ts","../src/BiampTable/exportCsv.ts","../src/BiampBanner/BiampBanner.tsx","../src/BiampSegmentedButton/SegmentedButton.tsx","../src/BiampSegmentedButton/SegmentedButtonGroup.tsx","../src/BiampGlobalSearch/BiampGlobalSearch.tsx"],"sourcesContent":["import React from 'react';\nimport { Stack, StackProps } from '@mui/material';\n\nexport type BiampWrapperProps = StackProps & {\n children?: React.ReactNode;\n};\n\n/**\n * A full-page content wrapper that stretches to fill all available space\n * with 16px padding, 8px border radius, and scrollable overflow.\n * Background: white (light) / `grey.800` (dark).\n */\nexport function BiampWrapper({ children, sx, ...props }: BiampWrapperProps) {\n return (\n <Stack\n direction=\"column\"\n padding=\"16px\"\n alignItems=\"flex-start\"\n sx={{\n flex: 1,\n height: '100%',\n width: '100%',\n borderRadius: '8px',\n overflow: 'auto',\n overscrollBehavior: 'none',\n backgroundColor: ({ palette }) =>\n palette.mode === 'dark' ? palette.grey[800] : palette.common.white,\n ...sx,\n }}\n {...props}\n >\n {children}\n </Stack>\n );\n}\n","import {\n Box,\n ListItemButton,\n ListItemButtonProps,\n Stack,\n StackProps,\n} from '@mui/material';\nimport { BiampLogoIcon } from '@bwp-web/assets';\nimport { JSX } from 'react';\n\ntype BiampSidebarProps = StackProps & {\n children: React.ReactNode;\n bottomLogoIcon?: JSX.Element;\n};\n\nexport function BiampSidebar({\n children,\n bottomLogoIcon,\n sx,\n ...props\n}: BiampSidebarProps) {\n return (\n <Stack width=\"48px\" height=\"100%\" sx={{ ...sx }} {...props}>\n <Stack height=\"100%\">{children}</Stack>\n {bottomLogoIcon ?? (\n <BiampLogoIcon sx={{ width: '48px', height: '15px' }} />\n )}\n </Stack>\n );\n}\n\ntype BiampSidebarIconList = StackProps & {\n children: React.ReactNode;\n};\n\nexport function BiampSidebarIconList({\n children,\n sx,\n ...props\n}: BiampSidebarIconList) {\n return (\n <Stack height=\"100%\" sx={{ gap: '4px', ...sx }} {...props}>\n {children}\n </Stack>\n );\n}\n\ntype BiampSidebarIconProps = ListItemButtonProps & {\n selected?: boolean;\n icon: JSX.Element;\n selectedIcon?: JSX.Element;\n};\n\nexport function BiampSidebarIcon({\n selected,\n icon,\n selectedIcon,\n sx,\n ...props\n}: BiampSidebarIconProps) {\n const displayedSelectedIcon = selectedIcon ?? icon;\n return (\n <ListItemButton\n selected={selected}\n disableGutters\n disableRipple\n sx={{\n minWidth: '48px',\n maxWidth: '48px',\n minHeight: '48px',\n maxHeight: '48px',\n borderRadius: '8px',\n justifyContent: 'center',\n alignItems: 'center',\n ...sx,\n }}\n {...props}\n >\n {selected ? displayedSelectedIcon : icon}\n </ListItemButton>\n );\n}\n\ntype BiampSidebarComponentProps = ListItemButtonProps & {\n children: React.ReactNode;\n};\n\nexport function BiampSidebarComponent({\n children,\n sx,\n ...props\n}: BiampSidebarComponentProps) {\n return (\n <Box\n sx={{\n minWidth: '48px',\n maxWidth: '48px',\n minHeight: '48px',\n maxHeight: '48px',\n borderRadius: '8px',\n overflow: 'hidden',\n justifyContent: 'center',\n alignItems: 'center',\n border: ({ palette }) => `0.6px solid ${palette.divider}`,\n ...sx,\n }}\n {...props}\n >\n {children}\n </Box>\n );\n}\n","import {\n alpha,\n Box,\n BoxProps,\n InputAdornment,\n ListItemButton,\n ListItemButtonProps,\n Popover,\n PopoverProps,\n Stack,\n StackProps,\n TextField,\n TextFieldProps,\n Typography,\n} from '@mui/material';\nimport { JSX } from 'react';\nimport { BiampRedLogo, SearchIcon } from '@bwp-web/assets';\n\ntype BiampHeaderProps = StackProps & {\n children?: React.ReactNode;\n};\n\nexport function BiampHeader({ children, sx, ...props }: BiampHeaderProps) {\n return (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n sx={{ px: 2.5, py: 1.5, ...sx }}\n {...props}\n >\n {children}\n </Stack>\n );\n}\n\ntype BiampHeaderTitleProps = BoxProps & {\n icon?: JSX.Element;\n title?: string;\n subtitle?: string;\n};\n\nexport function BiampHeaderTitle({\n icon,\n title,\n subtitle,\n sx,\n ...props\n}: BiampHeaderTitleProps) {\n return (\n <Box\n sx={{ pr: 3, display: 'flex', alignItems: 'center', gap: '12px', ...sx }}\n {...props}\n >\n {icon ? (\n <Box\n sx={{\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {icon}\n </Box>\n ) : (\n <Box\n component=\"img\"\n src={BiampRedLogo}\n alt=\"Biamp\"\n sx={{ width: 24, height: 24 }}\n />\n )}\n <Stack direction=\"row\" gap={0.5}>\n {title && <Typography variant=\"h4\">{title}</Typography>}\n {subtitle && (\n <Typography variant=\"h4\" color=\"text.secondary\">\n {subtitle}\n </Typography>\n )}\n </Stack>\n </Box>\n );\n}\n\ntype BiampHeaderSearchProps = TextFieldProps;\n\nexport function BiampHeaderSearch({ sx, ...props }: BiampHeaderSearchProps) {\n return (\n <TextField\n placeholder=\"Search...\"\n fullWidth\n sx={{\n px: 1.5,\n '& .MuiOutlinedInput-root': {\n height: '40px !important',\n minHeight: '40px',\n },\n '& .MuiOutlinedInput-input': {\n height: '40px !important',\n },\n '& .MuiOutlinedInput-notchedOutline': {\n height: '40px !important',\n border: 'none',\n boxShadow: 'none',\n },\n ...sx,\n }}\n slotProps={{\n input: {\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n },\n }}\n {...props}\n />\n );\n}\n\ntype BiampHeaderActionsProps = BoxProps & {\n children: React.ReactNode;\n};\n\nexport function BiampHeaderActions({\n children,\n sx,\n ...props\n}: BiampHeaderActionsProps) {\n return (\n <Box\n sx={{\n pl: 3,\n gap: 2,\n display: 'flex',\n alignItems: 'center',\n ...sx,\n }}\n {...props}\n >\n {children}\n </Box>\n );\n}\n\ntype BiampHeaderButtonListProps = BoxProps & {\n children: React.ReactNode;\n};\n\nexport function BiampHeaderButtonList({\n children,\n sx,\n ...props\n}: BiampHeaderButtonListProps) {\n return (\n <Box\n sx={{ display: 'flex', alignItems: 'center', gap: 0.5, ...sx }}\n {...props}\n >\n {children}\n </Box>\n );\n}\n\ntype BiampHeaderButtonProps = ListItemButtonProps & {\n icon: JSX.Element;\n selectedIcon?: JSX.Element;\n selected?: boolean;\n};\n\nexport function BiampHeaderButton({\n icon,\n selectedIcon,\n selected,\n sx,\n ...props\n}: BiampHeaderButtonProps) {\n const displayedSelectedIcon = selectedIcon ?? icon;\n return (\n <ListItemButton\n selected={selected}\n disableGutters\n disableRipple\n sx={{\n minWidth: '40px',\n maxWidth: '40px',\n minHeight: '40px',\n maxHeight: '40px',\n borderRadius: '4px',\n justifyContent: 'center',\n alignItems: 'center',\n ...sx,\n }}\n {...props}\n >\n {selected ? displayedSelectedIcon : icon}\n </ListItemButton>\n );\n}\n\ntype BiampAppPopoverProps = PopoverProps & {\n children: React.ReactNode;\n};\n\nexport function BiampAppPopover({\n children,\n open,\n sx,\n ...props\n}: BiampAppPopoverProps) {\n return (\n <Popover\n open={open}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n sx={{ ...sx }}\n transformOrigin={{ vertical: -4, horizontal: 150 }}\n slotProps={{\n paper: {\n sx: {\n borderRadius: '16px',\n backgroundImage: 'none',\n border: ({ palette }) => `0.6px solid ${palette.divider}`,\n boxShadow: ({ palette }) =>\n `0px 4px 24px 0px ${alpha(palette.common.black, 0.15)};`,\n },\n },\n }}\n {...props}\n >\n {children}\n </Popover>\n );\n}\n\ntype BiampAppDialogProps = BoxProps & {\n children: React.ReactNode;\n};\n\nexport function BiampAppDialog({\n children,\n sx,\n ...props\n}: BiampAppDialogProps) {\n return (\n <Box\n sx={{\n p: 2,\n display: 'inline-flex',\n flexWrap: 'wrap',\n gap: 1.5,\n maxWidth: '284px',\n borderRadius: '16px',\n backgroundColor: ({ palette }) =>\n palette.mode === 'dark' ? palette.grey[800] : palette.common.white,\n ...sx,\n }}\n {...props}\n >\n {children}\n </Box>\n );\n}\n\ntype BiampAppDialogItemProps = BoxProps & {\n children: React.ReactNode;\n name: string;\n};\n\nexport function BiampAppDialogItem({\n children,\n name,\n sx,\n ...props\n}: BiampAppDialogItemProps) {\n return (\n <Box\n sx={{\n width: '76px',\n height: '89px',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n cursor: 'pointer',\n justifyContent: 'center',\n gap: '4px',\n borderRadius: '12px',\n border: '0.6px solid transparent',\n transition: 'background-color 0.2s ease, border-color 0.2s ease',\n ':hover': {\n backgroundColor: ({ palette }) => alpha(palette.info.main, 0.1),\n borderColor: ({ palette }) => palette.info.main,\n },\n ...sx,\n }}\n {...props}\n >\n <Box\n sx={{\n mt: '8px',\n width: '54px',\n height: '54px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {children}\n </Box>\n <Typography\n variant=\"caption\"\n fontWeight={600}\n sx={{\n textAlign: 'center',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: '100%',\n }}\n >\n {name}\n </Typography>\n </Box>\n );\n}\n\ntype BiampHeaderProfileProps = ListItemButtonProps & {\n image: string;\n selected?: boolean;\n};\n\nexport function BiampHeaderProfile({\n image,\n selected,\n sx,\n ...props\n}: BiampHeaderProfileProps) {\n return (\n <ListItemButton\n selected={selected}\n disableGutters\n disableRipple\n sx={{\n minWidth: '36px',\n maxWidth: '36px',\n minHeight: '36px',\n maxHeight: '36px',\n borderRadius: '6px',\n justifyContent: 'center',\n alignItems: 'center',\n ...sx,\n }}\n {...props}\n >\n <Box\n component=\"img\"\n src={image}\n alt={'Profile Image'}\n sx={{\n width: 32,\n height: 32,\n borderRadius: '4px',\n border: ({ palette }) =>\n `0.6px solid var(--Divider-divider_primary, ${alpha(palette.background.paper, 0.15)})`,\n }}\n />\n </ListItemButton>\n );\n}\n","import { Stack, StackProps } from '@mui/material';\nimport React from 'react';\n\ntype BiampLayoutProps = StackProps & {\n header?: React.ReactNode;\n sidebar?: React.ReactNode;\n children: React.ReactNode;\n};\n\nexport function BiampLayout({\n header,\n sidebar,\n children,\n sx,\n ...props\n}: BiampLayoutProps) {\n return (\n <Stack\n direction=\"column\"\n height=\"100vh\"\n sx={{\n backgroundColor: ({ palette }) =>\n palette.mode === 'dark' ? palette.grey[900] : palette.grey[100],\n ...sx,\n }}\n {...props}\n >\n {header}\n <Stack\n direction=\"row\"\n flex={1}\n minHeight={0}\n gap={{ xs: 1.5, md: 2.5 }}\n px={{ xs: 1.5, md: 2.5 }}\n pb={{ xs: 1.5, md: 2.5 }}\n pt={{ xs: header ? 0 : 1.5, md: header ? 0 : 2.5 }}\n >\n {sidebar}\n {children}\n </Stack>\n </Stack>\n );\n}\n","import {\n Box,\n type BoxProps,\n Checkbox,\n IconButton,\n Table as MuiTable,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n TableSortLabel,\n type Theme,\n} from '@mui/material';\nimport {\n ChevronDownIcon,\n ChevronRightIcon,\n DropdownChevronDownIcon,\n DropdownChevronUpIcon,\n} from '@bwp-web/assets';\nimport { flexRender, type Row, type Table } from '@tanstack/react-table';\nimport React, { type ReactNode, useRef } from 'react';\nimport { BiampTableEmptyState } from './BiampTableEmptyState';\nimport { BiampTableErrorState } from './BiampTableErrorState';\nimport { BiampTableTruncatedCell } from './BiampTableTruncatedCell';\nimport { useLoadingDelay } from './useLoadingDelay';\n\n// ── Row-click props ────────────────────────────────────────────────\ntype RowClickProps<TData> =\n | {\n /** Called when a clickable body row is clicked. Receives the row's original data. */\n onRowClick: (row: TData) => void;\n /**\n * Controls which rows are clickable. When omitted, all rows are clickable if\n * `onRowClick` is provided.\n */\n isRowClickable?: (row: TData) => boolean;\n }\n | {\n onRowClick?: undefined;\n isRowClickable?: never;\n };\n\n// ── Selection + expanding props ────────────────────────────────────\ntype SelectionExpandingProps =\n | {\n /** When true, renders a checkbox column for row selection. */\n enableRowSelection: true;\n /** When true, renders an expand/collapse toggle column for rows that have sub-rows. */\n enableExpanding: true;\n /** When true, hides the \"select all\" header checkbox while keeping individual row checkboxes. */\n hideSelectAll?: boolean;\n /** When true, selecting a parent row also selects/deselects its children. @default false */\n selectChildrenWithParent?: boolean;\n }\n | {\n /** When true, renders a checkbox column for row selection. */\n enableRowSelection: true;\n enableExpanding?: false;\n /** When true, hides the \"select all\" header checkbox while keeping individual row checkboxes. */\n hideSelectAll?: boolean;\n selectChildrenWithParent?: never;\n }\n | {\n enableRowSelection?: false;\n enableExpanding?: boolean;\n hideSelectAll?: never;\n selectChildrenWithParent?: never;\n };\n\nexport type BiampTableProps<TData> = BoxProps &\n RowClickProps<TData> &\n SelectionExpandingProps & {\n /** TanStack Table instance to connect to. */\n table: Table<TData>;\n /** When true, shows a LinearProgress bar below the table header. */\n loading?: boolean;\n /** When truthy, shown in place of table body rows. Pass `true` or an `Error` for the default error state (an `Error`'s message is displayed), or a custom ReactNode. */\n error?: boolean | Error | ReactNode;\n /** When truthy and the table has no rows, shown instead of an empty body. Pass `true` for the default empty state, or a custom ReactNode. */\n empty?: boolean | ReactNode;\n /** Returns a human-readable name for a row, used in ARIA labels (e.g. \"Select: Conference Room A\"). Falls back to row index. */\n getRowLabel?: (row: TData) => string;\n };\n\n// ── Shared sx helpers ────────────────────────────────────────────\n\nconst overlaySx = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'none',\n} as const;\n\nconst stickyHoverBg = {\n '.MuiTableRow-hover:hover > &, .Mui-selected > &': {\n bgcolor: ({ palette }: Theme) =>\n palette.mode === 'dark' ? palette.grey[800] : palette.grey[100],\n },\n} as const;\n\nfunction cellSx(\n sticky: 'left' | 'right' | undefined,\n minWidth: number | string | undefined,\n zIndex: number,\n) {\n if (sticky) {\n return {\n position: 'sticky',\n [sticky]: 0,\n zIndex,\n width: 0,\n whiteSpace: 'nowrap',\n textAlign: 'center',\n bgcolor: 'background.paper',\n ...(zIndex < 3 && stickyHoverBg),\n } as const;\n }\n const mw = minWidth ?? 40;\n return {\n minWidth: mw,\n whiteSpace: 'nowrap',\n '&:has([data-truncate])': { maxWidth: mw, whiteSpace: 'normal' },\n };\n}\n\n// ── Hoisted sx objects (avoid re-creation per row per render) ────\n\nconst rowCursorPointerSx = { cursor: 'pointer' } as const;\n\nconst selectionCellSx = {\n position: 'sticky',\n left: 0,\n zIndex: 2,\n bgcolor: 'background.paper',\n ...stickyHoverBg,\n} as const;\n\nconst checkboxHiddenSx = { visibility: 'hidden' } as const;\n\nconst expandCellBaseSx = {\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n} as const;\n\nconst expandPlaceholderSx = { width: 28 } as const;\n\nconst headerSelectionCellSx = {\n position: 'sticky',\n left: 0,\n zIndex: 3,\n bgcolor: 'background.paper',\n} as const;\n\nconst checkboxHiddenHeaderSx = { visibility: 'hidden' } as const;\n\n// ── Memoized row ─────────────────────────────────────────────────\n\ntype BiampTableRowProps<TData> = {\n row: Row<TData>;\n isExpanded: boolean;\n isSelected: boolean;\n onRowClick?: (row: TData) => void;\n isRowClickable?: (row: TData) => boolean;\n enableRowSelection: boolean;\n enableExpanding: boolean;\n selectChildrenWithParent: boolean;\n getRowLabel?: (row: TData) => string;\n hasExpandableRows: boolean;\n};\n\nfunction BiampTableRowInner<TData>({\n row,\n isExpanded,\n isSelected,\n onRowClick,\n isRowClickable,\n enableRowSelection,\n enableExpanding,\n selectChildrenWithParent,\n getRowLabel,\n hasExpandableRows,\n}: BiampTableRowProps<TData>) {\n const clickable = onRowClick\n ? isRowClickable\n ? isRowClickable(row.original)\n : true\n : false;\n\n return (\n <TableRow\n key={row.id}\n hover={clickable}\n selected={enableRowSelection ? isSelected : undefined}\n role={clickable ? 'button' : undefined}\n tabIndex={clickable ? 0 : undefined}\n sx={clickable ? rowCursorPointerSx : undefined}\n onClick={\n clickable && onRowClick ? () => onRowClick(row.original) : undefined\n }\n onKeyDown={\n clickable && onRowClick\n ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onRowClick(row.original);\n }\n }\n : undefined\n }\n >\n {enableRowSelection && (\n <TableCell padding=\"checkbox\" sx={selectionCellSx}>\n <Checkbox\n checked={isSelected}\n disabled={!row.getCanSelect()}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n row.toggleSelected(e.target.checked, {\n selectChildren: selectChildrenWithParent,\n })\n }\n onClick={(e) => e.stopPropagation()}\n sx={!row.getCanSelect() ? checkboxHiddenSx : undefined}\n slotProps={{\n input: {\n 'aria-label': getRowLabel\n ? `Select ${getRowLabel(row.original)}`\n : `Select row ${row.index + 1}`,\n },\n }}\n />\n </TableCell>\n )}\n {row.getVisibleCells().map((cell, cellIndex, cells) => {\n const sticky = cell.column.columnDef.meta?.sticky;\n const isExpandCell =\n enableExpanding &&\n !sticky &&\n cellIndex ===\n cells.findIndex((c) => !c.column.columnDef.meta?.sticky);\n\n const content = flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n );\n\n return (\n <TableCell\n key={cell.id}\n data-sticky={sticky || undefined}\n sx={{\n ...cellSx(sticky, cell.column.columnDef.meta?.minWidth, 2),\n pl: isExpandCell ? '6px' : '12px',\n }}\n >\n {(() => {\n if (sticky) return content;\n\n const truncate = cell.column.columnDef.meta?.truncate ?? true;\n const truncated = truncate ? (\n <BiampTableTruncatedCell>{content}</BiampTableTruncatedCell>\n ) : (\n content\n );\n\n if (!isExpandCell) return truncated;\n\n const rowLabel = getRowLabel\n ? getRowLabel(row.original)\n : `row ${row.index + 1}`;\n\n return (\n <Box\n sx={\n row.depth > 0\n ? { ...expandCellBaseSx, pl: `${row.depth * 12}px` }\n : expandCellBaseSx\n }\n >\n {row.getCanExpand() ? (\n <IconButton\n variant=\"none\"\n onClick={(e) => {\n e.stopPropagation();\n row.toggleExpanded();\n }}\n aria-label={\n isExpanded\n ? `Collapse ${rowLabel}`\n : `Expand ${rowLabel}`\n }\n aria-expanded={isExpanded}\n >\n {isExpanded ? (\n <ChevronDownIcon\n variant=\"xs\"\n sx={{\n color: ({ palette }) => palette.text.secondary,\n }}\n />\n ) : (\n <ChevronRightIcon\n variant=\"xs\"\n sx={{\n color: ({ palette }) => palette.text.secondary,\n }}\n />\n )}\n </IconButton>\n ) : hasExpandableRows ? (\n <Box sx={expandPlaceholderSx} />\n ) : null}\n {truncated}\n </Box>\n );\n })()}\n </TableCell>\n );\n })}\n </TableRow>\n );\n}\n\nfunction biampTableRowPropsAreEqual<TData>(\n prev: BiampTableRowProps<TData>,\n next: BiampTableRowProps<TData>,\n) {\n return (\n prev.row.id === next.row.id &&\n prev.row.original === next.row.original &&\n prev.isSelected === next.isSelected &&\n prev.isExpanded === next.isExpanded &&\n prev.row.getVisibleCells().length === next.row.getVisibleCells().length &&\n prev.enableRowSelection === next.enableRowSelection &&\n prev.enableExpanding === next.enableExpanding &&\n prev.hasExpandableRows === next.hasExpandableRows &&\n prev.selectChildrenWithParent === next.selectChildrenWithParent &&\n prev.onRowClick === next.onRowClick &&\n prev.isRowClickable === next.isRowClickable &&\n prev.getRowLabel === next.getRowLabel\n );\n}\n\nconst BiampTableRow = React.memo(\n BiampTableRowInner,\n biampTableRowPropsAreEqual,\n) as typeof BiampTableRowInner;\n\n// ── Component ────────────────────────────────────────────────────\n\nexport function BiampTable<TData>({\n table,\n onRowClick,\n isRowClickable,\n loading,\n error,\n empty,\n enableRowSelection = false,\n enableExpanding = false,\n hideSelectAll,\n selectChildrenWithParent = false,\n getRowLabel,\n sx,\n ...boxProps\n}: BiampTableProps<TData>) {\n // Sum visible column min-widths so the <table> element itself gets a concrete\n // minWidth. Without this, `width: 100%` on the table always fills the container\n // and columns just share available space instead of overflowing horizontally.\n const tableMinWidth = table.getVisibleLeafColumns().reduce(\n (sum, col) => {\n const mw = col.columnDef.meta?.minWidth;\n return sum + (typeof mw === 'number' ? mw : 40);\n },\n enableRowSelection ? 48 : 0,\n );\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n const showLoading = useLoadingDelay(!!loading);\n\n const rows = table.getRowModel().rows;\n const hasExpandableRows =\n enableExpanding && rows.some((r) => r.getCanExpand());\n const showError = !!error && !loading;\n const showEmpty = !showError && !loading && rows.length === 0;\n\n return (\n <TableContainer\n component={Box}\n {...boxProps}\n ref={containerRef}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n position: 'relative',\n ...sx,\n }}\n >\n <MuiTable\n aria-busy={showLoading || undefined}\n sx={{ minWidth: tableMinWidth, tableLayout: 'auto' }}\n >\n <TableHead>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {enableRowSelection && (\n <TableCell padding=\"checkbox\" sx={headerSelectionCellSx}>\n {!hideSelectAll && (\n <Checkbox\n checked={table.getIsAllPageRowsSelected()}\n indeterminate={table.getIsSomePageRowsSelected()}\n onChange={table.getToggleAllPageRowsSelectedHandler()}\n sx={\n rows.length === 0 ? checkboxHiddenHeaderSx : undefined\n }\n slotProps={{ input: { 'aria-label': 'Select all rows' } }}\n />\n )}\n </TableCell>\n )}\n {headerGroup.headers.map((header) => {\n const sticky = header.column.columnDef.meta?.sticky;\n return (\n <TableCell\n key={header.id}\n data-sticky={sticky || undefined}\n sortDirection={header.column.getIsSorted() || false}\n {...(header.column.getCanSort() && {\n 'aria-sort': header.column.getIsSorted()\n ? header.column.getIsSorted() === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none',\n })}\n sx={cellSx(\n sticky,\n header.column.columnDef.meta?.minWidth,\n 3,\n )}\n >\n {header.isPlaceholder ? null : header.column.getCanSort() ? (\n <TableSortLabel\n active={!!header.column.getIsSorted()}\n direction={header.column.getIsSorted() || 'asc'}\n onClick={header.column.getToggleSortingHandler()}\n {...(header.column.getIsSorted() && {\n IconComponent:\n header.column.getIsSorted() === 'asc'\n ? DropdownChevronUpIcon\n : DropdownChevronDownIcon,\n })}\n >\n {flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </TableSortLabel>\n ) : (\n flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )\n )}\n </TableCell>\n );\n })}\n </TableRow>\n ))}\n </TableHead>\n\n <TableBody sx={{ opacity: showLoading ? 0.3 : 1 }}>\n {!showError &&\n rows.map((row) => (\n <BiampTableRow\n key={row.id}\n row={row}\n isExpanded={row.getIsExpanded()}\n isSelected={row.getIsSelected()}\n onRowClick={onRowClick}\n isRowClickable={isRowClickable}\n enableRowSelection={enableRowSelection}\n enableExpanding={enableExpanding}\n selectChildrenWithParent={selectChildrenWithParent}\n getRowLabel={getRowLabel}\n hasExpandableRows={hasExpandableRows}\n />\n ))}\n </TableBody>\n </MuiTable>\n\n {showError && (\n <Box sx={overlaySx}>\n {error === true ? (\n <BiampTableErrorState sx={{ pointerEvents: 'auto' }} />\n ) : error instanceof Error ? (\n <BiampTableErrorState\n description={error.message}\n sx={{ pointerEvents: 'auto' }}\n />\n ) : (\n error\n )}\n </Box>\n )}\n\n {showEmpty && (\n <Box sx={overlaySx}>\n {empty && empty !== true ? (\n empty\n ) : (\n <BiampTableEmptyState sx={{ pointerEvents: 'auto' }} />\n )}\n </Box>\n )}\n </TableContainer>\n );\n}\n","import { NoResultsIcon } from '@bwp-web/assets';\nimport {\n BiampTableStatusMessage,\n type BiampTableStatusMessageProps,\n} from './BiampTableStatusMessage';\n\nexport type BiampTableEmptyStateProps = Partial<BiampTableStatusMessageProps>;\n\nexport function BiampTableEmptyState({\n icon = <NoResultsIcon />,\n title = 'Nothing to show',\n ...rest\n}: BiampTableEmptyStateProps) {\n return (\n <BiampTableStatusMessage\n role=\"status\"\n icon={icon}\n title={title}\n {...rest}\n />\n );\n}\n","import { Stack, type StackProps, Typography } from '@mui/material';\nimport { cloneElement, type JSX, type ReactNode } from 'react';\n\nexport type BiampTableStatusMessageProps = StackProps & {\n /** Required icon element rendered at 56×56. */\n icon: JSX.Element;\n /** Required title text. */\n title: string;\n /** Optional description text. */\n description?: string;\n /** Optional extra content (e.g. retry buttons). */\n children?: ReactNode;\n};\n\nexport function BiampTableStatusMessage({\n icon,\n title,\n description,\n children,\n ...stackProps\n}: BiampTableStatusMessageProps) {\n return (\n <Stack alignItems=\"center\" gap={1.5} {...stackProps}>\n {cloneElement(icon, {\n 'aria-hidden': true,\n sx: { width: 56, height: 56, ...icon.props.sx },\n })}\n <Typography variant=\"h2\">{title}</Typography>\n {description && <Typography variant=\"body1\">{description}</Typography>}\n {children}\n </Stack>\n );\n}\n","import { ServiceNotReachableIcon } from '@bwp-web/assets';\nimport {\n BiampTableStatusMessage,\n type BiampTableStatusMessageProps,\n} from './BiampTableStatusMessage';\n\nexport type BiampTableErrorStateProps = Partial<BiampTableStatusMessageProps>;\n\nexport function BiampTableErrorState({\n icon = <ServiceNotReachableIcon />,\n title = 'Failed to load',\n ...rest\n}: BiampTableErrorStateProps) {\n return (\n <BiampTableStatusMessage role=\"alert\" icon={icon} title={title} {...rest} />\n );\n}\n","import { Box, Tooltip } from '@mui/material';\nimport React, { useCallback, useRef, useState } from 'react';\n\n/**\n * Renders cell content with single-line truncation (ellipsis).\n * A tooltip showing the full text appears only when the content is actually truncated.\n * The Tooltip popup is only mounted when `open` is true, so there is zero DOM\n * overhead for non-truncated cells.\n */\nexport function BiampTableTruncatedCell({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const textRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n\n const handleMouseEnter = useCallback(() => {\n const el = textRef.current;\n if (el && el.scrollWidth > el.clientWidth) {\n setOpen(true);\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setOpen(false);\n }, []);\n\n return (\n <Tooltip\n title={children}\n open={open}\n arrow\n placement=\"top\"\n disableInteractive\n >\n <Box\n data-truncate\n ref={textRef}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n sx={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n minWidth: 0,\n }}\n >\n {children}\n </Box>\n </Tooltip>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\n\ntype Status = 'idle' | 'delaying' | 'loading' | 'ending';\n\n/**\n * Delays showing a loading indicator so that fast loads don't cause a flicker.\n *\n * State machine:\n * idle ──(loading=true)──▶ delaying ──(delay ms)──▶ loading ──(minDuration ms)──▶ ending\n * ▲ │ │\n * └──(loading=false)───────┘ └────────(loading=false)──────┘\n *\n * - Waits `delay` ms before showing the indicator.\n * - Once shown, keeps it visible for at least `minDuration` ms.\n * - If loading finishes before the delay, no indicator is shown at all.\n */\nexport function useLoadingDelay(\n loading: boolean,\n { delay = 150, minDuration = 500 } = {},\n): boolean {\n const [status, setStatus] = useState<Status>('idle');\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n function clearPending() {\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }\n\n useEffect(() => {\n if (loading && status === 'idle') {\n clearPending();\n\n // After the initial delay, show the indicator and schedule end.\n timeoutRef.current = setTimeout(() => {\n timeoutRef.current = setTimeout(() => {\n setStatus('ending');\n }, minDuration);\n\n setStatus('loading');\n }, delay);\n\n setStatus('delaying');\n }\n\n if (!loading && status !== 'loading') {\n clearPending();\n setStatus('idle');\n }\n }, [loading, delay, minDuration, status]);\n\n useEffect(() => clearPending, []);\n\n return status === 'loading' || status === 'ending';\n}\n","import { Stack, StackProps } from '@mui/material';\n\nexport type BiampTableContainerProps = {\n /** Show a top border. @default true */\n withBorderTop?: boolean;\n /** Show a bottom border. @default false */\n withBorderBottom?: boolean;\n} & StackProps;\n\nexport function BiampTableContainer({\n withBorderTop = true,\n withBorderBottom = false,\n children,\n sx,\n ...props\n}: BiampTableContainerProps) {\n return (\n <Stack\n direction=\"column\"\n height=\"100%\"\n overflow=\"hidden\"\n px={{ xs: 2, sm: 3, xl: 12.5 }}\n py={{ xs: 0, md: 1.5 }}\n gap={{ xs: 0, md: 1 }}\n borderTop={\n withBorderTop\n ? ({ palette }) => `0.6px solid ${palette.divider}`\n : undefined\n }\n borderBottom={\n withBorderBottom\n ? ({ palette }) => `0.6px solid ${palette.divider}`\n : undefined\n }\n sx={{ ...sx }}\n {...props}\n >\n {children}\n </Stack>\n );\n}\n","import { IconButton, type IconButtonProps, Tooltip } from '@mui/material';\nimport type React from 'react';\n\nexport type BiampTableCellActionButtonProps<\n C extends React.ElementType = 'button',\n> = {\n /** Tooltip label for the action button. */\n label: string;\n /** Icon to display inside the button. */\n icon: React.ReactNode;\n} & IconButtonProps<C, { component?: C }>;\n\n/** Icon button with a tooltip, designed for use inside table cell action columns. */\nexport function BiampTableCellActionButton<\n C extends React.ElementType = 'button',\n>({ label, icon, ...props }: BiampTableCellActionButtonProps<C>) {\n return (\n <Tooltip\n title={label}\n placement=\"top\"\n enterDelay={500}\n enterNextDelay={500}\n disableInteractive\n >\n <span>\n <IconButton aria-label={label} {...props}>\n {icon}\n </IconButton>\n </span>\n </Tooltip>\n );\n}\n","import {\n alpha,\n Box,\n Checkbox,\n Divider,\n List,\n ListItem,\n Popover,\n type PopoverProps,\n Typography,\n type SxProps,\n type Theme,\n} from '@mui/material';\nimport type { Table, VisibilityState } from '@tanstack/react-table';\nimport './tanstack-meta';\n\n/**\n * A looser alternative to TanStack's `VisibilityState` (`Record<string, boolean>`).\n * Accepts `Partial<Record<string, boolean>>` so callers don't need to cast\n * from URL params or partial objects. Internally, `undefined` values are\n * treated as `true` (visible).\n */\nexport type ColumnVisibility = Partial<Record<string, boolean>>;\n\n/**\n * Converts a `ColumnVisibility` to TanStack's `VisibilityState`.\n * Use this when passing to `useReactTable({ state: { columnVisibility } })`.\n */\nexport function toVisibilityState(\n visibility: ColumnVisibility,\n): VisibilityState {\n return visibility as VisibilityState;\n}\n\n/**\n * Reads `meta.defaultVisible` from all leaf columns and returns a\n * `ColumnVisibility` map. Columns without `defaultVisible` are omitted\n * (treated as visible by default).\n */\nexport function getDefaultColumnVisibility<TData>(\n table: Table<TData>,\n): ColumnVisibility {\n const result: ColumnVisibility = {};\n for (const col of table.getAllLeafColumns()) {\n const dv = col.columnDef.meta?.defaultVisible;\n if (dv !== undefined) result[col.id] = dv;\n }\n return result;\n}\n\n/**\n * Returns the number of columns whose visibility differs from the default.\n * When `defaultVisibility` is omitted, auto-derives from `meta.defaultVisible`\n * on each column definition.\n */\nexport function getColumnVisibilityDirtyCount<TData>(\n table: Table<TData>,\n defaultVisibility?: ColumnVisibility,\n): number {\n const current = table.getState().columnVisibility;\n const defaults = defaultVisibility ?? getDefaultColumnVisibility(table);\n let count = 0;\n for (const col of table.getAllLeafColumns()) {\n const isVisible = current[col.id] ?? true;\n const wasVisible = defaults[col.id] ?? true;\n if (isVisible !== wasVisible) count++;\n }\n return count;\n}\n\nexport type BiampTableColumnVisibilityProps<TData> = Omit<\n PopoverProps,\n 'open'\n> & {\n /** TanStack Table instance to connect to. */\n table: Table<TData>;\n /** Label for the \"show all\" toggle. @default \"Show all\" */\n showAllLabel?: string;\n};\n\nconst columnListItemSx: SxProps<Theme> = {\n py: 0,\n pr: 1.5,\n pl: 0,\n alignItems: 'center',\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: ({ palette }) =>\n palette.mode === 'dark' ? palette.grey[800] : palette.grey[100],\n },\n};\n\nexport function BiampTableColumnVisibility<TData>({\n table,\n showAllLabel = 'Show all',\n anchorEl,\n anchorOrigin = { vertical: 'bottom', horizontal: 'right' },\n transformOrigin = { vertical: 'top', horizontal: 'right' },\n slotProps,\n ...popoverProps\n}: BiampTableColumnVisibilityProps<TData>) {\n const allVisible = table\n .getAllLeafColumns()\n .every((col) => col.getIsVisible());\n\n return (\n <Popover\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n anchorOrigin={anchorOrigin}\n transformOrigin={transformOrigin}\n slotProps={{\n ...slotProps,\n paper: {\n sx: ({ palette }) => ({\n borderRadius: '6px',\n backgroundImage: 'none',\n border: `0.6px solid ${palette.dividers.secondary}`,\n boxShadow: `0px 1px 1px 0px ${alpha(palette.common.black, 0.05)}`,\n minWidth: '150px',\n }),\n ...((slotProps?.paper ?? {}) as Record<string, unknown>),\n },\n }}\n {...popoverProps}\n >\n <List dense disablePadding>\n <ListItem\n dense\n sx={columnListItemSx}\n onClick={() => table.toggleAllColumnsVisible(!allVisible)}\n >\n <Checkbox\n checked={allVisible}\n slotProps={{ input: { 'aria-label': `${showAllLabel} columns` } }}\n />\n <Typography variant=\"caption\" fontWeight={600}>\n {showAllLabel}\n </Typography>\n </ListItem>\n <Divider />\n <Box\n sx={{ maxHeight: 340, overflow: 'auto', overscrollBehavior: 'none' }}\n >\n {table.getAllLeafColumns().map((column) => {\n const columnName =\n column.columnDef.meta?.columnLabel ??\n (typeof column.columnDef.header === 'string'\n ? column.columnDef.header\n : column.id);\n return (\n <ListItem\n key={column.id}\n dense\n sx={columnListItemSx}\n onClick={column.getToggleVisibilityHandler()}\n >\n <Checkbox\n checked={column.getIsVisible()}\n sx={{ py: 1 }}\n slotProps={{\n input: { 'aria-label': `Show ${columnName}` },\n }}\n />\n <Typography variant=\"caption\">{columnName}</Typography>\n </ListItem>\n );\n })}\n </Box>\n </List>\n </Popover>\n );\n}\n","import { ColumnsIcon } from '@bwp-web/assets';\nimport type { Table } from '@tanstack/react-table';\nimport React, { type ReactNode, useState } from 'react';\nimport {\n BiampTableColumnVisibility,\n type ColumnVisibility,\n getColumnVisibilityDirtyCount,\n getDefaultColumnVisibility,\n} from './BiampTableColumnVisibility';\nimport {\n BiampTableToolbarActionButton,\n type BiampTableToolbarActionButtonProps,\n} from './BiampTableToolbarActionButton';\n\nexport type BiampTableToolbarColumnVisibilityProps<TData> = {\n /** TanStack Table instance to connect to. */\n table: Table<TData>;\n /** Icon for the toolbar trigger button. @default <ColumnsIcon variant=\"xs\" /> */\n icon?: ReactNode;\n /** Accessible label for the toolbar trigger button. @default \"Columns\" */\n label?: string;\n /**\n * Default column visibility map used to compute the badge count.\n * When omitted, auto-derived from `meta.defaultVisible` on each column.\n */\n defaultColumnVisibility?: ColumnVisibility;\n /** Label for the \"show all\" toggle inside the popover. @default \"Show all\" */\n showAllLabel?: string;\n} & Omit<\n BiampTableToolbarActionButtonProps,\n 'icon' | 'label' | 'onClick' | 'badgeContent' | 'onChange'\n>;\n\nexport function BiampTableToolbarColumnVisibility<TData>({\n table,\n icon = <ColumnsIcon variant=\"xs\" />,\n label = 'Columns',\n defaultColumnVisibility,\n showAllLabel,\n ...actionButtonProps\n}: BiampTableToolbarColumnVisibilityProps<TData>) {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n\n const defaults = defaultColumnVisibility ?? getDefaultColumnVisibility(table);\n const dirtyCount = getColumnVisibilityDirtyCount(table, defaults);\n\n return (\n <>\n <BiampTableToolbarActionButton\n label={label}\n icon={icon}\n badgeContent={dirtyCount}\n onClick={(e: React.MouseEvent<HTMLButtonElement>) =>\n setAnchorEl(e.currentTarget)\n }\n {...actionButtonProps}\n />\n <BiampTableColumnVisibility\n table={table}\n anchorEl={anchorEl}\n onClose={() => setAnchorEl(null)}\n showAllLabel={showAllLabel}\n />\n </>\n );\n}\n","import {\n Badge,\n type BadgeProps,\n IconButton,\n type IconButtonProps,\n} from '@mui/material';\nimport type React from 'react';\n\nexport type BiampTableToolbarActionButtonProps = {\n /** Accessible label for the icon button. */\n label: string;\n /** Icon to display inside the button. */\n icon: React.ReactNode;\n /** Optional badge content. Shown as a dot indicator when provided. */\n badgeContent?: BadgeProps['badgeContent'];\n} & Omit<IconButtonProps, 'children' | 'aria-label'>;\n\nexport function BiampTableToolbarActionButton({\n label,\n icon,\n badgeContent,\n ...props\n}: BiampTableToolbarActionButtonProps) {\n const showBadge = badgeContent != null && badgeContent !== 0;\n\n return (\n <IconButton\n aria-label={showBadge ? `${label} (${badgeContent})` : label}\n {...props}\n >\n {showBadge ? (\n <Badge\n badgeContent={badgeContent}\n color=\"info\"\n variant=\"dot\"\n sx={{\n '& .MuiBadge-badge': {\n width: 6,\n height: 6,\n minWidth: 6,\n borderRadius: '50%',\n top: 0,\n right: -3,\n },\n }}\n >\n {icon}\n </Badge>\n ) : (\n icon\n )}\n </IconButton>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport { TablePagination, type TablePaginationProps } from '@mui/material';\nimport type { Table } from '@tanstack/react-table';\n\nexport type BiampTablePaginationProps<TData> = {\n /** TanStack Table instance to connect to. */\n table: Table<TData>;\n /** Rows-per-page options. When omitted, the selector is hidden and defaults to 25. */\n rowsPerPageOptions?: number[];\n /** When true, keeps the previous row count visible instead of dropping to 0. */\n loading?: boolean;\n /** Hide pagination when all rows fit on one page. @default true */\n autoHide?: boolean;\n /** Horizontal alignment of the pagination controls. @default 'center' */\n position?: 'left' | 'center' | 'right';\n} & Omit<\n TablePaginationProps<'div'>,\n | 'component'\n | 'count'\n | 'page'\n | 'rowsPerPage'\n | 'onPageChange'\n | 'onRowsPerPageChange'\n | 'rowsPerPageOptions'\n | 'position'\n>;\n\nconst positionMap = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n};\n\nexport function BiampTablePagination<TData>({\n table,\n rowsPerPageOptions,\n loading,\n autoHide = true,\n position = 'center',\n sx,\n ...paginationProps\n}: BiampTablePaginationProps<TData>) {\n const rowCount = table.getRowCount();\n const lastRowCountRef = useRef(rowCount);\n\n // Update the stable count only when not loading and the count is meaningful.\n if (!loading && rowCount >= 0) {\n lastRowCountRef.current = rowCount;\n }\n\n const stableCount = loading ? lastRowCountRef.current : rowCount;\n const { pageSize, pageIndex } = table.getState().pagination;\n\n // Auto-correct page when row count drops (e.g. after filtering)\n const maxPage = Math.max(0, Math.ceil(stableCount / pageSize) - 1);\n useEffect(() => {\n if (!loading && pageIndex > maxPage) {\n table.setPageIndex(maxPage);\n }\n }, [loading, pageIndex, maxPage, table]);\n\n // Hide when there's no data or everything fits on one page\n if (autoHide && (!stableCount || stableCount <= pageSize)) return null;\n\n return (\n <TablePagination\n component=\"div\"\n count={stableCount}\n page={table.getState().pagination.pageIndex}\n rowsPerPage={table.getState().pagination.pageSize}\n onPageChange={(_, page) => table.setPageIndex(page)}\n onRowsPerPageChange={(e) => {\n table.setPageSize(Number(e.target.value));\n table.setPageIndex(0);\n }}\n rowsPerPageOptions={rowsPerPageOptions ?? []}\n showFirstButton\n showLastButton\n sx={{\n display: 'flex',\n justifyContent: positionMap[position],\n height: 40,\n minHeight: 40,\n '& .MuiToolbar-root': {\n minHeight: 40,\n px: 0,\n },\n ...sx,\n }}\n {...paginationProps}\n />\n );\n}\n","import { Box, type BoxProps } from '@mui/material';\n\nexport type BiampTableToolbarProps = BoxProps;\n\nexport function BiampTableToolbar({\n children,\n sx,\n ...props\n}: BiampTableToolbarProps) {\n return (\n <Box\n role=\"toolbar\"\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n gap={{ xs: 0, md: 1 }}\n minHeight={44}\n pl={{ xs: 2, sm: 3, xl: 12.5 }}\n pr={{ xs: 0, md: 3, xl: 12.5 }}\n sx={{ ...sx }}\n {...props}\n >\n {children}\n </Box>\n );\n}\n","import { Box, type BoxProps } from '@mui/material';\n\nexport type BiampTableToolbarActionsProps = BoxProps;\n\nexport function BiampTableToolbarActions({\n children,\n ...props\n}: BiampTableToolbarActionsProps) {\n return (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n ml=\"auto\"\n gap={{ xs: 0, md: 1 }}\n mr={{ xs: 1, md: 0 }}\n {...props}\n >\n {children}\n </Box>\n );\n}\n","import { CircularProgress } from '@mui/material';\nimport { DownloadIcon } from '@bwp-web/assets';\nimport {\n BiampTableToolbarActionButton,\n type BiampTableToolbarActionButtonProps,\n} from './BiampTableToolbarActionButton';\n\nexport type BiampTableToolbarExportProps = {\n /** Called when the export button is clicked. */\n onExport: () => void;\n /** When true, shows a spinner instead of the icon and disables the button. */\n loading?: boolean;\n /** Icon element for the button. @default DownloadIcon */\n icon?: React.ReactNode;\n /** Accessible label for the button. @default \"Export\" */\n label?: string;\n} & Omit<\n BiampTableToolbarActionButtonProps,\n 'icon' | 'label' | 'onClick' | 'badgeContent'\n>;\n\nexport function BiampTableToolbarExport({\n onExport,\n loading,\n icon = <DownloadIcon variant=\"xs\" />,\n label = 'Export',\n ...props\n}: BiampTableToolbarExportProps) {\n return (\n <BiampTableToolbarActionButton\n label={loading ? `${label}, loading` : label}\n icon={loading ? <CircularProgress size={20} color=\"inherit\" /> : icon}\n disabled={loading}\n onClick={onExport}\n {...props}\n />\n );\n}\n","import {\n Badge,\n Box,\n Button,\n Divider,\n Drawer,\n type DrawerProps,\n IconButton,\n Typography,\n} from '@mui/material';\nimport { CloseIcon, FilterIcon } from '@bwp-web/assets';\nimport { type ReactNode, useId, useState } from 'react';\nimport { BiampTableToolbarActionButton } from './BiampTableToolbarActionButton';\n\nexport type BiampTableToolbarFiltersProps = {\n /** Number of currently active filters. Shown as a badge on the trigger button. */\n activeFilterCount: number;\n /** Filter form content rendered inside the drawer body. */\n children: ReactNode;\n /** Called when the user clicks the reset / clear-all button. */\n onReset: () => void;\n /** Called when the drawer is closed (via close button, apply, or backdrop click). */\n onApply?: () => void;\n /** Icon for the toolbar trigger button. @default FilterIcon */\n icon?: ReactNode;\n /** Drawer heading. @default \"Filters\" */\n title?: string;\n /** Reset button label. @default \"Clear filters\" */\n resetLabel?: string;\n /** Apply button label. @default \"Apply\" */\n applyLabel?: string;\n /** Accessible label for the drawer close button. @default \"Close\" */\n closeLabel?: string;\n /** Accessible label for the toolbar trigger button. @default \"Filters\" */\n buttonLabel?: string;\n /** Additional props forwarded to the MUI Drawer. */\n DrawerProps?: Partial<DrawerProps>;\n};\n\nexport function BiampTableToolbarFilters({\n activeFilterCount,\n children,\n onReset,\n onApply,\n icon = <FilterIcon variant=\"xs\" />,\n title = 'Filters',\n resetLabel = 'Clear filters',\n applyLabel = 'Apply',\n closeLabel = 'Close',\n buttonLabel = 'Filters',\n DrawerProps: drawerProps,\n}: BiampTableToolbarFiltersProps) {\n const [open, setOpen] = useState(false);\n const titleId = useId();\n\n function handleClose() {\n onApply?.();\n setOpen(false);\n }\n\n return (\n <>\n <BiampTableToolbarActionButton\n label={buttonLabel}\n icon={icon}\n badgeContent={activeFilterCount}\n onClick={() => setOpen(true)}\n />\n\n <Drawer\n anchor=\"right\"\n open={open}\n onClose={handleClose}\n aria-labelledby={titleId}\n {...drawerProps}\n PaperProps={{\n sx: { width: { xs: '100%', sm: 480 } },\n ...drawerProps?.PaperProps,\n }}\n >\n <Box\n height=\"100%\"\n display=\"flex\"\n flexDirection=\"column\"\n justifyContent=\"space-between\"\n >\n {/* Header */}\n <Box>\n <Box\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n px={3.5}\n py={2.5}\n >\n <Typography id={titleId} variant=\"h2\">\n {title}\n <Badge\n badgeContent={activeFilterCount}\n color=\"secondary\"\n sx={{ ml: 1.5, mb: 0.5 }}\n />\n </Typography>\n <IconButton\n size=\"medium\"\n onClick={handleClose}\n aria-label={closeLabel}\n >\n <CloseIcon />\n </IconButton>\n </Box>\n <Divider />\n\n {/* Body */}\n <Box\n role=\"group\"\n aria-label=\"Filter options\"\n display=\"flex\"\n flexDirection=\"column\"\n gap={2}\n p={3.5}\n overflow=\"auto\"\n >\n {children}\n </Box>\n </Box>\n\n {/* Footer */}\n <Box display=\"flex\">\n <Button\n variant=\"overlay\"\n color=\"secondary\"\n fullWidth\n onClick={onReset}\n disabled={activeFilterCount === 0}\n >\n {resetLabel}\n </Button>\n <Button\n variant=\"overlay\"\n color=\"primary\"\n fullWidth\n onClick={handleClose}\n >\n {applyLabel}\n </Button>\n </Box>\n </Box>\n </Drawer>\n </>\n );\n}\n","import {\n Box,\n Collapse,\n IconButton,\n InputAdornment,\n InputBase,\n TextField,\n Theme,\n useMediaQuery,\n type TextFieldProps,\n} from '@mui/material';\nimport { CloseIcon, SearchIcon } from '@bwp-web/assets';\nimport { useEffect, useState } from 'react';\nimport {\n BIAMP_TABLE_DEBOUNCE_DELAY,\n useDebouncedCallback,\n} from './useDebouncedCallback';\n\ntype ExpandableSearchProps =\n | {\n /** When true, the search field collapses to an icon button when empty and unfocused. */\n expandable: true;\n /** Accessible label for the collapsed icon button. @default placeholder */\n expandLabel?: string;\n }\n | {\n expandable?: false;\n expandLabel?: never;\n };\n\nexport type BiampTableToolbarSearchProps = {\n /** Called with the debounced search string whenever the value changes. */\n onChange: (value: string) => void;\n /** Initial value for the search field. When this prop changes the input resets. */\n defaultValue?: string;\n /** Debounce delay in milliseconds. @default BIAMP_TABLE_DEBOUNCE_DELAY (300) */\n debounceDelay?: number;\n /** Maximum character length for the input. @default 120 */\n maxLength?: number;\n /** Maximum width of the text field. @default 280 */\n maxWidth?: number;\n /** Placeholder text. @default \"Search\" */\n placeholder?: string;\n /** Accessible label for the clear button. @default \"Clear search\" */\n clearLabel?: string;\n /** When true, renders a simplified full-width InputBase on screens below the `md` breakpoint. @default true */\n enableMobileView?: boolean;\n} & ExpandableSearchProps &\n Omit<TextFieldProps, 'onChange' | 'value' | 'defaultValue'>;\n\nconst searchFieldSx = {\n '& .MuiInputBase-root': {\n height: '36px !important',\n minHeight: '36px !important',\n },\n '& .MuiOutlinedInput-notchedOutline': {\n height: '36px !important',\n },\n} as const;\n\nexport function BiampTableToolbarSearch({\n onChange,\n defaultValue = '',\n debounceDelay = BIAMP_TABLE_DEBOUNCE_DELAY,\n maxLength = 120,\n maxWidth = 280,\n placeholder = 'Search',\n clearLabel = 'Clear search',\n expandable = false,\n expandLabel,\n enableMobileView = true,\n sx,\n ...textFieldProps\n}: BiampTableToolbarSearchProps) {\n const isMobile = useMediaQuery<Theme>((t) => t.breakpoints.down('md'));\n const [inputValue, setInputValue] = useState(defaultValue);\n const [isExpanded, setIsExpanded] = useState(false);\n const debouncedOnChange = useDebouncedCallback(onChange, debounceDelay);\n\n useEffect(() => {\n setInputValue(defaultValue);\n }, [defaultValue]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n debouncedOnChange(e.target.value);\n };\n\n const handleClear = () => {\n setInputValue('');\n debouncedOnChange('');\n };\n\n const handleBlur = () => {\n if (expandable && !inputValue) {\n setIsExpanded(false);\n }\n };\n\n const clearButton = inputValue ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={handleClear}\n aria-label={clearLabel}\n sx={{ mr: 0.5 }}\n >\n <CloseIcon variant=\"xs\" sx={{ width: 20, height: 20 }} />\n </IconButton>\n </InputAdornment>\n ) : null;\n\n const textField = (\n <TextField\n name=\"search\"\n type=\"text\"\n placeholder={placeholder}\n slotProps={{\n htmlInput: { maxLength, 'aria-label': placeholder },\n input: {\n startAdornment: (\n <InputAdornment position=\"start\" sx={{ ml: 1 }}>\n <SearchIcon\n variant=\"xs\"\n color=\"inherit\"\n sx={{ width: 16, height: 16 }}\n />\n </InputAdornment>\n ),\n endAdornment: clearButton,\n },\n }}\n fullWidth\n sx={[\n searchFieldSx,\n expandable ? { width: 170 } : { maxWidth },\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ]}\n variant=\"outlined\"\n value={inputValue}\n onChange={handleChange}\n onBlur={handleBlur}\n {...(expandable && isExpanded && !defaultValue && { autoFocus: true })}\n {...textFieldProps}\n />\n );\n\n if (isMobile && enableMobileView) {\n return (\n <Box display=\"flex\" alignItems=\"center\" width=\"100%\" pr={1} gap={1}>\n <SearchIcon sx={{ width: 16, height: 16 }} />\n <InputBase\n name=\"search\"\n type=\"text\"\n placeholder={placeholder}\n inputProps={{ maxLength, 'aria-label': 'Search' }}\n fullWidth\n value={inputValue}\n sx={{\n paddingLeft: 1,\n height: '36px !important',\n minHeight: '36px !important',\n fontSize: (t) => t.typography.body2.fontSize,\n }}\n onChange={handleChange}\n endAdornment={clearButton}\n />\n </Box>\n );\n }\n\n if (expandable) {\n return (\n <Box display=\"flex\" alignItems=\"center\" minWidth={28}>\n <IconButton\n aria-label={expandLabel ?? placeholder}\n onClick={() => setIsExpanded(true)}\n sx={{ display: isExpanded || inputValue ? 'none' : 'flex' }}\n >\n <SearchIcon\n variant=\"xs\"\n color=\"inherit\"\n sx={{ width: 16, height: 16 }}\n />\n </IconButton>\n <Collapse\n in={isExpanded || !!inputValue}\n orientation=\"horizontal\"\n unmountOnExit\n >\n {textField}\n </Collapse>\n </Box>\n );\n }\n\n return textField;\n}\n","import { useCallback, useEffect, useRef } from 'react';\n\n/** Default debounce delay (ms) shared across all BiampTable components. */\nexport const BIAMP_TABLE_DEBOUNCE_DELAY = 300;\n\n/**\n * Returns a debounced version of the given callback.\n * The debounced function delays invocation until `delay` ms after\n * the last call. The pending timer is cleared on unmount.\n */\nexport function useDebouncedCallback<Args extends unknown[]>(\n callback: (...args: Args) => void,\n delay: number = BIAMP_TABLE_DEBOUNCE_DELAY,\n): (...args: Args) => void {\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const callbackRef = useRef(callback);\n\n // Keep callback ref fresh without restarting timers.\n callbackRef.current = callback;\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current !== null) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n return useCallback(\n (...args: Args) => {\n if (timeoutRef.current !== null) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(\n () => callbackRef.current(...args),\n delay,\n );\n },\n [delay],\n );\n}\n","import {\n type ColumnDef,\n type ExpandedState,\n getCoreRowModel,\n getExpandedRowModel,\n type Row,\n type Table,\n useReactTable,\n} from '@tanstack/react-table';\nimport { useMemo } from 'react';\nimport {\n toVisibilityState,\n type ColumnVisibility,\n} from './BiampTableColumnVisibility';\nimport {\n type ServerSideOrder,\n orderToSorting,\n sortingToOrder,\n getOrderFieldMappings,\n getDefaultColumnVisibilityFromDefs,\n getDirtyColumnVisibility,\n selectedIdsToRowSelection,\n rowSelectionToSelectedIds,\n} from './serverSideTableUtils';\nimport './tanstack-meta';\n\n// Stable references — avoid re-creating on every render.\nconst coreRowModel = getCoreRowModel();\nconst expandedRowModel = getExpandedRowModel();\nconst defaultGetRowId = (row: Record<string, string>) => row.id;\n\nexport type UseBiampServerSideTableOptions<TData, F extends string = string> = {\n /** Row data array. */\n data: TData[];\n /** TanStack column definitions. Use `meta.orderField` to map columns to server-side order fields. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n columns: ColumnDef<TData, any>[];\n /** Extracts a unique ID from each row. @default `(row) => (row as any).id` */\n getRowId?: (row: TData) => string;\n\n // ── Sorting ──────────────────────────────────────────────────────\n /** Current server-side order. `undefined` means no sorting. */\n order?: ServerSideOrder<F>;\n /** Called when the user changes sorting. `undefined` means sorting was cleared. */\n onOrderChange?: (order?: ServerSideOrder<F>) => void;\n\n // ── Pagination ───────────────────────────────────────────────────\n /** Zero-based page index. */\n page?: number;\n /** Number of rows per page. */\n rowsPerPage?: number;\n /** Called when the user changes page. */\n onPageChange?: (page: number) => void;\n /** Total row count from the server (for pagination display). */\n rowCount?: number;\n\n // ── Column visibility ────────────────────────────────────────────\n /** Current column visibility overrides. Merged with defaults from `meta.defaultVisible`. */\n columnVisibility?: ColumnVisibility;\n /** Called with only the entries that differ from defaults (for URL persistence). */\n onColumnVisibilityChange?: (visibility: ColumnVisibility) => void;\n\n // ── Row selection ────────────────────────────────────────────────\n /** Currently selected row IDs. */\n selectedRowIds?: string[];\n /** Called when selection changes. */\n onSelectedRowIdsChange?: (ids: string[]) => void;\n /** Enable row selection. Pass `true` for all rows, or a predicate. */\n enableRowSelection?: boolean | ((row: Row<TData>) => boolean);\n\n // ── Expanding ──────────────────────────────────────────────────\n /** Current expanded state. `{}` means nothing expanded; `true` expands all. */\n expanded?: ExpandedState;\n /** Called when the user expands/collapses rows. */\n onExpandedChange?: (expanded: ExpandedState) => void;\n /** Returns child rows for a given row (enables sub-row expanding). */\n getSubRows?: (row: TData) => TData[] | undefined;\n};\n\n/**\n * Wraps `useReactTable` with the standard server-side configuration:\n * manual sorting, manual pagination, column visibility with dirty-tracking,\n * and optional row selection with ID-based state.\n *\n * Eliminates ~40 lines of boilerplate per table implementation.\n */\nexport function useBiampServerSideTable<TData, F extends string = string>({\n data,\n columns,\n getRowId = defaultGetRowId as (row: TData) => string,\n order,\n onOrderChange,\n page,\n rowsPerPage,\n onPageChange,\n rowCount,\n columnVisibility,\n onColumnVisibilityChange,\n selectedRowIds,\n onSelectedRowIdsChange,\n enableRowSelection,\n expanded,\n onExpandedChange,\n getSubRows,\n}: UseBiampServerSideTableOptions<TData, F>): Table<TData> {\n // ── Derived state (memoized) ─────────────────────────────────────\n\n const { defaultColumnVisibility, columnIdToField, fieldToColumnId } = useMemo(\n () => ({\n defaultColumnVisibility: getDefaultColumnVisibilityFromDefs(columns),\n ...getOrderFieldMappings<F>(columns),\n }),\n [columns],\n );\n\n const sorting = useMemo(\n () => orderToSorting(order, fieldToColumnId),\n [order, fieldToColumnId],\n );\n\n const hasPagination = page != null && rowsPerPage != null;\n const pagination = useMemo(\n () =>\n hasPagination ? { pageIndex: page!, pageSize: rowsPerPage! } : undefined,\n [hasPagination, page, rowsPerPage],\n );\n\n const hasSelection = selectedRowIds != null;\n const rowSelection = useMemo(\n () =>\n hasSelection ? selectedIdsToRowSelection(selectedRowIds!) : undefined,\n [hasSelection, selectedRowIds],\n );\n\n const mergedVisibility = useMemo(\n () =>\n toVisibilityState({\n ...defaultColumnVisibility,\n ...columnVisibility,\n }),\n [defaultColumnVisibility, columnVisibility],\n );\n\n // ── Table instance ───────────────────────────────────────────────\n\n return useReactTable({\n data,\n columns,\n getCoreRowModel: coreRowModel,\n getRowId,\n\n // Sorting — always manual for server-side tables\n manualSorting: true,\n sortDescFirst: false,\n state: {\n sorting,\n ...(pagination && { pagination }),\n columnVisibility: mergedVisibility,\n ...(rowSelection && { rowSelection }),\n ...(expanded != null && { expanded }),\n },\n onSortingChange: onOrderChange\n ? (updater) => {\n const next =\n typeof updater === 'function' ? updater(sorting) : updater;\n onOrderChange(sortingToOrder(next, columnIdToField));\n }\n : undefined,\n\n // Pagination — only when page/rowsPerPage are provided\n ...(hasPagination && {\n manualPagination: true,\n rowCount: rowCount ?? 0,\n onPaginationChange: onPageChange\n ? (\n updater: Parameters<\n NonNullable<\n Parameters<typeof useReactTable>[0]['onPaginationChange']\n >\n >[0],\n ) => {\n const next =\n typeof updater === 'function' ? updater(pagination!) : updater;\n onPageChange(next.pageIndex);\n }\n : undefined,\n }),\n\n // Column visibility\n onColumnVisibilityChange: onColumnVisibilityChange\n ? (updater) => {\n const next =\n typeof updater === 'function' ? updater(mergedVisibility) : updater;\n onColumnVisibilityChange(\n getDirtyColumnVisibility(next, defaultColumnVisibility),\n );\n }\n : undefined,\n\n // Row selection — only when selectedRowIds is provided\n ...(hasSelection && {\n enableRowSelection: enableRowSelection ?? true,\n onRowSelectionChange: onSelectedRowIdsChange\n ? (\n updater: Parameters<\n NonNullable<\n Parameters<typeof useReactTable>[0]['onRowSelectionChange']\n >\n >[0],\n ) => {\n const next =\n typeof updater === 'function' ? updater(rowSelection!) : updater;\n onSelectedRowIdsChange(rowSelectionToSelectedIds(next));\n }\n : undefined,\n }),\n\n // Expanding — only when expanded state is provided\n ...(expanded != null && {\n // Only attach getExpandedRowModel when getSubRows is provided.\n // Without it, the expanded model recomputes on every state change\n // (including selection), adding unnecessary overhead.\n ...(getSubRows && { getExpandedRowModel: expandedRowModel, getSubRows }),\n onExpandedChange: onExpandedChange\n ? (\n updater: Parameters<\n NonNullable<\n Parameters<typeof useReactTable>[0]['onExpandedChange']\n >\n >[0],\n ) => {\n const next =\n typeof updater === 'function' ? updater(expanded) : updater;\n onExpandedChange(next);\n }\n : undefined,\n }),\n });\n}\n","import type { RowSelectionState, SortingState } from '@tanstack/react-table';\n\n/** A single-field server-side order, matching typical GraphQL order input types. */\nexport type ServerSideOrder<F extends string> = {\n field: F;\n desc?: boolean;\n};\n\n/**\n * Convert a server-side order object to TanStack SortingState.\n *\n * @param order - `{ field, desc? }` from URL params / GraphQL\n * @param fieldToColumnId - optional map when column IDs differ from order field names\n */\nexport function orderToSorting<F extends string>(\n order: ServerSideOrder<F> | undefined,\n fieldToColumnId?: Partial<Record<F, string>>,\n): SortingState {\n if (!order) return [];\n const id = fieldToColumnId?.[order.field] ?? order.field;\n return [{ id, desc: order.desc ?? false }];\n}\n\n/**\n * Convert TanStack SortingState back to a server-side order object.\n *\n * @param sorting - TanStack sorting state\n * @param columnIdToField - optional map when column IDs differ from order field names\n */\nexport function sortingToOrder<F extends string>(\n sorting: SortingState,\n columnIdToField?: Record<string, F>,\n): ServerSideOrder<F> | undefined {\n if (sorting.length === 0) return undefined;\n const { id, desc } = sorting[0];\n const field = (columnIdToField?.[id] ?? id) as F;\n return { field, desc };\n}\n\n/**\n * Convert an array of selected row IDs to TanStack RowSelectionState.\n */\nexport function selectedIdsToRowSelection(ids: string[]): RowSelectionState {\n const state: RowSelectionState = {};\n for (const id of ids) {\n state[id] = true;\n }\n return state;\n}\n\n/**\n * Convert TanStack RowSelectionState to an array of selected row IDs.\n */\nexport function rowSelectionToSelectedIds(\n selection: RowSelectionState,\n): string[] {\n return Object.keys(selection).filter((key) => selection[key]);\n}\n\n/**\n * Build bidirectional mappings between TanStack column IDs and server-side order\n * field enum values from column definitions that carry `meta.orderField`.\n */\nexport function getOrderFieldMappings<F extends string = string>(\n columns: { id?: string; meta?: { orderField?: string } }[],\n): {\n columnIdToField: Record<string, F>;\n fieldToColumnId: Partial<Record<F, string>>;\n} {\n const columnIdToField: Record<string, F> = {};\n const fieldToColumnId: Partial<Record<F, string>> = {};\n for (const col of columns) {\n const orderField = col.meta?.orderField as F | undefined;\n if (col.id && orderField) {\n columnIdToField[col.id] = orderField;\n fieldToColumnId[orderField] = col.id;\n }\n }\n return { columnIdToField, fieldToColumnId };\n}\n\n/**\n * Derives default column visibility from column definitions' `meta.defaultVisible`.\n * Columns without `defaultVisible` are omitted (treated as visible by TanStack).\n */\nexport function getDefaultColumnVisibilityFromDefs(\n columns: { id?: string; meta?: { defaultVisible?: boolean } }[],\n): Record<string, boolean> {\n const defaults: Record<string, boolean> = {};\n for (const col of columns) {\n if (col.id != null && col.meta?.defaultVisible !== undefined) {\n defaults[col.id] = col.meta.defaultVisible;\n }\n }\n return defaults;\n}\n\n/**\n * Returns only the entries in `visibility` that differ from `defaults`.\n * Columns not present in `defaults` are treated as visible (`true`) by default.\n * Use this to strip default-matching entries before persisting to URL params.\n */\nexport function getDirtyColumnVisibility(\n visibility: Record<string, boolean>,\n defaults: Record<string, boolean>,\n): Record<string, boolean> {\n const dirty: Record<string, boolean> = {};\n for (const [id, visible] of Object.entries(visibility)) {\n if (visible !== (defaults[id] ?? true)) {\n dirty[id] = visible;\n }\n }\n return dirty;\n}\n","export interface ExportColumn<TData> {\n header: string;\n accessor: (row: TData) => unknown;\n}\n\n/**\n * Converts an array of rows and column definitions to a CSV string\n * and triggers a browser download.\n */\nexport function exportToCsv<TData>(\n rows: TData[],\n columns: ExportColumn<TData>[],\n filename: string = 'export',\n): void {\n const csvContent = buildCsvString(rows, columns);\n downloadCsv(csvContent, filename);\n}\n\n/**\n * Builds a CSV string from rows and columns.\n * Handles quoting for values that contain commas, quotes, or newlines.\n */\nexport function buildCsvString<TData>(\n rows: TData[],\n columns: ExportColumn<TData>[],\n): string {\n const header = columns.map((col) => escapeCsvField(col.header)).join(',');\n const dataRows = rows.map((row) =>\n columns\n .map((col) => escapeCsvField(formatCsvValue(col.accessor(row))))\n .join(','),\n );\n return [header, ...dataRows].join('\\n');\n}\n\nfunction escapeCsvField(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nfunction formatCsvValue(value: unknown): string {\n if (value == null) return '';\n if (value instanceof Date) return value.toISOString();\n return String(value);\n}\n\nfunction downloadCsv(csvContent: string, filename: string): void {\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.setAttribute('href', url);\n link.setAttribute('download', `${filename}.csv`);\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n","import React from 'react';\nimport {\n Box,\n BoxProps,\n Collapse,\n Typography,\n TypographyProps,\n type AlertColor,\n} from '@mui/material';\nimport {\n ErrorStatusIcon,\n InfoStatusIcon,\n SuccessStatusIcon,\n WarningStatusIcon,\n} from '@bwp-web/assets';\n\nexport type BiampBannerProps = {\n show: boolean;\n children: React.ReactNode;\n severity: AlertColor;\n};\n\n/**\n * A full-width notification banner that slides in/out with a Collapse animation.\n * Uses MUI's AlertColor severity to set background and text colors from the theme.\n * Compose with `BiampBannerIcon`, `BiampBannerContent`, and `BiampBannerActions`.\n */\nexport function BiampBanner({ show, children, severity }: BiampBannerProps) {\n return (\n <Collapse in={show} unmountOnExit component=\"aside\">\n <Box\n bgcolor={({ palette }) => palette.background[severity]}\n display=\"flex\"\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={1}\n px={{ xs: 2, sm: 2.5 }}\n minHeight={48}\n sx={{\n borderBottom: ({ palette }) =>\n `0.6px solid ${palette[severity].main}`,\n }}\n >\n {children}\n </Box>\n </Collapse>\n );\n}\n\n// NOTE: we're using the same icon mapping as the `Alert` component.\nconst iconMapping: Record<AlertColor, React.ReactNode> = {\n error: <ErrorStatusIcon color=\"error\" sx={{ width: 14, height: 14 }} />,\n warning: <WarningStatusIcon color=\"warning\" sx={{ width: 16, height: 14 }} />,\n success: <SuccessStatusIcon color=\"success\" sx={{ width: 14, height: 14 }} />,\n info: <InfoStatusIcon color=\"info\" sx={{ width: 14, height: 14 }} />,\n};\n\nexport type BiampBannerIconProps = {\n severity?: AlertColor;\n children?: React.ReactNode;\n};\n\n/**\n * Icon slot for `BiampBanner`. Pass a `severity` to render the matching\n * default icon, or pass `children` to render a custom icon.\n */\nexport function BiampBannerIcon({ severity, children }: BiampBannerIconProps) {\n return <>{severity ? iconMapping[severity] : children}</>;\n}\n\n/**\n * Content slot for `BiampBanner`. Text is centered by default.\n */\nexport function BiampBannerContent({ children, ...props }: TypographyProps) {\n return (\n <Typography textAlign=\"center\" variant=\"h3\" {...props}>\n {children}\n </Typography>\n );\n}\n\n/**\n * Actions slot for `BiampBanner`. Renders children in a horizontal flex row\n * with 8px gap, aligned to the trailing edge of the banner.\n */\nexport function BiampBannerActions({ children, ...props }: BoxProps) {\n return (\n <Box display=\"flex\" gap={1} alignItems=\"center\" {...props}>\n {children}\n </Box>\n );\n}\n","import { Button, ButtonProps, useTheme } from '@mui/material';\nimport { alpha } from '@mui/material/styles';\n\ntype Props = ButtonProps & {\n children: React.ReactNode;\n active?: boolean;\n small?: boolean;\n component?: React.ElementType;\n};\n\nexport function SegmentedButton({\n children,\n active,\n small,\n sx,\n ...props\n}: Props) {\n const theme = useTheme();\n const isDarkMode = theme.palette.mode === 'dark';\n const backgroundColor = active\n ? isDarkMode\n ? theme.palette.grey[900]\n : theme.palette.common.white\n : 'transparent';\n const textColor = active\n ? theme.palette.text.primary\n : theme.palette.text.secondary;\n const border = active ? 'solid' : undefined;\n return (\n <Button\n sx={{\n backgroundColor,\n color: textColor,\n borderRadius: '4px',\n border,\n borderColor: 'divider',\n lineHeight: 1.5,\n px: 1.5,\n py: 0,\n height: small ? '22px' : '26px',\n ...(small && { fontSize: '12px', letterSpacing: '-0.24px' }),\n boxShadow: active\n ? `0 1px 2px 0 ${alpha(theme.palette.common.black, 0.05)} !important`\n : 'none !important',\n ...sx,\n }}\n {...props}\n >\n {children}\n </Button>\n );\n}\n","import { Stack, StackProps, useTheme } from '@mui/material';\n\ntype Props = StackProps & {\n children: React.ReactNode[];\n component?: React.ElementType;\n};\n\nexport function SegmentedButtonGroup({ children, sx, ...props }: Props) {\n const theme = useTheme();\n const isDarkMode = theme.palette.mode === 'dark';\n return (\n <Stack\n direction=\"row\"\n p={0.5}\n borderRadius=\"6px\"\n gap={1}\n sx={{\n backgroundColor: isDarkMode\n ? theme.palette.grey[800]\n : theme.palette.grey[100],\n ...sx,\n }}\n {...props}\n >\n {children}\n </Stack>\n );\n}\n","import React, { createContext, forwardRef, useContext } from 'react';\nimport {\n Autocomplete,\n AutocompleteProps,\n Box,\n Chip,\n InputAdornment,\n Paper,\n PaperProps,\n TextField,\n Typography,\n} from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { KeyArrowDownIcon, KeyArrowUpIcon, SearchIcon } from '@bwp-web/assets';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface BiampGlobalSearchOption {\n icon?: React.ReactNode;\n title: string;\n subtitle?: string;\n associatedItems?: { label: string }[];\n endIcon?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport type BiampGlobalSearchProps = Omit<\n AutocompleteProps<BiampGlobalSearchOption, false, false, true>,\n 'renderInput' | 'renderOption' | 'PaperComponent'\n> & {\n placeholder?: string;\n noResultsText?: string;\n inputSx?: SxProps<Theme>;\n clearOnSelect?: boolean;\n};\n\n// ---------------------------------------------------------------------------\n// SearchContext\n// ---------------------------------------------------------------------------\n\nconst SearchContext = createContext<{\n hasOptions: boolean;\n loading: boolean;\n noResultsText: string;\n query: string;\n}>({\n hasOptions: true,\n loading: false,\n noResultsText: 'No results found',\n query: '',\n});\n\n// ---------------------------------------------------------------------------\n// KeyCap — keyboard key visual wrapper\n// ---------------------------------------------------------------------------\n\nfunction KeyCap({\n children,\n variant = 'icon',\n}: {\n children: React.ReactNode;\n variant?: 'icon' | 'text';\n}) {\n return (\n <Box\n component=\"kbd\"\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: 20,\n height: 20,\n px: variant === 'text' ? '8px' : 0.5,\n borderRadius: '4px',\n bgcolor: 'grey.100',\n color: 'grey.400',\n fontFamily: 'inherit',\n fontSize: 'caption.fontSize',\n fontStyle: 'normal',\n fontWeight: (theme: Theme) => theme.typography.fontWeightMedium,\n border: 'none',\n '& svg': { width: 12, height: 12 },\n }}\n >\n {children}\n </Box>\n );\n}\n\n// ---------------------------------------------------------------------------\n// BiampGlobalSearchPaper\n// ---------------------------------------------------------------------------\n\nconst BiampGlobalSearchPaper = forwardRef<HTMLDivElement, PaperProps>(\n function BiampGlobalSearchPaper({ children, ...props }, ref) {\n const { hasOptions, loading, noResultsText } = useContext(SearchContext);\n\n return (\n <Paper ref={ref} {...props}>\n {hasOptions || loading ? (\n children\n ) : (\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ px: 2, py: 1.5 }}\n >\n {noResultsText}\n </Typography>\n )}\n {hasOptions && (\n <Box\n sx={{\n borderTop: ({ palette }) =>\n `0.6px solid ${palette.dividers.secondary}`,\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n p: 1.5,\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <KeyCap>\n <KeyArrowDownIcon />\n </KeyCap>\n <KeyCap>\n <KeyArrowUpIcon />\n </KeyCap>\n </Box>\n <Typography\n variant=\"caption\"\n fontWeight={(theme) => theme.typography.fontWeightMedium}\n color=\"text.secondary\"\n >\n Select\n </Typography>\n </Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <KeyCap variant=\"text\">Enter</KeyCap>\n <Typography\n variant=\"caption\"\n fontWeight={(theme) => theme.typography.fontWeightMedium}\n color=\"text.secondary\"\n >\n Open\n </Typography>\n </Box>\n </Box>\n )}\n </Paper>\n );\n },\n);\n\n// ---------------------------------------------------------------------------\n// HighlightText\n// ---------------------------------------------------------------------------\n\nfunction HighlightText({ text, query }: { text: string; query: string }) {\n if (!query) return <>{text}</>;\n\n const index = text.toLowerCase().indexOf(query.toLowerCase());\n if (index === -1) return <>{text}</>;\n\n const before = text.slice(0, index);\n const match = text.slice(index, index + query.length);\n const after = text.slice(index + query.length);\n\n return (\n <>\n {before}\n <Box\n component=\"span\"\n sx={{\n bgcolor: 'background.info',\n borderRadius: '4px',\n color: 'info.main',\n paddingTop: '2px',\n paddingBottom: '2px',\n }}\n >\n {match}\n </Box>\n {after}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// BiampGlobalSearchListItem\n// ---------------------------------------------------------------------------\n\nfunction BiampGlobalSearchListItem({\n option,\n props: liProps,\n}: {\n option: BiampGlobalSearchOption;\n props: React.HTMLAttributes<HTMLLIElement> & { key?: React.Key };\n}) {\n const { query } = useContext(SearchContext);\n const { key, ...rest } = liProps;\n const maxChips = 3;\n const chips = option.associatedItems?.slice(0, maxChips) ?? [];\n const overflow = (option.associatedItems?.length ?? 0) - maxChips;\n\n return (\n <li\n key={key}\n {...rest}\n style={{\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n gap: 8,\n ...rest.style,\n }}\n >\n {option.icon && (\n <Box\n sx={{\n width: 24,\n height: 24,\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {option.icon}\n </Box>\n )}\n\n <Typography variant=\"body2\" noWrap sx={{ flexShrink: 0 }}>\n <HighlightText text={option.title} query={query} />\n </Typography>\n\n {option.subtitle && (\n <Typography\n className=\"hoverContent\"\n variant=\"body2\"\n color=\"text.secondary\"\n noWrap\n sx={{ flexShrink: 1, minWidth: 0, display: 'none' }}\n >\n {option.subtitle}\n </Typography>\n )}\n\n {chips.length > 0 && (\n <Box\n className=\"hoverContent\"\n sx={{\n display: 'none',\n alignItems: 'center',\n gap: 1,\n ml: 'auto',\n flexShrink: 0,\n px: 2,\n }}\n >\n {chips.map((item, i) => (\n <Chip\n key={i}\n size=\"small\"\n label={item.label}\n sx={{\n bgcolor: 'background.info',\n borderRadius: '2px',\n borderColor: ({ palette }: Theme) => palette.dividers.primary,\n padding: '0px 6px',\n '& .MuiChip-label': {\n typography: 'caption',\n fontWeight: (theme: Theme) =>\n theme.typography.fontWeightMedium,\n },\n }}\n />\n ))}\n {overflow > 0 && (\n <Chip\n size=\"small\"\n label={`+${overflow}`}\n sx={{\n bgcolor: 'background.info',\n borderRadius: '2px',\n borderColor: ({ palette }: Theme) => palette.dividers.primary,\n padding: '0px 6px',\n '& .MuiChip-label': {\n typography: 'caption',\n fontWeight: (theme: Theme) =>\n theme.typography.fontWeightMedium,\n },\n }}\n />\n )}\n </Box>\n )}\n\n {option.endIcon && (\n <Box\n className=\"endIcon\"\n sx={{\n width: 48,\n height: 48,\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n ml: chips.length > 0 ? 0 : 'auto',\n visibility: 'hidden',\n '& .MuiSvgIcon-root': { fontSize: 14 },\n }}\n >\n {option.endIcon}\n </Box>\n )}\n </li>\n );\n}\n\n// ---------------------------------------------------------------------------\n// BiampGlobalSearch\n// ---------------------------------------------------------------------------\n\nexport function BiampGlobalSearch({\n placeholder = 'Search...',\n noResultsText = 'No results found',\n options = [],\n inputValue: inputValueProp,\n loading = false,\n clearOnSelect = true,\n onChange,\n onInputChange,\n ...props\n}: BiampGlobalSearchProps) {\n const hasOptions = options.length > 0;\n\n const handleChange: typeof onChange = (event, value, reason, details) => {\n if (value && typeof value !== 'string' && value.onClick) {\n value.onClick();\n }\n onChange?.(event, value, reason, details);\n };\n\n const handleInputChange: typeof onInputChange = (event, value, reason) => {\n if (clearOnSelect && (reason === 'selectOption' || reason === 'reset')) {\n onInputChange?.(event, '', reason);\n return;\n }\n onInputChange?.(event, value, reason);\n };\n\n return (\n <SearchContext.Provider\n value={{\n hasOptions,\n loading,\n noResultsText,\n query: inputValueProp ?? '',\n }}\n >\n <Autocomplete<BiampGlobalSearchOption, false, false, true>\n options={options}\n inputValue={inputValueProp}\n loading={loading}\n onChange={handleChange}\n onInputChange={handleInputChange}\n loadingText={\n <Typography variant=\"body2\" color=\"text.secondary\">\n Loading…\n </Typography>\n }\n freeSolo\n filterOptions={(x) => x}\n getOptionLabel={(option) =>\n typeof option === 'string' ? option : option.title\n }\n noOptionsText={noResultsText}\n slots={{ paper: BiampGlobalSearchPaper }}\n slotProps={{\n listbox: {\n sx: {\n '& .MuiAutocomplete-option': {\n paddingRight: '0px !important',\n },\n '& li:hover .hoverContent, & li.Mui-focused .hoverContent': {\n display: 'flex',\n },\n '& li:hover p.hoverContent, & li.Mui-focused p.hoverContent': {\n display: 'block',\n },\n '& li:hover .endIcon, & li.Mui-focused .endIcon': {\n visibility: 'visible',\n },\n },\n },\n }}\n renderInput={(params) => (\n <TextField\n {...params}\n placeholder={placeholder}\n fullWidth\n sx={{\n '& .MuiOutlinedInput-root': { padding: '0px !important' },\n '& .MuiInputBase-input': { paddingLeft: '8px !important' },\n }}\n slotProps={{\n input: {\n ...params.InputProps,\n startAdornment: (\n <>\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n {params.InputProps.startAdornment}\n </>\n ),\n },\n }}\n />\n )}\n renderOption={(optionProps, option) => (\n <BiampGlobalSearchListItem\n key={optionProps.key}\n option={option as BiampGlobalSearchOption}\n props={optionProps}\n />\n )}\n {...props}\n />\n </SearchContext.Provider>\n );\n}\n"],"mappings":";AACA,SAAS,aAAyB;AAa9B;AAFG,SAAS,aAAa,EAAE,UAAU,IAAI,GAAG,MAAM,GAAsB;AAC1E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAQ;AAAA,MACR,YAAW;AAAA,MACX,IAAI;AAAA,QACF,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,cAAc;AAAA,QACd,UAAU;AAAA,QACV,oBAAoB;AAAA,QACpB,iBAAiB,CAAC,EAAE,QAAQ,MAC1B,QAAQ,SAAS,SAAS,QAAQ,KAAK,GAAG,IAAI,QAAQ,OAAO;AAAA,QAC/D,GAAG;AAAA,MACL;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;AClCA;AAAA,EACE;AAAA,EACA;AAAA,EAEA,SAAAA;AAAA,OAEK;AACP,SAAS,qBAAqB;AAe1B,SACE,OAAAC,MADF;AAPG,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAsB;AACpB,SACE,qBAACD,QAAA,EAAM,OAAM,QAAO,QAAO,QAAO,IAAI,EAAE,GAAG,GAAG,GAAI,GAAG,OACnD;AAAA,oBAAAC,KAACD,QAAA,EAAM,QAAO,QAAQ,UAAS;AAAA,IAC9B,kBACC,gBAAAC,KAAC,iBAAc,IAAI,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAAG;AAAA,KAE1D;AAEJ;AAMO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAyB;AACvB,SACE,gBAAAA,KAACD,QAAA,EAAM,QAAO,QAAO,IAAI,EAAE,KAAK,OAAO,GAAG,GAAG,GAAI,GAAG,OACjD,UACH;AAEJ;AAQO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA0B;AACxB,QAAM,wBAAwB,gBAAgB;AAC9C,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,gBAAc;AAAA,MACd,eAAa;AAAA,MACb,IAAI;AAAA,QACF,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAW;AAAA,QACX,WAAW;AAAA,QACX,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,GAAG;AAAA,MACL;AAAA,MACC,GAAG;AAAA,MAEH,qBAAW,wBAAwB;AAAA;AAAA,EACtC;AAEJ;AAMO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA+B;AAC7B,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA,QACF,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAW;AAAA,QACX,WAAW;AAAA,QACX,cAAc;AAAA,QACd,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,QAAQ,CAAC,EAAE,QAAQ,MAAM,eAAe,QAAQ,OAAO;AAAA,QACvD,GAAG;AAAA,MACL;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;AC/GA;AAAA,EACE;AAAA,EACA,OAAAC;AAAA,EAEA;AAAA,EACA,kBAAAC;AAAA,EAEA;AAAA,EAEA,SAAAC;AAAA,EAEA;AAAA,EAEA;AAAA,OACK;AAEP,SAAS,cAAc,kBAAkB;AAQrC,gBAAAC,MAiDE,QAAAC,aAjDF;AAFG,SAAS,YAAY,EAAE,UAAU,IAAI,GAAG,MAAM,GAAqB;AACxE,SACE,gBAAAD;AAAA,IAACD;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,YAAW;AAAA,MACX,IAAI,EAAE,IAAI,KAAK,IAAI,KAAK,GAAG,GAAG;AAAA,MAC7B,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAQO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA0B;AACxB,SACE,gBAAAE;AAAA,IAACJ;AAAA,IAAA;AAAA,MACC,IAAI,EAAE,IAAI,GAAG,SAAS,QAAQ,YAAY,UAAU,KAAK,QAAQ,GAAG,GAAG;AAAA,MACtE,GAAG;AAAA,MAEH;AAAA,eACC,gBAAAG;AAAA,UAACH;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,YAClB;AAAA,YAEC;AAAA;AAAA,QACH,IAEA,gBAAAG;AAAA,UAACH;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,KAAK;AAAA,YACL,KAAI;AAAA,YACJ,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG;AAAA;AAAA,QAC9B;AAAA,QAEF,gBAAAI,MAACF,QAAA,EAAM,WAAU,OAAM,KAAK,KACzB;AAAA,mBAAS,gBAAAC,KAAC,cAAW,SAAQ,MAAM,iBAAM;AAAA,UACzC,YACC,gBAAAA,KAAC,cAAW,SAAQ,MAAK,OAAM,kBAC5B,oBACH;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAIO,SAAS,kBAAkB,EAAE,IAAI,GAAG,MAAM,GAA2B;AAC1E,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,aAAY;AAAA,MACZ,WAAS;AAAA,MACT,IAAI;AAAA,QACF,IAAI;AAAA,QACJ,4BAA4B;AAAA,UAC1B,QAAQ;AAAA,UACR,WAAW;AAAA,QACb;AAAA,QACA,6BAA6B;AAAA,UAC3B,QAAQ;AAAA,QACV;AAAA,QACA,sCAAsC;AAAA,UACpC,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,WAAW;AAAA,QACb;AAAA,QACA,GAAG;AAAA,MACL;AAAA,MACA,WAAW;AAAA,QACT,OAAO;AAAA,UACL,gBACE,gBAAAA,KAAC,kBAAe,UAAS,SACvB,0BAAAA,KAAC,cAAW,GACd;AAAA,QAEJ;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAMO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4B;AAC1B,SACE,gBAAAA;AAAA,IAACH;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,IAAI;AAAA,QACJ,KAAK;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,GAAG;AAAA,MACL;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAMO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA+B;AAC7B,SACE,gBAAAG;AAAA,IAACH;AAAA,IAAA;AAAA,MACC,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,KAAK,GAAG,GAAG;AAAA,MAC5D,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAQO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA2B;AACzB,QAAM,wBAAwB,gBAAgB;AAC9C,SACE,gBAAAG;AAAA,IAACF;AAAA,IAAA;AAAA,MACC;AAAA,MACA,gBAAc;AAAA,MACd,eAAa;AAAA,MACb,IAAI;AAAA,QACF,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAW;AAAA,QACX,WAAW;AAAA,QACX,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,GAAG;AAAA,MACL;AAAA,MACC,GAAG;AAAA,MAEH,qBAAW,wBAAwB;AAAA;AAAA,EACtC;AAEJ;AAMO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAyB;AACvB,SACE,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,cAAc,EAAE,UAAU,UAAU,YAAY,OAAO;AAAA,MACvD,IAAI,EAAE,GAAG,GAAG;AAAA,MACZ,iBAAiB,EAAE,UAAU,IAAI,YAAY,IAAI;AAAA,MACjD,WAAW;AAAA,QACT,OAAO;AAAA,UACL,IAAI;AAAA,YACF,cAAc;AAAA,YACd,iBAAiB;AAAA,YACjB,QAAQ,CAAC,EAAE,QAAQ,MAAM,eAAe,QAAQ,OAAO;AAAA,YACvD,WAAW,CAAC,EAAE,QAAQ,MACpB,oBAAoB,MAAM,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAMO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,SACE,gBAAAA;AAAA,IAACH;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,GAAG;AAAA,QACH,SAAS;AAAA,QACT,UAAU;AAAA,QACV,KAAK;AAAA,QACL,UAAU;AAAA,QACV,cAAc;AAAA,QACd,iBAAiB,CAAC,EAAE,QAAQ,MAC1B,QAAQ,SAAS,SAAS,QAAQ,KAAK,GAAG,IAAI,QAAQ,OAAO;AAAA,QAC/D,GAAG;AAAA,MACL;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;AAOO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4B;AAC1B,SACE,gBAAAI;AAAA,IAACJ;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,KAAK;AAAA,QACL,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,UAAU;AAAA,UACR,iBAAiB,CAAC,EAAE,QAAQ,MAAM,MAAM,QAAQ,KAAK,MAAM,GAAG;AAAA,UAC9D,aAAa,CAAC,EAAE,QAAQ,MAAM,QAAQ,KAAK;AAAA,QAC7C;AAAA,QACA,GAAG;AAAA,MACL;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,wBAAAG;AAAA,UAACH;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,IAAI;AAAA,cACJ,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,YAClB;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,QACA,gBAAAG;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,YAAY;AAAA,YACZ,IAAI;AAAA,cACF,WAAW;AAAA,cACX,UAAU;AAAA,cACV,cAAc;AAAA,cACd,YAAY;AAAA,cACZ,UAAU;AAAA,YACZ;AAAA,YAEC;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EACF;AAEJ;AAOO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA4B;AAC1B,SACE,gBAAAA;AAAA,IAACF;AAAA,IAAA;AAAA,MACC;AAAA,MACA,gBAAc;AAAA,MACd,eAAa;AAAA,MACb,IAAI;AAAA,QACF,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAW;AAAA,QACX,WAAW;AAAA,QACX,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,YAAY;AAAA,QACZ,GAAG;AAAA,MACL;AAAA,MACC,GAAG;AAAA,MAEJ,0BAAAE;AAAA,QAACH;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,KAAK;AAAA,UACL,KAAK;AAAA,UACL,IAAI;AAAA,YACF,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,QAAQ,CAAC,EAAE,QAAQ,MACjB,8CAA8C,MAAM,QAAQ,WAAW,OAAO,IAAI,CAAC;AAAA,UACvF;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;;;ACjXA,SAAS,SAAAK,cAAyB;AA4B5B,iBAAAC,aAAA;AAnBC,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqB;AACnB,SACE,gBAAAA;AAAA,IAACD;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,QAAO;AAAA,MACP,IAAI;AAAA,QACF,iBAAiB,CAAC,EAAE,QAAQ,MAC1B,QAAQ,SAAS,SAAS,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG;AAAA,QAChE,GAAG;AAAA,MACL;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,QACD,gBAAAC;AAAA,UAACD;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAM;AAAA,YACN,WAAW;AAAA,YACX,KAAK,EAAE,IAAI,KAAK,IAAI,IAAI;AAAA,YACxB,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI;AAAA,YACvB,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI;AAAA,YACvB,IAAI,EAAE,IAAI,SAAS,IAAI,KAAK,IAAI,SAAS,IAAI,IAAI;AAAA,YAEhD;AAAA;AAAA,cACA;AAAA;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EACF;AAEJ;;;AC1CA;AAAA,EACE,OAAAE;AAAA,EAEA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAwC;AACjD,OAAOC,UAAyB,UAAAC,eAAc;;;ACrB9C,SAAS,qBAAqB;;;ACA9B,SAAS,SAAAC,QAAwB,cAAAC,mBAAkB;AACnD,SAAS,oBAA8C;AAqBnD,SAKE,OAAAC,MALF,QAAAC,aAAA;AARG,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAiC;AAC/B,SACE,gBAAAA,MAACH,QAAA,EAAM,YAAW,UAAS,KAAK,KAAM,GAAG,YACtC;AAAA,iBAAa,MAAM;AAAA,MAClB,eAAe;AAAA,MACf,IAAI,EAAE,OAAO,IAAI,QAAQ,IAAI,GAAG,KAAK,MAAM,GAAG;AAAA,IAChD,CAAC;AAAA,IACD,gBAAAE,KAACD,aAAA,EAAW,SAAQ,MAAM,iBAAM;AAAA,IAC/B,eAAe,gBAAAC,KAACD,aAAA,EAAW,SAAQ,SAAS,uBAAY;AAAA,IACxD;AAAA,KACH;AAEJ;;;ADvBS,gBAAAG,YAAA;AADF,SAAS,qBAAqB;AAAA,EACnC,OAAO,gBAAAA,KAAC,iBAAc;AAAA,EACtB,QAAQ;AAAA,EACR,GAAG;AACL,GAA8B;AAC5B,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL;AAAA,MACA;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;;;AErBA,SAAS,+BAA+B;AAS/B,gBAAAC,YAAA;AADF,SAAS,qBAAqB;AAAA,EACnC,OAAO,gBAAAA,KAAC,2BAAwB;AAAA,EAChC,QAAQ;AAAA,EACR,GAAG;AACL,GAA8B;AAC5B,SACE,gBAAAA,KAAC,2BAAwB,MAAK,SAAQ,MAAY,OAAe,GAAG,MAAM;AAE9E;;;AChBA,SAAS,OAAAC,MAAK,eAAe;AAC7B,SAAgB,aAAa,QAAQ,gBAAgB;AAmC/C,gBAAAC,YAAA;AA3BC,SAAS,wBAAwB;AAAA,EACtC;AACF,GAEG;AACD,QAAM,UAAU,OAAuB,IAAI;AAC3C,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AAEtC,QAAM,mBAAmB,YAAY,MAAM;AACzC,UAAM,KAAK,QAAQ;AACnB,QAAI,MAAM,GAAG,cAAc,GAAG,aAAa;AACzC,cAAQ,IAAI;AAAA,IACd;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmB,YAAY,MAAM;AACzC,YAAQ,KAAK;AAAA,EACf,GAAG,CAAC,CAAC;AAEL,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP;AAAA,MACA,OAAK;AAAA,MACL,WAAU;AAAA,MACV,oBAAkB;AAAA,MAElB,0BAAAA;AAAA,QAACD;AAAA,QAAA;AAAA,UACC,iBAAa;AAAA,UACb,KAAK;AAAA,UACL,cAAc;AAAA,UACd,cAAc;AAAA,UACd,IAAI;AAAA,YACF,UAAU;AAAA,YACV,cAAc;AAAA,YACd,YAAY;AAAA,YACZ,UAAU;AAAA,UACZ;AAAA,UAEC;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;;;ACpDA,SAAS,WAAW,UAAAE,SAAQ,YAAAC,iBAAgB;AAgBrC,SAAS,gBACd,SACA,EAAE,QAAQ,KAAK,cAAc,IAAI,IAAI,CAAC,GAC7B;AACT,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAiB,MAAM;AACnD,QAAM,aAAaD,QAA6C,IAAI;AAEpE,WAAS,eAAe;AACtB,QAAI,WAAW,YAAY,MAAM;AAC/B,mBAAa,WAAW,OAAO;AAC/B,iBAAW,UAAU;AAAA,IACvB;AAAA,EACF;AAEA,YAAU,MAAM;AACd,QAAI,WAAW,WAAW,QAAQ;AAChC,mBAAa;AAGb,iBAAW,UAAU,WAAW,MAAM;AACpC,mBAAW,UAAU,WAAW,MAAM;AACpC,oBAAU,QAAQ;AAAA,QACpB,GAAG,WAAW;AAEd,kBAAU,SAAS;AAAA,MACrB,GAAG,KAAK;AAER,gBAAU,UAAU;AAAA,IACtB;AAEA,QAAI,CAAC,WAAW,WAAW,WAAW;AACpC,mBAAa;AACb,gBAAU,MAAM;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,SAAS,OAAO,aAAa,MAAM,CAAC;AAExC,YAAU,MAAM,cAAc,CAAC,CAAC;AAEhC,SAAO,WAAW,aAAa,WAAW;AAC5C;;;ALoKU,gBAAAE,MA2DM,QAAAC,aA3DN;AApIV,IAAM,YAAY;AAAA,EAChB,UAAU;AAAA,EACV,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,eAAe;AACjB;AAEA,IAAM,gBAAgB;AAAA,EACpB,mDAAmD;AAAA,IACjD,SAAS,CAAC,EAAE,QAAQ,MAClB,QAAQ,SAAS,SAAS,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG;AAAA,EAClE;AACF;AAEA,SAAS,OACP,QACA,UACA,QACA;AACA,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,UAAU;AAAA,MACV,CAAC,MAAM,GAAG;AAAA,MACV;AAAA,MACA,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,SAAS;AAAA,MACT,GAAI,SAAS,KAAK;AAAA,IACpB;AAAA,EACF;AACA,QAAM,KAAK,YAAY;AACvB,SAAO;AAAA,IACL,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,0BAA0B,EAAE,UAAU,IAAI,YAAY,SAAS;AAAA,EACjE;AACF;AAIA,IAAM,qBAAqB,EAAE,QAAQ,UAAU;AAE/C,IAAM,kBAAkB;AAAA,EACtB,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,GAAG;AACL;AAEA,IAAM,mBAAmB,EAAE,YAAY,SAAS;AAEhD,IAAM,mBAAmB;AAAA,EACvB,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK;AACP;AAEA,IAAM,sBAAsB,EAAE,OAAO,GAAG;AAExC,IAAM,wBAAwB;AAAA,EAC5B,UAAU;AAAA,EACV,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,SAAS;AACX;AAEA,IAAM,yBAAyB,EAAE,YAAY,SAAS;AAiBtD,SAAS,mBAA0B;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA8B;AAC5B,QAAM,YAAY,aACd,iBACE,eAAe,IAAI,QAAQ,IAC3B,OACF;AAEJ,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MAEC,OAAO;AAAA,MACP,UAAU,qBAAqB,aAAa;AAAA,MAC5C,MAAM,YAAY,WAAW;AAAA,MAC7B,UAAU,YAAY,IAAI;AAAA,MAC1B,IAAI,YAAY,qBAAqB;AAAA,MACrC,SACE,aAAa,aAAa,MAAM,WAAW,IAAI,QAAQ,IAAI;AAAA,MAE7D,WACE,aAAa,aACT,CAAC,MAA2B;AAC1B,YAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,YAAE,eAAe;AACjB,qBAAW,IAAI,QAAQ;AAAA,QACzB;AAAA,MACF,IACA;AAAA,MAGL;AAAA,8BACC,gBAAAD,KAAC,aAAU,SAAQ,YAAW,IAAI,iBAChC,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,UAAU,CAAC,IAAI,aAAa;AAAA,YAC5B,UAAU,CAAC,MACT,IAAI,eAAe,EAAE,OAAO,SAAS;AAAA,cACnC,gBAAgB;AAAA,YAClB,CAAC;AAAA,YAEH,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA,YAClC,IAAI,CAAC,IAAI,aAAa,IAAI,mBAAmB;AAAA,YAC7C,WAAW;AAAA,cACT,OAAO;AAAA,gBACL,cAAc,cACV,UAAU,YAAY,IAAI,QAAQ,CAAC,KACnC,cAAc,IAAI,QAAQ,CAAC;AAAA,cACjC;AAAA,YACF;AAAA;AAAA,QACF,GACF;AAAA,QAED,IAAI,gBAAgB,EAAE,IAAI,CAAC,MAAM,WAAW,UAAU;AACrD,gBAAM,SAAS,KAAK,OAAO,UAAU,MAAM;AAC3C,gBAAM,eACJ,mBACA,CAAC,UACD,cACE,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,UAAU,MAAM,MAAM;AAE3D,gBAAM,UAAU;AAAA,YACd,KAAK,OAAO,UAAU;AAAA,YACtB,KAAK,WAAW;AAAA,UAClB;AAEA,iBACE,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC,eAAa,UAAU;AAAA,cACvB,IAAI;AAAA,gBACF,GAAG,OAAO,QAAQ,KAAK,OAAO,UAAU,MAAM,UAAU,CAAC;AAAA,gBACzD,IAAI,eAAe,QAAQ;AAAA,cAC7B;AAAA,cAEE,iBAAM;AACN,oBAAI,OAAQ,QAAO;AAEnB,sBAAM,WAAW,KAAK,OAAO,UAAU,MAAM,YAAY;AACzD,sBAAM,YAAY,WAChB,gBAAAA,KAAC,2BAAyB,mBAAQ,IAElC;AAGF,oBAAI,CAAC,aAAc,QAAO;AAE1B,sBAAM,WAAW,cACb,YAAY,IAAI,QAAQ,IACxB,OAAO,IAAI,QAAQ,CAAC;AAExB,uBACE,gBAAAC;AAAA,kBAACC;AAAA,kBAAA;AAAA,oBACC,IACE,IAAI,QAAQ,IACR,EAAE,GAAG,kBAAkB,IAAI,GAAG,IAAI,QAAQ,EAAE,KAAK,IACjD;AAAA,oBAGL;AAAA,0BAAI,aAAa,IAChB,gBAAAF;AAAA,wBAAC;AAAA;AAAA,0BACC,SAAQ;AAAA,0BACR,SAAS,CAAC,MAAM;AACd,8BAAE,gBAAgB;AAClB,gCAAI,eAAe;AAAA,0BACrB;AAAA,0BACA,cACE,aACI,YAAY,QAAQ,KACpB,UAAU,QAAQ;AAAA,0BAExB,iBAAe;AAAA,0BAEd,uBACC,gBAAAA;AAAA,4BAAC;AAAA;AAAA,8BACC,SAAQ;AAAA,8BACR,IAAI;AAAA,gCACF,OAAO,CAAC,EAAE,QAAQ,MAAM,QAAQ,KAAK;AAAA,8BACvC;AAAA;AAAA,0BACF,IAEA,gBAAAA;AAAA,4BAAC;AAAA;AAAA,8BACC,SAAQ;AAAA,8BACR,IAAI;AAAA,gCACF,OAAO,CAAC,EAAE,QAAQ,MAAM,QAAQ,KAAK;AAAA,8BACvC;AAAA;AAAA,0BACF;AAAA;AAAA,sBAEJ,IACE,oBACF,gBAAAA,KAACE,MAAA,EAAI,IAAI,qBAAqB,IAC5B;AAAA,sBACH;AAAA;AAAA;AAAA,gBACH;AAAA,cAEJ,GAAG;AAAA;AAAA,YAnEE,KAAK;AAAA,UAoEZ;AAAA,QAEJ,CAAC;AAAA;AAAA;AAAA,IA/HI,IAAI;AAAA,EAgIX;AAEJ;AAEA,SAAS,2BACP,MACA,MACA;AACA,SACE,KAAK,IAAI,OAAO,KAAK,IAAI,MACzB,KAAK,IAAI,aAAa,KAAK,IAAI,YAC/B,KAAK,eAAe,KAAK,cACzB,KAAK,eAAe,KAAK,cACzB,KAAK,IAAI,gBAAgB,EAAE,WAAW,KAAK,IAAI,gBAAgB,EAAE,UACjE,KAAK,uBAAuB,KAAK,sBACjC,KAAK,oBAAoB,KAAK,mBAC9B,KAAK,sBAAsB,KAAK,qBAChC,KAAK,6BAA6B,KAAK,4BACvC,KAAK,eAAe,KAAK,cACzB,KAAK,mBAAmB,KAAK,kBAC7B,KAAK,gBAAgB,KAAK;AAE9B;AAEA,IAAM,gBAAgBC,OAAM;AAAA,EAC1B;AAAA,EACA;AACF;AAIO,SAAS,WAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB;AAAA,EACA,2BAA2B;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA2B;AAIzB,QAAM,gBAAgB,MAAM,sBAAsB,EAAE;AAAA,IAClD,CAAC,KAAK,QAAQ;AACZ,YAAM,KAAK,IAAI,UAAU,MAAM;AAC/B,aAAO,OAAO,OAAO,OAAO,WAAW,KAAK;AAAA,IAC9C;AAAA,IACA,qBAAqB,KAAK;AAAA,EAC5B;AAEA,QAAM,eAAeC,QAAuB,IAAI;AAEhD,QAAM,cAAc,gBAAgB,CAAC,CAAC,OAAO;AAE7C,QAAM,OAAO,MAAM,YAAY,EAAE;AACjC,QAAM,oBACJ,mBAAmB,KAAK,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC;AACtD,QAAM,YAAY,CAAC,CAAC,SAAS,CAAC;AAC9B,QAAM,YAAY,CAAC,aAAa,CAAC,WAAW,KAAK,WAAW;AAE5D,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC,WAAWC;AAAA,MACV,GAAG;AAAA,MACJ,KAAK;AAAA,MACL,IAAI;AAAA,QACF,SAAS;AAAA,QACT,eAAe;AAAA,QACf,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,GAAG;AAAA,MACL;AAAA,MAEA;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,aAAW,eAAe;AAAA,YAC1B,IAAI,EAAE,UAAU,eAAe,aAAa,OAAO;AAAA,YAEnD;AAAA,8BAAAD,KAAC,aACE,gBAAM,gBAAgB,EAAE,IAAI,CAAC,gBAC5B,gBAAAC,MAAC,YACE;AAAA,sCACC,gBAAAD,KAAC,aAAU,SAAQ,YAAW,IAAI,uBAC/B,WAAC,iBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAS,MAAM,yBAAyB;AAAA,oBACxC,eAAe,MAAM,0BAA0B;AAAA,oBAC/C,UAAU,MAAM,oCAAoC;AAAA,oBACpD,IACE,KAAK,WAAW,IAAI,yBAAyB;AAAA,oBAE/C,WAAW,EAAE,OAAO,EAAE,cAAc,kBAAkB,EAAE;AAAA;AAAA,gBAC1D,GAEJ;AAAA,gBAED,YAAY,QAAQ,IAAI,CAAC,WAAW;AACnC,wBAAM,SAAS,OAAO,OAAO,UAAU,MAAM;AAC7C,yBACE,gBAAAA;AAAA,oBAAC;AAAA;AAAA,sBAEC,eAAa,UAAU;AAAA,sBACvB,eAAe,OAAO,OAAO,YAAY,KAAK;AAAA,sBAC7C,GAAI,OAAO,OAAO,WAAW,KAAK;AAAA,wBACjC,aAAa,OAAO,OAAO,YAAY,IACnC,OAAO,OAAO,YAAY,MAAM,QAC9B,cACA,eACF;AAAA,sBACN;AAAA,sBACA,IAAI;AAAA,wBACF;AAAA,wBACA,OAAO,OAAO,UAAU,MAAM;AAAA,wBAC9B;AAAA,sBACF;AAAA,sBAEC,iBAAO,gBAAgB,OAAO,OAAO,OAAO,WAAW,IACtD,gBAAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,QAAQ,CAAC,CAAC,OAAO,OAAO,YAAY;AAAA,0BACpC,WAAW,OAAO,OAAO,YAAY,KAAK;AAAA,0BAC1C,SAAS,OAAO,OAAO,wBAAwB;AAAA,0BAC9C,GAAI,OAAO,OAAO,YAAY,KAAK;AAAA,4BAClC,eACE,OAAO,OAAO,YAAY,MAAM,QAC5B,wBACA;AAAA,0BACR;AAAA,0BAEC;AAAA,4BACC,OAAO,OAAO,UAAU;AAAA,4BACxB,OAAO,WAAW;AAAA,0BACpB;AAAA;AAAA,sBACF,IAEA;AAAA,wBACE,OAAO,OAAO,UAAU;AAAA,wBACxB,OAAO,WAAW;AAAA,sBACpB;AAAA;AAAA,oBArCG,OAAO;AAAA,kBAuCd;AAAA,gBAEJ,CAAC;AAAA,mBA7DY,YAAY,EA8D3B,CACD,GACH;AAAA,cAEA,gBAAAA,KAAC,aAAU,IAAI,EAAE,SAAS,cAAc,MAAM,EAAE,GAC7C,WAAC,aACA,KAAK,IAAI,CAAC,QACR,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBAEC;AAAA,kBACA,YAAY,IAAI,cAAc;AAAA,kBAC9B,YAAY,IAAI,cAAc;AAAA,kBAC9B;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA;AAAA,gBAVK,IAAI;AAAA,cAWX,CACD,GACL;AAAA;AAAA;AAAA,QACF;AAAA,QAEC,aACC,gBAAAA,KAACE,MAAA,EAAI,IAAI,WACN,oBAAU,OACT,gBAAAF,KAAC,wBAAqB,IAAI,EAAE,eAAe,OAAO,GAAG,IACnD,iBAAiB,QACnB,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,aAAa,MAAM;AAAA,YACnB,IAAI,EAAE,eAAe,OAAO;AAAA;AAAA,QAC9B,IAEA,OAEJ;AAAA,QAGD,aACC,gBAAAA,KAACE,MAAA,EAAI,IAAI,WACN,mBAAS,UAAU,OAClB,QAEA,gBAAAF,KAAC,wBAAqB,IAAI,EAAE,eAAe,OAAO,GAAG,GAEzD;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AM3gBA,SAAS,SAAAK,cAAyB;AAiB9B,gBAAAC,YAAA;AARG,SAAS,oBAAoB;AAAA,EAClC,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA6B;AAC3B,SACE,gBAAAA;AAAA,IAACD;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,QAAO;AAAA,MACP,UAAS;AAAA,MACT,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK;AAAA,MAC7B,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI;AAAA,MACrB,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,MACpB,WACE,gBACI,CAAC,EAAE,QAAQ,MAAM,eAAe,QAAQ,OAAO,KAC/C;AAAA,MAEN,cACE,mBACI,CAAC,EAAE,QAAQ,MAAM,eAAe,QAAQ,OAAO,KAC/C;AAAA,MAEN,IAAI,EAAE,GAAG,GAAG;AAAA,MACX,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;ACxCA,SAAS,cAAAE,aAAkC,WAAAC,gBAAe;AAyBlD,gBAAAC,aAAA;AAZD,SAAS,2BAEd,EAAE,OAAO,MAAM,GAAG,MAAM,GAAuC;AAC/D,SACE,gBAAAA;AAAA,IAACD;AAAA,IAAA;AAAA,MACC,OAAO;AAAA,MACP,WAAU;AAAA,MACV,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,oBAAkB;AAAA,MAElB,0BAAAC,MAAC,UACC,0BAAAA,MAACF,aAAA,EAAW,cAAY,OAAQ,GAAG,OAChC,gBACH,GACF;AAAA;AAAA,EACF;AAEJ;;;AC/BA;AAAA,EACE,SAAAG;AAAA,EACA,OAAAC;AAAA,EACA,YAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EAEA,cAAAC;AAAA,OAGK;AAmHC,SAKE,OAAAC,OALF,QAAAC,aAAA;AAnGD,SAAS,kBACd,YACiB;AACjB,SAAO;AACT;AAOO,SAAS,2BACd,OACkB;AAClB,QAAM,SAA2B,CAAC;AAClC,aAAW,OAAO,MAAM,kBAAkB,GAAG;AAC3C,UAAM,KAAK,IAAI,UAAU,MAAM;AAC/B,QAAI,OAAO,OAAW,QAAO,IAAI,EAAE,IAAI;AAAA,EACzC;AACA,SAAO;AACT;AAOO,SAAS,8BACd,OACA,mBACQ;AACR,QAAM,UAAU,MAAM,SAAS,EAAE;AACjC,QAAM,WAAW,qBAAqB,2BAA2B,KAAK;AACtE,MAAI,QAAQ;AACZ,aAAW,OAAO,MAAM,kBAAkB,GAAG;AAC3C,UAAM,YAAY,QAAQ,IAAI,EAAE,KAAK;AACrC,UAAM,aAAa,SAAS,IAAI,EAAE,KAAK;AACvC,QAAI,cAAc,WAAY;AAAA,EAChC;AACA,SAAO;AACT;AAYA,IAAM,mBAAmC;AAAA,EACvC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,WAAW;AAAA,IACT,iBAAiB,CAAC,EAAE,QAAQ,MAC1B,QAAQ,SAAS,SAAS,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,GAAG;AAAA,EAClE;AACF;AAEO,SAAS,2BAAkC;AAAA,EAChD;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA,eAAe,EAAE,UAAU,UAAU,YAAY,QAAQ;AAAA,EACzD,kBAAkB,EAAE,UAAU,OAAO,YAAY,QAAQ;AAAA,EACzD;AAAA,EACA,GAAG;AACL,GAA2C;AACzC,QAAM,aAAa,MAChB,kBAAkB,EAClB,MAAM,CAAC,QAAQ,IAAI,aAAa,CAAC;AAEpC,SACE,gBAAAD;AAAA,IAACE;AAAA,IAAA;AAAA,MACC;AAAA,MACA,MAAM,QAAQ,QAAQ;AAAA,MACtB;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT,GAAG;AAAA,QACH,OAAO;AAAA,UACL,IAAI,CAAC,EAAE,QAAQ,OAAO;AAAA,YACpB,cAAc;AAAA,YACd,iBAAiB;AAAA,YACjB,QAAQ,eAAe,QAAQ,SAAS,SAAS;AAAA,YACjD,WAAW,mBAAmBC,OAAM,QAAQ,OAAO,OAAO,IAAI,CAAC;AAAA,YAC/D,UAAU;AAAA,UACZ;AAAA,UACA,GAAK,WAAW,SAAS,CAAC;AAAA,QAC5B;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ,0BAAAF,MAAC,QAAK,OAAK,MAAC,gBAAc,MACxB;AAAA,wBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAK;AAAA,YACL,IAAI;AAAA,YACJ,SAAS,MAAM,MAAM,wBAAwB,CAAC,UAAU;AAAA,YAExD;AAAA,8BAAAD;AAAA,gBAACI;AAAA,gBAAA;AAAA,kBACC,SAAS;AAAA,kBACT,WAAW,EAAE,OAAO,EAAE,cAAc,GAAG,YAAY,WAAW,EAAE;AAAA;AAAA,cAClE;AAAA,cACA,gBAAAJ,MAACK,aAAA,EAAW,SAAQ,WAAU,YAAY,KACvC,wBACH;AAAA;AAAA;AAAA,QACF;AAAA,QACA,gBAAAL,MAAC,WAAQ;AAAA,QACT,gBAAAA;AAAA,UAACM;AAAA,UAAA;AAAA,YACC,IAAI,EAAE,WAAW,KAAK,UAAU,QAAQ,oBAAoB,OAAO;AAAA,YAElE,gBAAM,kBAAkB,EAAE,IAAI,CAAC,WAAW;AACzC,oBAAM,aACJ,OAAO,UAAU,MAAM,gBACtB,OAAO,OAAO,UAAU,WAAW,WAChC,OAAO,UAAU,SACjB,OAAO;AACb,qBACE,gBAAAL;AAAA,gBAAC;AAAA;AAAA,kBAEC,OAAK;AAAA,kBACL,IAAI;AAAA,kBACJ,SAAS,OAAO,2BAA2B;AAAA,kBAE3C;AAAA,oCAAAD;AAAA,sBAACI;AAAA,sBAAA;AAAA,wBACC,SAAS,OAAO,aAAa;AAAA,wBAC7B,IAAI,EAAE,IAAI,EAAE;AAAA,wBACZ,WAAW;AAAA,0BACT,OAAO,EAAE,cAAc,QAAQ,UAAU,GAAG;AAAA,wBAC9C;AAAA;AAAA,oBACF;AAAA,oBACA,gBAAAJ,MAACK,aAAA,EAAW,SAAQ,WAAW,sBAAW;AAAA;AAAA;AAAA,gBAZrC,OAAO;AAAA,cAad;AAAA,YAEJ,CAAC;AAAA;AAAA,QACH;AAAA,SACF;AAAA;AAAA,EACF;AAEJ;;;AC5KA,SAAS,mBAAmB;AAE5B,SAAgC,YAAAE,iBAAgB;;;ACFhD;AAAA,EACE;AAAA,EAEA,cAAAC;AAAA,OAEK;AA0BC,gBAAAC,aAAA;AAdD,SAAS,8BAA8B;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAuC;AACrC,QAAM,YAAY,gBAAgB,QAAQ,iBAAiB;AAE3D,SACE,gBAAAA;AAAA,IAACD;AAAA,IAAA;AAAA,MACC,cAAY,YAAY,GAAG,KAAK,KAAK,YAAY,MAAM;AAAA,MACtD,GAAG;AAAA,MAEH,sBACC,gBAAAC;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,OAAM;AAAA,UACN,SAAQ;AAAA,UACR,IAAI;AAAA,YACF,qBAAqB;AAAA,cACnB,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,cAAc;AAAA,cACd,KAAK;AAAA,cACL,OAAO;AAAA,YACT;AAAA,UACF;AAAA,UAEC;AAAA;AAAA,MACH,IAEA;AAAA;AAAA,EAEJ;AAEJ;;;ADlBS,SAYL,UAZK,OAAAC,OAYL,QAAAC,aAZK;AAFF,SAAS,kCAAyC;AAAA,EACvD;AAAA,EACA,OAAO,gBAAAD,MAAC,eAAY,SAAQ,MAAK;AAAA,EACjC,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAkD;AAChD,QAAM,CAAC,UAAU,WAAW,IAAIE,UAA6B,IAAI;AAEjE,QAAM,WAAW,2BAA2B,2BAA2B,KAAK;AAC5E,QAAM,aAAa,8BAA8B,OAAO,QAAQ;AAEhE,SACE,gBAAAD,MAAA,YACE;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd,SAAS,CAAC,MACR,YAAY,EAAE,aAAa;AAAA,QAE5B,GAAG;AAAA;AAAA,IACN;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,SAAS,MAAM,YAAY,IAAI;AAAA,QAC/B;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AEjEA,SAAS,aAAAG,YAAW,UAAAC,eAAc;AAClC,SAAS,uBAAkD;AAgEvD,gBAAAC,aAAA;AAtCJ,IAAM,cAAc;AAAA,EAClB,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACT;AAEO,SAAS,qBAA4B;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAAqC;AACnC,QAAM,WAAW,MAAM,YAAY;AACnC,QAAM,kBAAkBD,QAAO,QAAQ;AAGvC,MAAI,CAAC,WAAW,YAAY,GAAG;AAC7B,oBAAgB,UAAU;AAAA,EAC5B;AAEA,QAAM,cAAc,UAAU,gBAAgB,UAAU;AACxD,QAAM,EAAE,UAAU,UAAU,IAAI,MAAM,SAAS,EAAE;AAGjD,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,KAAK,cAAc,QAAQ,IAAI,CAAC;AACjE,EAAAD,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,YAAY,SAAS;AACnC,YAAM,aAAa,OAAO;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,SAAS,WAAW,SAAS,KAAK,CAAC;AAGvC,MAAI,aAAa,CAAC,eAAe,eAAe,UAAW,QAAO;AAElE,SACE,gBAAAE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO;AAAA,MACP,MAAM,MAAM,SAAS,EAAE,WAAW;AAAA,MAClC,aAAa,MAAM,SAAS,EAAE,WAAW;AAAA,MACzC,cAAc,CAAC,GAAG,SAAS,MAAM,aAAa,IAAI;AAAA,MAClD,qBAAqB,CAAC,MAAM;AAC1B,cAAM,YAAY,OAAO,EAAE,OAAO,KAAK,CAAC;AACxC,cAAM,aAAa,CAAC;AAAA,MACtB;AAAA,MACA,oBAAoB,sBAAsB,CAAC;AAAA,MAC3C,iBAAe;AAAA,MACf,gBAAc;AAAA,MACd,IAAI;AAAA,QACF,SAAS;AAAA,QACT,gBAAgB,YAAY,QAAQ;AAAA,QACpC,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,sBAAsB;AAAA,UACpB,WAAW;AAAA,UACX,IAAI;AAAA,QACN;AAAA,QACA,GAAG;AAAA,MACL;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;;;AC5FA,SAAS,OAAAC,YAA0B;AAU/B,gBAAAC,aAAA;AANG,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA2B;AACzB,SACE,gBAAAA;AAAA,IAACD;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAQ;AAAA,MACR,gBAAe;AAAA,MACf,YAAW;AAAA,MACX,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,MACpB,WAAW;AAAA,MACX,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK;AAAA,MAC7B,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK;AAAA,MAC7B,IAAI,EAAE,GAAG,GAAG;AAAA,MACX,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;ACzBA,SAAS,OAAAE,YAA0B;AAS/B,gBAAAC,aAAA;AALG,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA,GAAG;AACL,GAAkC;AAChC,SACE,gBAAAA;AAAA,IAACD;AAAA,IAAA;AAAA,MACC,SAAQ;AAAA,MACR,YAAW;AAAA,MACX,IAAG;AAAA,MACH,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,MACpB,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE;AAAA,MAClB,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;ACpBA,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAuBpB,gBAAAE,aAAA;AAHF,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA,OAAO,gBAAAA,MAAC,gBAAa,SAAQ,MAAK;AAAA,EAClC,QAAQ;AAAA,EACR,GAAG;AACL,GAAiC;AAC/B,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,UAAU,GAAG,KAAK,cAAc;AAAA,MACvC,MAAM,UAAU,gBAAAA,MAAC,oBAAiB,MAAM,IAAI,OAAM,WAAU,IAAK;AAAA,MACjE,UAAU;AAAA,MACV,SAAS;AAAA,MACR,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACrCA;AAAA,EACE,SAAAC;AAAA,EACA,OAAAC;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA;AAAA,EAEA,cAAAC;AAAA,EACA,cAAAC;AAAA,OACK;AACP,SAAS,WAAW,kBAAkB;AACtC,SAAyB,OAAO,YAAAC,iBAAgB;AAiCvC,SAiBL,YAAAC,WAjBK,OAAAC,OAmDK,QAAAC,aAnDL;AALF,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO,gBAAAD,MAAC,cAAW,SAAQ,MAAK;AAAA,EAChC,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AACf,GAAkC;AAChC,QAAM,CAAC,MAAM,OAAO,IAAIE,UAAS,KAAK;AACtC,QAAM,UAAU,MAAM;AAEtB,WAAS,cAAc;AACrB,cAAU;AACV,YAAQ,KAAK;AAAA,EACf;AAEA,SACE,gBAAAD,MAAAF,WAAA,EACE;AAAA,oBAAAC;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP;AAAA,QACA,cAAc;AAAA,QACd,SAAS,MAAM,QAAQ,IAAI;AAAA;AAAA,IAC7B;AAAA,IAEA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAO;AAAA,QACP;AAAA,QACA,SAAS;AAAA,QACT,mBAAiB;AAAA,QAChB,GAAG;AAAA,QACJ,YAAY;AAAA,UACV,IAAI,EAAE,OAAO,EAAE,IAAI,QAAQ,IAAI,IAAI,EAAE;AAAA,UACrC,GAAG,aAAa;AAAA,QAClB;AAAA,QAEA,0BAAAC;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,QAAO;AAAA,YACP,SAAQ;AAAA,YACR,eAAc;AAAA,YACd,gBAAe;AAAA,YAGf;AAAA,8BAAAF,MAACE,MAAA,EACC;AAAA,gCAAAF;AAAA,kBAACE;AAAA,kBAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,gBAAe;AAAA,oBACf,YAAW;AAAA,oBACX,IAAI;AAAA,oBACJ,IAAI;AAAA,oBAEJ;AAAA,sCAAAF,MAACG,aAAA,EAAW,IAAI,SAAS,SAAQ,MAC9B;AAAA;AAAA,wBACD,gBAAAJ;AAAA,0BAACK;AAAA,0BAAA;AAAA,4BACC,cAAc;AAAA,4BACd,OAAM;AAAA,4BACN,IAAI,EAAE,IAAI,KAAK,IAAI,IAAI;AAAA;AAAA,wBACzB;AAAA,yBACF;AAAA,sBACA,gBAAAL;AAAA,wBAACM;AAAA,wBAAA;AAAA,0BACC,MAAK;AAAA,0BACL,SAAS;AAAA,0BACT,cAAY;AAAA,0BAEZ,0BAAAN,MAAC,aAAU;AAAA;AAAA,sBACb;AAAA;AAAA;AAAA,gBACF;AAAA,gBACA,gBAAAA,MAACO,UAAA,EAAQ;AAAA,gBAGT,gBAAAP;AAAA,kBAACG;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,cAAW;AAAA,oBACX,SAAQ;AAAA,oBACR,eAAc;AAAA,oBACd,KAAK;AAAA,oBACL,GAAG;AAAA,oBACH,UAAS;AAAA,oBAER;AAAA;AAAA,gBACH;AAAA,iBACF;AAAA,cAGA,gBAAAF,MAACE,MAAA,EAAI,SAAQ,QACX;AAAA,gCAAAH;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,OAAM;AAAA,oBACN,WAAS;AAAA,oBACT,SAAS;AAAA,oBACT,UAAU,sBAAsB;AAAA,oBAE/B;AAAA;AAAA,gBACH;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,OAAM;AAAA,oBACN,WAAS;AAAA,oBACT,SAAS;AAAA,oBAER;AAAA;AAAA,gBACH;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;ACvJA;AAAA,EACE,OAAAQ;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA,kBAAAC;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,EAEA;AAAA,OAEK;AACP,SAAS,aAAAC,YAAW,cAAAC,mBAAkB;AACtC,SAAS,aAAAC,YAAW,YAAAC,iBAAgB;;;ACZpC,SAAS,eAAAC,cAAa,aAAAC,YAAW,UAAAC,eAAc;AAGxC,IAAM,6BAA6B;AAOnC,SAAS,qBACd,UACA,QAAgB,4BACS;AACzB,QAAM,aAAaA,QAA6C,IAAI;AACpE,QAAM,cAAcA,QAAO,QAAQ;AAGnC,cAAY,UAAU;AAEtB,EAAAD,WAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,WAAW,YAAY,KAAM,cAAa,WAAW,OAAO;AAAA,IAClE;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAOD;AAAA,IACL,IAAI,SAAe;AACjB,UAAI,WAAW,YAAY,KAAM,cAAa,WAAW,OAAO;AAChE,iBAAW,UAAU;AAAA,QACnB,MAAM,YAAY,QAAQ,GAAG,IAAI;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,KAAK;AAAA,EACR;AACF;;;ADuEQ,gBAAAG,OA0CF,QAAAC,aA1CE;AAzDR,IAAM,gBAAgB;AAAA,EACpB,wBAAwB;AAAA,IACtB,QAAQ;AAAA,IACR,WAAW;AAAA,EACb;AAAA,EACA,sCAAsC;AAAA,IACpC,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,cAAc;AAAA,EACd,aAAa;AAAA,EACb,aAAa;AAAA,EACb;AAAA,EACA,mBAAmB;AAAA,EACnB;AAAA,EACA,GAAG;AACL,GAAiC;AAC/B,QAAM,WAAW,cAAqB,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;AACrE,QAAM,CAAC,YAAY,aAAa,IAAIC,UAAS,YAAY;AACzD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,oBAAoB,qBAAqB,UAAU,aAAa;AAEtE,EAAAC,WAAU,MAAM;AACd,kBAAc,YAAY;AAAA,EAC5B,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,eAAe,CAAC,MAA2C;AAC/D,kBAAc,EAAE,OAAO,KAAK;AAC5B,sBAAkB,EAAE,OAAO,KAAK;AAAA,EAClC;AAEA,QAAM,cAAc,MAAM;AACxB,kBAAc,EAAE;AAChB,sBAAkB,EAAE;AAAA,EACtB;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,cAAc,CAAC,YAAY;AAC7B,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,cAAc,aAClB,gBAAAH,MAACI,iBAAA,EAAe,UAAS,OACvB,0BAAAJ;AAAA,IAACK;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAS;AAAA,MACT,cAAY;AAAA,MACZ,IAAI,EAAE,IAAI,IAAI;AAAA,MAEd,0BAAAL,MAACM,YAAA,EAAU,SAAQ,MAAK,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG,GAAG;AAAA;AAAA,EACzD,GACF,IACE;AAEJ,QAAM,YACJ,gBAAAN;AAAA,IAACO;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,MAAK;AAAA,MACL;AAAA,MACA,WAAW;AAAA,QACT,WAAW,EAAE,WAAW,cAAc,YAAY;AAAA,QAClD,OAAO;AAAA,UACL,gBACE,gBAAAP,MAACI,iBAAA,EAAe,UAAS,SAAQ,IAAI,EAAE,IAAI,EAAE,GAC3C,0BAAAJ;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG;AAAA;AAAA,UAC9B,GACF;AAAA,UAEF,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,MACA,WAAS;AAAA,MACT,IAAI;AAAA,QACF;AAAA,QACA,aAAa,EAAE,OAAO,IAAI,IAAI,EAAE,SAAS;AAAA,QACzC,GAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,KAAK,CAAC,EAAE,IAAI,CAAC;AAAA,MAC5C;AAAA,MACA,SAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU;AAAA,MACV,QAAQ;AAAA,MACP,GAAI,cAAc,cAAc,CAAC,gBAAgB,EAAE,WAAW,KAAK;AAAA,MACnE,GAAG;AAAA;AAAA,EACN;AAGF,MAAI,YAAY,kBAAkB;AAChC,WACE,gBAAAP,MAACQ,MAAA,EAAI,SAAQ,QAAO,YAAW,UAAS,OAAM,QAAO,IAAI,GAAG,KAAK,GAC/D;AAAA,sBAAAT,MAACQ,aAAA,EAAW,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG,GAAG;AAAA,MAC3C,gBAAAR;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,MAAK;AAAA,UACL;AAAA,UACA,YAAY,EAAE,WAAW,cAAc,SAAS;AAAA,UAChD,WAAS;AAAA,UACT,OAAO;AAAA,UACP,IAAI;AAAA,YACF,aAAa;AAAA,YACb,QAAQ;AAAA,YACR,WAAW;AAAA,YACX,UAAU,CAAC,MAAM,EAAE,WAAW,MAAM;AAAA,UACtC;AAAA,UACA,UAAU;AAAA,UACV,cAAc;AAAA;AAAA,MAChB;AAAA,OACF;AAAA,EAEJ;AAEA,MAAI,YAAY;AACd,WACE,gBAAAC,MAACQ,MAAA,EAAI,SAAQ,QAAO,YAAW,UAAS,UAAU,IAChD;AAAA,sBAAAT;AAAA,QAACK;AAAA,QAAA;AAAA,UACC,cAAY,eAAe;AAAA,UAC3B,SAAS,MAAM,cAAc,IAAI;AAAA,UACjC,IAAI,EAAE,SAAS,cAAc,aAAa,SAAS,OAAO;AAAA,UAE1D,0BAAAL;AAAA,YAACQ;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG;AAAA;AAAA,UAC9B;AAAA;AAAA,MACF;AAAA,MACA,gBAAAR;AAAA,QAAC;AAAA;AAAA,UACC,IAAI,cAAc,CAAC,CAAC;AAAA,UACpB,aAAY;AAAA,UACZ,eAAa;AAAA,UAEZ;AAAA;AAAA,MACH;AAAA,OACF;AAAA,EAEJ;AAEA,SAAO;AACT;;;AErMA;AAAA,EAGE;AAAA,EACA;AAAA,EAGA;AAAA,OACK;AACP,SAAS,eAAe;;;ACKjB,SAAS,eACd,OACA,iBACc;AACd,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,KAAK,kBAAkB,MAAM,KAAK,KAAK,MAAM;AACnD,SAAO,CAAC,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,CAAC;AAC3C;AAQO,SAAS,eACd,SACA,iBACgC;AAChC,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAM,EAAE,IAAI,KAAK,IAAI,QAAQ,CAAC;AAC9B,QAAM,QAAS,kBAAkB,EAAE,KAAK;AACxC,SAAO,EAAE,OAAO,KAAK;AACvB;AAKO,SAAS,0BAA0B,KAAkC;AAC1E,QAAM,QAA2B,CAAC;AAClC,aAAW,MAAM,KAAK;AACpB,UAAM,EAAE,IAAI;AAAA,EACd;AACA,SAAO;AACT;AAKO,SAAS,0BACd,WACU;AACV,SAAO,OAAO,KAAK,SAAS,EAAE,OAAO,CAAC,QAAQ,UAAU,GAAG,CAAC;AAC9D;AAMO,SAAS,sBACd,SAIA;AACA,QAAM,kBAAqC,CAAC;AAC5C,QAAM,kBAA8C,CAAC;AACrD,aAAW,OAAO,SAAS;AACzB,UAAM,aAAa,IAAI,MAAM;AAC7B,QAAI,IAAI,MAAM,YAAY;AACxB,sBAAgB,IAAI,EAAE,IAAI;AAC1B,sBAAgB,UAAU,IAAI,IAAI;AAAA,IACpC;AAAA,EACF;AACA,SAAO,EAAE,iBAAiB,gBAAgB;AAC5C;AAMO,SAAS,mCACd,SACyB;AACzB,QAAM,WAAoC,CAAC;AAC3C,aAAW,OAAO,SAAS;AACzB,QAAI,IAAI,MAAM,QAAQ,IAAI,MAAM,mBAAmB,QAAW;AAC5D,eAAS,IAAI,EAAE,IAAI,IAAI,KAAK;AAAA,IAC9B;AAAA,EACF;AACA,SAAO;AACT;AAOO,SAAS,yBACd,YACA,UACyB;AACzB,QAAM,QAAiC,CAAC;AACxC,aAAW,CAAC,IAAI,OAAO,KAAK,OAAO,QAAQ,UAAU,GAAG;AACtD,QAAI,aAAa,SAAS,EAAE,KAAK,OAAO;AACtC,YAAM,EAAE,IAAI;AAAA,IACd;AAAA,EACF;AACA,SAAO;AACT;;;ADtFA,IAAM,eAAe,gBAAgB;AACrC,IAAM,mBAAmB,oBAAoB;AAC7C,IAAM,kBAAkB,CAAC,QAAgC,IAAI;AAyDtD,SAAS,wBAA0D;AAAA,EACxE;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2D;AAGzD,QAAM,EAAE,yBAAyB,iBAAiB,gBAAgB,IAAI;AAAA,IACpE,OAAO;AAAA,MACL,yBAAyB,mCAAmC,OAAO;AAAA,MACnE,GAAG,sBAAyB,OAAO;AAAA,IACrC;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,QAAM,UAAU;AAAA,IACd,MAAM,eAAe,OAAO,eAAe;AAAA,IAC3C,CAAC,OAAO,eAAe;AAAA,EACzB;AAEA,QAAM,gBAAgB,QAAQ,QAAQ,eAAe;AACrD,QAAM,aAAa;AAAA,IACjB,MACE,gBAAgB,EAAE,WAAW,MAAO,UAAU,YAAa,IAAI;AAAA,IACjE,CAAC,eAAe,MAAM,WAAW;AAAA,EACnC;AAEA,QAAM,eAAe,kBAAkB;AACvC,QAAM,eAAe;AAAA,IACnB,MACE,eAAe,0BAA0B,cAAe,IAAI;AAAA,IAC9D,CAAC,cAAc,cAAc;AAAA,EAC/B;AAEA,QAAM,mBAAmB;AAAA,IACvB,MACE,kBAAkB;AAAA,MAChB,GAAG;AAAA,MACH,GAAG;AAAA,IACL,CAAC;AAAA,IACH,CAAC,yBAAyB,gBAAgB;AAAA,EAC5C;AAIA,SAAO,cAAc;AAAA,IACnB;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA;AAAA,IAGA,eAAe;AAAA,IACf,eAAe;AAAA,IACf,OAAO;AAAA,MACL;AAAA,MACA,GAAI,cAAc,EAAE,WAAW;AAAA,MAC/B,kBAAkB;AAAA,MAClB,GAAI,gBAAgB,EAAE,aAAa;AAAA,MACnC,GAAI,YAAY,QAAQ,EAAE,SAAS;AAAA,IACrC;AAAA,IACA,iBAAiB,gBACb,CAAC,YAAY;AACX,YAAM,OACJ,OAAO,YAAY,aAAa,QAAQ,OAAO,IAAI;AACrD,oBAAc,eAAe,MAAM,eAAe,CAAC;AAAA,IACrD,IACA;AAAA;AAAA,IAGJ,GAAI,iBAAiB;AAAA,MACnB,kBAAkB;AAAA,MAClB,UAAU,YAAY;AAAA,MACtB,oBAAoB,eAChB,CACE,YAKG;AACH,cAAM,OACJ,OAAO,YAAY,aAAa,QAAQ,UAAW,IAAI;AACzD,qBAAa,KAAK,SAAS;AAAA,MAC7B,IACA;AAAA,IACN;AAAA;AAAA,IAGA,0BAA0B,2BACtB,CAAC,YAAY;AACX,YAAM,OACJ,OAAO,YAAY,aAAa,QAAQ,gBAAgB,IAAI;AAC9D;AAAA,QACE,yBAAyB,MAAM,uBAAuB;AAAA,MACxD;AAAA,IACF,IACA;AAAA;AAAA,IAGJ,GAAI,gBAAgB;AAAA,MAClB,oBAAoB,sBAAsB;AAAA,MAC1C,sBAAsB,yBAClB,CACE,YAKG;AACH,cAAM,OACJ,OAAO,YAAY,aAAa,QAAQ,YAAa,IAAI;AAC3D,+BAAuB,0BAA0B,IAAI,CAAC;AAAA,MACxD,IACA;AAAA,IACN;AAAA;AAAA,IAGA,GAAI,YAAY,QAAQ;AAAA;AAAA;AAAA;AAAA,MAItB,GAAI,cAAc,EAAE,qBAAqB,kBAAkB,WAAW;AAAA,MACtE,kBAAkB,mBACd,CACE,YAKG;AACH,cAAM,OACJ,OAAO,YAAY,aAAa,QAAQ,QAAQ,IAAI;AACtD,yBAAiB,IAAI;AAAA,MACvB,IACA;AAAA,IACN;AAAA,EACF,CAAC;AACH;;;AErOO,SAAS,YACd,MACA,SACA,WAAmB,UACb;AACN,QAAM,aAAa,eAAe,MAAM,OAAO;AAC/C,cAAY,YAAY,QAAQ;AAClC;AAMO,SAAS,eACd,MACA,SACQ;AACR,QAAM,SAAS,QAAQ,IAAI,CAAC,QAAQ,eAAe,IAAI,MAAM,CAAC,EAAE,KAAK,GAAG;AACxE,QAAM,WAAW,KAAK;AAAA,IAAI,CAAC,QACzB,QACG,IAAI,CAAC,QAAQ,eAAe,eAAe,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,EAC9D,KAAK,GAAG;AAAA,EACb;AACA,SAAO,CAAC,QAAQ,GAAG,QAAQ,EAAE,KAAK,IAAI;AACxC;AAEA,SAAS,eAAe,OAAuB;AAC7C,MAAI,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,IAAI,GAAG;AACtE,WAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,EACtC;AACA,SAAO;AACT;AAEA,SAAS,eAAe,OAAwB;AAC9C,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,iBAAiB,KAAM,QAAO,MAAM,YAAY;AACpD,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,YAAY,YAAoB,UAAwB;AAC/D,QAAM,OAAO,IAAI,KAAK,CAAC,UAAU,GAAG,EAAE,MAAM,0BAA0B,CAAC;AACvE,QAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,QAAM,OAAO,SAAS,cAAc,GAAG;AACvC,OAAK,aAAa,QAAQ,GAAG;AAC7B,OAAK,aAAa,YAAY,GAAG,QAAQ,MAAM;AAC/C,OAAK,MAAM,UAAU;AACrB,WAAS,KAAK,YAAY,IAAI;AAC9B,OAAK,MAAM;AACX,WAAS,KAAK,YAAY,IAAI;AAC9B,MAAI,gBAAgB,GAAG;AACzB;;;AC1DA;AAAA,EACE,OAAAU;AAAA,EAEA,YAAAC;AAAA,EACA,cAAAC;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAgBD,SAsCG,YAAAC,WAtCH,OAAAC,aAAA;AAHC,SAAS,YAAY,EAAE,MAAM,UAAU,SAAS,GAAqB;AAC1E,SACE,gBAAAA,MAACH,WAAA,EAAS,IAAI,MAAM,eAAa,MAAC,WAAU,SAC1C,0BAAAG;AAAA,IAACJ;AAAA,IAAA;AAAA,MACC,SAAS,CAAC,EAAE,QAAQ,MAAM,QAAQ,WAAW,QAAQ;AAAA,MACrD,SAAQ;AAAA,MACR,eAAc;AAAA,MACd,YAAW;AAAA,MACX,gBAAe;AAAA,MACf,KAAK;AAAA,MACL,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI;AAAA,MACrB,WAAW;AAAA,MACX,IAAI;AAAA,QACF,cAAc,CAAC,EAAE,QAAQ,MACvB,eAAe,QAAQ,QAAQ,EAAE,IAAI;AAAA,MACzC;AAAA,MAEC;AAAA;AAAA,EACH,GACF;AAEJ;AAGA,IAAM,cAAmD;AAAA,EACvD,OAAO,gBAAAI,MAAC,mBAAgB,OAAM,SAAQ,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG,GAAG;AAAA,EACrE,SAAS,gBAAAA,MAAC,qBAAkB,OAAM,WAAU,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG,GAAG;AAAA,EAC3E,SAAS,gBAAAA,MAAC,qBAAkB,OAAM,WAAU,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG,GAAG;AAAA,EAC3E,MAAM,gBAAAA,MAAC,kBAAe,OAAM,QAAO,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG,GAAG;AACpE;AAWO,SAAS,gBAAgB,EAAE,UAAU,SAAS,GAAyB;AAC5E,SAAO,gBAAAA,MAAAD,WAAA,EAAG,qBAAW,YAAY,QAAQ,IAAI,UAAS;AACxD;AAKO,SAAS,mBAAmB,EAAE,UAAU,GAAG,MAAM,GAAoB;AAC1E,SACE,gBAAAC,MAACF,aAAA,EAAW,WAAU,UAAS,SAAQ,MAAM,GAAG,OAC7C,UACH;AAEJ;AAMO,SAAS,mBAAmB,EAAE,UAAU,GAAG,MAAM,GAAa;AACnE,SACE,gBAAAE,MAACJ,OAAA,EAAI,SAAQ,QAAO,KAAK,GAAG,YAAW,UAAU,GAAG,OACjD,UACH;AAEJ;;;AC5FA,SAAS,UAAAK,SAAqB,gBAAgB;AAC9C,SAAS,SAAAC,cAAa;AA4BlB,gBAAAC,aAAA;AAnBG,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAU;AACR,QAAM,QAAQ,SAAS;AACvB,QAAM,aAAa,MAAM,QAAQ,SAAS;AAC1C,QAAM,kBAAkB,SACpB,aACE,MAAM,QAAQ,KAAK,GAAG,IACtB,MAAM,QAAQ,OAAO,QACvB;AACJ,QAAM,YAAY,SACd,MAAM,QAAQ,KAAK,UACnB,MAAM,QAAQ,KAAK;AACvB,QAAM,SAAS,SAAS,UAAU;AAClC,SACE,gBAAAA;AAAA,IAACF;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,QACF;AAAA,QACA,OAAO;AAAA,QACP,cAAc;AAAA,QACd;AAAA,QACA,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,QAAQ,QAAQ,SAAS;AAAA,QACzB,GAAI,SAAS,EAAE,UAAU,QAAQ,eAAe,UAAU;AAAA,QAC1D,WAAW,SACP,eAAeC,OAAM,MAAM,QAAQ,OAAO,OAAO,IAAI,CAAC,gBACtD;AAAA,QACJ,GAAG;AAAA,MACL;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;ACnDA,SAAS,SAAAE,QAAmB,YAAAC,iBAAgB;AAWxC,gBAAAC,aAAA;AAJG,SAAS,qBAAqB,EAAE,UAAU,IAAI,GAAG,MAAM,GAAU;AACtE,QAAM,QAAQD,UAAS;AACvB,QAAM,aAAa,MAAM,QAAQ,SAAS;AAC1C,SACE,gBAAAC;AAAA,IAACF;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,GAAG;AAAA,MACH,cAAa;AAAA,MACb,KAAK;AAAA,MACL,IAAI;AAAA,QACF,iBAAiB,aACb,MAAM,QAAQ,KAAK,GAAG,IACtB,MAAM,QAAQ,KAAK,GAAG;AAAA,QAC1B,GAAG;AAAA,MACL;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;;;AC3BA,SAAgB,eAAe,YAAY,kBAAkB;AAC7D;AAAA,EACE;AAAA,EAEA,OAAAG;AAAA,EACA;AAAA,EACA,kBAAAC;AAAA,EACA;AAAA,EAEA,aAAAC;AAAA,EACA,cAAAC;AAAA,OACK;AAEP,SAAS,kBAAkB,gBAAgB,cAAAC,mBAAkB;AAqDzD,SAgGiB,YAAAC,WAhGjB,OAAAC,OA0DU,QAAAC,cA1DV;AAxBJ,IAAM,gBAAgB,cAKnB;AAAA,EACD,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,eAAe;AAAA,EACf,OAAO;AACT,CAAC;AAMD,SAAS,OAAO;AAAA,EACd;AAAA,EACA,UAAU;AACZ,GAGG;AACD,SACE,gBAAAD;AAAA,IAACN;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,IAAI;AAAA,QACF,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,gBAAgB;AAAA,QAChB,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,IAAI,YAAY,SAAS,QAAQ;AAAA,QACjC,cAAc;AAAA,QACd,SAAS;AAAA,QACT,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,WAAW;AAAA,QACX,YAAY,CAAC,UAAiB,MAAM,WAAW;AAAA,QAC/C,QAAQ;AAAA,QACR,SAAS,EAAE,OAAO,IAAI,QAAQ,GAAG;AAAA,MACnC;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ;AAMA,IAAM,yBAAyB;AAAA,EAC7B,SAASQ,wBAAuB,EAAE,UAAU,GAAG,MAAM,GAAG,KAAK;AAC3D,UAAM,EAAE,YAAY,SAAS,cAAc,IAAI,WAAW,aAAa;AAEvE,WACE,gBAAAD,OAAC,SAAM,KAAW,GAAG,OAClB;AAAA,oBAAc,UACb,WAEA,gBAAAD;AAAA,QAACH;AAAA,QAAA;AAAA,UACC,SAAQ;AAAA,UACR,OAAM;AAAA,UACN,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI;AAAA,UAEpB;AAAA;AAAA,MACH;AAAA,MAED,cACC,gBAAAI;AAAA,QAACP;AAAA,QAAA;AAAA,UACC,IAAI;AAAA,YACF,WAAW,CAAC,EAAE,QAAQ,MACpB,eAAe,QAAQ,SAAS,SAAS;AAAA,YAC3C,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,KAAK;AAAA,YACL,GAAG;AAAA,UACL;AAAA,UAEA;AAAA,4BAAAO,OAACP,OAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,8BAAAO,OAACP,OAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,IAAI,GACzD;AAAA,gCAAAM,MAAC,UACC,0BAAAA,MAAC,oBAAiB,GACpB;AAAA,gBACA,gBAAAA,MAAC,UACC,0BAAAA,MAAC,kBAAe,GAClB;AAAA,iBACF;AAAA,cACA,gBAAAA;AAAA,gBAACH;AAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,YAAY,CAAC,UAAU,MAAM,WAAW;AAAA,kBACxC,OAAM;AAAA,kBACP;AAAA;AAAA,cAED;AAAA,eACF;AAAA,YACA,gBAAAI,OAACP,OAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACvD;AAAA,8BAAAM,MAAC,UAAO,SAAQ,QAAO,mBAAK;AAAA,cAC5B,gBAAAA;AAAA,gBAACH;AAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,YAAY,CAAC,UAAU,MAAM,WAAW;AAAA,kBACxC,OAAM;AAAA,kBACP;AAAA;AAAA,cAED;AAAA,eACF;AAAA;AAAA;AAAA,MACF;AAAA,OAEJ;AAAA,EAEJ;AACF;AAMA,SAAS,cAAc,EAAE,MAAM,MAAM,GAAoC;AACvE,MAAI,CAAC,MAAO,QAAO,gBAAAG,MAAAD,WAAA,EAAG,gBAAK;AAE3B,QAAM,QAAQ,KAAK,YAAY,EAAE,QAAQ,MAAM,YAAY,CAAC;AAC5D,MAAI,UAAU,GAAI,QAAO,gBAAAC,MAAAD,WAAA,EAAG,gBAAK;AAEjC,QAAM,SAAS,KAAK,MAAM,GAAG,KAAK;AAClC,QAAM,QAAQ,KAAK,MAAM,OAAO,QAAQ,MAAM,MAAM;AACpD,QAAM,QAAQ,KAAK,MAAM,QAAQ,MAAM,MAAM;AAE7C,SACE,gBAAAE,OAAAF,WAAA,EACG;AAAA;AAAA,IACD,gBAAAC;AAAA,MAACN;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,IAAI;AAAA,UACF,SAAS;AAAA,UACT,cAAc;AAAA,UACd,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,eAAe;AAAA,QACjB;AAAA,QAEC;AAAA;AAAA,IACH;AAAA,IACC;AAAA,KACH;AAEJ;AAMA,SAAS,0BAA0B;AAAA,EACjC;AAAA,EACA,OAAO;AACT,GAGG;AACD,QAAM,EAAE,MAAM,IAAI,WAAW,aAAa;AAC1C,QAAM,EAAE,KAAK,GAAG,KAAK,IAAI;AACzB,QAAM,WAAW;AACjB,QAAM,QAAQ,OAAO,iBAAiB,MAAM,GAAG,QAAQ,KAAK,CAAC;AAC7D,QAAM,YAAY,OAAO,iBAAiB,UAAU,KAAK;AAEzD,SACE,gBAAAO;AAAA,IAAC;AAAA;AAAA,MAEE,GAAG;AAAA,MACJ,OAAO;AAAA,QACL,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,KAAK;AAAA,QACL,GAAG,KAAK;AAAA,MACV;AAAA,MAEC;AAAA,eAAO,QACN,gBAAAD;AAAA,UAACN;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,YAClB;AAAA,YAEC,iBAAO;AAAA;AAAA,QACV;AAAA,QAGF,gBAAAM,MAACH,aAAA,EAAW,SAAQ,SAAQ,QAAM,MAAC,IAAI,EAAE,YAAY,EAAE,GACrD,0BAAAG,MAAC,iBAAc,MAAM,OAAO,OAAO,OAAc,GACnD;AAAA,QAEC,OAAO,YACN,gBAAAA;AAAA,UAACH;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,QAAM;AAAA,YACN,IAAI,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS,OAAO;AAAA,YAEjD,iBAAO;AAAA;AAAA,QACV;AAAA,QAGD,MAAM,SAAS,KACd,gBAAAI;AAAA,UAACP;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,IAAI;AAAA,cACF,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,IAAI;AAAA,cACJ,YAAY;AAAA,cACZ,IAAI;AAAA,YACN;AAAA,YAEC;AAAA,oBAAM,IAAI,CAAC,MAAM,MAChB,gBAAAM;AAAA,gBAAC;AAAA;AAAA,kBAEC,MAAK;AAAA,kBACL,OAAO,KAAK;AAAA,kBACZ,IAAI;AAAA,oBACF,SAAS;AAAA,oBACT,cAAc;AAAA,oBACd,aAAa,CAAC,EAAE,QAAQ,MAAa,QAAQ,SAAS;AAAA,oBACtD,SAAS;AAAA,oBACT,oBAAoB;AAAA,sBAClB,YAAY;AAAA,sBACZ,YAAY,CAAC,UACX,MAAM,WAAW;AAAA,oBACrB;AAAA,kBACF;AAAA;AAAA,gBAbK;AAAA,cAcP,CACD;AAAA,cACA,WAAW,KACV,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAO,IAAI,QAAQ;AAAA,kBACnB,IAAI;AAAA,oBACF,SAAS;AAAA,oBACT,cAAc;AAAA,oBACd,aAAa,CAAC,EAAE,QAAQ,MAAa,QAAQ,SAAS;AAAA,oBACtD,SAAS;AAAA,oBACT,oBAAoB;AAAA,sBAClB,YAAY;AAAA,sBACZ,YAAY,CAAC,UACX,MAAM,WAAW;AAAA,oBACrB;AAAA,kBACF;AAAA;AAAA,cACF;AAAA;AAAA;AAAA,QAEJ;AAAA,QAGD,OAAO,WACN,gBAAAA;AAAA,UAACN;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,IAAI;AAAA,cACF,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,YAAY;AAAA,cACZ,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,IAAI,MAAM,SAAS,IAAI,IAAI;AAAA,cAC3B,YAAY;AAAA,cACZ,sBAAsB,EAAE,UAAU,GAAG;AAAA,YACvC;AAAA,YAEC,iBAAO;AAAA;AAAA,QACV;AAAA;AAAA;AAAA,IA3GG;AAAA,EA6GP;AAEJ;AAMO,SAAS,kBAAkB;AAAA,EAChC,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,UAAU,CAAC;AAAA,EACX,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA2B;AACzB,QAAM,aAAa,QAAQ,SAAS;AAEpC,QAAM,eAAgC,CAAC,OAAO,OAAO,QAAQ,YAAY;AACvE,QAAI,SAAS,OAAO,UAAU,YAAY,MAAM,SAAS;AACvD,YAAM,QAAQ;AAAA,IAChB;AACA,eAAW,OAAO,OAAO,QAAQ,OAAO;AAAA,EAC1C;AAEA,QAAM,oBAA0C,CAAC,OAAO,OAAO,WAAW;AACxE,QAAI,kBAAkB,WAAW,kBAAkB,WAAW,UAAU;AACtE,sBAAgB,OAAO,IAAI,MAAM;AACjC;AAAA,IACF;AACA,oBAAgB,OAAO,OAAO,MAAM;AAAA,EACtC;AAEA,SACE,gBAAAM;AAAA,IAAC,cAAc;AAAA,IAAd;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,kBAAkB;AAAA,MAC3B;AAAA,MAEA,0BAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,UACA,UAAU;AAAA,UACV,eAAe;AAAA,UACf,aACE,gBAAAA,MAACH,aAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,2BAEnD;AAAA,UAEF,UAAQ;AAAA,UACR,eAAe,CAAC,MAAM;AAAA,UACtB,gBAAgB,CAAC,WACf,OAAO,WAAW,WAAW,SAAS,OAAO;AAAA,UAE/C,eAAe;AAAA,UACf,OAAO,EAAE,OAAO,uBAAuB;AAAA,UACvC,WAAW;AAAA,YACT,SAAS;AAAA,cACP,IAAI;AAAA,gBACF,6BAA6B;AAAA,kBAC3B,cAAc;AAAA,gBAChB;AAAA,gBACA,4DAA4D;AAAA,kBAC1D,SAAS;AAAA,gBACX;AAAA,gBACA,8DAA8D;AAAA,kBAC5D,SAAS;AAAA,gBACX;AAAA,gBACA,kDAAkD;AAAA,kBAChD,YAAY;AAAA,gBACd;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,UACA,aAAa,CAAC,WACZ,gBAAAG;AAAA,YAACJ;AAAA,YAAA;AAAA,cACE,GAAG;AAAA,cACJ;AAAA,cACA,WAAS;AAAA,cACT,IAAI;AAAA,gBACF,4BAA4B,EAAE,SAAS,iBAAiB;AAAA,gBACxD,yBAAyB,EAAE,aAAa,iBAAiB;AAAA,cAC3D;AAAA,cACA,WAAW;AAAA,gBACT,OAAO;AAAA,kBACL,GAAG,OAAO;AAAA,kBACV,gBACE,gBAAAK,OAAAF,WAAA,EACE;AAAA,oCAAAC,MAACL,iBAAA,EAAe,UAAS,SACvB,0BAAAK,MAACF,aAAA,EAAW,GACd;AAAA,oBACC,OAAO,WAAW;AAAA,qBACrB;AAAA,gBAEJ;AAAA,cACF;AAAA;AAAA,UACF;AAAA,UAEF,cAAc,CAAC,aAAa,WAC1B,gBAAAE;AAAA,YAAC;AAAA;AAAA,cAEC;AAAA,cACA,OAAO;AAAA;AAAA,YAFF,YAAY;AAAA,UAGnB;AAAA,UAED,GAAG;AAAA;AAAA,MACN;AAAA;AAAA,EACF;AAEJ;","names":["Stack","jsx","Box","ListItemButton","Stack","jsx","jsxs","Stack","jsxs","Box","React","useRef","Stack","Typography","jsx","jsxs","jsx","jsx","Box","jsx","useRef","useState","jsx","jsxs","Box","React","useRef","Stack","jsx","IconButton","Tooltip","jsx","alpha","Box","Checkbox","Popover","Typography","jsx","jsxs","Popover","alpha","Checkbox","Typography","Box","useState","IconButton","jsx","jsx","jsxs","useState","useEffect","useRef","jsx","Box","jsx","Box","jsx","jsx","Badge","Box","Divider","IconButton","Typography","useState","Fragment","jsx","jsxs","useState","Box","Typography","Badge","IconButton","Divider","Box","IconButton","InputAdornment","TextField","CloseIcon","SearchIcon","useEffect","useState","useCallback","useEffect","useRef","jsx","jsxs","useState","useEffect","InputAdornment","IconButton","CloseIcon","TextField","SearchIcon","Box","Box","Collapse","Typography","Fragment","jsx","Button","alpha","jsx","Stack","useTheme","jsx","Box","InputAdornment","TextField","Typography","SearchIcon","Fragment","jsx","jsxs","BiampGlobalSearchPaper"]}
1
+ {"version":3,"sources":["../src/BiampWrapper/BiampWrapper.tsx","../src/BiampSidebar/BiampSidebar.tsx","../src/BiampHeader/BiampHeader.tsx","../src/BiampLayout/BiampLayout.tsx","../src/BiampTable/BiampTable.tsx","../src/BiampTable/BiampTableEmptyState.tsx","../src/BiampTable/BiampTableStatusMessage.tsx","../src/BiampTable/BiampTableErrorState.tsx","../src/BiampTable/BiampTableTruncatedCell.tsx","../src/BiampTable/useLoadingDelay.ts","../src/BiampTable/BiampTableContainer.tsx","../src/BiampTable/BiampTableCellActionButton.tsx","../src/BiampTable/BiampTableColumnVisibility.tsx","../src/BiampTable/BiampTableToolbarColumnVisibility.tsx","../src/BiampTable/BiampTableToolbarActionButton.tsx","../src/BiampTable/BiampTablePagination.tsx","../src/BiampTable/BiampTableToolbar.tsx","../src/BiampTable/BiampTableToolbarActions.tsx","../src/BiampTable/BiampTableToolbarExport.tsx","../src/BiampTable/BiampTableToolbarFilters.tsx","../src/BiampTable/BiampTableToolbarSearch.tsx","../src/BiampTable/useDebouncedCallback.ts","../src/BiampTable/useBiampServerSideTable.ts","../src/BiampTable/serverSideTableUtils.ts","../src/BiampTable/exportCsv.ts","../src/BiampBanner/BiampBanner.tsx","../src/BiampSegmentedButton/SegmentedButton.tsx","../src/BiampSegmentedButton/SegmentedButtonGroup.tsx","../src/BiampGlobalSearch/BiampGlobalSearch.tsx"],"sourcesContent":["import React from 'react';\nimport { Stack, StackProps } from '@mui/material';\n\nexport type BiampWrapperProps = StackProps & {\n children?: React.ReactNode;\n};\n\n/**\n * A full-page content wrapper that stretches to fill all available space\n * with 16px padding, 8px border radius, and scrollable overflow.\n * Background: white (light) / `grey.800` (dark).\n */\nexport function BiampWrapper({ children, sx, ...props }: BiampWrapperProps) {\n return (\n <Stack\n direction=\"column\"\n padding=\"16px\"\n alignItems=\"flex-start\"\n sx={{\n flex: 1,\n height: '100%',\n width: '100%',\n borderRadius: '8px',\n overflow: 'auto',\n overscrollBehavior: 'none',\n backgroundColor: ({ palette }) =>\n palette.mode === 'dark' ? palette.grey[800] : palette.common.white,\n ...sx,\n }}\n {...props}\n >\n {children}\n </Stack>\n );\n}\n","import {\n Box,\n ListItemButton,\n ListItemButtonProps,\n Stack,\n StackProps,\n} from '@mui/material';\nimport { BiampLogoIcon } from '@bwp-web/assets';\nimport { JSX } from 'react';\n\ntype BiampSidebarProps = StackProps & {\n children: React.ReactNode;\n bottomLogoIcon?: JSX.Element;\n};\n\nexport function BiampSidebar({\n children,\n bottomLogoIcon,\n sx,\n ...props\n}: BiampSidebarProps) {\n return (\n <Stack width=\"48px\" height=\"100%\" sx={{ ...sx }} {...props}>\n <Stack height=\"100%\">{children}</Stack>\n {bottomLogoIcon ?? (\n <BiampLogoIcon sx={{ width: '48px', height: '15px' }} />\n )}\n </Stack>\n );\n}\n\ntype BiampSidebarIconList = StackProps & {\n children: React.ReactNode;\n};\n\nexport function BiampSidebarIconList({\n children,\n sx,\n ...props\n}: BiampSidebarIconList) {\n return (\n <Stack height=\"100%\" sx={{ gap: '4px', ...sx }} {...props}>\n {children}\n </Stack>\n );\n}\n\ntype BiampSidebarIconProps = ListItemButtonProps & {\n selected?: boolean;\n icon: JSX.Element;\n selectedIcon?: JSX.Element;\n};\n\nexport function BiampSidebarIcon({\n selected,\n icon,\n selectedIcon,\n sx,\n ...props\n}: BiampSidebarIconProps) {\n const displayedSelectedIcon = selectedIcon ?? icon;\n return (\n <ListItemButton\n selected={selected}\n disableGutters\n disableRipple\n sx={{\n minWidth: '48px',\n maxWidth: '48px',\n minHeight: '48px',\n maxHeight: '48px',\n borderRadius: '8px',\n justifyContent: 'center',\n alignItems: 'center',\n ...sx,\n }}\n {...props}\n >\n {selected ? displayedSelectedIcon : icon}\n </ListItemButton>\n );\n}\n\ntype BiampSidebarComponentProps = ListItemButtonProps & {\n children: React.ReactNode;\n};\n\nexport function BiampSidebarComponent({\n children,\n sx,\n ...props\n}: BiampSidebarComponentProps) {\n return (\n <Box\n sx={{\n minWidth: '48px',\n maxWidth: '48px',\n minHeight: '48px',\n maxHeight: '48px',\n borderRadius: '8px',\n overflow: 'hidden',\n justifyContent: 'center',\n alignItems: 'center',\n border: ({ palette }) => `0.6px solid ${palette.divider}`,\n ...sx,\n }}\n {...props}\n >\n {children}\n </Box>\n );\n}\n","import {\n alpha,\n Box,\n BoxProps,\n InputAdornment,\n ListItemButton,\n ListItemButtonProps,\n Popover,\n PopoverProps,\n Stack,\n StackProps,\n TextField,\n TextFieldProps,\n Typography,\n} from '@mui/material';\nimport { JSX } from 'react';\nimport { BiampRedLogo, SearchIcon } from '@bwp-web/assets';\n\ntype BiampHeaderProps = StackProps & {\n children?: React.ReactNode;\n};\n\nexport function BiampHeader({ children, sx, ...props }: BiampHeaderProps) {\n return (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n sx={{ px: 2.5, py: 1.5, ...sx }}\n {...props}\n >\n {children}\n </Stack>\n );\n}\n\ntype BiampHeaderTitleProps = BoxProps & {\n icon?: JSX.Element;\n title?: string;\n subtitle?: string;\n};\n\nexport function BiampHeaderTitle({\n icon,\n title,\n subtitle,\n sx,\n ...props\n}: BiampHeaderTitleProps) {\n return (\n <Box\n sx={{ pr: 3, display: 'flex', alignItems: 'center', gap: '12px', ...sx }}\n {...props}\n >\n {icon ? (\n <Box\n sx={{\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {icon}\n </Box>\n ) : (\n <Box\n component=\"img\"\n src={BiampRedLogo}\n alt=\"Biamp\"\n sx={{ width: 24, height: 24 }}\n />\n )}\n <Stack direction=\"row\" gap={0.5}>\n {title && <Typography variant=\"h4\">{title}</Typography>}\n {subtitle && (\n <Typography variant=\"h4\" color=\"text.secondary\">\n {subtitle}\n </Typography>\n )}\n </Stack>\n </Box>\n );\n}\n\ntype BiampHeaderSearchProps = TextFieldProps;\n\nexport function BiampHeaderSearch({ sx, ...props }: BiampHeaderSearchProps) {\n return (\n <TextField\n placeholder=\"Search...\"\n fullWidth\n sx={{\n px: 1.5,\n '& .MuiOutlinedInput-root': {\n height: '40px !important',\n minHeight: '40px',\n },\n '& .MuiOutlinedInput-input': {\n height: '40px !important',\n },\n '& .MuiOutlinedInput-notchedOutline': {\n height: '40px !important',\n border: 'none',\n boxShadow: 'none',\n },\n ...sx,\n }}\n slotProps={{\n input: {\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n },\n }}\n {...props}\n />\n );\n}\n\ntype BiampHeaderActionsProps = BoxProps & {\n children: React.ReactNode;\n};\n\nexport function BiampHeaderActions({\n children,\n sx,\n ...props\n}: BiampHeaderActionsProps) {\n return (\n <Box\n sx={{\n pl: 3,\n gap: 2,\n display: 'flex',\n alignItems: 'center',\n ...sx,\n }}\n {...props}\n >\n {children}\n </Box>\n );\n}\n\ntype BiampHeaderButtonListProps = BoxProps & {\n children: React.ReactNode;\n};\n\nexport function BiampHeaderButtonList({\n children,\n sx,\n ...props\n}: BiampHeaderButtonListProps) {\n return (\n <Box\n sx={{ display: 'flex', alignItems: 'center', gap: 0.5, ...sx }}\n {...props}\n >\n {children}\n </Box>\n );\n}\n\ntype BiampHeaderButtonProps = ListItemButtonProps & {\n icon: JSX.Element;\n selectedIcon?: JSX.Element;\n selected?: boolean;\n};\n\nexport function BiampHeaderButton({\n icon,\n selectedIcon,\n selected,\n sx,\n ...props\n}: BiampHeaderButtonProps) {\n const displayedSelectedIcon = selectedIcon ?? icon;\n return (\n <ListItemButton\n selected={selected}\n disableGutters\n disableRipple\n sx={{\n minWidth: '40px',\n maxWidth: '40px',\n minHeight: '40px',\n maxHeight: '40px',\n borderRadius: '4px',\n justifyContent: 'center',\n alignItems: 'center',\n ...sx,\n }}\n {...props}\n >\n {selected ? displayedSelectedIcon : icon}\n </ListItemButton>\n );\n}\n\ntype BiampAppPopoverProps = PopoverProps & {\n children: React.ReactNode;\n};\n\nexport function BiampAppPopover({\n children,\n open,\n sx,\n ...props\n}: BiampAppPopoverProps) {\n return (\n <Popover\n open={open}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n sx={{ ...sx }}\n transformOrigin={{ vertical: -4, horizontal: 150 }}\n slotProps={{\n paper: {\n sx: {\n borderRadius: '16px',\n backgroundImage: 'none',\n border: ({ palette }) => `0.6px solid ${palette.divider}`,\n boxShadow: ({ palette }) =>\n `0px 4px 24px 0px ${alpha(palette.common.black, 0.15)};`,\n },\n },\n }}\n {...props}\n >\n {children}\n </Popover>\n );\n}\n\ntype BiampAppDialogProps = BoxProps & {\n children: React.ReactNode;\n};\n\nexport function BiampAppDialog({\n children,\n sx,\n ...props\n}: BiampAppDialogProps) {\n return (\n <Box\n sx={{\n p: 2,\n display: 'inline-flex',\n flexWrap: 'wrap',\n gap: 1.5,\n maxWidth: '284px',\n borderRadius: '16px',\n backgroundColor: ({ palette }) =>\n palette.mode === 'dark' ? palette.grey[800] : palette.common.white,\n ...sx,\n }}\n {...props}\n >\n {children}\n </Box>\n );\n}\n\ntype BiampAppDialogItemProps = BoxProps & {\n children: React.ReactNode;\n name: string;\n};\n\nexport function BiampAppDialogItem({\n children,\n name,\n sx,\n ...props\n}: BiampAppDialogItemProps) {\n return (\n <Box\n sx={{\n width: '76px',\n height: '89px',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n cursor: 'pointer',\n justifyContent: 'center',\n gap: '4px',\n borderRadius: '12px',\n border: '0.6px solid transparent',\n transition: 'background-color 0.2s ease, border-color 0.2s ease',\n ':hover': {\n backgroundColor: ({ palette }) => alpha(palette.info.main, 0.1),\n borderColor: ({ palette }) => palette.info.main,\n },\n ...sx,\n }}\n {...props}\n >\n <Box\n sx={{\n mt: '8px',\n width: '54px',\n height: '54px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {children}\n </Box>\n <Typography\n variant=\"caption\"\n fontWeight={600}\n sx={{\n textAlign: 'center',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: '100%',\n }}\n >\n {name}\n </Typography>\n </Box>\n );\n}\n\ntype BiampHeaderProfileProps = ListItemButtonProps & {\n image: string;\n selected?: boolean;\n};\n\nexport function BiampHeaderProfile({\n image,\n selected,\n sx,\n ...props\n}: BiampHeaderProfileProps) {\n return (\n <ListItemButton\n selected={selected}\n disableGutters\n disableRipple\n sx={{\n minWidth: '36px',\n maxWidth: '36px',\n minHeight: '36px',\n maxHeight: '36px',\n borderRadius: '6px',\n justifyContent: 'center',\n alignItems: 'center',\n ...sx,\n }}\n {...props}\n >\n <Box\n component=\"img\"\n src={image}\n alt={'Profile Image'}\n sx={{\n width: 32,\n height: 32,\n borderRadius: '4px',\n border: ({ palette }) =>\n `0.6px solid var(--Divider-divider_primary, ${alpha(palette.background.paper, 0.15)})`,\n }}\n />\n </ListItemButton>\n );\n}\n","import { Stack, StackProps } from '@mui/material';\nimport React from 'react';\n\ntype BiampLayoutProps = StackProps & {\n header?: React.ReactNode;\n sidebar?: React.ReactNode;\n children: React.ReactNode;\n};\n\nexport function BiampLayout({\n header,\n sidebar,\n children,\n sx,\n ...props\n}: BiampLayoutProps) {\n return (\n <Stack\n direction=\"column\"\n height=\"100vh\"\n sx={{\n backgroundColor: ({ palette }) =>\n palette.mode === 'dark' ? palette.grey[900] : palette.grey[100],\n ...sx,\n }}\n {...props}\n >\n {header}\n <Stack\n direction=\"row\"\n flex={1}\n minHeight={0}\n gap={{ xs: 1.5, md: 2.5 }}\n px={{ xs: 1.5, md: 2.5 }}\n pb={{ xs: 1.5, md: 2.5 }}\n pt={{ xs: header ? 0 : 1.5, md: header ? 0 : 2.5 }}\n >\n {sidebar}\n {children}\n </Stack>\n </Stack>\n );\n}\n","import {\n Box,\n type BoxProps,\n Checkbox,\n IconButton,\n Table as MuiTable,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n TableSortLabel,\n type Theme,\n} from '@mui/material';\nimport {\n ChevronDownIcon,\n ChevronRightIcon,\n DropdownChevronDownIcon,\n DropdownChevronUpIcon,\n} from '@bwp-web/assets';\nimport { flexRender, type Row, type Table } from '@tanstack/react-table';\nimport React, { type ReactNode, useRef } from 'react';\nimport { BiampTableEmptyState } from './BiampTableEmptyState';\nimport { BiampTableErrorState } from './BiampTableErrorState';\nimport { BiampTableTruncatedCell } from './BiampTableTruncatedCell';\nimport { useLoadingDelay } from './useLoadingDelay';\n\n// ── Row-click props ────────────────────────────────────────────────\ntype RowClickProps<TData> =\n | {\n /** Called when a clickable body row is clicked. Receives the row's original data. */\n onRowClick: (row: TData) => void;\n /**\n * Controls which rows are clickable. When omitted, all rows are clickable if\n * `onRowClick` is provided.\n */\n isRowClickable?: (row: TData) => boolean;\n }\n | {\n onRowClick?: undefined;\n isRowClickable?: never;\n };\n\n// ── Selection + expanding props ────────────────────────────────────\ntype SelectionExpandingProps = {\n /** When true, renders a checkbox column for row selection. */\n enableRowSelection?: boolean;\n /** When true, renders an expand/collapse toggle column for rows that have sub-rows. */\n enableExpanding?: boolean;\n /** When true, hides the \"select all\" header checkbox while keeping individual row checkboxes. Only applies when `enableRowSelection` is true. */\n hideSelectAll?: boolean;\n /** When true, selecting a parent row also selects/deselects its children. Only applies when both `enableRowSelection` and `enableExpanding` are true. @default false */\n selectChildrenWithParent?: boolean;\n};\n\nexport type BiampTableProps<TData> = BoxProps &\n RowClickProps<TData> &\n SelectionExpandingProps & {\n /** TanStack Table instance to connect to. */\n table: Table<TData>;\n /** When true, shows a LinearProgress bar below the table header. */\n loading?: boolean;\n /** When truthy, shown in place of table body rows. Pass `true` or an `Error` for the default error state (an `Error`'s message is displayed), or a custom ReactNode. */\n error?: boolean | Error | ReactNode;\n /** When truthy and the table has no rows, shown instead of an empty body. Pass `true` for the default empty state, or a custom ReactNode. */\n empty?: boolean | ReactNode;\n /** Returns a human-readable name for a row, used in ARIA labels (e.g. \"Select: Conference Room A\"). Falls back to row index. */\n getRowLabel?: (row: TData) => string;\n };\n\n// ── Shared sx helpers ────────────────────────────────────────────\n\nconst overlaySx = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n pointerEvents: 'none',\n} as const;\n\nconst stickyHoverBg = {\n '.MuiTableRow-hover:hover > &, .Mui-selected > &': {\n bgcolor: ({ palette }: Theme) =>\n palette.mode === 'dark' ? palette.grey[800] : palette.grey[100],\n },\n} as const;\n\nfunction cellSx(\n sticky: 'left' | 'right' | undefined,\n minWidth: number | string | undefined,\n zIndex: number,\n) {\n if (sticky) {\n return {\n position: 'sticky',\n [sticky]: 0,\n zIndex,\n width: 0,\n whiteSpace: 'nowrap',\n textAlign: 'center',\n bgcolor: 'background.paper',\n ...(zIndex < 3 && stickyHoverBg),\n } as const;\n }\n const mw = minWidth ?? 40;\n return {\n minWidth: mw,\n whiteSpace: 'nowrap',\n '&:has([data-truncate])': { maxWidth: mw, whiteSpace: 'normal' },\n };\n}\n\n// ── Hoisted sx objects (avoid re-creation per row per render) ────\n\nconst rowCursorPointerSx = { cursor: 'pointer' } as const;\n\nconst selectionCellSx = {\n position: 'sticky',\n left: 0,\n zIndex: 2,\n bgcolor: 'background.paper',\n ...stickyHoverBg,\n} as const;\n\nconst checkboxHiddenSx = { visibility: 'hidden' } as const;\n\nconst expandCellBaseSx = {\n display: 'flex',\n alignItems: 'center',\n gap: '2px',\n} as const;\n\nconst expandPlaceholderSx = { width: 28 } as const;\n\nconst headerSelectionCellSx = {\n position: 'sticky',\n left: 0,\n zIndex: 3,\n bgcolor: 'background.paper',\n} as const;\n\nconst checkboxHiddenHeaderSx = { visibility: 'hidden' } as const;\n\n// ── Memoized row ─────────────────────────────────────────────────\n\ntype BiampTableRowProps<TData> = {\n row: Row<TData>;\n isExpanded: boolean;\n isSelected: boolean;\n onRowClick?: (row: TData) => void;\n isRowClickable?: (row: TData) => boolean;\n enableRowSelection: boolean;\n enableExpanding: boolean;\n selectChildrenWithParent: boolean;\n getRowLabel?: (row: TData) => string;\n hasExpandableRows: boolean;\n};\n\nfunction BiampTableRowInner<TData>({\n row,\n isExpanded,\n isSelected,\n onRowClick,\n isRowClickable,\n enableRowSelection,\n enableExpanding,\n selectChildrenWithParent,\n getRowLabel,\n hasExpandableRows,\n}: BiampTableRowProps<TData>) {\n const clickable = onRowClick\n ? isRowClickable\n ? isRowClickable(row.original)\n : true\n : false;\n\n return (\n <TableRow\n key={row.id}\n hover={clickable}\n selected={enableRowSelection ? isSelected : undefined}\n role={clickable ? 'button' : undefined}\n tabIndex={clickable ? 0 : undefined}\n sx={clickable ? rowCursorPointerSx : undefined}\n onClick={\n clickable && onRowClick ? () => onRowClick(row.original) : undefined\n }\n onKeyDown={\n clickable && onRowClick\n ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onRowClick(row.original);\n }\n }\n : undefined\n }\n >\n {enableRowSelection && (\n <TableCell padding=\"checkbox\" sx={selectionCellSx}>\n <Checkbox\n checked={isSelected}\n disabled={!row.getCanSelect()}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n row.toggleSelected(e.target.checked, {\n selectChildren: selectChildrenWithParent,\n })\n }\n onClick={(e) => e.stopPropagation()}\n sx={!row.getCanSelect() ? checkboxHiddenSx : undefined}\n slotProps={{\n input: {\n 'aria-label': getRowLabel\n ? `Select ${getRowLabel(row.original)}`\n : `Select row ${row.index + 1}`,\n },\n }}\n />\n </TableCell>\n )}\n {row.getVisibleCells().map((cell, cellIndex, cells) => {\n const sticky = cell.column.columnDef.meta?.sticky;\n const isExpandCell =\n enableExpanding &&\n !sticky &&\n cellIndex ===\n cells.findIndex((c) => !c.column.columnDef.meta?.sticky);\n\n const content = flexRender(\n cell.column.columnDef.cell,\n cell.getContext(),\n );\n\n return (\n <TableCell\n key={cell.id}\n data-sticky={sticky || undefined}\n sx={{\n ...cellSx(sticky, cell.column.columnDef.meta?.minWidth, 2),\n pl: isExpandCell ? '6px' : '12px',\n }}\n >\n {(() => {\n if (sticky) return content;\n\n const truncate = cell.column.columnDef.meta?.truncate ?? true;\n const truncated = truncate ? (\n <BiampTableTruncatedCell>{content}</BiampTableTruncatedCell>\n ) : (\n content\n );\n\n if (!isExpandCell) return truncated;\n\n const rowLabel = getRowLabel\n ? getRowLabel(row.original)\n : `row ${row.index + 1}`;\n\n return (\n <Box\n sx={\n row.depth > 0\n ? { ...expandCellBaseSx, pl: `${row.depth * 12}px` }\n : expandCellBaseSx\n }\n >\n {row.getCanExpand() ? (\n <IconButton\n variant=\"none\"\n onClick={(e) => {\n e.stopPropagation();\n row.toggleExpanded();\n }}\n aria-label={\n isExpanded\n ? `Collapse ${rowLabel}`\n : `Expand ${rowLabel}`\n }\n aria-expanded={isExpanded}\n >\n {isExpanded ? (\n <ChevronDownIcon\n variant=\"xs\"\n sx={{\n color: ({ palette }) => palette.text.secondary,\n }}\n />\n ) : (\n <ChevronRightIcon\n variant=\"xs\"\n sx={{\n color: ({ palette }) => palette.text.secondary,\n }}\n />\n )}\n </IconButton>\n ) : hasExpandableRows ? (\n <Box sx={expandPlaceholderSx} />\n ) : null}\n {truncated}\n </Box>\n );\n })()}\n </TableCell>\n );\n })}\n </TableRow>\n );\n}\n\nfunction biampTableRowPropsAreEqual<TData>(\n prev: BiampTableRowProps<TData>,\n next: BiampTableRowProps<TData>,\n) {\n return (\n prev.row.id === next.row.id &&\n prev.row.original === next.row.original &&\n prev.isSelected === next.isSelected &&\n prev.isExpanded === next.isExpanded &&\n prev.row.getVisibleCells().length === next.row.getVisibleCells().length &&\n prev.enableRowSelection === next.enableRowSelection &&\n prev.enableExpanding === next.enableExpanding &&\n prev.hasExpandableRows === next.hasExpandableRows &&\n prev.selectChildrenWithParent === next.selectChildrenWithParent &&\n prev.onRowClick === next.onRowClick &&\n prev.isRowClickable === next.isRowClickable &&\n prev.getRowLabel === next.getRowLabel\n );\n}\n\nconst BiampTableRow = React.memo(\n BiampTableRowInner,\n biampTableRowPropsAreEqual,\n) as typeof BiampTableRowInner;\n\n// ── Component ────────────────────────────────────────────────────\n\nexport function BiampTable<TData>({\n table,\n onRowClick,\n isRowClickable,\n loading,\n error,\n empty,\n enableRowSelection = false,\n enableExpanding = false,\n hideSelectAll,\n selectChildrenWithParent = false,\n getRowLabel,\n sx,\n ...boxProps\n}: BiampTableProps<TData>) {\n // Sum visible column min-widths so the <table> element itself gets a concrete\n // minWidth. Without this, `width: 100%` on the table always fills the container\n // and columns just share available space instead of overflowing horizontally.\n const tableMinWidth = table.getVisibleLeafColumns().reduce(\n (sum, col) => {\n const mw = col.columnDef.meta?.minWidth;\n return sum + (typeof mw === 'number' ? mw : 40);\n },\n enableRowSelection ? 48 : 0,\n );\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n const showLoading = useLoadingDelay(!!loading);\n\n const rows = table.getRowModel().rows;\n const hasExpandableRows =\n enableExpanding && rows.some((r) => r.getCanExpand());\n const showError = !!error && !loading;\n const showEmpty = !showError && !loading && rows.length === 0;\n\n return (\n <TableContainer\n component={Box}\n {...boxProps}\n ref={containerRef}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n position: 'relative',\n ...sx,\n }}\n >\n <MuiTable\n aria-busy={showLoading || undefined}\n sx={{ minWidth: tableMinWidth, tableLayout: 'auto' }}\n >\n <TableHead>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {enableRowSelection && (\n <TableCell padding=\"checkbox\" sx={headerSelectionCellSx}>\n {!hideSelectAll && (\n <Checkbox\n checked={table.getIsAllPageRowsSelected()}\n indeterminate={table.getIsSomePageRowsSelected()}\n onChange={table.getToggleAllPageRowsSelectedHandler()}\n sx={\n rows.length === 0 ? checkboxHiddenHeaderSx : undefined\n }\n slotProps={{ input: { 'aria-label': 'Select all rows' } }}\n />\n )}\n </TableCell>\n )}\n {headerGroup.headers.map((header) => {\n const sticky = header.column.columnDef.meta?.sticky;\n return (\n <TableCell\n key={header.id}\n data-sticky={sticky || undefined}\n sortDirection={header.column.getIsSorted() || false}\n {...(header.column.getCanSort() && {\n 'aria-sort': header.column.getIsSorted()\n ? header.column.getIsSorted() === 'asc'\n ? 'ascending'\n : 'descending'\n : 'none',\n })}\n sx={cellSx(\n sticky,\n header.column.columnDef.meta?.minWidth,\n 3,\n )}\n >\n {header.isPlaceholder ? null : header.column.getCanSort() ? (\n <TableSortLabel\n active={!!header.column.getIsSorted()}\n direction={header.column.getIsSorted() || 'asc'}\n onClick={header.column.getToggleSortingHandler()}\n {...(header.column.getIsSorted() && {\n IconComponent:\n header.column.getIsSorted() === 'asc'\n ? DropdownChevronUpIcon\n : DropdownChevronDownIcon,\n })}\n >\n {flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </TableSortLabel>\n ) : (\n flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )\n )}\n </TableCell>\n );\n })}\n </TableRow>\n ))}\n </TableHead>\n\n <TableBody sx={{ opacity: showLoading ? 0.3 : 1 }}>\n {!showError &&\n rows.map((row) => (\n <BiampTableRow\n key={row.id}\n row={row}\n isExpanded={row.getIsExpanded()}\n isSelected={row.getIsSelected()}\n onRowClick={onRowClick}\n isRowClickable={isRowClickable}\n enableRowSelection={enableRowSelection}\n enableExpanding={enableExpanding}\n selectChildrenWithParent={selectChildrenWithParent}\n getRowLabel={getRowLabel}\n hasExpandableRows={hasExpandableRows}\n />\n ))}\n </TableBody>\n </MuiTable>\n\n {showError && (\n <Box sx={overlaySx}>\n {error === true ? (\n <BiampTableErrorState sx={{ pointerEvents: 'auto' }} />\n ) : error instanceof Error ? (\n <BiampTableErrorState\n description={error.message}\n sx={{ pointerEvents: 'auto' }}\n />\n ) : (\n error\n )}\n </Box>\n )}\n\n {showEmpty && (\n <Box sx={overlaySx}>\n {empty && empty !== true ? (\n empty\n ) : (\n <BiampTableEmptyState sx={{ pointerEvents: 'auto' }} />\n )}\n </Box>\n )}\n </TableContainer>\n );\n}\n","import { NoResultsIcon } from '@bwp-web/assets';\nimport {\n BiampTableStatusMessage,\n type BiampTableStatusMessageProps,\n} from './BiampTableStatusMessage';\n\nexport type BiampTableEmptyStateProps = Partial<BiampTableStatusMessageProps>;\n\nexport function BiampTableEmptyState({\n icon = <NoResultsIcon />,\n title = 'Nothing to show',\n ...rest\n}: BiampTableEmptyStateProps) {\n return (\n <BiampTableStatusMessage\n role=\"status\"\n icon={icon}\n title={title}\n {...rest}\n />\n );\n}\n","import { Stack, type StackProps, Typography } from '@mui/material';\nimport { cloneElement, type JSX, type ReactNode } from 'react';\n\nexport type BiampTableStatusMessageProps = StackProps & {\n /** Required icon element rendered at 56×56. */\n icon: JSX.Element;\n /** Required title text. */\n title: string;\n /** Optional description text. */\n description?: string;\n /** Optional extra content (e.g. retry buttons). */\n children?: ReactNode;\n};\n\nexport function BiampTableStatusMessage({\n icon,\n title,\n description,\n children,\n ...stackProps\n}: BiampTableStatusMessageProps) {\n return (\n <Stack alignItems=\"center\" gap={1.5} {...stackProps}>\n {cloneElement(icon, {\n 'aria-hidden': true,\n sx: { width: 56, height: 56, ...icon.props.sx },\n })}\n <Typography variant=\"h2\">{title}</Typography>\n {description && <Typography variant=\"body1\">{description}</Typography>}\n {children}\n </Stack>\n );\n}\n","import { ServiceNotReachableIcon } from '@bwp-web/assets';\nimport {\n BiampTableStatusMessage,\n type BiampTableStatusMessageProps,\n} from './BiampTableStatusMessage';\n\nexport type BiampTableErrorStateProps = Partial<BiampTableStatusMessageProps>;\n\nexport function BiampTableErrorState({\n icon = <ServiceNotReachableIcon />,\n title = 'Failed to load',\n ...rest\n}: BiampTableErrorStateProps) {\n return (\n <BiampTableStatusMessage role=\"alert\" icon={icon} title={title} {...rest} />\n );\n}\n","import { Box, Tooltip } from '@mui/material';\nimport React, { useCallback, useRef, useState } from 'react';\n\n/**\n * Renders cell content with single-line truncation (ellipsis).\n * A tooltip showing the full text appears only when the content is actually truncated.\n * The Tooltip popup is only mounted when `open` is true, so there is zero DOM\n * overhead for non-truncated cells.\n */\nexport function BiampTableTruncatedCell({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const textRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n\n const handleMouseEnter = useCallback(() => {\n const el = textRef.current;\n if (el && el.scrollWidth > el.clientWidth) {\n setOpen(true);\n }\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n setOpen(false);\n }, []);\n\n return (\n <Tooltip\n title={children}\n open={open}\n arrow\n placement=\"top\"\n disableInteractive\n >\n <Box\n data-truncate\n ref={textRef}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n sx={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n minWidth: 0,\n }}\n >\n {children}\n </Box>\n </Tooltip>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\n\ntype Status = 'idle' | 'delaying' | 'loading' | 'ending';\n\n/**\n * Delays showing a loading indicator so that fast loads don't cause a flicker.\n *\n * State machine:\n * idle ──(loading=true)──▶ delaying ──(delay ms)──▶ loading ──(minDuration ms)──▶ ending\n * ▲ │ │\n * └──(loading=false)───────┘ └────────(loading=false)──────┘\n *\n * - Waits `delay` ms before showing the indicator.\n * - Once shown, keeps it visible for at least `minDuration` ms.\n * - If loading finishes before the delay, no indicator is shown at all.\n */\nexport function useLoadingDelay(\n loading: boolean,\n { delay = 150, minDuration = 500 } = {},\n): boolean {\n const [status, setStatus] = useState<Status>('idle');\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n function clearPending() {\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n }\n\n useEffect(() => {\n if (loading && status === 'idle') {\n clearPending();\n\n // After the initial delay, show the indicator and schedule end.\n timeoutRef.current = setTimeout(() => {\n timeoutRef.current = setTimeout(() => {\n setStatus('ending');\n }, minDuration);\n\n setStatus('loading');\n }, delay);\n\n setStatus('delaying');\n }\n\n if (!loading && status !== 'loading') {\n clearPending();\n setStatus('idle');\n }\n }, [loading, delay, minDuration, status]);\n\n useEffect(() => clearPending, []);\n\n return status === 'loading' || status === 'ending';\n}\n","import { Stack, StackProps } from '@mui/material';\n\nexport type BiampTableContainerProps = {\n /** Show a top border. @default true */\n withBorderTop?: boolean;\n /** Show a bottom border. @default false */\n withBorderBottom?: boolean;\n} & StackProps;\n\nexport function BiampTableContainer({\n withBorderTop = true,\n withBorderBottom = false,\n children,\n sx,\n ...props\n}: BiampTableContainerProps) {\n return (\n <Stack\n direction=\"column\"\n height=\"100%\"\n overflow=\"hidden\"\n px={{ xs: 2, sm: 3, xl: 12.5 }}\n py={{ xs: 0, md: 1.5 }}\n gap={{ xs: 0, md: 1 }}\n borderTop={\n withBorderTop\n ? ({ palette }) => `0.6px solid ${palette.divider}`\n : undefined\n }\n borderBottom={\n withBorderBottom\n ? ({ palette }) => `0.6px solid ${palette.divider}`\n : undefined\n }\n sx={{ ...sx }}\n {...props}\n >\n {children}\n </Stack>\n );\n}\n","import { IconButton, type IconButtonProps, Tooltip } from '@mui/material';\nimport type React from 'react';\n\nexport type BiampTableCellActionButtonProps<\n C extends React.ElementType = 'button',\n> = {\n /** Tooltip label for the action button. */\n label: string;\n /** Icon to display inside the button. */\n icon: React.ReactNode;\n} & IconButtonProps<C, { component?: C }>;\n\n/** Icon button with a tooltip, designed for use inside table cell action columns. */\nexport function BiampTableCellActionButton<\n C extends React.ElementType = 'button',\n>({ label, icon, ...props }: BiampTableCellActionButtonProps<C>) {\n return (\n <Tooltip\n title={label}\n placement=\"top\"\n enterDelay={500}\n enterNextDelay={500}\n disableInteractive\n >\n <span>\n <IconButton aria-label={label} {...props}>\n {icon}\n </IconButton>\n </span>\n </Tooltip>\n );\n}\n","import {\n alpha,\n Box,\n Checkbox,\n Divider,\n List,\n ListItem,\n Popover,\n type PopoverProps,\n Typography,\n type SxProps,\n type Theme,\n} from '@mui/material';\nimport type { Table, VisibilityState } from '@tanstack/react-table';\nimport './tanstack-meta';\n\n/**\n * A looser alternative to TanStack's `VisibilityState` (`Record<string, boolean>`).\n * Accepts `Partial<Record<string, boolean>>` so callers don't need to cast\n * from URL params or partial objects. Internally, `undefined` values are\n * treated as `true` (visible).\n */\nexport type ColumnVisibility = Partial<Record<string, boolean>>;\n\n/**\n * Converts a `ColumnVisibility` to TanStack's `VisibilityState`.\n * Use this when passing to `useReactTable({ state: { columnVisibility } })`.\n */\nexport function toVisibilityState(\n visibility: ColumnVisibility,\n): VisibilityState {\n return visibility as VisibilityState;\n}\n\n/**\n * Reads `meta.defaultVisible` from all leaf columns and returns a\n * `ColumnVisibility` map. Columns without `defaultVisible` are omitted\n * (treated as visible by default).\n */\nexport function getDefaultColumnVisibility<TData>(\n table: Table<TData>,\n): ColumnVisibility {\n const result: ColumnVisibility = {};\n for (const col of table.getAllLeafColumns()) {\n const dv = col.columnDef.meta?.defaultVisible;\n if (dv !== undefined) result[col.id] = dv;\n }\n return result;\n}\n\n/**\n * Returns the number of columns whose visibility differs from the default.\n * When `defaultVisibility` is omitted, auto-derives from `meta.defaultVisible`\n * on each column definition.\n */\nexport function getColumnVisibilityDirtyCount<TData>(\n table: Table<TData>,\n defaultVisibility?: ColumnVisibility,\n): number {\n const current = table.getState().columnVisibility;\n const defaults = defaultVisibility ?? getDefaultColumnVisibility(table);\n let count = 0;\n for (const col of table.getAllLeafColumns()) {\n const isVisible = current[col.id] ?? true;\n const wasVisible = defaults[col.id] ?? true;\n if (isVisible !== wasVisible) count++;\n }\n return count;\n}\n\nexport type BiampTableColumnVisibilityProps<TData> = Omit<\n PopoverProps,\n 'open'\n> & {\n /** TanStack Table instance to connect to. */\n table: Table<TData>;\n /** Label for the \"show all\" toggle. @default \"Show all\" */\n showAllLabel?: string;\n};\n\nconst columnListItemSx: SxProps<Theme> = {\n py: 0,\n pr: 1.5,\n pl: 0,\n alignItems: 'center',\n cursor: 'pointer',\n '&:hover': {\n backgroundColor: ({ palette }) =>\n palette.mode === 'dark' ? palette.grey[800] : palette.grey[100],\n },\n};\n\nexport function BiampTableColumnVisibility<TData>({\n table,\n showAllLabel = 'Show all',\n anchorEl,\n anchorOrigin = { vertical: 'bottom', horizontal: 'right' },\n transformOrigin = { vertical: 'top', horizontal: 'right' },\n slotProps,\n ...popoverProps\n}: BiampTableColumnVisibilityProps<TData>) {\n const allVisible = table\n .getAllLeafColumns()\n .every((col) => col.getIsVisible());\n\n return (\n <Popover\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n anchorOrigin={anchorOrigin}\n transformOrigin={transformOrigin}\n slotProps={{\n ...slotProps,\n paper: {\n sx: ({ palette }) => ({\n borderRadius: '6px',\n backgroundImage: 'none',\n border: `0.6px solid ${palette.dividers.secondary}`,\n boxShadow: `0px 1px 1px 0px ${alpha(palette.common.black, 0.05)}`,\n minWidth: '150px',\n }),\n ...((slotProps?.paper ?? {}) as Record<string, unknown>),\n },\n }}\n {...popoverProps}\n >\n <List dense disablePadding>\n <ListItem\n dense\n sx={columnListItemSx}\n onClick={() => table.toggleAllColumnsVisible(!allVisible)}\n >\n <Checkbox\n checked={allVisible}\n slotProps={{ input: { 'aria-label': `${showAllLabel} columns` } }}\n />\n <Typography variant=\"caption\" fontWeight={600}>\n {showAllLabel}\n </Typography>\n </ListItem>\n <Divider />\n <Box\n sx={{ maxHeight: 340, overflow: 'auto', overscrollBehavior: 'none' }}\n >\n {table.getAllLeafColumns().map((column) => {\n const columnName =\n column.columnDef.meta?.columnLabel ??\n (typeof column.columnDef.header === 'string'\n ? column.columnDef.header\n : column.id);\n return (\n <ListItem\n key={column.id}\n dense\n sx={columnListItemSx}\n onClick={column.getToggleVisibilityHandler()}\n >\n <Checkbox\n checked={column.getIsVisible()}\n sx={{ py: 1 }}\n slotProps={{\n input: { 'aria-label': `Show ${columnName}` },\n }}\n />\n <Typography variant=\"caption\">{columnName}</Typography>\n </ListItem>\n );\n })}\n </Box>\n </List>\n </Popover>\n );\n}\n","import { ColumnsIcon } from '@bwp-web/assets';\nimport type { Table } from '@tanstack/react-table';\nimport React, { type ReactNode, useState } from 'react';\nimport {\n BiampTableColumnVisibility,\n type ColumnVisibility,\n getColumnVisibilityDirtyCount,\n getDefaultColumnVisibility,\n} from './BiampTableColumnVisibility';\nimport {\n BiampTableToolbarActionButton,\n type BiampTableToolbarActionButtonProps,\n} from './BiampTableToolbarActionButton';\n\nexport type BiampTableToolbarColumnVisibilityProps<TData> = {\n /** TanStack Table instance to connect to. */\n table: Table<TData>;\n /** Icon for the toolbar trigger button. @default <ColumnsIcon variant=\"xs\" /> */\n icon?: ReactNode;\n /** Accessible label for the toolbar trigger button. @default \"Columns\" */\n label?: string;\n /**\n * Default column visibility map used to compute the badge count.\n * When omitted, auto-derived from `meta.defaultVisible` on each column.\n */\n defaultColumnVisibility?: ColumnVisibility;\n /** Label for the \"show all\" toggle inside the popover. @default \"Show all\" */\n showAllLabel?: string;\n} & Omit<\n BiampTableToolbarActionButtonProps,\n 'icon' | 'label' | 'onClick' | 'badgeContent' | 'onChange'\n>;\n\nexport function BiampTableToolbarColumnVisibility<TData>({\n table,\n icon = <ColumnsIcon variant=\"xs\" />,\n label = 'Columns',\n defaultColumnVisibility,\n showAllLabel,\n ...actionButtonProps\n}: BiampTableToolbarColumnVisibilityProps<TData>) {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n\n const defaults = defaultColumnVisibility ?? getDefaultColumnVisibility(table);\n const dirtyCount = getColumnVisibilityDirtyCount(table, defaults);\n\n return (\n <>\n <BiampTableToolbarActionButton\n label={label}\n icon={icon}\n badgeContent={dirtyCount}\n onClick={(e: React.MouseEvent<HTMLButtonElement>) =>\n setAnchorEl(e.currentTarget)\n }\n {...actionButtonProps}\n />\n <BiampTableColumnVisibility\n table={table}\n anchorEl={anchorEl}\n onClose={() => setAnchorEl(null)}\n showAllLabel={showAllLabel}\n />\n </>\n );\n}\n","import {\n Badge,\n type BadgeProps,\n IconButton,\n type IconButtonProps,\n} from '@mui/material';\nimport type React from 'react';\n\nexport type BiampTableToolbarActionButtonProps = {\n /** Accessible label for the icon button. */\n label: string;\n /** Icon to display inside the button. */\n icon: React.ReactNode;\n /** Optional badge content. Shown as a dot indicator when provided. */\n badgeContent?: BadgeProps['badgeContent'];\n} & Omit<IconButtonProps, 'children' | 'aria-label'>;\n\nexport function BiampTableToolbarActionButton({\n label,\n icon,\n badgeContent,\n ...props\n}: BiampTableToolbarActionButtonProps) {\n const showBadge = badgeContent != null && badgeContent !== 0;\n\n return (\n <IconButton\n aria-label={showBadge ? `${label} (${badgeContent})` : label}\n {...props}\n >\n {showBadge ? (\n <Badge\n badgeContent={badgeContent}\n color=\"info\"\n variant=\"dot\"\n sx={{\n '& .MuiBadge-badge': {\n width: 6,\n height: 6,\n minWidth: 6,\n borderRadius: '50%',\n top: 0,\n right: -3,\n },\n }}\n >\n {icon}\n </Badge>\n ) : (\n icon\n )}\n </IconButton>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport { TablePagination, type TablePaginationProps } from '@mui/material';\nimport type { Table } from '@tanstack/react-table';\n\nexport type BiampTablePaginationProps<TData> = {\n /** TanStack Table instance to connect to. */\n table: Table<TData>;\n /** Rows-per-page options. When omitted, the selector is hidden and defaults to 25. */\n rowsPerPageOptions?: number[];\n /** When true, keeps the previous row count visible instead of dropping to 0. */\n loading?: boolean;\n /** Hide pagination when all rows fit on one page. @default true */\n autoHide?: boolean;\n /** Horizontal alignment of the pagination controls. @default 'center' */\n position?: 'left' | 'center' | 'right';\n} & Omit<\n TablePaginationProps<'div'>,\n | 'component'\n | 'count'\n | 'page'\n | 'rowsPerPage'\n | 'onPageChange'\n | 'onRowsPerPageChange'\n | 'rowsPerPageOptions'\n | 'position'\n>;\n\nconst positionMap = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end',\n};\n\nexport function BiampTablePagination<TData>({\n table,\n rowsPerPageOptions,\n loading,\n autoHide = true,\n position = 'center',\n sx,\n ...paginationProps\n}: BiampTablePaginationProps<TData>) {\n const rowCount = table.getRowCount();\n const lastRowCountRef = useRef(rowCount);\n\n // Update the stable count only when not loading and the count is meaningful.\n if (!loading && rowCount >= 0) {\n lastRowCountRef.current = rowCount;\n }\n\n const stableCount = loading ? lastRowCountRef.current : rowCount;\n const { pageSize, pageIndex } = table.getState().pagination;\n\n // Auto-correct page when row count drops (e.g. after filtering)\n const maxPage = Math.max(0, Math.ceil(stableCount / pageSize) - 1);\n useEffect(() => {\n if (!loading && pageIndex > maxPage) {\n table.setPageIndex(maxPage);\n }\n }, [loading, pageIndex, maxPage, table]);\n\n // Hide when there's no data or everything fits on one page\n if (autoHide && (!stableCount || stableCount <= pageSize)) return null;\n\n return (\n <TablePagination\n component=\"div\"\n count={stableCount}\n page={table.getState().pagination.pageIndex}\n rowsPerPage={table.getState().pagination.pageSize}\n onPageChange={(_, page) => table.setPageIndex(page)}\n onRowsPerPageChange={(e) => {\n table.setPageSize(Number(e.target.value));\n table.setPageIndex(0);\n }}\n rowsPerPageOptions={rowsPerPageOptions ?? []}\n showFirstButton\n showLastButton\n sx={{\n display: 'flex',\n justifyContent: positionMap[position],\n height: 40,\n minHeight: 40,\n '& .MuiToolbar-root': {\n minHeight: 40,\n px: 0,\n },\n ...sx,\n }}\n {...paginationProps}\n />\n );\n}\n","import { Box, type BoxProps } from '@mui/material';\n\nexport type BiampTableToolbarProps = BoxProps;\n\nexport function BiampTableToolbar({\n children,\n sx,\n ...props\n}: BiampTableToolbarProps) {\n return (\n <Box\n role=\"toolbar\"\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n gap={{ xs: 0, md: 1 }}\n minHeight={44}\n pl={{ xs: 2, sm: 3, xl: 12.5 }}\n pr={{ xs: 0, md: 3, xl: 12.5 }}\n sx={{ ...sx }}\n {...props}\n >\n {children}\n </Box>\n );\n}\n","import { Box, type BoxProps } from '@mui/material';\n\nexport type BiampTableToolbarActionsProps = BoxProps;\n\nexport function BiampTableToolbarActions({\n children,\n ...props\n}: BiampTableToolbarActionsProps) {\n return (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n ml=\"auto\"\n gap={{ xs: 0, md: 1 }}\n mr={{ xs: 1, md: 0 }}\n {...props}\n >\n {children}\n </Box>\n );\n}\n","import { CircularProgress } from '@mui/material';\nimport { DownloadIcon } from '@bwp-web/assets';\nimport {\n BiampTableToolbarActionButton,\n type BiampTableToolbarActionButtonProps,\n} from './BiampTableToolbarActionButton';\n\nexport type BiampTableToolbarExportProps = {\n /** Called when the export button is clicked. */\n onExport: () => void;\n /** When true, shows a spinner instead of the icon and disables the button. */\n loading?: boolean;\n /** Icon element for the button. @default DownloadIcon */\n icon?: React.ReactNode;\n /** Accessible label for the button. @default \"Export\" */\n label?: string;\n} & Omit<\n BiampTableToolbarActionButtonProps,\n 'icon' | 'label' | 'onClick' | 'badgeContent'\n>;\n\nexport function BiampTableToolbarExport({\n onExport,\n loading,\n icon = <DownloadIcon variant=\"xs\" />,\n label = 'Export',\n ...props\n}: BiampTableToolbarExportProps) {\n return (\n <BiampTableToolbarActionButton\n label={loading ? `${label}, loading` : label}\n icon={loading ? <CircularProgress size={20} color=\"inherit\" /> : icon}\n disabled={loading}\n onClick={onExport}\n {...props}\n />\n );\n}\n","import {\n Badge,\n Box,\n Button,\n Divider,\n Drawer,\n type DrawerProps,\n IconButton,\n Typography,\n} from '@mui/material';\nimport { CloseIcon, FilterIcon } from '@bwp-web/assets';\nimport { type ReactNode, useId, useState } from 'react';\nimport { BiampTableToolbarActionButton } from './BiampTableToolbarActionButton';\n\nexport type BiampTableToolbarFiltersProps = {\n /** Number of currently active filters. Shown as a badge on the trigger button. */\n activeFilterCount: number;\n /** Filter form content rendered inside the drawer body. */\n children: ReactNode;\n /** Called when the user clicks the reset / clear-all button. */\n onReset: () => void;\n /** Called when the drawer is closed (via close button, apply, or backdrop click). */\n onApply?: () => void;\n /** Icon for the toolbar trigger button. @default FilterIcon */\n icon?: ReactNode;\n /** Drawer heading. @default \"Filters\" */\n title?: string;\n /** Reset button label. @default \"Clear filters\" */\n resetLabel?: string;\n /** Apply button label. @default \"Apply\" */\n applyLabel?: string;\n /** Accessible label for the drawer close button. @default \"Close\" */\n closeLabel?: string;\n /** Accessible label for the toolbar trigger button. @default \"Filters\" */\n buttonLabel?: string;\n /** Additional props forwarded to the MUI Drawer. */\n DrawerProps?: Partial<DrawerProps>;\n};\n\nexport function BiampTableToolbarFilters({\n activeFilterCount,\n children,\n onReset,\n onApply,\n icon = <FilterIcon variant=\"xs\" />,\n title = 'Filters',\n resetLabel = 'Clear filters',\n applyLabel = 'Apply',\n closeLabel = 'Close',\n buttonLabel = 'Filters',\n DrawerProps: drawerProps,\n}: BiampTableToolbarFiltersProps) {\n const [open, setOpen] = useState(false);\n const titleId = useId();\n\n function handleClose() {\n onApply?.();\n setOpen(false);\n }\n\n return (\n <>\n <BiampTableToolbarActionButton\n label={buttonLabel}\n icon={icon}\n badgeContent={activeFilterCount}\n onClick={() => setOpen(true)}\n />\n\n <Drawer\n anchor=\"right\"\n open={open}\n onClose={handleClose}\n aria-labelledby={titleId}\n {...drawerProps}\n PaperProps={{\n sx: { width: { xs: '100%', sm: 480 } },\n ...drawerProps?.PaperProps,\n }}\n >\n <Box\n height=\"100%\"\n display=\"flex\"\n flexDirection=\"column\"\n justifyContent=\"space-between\"\n >\n {/* Header */}\n <Box>\n <Box\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n px={3.5}\n py={2.5}\n >\n <Typography id={titleId} variant=\"h2\">\n {title}\n <Badge\n badgeContent={activeFilterCount}\n color=\"secondary\"\n sx={{ ml: 1.5, mb: 0.5 }}\n />\n </Typography>\n <IconButton\n size=\"medium\"\n onClick={handleClose}\n aria-label={closeLabel}\n >\n <CloseIcon />\n </IconButton>\n </Box>\n <Divider />\n\n {/* Body */}\n <Box\n role=\"group\"\n aria-label=\"Filter options\"\n display=\"flex\"\n flexDirection=\"column\"\n gap={2}\n p={3.5}\n overflow=\"auto\"\n >\n {children}\n </Box>\n </Box>\n\n {/* Footer */}\n <Box display=\"flex\">\n <Button\n variant=\"overlay\"\n color=\"secondary\"\n fullWidth\n onClick={onReset}\n disabled={activeFilterCount === 0}\n >\n {resetLabel}\n </Button>\n <Button\n variant=\"overlay\"\n color=\"primary\"\n fullWidth\n onClick={handleClose}\n >\n {applyLabel}\n </Button>\n </Box>\n </Box>\n </Drawer>\n </>\n );\n}\n","import {\n Box,\n Collapse,\n IconButton,\n InputAdornment,\n InputBase,\n TextField,\n Theme,\n useMediaQuery,\n type TextFieldProps,\n} from '@mui/material';\nimport { CloseIcon, SearchIcon } from '@bwp-web/assets';\nimport { useEffect, useState } from 'react';\nimport {\n BIAMP_TABLE_DEBOUNCE_DELAY,\n useDebouncedCallback,\n} from './useDebouncedCallback';\n\ntype ExpandableSearchProps =\n | {\n /** When true, the search field collapses to an icon button when empty and unfocused. */\n expandable: true;\n /** Accessible label for the collapsed icon button. @default placeholder */\n expandLabel?: string;\n }\n | {\n expandable?: false;\n expandLabel?: never;\n };\n\nexport type BiampTableToolbarSearchProps = {\n /** Called with the debounced search string whenever the value changes. */\n onChange: (value: string) => void;\n /** Initial value for the search field. When this prop changes the input resets. */\n defaultValue?: string;\n /** Debounce delay in milliseconds. @default BIAMP_TABLE_DEBOUNCE_DELAY (300) */\n debounceDelay?: number;\n /** Maximum character length for the input. @default 120 */\n maxLength?: number;\n /** Maximum width of the text field. @default 280 */\n maxWidth?: number;\n /** Placeholder text. @default \"Search\" */\n placeholder?: string;\n /** Accessible label for the clear button. @default \"Clear search\" */\n clearLabel?: string;\n /** When true, renders a simplified full-width InputBase on screens below the `md` breakpoint. @default true */\n enableMobileView?: boolean;\n} & ExpandableSearchProps &\n Omit<TextFieldProps, 'onChange' | 'value' | 'defaultValue'>;\n\nconst searchFieldSx = {\n '& .MuiInputBase-root': {\n height: '36px !important',\n minHeight: '36px !important',\n },\n '& .MuiOutlinedInput-notchedOutline': {\n height: '36px !important',\n },\n} as const;\n\nexport function BiampTableToolbarSearch({\n onChange,\n defaultValue = '',\n debounceDelay = BIAMP_TABLE_DEBOUNCE_DELAY,\n maxLength = 120,\n maxWidth = 280,\n placeholder = 'Search',\n clearLabel = 'Clear search',\n expandable = false,\n expandLabel,\n enableMobileView = true,\n sx,\n ...textFieldProps\n}: BiampTableToolbarSearchProps) {\n const isMobile = useMediaQuery<Theme>((t) => t.breakpoints.down('md'));\n const [inputValue, setInputValue] = useState(defaultValue);\n const [isExpanded, setIsExpanded] = useState(false);\n const debouncedOnChange = useDebouncedCallback(onChange, debounceDelay);\n\n useEffect(() => {\n setInputValue(defaultValue);\n }, [defaultValue]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n debouncedOnChange(e.target.value);\n };\n\n const handleClear = () => {\n setInputValue('');\n debouncedOnChange('');\n };\n\n const handleBlur = () => {\n if (expandable && !inputValue) {\n setIsExpanded(false);\n }\n };\n\n const clearButton = inputValue ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n onClick={handleClear}\n aria-label={clearLabel}\n sx={{ mr: 0.5 }}\n >\n <CloseIcon variant=\"xs\" sx={{ width: 20, height: 20 }} />\n </IconButton>\n </InputAdornment>\n ) : null;\n\n const textField = (\n <TextField\n name=\"search\"\n type=\"text\"\n placeholder={placeholder}\n slotProps={{\n htmlInput: { maxLength, 'aria-label': placeholder },\n input: {\n startAdornment: (\n <InputAdornment position=\"start\" sx={{ ml: 1 }}>\n <SearchIcon\n variant=\"xs\"\n color=\"inherit\"\n sx={{ width: 16, height: 16 }}\n />\n </InputAdornment>\n ),\n endAdornment: clearButton,\n },\n }}\n fullWidth\n sx={[\n searchFieldSx,\n expandable ? { width: 170 } : { maxWidth },\n ...(Array.isArray(sx) ? sx : sx ? [sx] : []),\n ]}\n variant=\"outlined\"\n value={inputValue}\n onChange={handleChange}\n onBlur={handleBlur}\n {...(expandable && isExpanded && !defaultValue && { autoFocus: true })}\n {...textFieldProps}\n />\n );\n\n if (isMobile && enableMobileView) {\n return (\n <Box display=\"flex\" alignItems=\"center\" width=\"100%\" pr={1} gap={1}>\n <SearchIcon sx={{ width: 16, height: 16 }} />\n <InputBase\n name=\"search\"\n type=\"text\"\n placeholder={placeholder}\n inputProps={{ maxLength, 'aria-label': 'Search' }}\n fullWidth\n value={inputValue}\n sx={{\n paddingLeft: 1,\n height: '36px !important',\n minHeight: '36px !important',\n fontSize: (t) => t.typography.body2.fontSize,\n }}\n onChange={handleChange}\n endAdornment={clearButton}\n />\n </Box>\n );\n }\n\n if (expandable) {\n return (\n <Box display=\"flex\" alignItems=\"center\" minWidth={28}>\n <IconButton\n aria-label={expandLabel ?? placeholder}\n onClick={() => setIsExpanded(true)}\n sx={{ display: isExpanded || inputValue ? 'none' : 'flex' }}\n >\n <SearchIcon\n variant=\"xs\"\n color=\"inherit\"\n sx={{ width: 16, height: 16 }}\n />\n </IconButton>\n <Collapse\n in={isExpanded || !!inputValue}\n orientation=\"horizontal\"\n unmountOnExit\n >\n {textField}\n </Collapse>\n </Box>\n );\n }\n\n return textField;\n}\n","import { useCallback, useEffect, useRef } from 'react';\n\n/** Default debounce delay (ms) shared across all BiampTable components. */\nexport const BIAMP_TABLE_DEBOUNCE_DELAY = 300;\n\n/**\n * Returns a debounced version of the given callback.\n * The debounced function delays invocation until `delay` ms after\n * the last call. The pending timer is cleared on unmount.\n */\nexport function useDebouncedCallback<Args extends unknown[]>(\n callback: (...args: Args) => void,\n delay: number = BIAMP_TABLE_DEBOUNCE_DELAY,\n): (...args: Args) => void {\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const callbackRef = useRef(callback);\n\n // Keep callback ref fresh without restarting timers.\n callbackRef.current = callback;\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current !== null) clearTimeout(timeoutRef.current);\n };\n }, []);\n\n return useCallback(\n (...args: Args) => {\n if (timeoutRef.current !== null) clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(\n () => callbackRef.current(...args),\n delay,\n );\n },\n [delay],\n );\n}\n","import {\n type ColumnDef,\n type ExpandedState,\n getCoreRowModel,\n getExpandedRowModel,\n type Row,\n type Table,\n useReactTable,\n} from '@tanstack/react-table';\nimport { useMemo } from 'react';\nimport {\n toVisibilityState,\n type ColumnVisibility,\n} from './BiampTableColumnVisibility';\nimport {\n type ServerSideOrder,\n orderToSorting,\n sortingToOrder,\n getOrderFieldMappings,\n getDefaultColumnVisibilityFromDefs,\n getDirtyColumnVisibility,\n selectedIdsToRowSelection,\n rowSelectionToSelectedIds,\n} from './serverSideTableUtils';\nimport './tanstack-meta';\n\n// Stable references — avoid re-creating on every render.\nconst coreRowModel = getCoreRowModel();\nconst expandedRowModel = getExpandedRowModel();\nconst defaultGetRowId = (row: Record<string, string>) => row.id;\n\nexport type UseBiampServerSideTableOptions<TData, F extends string = string> = {\n /** Row data array. */\n data: TData[];\n /** TanStack column definitions. Use `meta.orderField` to map columns to server-side order fields. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n columns: ColumnDef<TData, any>[];\n /** Extracts a unique ID from each row. @default `(row) => (row as any).id` */\n getRowId?: (row: TData) => string;\n\n // ── Sorting ──────────────────────────────────────────────────────\n /** Current server-side order. `undefined` means no sorting. */\n order?: ServerSideOrder<F>;\n /** Called when the user changes sorting. `undefined` means sorting was cleared. */\n onOrderChange?: (order?: ServerSideOrder<F>) => void;\n\n // ── Pagination ───────────────────────────────────────────────────\n /** Zero-based page index. */\n page?: number;\n /** Number of rows per page. */\n rowsPerPage?: number;\n /** Called when the user changes page. */\n onPageChange?: (page: number) => void;\n /** Total row count from the server (for pagination display). */\n rowCount?: number;\n\n // ── Column visibility ────────────────────────────────────────────\n /** Current column visibility overrides. Merged with defaults from `meta.defaultVisible`. */\n columnVisibility?: ColumnVisibility;\n /** Called with only the entries that differ from defaults (for URL persistence). */\n onColumnVisibilityChange?: (visibility: ColumnVisibility) => void;\n\n // ── Row selection ────────────────────────────────────────────────\n /** Currently selected row IDs. */\n selectedRowIds?: string[];\n /** Called when selection changes. */\n onSelectedRowIdsChange?: (ids: string[]) => void;\n /** Enable row selection. Pass `true` for all rows, or a predicate. */\n enableRowSelection?: boolean | ((row: Row<TData>) => boolean);\n\n // ── Expanding ──────────────────────────────────────────────────\n /** Current expanded state. `{}` means nothing expanded; `true` expands all. */\n expanded?: ExpandedState;\n /** Called when the user expands/collapses rows. */\n onExpandedChange?: (expanded: ExpandedState) => void;\n /** Returns child rows for a given row (enables sub-row expanding). */\n getSubRows?: (row: TData) => TData[] | undefined;\n};\n\n/**\n * Wraps `useReactTable` with the standard server-side configuration:\n * manual sorting, manual pagination, column visibility with dirty-tracking,\n * and optional row selection with ID-based state.\n *\n * Eliminates ~40 lines of boilerplate per table implementation.\n */\nexport function useBiampServerSideTable<TData, F extends string = string>({\n data,\n columns,\n getRowId = defaultGetRowId as (row: TData) => string,\n order,\n onOrderChange,\n page,\n rowsPerPage,\n onPageChange,\n rowCount,\n columnVisibility,\n onColumnVisibilityChange,\n selectedRowIds,\n onSelectedRowIdsChange,\n enableRowSelection,\n expanded,\n onExpandedChange,\n getSubRows,\n}: UseBiampServerSideTableOptions<TData, F>): Table<TData> {\n // ── Derived state (memoized) ─────────────────────────────────────\n\n const { defaultColumnVisibility, columnIdToField, fieldToColumnId } = useMemo(\n () => ({\n defaultColumnVisibility: getDefaultColumnVisibilityFromDefs(columns),\n ...getOrderFieldMappings<F>(columns),\n }),\n [columns],\n );\n\n const sorting = useMemo(\n () => orderToSorting(order, fieldToColumnId),\n [order, fieldToColumnId],\n );\n\n const hasPagination = page != null && rowsPerPage != null;\n const pagination = useMemo(\n () =>\n hasPagination ? { pageIndex: page!, pageSize: rowsPerPage! } : undefined,\n [hasPagination, page, rowsPerPage],\n );\n\n const hasSelection = selectedRowIds != null;\n const rowSelection = useMemo(\n () =>\n hasSelection ? selectedIdsToRowSelection(selectedRowIds!) : undefined,\n [hasSelection, selectedRowIds],\n );\n\n const mergedVisibility = useMemo(\n () =>\n toVisibilityState({\n ...defaultColumnVisibility,\n ...columnVisibility,\n }),\n [defaultColumnVisibility, columnVisibility],\n );\n\n // ── Table instance ───────────────────────────────────────────────\n\n return useReactTable({\n data,\n columns,\n getCoreRowModel: coreRowModel,\n getRowId,\n\n // Sorting — always manual for server-side tables\n manualSorting: true,\n sortDescFirst: false,\n state: {\n sorting,\n ...(pagination && { pagination }),\n columnVisibility: mergedVisibility,\n ...(rowSelection && { rowSelection }),\n ...(expanded != null && { expanded }),\n },\n onSortingChange: onOrderChange\n ? (updater) => {\n const next =\n typeof updater === 'function' ? updater(sorting) : updater;\n onOrderChange(sortingToOrder(next, columnIdToField));\n }\n : undefined,\n\n // Pagination — only when page/rowsPerPage are provided\n ...(hasPagination && {\n manualPagination: true,\n rowCount: rowCount ?? 0,\n onPaginationChange: onPageChange\n ? (\n updater: Parameters<\n NonNullable<\n Parameters<typeof useReactTable>[0]['onPaginationChange']\n >\n >[0],\n ) => {\n const next =\n typeof updater === 'function' ? updater(pagination!) : updater;\n onPageChange(next.pageIndex);\n }\n : undefined,\n }),\n\n // Column visibility\n onColumnVisibilityChange: onColumnVisibilityChange\n ? (updater) => {\n const next =\n typeof updater === 'function' ? updater(mergedVisibility) : updater;\n onColumnVisibilityChange(\n getDirtyColumnVisibility(next, defaultColumnVisibility),\n );\n }\n : undefined,\n\n // Row selection — only when selectedRowIds is provided\n ...(hasSelection && {\n enableRowSelection: enableRowSelection ?? true,\n onRowSelectionChange: onSelectedRowIdsChange\n ? (\n updater: Parameters<\n NonNullable<\n Parameters<typeof useReactTable>[0]['onRowSelectionChange']\n >\n >[0],\n ) => {\n const next =\n typeof updater === 'function' ? updater(rowSelection!) : updater;\n onSelectedRowIdsChange(rowSelectionToSelectedIds(next));\n }\n : undefined,\n }),\n\n // Expanding — only when expanded state is provided\n ...(expanded != null && {\n // Only attach getExpandedRowModel when getSubRows is provided.\n // Without it, the expanded model recomputes on every state change\n // (including selection), adding unnecessary overhead.\n ...(getSubRows && { getExpandedRowModel: expandedRowModel, getSubRows }),\n onExpandedChange: onExpandedChange\n ? (\n updater: Parameters<\n NonNullable<\n Parameters<typeof useReactTable>[0]['onExpandedChange']\n >\n >[0],\n ) => {\n const next =\n typeof updater === 'function' ? updater(expanded) : updater;\n onExpandedChange(next);\n }\n : undefined,\n }),\n });\n}\n","import type { RowSelectionState, SortingState } from '@tanstack/react-table';\n\n/** A single-field server-side order, matching typical GraphQL order input types. */\nexport type ServerSideOrder<F extends string> = {\n field: F;\n desc?: boolean;\n};\n\n/**\n * Convert a server-side order object to TanStack SortingState.\n *\n * @param order - `{ field, desc? }` from URL params / GraphQL\n * @param fieldToColumnId - optional map when column IDs differ from order field names\n */\nexport function orderToSorting<F extends string>(\n order: ServerSideOrder<F> | undefined,\n fieldToColumnId?: Partial<Record<F, string>>,\n): SortingState {\n if (!order) return [];\n const id = fieldToColumnId?.[order.field] ?? order.field;\n return [{ id, desc: order.desc ?? false }];\n}\n\n/**\n * Convert TanStack SortingState back to a server-side order object.\n *\n * @param sorting - TanStack sorting state\n * @param columnIdToField - optional map when column IDs differ from order field names\n */\nexport function sortingToOrder<F extends string>(\n sorting: SortingState,\n columnIdToField?: Record<string, F>,\n): ServerSideOrder<F> | undefined {\n if (sorting.length === 0) return undefined;\n const { id, desc } = sorting[0];\n const field = (columnIdToField?.[id] ?? id) as F;\n return { field, desc };\n}\n\n/**\n * Convert an array of selected row IDs to TanStack RowSelectionState.\n */\nexport function selectedIdsToRowSelection(ids: string[]): RowSelectionState {\n const state: RowSelectionState = {};\n for (const id of ids) {\n state[id] = true;\n }\n return state;\n}\n\n/**\n * Convert TanStack RowSelectionState to an array of selected row IDs.\n */\nexport function rowSelectionToSelectedIds(\n selection: RowSelectionState,\n): string[] {\n return Object.keys(selection).filter((key) => selection[key]);\n}\n\n/**\n * Build bidirectional mappings between TanStack column IDs and server-side order\n * field enum values from column definitions that carry `meta.orderField`.\n */\nexport function getOrderFieldMappings<F extends string = string>(\n columns: { id?: string; meta?: { orderField?: string } }[],\n): {\n columnIdToField: Record<string, F>;\n fieldToColumnId: Partial<Record<F, string>>;\n} {\n const columnIdToField: Record<string, F> = {};\n const fieldToColumnId: Partial<Record<F, string>> = {};\n for (const col of columns) {\n const orderField = col.meta?.orderField as F | undefined;\n if (col.id && orderField) {\n columnIdToField[col.id] = orderField;\n fieldToColumnId[orderField] = col.id;\n }\n }\n return { columnIdToField, fieldToColumnId };\n}\n\n/**\n * Derives default column visibility from column definitions' `meta.defaultVisible`.\n * Columns without `defaultVisible` are omitted (treated as visible by TanStack).\n */\nexport function getDefaultColumnVisibilityFromDefs(\n columns: { id?: string; meta?: { defaultVisible?: boolean } }[],\n): Record<string, boolean> {\n const defaults: Record<string, boolean> = {};\n for (const col of columns) {\n if (col.id != null && col.meta?.defaultVisible !== undefined) {\n defaults[col.id] = col.meta.defaultVisible;\n }\n }\n return defaults;\n}\n\n/**\n * Returns only the entries in `visibility` that differ from `defaults`.\n * Columns not present in `defaults` are treated as visible (`true`) by default.\n * Use this to strip default-matching entries before persisting to URL params.\n */\nexport function getDirtyColumnVisibility(\n visibility: Record<string, boolean>,\n defaults: Record<string, boolean>,\n): Record<string, boolean> {\n const dirty: Record<string, boolean> = {};\n for (const [id, visible] of Object.entries(visibility)) {\n if (visible !== (defaults[id] ?? true)) {\n dirty[id] = visible;\n }\n }\n return dirty;\n}\n","export interface ExportColumn<TData> {\n header: string;\n accessor: (row: TData) => unknown;\n}\n\n/**\n * Converts an array of rows and column definitions to a CSV string\n * and triggers a browser download.\n */\nexport function exportToCsv<TData>(\n rows: TData[],\n columns: ExportColumn<TData>[],\n filename: string = 'export',\n): void {\n const csvContent = buildCsvString(rows, columns);\n downloadCsv(csvContent, filename);\n}\n\n/**\n * Builds a CSV string from rows and columns.\n * Handles quoting for values that contain commas, quotes, or newlines.\n */\nexport function buildCsvString<TData>(\n rows: TData[],\n columns: ExportColumn<TData>[],\n): string {\n const header = columns.map((col) => escapeCsvField(col.header)).join(',');\n const dataRows = rows.map((row) =>\n columns\n .map((col) => escapeCsvField(formatCsvValue(col.accessor(row))))\n .join(','),\n );\n return [header, ...dataRows].join('\\n');\n}\n\nfunction escapeCsvField(value: string): string {\n if (value.includes(',') || value.includes('\"') || value.includes('\\n')) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n\nfunction formatCsvValue(value: unknown): string {\n if (value == null) return '';\n if (value instanceof Date) return value.toISOString();\n return String(value);\n}\n\nfunction downloadCsv(csvContent: string, filename: string): void {\n const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.setAttribute('href', url);\n link.setAttribute('download', `${filename}.csv`);\n link.style.display = 'none';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n","import React from 'react';\nimport {\n Box,\n BoxProps,\n Collapse,\n Typography,\n TypographyProps,\n type AlertColor,\n} from '@mui/material';\nimport {\n ErrorStatusIcon,\n InfoStatusIcon,\n SuccessStatusIcon,\n WarningStatusIcon,\n} from '@bwp-web/assets';\n\nexport type BiampBannerProps = {\n show: boolean;\n children: React.ReactNode;\n severity: AlertColor;\n};\n\n/**\n * A full-width notification banner that slides in/out with a Collapse animation.\n * Uses MUI's AlertColor severity to set background and text colors from the theme.\n * Compose with `BiampBannerIcon`, `BiampBannerContent`, and `BiampBannerActions`.\n */\nexport function BiampBanner({ show, children, severity }: BiampBannerProps) {\n return (\n <Collapse in={show} unmountOnExit component=\"aside\">\n <Box\n bgcolor={({ palette }) => palette.background[severity]}\n display=\"flex\"\n flexDirection=\"row\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n gap={1}\n px={{ xs: 2, sm: 2.5 }}\n minHeight={48}\n sx={{\n borderBottom: ({ palette }) =>\n `0.6px solid ${palette[severity].main}`,\n }}\n >\n {children}\n </Box>\n </Collapse>\n );\n}\n\n// NOTE: we're using the same icon mapping as the `Alert` component.\nconst iconMapping: Record<AlertColor, React.ReactNode> = {\n error: <ErrorStatusIcon color=\"error\" sx={{ width: 14, height: 14 }} />,\n warning: <WarningStatusIcon color=\"warning\" sx={{ width: 16, height: 14 }} />,\n success: <SuccessStatusIcon color=\"success\" sx={{ width: 14, height: 14 }} />,\n info: <InfoStatusIcon color=\"info\" sx={{ width: 14, height: 14 }} />,\n};\n\nexport type BiampBannerIconProps = {\n severity?: AlertColor;\n children?: React.ReactNode;\n};\n\n/**\n * Icon slot for `BiampBanner`. Pass a `severity` to render the matching\n * default icon, or pass `children` to render a custom icon.\n */\nexport function BiampBannerIcon({ severity, children }: BiampBannerIconProps) {\n return <>{severity ? iconMapping[severity] : children}</>;\n}\n\n/**\n * Content slot for `BiampBanner`. Text is centered by default.\n */\nexport function BiampBannerContent({ children, ...props }: TypographyProps) {\n return (\n <Typography textAlign=\"center\" variant=\"h3\" {...props}>\n {children}\n </Typography>\n );\n}\n\n/**\n * Actions slot for `BiampBanner`. Renders children in a horizontal flex row\n * with 8px gap, aligned to the trailing edge of the banner.\n */\nexport function BiampBannerActions({ children, ...props }: BoxProps) {\n return (\n <Box display=\"flex\" gap={1} alignItems=\"center\" {...props}>\n {children}\n </Box>\n );\n}\n","import { Button, ButtonProps, useTheme } from '@mui/material';\nimport { alpha } from '@mui/material/styles';\n\ntype Props = ButtonProps & {\n children: React.ReactNode;\n active?: boolean;\n small?: boolean;\n component?: React.ElementType;\n};\n\nexport function SegmentedButton({\n children,\n active,\n small,\n sx,\n ...props\n}: Props) {\n const theme = useTheme();\n const isDarkMode = theme.palette.mode === 'dark';\n const backgroundColor = active\n ? isDarkMode\n ? theme.palette.grey[900]\n : theme.palette.common.white\n : 'transparent';\n const textColor = active\n ? theme.palette.text.primary\n : theme.palette.text.secondary;\n const border = active ? 'solid' : undefined;\n return (\n <Button\n sx={{\n backgroundColor,\n color: textColor,\n borderRadius: '4px',\n border,\n borderColor: 'divider',\n lineHeight: 1.5,\n px: 1.5,\n py: 0,\n height: small ? '22px' : '26px',\n ...(small && { fontSize: '12px', letterSpacing: '-0.24px' }),\n boxShadow: active\n ? `0 1px 2px 0 ${alpha(theme.palette.common.black, 0.05)} !important`\n : 'none !important',\n ...sx,\n }}\n {...props}\n >\n {children}\n </Button>\n );\n}\n","import { Stack, StackProps, useTheme } from '@mui/material';\n\ntype Props = StackProps & {\n children: React.ReactNode[];\n component?: React.ElementType;\n};\n\nexport function SegmentedButtonGroup({ children, sx, ...props }: Props) {\n const theme = useTheme();\n const isDarkMode = theme.palette.mode === 'dark';\n return (\n <Stack\n direction=\"row\"\n p={0.5}\n borderRadius=\"6px\"\n gap={1}\n sx={{\n backgroundColor: isDarkMode\n ? theme.palette.grey[800]\n : theme.palette.grey[100],\n ...sx,\n }}\n {...props}\n >\n {children}\n </Stack>\n );\n}\n","import React, { createContext, forwardRef, useContext } from 'react';\nimport {\n Autocomplete,\n AutocompleteProps,\n Box,\n Chip,\n InputAdornment,\n Paper,\n PaperProps,\n TextField,\n Typography,\n} from '@mui/material';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { KeyArrowDownIcon, KeyArrowUpIcon, SearchIcon } from '@bwp-web/assets';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface BiampGlobalSearchOption {\n icon?: React.ReactNode;\n title: string;\n subtitle?: string;\n associatedItems?: { label: string }[];\n endIcon?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport type BiampGlobalSearchProps = Omit<\n AutocompleteProps<BiampGlobalSearchOption, false, false, true>,\n 'renderInput' | 'renderOption' | 'PaperComponent'\n> & {\n placeholder?: string;\n noResultsText?: string;\n inputSx?: SxProps<Theme>;\n clearOnSelect?: boolean;\n};\n\n// ---------------------------------------------------------------------------\n// SearchContext\n// ---------------------------------------------------------------------------\n\nconst SearchContext = createContext<{\n hasOptions: boolean;\n loading: boolean;\n noResultsText: string;\n query: string;\n}>({\n hasOptions: true,\n loading: false,\n noResultsText: 'No results found',\n query: '',\n});\n\n// ---------------------------------------------------------------------------\n// KeyCap — keyboard key visual wrapper\n// ---------------------------------------------------------------------------\n\nfunction KeyCap({\n children,\n variant = 'icon',\n}: {\n children: React.ReactNode;\n variant?: 'icon' | 'text';\n}) {\n return (\n <Box\n component=\"kbd\"\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n minWidth: 20,\n height: 20,\n px: variant === 'text' ? '8px' : 0.5,\n borderRadius: '4px',\n bgcolor: 'grey.100',\n color: 'grey.400',\n fontFamily: 'inherit',\n fontSize: 'caption.fontSize',\n fontStyle: 'normal',\n fontWeight: (theme: Theme) => theme.typography.fontWeightMedium,\n border: 'none',\n '& svg': { width: 12, height: 12 },\n }}\n >\n {children}\n </Box>\n );\n}\n\n// ---------------------------------------------------------------------------\n// BiampGlobalSearchPaper\n// ---------------------------------------------------------------------------\n\nconst BiampGlobalSearchPaper = forwardRef<HTMLDivElement, PaperProps>(\n function BiampGlobalSearchPaper({ children, ...props }, ref) {\n const { hasOptions, loading, noResultsText } = useContext(SearchContext);\n\n return (\n <Paper ref={ref} {...props}>\n {hasOptions || loading ? (\n children\n ) : (\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ px: 2, py: 1.5 }}\n >\n {noResultsText}\n </Typography>\n )}\n {hasOptions && (\n <Box\n sx={{\n borderTop: ({ palette }) =>\n `0.6px solid ${palette.dividers.secondary}`,\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n p: 1.5,\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\n <KeyCap>\n <KeyArrowDownIcon />\n </KeyCap>\n <KeyCap>\n <KeyArrowUpIcon />\n </KeyCap>\n </Box>\n <Typography\n variant=\"caption\"\n fontWeight={(theme) => theme.typography.fontWeightMedium}\n color=\"text.secondary\"\n >\n Select\n </Typography>\n </Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <KeyCap variant=\"text\">Enter</KeyCap>\n <Typography\n variant=\"caption\"\n fontWeight={(theme) => theme.typography.fontWeightMedium}\n color=\"text.secondary\"\n >\n Open\n </Typography>\n </Box>\n </Box>\n )}\n </Paper>\n );\n },\n);\n\n// ---------------------------------------------------------------------------\n// HighlightText\n// ---------------------------------------------------------------------------\n\nfunction HighlightText({ text, query }: { text: string; query: string }) {\n if (!query) return <>{text}</>;\n\n const index = text.toLowerCase().indexOf(query.toLowerCase());\n if (index === -1) return <>{text}</>;\n\n const before = text.slice(0, index);\n const match = text.slice(index, index + query.length);\n const after = text.slice(index + query.length);\n\n return (\n <>\n {before}\n <Box\n component=\"span\"\n sx={{\n bgcolor: 'background.info',\n borderRadius: '4px',\n color: 'info.main',\n paddingTop: '2px',\n paddingBottom: '2px',\n }}\n >\n {match}\n </Box>\n {after}\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// BiampGlobalSearchListItem\n// ---------------------------------------------------------------------------\n\nfunction BiampGlobalSearchListItem({\n option,\n props: liProps,\n}: {\n option: BiampGlobalSearchOption;\n props: React.HTMLAttributes<HTMLLIElement> & { key?: React.Key };\n}) {\n const { query } = useContext(SearchContext);\n const { key, ...rest } = liProps;\n const maxChips = 3;\n const chips = option.associatedItems?.slice(0, maxChips) ?? [];\n const overflow = (option.associatedItems?.length ?? 0) - maxChips;\n\n return (\n <li\n key={key}\n {...rest}\n style={{\n display: 'flex',\n alignItems: 'center',\n width: '100%',\n gap: 8,\n ...rest.style,\n }}\n >\n {option.icon && (\n <Box\n sx={{\n width: 24,\n height: 24,\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {option.icon}\n </Box>\n )}\n\n <Typography variant=\"body2\" noWrap sx={{ flexShrink: 0 }}>\n <HighlightText text={option.title} query={query} />\n </Typography>\n\n {option.subtitle && (\n <Typography\n className=\"hoverContent\"\n variant=\"body2\"\n color=\"text.secondary\"\n noWrap\n sx={{ flexShrink: 1, minWidth: 0, display: 'none' }}\n >\n {option.subtitle}\n </Typography>\n )}\n\n {chips.length > 0 && (\n <Box\n className=\"hoverContent\"\n sx={{\n display: 'none',\n alignItems: 'center',\n gap: 1,\n ml: 'auto',\n flexShrink: 0,\n px: 2,\n }}\n >\n {chips.map((item, i) => (\n <Chip\n key={i}\n size=\"small\"\n label={item.label}\n sx={{\n bgcolor: 'background.info',\n borderRadius: '2px',\n borderColor: ({ palette }: Theme) => palette.dividers.primary,\n padding: '0px 6px',\n '& .MuiChip-label': {\n typography: 'caption',\n fontWeight: (theme: Theme) =>\n theme.typography.fontWeightMedium,\n },\n }}\n />\n ))}\n {overflow > 0 && (\n <Chip\n size=\"small\"\n label={`+${overflow}`}\n sx={{\n bgcolor: 'background.info',\n borderRadius: '2px',\n borderColor: ({ palette }: Theme) => palette.dividers.primary,\n padding: '0px 6px',\n '& .MuiChip-label': {\n typography: 'caption',\n fontWeight: (theme: Theme) =>\n theme.typography.fontWeightMedium,\n },\n }}\n />\n )}\n </Box>\n )}\n\n {option.endIcon && (\n <Box\n className=\"endIcon\"\n sx={{\n width: 48,\n height: 48,\n flexShrink: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n ml: chips.length > 0 ? 0 : 'auto',\n visibility: 'hidden',\n '& .MuiSvgIcon-root': { fontSize: 14 },\n }}\n >\n {option.endIcon}\n </Box>\n )}\n </li>\n );\n}\n\n// ---------------------------------------------------------------------------\n// BiampGlobalSearch\n// ---------------------------------------------------------------------------\n\nexport function BiampGlobalSearch({\n placeholder = 'Search...',\n noResultsText = 'No results found',\n options = [],\n inputValue: inputValueProp,\n loading = false,\n clearOnSelect = true,\n onChange,\n onInputChange,\n ...props\n}: BiampGlobalSearchProps) {\n const hasOptions = options.length > 0;\n\n const handleChange: typeof onChange = (event, value, reason, details) => {\n if (value && typeof value !== 'string' && value.onClick) {\n value.onClick();\n }\n onChange?.(event, value, reason, details);\n };\n\n const handleInputChange: typeof onInputChange = (event, value, reason) => {\n if (clearOnSelect && (reason === 'selectOption' || reason === 'reset')) {\n onInputChange?.(event, '', reason);\n return;\n }\n onInputChange?.(event, value, reason);\n };\n\n return (\n <SearchContext.Provider\n value={{\n hasOptions,\n loading,\n noResultsText,\n query: inputValueProp ?? '',\n }}\n >\n <Autocomplete<BiampGlobalSearchOption, false, false, true>\n options={options}\n inputValue={inputValueProp}\n loading={loading}\n onChange={handleChange}\n onInputChange={handleInputChange}\n loadingText={\n <Typography variant=\"body2\" color=\"text.secondary\">\n Loading…\n </Typography>\n }\n freeSolo\n filterOptions={(x) => x}\n getOptionLabel={(option) =>\n typeof option === 'string' ? option : option.title\n }\n noOptionsText={noResultsText}\n slots={{ paper: BiampGlobalSearchPaper }}\n slotProps={{\n listbox: {\n sx: {\n '& .MuiAutocomplete-option': {\n paddingRight: '0px !important',\n },\n '& li:hover .hoverContent, & li.Mui-focused .hoverContent': {\n display: 'flex',\n },\n '& li:hover p.hoverContent, & li.Mui-focused p.hoverContent': {\n display: 'block',\n },\n '& li:hover .endIcon, & li.Mui-focused .endIcon': {\n visibility: 'visible',\n },\n },\n },\n }}\n renderInput={(params) => (\n <TextField\n {...params}\n placeholder={placeholder}\n fullWidth\n sx={{\n '& .MuiOutlinedInput-root': { padding: '0px !important' },\n '& .MuiInputBase-input': { paddingLeft: '8px !important' },\n }}\n slotProps={{\n input: {\n ...params.InputProps,\n startAdornment: (\n <>\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n {params.InputProps.startAdornment}\n </>\n ),\n },\n }}\n />\n )}\n renderOption={(optionProps, option) => (\n <BiampGlobalSearchListItem\n key={optionProps.key}\n option={option as BiampGlobalSearchOption}\n props={optionProps}\n />\n )}\n {...props}\n />\n </SearchContext.Provider>\n );\n}\n"],"mappings":"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","names":["Stack","jsx","Box","ListItemButton","Stack","jsx","jsxs","Stack","jsxs","Box","React","useRef","Stack","Typography","jsx","jsxs","jsx","jsx","Box","jsx","useRef","useState","jsx","jsxs","Box","React","useRef","Stack","jsx","IconButton","Tooltip","jsx","alpha","Box","Checkbox","Popover","Typography","jsx","jsxs","Popover","alpha","Checkbox","Typography","Box","useState","IconButton","jsx","jsx","jsxs","useState","useEffect","useRef","jsx","Box","jsx","Box","jsx","jsx","Badge","Box","Divider","IconButton","Typography","useState","Fragment","jsx","jsxs","useState","Box","Typography","Badge","IconButton","Divider","Box","IconButton","InputAdornment","TextField","CloseIcon","SearchIcon","useEffect","useState","useCallback","useEffect","useRef","jsx","jsxs","useState","useEffect","InputAdornment","IconButton","CloseIcon","TextField","SearchIcon","Box","Box","Collapse","Typography","Fragment","jsx","Button","alpha","jsx","Stack","useTheme","jsx","Box","InputAdornment","TextField","Typography","SearchIcon","Fragment","jsx","jsxs","BiampGlobalSearchPaper"]}