caplink-saas-ui-shared-component-library 0.2.2 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/spreadsheet/lib/indexed-alphabet.ts","../../src/components/spreadsheet/lib/matrix-output.ts","../../src/components/spreadsheet/lib/date-formatter.ts","../../src/components/spreadsheet/model/spreadsheet.ts","../../src/components/spreadsheet/lib/normalize-value.ts","../../src/components/spreadsheet/model/matrix.ts","../../src/components/spreadsheet/ui/context.tsx","../../src/components/spreadsheet/lib/use-spreadsheet.ts","../../src/shared/lib/cn.ts","../../src/components/spreadsheet/ui/containers/matrix.tsx","../../src/components/spreadsheet/ui/containers/root.tsx","../../src/components/spreadsheet/ui/containers/index.ts","../../src/components/spreadsheet/ui/indicators/drag-indicator.tsx","../../src/components/spreadsheet/ui/indicators/column-indicator.tsx","../../src/components/spreadsheet/ui/icons/integer-icon.tsx","../../src/shared/ui/tooltip.tsx","../../src/components/spreadsheet/ui/indicators/column-title-indicator.tsx","../../src/components/spreadsheet/ui/indicators/corner-indicator.tsx","../../src/components/spreadsheet/ui/header.tsx","../../src/shared/ui/select.tsx","../../src/components/spreadsheet/ui/data-editor/boolean.tsx","../../src/components/spreadsheet/ui/data-editor/date.tsx","../../src/components/tmp/numeric.tsx","../../src/components/spreadsheet/ui/data-editor/numeric.tsx","../../src/components/spreadsheet/ui/data-editor/select.tsx","../../src/shared/lib/move-input-cursor-to-end.ts","../../src/shared/lib/read-text-from-clipboard.ts","../../src/components/spreadsheet/ui/data-editor/text.tsx","../../src/components/spreadsheet/ui/data-editor/index.tsx","../../src/components/spreadsheet/ui/cell.tsx","../../src/components/spreadsheet/ui/indicators/row-indicator.tsx","../../src/components/spreadsheet/ui/rows.tsx","../../src/components/spreadsheet/ui/start.tsx","../../src/components/spreadsheet/ui/icons/add-row-icon.tsx","../../src/components/spreadsheet/ui/icons/remove-row-icon.tsx","../../src/shared/ui/button.tsx","../../src/shared/ui/dropdown-menu.tsx","../../src/components/spreadsheet/ui/toolbar.tsx","../../src/components/spreadsheet/ui/index.tsx","../../src/index.ts"],"names":["indexedAlphabet","columns","asciiA","remainder","quotient","matrixConverter","params","matrix","rowValue","columnValue","column","dataEditorType","selectItems","newColumn","dateFormatter","value","NUMERIC_DATA_EDITOR_TYPES","normalizeValue","createEmpty","size","fill","getRowsCount","getColumnsCount","firstRow","getSize","hasPointInRange","pointRange","point","hasEntireColumns","hasEntireRows","row","parseString","overlap","mA","mB","mASize","mBSize","fillRows","fillColumns","rows","mC","y","x","nanoid","createContext","useCallback","useEffect","useMemo","useState","jsx","timeoutId","SpreadsheetContext","SpreadsheetContextProvider","props","children","startingColumns","startingMatrix","staticRows","onMatrixChange","setMatrix","setColumns","setupColumns","setPointRange","containerDimensions","setContainerDimensions","highlightLastRow","setHighlightLastRow","highlight","ms","columnsCount","emptySize","hasSomeEntireRow","onConvertedMatrixChange","newMatrix","onPaste","state","nextColumns","nextMatrix","onChange","data","onRemoveRow","rowStart","rowEnd","delta","confirmedMessage","index","onSelectRow","event","normalizedStart","normalizedEnd","onSelectCell","isCellSelected","onColumnResize","columnId","width","newWidth","previous","onInsertNewRow","onSelectSpreadsheet","start","end","onColumnVisibilityChange","useContext","useSpreadsheet","context","clsx","twMerge","cn","inputs","useRef","Matrix","className","containerRef","height","containerElement","resizeObserver","entries","entry","useClickAway","Root","rootRef","Container","jsxs","DragIndicator","rest","ColumnIndicator","id","position","visible","alphabetLetter","rulerIndicatorRef","rulerIndicatorHeight","dragging","setDragging","startClientX","setStartClientX","clientX","setClientX","difference","onDragStart","e","onDrag","rulerIndicatorElement","onDragEnd","nextWidth","createClassName","columnInRange","rulerIndicatorToPx","dragEventListeners","IntegerIcon","TooltipPrimitive","React","TooltipProvider","Tooltip","TooltipTrigger","TooltipContent","sideOffset","ref","QuestionMarkCircledIcon","TextIcon","CalendarIcon","CopyCheckIcon","DivideIcon","DollarSignIcon","ListTodoIcon","PercentIcon","ColumnTitleIndicator","name","description","CornerIndicator","Header","CaretSortIcon","CheckIcon","ChevronDownIcon","ChevronUpIcon","SelectPrimitive","Select","SelectValue","SelectTrigger","SelectScrollUpButton","SelectScrollDownButton","SelectContent","SelectLabel","SelectItem","SelectSeparator","BooleanDataEditor","onBlur","_onPaste","BooleanDataViewer","DateDataEditor","DateDataViewer","formatter","formatted","NumericFormat","NumericField","onFocus","onClick","settings","testid","disabled","dataCypress","tabIndex","thousandSeparator","decimalSeparator","decimalScale","getDecimalScale","allowNegative","min","max","prefix","suffix","strValue","setStrValue","waitCapToOnBlur","setWaitCapToOnBlur","onValueChange","_onBlur","numValue","newStrValue","percentageScaleToBeDisregarded","newDecimalScale","NumericEditor","setMode","NumericDataViewer","SelectDataEditor","items","text","SelectDataViewer","selected","item","displayValue","moveInputCursorToEnd","element","PLAIN_TEXT_MIME","readTextFromClipboard","CHAR_WIDTH","INPUT_MAX_LENGTH","TextDataEditor","valueAsString","textareaRef","textareaHeight","setTextareaHeight","overflow","charOverflow","clipboard","oneLineString","updateTextareaHeight","scrollHeight","_onChange","TextDataViewer","string","regex","DataEditor","DataViewer","Cell","coordinates","readonly","mode","dataEditorContainerRef","common","dataEditorElementMap","dataViewerElementMap","dataEditorElement","dataViewerElement","enterEditMode","enterKey","RowIndicator","isRowInRange","isEntireRowSelected","useId","Rows","Start","AddRowIcon","RemoveRowIcon","Slot","cva","buttonVariants","Button","variant","asChild","DropdownMenuPrimitive","ChevronRightIcon","DotFilledIcon","DropdownMenu","DropdownMenuTrigger","DropdownMenuSubTrigger","inset","DropdownMenuSubContent","DropdownMenuContent","DropdownMenuItem","DropdownMenuCheckboxItem","checked","DropdownMenuRadioItem","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuShortcut","ChevronDown","Toolbar","visibleColumns","allVisible","allVisibleLabel","visibleColumnsLabel","Spreadsheet","CapLink"],"mappings":"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","sourcesContent":["export function indexedAlphabet(columns: number): string {\n if (columns <= 0) {\n return '';\n }\n\n const asciiA = 'A'.charCodeAt(0);\n const remainder = (columns - 1) % 26;\n const quotient = Math.floor((columns - 1) / 26);\n\n return indexedAlphabet(quotient) + String.fromCharCode(asciiA + remainder);\n}\n","import type { Matrix } from '@/src/components/spreadsheet/model/matrix';\nimport type { Column, DataEditorType } from '@/src/components/spreadsheet/model/spreadsheet';\n\nexport namespace MatrixConverter {\n export type Input = {\n columns: Column[];\n matrix: Matrix<unknown>;\n };\n\n export type Output = {\n value: unknown;\n dataEditorType: DataEditorType;\n convertedValue?: {\n Boolean?: boolean;\n Integer?: number;\n Currency?: number;\n Decimal?: number;\n Float?: number;\n Percentage?: number;\n Date?: number;\n Select?: string;\n };\n };\n}\n\nexport function matrixConverter(params: MatrixConverter.Input): MatrixConverter.Output[][] {\n const { columns, matrix } = params;\n\n return matrix.map((rowValue) =>\n rowValue.map((columnValue, column) => {\n const dataEditorType = columns[column].dataEditorType;\n const selectItems = columns[column].settings?.select?.items || [];\n\n const newColumn: MatrixConverter.Output = { value: columnValue, dataEditorType };\n\n if (dataEditorType === 'Boolean') {\n newColumn.convertedValue = { Boolean: JSON.parse(columnValue as string) };\n }\n\n if (dataEditorType === 'Integer') {\n newColumn.convertedValue = { Integer: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Currency') {\n newColumn.convertedValue = { Currency: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Decimal') {\n newColumn.convertedValue = { Decimal: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Float') {\n newColumn.convertedValue = { Float: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Percentage') {\n newColumn.convertedValue = { Percentage: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Date') {\n newColumn.convertedValue = { Date: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Select') {\n newColumn.convertedValue = { Select: columnValue as string };\n }\n\n return newColumn;\n }),\n );\n}\n","export function dateFormatter(value: string) {\n try {\n if (value.includes('/'))\n return new Date(value.split('/').reverse().join('-'))\n .toISOString()\n .split('T')[0]\n .replace('+', '');\n\n return new Date(value).toISOString().split('T')[0].replace('+', '');\n } catch (error) {\n return null;\n }\n}\n","import type { MatrixConverter } from '@/src/components/spreadsheet/lib/matrix-output';\nimport type * as Matrix from '@/src/components/spreadsheet/model/matrix';\nimport type { MouseEvent, PropsWithChildren } from 'react';\n\n/** Spreadsheet column initial width */\nexport const COLUMN_INITIAL_WIDTH = 160;\n/** Spreadsheet column max width */\nexport const COLUMN_MAX_WIDTH = 320;\n/** Spreadsheet column min width */\nexport const COLUMN_MIN_WIDTH = 160;\n\n/** Spreadsheet column title initial height */\nexport const COLUMN_TITLE_INITIAL_HEIGHT = 36;\n/** Spreadsheet cell initial height */\nexport const CELL_INITIAL_HEIGHT = 26;\n\nexport const NUMERIC_DATA_EDITOR_TYPES: DataEditorType[] = [\n 'Decimal',\n 'Float',\n 'Integer',\n 'Percentage',\n 'Currency',\n];\n\n/** Dimensions of an element */\nexport type Dimensions = {\n /** The element's width in pixels */\n width: number;\n /** The element's height in pixels */\n height: number;\n};\n\n/** Select component item props */\nexport type SelectItem = { text: string; value: string };\n\n/** The mode of the cell */\nexport type Mode = 'edit' | 'readonly' | 'view';\n\n/** Cell data editor type */\nexport type DataEditorType =\n | 'Boolean'\n | 'String'\n | 'Select'\n | 'Date'\n | 'Integer'\n | 'Currency'\n | 'Float'\n | 'Decimal'\n | 'Percentage';\n\nexport type DataEditor = {\n /** Data editor current value */\n value?: unknown;\n /** Whether data editor data changes */\n onChange?: ({ data, point }: { data: unknown; point?: Matrix.Point }) => void;\n /** Whether user paste any value on data editor */\n onPaste?: (point?: Matrix.Point) => void;\n /** Whether user blur current data editor */\n onBlur?: () => void;\n /** Whether user clicks current data editor */\n onClick?: <T>(e: MouseEvent<T>) => void;\n /** Cell mode setter */\n setMode?: (mode: Mode) => void;\n\n selected?: boolean;\n\n column: Column;\n};\n\nexport type DataViewer = {\n /** Data viewer current value */\n value?: unknown;\n column: Column;\n\n selected?: boolean;\n};\n\n/** Spreadsheet column meta data and settings */\nexport type Column = {\n /** Column identifier */\n id: string;\n /** Column name to be displayed */\n name: string;\n /** Column tooltip description */\n description?: string;\n /** Column width */\n width: number;\n /** Whether column is visible to user */\n visible?: boolean;\n /** Column position */\n position: number;\n /** Column data editor type */\n dataEditorType: DataEditorType;\n /** Alphabet letter by position */\n alphabetLetter?: string;\n /** Whether column is readonly to user */\n readonly?: boolean;\n\n /** Column settings */\n settings?: {\n select?: {\n items: Array<SelectItem>;\n };\n\n numeric?: {\n min?: number;\n max?: number;\n allowNegative?: boolean;\n roundingRule?: string;\n decimalPlaces?: number;\n currency?: string;\n };\n\n string?: {\n maskData?: string;\n maskVisible?: boolean;\n charLimit?: string;\n };\n };\n};\n\n/** Initial column params before spreadsheet internal setup */\nexport type InitialColumn = Pick<\n Column,\n Exclude<keyof Column, 'id' | 'alphabetLetter' | 'position' | 'width'>\n> & {\n width?: number;\n};\n\n/** Spreadsheet Cell component */\nexport type Cell = {\n /** The cell value */\n value?: unknown;\n /** Point coordinates of the cell */\n coordinates: Matrix.Point;\n};\n\nexport type Props = {\n matrix: Matrix.Matrix<unknown>;\n onMatrixChange?: (matrix: MatrixConverter.Output[][]) => void;\n startingColumns: InitialColumn[];\n /** Defines if user can add or delete rows */\n staticRows?: boolean;\n className?: string;\n};\n\nexport type Context = {\n size: Matrix.Size;\n matrix: Matrix.Matrix<unknown>;\n columns: Column[];\n emptySize: boolean;\n /** Defines if user can add or delete rows */\n staticRows?: boolean;\n hasSomeEntireRow?: boolean;\n /** Whether last row is highlighted */\n highlightLastRow?: boolean;\n\n pointRange: Matrix.PointRange | null;\n setPointRange: (pointRange: Matrix.PointRange | null) => void;\n\n containerDimensions: Dimensions;\n setContainerDimensions: (dimensions: Dimensions) => void;\n\n onPaste: (point: Matrix.Point) => void;\n onChange: (params: { data: unknown; point: Matrix.Point }) => void;\n onRemoveRow: () => void;\n onSelectRow: (row: number, event?: MouseEvent) => void;\n onSelectCell: (point: Matrix.Point) => void;\n isCellSelected: (point: Matrix.Point) => boolean;\n onInsertNewRow: () => void;\n onColumnResize: (params: { width: number; columnId: string }) => void;\n onSelectSpreadsheet: () => void;\n onColumnVisibilityChange: (columnId: string) => void;\n};\n\nexport type ContextProvider = Omit<PropsWithChildren<Props>, 'className'>;\n","import { dateFormatter } from '@/src/components/spreadsheet/lib/date-formatter';\nimport * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\n\nexport function normalizeValue(params: {\n value: unknown;\n dataEditorType: Spreadsheet.DataEditorType;\n}) {\n const { value, dataEditorType } = params;\n\n if (dataEditorType === 'Date') {\n return dateFormatter(value as string) || '';\n }\n\n if (dataEditorType === 'Boolean') {\n return value === true ? 'true' : 'false';\n }\n\n const isNumeric = Spreadsheet.NUMERIC_DATA_EDITOR_TYPES.includes(dataEditorType);\n\n if (isNumeric) {\n return Number.isNaN(Number(value)) ? '' : value;\n }\n\n return value;\n}\n","/** A cell cordinates in matrix */\nexport type Point = {\n row: number;\n column: number;\n};\n\n/** Range between two points. */\nexport type PointRange = {\n /** The top-left point */\n start: Point;\n /** The bottom-right point */\n end: Point;\n};\n\n/** Counts of the rows and column in a matrix */\nexport type Size = {\n /** Count of the rows in the matrix */\n rows: number;\n /** Count of the columns in the matrix */\n columns: number;\n};\n\nexport type Matrix<T> = Array<Array<T | undefined>>;\n\n/** Creates an empty matrix with given rows and columns */\nexport function createEmpty<T>(size: Size, fill?: T): Matrix<T> {\n return new Array(size.rows).fill(undefined).map(() => new Array(size.columns).fill(fill));\n}\n\n/** Gets the count of rows of given matrix */\nexport function getRowsCount(matrix: Matrix<unknown>) {\n return matrix?.length;\n}\n\n/** Gets the count of columns of given matrix */\nexport function getColumnsCount(matrix: Matrix<unknown>) {\n const firstRow = matrix?.[0];\n return firstRow ? firstRow.length : 0;\n}\n\n/** Gets the count of rows and columns of given matrix */\nexport function getSize(matrix: Matrix<unknown>): Size {\n return {\n columns: getColumnsCount(matrix),\n rows: getRowsCount(matrix),\n };\n}\n\n/** Gets the value at row and column of matrix. */\nexport function getPoint<T>(params: { point: Point; matrix: Matrix<T> }) {\n const { point, matrix } = params;\n\n const columns = matrix[point.row];\n\n if (columns === undefined) {\n return undefined;\n }\n\n return columns[point.column];\n}\n\n/** Checks if the source and target point are equal */\nexport function isSamePoint(source: Point, target: Point) {\n return source.column === target.column && source.row === target.row;\n}\n\n/** Returns whether given point exists in given range */\nexport function hasPointInRange(pointRange: PointRange, point: Point): boolean {\n return (\n point.row >= pointRange.start.row &&\n point.column >= pointRange.start.column &&\n point.row <= pointRange.end.row &&\n point.column <= pointRange.end.column\n );\n}\n\n/** Determines whether all columns are selected */\nexport function hasEntireColumns(params: { matrix: Matrix<unknown>; pointRange: PointRange }) {\n const { matrix, pointRange } = params;\n return pointRange.start.column === 0 && pointRange.end.column === getColumnsCount(matrix);\n}\n\n/** Determines which row is entirely selected in given selection */\nexport function hasEntireRows(params: {\n matrix: Matrix<unknown>;\n pointRange: PointRange;\n row: number;\n}) {\n const { matrix, pointRange, row } = params;\n return (\n row >= pointRange.start.row &&\n row <= pointRange.end.row &&\n hasEntireColumns({ matrix, pointRange })\n );\n}\n\n/** Converts string value into an matrix */\nexport function parseString(value: string): Matrix<unknown> {\n return value.split('\\n').map((row) => row.split('\\t'));\n}\n\n/**\n * Overlaps a given Matrix B (mB) starting in a specific point into a given Matrix A (mA)\n * Matrix B (mB) always has priority when replacing cell values\n */\nexport function overlap(params: {\n mA: Matrix<unknown>;\n mB: Matrix<unknown>;\n point: Point;\n}): Matrix<unknown> {\n const { mA, mB, point = { column: 0, row: 0 } } = params;\n\n const mASize = getSize(mA);\n const mBSize = getSize(mB);\n\n const fillRows = point.row + mBSize.rows > mASize.rows;\n const fillColumns = point.column + mBSize.columns > mBSize.columns;\n\n const rows = fillRows ? point.row + mBSize.rows : mASize.rows;\n const columns = fillColumns ? point.column + mBSize.columns : mASize.columns;\n\n const mC = createEmpty({ rows, columns });\n\n for (let y = 0; y < mASize.rows; y += 1) {\n for (let x = 0; x < mASize.columns; x += 1) {\n mC[y][x] = mA[y][x];\n }\n }\n\n for (let y = 0; y < mBSize.rows; y += 1) {\n for (let x = 0; x < mBSize.columns; x += 1) {\n mC[y + point.row][x + point.column] = mB[y][x];\n }\n }\n\n return mC;\n}\n","import { indexedAlphabet } from '@/src/components/spreadsheet/lib/indexed-alphabet';\nimport { matrixConverter } from '@/src/components/spreadsheet/lib/matrix-output';\nimport { normalizeValue } from '@/src/components/spreadsheet/lib/normalize-value';\nimport * as Matrix from '@/src/components/spreadsheet/model/matrix';\nimport type * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport {\n COLUMN_INITIAL_WIDTH,\n COLUMN_MAX_WIDTH,\n COLUMN_MIN_WIDTH,\n type Column,\n type Dimensions,\n type InitialColumn,\n} from '@/src/components/spreadsheet/model/spreadsheet';\nimport { nanoid } from 'nanoid';\nimport { type MouseEvent, createContext, useCallback, useEffect, useMemo, useState } from 'react';\n\nlet timeoutId: ReturnType<typeof setTimeout>;\n\nexport const SpreadsheetContext = createContext<Spreadsheet.Context | null>(null);\n\nexport function SpreadsheetContextProvider(props: Spreadsheet.ContextProvider) {\n const {\n children,\n startingColumns,\n matrix: startingMatrix = [],\n staticRows,\n onMatrixChange,\n } = props;\n\n const [matrix, setMatrix] = useState(startingMatrix);\n const [columns, setColumns] = useState<Column[]>(() => setupColumns(startingColumns));\n const [pointRange, setPointRange] = useState<Matrix.PointRange | null>(null);\n const [containerDimensions, setContainerDimensions] = useState<Dimensions>({\n height: 0,\n width: 0,\n });\n\n const [highlightLastRow, setHighlightLastRow] = useState(false);\n\n /** Function called to highlight when user add a new row */\n const highlight = useCallback((ms = 2000) => {\n setHighlightLastRow(true);\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => setHighlightLastRow(false), ms);\n }, []);\n\n const columnsCount = useMemo(\n () => Matrix.getColumnsCount(matrix) || columns.length,\n [matrix, columns.length],\n );\n const size = useMemo(() => Matrix.getSize(matrix), [matrix]);\n const emptySize = useMemo(() => size.rows === 0, [size.rows]);\n\n const hasSomeEntireRow = useMemo(\n () => !!(pointRange && Matrix.hasEntireColumns({ matrix, pointRange })),\n [pointRange, matrix],\n );\n\n const onConvertedMatrixChange = useCallback(\n (matrix: Matrix.Matrix<unknown>) => {\n if (onMatrixChange) {\n const newMatrix = matrixConverter({ columns, matrix });\n onMatrixChange(newMatrix);\n }\n },\n [onMatrixChange, columns],\n );\n\n const onPaste = useCallback(\n async (point: Matrix.Point) => {\n const { state } = await navigator.permissions.query({\n name: 'clipboard-read' as PermissionName,\n });\n\n if (state === 'denied') {\n console.log('denied');\n return;\n }\n\n const value = await navigator.clipboard.readText();\n\n const mB = Matrix.parseString(value);\n\n /** Overlaps mA and mB, also prevent putting values in readonly columns */\n const overlapped = Matrix.overlap({ mA: matrix, mB, point }).map((row) =>\n row.map((columnValue, column) => (columns[column]?.readonly ? '' : columnValue)),\n );\n\n const normalized = overlapped.map((row) =>\n row.map((columnValue, column) =>\n normalizeValue({ value: columnValue, dataEditorType: columns[column]?.dataEditorType }),\n ),\n );\n\n const nextColumns = normalized.map((row) => row.slice(0, startingColumns.length));\n const nextMatrix = staticRows ? nextColumns.slice(0, matrix.length) : nextColumns;\n\n setMatrix(nextMatrix);\n onConvertedMatrixChange(nextMatrix);\n },\n [columns, matrix, startingColumns.length, onConvertedMatrixChange, staticRows],\n );\n\n const onChange = useCallback(\n (params: { data: unknown; point: Matrix.Point }) => {\n const { data, point } = params;\n const { column, row } = point;\n\n const nextMatrix = structuredClone(matrix);\n nextMatrix[row][column] = data;\n\n setMatrix(nextMatrix);\n onConvertedMatrixChange(nextMatrix);\n },\n [matrix, onConvertedMatrixChange],\n );\n\n const onRemoveRow = useCallback(() => {\n if (pointRange && !staticRows) {\n const rowStart = pointRange.start.row;\n const rowEnd = pointRange.end.row;\n const delta = rowEnd - rowStart + 1;\n\n if (!hasSomeEntireRow) return;\n\n const confirmedMessage =\n delta > 1\n ? `Você irá excluir ${delta} linhas, deseja continuar?\\nLinha N° ${rowStart + 1} até N° ${\n rowEnd + 1\n }`\n : `Você irá excluir a linha N° ${rowStart + 1}, deseja continuar?`;\n\n const confirmed = confirm(confirmedMessage);\n\n if (!confirmed) return;\n\n const nextMatrix = matrix.filter((row, index) => index < rowStart || index > rowEnd);\n\n setPointRange(null);\n setMatrix(nextMatrix);\n onConvertedMatrixChange(nextMatrix);\n }\n }, [matrix, pointRange, staticRows, hasSomeEntireRow, onConvertedMatrixChange]);\n\n const onSelectRow = useCallback(\n (row: number, event?: MouseEvent) => {\n if (pointRange && event && event.shiftKey) {\n const normalizedStart = row < pointRange.start.row ? row : pointRange.start.row;\n const normalizedEnd = row < pointRange.start.row ? pointRange.start.row : row;\n\n const newPointRange: Matrix.PointRange = {\n start: { row: normalizedStart, column: 0 },\n end: { row: normalizedEnd, column: columnsCount },\n };\n\n return setPointRange(newPointRange);\n }\n\n setPointRange({ start: { row, column: 0 }, end: { row, column: columnsCount } });\n },\n [columnsCount, pointRange],\n );\n\n const onSelectCell = useCallback(\n (point: Matrix.Point) => {\n if (point.row === pointRange?.start.row && point.column === pointRange.start.column) return;\n setPointRange({ start: point, end: point });\n },\n [pointRange?.start.row, pointRange?.start.column],\n );\n\n const isCellSelected = useCallback(\n (point: Matrix.Point) => {\n return !!(pointRange && Matrix.hasPointInRange(pointRange, point));\n },\n [pointRange],\n );\n\n const onColumnResize = useCallback((params: { width: number; columnId: string }) => {\n const { columnId, width } = params;\n\n let newWidth = width;\n\n if (width > COLUMN_MAX_WIDTH) {\n newWidth = COLUMN_MAX_WIDTH;\n }\n\n if (width < COLUMN_MIN_WIDTH) {\n newWidth = COLUMN_MIN_WIDTH;\n }\n\n /** When X matches the column to be resized, it returns new width,\n * otherwise returns previous column value */\n setColumns((previous) =>\n previous.map((column) => (column.id === columnId ? { ...column, width: newWidth } : column)),\n );\n }, []);\n\n const onInsertNewRow = useCallback(() => {\n if (staticRows) return;\n\n const nextMatrix = [...structuredClone(matrix), new Array(columnsCount).fill('')];\n\n setMatrix(nextMatrix);\n onConvertedMatrixChange(nextMatrix);\n\n highlight();\n }, [staticRows, matrix, columnsCount, highlight, onConvertedMatrixChange]);\n\n const onSelectSpreadsheet = useCallback(() => {\n const start: Matrix.Point = { column: 0, row: 0 };\n const end: Matrix.Point = { column: size.columns, row: size.rows - 1 };\n setPointRange({ start, end });\n }, [size]);\n\n const onColumnVisibilityChange = useCallback((columnId: string) => {\n setColumns((previous) =>\n previous.map((column) =>\n column.id === columnId ? { ...column, visible: !column.visible } : column,\n ),\n );\n }, []);\n\n useEffect(() => {\n setMatrix(startingMatrix);\n }, [startingMatrix]);\n\n useEffect(() => {\n setColumns(() => setupColumns(startingColumns));\n }, [startingColumns]);\n\n const value: Spreadsheet.Context = useMemo(\n () => ({\n size,\n matrix,\n columns,\n emptySize,\n staticRows,\n hasSomeEntireRow,\n highlightLastRow,\n\n pointRange,\n setPointRange,\n\n containerDimensions,\n setContainerDimensions,\n\n onPaste,\n onChange,\n onRemoveRow,\n onSelectRow,\n onSelectCell,\n isCellSelected,\n onInsertNewRow,\n onColumnResize,\n onSelectSpreadsheet,\n onColumnVisibilityChange,\n }),\n [\n size,\n matrix,\n columns,\n emptySize,\n staticRows,\n hasSomeEntireRow,\n highlightLastRow,\n\n pointRange,\n containerDimensions,\n\n onPaste,\n onChange,\n onRemoveRow,\n onSelectRow,\n onSelectCell,\n isCellSelected,\n onInsertNewRow,\n onColumnResize,\n onSelectSpreadsheet,\n onColumnVisibilityChange,\n ],\n );\n\n return <SpreadsheetContext.Provider value={value}>{children}</SpreadsheetContext.Provider>;\n}\n\n/** Spreadsheet columns internal states and values setup function */\nfunction setupColumns(columns: InitialColumn[]): Column[] {\n return columns.map((column, index) => ({\n ...column,\n id: `spreadsheet__column__id__${nanoid()}`,\n alphabetLetter: indexedAlphabet(index + 1),\n position: index,\n width: column.width || COLUMN_INITIAL_WIDTH,\n visible: true,\n }));\n}\n","import { SpreadsheetContext } from '@/src/components/spreadsheet/ui/context';\nimport { useContext } from 'react';\n\nexport function useSpreadsheet() {\n const context = useContext(SpreadsheetContext);\n\n if (!context) {\n throw new Error('useSpreadsheet has to be used within <SpreadsheetContext.Provider>');\n }\n\n return context;\n}\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport { type PropsWithChildren, useEffect, useMemo, useRef } from 'react';\n\ntype MatrixProps = PropsWithChildren<{\n className?: string;\n}>;\n\nexport function Matrix(props: MatrixProps) {\n const { children, className } = props;\n const { size, staticRows, setContainerDimensions } = useSpreadsheet();\n\n const containerRef = useRef<null | HTMLDivElement>(null);\n\n const height = useMemo(\n () => size.rows * Spreadsheet.CELL_INITIAL_HEIGHT + Spreadsheet.COLUMN_TITLE_INITIAL_HEIGHT,\n [size.rows],\n );\n\n useEffect(() => {\n const containerElement = containerRef.current;\n\n if (!containerElement) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n\n if (entry) {\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n setContainerDimensions({ height, width });\n }\n });\n\n resizeObserver.observe(containerElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [setContainerDimensions]);\n\n return (\n <div\n ref={containerRef}\n className={cn(\n 'relative w-full border border-t-0 border-r-0',\n size.rows >= 7 ? 'border-b-0' : 'border-b',\n staticRows ? `${height}px border-b-0` : 'min-h-[260px]',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import { type PropsWithChildren, useRef } from 'react';\nimport { useClickAway } from 'react-use';\n\nimport { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\n\ntype RootProps = PropsWithChildren<{\n className?: string;\n}>;\n\nexport function Root(props: RootProps) {\n const { children, className } = props;\n const { setPointRange } = useSpreadsheet();\n\n const rootRef = useRef<HTMLDivElement | null>(null);\n\n useClickAway(rootRef, () => setPointRange(null));\n\n return (\n <div ref={rootRef} className={cn('min-w-[640px]', className)}>\n {children}\n </div>\n );\n}\n","import { Matrix } from '@/src/components/spreadsheet/ui/containers/matrix';\nimport { Root } from '@/src/components/spreadsheet/ui/containers/root';\n\nexport const Container = {\n Matrix,\n Root,\n};\n","import { cn } from '@/src/shared/lib/cn';\nimport type { DragEvent } from 'react';\n\ntype DragIndicatorProps = {\n\tonDragStart?: (e: DragEvent<HTMLButtonElement>) => void;\n\tonDrag?: (e: DragEvent<HTMLButtonElement>) => void;\n\tonDragEnd?: (e: DragEvent<HTMLButtonElement>) => void;\n\n\tclassName?: string;\n};\n\nexport function DragIndicator(props: DragIndicatorProps) {\n\tconst { className, ...rest } = props;\n\n\treturn (\n\t\t<button\n\t\t\tdraggable\n\t\t\tclassName={cn(\n\t\t\t\t'h-9 w-1.5 cursor-col-resize rounded-sm bg-neutral-400 drop-shadow-md',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...rest}\n\t\t>\n\t\t\t<div className=\"relative\">\n\t\t\t\t<span className=\"-translate-y-1/2 absolute top-1/2 right-2.5 h-3 w-1 rounded-full bg-neutral-300\" />\n\t\t\t\t<span className=\"-translate-y-1/2 absolute top-1/2 left-2.5 h-3 w-1 rounded-full bg-neutral-300\" />\n\t\t\t</div>\n\t\t</button>\n\t);\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport * as Matrix from '@/src/components/spreadsheet/model/matrix';\nimport * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { DragIndicator } from '@/src/components/spreadsheet/ui/indicators/drag-indicator';\nimport { cn } from '@/src/shared/lib/cn';\nimport {\n type DragEvent,\n type PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\ntype ColumnIndicatorProps = PropsWithChildren<{\n className?: string;\n column: Spreadsheet.Column;\n}>;\n\nexport function ColumnIndicator(props: ColumnIndicatorProps) {\n const { className, column, children } = props;\n const { id, width, position, visible, alphabetLetter } = column;\n\n const { matrix, pointRange, containerDimensions, onColumnResize } = useSpreadsheet();\n\n const rulerIndicatorRef = useRef<HTMLDivElement | null>(null);\n const rulerIndicatorHeight = useMemo(\n () => (containerDimensions?.height || 0) + 32,\n [containerDimensions?.height],\n );\n\n const [dragging, setDragging] = useState(false);\n const [startClientX, setStartClientX] = useState(0);\n const [clientX, setClientX] = useState(0);\n\n const difference = useMemo(\n () => (dragging ? clientX - startClientX : 0),\n [dragging, clientX, startClientX],\n );\n\n const onDragStart = useCallback((e: DragEvent<HTMLButtonElement>) => {\n setStartClientX(e.clientX);\n setDragging(true);\n }, []);\n\n const onDrag = useCallback(\n (e: DragEvent<HTMLButtonElement>) => {\n const rulerIndicatorElement = rulerIndicatorRef.current;\n\n if (!rulerIndicatorElement) return;\n\n const difference = e.clientX - startClientX;\n\n let newWidth = width + difference;\n\n if (newWidth > Spreadsheet.COLUMN_MAX_WIDTH) newWidth = Spreadsheet.COLUMN_MAX_WIDTH;\n if (newWidth < Spreadsheet.COLUMN_MIN_WIDTH) newWidth = Spreadsheet.COLUMN_MIN_WIDTH;\n\n rulerIndicatorElement.style.left = `${newWidth}px`;\n\n setClientX(e.clientX);\n },\n [startClientX, width],\n );\n\n const onDragEnd = useCallback(\n (e: DragEvent<HTMLButtonElement>) => {\n const difference = e.clientX - startClientX;\n const nextWidth = width + difference;\n onColumnResize({ width: nextWidth, columnId: id });\n setDragging(false);\n },\n [startClientX, width, id, onColumnResize],\n );\n\n const createClassName = useCallback(() => {\n if (dragging) return `bg-neutral-100 font-bold text-neutral-700 ${className}`;\n\n if (pointRange && !dragging) {\n const { start, end } = pointRange;\n\n const hasEntireColumns = Matrix.hasEntireColumns({ matrix, pointRange });\n const columnInRange = position >= start.column && position <= end.column;\n\n if (hasEntireColumns) return `bg-[#0085FF] font-bold text-white ${className}`;\n\n if (columnInRange) return `bg-blue-100 font-bold text-blue-700 ${className}`;\n }\n\n return className;\n }, [dragging, className, matrix, pointRange, position]);\n\n const rulerIndicatorToPx = useCallback(() => {\n let newWidth = width + difference;\n\n if (newWidth > Spreadsheet.COLUMN_MAX_WIDTH) newWidth = Spreadsheet.COLUMN_MAX_WIDTH;\n if (newWidth < Spreadsheet.COLUMN_MIN_WIDTH) newWidth = Spreadsheet.COLUMN_MIN_WIDTH;\n\n return `${newWidth}px`;\n }, [width, difference]);\n\n const dragEventListeners = useMemo(\n () => ({ onDragStart, onDrag, onDragEnd }),\n [onDragStart, onDrag, onDragEnd],\n );\n\n useEffect(() => {\n const rulerIndicatorElement = rulerIndicatorRef.current;\n\n if (!rulerIndicatorElement) return;\n\n rulerIndicatorElement.style.left = `${width}px`;\n }, [width]);\n\n if (!visible) return null;\n\n return (\n <div\n style={{ width }}\n className={cn(\n 'relative flex h-7 w-32 shrink-0 items-center justify-center border border-t-0 border-l-0 text-[#8E8EA9] text-xs',\n createClassName(),\n )}\n >\n <DragIndicator\n {...dragEventListeners}\n className={cn(\n '-right-[3px] -top-1 absolute z-50 opacity-0 hover:opacity-100',\n dragging && 'opacity-0',\n )}\n />\n\n <div\n ref={rulerIndicatorRef}\n style={{ height: rulerIndicatorHeight }}\n className={cn(\n '-top-4 pointer-events-none absolute z-50 h-full w-1.5 rounded-full bg-blue-400 shadow-lg outline outline-sky-100',\n dragging ? 'opacity-100' : 'opacity-0',\n )}\n >\n <span className=\"-translate-y-1/2 relative top-8 left-4 z-50 select-none rounded-md border bg-white p-1 font-semibold drop-shadow-md\">\n {rulerIndicatorToPx()}\n </span>\n </div>\n\n <span>{children || alphabetLetter}</span>\n </div>\n );\n}\n","import type { SVGProps } from 'react';\n\nexport function IntegerIcon(props: SVGProps<SVGSVGElement>) {\n\treturn (\n\t\t<svg\n\t\t\tstroke=\"currentColor\"\n\t\t\tfill=\"currentColor\"\n\t\t\tstrokeWidth=\"0\"\n\t\t\tviewBox=\"0 0 24 24\"\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t{...props}\n\t\t>\n\t\t\t<path d=\"M13.003 7.754a.75.75 0 0 1 .75-.75h5.232a.75.75 0 0 1 .53 1.28l-2.776 2.777c.55.097 1.057.253 1.492.483.905.477 1.504 1.284 1.504 2.418 0 .966-.471 1.75-1.172 2.27-.687.511-1.587.77-2.521.77-1.367 0-2.274-.528-2.667-.756a.75.75 0 0 1 .755-1.297c.331.193.953.553 1.912.553.673 0 1.243-.188 1.627-.473.37-.275.566-.635.566-1.067 0-.5-.219-.836-.703-1.091-.538-.284-1.375-.443-2.471-.443a.75.75 0 0 1-.53-1.28l2.643-2.644h-3.421a.75.75 0 0 1-.75-.75ZM7.88 15.215a1.4 1.4 0 0 0-1.446.83.75.75 0 0 1-1.37-.61 2.899 2.899 0 0 1 2.986-1.71c.589.06 1.139.323 1.557.743.434.446.685 1.058.685 1.778 0 1.641-1.254 2.437-2.12 2.986-.538.341-1.18.694-1.495 1.273H9.75a.75.75 0 0 1 0 1.5h-4a.75.75 0 0 1-.75-.75c0-1.799 1.337-2.63 2.243-3.21 1.032-.659 1.55-1.031 1.55-1.8 0-.355-.116-.584-.26-.732a1.071 1.071 0 0 0-.652-.298Zm.234-13.121a.75.75 0 0 1 .386.656V9h1.252a.75.75 0 0 1 0 1.5H5.75a.75.75 0 0 1 0-1.5H7V4.103l-.853.533a.749.749 0 1 1-.795-1.272l2-1.25a.749.749 0 0 1 .762-.02Z\"></path>\n\t\t</svg>\n\t);\n}\n","'use client';\n\nimport { cn } from '@/src/shared/lib/cn';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport * as React from 'react';\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'fade-in-0 zoom-in-95 data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 animate-in overflow-hidden rounded-md bg-primary px-3 py-1.5 text-primary-foreground text-xs data-[state=closed]:animate-out',\n className,\n )}\n {...props}\n />\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n","import * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { IntegerIcon } from '@/src/components/spreadsheet/ui/icons/integer-icon';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/src/shared/ui/tooltip';\nimport { QuestionMarkCircledIcon, TextIcon } from '@radix-ui/react-icons';\nimport {\n CalendarIcon,\n CopyCheckIcon,\n DivideIcon,\n DollarSignIcon,\n ListTodoIcon,\n PercentIcon,\n} from 'lucide-react';\n\nexport function ColumnTitleIndicator({ column }: { column: Spreadsheet.Column }) {\n const { width, name, visible, dataEditorType, description } = column;\n\n if (!visible) return null;\n\n return (\n <div\n className=\"flex h-9 w-32 shrink-0 items-center border border-t-0 border-l-0 bg-[#F6F6F9] px-2\"\n style={{\n width,\n height: Spreadsheet.COLUMN_TITLE_INITIAL_HEIGHT,\n }}\n >\n <div className=\"mr-2 w-4 shrink-0 text-[#8E8EA9]\">\n {dataEditorType === 'String' && <TextIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Date' && <CalendarIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Boolean' && <CopyCheckIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Select' && <ListTodoIcon className=\"h-4 w-4\" />}\n\n {dataEditorType === 'Float' && <DivideIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Decimal' && <DivideIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Integer' && <IntegerIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Currency' && <DollarSignIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Percentage' && <PercentIcon className=\"h-4 w-4\" />}\n </div>\n\n <p\n title={name}\n className=\"mr-2 line-clamp-2 w-full break-words font-semibold text-[#4A4A6A] text-xs\"\n >\n {name}\n </p>\n\n {description ? (\n <TooltipProvider>\n <Tooltip delayDuration={100}>\n <TooltipTrigger>\n <QuestionMarkCircledIcon className=\"h-4 w-4 text-[#4A4A6A]\" />\n </TooltipTrigger>\n\n <TooltipContent className=\"max-w-[240px]\">\n <p>{description}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : (\n <div className=\"w-4 shrink-0\" />\n )}\n </div>\n );\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\n\nexport function CornerIndicator({ className }: { className?: string }) {\n\tconst { emptySize, onSelectSpreadsheet } = useSpreadsheet();\n\n\treturn (\n\t\t<button\n\t\t\tdisabled={emptySize}\n\t\t\tclassName={cn(\n\t\t\t\t'relative flex h-7 w-12 shrink-0 items-center justify-center border border-l border-t bg-white text-xs',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\tonClick={onSelectSpreadsheet}\n\t\t>\n\t\t\t<span className=\"absolute right-0 top-0 h-full w-0.5 bg-gray-300\" />\n\t\t\t<span className=\"absolute bottom-0 left-0 h-0.5 w-full bg-gray-300\" />\n\t\t</button>\n\t);\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { ColumnIndicator } from '@/src/components/spreadsheet/ui/indicators/column-indicator';\nimport { ColumnTitleIndicator } from '@/src/components/spreadsheet/ui/indicators/column-title-indicator';\nimport { CornerIndicator } from '@/src/components/spreadsheet/ui/indicators/corner-indicator';\n\nexport function Header() {\n const { columns } = useSpreadsheet();\n\n return (\n <div className=\"sticky top-[58px] z-50\">\n <div className=\"relative flex items-center bg-white\">\n <CornerIndicator className=\"border-t-0 border-l-0\" />\n\n {columns.map((column) => (\n <ColumnIndicator\n key={`spreadsheet__column__indicator__key__${column.name}__${column.position}`}\n column={column}\n />\n ))}\n </div>\n\n <div className=\"flex items-center\">\n <div className=\"h-9 w-12 shrink-0 cursor-default border border-t-0 border-l-0 bg-[#F6F6F9]\" />\n\n {columns.map((column) => (\n <ColumnTitleIndicator\n key={`spreadsheet__column__header__key__${column.name}__${column.position}`}\n column={column}\n />\n ))}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { cn } from '@/src/shared/lib/cn';\nimport { CaretSortIcon, CheckIcon, ChevronDownIcon, ChevronUpIcon } from '@radix-ui/react-icons';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport * as React from 'react';\n\nconst Select = SelectPrimitive.Root;\n\nconst SelectGroup = SelectPrimitive.Group;\n\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent py-2 pr-px pl-3 text-sm shadow-sm ring-offset-background [&>span]:line-clamp-1 disabled:cursor-not-allowed placeholder:text-muted-foreground disabled:opacity-50 focus:outline-none focus:ring-1 focus:ring-ring',\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <CaretSortIcon className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronUpIcon />\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronDownIcon />\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=closed]:animate-out data-[state=open]:animate-in',\n position === 'popper' &&\n 'data-[side=left]:-translate-x-1 data-[side=top]:-translate-y-1 data-[side=right]:translate-x-1 data-[side=bottom]:translate-y-1',\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]',\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 font-semibold text-sm', className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pr-8 pl-2 text-sm outline-none data-[disabled]:pointer-events-none focus:bg-accent focus:text-accent-foreground data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n","import type * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/src/shared/ui/select';\nimport { CaretSortIcon } from '@radix-ui/react-icons';\nimport { type ClipboardEvent, useCallback } from 'react';\n\nexport function BooleanDataEditor(props: Spreadsheet.DataEditor) {\n const { value, onBlur, onChange, onPaste } = props;\n\n const _onPaste = useCallback(\n (e: ClipboardEvent<HTMLButtonElement>) => {\n e.preventDefault();\n onPaste?.();\n },\n [onPaste],\n );\n\n return (\n <Select value={value as string} onValueChange={(data) => onChange?.({ data })} defaultOpen>\n <SelectTrigger\n onBlur={onBlur}\n onPaste={_onPaste}\n className={cn(\n 'h-full w-full rounded-none border-none pl-1 text-xs outline-none focus:ring-0',\n )}\n autoFocus\n >\n <SelectValue placeholder=\"Selecionar\" />\n </SelectTrigger>\n\n <SelectContent>\n <SelectItem className=\"text-xs\" value=\"true\">\n Sim\n </SelectItem>\n\n <SelectItem className=\"text-xs\" value=\"false\">\n Não\n </SelectItem>\n </SelectContent>\n </Select>\n );\n}\n\nexport function BooleanDataViewer({ value }: Spreadsheet.DataViewer) {\n const empty = value === '';\n const displayValue = empty ? 'Selecionar' : value === 'true' ? 'Sim' : 'Não';\n\n return (\n <div className=\"flex h-full w-full items-center justify-between pr-px pl-1\">\n <p className=\"line-clamp-1 text-xs\">{displayValue}</p>\n <CaretSortIcon className=\"h-4 w-4 opacity-50\" />\n </div>\n );\n}\n","import type * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport { type ClipboardEvent, useCallback } from 'react';\n\nexport function DateDataEditor(props: Spreadsheet.DataEditor) {\n const { value, onBlur, onChange, onPaste } = props;\n\n const _onPaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n onPaste?.();\n },\n [onPaste],\n );\n\n return (\n <input\n type=\"date\"\n onBlur={onBlur}\n onPaste={_onPaste}\n value={value as string}\n onChange={(e) => onChange?.({ data: e.target.value })}\n className={cn('h-full w-full bg-transparent pl-1 text-xs outline-none')}\n autoFocus\n />\n );\n}\n\nexport function DateDataViewer(props: Spreadsheet.DataViewer) {\n const { value } = props;\n const formatter = Intl.DateTimeFormat('pt-BR', { dateStyle: 'short' });\n const formatted = value ? formatter.format(new Date(value as string)) : 'dd/mm/yyyy';\n\n return (\n <div className=\"flex h-full w-full items-center\">\n <p className=\"line-clamp-1 pl-1 text-xs\">{formatted as string}</p>\n </div>\n );\n}\n","import type { Column, DataEditorType } from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport { type ClipboardEvent, type FocusEvent, type MouseEvent, useEffect, useState } from 'react';\nimport { type NumberFormatValues, NumericFormat } from 'react-number-format';\n\nexport type NumericFieldProps = {\n value?: string;\n onChange?: (value?: string) => void;\n onBlur?: () => void;\n onFocus?: (e: FocusEvent<HTMLInputElement>) => void;\n onClick?: (e: MouseEvent<HTMLInputElement>) => void;\n onPaste?: (e: ClipboardEvent<HTMLInputElement>) => void;\n tabIndex?: number;\n\n dataEditorType: DataEditorType;\n settings?: Partial<Column['settings']>;\n disabled?: boolean;\n\n testid?: string;\n className?: string;\n\n dataCypress?: string;\n};\n\nexport function NumericField(props: NumericFieldProps) {\n const {\n className,\n dataEditorType,\n onFocus,\n onBlur,\n onChange,\n onClick,\n onPaste,\n settings,\n testid,\n value,\n disabled,\n dataCypress,\n tabIndex,\n } = props;\n\n const thousandSeparator = '.';\n const decimalSeparator = ',';\n const decimalScale = getDecimalScale({\n dataEditorType,\n decimalScale: settings?.numeric?.decimalPlaces,\n });\n const allowNegative = settings?.numeric?.allowNegative;\n const min = settings?.numeric?.min;\n const max = settings?.numeric?.max;\n\n const prefix = dataEditorType.toLocaleLowerCase() === 'currency' ? 'R$ ' : '';\n const suffix = dataEditorType.toLocaleLowerCase() === 'percentage' ? '%' : '';\n\n const [strValue, setStrValue] = useState<string | undefined>(value);\n\n const [waitCapToOnBlur, setWaitCapToOnBlur] = useState(false);\n\n const onValueChange = ({ value }: NumberFormatValues) => {\n setStrValue(value);\n onChange?.(value);\n };\n\n const _onBlur = () => {\n let waitCapToOnBlur = false;\n\n const numValue = Number(value);\n\n let newStrValue = value;\n\n if (typeof min === 'number') {\n if (numValue < min) newStrValue = min.toString();\n }\n\n if (typeof max === 'number') {\n if (numValue > max) newStrValue = max.toString();\n }\n\n if (newStrValue !== value) {\n waitCapToOnBlur = true;\n\n onChange?.(newStrValue);\n setStrValue(newStrValue);\n setWaitCapToOnBlur(waitCapToOnBlur);\n }\n\n if (!waitCapToOnBlur) onBlur?.();\n };\n\n useEffect(() => {\n if (waitCapToOnBlur) {\n onBlur?.();\n setWaitCapToOnBlur(false);\n }\n }, [onBlur, waitCapToOnBlur]);\n\n useEffect(() => {\n setStrValue(value);\n }, [value]);\n\n return (\n <NumericFormat\n tabIndex={tabIndex}\n value={strValue}\n onPaste={onPaste}\n prefix={prefix}\n suffix={suffix}\n fixedDecimalScale\n onBlur={_onBlur}\n data-testid={testid}\n valueIsNumericString\n onFocus={onFocus}\n onClick={onClick}\n decimalScale={decimalScale}\n onValueChange={onValueChange}\n allowNegative={allowNegative}\n decimalSeparator={decimalSeparator}\n thousandSeparator={thousandSeparator}\n className={cn(\n 'h-full w-full rounded-none bg-transparent pl-1 text-xs outline-none',\n className,\n )}\n disabled={disabled}\n data-cypress={dataCypress}\n autoFocus\n />\n );\n}\n\nexport const percentageRatio = 100;\nexport const percentageScaleToBeDisregarded = 2;\n\nexport function getDecimalScale(params: { dataEditorType: DataEditorType; decimalScale?: number }) {\n const { dataEditorType, decimalScale } = params;\n\n let newDecimalScale = decimalScale;\n\n if (dataEditorType.toLowerCase() === 'percentage') {\n if (decimalScale) {\n newDecimalScale = decimalScale > 2 ? decimalScale - percentageScaleToBeDisregarded : 0;\n } else {\n newDecimalScale = 0;\n }\n }\n\n if (!decimalScale) {\n if (dataEditorType.toLowerCase() === 'decimal') newDecimalScale = 2;\n if (dataEditorType.toLowerCase() === 'float') newDecimalScale = 2;\n if (dataEditorType.toLowerCase() === 'integer') newDecimalScale = 0;\n if (dataEditorType.toLowerCase() === 'currency') newDecimalScale = 2;\n }\n\n return newDecimalScale;\n}\n","import type * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { NumericField } from '@/src/components/tmp/numeric';\nimport { type ClipboardEvent, useCallback } from 'react';\n\nexport function NumericEditor(props: Spreadsheet.DataEditor) {\n const { value, onBlur, onChange, onPaste, setMode, column } = props;\n\n const _onPaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n onPaste?.();\n },\n [onPaste],\n );\n\n const _onBlur = useCallback(() => {\n onBlur?.();\n setMode?.('view');\n }, [onBlur, setMode]);\n\n return (\n <NumericField\n dataEditorType={column.dataEditorType}\n value={value as string}\n onPaste={_onPaste}\n onBlur={_onBlur}\n onChange={(value) => onChange?.({ data: value })}\n settings={column.settings}\n />\n );\n\n // return (\n // <input\n // type=\"number\"\n // onBlur={_onBlur}\n // onPaste={_onPaste}\n // value={value as string}\n // onChange={(e) => onChange?.({ data: e.target.value })}\n // className={cn('h-full w-full bg-transparent pl-1 text-xs outline-none')}\n // autoFocus\n // />\n // );\n}\n\nexport function NumericDataViewer(props: Spreadsheet.DataViewer) {\n const { value, column } = props;\n\n return (\n <NumericField\n dataEditorType={column.dataEditorType}\n value={value as string}\n settings={column.settings}\n disabled\n className=\"pointer-events-none\"\n />\n // <div className=\"flex h-full w-full items-center\">\n // <p className=\"line-clamp-1 pl-1 text-xs\">{value as string}</p>\n // </div>\n );\n}\n","import type * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/src/shared/ui/select';\nimport { CaretSortIcon } from '@radix-ui/react-icons';\nimport { type ClipboardEvent, useCallback, useMemo } from 'react';\n\nexport function SelectDataEditor(\n props: { items: Array<Spreadsheet.SelectItem> } & Spreadsheet.DataEditor,\n) {\n const { value, onBlur, onChange, onPaste, items } = props;\n\n const _onPaste = useCallback(\n (e: ClipboardEvent<HTMLButtonElement>) => {\n e.preventDefault();\n onPaste?.();\n },\n [onPaste],\n );\n\n return (\n <Select value={value as string} onValueChange={(data) => onChange?.({ data })} defaultOpen>\n <SelectTrigger\n onBlur={onBlur}\n onPaste={_onPaste}\n className={cn(\n 'h-full w-full rounded-none border-none pl-1 text-xs outline-none focus:ring-0',\n )}\n >\n <SelectValue placeholder=\"Selecionar\" />\n </SelectTrigger>\n\n <SelectContent>\n {items.map(({ value, text }) => (\n <SelectItem key={value} className=\"text-xs\" value={value}>\n {text}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\nexport function SelectDataViewer(\n props: { items: Array<Spreadsheet.SelectItem> } & Spreadsheet.DataViewer,\n) {\n const { value, items } = props;\n\n const selected = useMemo(() => items.find((item) => item.value === value), [items, value]);\n const displayValue = useMemo(() => (selected ? selected.text : 'Selecionar'), [selected]);\n\n return (\n <div className=\"flex h-full w-full items-center justify-between pr-px pl-1\">\n <p className=\"line-clamp-1 text-xs\">{displayValue}</p>\n <CaretSortIcon className=\"h-4 w-4 opacity-50\" />\n </div>\n );\n}\n","/** Move the cursor of given input (or textarea) element to it's end */\nexport function moveInputCursorToEnd(element: HTMLInputElement | HTMLTextAreaElement) {\n element.selectionStart = element.selectionEnd = element.value.length;\n}\n","import type { ClipboardEvent } from 'react';\n\nexport const PLAIN_TEXT_MIME = 'text/plain';\n\n/** Read text from given clipboard event */\nexport function readTextFromClipboard<T>(event: ClipboardEvent<T>): string {\n // @ts-ignore\n if (window.clipboardData?.getData) {\n // @ts-ignore\n return window.clipboardData.getData('Text');\n }\n\n if (event.clipboardData?.getData) {\n return event.clipboardData.getData(PLAIN_TEXT_MIME);\n }\n\n return '';\n}\n","import * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport { moveInputCursorToEnd } from '@/src/shared/lib/move-input-cursor-to-end';\nimport { readTextFromClipboard } from '@/src/shared/lib/read-text-from-clipboard';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/src/shared/ui/tooltip';\nimport {\n type ChangeEvent,\n type ClipboardEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nconst CHAR_WIDTH = 6;\nconst INPUT_MAX_LENGTH = 200;\n\nexport function TextDataEditor(props: Spreadsheet.DataEditor) {\n const { value, onBlur, onChange, onPaste, setMode, column, selected } = props;\n const valueAsString = value as string;\n\n const textareaRef = useRef<null | HTMLTextAreaElement>(null);\n const [textareaHeight, setTextareaHeight] = useState(0);\n\n const overflow = useMemo(\n () => charOverflow(valueAsString, column.width),\n [valueAsString, column.width],\n );\n\n const _onPaste = useCallback(\n <T extends HTMLInputElement | HTMLTextAreaElement>(e: ClipboardEvent<T>) => {\n const clipboard = readTextFromClipboard(e);\n const singleLine = oneLineString(clipboard);\n\n if (!singleLine) {\n e.preventDefault();\n onPaste?.();\n }\n },\n [onPaste],\n );\n\n const _onBlur = useCallback(() => {\n onBlur?.();\n setMode?.('view');\n }, [onBlur, setMode]);\n\n const updateTextareaHeight = useCallback(() => {\n const element = textareaRef.current;\n\n if (!element) return;\n\n const scrollHeight = element.scrollHeight;\n element.style.height = `${scrollHeight}px`;\n setTextareaHeight(scrollHeight);\n }, []);\n\n const _onChange = useCallback(\n <T extends HTMLInputElement | HTMLTextAreaElement>(e: ChangeEvent<T>) => {\n onChange?.({ data: e.target.value });\n updateTextareaHeight();\n },\n [updateTextareaHeight, onChange],\n );\n\n if (overflow) {\n return (\n <div\n style={{ height: textareaHeight }}\n className={cn(\n '-left-0.5 -top-0.5 absolute z-40 h-fit w-fit border bg-white shadow-lg outline outline-2 outline-blue-500',\n selected ? 'bg-blue-50' : 'bg-white',\n )}\n >\n <div\n style={{ height: textareaHeight - 1 }}\n className=\"h-full w-full outline outline-[3px] outline-sky-200 outline-offset-2\"\n >\n <textarea\n ref={textareaRef}\n onBlur={_onBlur}\n onPaste={_onPaste}\n value={valueAsString}\n onChange={_onChange}\n className={cn(\n 'resize-none break-all rounded-none bg-transparent py-1.5 pr-3 pl-1 text-xs outline-none',\n )}\n onFocus={(e) => moveInputCursorToEnd(e.target)}\n maxLength={INPUT_MAX_LENGTH}\n style={{ width: column.width }}\n autoFocus\n />\n </div>\n </div>\n );\n }\n\n return (\n <input\n onBlur={onBlur}\n onPaste={_onPaste}\n value={valueAsString}\n maxLength={INPUT_MAX_LENGTH}\n onChange={_onChange}\n className={cn('h-full w-full bg-transparent pl-1 text-xs outline-none')}\n autoFocus\n />\n );\n}\n\nexport function TextDataViewer(props: Spreadsheet.DataViewer) {\n const { value, column, selected } = props;\n const valueAsString = value as string;\n\n const overflow = useMemo(\n () => charOverflow(valueAsString, column.width),\n [valueAsString, column.width],\n );\n\n if (overflow) {\n return (\n <TooltipProvider delayDuration={0}>\n <Tooltip>\n <TooltipTrigger className=\"w-full\">\n <div className=\"flex h-full w-full items-center overflow-hidden\">\n <p className=\"line-clamp-1 break-all pl-1 text-left text-xs\">{valueAsString}</p>\n </div>\n </TooltipTrigger>\n\n <TooltipContent\n align=\"start\"\n side=\"bottom\"\n alignOffset={-2}\n sideOffset={-Spreadsheet.CELL_INITIAL_HEIGHT}\n className={cn(\n 'h-fit w-full break-all rounded-none border bg-white pl-1 text-black shadow-lg',\n 'data-[state=closed]:transform-none data-[side=bottom]:animate-none data-[state=closed]:animate-none data-[state=closed]:transition-none',\n selected ? 'bg-blue-50' : 'bg-white',\n )}\n style={{ width: column.width }}\n >\n <p>{valueAsString}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return (\n <div className=\"flex h-full w-full items-center overflow-hidden\">\n <p className=\"line-clamp-1 break-all pl-1 text-left text-xs\" title={valueAsString}>\n {valueAsString}\n </p>\n </div>\n );\n}\n\nfunction charOverflow(string: string, width: number) {\n return CHAR_WIDTH * string?.length > width;\n}\n\nfunction oneLineString(value: string) {\n return ['\\t', '\\n', '\\r'].every((regex) => !value.includes(regex));\n}\n","import {\n\tBooleanDataEditor,\n\tBooleanDataViewer,\n} from '@/src/components/spreadsheet/ui/data-editor/boolean';\nimport { DateDataEditor, DateDataViewer } from '@/src/components/spreadsheet/ui/data-editor/date';\nimport {\n\tNumericDataViewer,\n\tNumericEditor,\n} from '@/src/components/spreadsheet/ui/data-editor/numeric';\nimport {\n\tSelectDataEditor,\n\tSelectDataViewer,\n} from '@/src/components/spreadsheet/ui/data-editor/select';\nimport { TextDataEditor, TextDataViewer } from '@/src/components/spreadsheet/ui/data-editor/text';\n\nexport const DataEditor = {\n\tDate: DateDataEditor,\n\tText: TextDataEditor,\n\tBoolean: BooleanDataEditor,\n\tNumeric: NumericEditor,\n\tSelect: SelectDataEditor,\n};\n\nexport const DataViewer = {\n\tDate: DateDataViewer,\n\tText: TextDataViewer,\n\tBoolean: BooleanDataViewer,\n\tNumeric: NumericDataViewer,\n\tSelect: SelectDataViewer,\n};\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { DataEditor, DataViewer } from '@/src/components/spreadsheet/ui/data-editor';\nimport { cn } from '@/src/shared/lib/cn';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { useClickAway } from 'react-use';\n\nexport function Cell(props: Spreadsheet.Cell) {\n const { value, coordinates } = props;\n\n const { columns, isCellSelected, onChange, onPaste, onSelectCell } = useSpreadsheet();\n const { dataEditorType, readonly, width, visible, settings } = columns[coordinates.column];\n\n const [mode, setMode] = useState<Spreadsheet.Mode>(readonly ? 'readonly' : 'view');\n const dataEditorContainerRef = useRef<HTMLDivElement | null>(null);\n\n /** Cell correspondent column */\n const column = useMemo(() => columns[coordinates.column], [columns, coordinates.column]);\n /** Whether the cell is selected */\n const selected = useMemo(() => isCellSelected(coordinates), [coordinates, isCellSelected]);\n /** Select component custom items by prop */\n const selectItems = useMemo(() => settings?.select?.items || [], [settings?.select?.items]);\n\n const common: Record<'dataEditor' | 'dataViewer', Spreadsheet.DataEditor> = useMemo(\n () => ({\n dataEditor: {\n value,\n column,\n setMode,\n selected,\n onPaste: () => onPaste(coordinates),\n onChange: ({ data }) => onChange({ data, point: coordinates }),\n },\n dataViewer: {\n value,\n column,\n selected,\n },\n }),\n [coordinates, value, column, selected, onPaste, onChange],\n );\n\n const dataEditorElementMap: Partial<Record<Spreadsheet.DataEditorType, JSX.Element>> = useMemo(\n () => ({\n Date: <DataEditor.Date {...common.dataEditor} />,\n String: <DataEditor.Text {...common.dataEditor} />,\n Currency: <DataEditor.Numeric {...common.dataEditor} />,\n Decimal: <DataEditor.Numeric {...common.dataEditor} />,\n Float: <DataEditor.Numeric {...common.dataEditor} />,\n Integer: <DataEditor.Numeric {...common.dataEditor} />,\n Percentage: <DataEditor.Numeric {...common.dataEditor} />,\n Boolean: <DataEditor.Boolean {...common.dataEditor} />,\n Select: <DataEditor.Select {...common.dataEditor} items={selectItems} />,\n }),\n [common.dataEditor, selectItems],\n );\n\n const dataViewerElementMap: Partial<Record<Spreadsheet.DataEditorType, JSX.Element>> = useMemo(\n () => ({\n Date: <DataViewer.Date {...common.dataViewer} />,\n String: <DataViewer.Text {...common.dataViewer} />,\n Currency: <DataViewer.Numeric {...common.dataViewer} />,\n Decimal: <DataViewer.Numeric {...common.dataViewer} />,\n Float: <DataViewer.Numeric {...common.dataViewer} />,\n Integer: <DataViewer.Numeric {...common.dataViewer} />,\n Percentage: <DataViewer.Numeric {...common.dataViewer} />,\n Boolean: <DataViewer.Boolean {...common.dataViewer} />,\n Select: <DataViewer.Select {...common.dataViewer} items={selectItems} />,\n }),\n [common.dataViewer, selectItems],\n );\n\n const dataEditorElement = useMemo(\n () => (dataEditorType ? dataEditorElementMap[dataEditorType] : null),\n [dataEditorType, dataEditorElementMap],\n );\n\n const dataViewerElement = useMemo(\n () => (dataEditorType ? dataViewerElementMap[dataEditorType] : null),\n [dataEditorType, dataViewerElementMap],\n );\n\n useEffect(() => {\n const enterEditMode = (e: KeyboardEvent) => {\n const enterKey = e.code === 'Enter';\n\n if (enterKey && selected && mode === 'view') {\n setMode('edit');\n }\n\n if (enterKey && selected && mode === 'edit') {\n setMode('view');\n }\n };\n\n window.addEventListener('keydown', enterEditMode);\n\n return () => window.removeEventListener('keydown', enterEditMode);\n }, [selected, mode]);\n\n useClickAway(dataEditorContainerRef, () => setMode('view'));\n\n if (!visible) return null;\n\n if (mode === 'readonly') {\n return (\n <div\n onClick={() => onSelectCell(coordinates)}\n className={cn(\n 'flex h-7 shrink-0 cursor-default select-none border border-t-transparent border-l-transparent bg-[#F6F6F9]',\n selected && 'bg-[#EAF5FF]',\n )}\n style={{ width, height: Spreadsheet.CELL_INITIAL_HEIGHT }}\n >\n {dataViewerElement}\n </div>\n );\n }\n\n if (mode === 'view') {\n return (\n <div\n onClick={() => onSelectCell(coordinates)}\n onDoubleClick={() => setMode('edit')}\n className={cn(\n 'relative flex h-7 shrink-0 cursor-default select-none border border-t-transparent border-l-transparent',\n selected && 'bg-[#EAF5FF]',\n )}\n style={{ width, height: Spreadsheet.CELL_INITIAL_HEIGHT }}\n >\n {dataViewerElement}\n </div>\n );\n }\n\n return (\n <div\n ref={dataEditorContainerRef}\n data-testid=\"cell__testid\"\n className=\"relative h-7 w-32 shrink-0 border border-l-transparent border-t-transparent bg-[#EAF5FF] shadow-lg outline outline-2 outline-blue-500\"\n style={{\n width,\n height: Spreadsheet.CELL_INITIAL_HEIGHT,\n top: coordinates.row === 0 ? '4px' : '0px',\n }}\n >\n <div className=\"h-full w-full outline outline-[3px] outline-offset-2 outline-sky-200\">\n {dataEditorElement}\n </div>\n </div>\n );\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport * as Matrix from '@/src/components/spreadsheet/model/matrix';\nimport * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport { useMemo } from 'react';\n\nexport function RowIndicator({ row }: { row: number }) {\n const { onSelectRow, pointRange, matrix } = useSpreadsheet();\n\n const isRowInRange = useMemo(\n () => pointRange && row >= pointRange.start.row && row <= pointRange.end.row,\n [pointRange, row],\n );\n const isEntireRowSelected = useMemo(\n () => !!(pointRange && Matrix.hasEntireRows({ matrix, pointRange, row })),\n [matrix, pointRange, row],\n );\n\n return (\n <div\n className={cn(\n 'flex h-7 w-12 shrink-0 cursor-default select-none items-center justify-center border-r border-b text-[#8E8EA9] text-xs',\n isRowInRange && 'bg-blue-100 font-bold text-blue-700',\n isEntireRowSelected && 'bg-[#0085FF] font-bold text-white',\n )}\n onClick={(e) => onSelectRow(row, e)}\n style={{\n height: Spreadsheet.CELL_INITIAL_HEIGHT,\n }}\n >\n {row + 1}\n </div>\n );\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { Cell } from '@/src/components/spreadsheet/ui/cell';\nimport { RowIndicator } from '@/src/components/spreadsheet/ui/indicators/row-indicator';\nimport { cn } from '@/src/shared/lib/cn';\nimport { useId } from 'react';\n\nexport function Rows() {\n const id = useId();\n\n const { highlightLastRow, matrix } = useSpreadsheet();\n\n return (\n <div className=\"relative\">\n {matrix.map((rowValue, row) => (\n <div\n // biome-ignore lint/suspicious/noArrayIndexKey: Using ID as key.\n key={`spreadsheet__row__key__${id}__${row}}`}\n className={cn(\n 'flex items-center transition-all ease-linear',\n row === matrix.length - 1 && highlightLastRow && 'bg-blue-50',\n )}\n >\n <RowIndicator row={row} />\n\n {rowValue.map((columnValue, column) => (\n <Cell\n // biome-ignore lint/suspicious/noArrayIndexKey: Using ID as key.\n key={`spreadsheet__cell__key__${id}__${row}__${column}`}\n value={columnValue}\n coordinates={{ column, row }}\n />\n ))}\n </div>\n ))}\n </div>\n );\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\n\nexport function Start({ className }: { className?: string }) {\n const { staticRows, emptySize, onInsertNewRow } = useSpreadsheet();\n\n if (staticRows) return null;\n\n return (\n <div\n className={cn(\n 'pointer-events-none mt-[calc(28px+36px)] flex h-[calc(100%-28px-28px)] w-full items-center justify-center',\n emptySize && 'pointer-events-auto bg-white/25 backdrop-blur-sm',\n className,\n )}\n >\n {emptySize && (\n <p className=\"text-neutral-500\">\n <span>Clique </span>\n <button type=\"button\" onClick={onInsertNewRow} className=\"font-bold\">\n AQUI\n </button>\n <span> para começar a preencher a tabela.</span>\n </p>\n )}\n </div>\n );\n}\n","import type { SVGProps } from 'react';\n\nexport function AddRowIcon(props: SVGProps<SVGSVGElement>) {\n\treturn (\n\t\t<svg\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"20\"\n\t\t\theight=\"20\"\n\t\t\tfill=\"none\"\n\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t{...props}\n\t\t>\n\t\t\t<path\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\td=\"M10 6.667v6.666M6.667 10h6.666M6.5 17.5h7c1.4 0 2.1 0 2.635-.273a2.5 2.5 0 001.092-1.092c.273-.535.273-1.235.273-2.635v-7c0-1.4 0-2.1-.273-2.635a2.5 2.5 0 00-1.092-1.093C15.6 2.5 14.9 2.5 13.5 2.5h-7c-1.4 0-2.1 0-2.635.272a2.5 2.5 0 00-1.093 1.093C2.5 4.4 2.5 5.1 2.5 6.5v7c0 1.4 0 2.1.272 2.635a2.5 2.5 0 001.093 1.092C4.4 17.5 5.1 17.5 6.5 17.5z\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n","import type { SVGProps } from 'react';\n\nexport function RemoveRowIcon(props: SVGProps<SVGSVGElement>) {\n\treturn (\n\t\t<svg\n\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\twidth=\"20\"\n\t\t\theight=\"20\"\n\t\t\tfill=\"none\"\n\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t{...props}\n\t\t>\n\t\t\t<path\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\tstrokeWidth=\"1.5\"\n\t\t\t\td=\"M13.333 5v-.667c0-.933 0-1.4-.181-1.756a1.667 1.667 0 00-.729-.729c-.356-.181-.823-.181-1.756-.181H9.333c-.933 0-1.4 0-1.756.181-.314.16-.569.415-.729.729-.181.356-.181.823-.181 1.756V5m1.666 4.583v4.167m3.334-4.167v4.167M2.5 5h15m-1.667 0v9.333c0 1.4 0 2.1-.272 2.635a2.5 2.5 0 01-1.093 1.093c-.534.272-1.235.272-2.635.272H8.167c-1.4 0-2.1 0-2.635-.272a2.5 2.5 0 01-1.093-1.093c-.272-.535-.272-1.235-.272-2.635V5\"\n\t\t\t/>\n\t\t</svg>\n\t);\n}\n","import { cn } from '@/src/shared/lib/cn';\nimport { Slot } from '@radix-ui/react-slot';\nimport { type VariantProps, cva } from 'class-variance-authority';\nimport * as React from 'react';\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90',\n destructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',\n outline:\n 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground',\n secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2',\n sm: 'h-8 rounded-md px-3 text-xs',\n lg: 'h-10 rounded-md px-8',\n icon: 'h-9 w-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n return (\n <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />\n );\n },\n);\n\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n","'use client';\nimport { cn } from '@/src/shared/lib/cn';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport { CheckIcon, ChevronRightIcon, DotFilledIcon } from '@radix-ui/react-icons';\nimport * as React from 'react';\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[state=open]:bg-accent focus:bg-accent',\n inset && 'pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=closed]:animate-out data-[state=open]:animate-in',\n className,\n )}\n {...props}\n />\n));\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=open]:animate-in',\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n));\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none focus:bg-accent focus:text-accent-foreground data-[disabled]:opacity-50',\n inset && 'pl-8',\n className,\n )}\n {...props}\n />\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none transition-colors data-[disabled]:pointer-events-none focus:bg-accent focus:text-accent-foreground data-[disabled]:opacity-50',\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none transition-colors data-[disabled]:pointer-events-none focus:bg-accent focus:text-accent-foreground data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <DotFilledIcon className=\"h-4 w-4 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 font-semibold text-sm', inset && 'pl-8', className)}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nconst DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span className={cn('ml-auto text-xs tracking-widest opacity-60', className)} {...props} />\n );\n};\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut';\n\nexport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n};\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { AddRowIcon } from '@/src/components/spreadsheet/ui/icons/add-row-icon';\nimport { RemoveRowIcon } from '@/src/components/spreadsheet/ui/icons/remove-row-icon';\nimport { Button } from '@/src/shared/ui/button';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from '@/src/shared/ui/dropdown-menu';\nimport { ChevronDown } from 'lucide-react';\nimport { nanoid } from 'nanoid';\nimport { useMemo } from 'react';\n\nexport function Toolbar() {\n const {\n hasSomeEntireRow,\n emptySize,\n staticRows,\n columns,\n onInsertNewRow,\n onRemoveRow,\n onColumnVisibilityChange,\n } = useSpreadsheet();\n\n const visibleColumns = useMemo(() => columns.filter(({ visible }) => visible), [columns]);\n const allVisible = useMemo(\n () => columns.length === visibleColumns.length,\n [columns.length, visibleColumns.length],\n );\n\n const allVisibleLabel = 'Exibindo todas as colunas';\n const visibleColumnsLabel = `Exibindo ${visibleColumns.length} de ${columns.length} colunas`;\n const columnVisibilityLabel = allVisible ? allVisibleLabel : visibleColumnsLabel;\n\n return (\n <div className=\"sticky top-0 z-50 flex w-full items-center justify-between rounded-t-md border bg-[#EAF5FF] px-4 py-2.5\">\n <div className=\"flex items-center gap-6\">\n <Button\n disabled={staticRows}\n size=\"icon\"\n variant=\"ghost\"\n onClick={onInsertNewRow}\n className=\"text-[#4A4A6A] transition-none active:bg-[#0085FF] hover:bg-[#8FD6FF] active:text-white\"\n >\n <AddRowIcon />\n </Button>\n\n <Button\n disabled={staticRows || emptySize || !hasSomeEntireRow}\n size=\"icon\"\n variant=\"ghost\"\n onClick={onRemoveRow}\n className=\"text-[#4A4A6A] transition-none active:bg-[#0085FF] hover:bg-[#8FD6FF] active:text-white\"\n >\n <RemoveRowIcon />\n </Button>\n </div>\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild className=\"w-56\">\n <Button variant=\"outline\" className=\"justify-between px-2\">\n <span className=\"text-xs\">{columnVisibilityLabel}</span>\n <ChevronDown className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent className=\"w-56\">\n {columns.map(({ name, id, alphabetLetter, visible }) => (\n <DropdownMenuCheckboxItem\n key={`spreadsheet__column__dropdown_checkbox__key__${nanoid()}`}\n checked={visible}\n onCheckedChange={() => onColumnVisibilityChange(id)}\n className=\"justify-between text-xs\"\n >\n <span>{name}</span>\n <span className=\"text-[10px] text-neutral-500\">{alphabetLetter}</span>\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n","import type { Props } from '@/src/components/spreadsheet/model/spreadsheet';\nimport { Container } from '@/src/components/spreadsheet/ui/containers/index';\nimport { SpreadsheetContextProvider } from '@/src/components/spreadsheet/ui/context';\nimport { Header } from '@/src/components/spreadsheet/ui/header';\nimport { Rows } from '@/src/components/spreadsheet/ui/rows';\nimport { Start } from '@/src/components/spreadsheet/ui/start';\nimport { Toolbar } from '@/src/components/spreadsheet/ui/toolbar';\n\nexport function Spreadsheet(props: Props) {\n const { className, ...rest } = props;\n\n return (\n <SpreadsheetContextProvider {...rest}>\n <Container.Root className={className}>\n <Toolbar />\n\n <Container.Matrix>\n <Start className=\"absolute z-50\" />\n <Header />\n <Rows />\n </Container.Matrix>\n </Container.Root>\n </SpreadsheetContextProvider>\n );\n}\n","import { Spreadsheet } from '@/src/components/spreadsheet/ui';\nimport '@/src/shared/styles/globals.css';\n\nexport const CapLink = {\n Spreadsheet,\n};\n"]}
1
+ {"version":3,"sources":["../../src/components/spreadsheet/lib/indexed-alphabet.ts","../../src/components/spreadsheet/lib/matrix-output.ts","../../src/components/spreadsheet/lib/date-formatter.ts","../../src/components/spreadsheet/model/spreadsheet.ts","../../src/components/spreadsheet/lib/normalize-value.ts","../../src/components/spreadsheet/model/matrix.ts","../../src/components/spreadsheet/ui/context.tsx","../../src/components/spreadsheet/lib/use-spreadsheet.ts","../../src/shared/lib/cn.ts","../../src/components/spreadsheet/ui/containers/matrix.tsx","../../src/components/spreadsheet/ui/containers/root.tsx","../../node_modules/react-use/esm/misc/util.js","../../node_modules/react-use/esm/useClickAway.js","../../src/components/spreadsheet/ui/containers/index.ts","../../src/components/spreadsheet/ui/indicators/drag-indicator.tsx","../../src/components/spreadsheet/ui/indicators/column-indicator.tsx","../../src/components/spreadsheet/ui/icons/integer-icon.tsx","../../node_modules/@radix-ui/react-slot/dist/packages/react/slot/src/Slot.tsx","../../node_modules/@radix-ui/react-tooltip/dist/packages/react/tooltip/src/Tooltip.tsx","../../src/shared/ui/tooltip.tsx","../../src/components/spreadsheet/ui/indicators/column-title-indicator.tsx","../../src/components/spreadsheet/ui/indicators/corner-indicator.tsx","../../src/components/spreadsheet/ui/header.tsx","../../src/shared/ui/select.tsx","../../node_modules/@radix-ui/react-select/dist/packages/react/select/src/Select.tsx","../../src/components/spreadsheet/ui/data-editor/boolean.tsx","../../src/components/spreadsheet/ui/data-editor/date.tsx","../../src/components/tmp/numeric.tsx","../../src/components/spreadsheet/ui/data-editor/numeric.tsx","../../src/components/spreadsheet/ui/data-editor/select.tsx","../../src/shared/lib/move-input-cursor-to-end.ts","../../src/shared/lib/read-text-from-clipboard.ts","../../src/components/spreadsheet/ui/data-editor/text.tsx","../../src/components/spreadsheet/ui/data-editor/index.tsx","../../src/components/spreadsheet/ui/cell.tsx","../../src/components/spreadsheet/ui/indicators/row-indicator.tsx","../../src/components/spreadsheet/ui/rows.tsx","../../src/components/spreadsheet/ui/start.tsx","../../src/components/spreadsheet/ui/icons/add-row-icon.tsx","../../src/components/spreadsheet/ui/icons/remove-row-icon.tsx","../../src/shared/ui/button.tsx","../../node_modules/@radix-ui/react-dropdown-menu/dist/packages/react/dropdown-menu/src/DropdownMenu.tsx","../../src/shared/ui/dropdown-menu.tsx","../../src/components/spreadsheet/ui/toolbar.tsx","../../src/components/spreadsheet/ui/index.tsx","../../src/index.ts"],"names":["useMemo","matrix","value","useEffect","jsx","height","useRef","_i","eventName","useCallback","useState","jsxs","difference","hasEntireColumns","Slot","React","props","forwardedRef","slotProps","childrenArray","toArray","children","slottable","find","isSlottable","newElement","newChildren","map","child","count","only","undefined","displayName","SlotClone","mergeProps","ref","composeRefs","Slottable","type","childProps","overrideProps","propName","slotPropValue","childPropValue","isHandler","test","args","filter","Boolean","join","createTooltipContext","createTooltipScope","createContextScope","createPopperScope","usePopperScope","PROVIDER_NAME","DEFAULT_DELAY_DURATION","TOOLTIP_OPEN","TooltipProviderContextProvider","useTooltipProviderContext","TooltipProvider","isOpenDelayed","setIsOpenDelayed","isPointerInTransitRef","skipDelayTimerRef","skipDelayTimer","current","window","clearTimeout","__scopeTooltip","setTimeout","skipDelayDuration","inTransit","TOOLTIP_NAME","TooltipContextProvider","useTooltipContext","Tooltip","open","openProp","disableHoverableContent","disableHoverableContentProp","delayDuration","delayDurationProp","providerContext","popperScope","trigger","setTrigger","contentId","useId","openTimerRef","wasOpenDelayedRef","setOpen","useControllableState","prop","defaultProp","defaultOpen","onChange","onOpen","document","dispatchEvent","CustomEvent","onClose","onOpenChange","stateAttribute","handleOpen","handleClose","handleDelayedOpen","TRIGGER_NAME","TooltipTrigger","triggerProps","context","composedRefs","useComposedRefs","onTriggerChange","isPointerDownRef","hasPointerMoveOpenedRef","handlePointerUp","removeEventListener","composeEventHandlers","onPointerMove","event","pointerType","onTriggerEnter","onPointerLeave","onTriggerLeave","onPointerDown","addEventListener","once","onFocus","onBlur","onClick","PORTAL_NAME","PortalProvider","usePortalContext","forceMount","CONTENT_NAME","TooltipContent","portalContext","contentProps","TooltipContentHoverable","pointerGraceArea","setPointerGraceArea","content","onPointerInTransitChange","handleRemoveGraceArea","handleCreateGraceArea","hoverTarget","currentTarget","exitPoint","x","clientX","y","clientY","exitSide","getExitSideFromRect","getBoundingClientRect","paddedExitPoints","getPaddedExitPoints","hoverTargetPoints","getPointsFromRect","graceArea","getHull","handleTriggerLeave","handleContentLeave","handleTrackPointerGrace","target","pointerPosition","hasEnteredTarget","contains","isPointerOutsideGraceArea","isPointInPolygon","VisuallyHiddenContentContextProvider","useVisuallyHiddenContentContext","isInside","TooltipContentImpl","ariaLabel","handleScroll","capture","preventDefault","style","point","rect","top","Math","abs","bottom","right","left","min","Error","padding","push","polygon","inside","i","j","length","xi","yi","xj","yj","intersect","points","newPoints","slice","sort","a","b","getHullPresorted","upperHull","p","q","r","pop","lowerHull","concat","Provider","Root","Trigger","Content","OPEN_KEYS","SELECTION_KEYS","SELECT_NAME","Collection","useCollection","createCollectionScope","createCollection","createSelectContext","createSelectScope","SelectProvider","useSelectContext","SelectNativeOptionsProvider","useSelectNativeOptionsContext","Select","valueProp","required","__scopeSelect","valueNode","setValueNode","valueNodeHasChildren","setValueNodeHasChildren","direction","useDirection","dir","setValue","defaultValue","onValueChange","triggerPointerDownPosRef","isFormControl","closest","nativeOptionsSet","setNativeOptionsSet","Set","nativeSelectKey","Array","from","option","prev","add","optionsSet","delete","SelectTrigger","isDisabled","disabled","getItems","searchRef","handleTypeaheadSearch","resetTypeahead","useTypeaheadSearch","search","enabledItems","item","currentItem","nextItem","findNextItem","shouldShowPlaceholder","focus","hasPointerCapture","pointerId","releasePointerCapture","button","ctrlKey","round","pageX","pageY","onKeyDown","isTypingAhead","isModifierKey","altKey","metaKey","key","includes","VALUE_NAME","SelectValue","valueProps","onValueNodeHasChildrenChange","hasChildren","onValueNodeChange","useLayoutEffect","pointerEvents","placeholder","SelectIcon","iconProps","SelectPortal","SelectContent","fragment","setFragment","DocumentFragment","frag","ReactDOM","CONTENT_MARGIN","SelectContentProvider","useSelectContentContext","SelectContentImpl","setContent","viewport","setViewport","node","selectedItem","setSelectedItem","selectedItemText","setSelectedItemText","isPositioned","setIsPositioned","firstValidItemFoundRef","hideOthers","useFocusGuards","focusFirst","candidates","firstItem","restItems","lastItem","PREVIOUSLY_FOCUSED_ELEMENT","activeElement","candidate","scrollIntoView","block","scrollTop","scrollHeight","focusSelectedItem","pointerMoveDelta","handlePointerMove","close","itemRefCallback","isFirstValidItem","isSelectedItem","handleItemLeave","itemTextRefCallback","SelectPosition","position","SelectPopperPosition","SelectItemAlignedPosition","popperContentProps","onCloseAutoFocus","preventScroll","display","flexDirection","outline","items","candidateNodes","reverse","currentElement","currentIndex","indexOf","popperProps","contentContext","contentWrapper","setContentWrapper","shouldExpandOnScrollRef","shouldRepositionRef","triggerRect","contentRect","valueNodeRect","itemTextRect","itemTextOffset","leftDelta","minContentWidth","width","contentWidth","max","rightEdge","innerWidth","clampedLeft","clamp","minWidth","rightDelta","leftEdge","clampedRight","availableHeight","innerHeight","itemsHeight","contentStyles","getComputedStyle","contentBorderTopWidth","parseInt","borderTopWidth","contentPaddingTop","paddingTop","contentBorderBottomWidth","borderBottomWidth","contentPaddingBottom","paddingBottom","fullContentHeight","minContentHeight","offsetHeight","viewportStyles","viewportPaddingTop","viewportPaddingBottom","topEdgeToTriggerMiddle","triggerMiddleToBottomEdge","selectedItemHalfHeight","itemOffsetMiddle","offsetTop","contentTopToItemMiddle","itemMiddleToContentBottom","willAlignWithoutTopOverflow","isLastItem","viewportOffsetBottom","clientHeight","clampedTriggerMiddleToBottomEdge","isFirstItem","clampedTopEdgeToTriggerMiddle","margin","minHeight","maxHeight","onPlaced","requestAnimationFrame","contentZIndex","setContentZIndex","zIndex","handleScrollButtonChange","boxSizing","SelectViewportProvider","useSelectViewportContext","VIEWPORT_NAME","SelectViewport","viewportProps","viewportContext","onViewportChange","prevScrollTopRef","__html","flex","overflow","onScroll","scrolledBy","cssMinHeight","parseFloat","cssHeight","prevHeight","nextHeight","clampedNextHeight","heightDiff","justifyContent","GROUP_NAME","SelectGroupContextProvider","useSelectGroupContext","LABEL_NAME","SelectLabel","labelProps","groupContext","id","ITEM_NAME","SelectItemContextProvider","useSelectItemContext","SelectItem","textValue","textValueProp","itemProps","isSelected","setTextValue","isFocused","setIsFocused","textId","handleSelect","prevTextValue","textContent","trim","onPointerUp","onItemLeave","ITEM_TEXT_NAME","SelectItemText","itemTextProps","itemContext","nativeOptionsContext","itemTextNode","setItemTextNode","onItemTextChange","nativeOption","onNativeOptionRemove","onNativeOptionAdd","ITEM_INDICATOR_NAME","SelectItemIndicator","itemIndicatorProps","SCROLL_UP_BUTTON_NAME","SelectScrollUpButton","canScrollUp","setCanScrollUp","onScrollButtonChange","SCROLL_DOWN_BUTTON_NAME","SelectScrollDownButton","canScrollDown","setCanScrollDown","maxScroll","ceil","SelectScrollButtonImpl","scrollIndicatorProps","autoScrollTimerRef","clearAutoScrollTimer","clearInterval","activeItem","flexShrink","setInterval","onAutoScroll","SelectSeparator","separatorProps","BubbleSelect","selectProps","prevValue","usePrevious","select","selectProto","HTMLSelectElement","prototype","descriptor","Object","getOwnPropertyDescriptor","set","Event","bubbles","call","onSearchChange","handleSearchChange","useCallbackRef","timerRef","updateSearch","isRepeated","every","char","normalizedSearch","currentItemIndex","wrappedItems","wrapArray","excludeCurrentItem","v","toLowerCase","startsWith","array","startIndex","_","index","Value","Icon","Portal","Viewport","Label","Item","ItemText","ItemIndicator","ScrollUpButton","ScrollDownButton","Separator","CaretSortIcon","waitCapToOnBlur","DROPDOWN_MENU_NAME","createDropdownMenuContext","createDropdownMenuScope","createMenuScope","useMenuScope","DropdownMenuProvider","useDropdownMenuContext","DropdownMenu","modal","menuScope","__scopeDropdownMenu","triggerRef","prevOpen","DropdownMenuTrigger","triggerId","onOpenToggle","DropdownMenuPortal","portalProps","DropdownMenuContent","hasInteractedOutsideRef","onInteractOutside","originalEvent","detail","ctrlLeftClick","isRightClick","DropdownMenuLabel","DropdownMenuItem","DropdownMenuCheckboxItem","checkboxItemProps","DropdownMenuRadioItem","radioItemProps","DropdownMenuItemIndicator","DropdownMenuSeparator","DropdownMenuSubTrigger","subTriggerProps","DropdownMenuSubContent","subContentProps","CheckboxItem","RadioItem","SubTrigger","SubContent","CheckIcon","nanoid"],"mappings":"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","sourcesContent":["export function indexedAlphabet(columns: number): string {\n if (columns <= 0) {\n return '';\n }\n\n const asciiA = 'A'.charCodeAt(0);\n const remainder = (columns - 1) % 26;\n const quotient = Math.floor((columns - 1) / 26);\n\n return indexedAlphabet(quotient) + String.fromCharCode(asciiA + remainder);\n}\n","import type { Matrix } from '@/src/components/spreadsheet/model/matrix';\nimport type { Column, DataEditorType } from '@/src/components/spreadsheet/model/spreadsheet';\n\nexport namespace MatrixConverter {\n export type Input = {\n columns: Column[];\n matrix: Matrix<unknown>;\n };\n\n export type Output = {\n value: unknown;\n dataEditorType: DataEditorType;\n convertedValue?: {\n Boolean?: boolean;\n Integer?: number;\n Currency?: number;\n Decimal?: number;\n Float?: number;\n Percentage?: number;\n Date?: number;\n Select?: string;\n };\n };\n}\n\nexport function matrixConverter(params: MatrixConverter.Input): MatrixConverter.Output[][] {\n const { columns, matrix } = params;\n\n return matrix.map((rowValue) =>\n rowValue.map((columnValue, column) => {\n const dataEditorType = columns[column].dataEditorType;\n const selectItems = columns[column].settings?.select?.items || [];\n\n const newColumn: MatrixConverter.Output = { value: columnValue, dataEditorType };\n\n if (dataEditorType === 'Boolean') {\n newColumn.convertedValue = { Boolean: JSON.parse(columnValue as string) };\n }\n\n if (dataEditorType === 'Integer') {\n newColumn.convertedValue = { Integer: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Currency') {\n newColumn.convertedValue = { Currency: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Decimal') {\n newColumn.convertedValue = { Decimal: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Float') {\n newColumn.convertedValue = { Float: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Percentage') {\n newColumn.convertedValue = { Percentage: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Date') {\n newColumn.convertedValue = { Date: Number(columnValue as string) };\n }\n\n if (dataEditorType === 'Select') {\n newColumn.convertedValue = { Select: columnValue as string };\n }\n\n return newColumn;\n }),\n );\n}\n","export function dateFormatter(value: string) {\n try {\n if (value.includes('/'))\n return new Date(value.split('/').reverse().join('-'))\n .toISOString()\n .split('T')[0]\n .replace('+', '');\n\n return new Date(value).toISOString().split('T')[0].replace('+', '');\n } catch (error) {\n return null;\n }\n}\n","import type { MatrixConverter } from '@/src/components/spreadsheet/lib/matrix-output';\nimport type * as Matrix from '@/src/components/spreadsheet/model/matrix';\nimport type { MouseEvent, PropsWithChildren } from 'react';\n\n/** Spreadsheet column initial width */\nexport const COLUMN_INITIAL_WIDTH = 160;\n/** Spreadsheet column max width */\nexport const COLUMN_MAX_WIDTH = 320;\n/** Spreadsheet column min width */\nexport const COLUMN_MIN_WIDTH = 160;\n\n/** Spreadsheet column title initial height */\nexport const COLUMN_TITLE_INITIAL_HEIGHT = 36;\n/** Spreadsheet cell initial height */\nexport const CELL_INITIAL_HEIGHT = 26;\n\nexport const NUMERIC_DATA_EDITOR_TYPES: DataEditorType[] = [\n 'Decimal',\n 'Float',\n 'Integer',\n 'Percentage',\n 'Currency',\n];\n\n/** Dimensions of an element */\nexport type Dimensions = {\n /** The element's width in pixels */\n width: number;\n /** The element's height in pixels */\n height: number;\n};\n\n/** Select component item props */\nexport type SelectItem = { text: string; value: string };\n\n/** The mode of the cell */\nexport type Mode = 'edit' | 'readonly' | 'view';\n\n/** Cell data editor type */\nexport type DataEditorType =\n | 'Boolean'\n | 'String'\n | 'Select'\n | 'Date'\n | 'Integer'\n | 'Currency'\n | 'Float'\n | 'Decimal'\n | 'Percentage';\n\nexport type DataEditor = {\n /** Data editor current value */\n value?: unknown;\n /** Whether data editor data changes */\n onChange?: ({ data, point }: { data: unknown; point?: Matrix.Point }) => void;\n /** Whether user paste any value on data editor */\n onPaste?: (point?: Matrix.Point) => void;\n /** Whether user blur current data editor */\n onBlur?: () => void;\n /** Whether user clicks current data editor */\n onClick?: <T>(e: MouseEvent<T>) => void;\n /** Cell mode setter */\n setMode?: (mode: Mode) => void;\n\n selected?: boolean;\n\n column: Column;\n};\n\nexport type DataViewer = {\n /** Data viewer current value */\n value?: unknown;\n column: Column;\n\n selected?: boolean;\n};\n\n/** Spreadsheet column meta data and settings */\nexport type Column = {\n /** Column identifier */\n id: string;\n /** Column name to be displayed */\n name: string;\n /** Column tooltip description */\n description?: string;\n /** Column width */\n width: number;\n /** Whether column is visible to user */\n visible?: boolean;\n /** Column position */\n position: number;\n /** Column data editor type */\n dataEditorType: DataEditorType;\n /** Alphabet letter by position */\n alphabetLetter?: string;\n /** Whether column is readonly to user */\n readonly?: boolean;\n\n /** Column settings */\n settings?: {\n select?: {\n items: Array<SelectItem>;\n };\n\n numeric?: {\n min?: number;\n max?: number;\n allowNegative?: boolean;\n roundingRule?: string;\n decimalPlaces?: number;\n currency?: string;\n };\n\n string?: {\n maskData?: string;\n maskVisible?: boolean;\n charLimit?: string;\n };\n };\n};\n\n/** Initial column params before spreadsheet internal setup */\nexport type InitialColumn = Pick<\n Column,\n Exclude<keyof Column, 'id' | 'alphabetLetter' | 'position' | 'width'>\n> & {\n width?: number;\n};\n\n/** Spreadsheet Cell component */\nexport type Cell = {\n /** The cell value */\n value?: unknown;\n /** Point coordinates of the cell */\n coordinates: Matrix.Point;\n};\n\nexport type Props = {\n matrix: Matrix.Matrix<unknown>;\n onMatrixChange?: (matrix: MatrixConverter.Output[][]) => void;\n startingColumns: InitialColumn[];\n /** Defines if user can add or delete rows */\n staticRows?: boolean;\n className?: string;\n};\n\nexport type Context = {\n size: Matrix.Size;\n matrix: Matrix.Matrix<unknown>;\n columns: Column[];\n emptySize: boolean;\n /** Defines if user can add or delete rows */\n staticRows?: boolean;\n hasSomeEntireRow?: boolean;\n /** Whether last row is highlighted */\n highlightLastRow?: boolean;\n\n pointRange: Matrix.PointRange | null;\n setPointRange: (pointRange: Matrix.PointRange | null) => void;\n\n containerDimensions: Dimensions;\n setContainerDimensions: (dimensions: Dimensions) => void;\n\n onPaste: (point: Matrix.Point) => void;\n onChange: (params: { data: unknown; point: Matrix.Point }) => void;\n onRemoveRow: () => void;\n onSelectRow: (row: number, event?: MouseEvent) => void;\n onSelectCell: (point: Matrix.Point) => void;\n isCellSelected: (point: Matrix.Point) => boolean;\n onInsertNewRow: () => void;\n onColumnResize: (params: { width: number; columnId: string }) => void;\n onSelectSpreadsheet: () => void;\n onColumnVisibilityChange: (columnId: string) => void;\n};\n\nexport type ContextProvider = Omit<PropsWithChildren<Props>, 'className'>;\n","import { dateFormatter } from '@/src/components/spreadsheet/lib/date-formatter';\nimport * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\n\nexport function normalizeValue(params: {\n value: unknown;\n dataEditorType: Spreadsheet.DataEditorType;\n}) {\n const { value, dataEditorType } = params;\n\n if (dataEditorType === 'Date') {\n return dateFormatter(value as string) || '';\n }\n\n if (dataEditorType === 'Boolean') {\n return value === true ? 'true' : 'false';\n }\n\n const isNumeric = Spreadsheet.NUMERIC_DATA_EDITOR_TYPES.includes(dataEditorType);\n\n if (isNumeric) {\n return Number.isNaN(Number(value)) ? '' : value;\n }\n\n return value;\n}\n","/** A cell cordinates in matrix */\nexport type Point = {\n row: number;\n column: number;\n};\n\n/** Range between two points. */\nexport type PointRange = {\n /** The top-left point */\n start: Point;\n /** The bottom-right point */\n end: Point;\n};\n\n/** Counts of the rows and column in a matrix */\nexport type Size = {\n /** Count of the rows in the matrix */\n rows: number;\n /** Count of the columns in the matrix */\n columns: number;\n};\n\nexport type Matrix<T> = Array<Array<T | undefined>>;\n\n/** Creates an empty matrix with given rows and columns */\nexport function createEmpty<T>(size: Size, fill?: T): Matrix<T> {\n return new Array(size.rows).fill(undefined).map(() => new Array(size.columns).fill(fill));\n}\n\n/** Gets the count of rows of given matrix */\nexport function getRowsCount(matrix: Matrix<unknown>) {\n return matrix?.length;\n}\n\n/** Gets the count of columns of given matrix */\nexport function getColumnsCount(matrix: Matrix<unknown>) {\n const firstRow = matrix?.[0];\n return firstRow ? firstRow.length : 0;\n}\n\n/** Gets the count of rows and columns of given matrix */\nexport function getSize(matrix: Matrix<unknown>): Size {\n return {\n columns: getColumnsCount(matrix),\n rows: getRowsCount(matrix),\n };\n}\n\n/** Gets the value at row and column of matrix. */\nexport function getPoint<T>(params: { point: Point; matrix: Matrix<T> }) {\n const { point, matrix } = params;\n\n const columns = matrix[point.row];\n\n if (columns === undefined) {\n return undefined;\n }\n\n return columns[point.column];\n}\n\n/** Checks if the source and target point are equal */\nexport function isSamePoint(source: Point, target: Point) {\n return source.column === target.column && source.row === target.row;\n}\n\n/** Returns whether given point exists in given range */\nexport function hasPointInRange(pointRange: PointRange, point: Point): boolean {\n return (\n point.row >= pointRange.start.row &&\n point.column >= pointRange.start.column &&\n point.row <= pointRange.end.row &&\n point.column <= pointRange.end.column\n );\n}\n\n/** Determines whether all columns are selected */\nexport function hasEntireColumns(params: { matrix: Matrix<unknown>; pointRange: PointRange }) {\n const { matrix, pointRange } = params;\n return pointRange.start.column === 0 && pointRange.end.column === getColumnsCount(matrix);\n}\n\n/** Determines which row is entirely selected in given selection */\nexport function hasEntireRows(params: {\n matrix: Matrix<unknown>;\n pointRange: PointRange;\n row: number;\n}) {\n const { matrix, pointRange, row } = params;\n return (\n row >= pointRange.start.row &&\n row <= pointRange.end.row &&\n hasEntireColumns({ matrix, pointRange })\n );\n}\n\n/** Converts string value into an matrix */\nexport function parseString(value: string): Matrix<unknown> {\n return value.split('\\n').map((row) => row.split('\\t'));\n}\n\n/**\n * Overlaps a given Matrix B (mB) starting in a specific point into a given Matrix A (mA)\n * Matrix B (mB) always has priority when replacing cell values\n */\nexport function overlap(params: {\n mA: Matrix<unknown>;\n mB: Matrix<unknown>;\n point: Point;\n}): Matrix<unknown> {\n const { mA, mB, point = { column: 0, row: 0 } } = params;\n\n const mASize = getSize(mA);\n const mBSize = getSize(mB);\n\n const fillRows = point.row + mBSize.rows > mASize.rows;\n const fillColumns = point.column + mBSize.columns > mBSize.columns;\n\n const rows = fillRows ? point.row + mBSize.rows : mASize.rows;\n const columns = fillColumns ? point.column + mBSize.columns : mASize.columns;\n\n const mC = createEmpty({ rows, columns });\n\n for (let y = 0; y < mASize.rows; y += 1) {\n for (let x = 0; x < mASize.columns; x += 1) {\n mC[y][x] = mA[y][x];\n }\n }\n\n for (let y = 0; y < mBSize.rows; y += 1) {\n for (let x = 0; x < mBSize.columns; x += 1) {\n mC[y + point.row][x + point.column] = mB[y][x];\n }\n }\n\n return mC;\n}\n","import { indexedAlphabet } from '@/src/components/spreadsheet/lib/indexed-alphabet';\nimport { matrixConverter } from '@/src/components/spreadsheet/lib/matrix-output';\nimport { normalizeValue } from '@/src/components/spreadsheet/lib/normalize-value';\nimport * as Matrix from '@/src/components/spreadsheet/model/matrix';\nimport type * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport {\n COLUMN_INITIAL_WIDTH,\n COLUMN_MAX_WIDTH,\n COLUMN_MIN_WIDTH,\n type Column,\n type Dimensions,\n type InitialColumn,\n} from '@/src/components/spreadsheet/model/spreadsheet';\nimport { nanoid } from 'nanoid';\nimport { type MouseEvent, createContext, useCallback, useEffect, useMemo, useState } from 'react';\n\nlet timeoutId: ReturnType<typeof setTimeout>;\n\nexport const SpreadsheetContext = createContext<Spreadsheet.Context | null>(null);\n\nexport function SpreadsheetContextProvider(props: Spreadsheet.ContextProvider) {\n const {\n children,\n startingColumns,\n matrix: startingMatrix = [],\n staticRows,\n onMatrixChange,\n } = props;\n\n const [matrix, setMatrix] = useState(startingMatrix);\n const [columns, setColumns] = useState<Column[]>(() => setupColumns(startingColumns));\n const [pointRange, setPointRange] = useState<Matrix.PointRange | null>(null);\n const [containerDimensions, setContainerDimensions] = useState<Dimensions>({\n height: 0,\n width: 0,\n });\n\n const [highlightLastRow, setHighlightLastRow] = useState(false);\n\n /** Function called to highlight when user add a new row */\n const highlight = useCallback((ms = 2000) => {\n setHighlightLastRow(true);\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => setHighlightLastRow(false), ms);\n }, []);\n\n const columnsCount = useMemo(\n () => Matrix.getColumnsCount(matrix) || columns.length,\n [matrix, columns.length],\n );\n const size = useMemo(() => Matrix.getSize(matrix), [matrix]);\n const emptySize = useMemo(() => size.rows === 0, [size.rows]);\n\n const hasSomeEntireRow = useMemo(\n () => !!(pointRange && Matrix.hasEntireColumns({ matrix, pointRange })),\n [pointRange, matrix],\n );\n\n const onConvertedMatrixChange = useCallback(\n (matrix: Matrix.Matrix<unknown>) => {\n if (onMatrixChange) {\n const newMatrix = matrixConverter({ columns, matrix });\n onMatrixChange(newMatrix);\n }\n },\n [onMatrixChange, columns],\n );\n\n const onPaste = useCallback(\n async (point: Matrix.Point) => {\n const { state } = await navigator.permissions.query({\n name: 'clipboard-read' as PermissionName,\n });\n\n if (state === 'denied') {\n console.log('denied');\n return;\n }\n\n const value = await navigator.clipboard.readText();\n\n const mB = Matrix.parseString(value);\n\n /** Overlaps mA and mB, also prevent putting values in readonly columns */\n const overlapped = Matrix.overlap({ mA: matrix, mB, point }).map((row) =>\n row.map((columnValue, column) => (columns[column]?.readonly ? '' : columnValue)),\n );\n\n const normalized = overlapped.map((row) =>\n row.map((columnValue, column) =>\n normalizeValue({ value: columnValue, dataEditorType: columns[column]?.dataEditorType }),\n ),\n );\n\n const nextColumns = normalized.map((row) => row.slice(0, startingColumns.length));\n const nextMatrix = staticRows ? nextColumns.slice(0, matrix.length) : nextColumns;\n\n setMatrix(nextMatrix);\n onConvertedMatrixChange(nextMatrix);\n },\n [columns, matrix, startingColumns.length, onConvertedMatrixChange, staticRows],\n );\n\n const onChange = useCallback(\n (params: { data: unknown; point: Matrix.Point }) => {\n const { data, point } = params;\n const { column, row } = point;\n\n const nextMatrix = structuredClone(matrix);\n nextMatrix[row][column] = data;\n\n setMatrix(nextMatrix);\n onConvertedMatrixChange(nextMatrix);\n },\n [matrix, onConvertedMatrixChange],\n );\n\n const onRemoveRow = useCallback(() => {\n if (pointRange && !staticRows) {\n const rowStart = pointRange.start.row;\n const rowEnd = pointRange.end.row;\n const delta = rowEnd - rowStart + 1;\n\n if (!hasSomeEntireRow) return;\n\n const confirmedMessage =\n delta > 1\n ? `Você irá excluir ${delta} linhas, deseja continuar?\\nLinha N° ${rowStart + 1} até N° ${\n rowEnd + 1\n }`\n : `Você irá excluir a linha N° ${rowStart + 1}, deseja continuar?`;\n\n const confirmed = confirm(confirmedMessage);\n\n if (!confirmed) return;\n\n const nextMatrix = matrix.filter((row, index) => index < rowStart || index > rowEnd);\n\n setPointRange(null);\n setMatrix(nextMatrix);\n onConvertedMatrixChange(nextMatrix);\n }\n }, [matrix, pointRange, staticRows, hasSomeEntireRow, onConvertedMatrixChange]);\n\n const onSelectRow = useCallback(\n (row: number, event?: MouseEvent) => {\n if (pointRange && event && event.shiftKey) {\n const normalizedStart = row < pointRange.start.row ? row : pointRange.start.row;\n const normalizedEnd = row < pointRange.start.row ? pointRange.start.row : row;\n\n const newPointRange: Matrix.PointRange = {\n start: { row: normalizedStart, column: 0 },\n end: { row: normalizedEnd, column: columnsCount },\n };\n\n return setPointRange(newPointRange);\n }\n\n setPointRange({ start: { row, column: 0 }, end: { row, column: columnsCount } });\n },\n [columnsCount, pointRange],\n );\n\n const onSelectCell = useCallback(\n (point: Matrix.Point) => {\n if (point.row === pointRange?.start.row && point.column === pointRange.start.column) return;\n setPointRange({ start: point, end: point });\n },\n [pointRange?.start.row, pointRange?.start.column],\n );\n\n const isCellSelected = useCallback(\n (point: Matrix.Point) => {\n return !!(pointRange && Matrix.hasPointInRange(pointRange, point));\n },\n [pointRange],\n );\n\n const onColumnResize = useCallback((params: { width: number; columnId: string }) => {\n const { columnId, width } = params;\n\n let newWidth = width;\n\n if (width > COLUMN_MAX_WIDTH) {\n newWidth = COLUMN_MAX_WIDTH;\n }\n\n if (width < COLUMN_MIN_WIDTH) {\n newWidth = COLUMN_MIN_WIDTH;\n }\n\n /** When X matches the column to be resized, it returns new width,\n * otherwise returns previous column value */\n setColumns((previous) =>\n previous.map((column) => (column.id === columnId ? { ...column, width: newWidth } : column)),\n );\n }, []);\n\n const onInsertNewRow = useCallback(() => {\n if (staticRows) return;\n\n const nextMatrix = [...structuredClone(matrix), new Array(columnsCount).fill('')];\n\n setMatrix(nextMatrix);\n onConvertedMatrixChange(nextMatrix);\n\n highlight();\n }, [staticRows, matrix, columnsCount, highlight, onConvertedMatrixChange]);\n\n const onSelectSpreadsheet = useCallback(() => {\n const start: Matrix.Point = { column: 0, row: 0 };\n const end: Matrix.Point = { column: size.columns, row: size.rows - 1 };\n setPointRange({ start, end });\n }, [size]);\n\n const onColumnVisibilityChange = useCallback((columnId: string) => {\n setColumns((previous) =>\n previous.map((column) =>\n column.id === columnId ? { ...column, visible: !column.visible } : column,\n ),\n );\n }, []);\n\n useEffect(() => {\n setMatrix(startingMatrix);\n }, [startingMatrix]);\n\n useEffect(() => {\n setColumns(() => setupColumns(startingColumns));\n }, [startingColumns]);\n\n const value: Spreadsheet.Context = useMemo(\n () => ({\n size,\n matrix,\n columns,\n emptySize,\n staticRows,\n hasSomeEntireRow,\n highlightLastRow,\n\n pointRange,\n setPointRange,\n\n containerDimensions,\n setContainerDimensions,\n\n onPaste,\n onChange,\n onRemoveRow,\n onSelectRow,\n onSelectCell,\n isCellSelected,\n onInsertNewRow,\n onColumnResize,\n onSelectSpreadsheet,\n onColumnVisibilityChange,\n }),\n [\n size,\n matrix,\n columns,\n emptySize,\n staticRows,\n hasSomeEntireRow,\n highlightLastRow,\n\n pointRange,\n containerDimensions,\n\n onPaste,\n onChange,\n onRemoveRow,\n onSelectRow,\n onSelectCell,\n isCellSelected,\n onInsertNewRow,\n onColumnResize,\n onSelectSpreadsheet,\n onColumnVisibilityChange,\n ],\n );\n\n return <SpreadsheetContext.Provider value={value}>{children}</SpreadsheetContext.Provider>;\n}\n\n/** Spreadsheet columns internal states and values setup function */\nfunction setupColumns(columns: InitialColumn[]): Column[] {\n return columns.map((column, index) => ({\n ...column,\n id: `spreadsheet__column__id__${nanoid()}`,\n alphabetLetter: indexedAlphabet(index + 1),\n position: index,\n width: column.width || COLUMN_INITIAL_WIDTH,\n visible: true,\n }));\n}\n","import { SpreadsheetContext } from '@/src/components/spreadsheet/ui/context';\nimport { useContext } from 'react';\n\nexport function useSpreadsheet() {\n const context = useContext(SpreadsheetContext);\n\n if (!context) {\n throw new Error('useSpreadsheet has to be used within <SpreadsheetContext.Provider>');\n }\n\n return context;\n}\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport { type PropsWithChildren, useEffect, useMemo, useRef } from 'react';\n\ntype MatrixProps = PropsWithChildren<{\n className?: string;\n}>;\n\nexport function Matrix(props: MatrixProps) {\n const { children, className } = props;\n const { size, staticRows, setContainerDimensions } = useSpreadsheet();\n\n const containerRef = useRef<null | HTMLDivElement>(null);\n\n const height = useMemo(\n () => size.rows * Spreadsheet.CELL_INITIAL_HEIGHT + Spreadsheet.COLUMN_TITLE_INITIAL_HEIGHT,\n [size.rows],\n );\n\n useEffect(() => {\n const containerElement = containerRef.current;\n\n if (!containerElement) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n\n if (entry) {\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n setContainerDimensions({ height, width });\n }\n });\n\n resizeObserver.observe(containerElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [setContainerDimensions]);\n\n return (\n <div\n ref={containerRef}\n className={cn(\n 'relative w-full border border-t-0 border-r-0',\n size.rows >= 7 ? 'border-b-0' : 'border-b',\n staticRows ? `${height}px border-b-0` : 'min-h-[260px]',\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","import { type PropsWithChildren, useRef } from 'react';\nimport { useClickAway } from 'react-use';\n\nimport { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\n\ntype RootProps = PropsWithChildren<{\n className?: string;\n}>;\n\nexport function Root(props: RootProps) {\n const { children, className } = props;\n const { setPointRange } = useSpreadsheet();\n\n const rootRef = useRef<HTMLDivElement | null>(null);\n\n useClickAway(rootRef, () => setPointRange(null));\n\n return (\n <div ref={rootRef} className={cn('min-w-[640px]', className)}>\n {children}\n </div>\n );\n}\n","export var noop = function () { };\nexport function on(obj) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (obj && obj.addEventListener) {\n obj.addEventListener.apply(obj, args);\n }\n}\nexport function off(obj) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (obj && obj.removeEventListener) {\n obj.removeEventListener.apply(obj, args);\n }\n}\nexport var isBrowser = typeof window !== 'undefined';\nexport var isNavigator = typeof navigator !== 'undefined';\n","import { useEffect, useRef } from 'react';\nimport { off, on } from './misc/util';\nvar defaultEvents = ['mousedown', 'touchstart'];\nvar useClickAway = function (ref, onClickAway, events) {\n if (events === void 0) { events = defaultEvents; }\n var savedCallback = useRef(onClickAway);\n useEffect(function () {\n savedCallback.current = onClickAway;\n }, [onClickAway]);\n useEffect(function () {\n var handler = function (event) {\n var el = ref.current;\n el && !el.contains(event.target) && savedCallback.current(event);\n };\n for (var _i = 0, events_1 = events; _i < events_1.length; _i++) {\n var eventName = events_1[_i];\n on(document, eventName, handler);\n }\n return function () {\n for (var _i = 0, events_2 = events; _i < events_2.length; _i++) {\n var eventName = events_2[_i];\n off(document, eventName, handler);\n }\n };\n }, [events, ref]);\n};\nexport default useClickAway;\n","import { Matrix } from '@/src/components/spreadsheet/ui/containers/matrix';\nimport { Root } from '@/src/components/spreadsheet/ui/containers/root';\n\nexport const Container = {\n Matrix,\n Root,\n};\n","import { cn } from '@/src/shared/lib/cn';\nimport type { DragEvent } from 'react';\n\ntype DragIndicatorProps = {\n\tonDragStart?: (e: DragEvent<HTMLButtonElement>) => void;\n\tonDrag?: (e: DragEvent<HTMLButtonElement>) => void;\n\tonDragEnd?: (e: DragEvent<HTMLButtonElement>) => void;\n\n\tclassName?: string;\n};\n\nexport function DragIndicator(props: DragIndicatorProps) {\n\tconst { className, ...rest } = props;\n\n\treturn (\n\t\t<button\n\t\t\tdraggable\n\t\t\tclassName={cn(\n\t\t\t\t'h-9 w-1.5 cursor-col-resize rounded-sm bg-neutral-400 drop-shadow-md',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...rest}\n\t\t>\n\t\t\t<div className=\"relative\">\n\t\t\t\t<span className=\"-translate-y-1/2 absolute top-1/2 right-2.5 h-3 w-1 rounded-full bg-neutral-300\" />\n\t\t\t\t<span className=\"-translate-y-1/2 absolute top-1/2 left-2.5 h-3 w-1 rounded-full bg-neutral-300\" />\n\t\t\t</div>\n\t\t</button>\n\t);\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport * as Matrix from '@/src/components/spreadsheet/model/matrix';\nimport * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { DragIndicator } from '@/src/components/spreadsheet/ui/indicators/drag-indicator';\nimport { cn } from '@/src/shared/lib/cn';\nimport {\n type DragEvent,\n type PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\ntype ColumnIndicatorProps = PropsWithChildren<{\n className?: string;\n column: Spreadsheet.Column;\n}>;\n\nexport function ColumnIndicator(props: ColumnIndicatorProps) {\n const { className, column, children } = props;\n const { id, width, position, visible, alphabetLetter } = column;\n\n const { matrix, pointRange, containerDimensions, onColumnResize } = useSpreadsheet();\n\n const rulerIndicatorRef = useRef<HTMLDivElement | null>(null);\n const rulerIndicatorHeight = useMemo(\n () => (containerDimensions?.height || 0) + 32,\n [containerDimensions?.height],\n );\n\n const [dragging, setDragging] = useState(false);\n const [startClientX, setStartClientX] = useState(0);\n const [clientX, setClientX] = useState(0);\n\n const difference = useMemo(\n () => (dragging ? clientX - startClientX : 0),\n [dragging, clientX, startClientX],\n );\n\n const onDragStart = useCallback((e: DragEvent<HTMLButtonElement>) => {\n setStartClientX(e.clientX);\n setDragging(true);\n }, []);\n\n const onDrag = useCallback(\n (e: DragEvent<HTMLButtonElement>) => {\n const rulerIndicatorElement = rulerIndicatorRef.current;\n\n if (!rulerIndicatorElement) return;\n\n const difference = e.clientX - startClientX;\n\n let newWidth = width + difference;\n\n if (newWidth > Spreadsheet.COLUMN_MAX_WIDTH) newWidth = Spreadsheet.COLUMN_MAX_WIDTH;\n if (newWidth < Spreadsheet.COLUMN_MIN_WIDTH) newWidth = Spreadsheet.COLUMN_MIN_WIDTH;\n\n rulerIndicatorElement.style.left = `${newWidth}px`;\n\n setClientX(e.clientX);\n },\n [startClientX, width],\n );\n\n const onDragEnd = useCallback(\n (e: DragEvent<HTMLButtonElement>) => {\n const difference = e.clientX - startClientX;\n const nextWidth = width + difference;\n onColumnResize({ width: nextWidth, columnId: id });\n setDragging(false);\n },\n [startClientX, width, id, onColumnResize],\n );\n\n const createClassName = useCallback(() => {\n if (dragging) return `bg-neutral-100 font-bold text-neutral-700 ${className}`;\n\n if (pointRange && !dragging) {\n const { start, end } = pointRange;\n\n const hasEntireColumns = Matrix.hasEntireColumns({ matrix, pointRange });\n const columnInRange = position >= start.column && position <= end.column;\n\n if (hasEntireColumns) return `bg-[#0085FF] font-bold text-white ${className}`;\n\n if (columnInRange) return `bg-blue-100 font-bold text-blue-700 ${className}`;\n }\n\n return className;\n }, [dragging, className, matrix, pointRange, position]);\n\n const rulerIndicatorToPx = useCallback(() => {\n let newWidth = width + difference;\n\n if (newWidth > Spreadsheet.COLUMN_MAX_WIDTH) newWidth = Spreadsheet.COLUMN_MAX_WIDTH;\n if (newWidth < Spreadsheet.COLUMN_MIN_WIDTH) newWidth = Spreadsheet.COLUMN_MIN_WIDTH;\n\n return `${newWidth}px`;\n }, [width, difference]);\n\n const dragEventListeners = useMemo(\n () => ({ onDragStart, onDrag, onDragEnd }),\n [onDragStart, onDrag, onDragEnd],\n );\n\n useEffect(() => {\n const rulerIndicatorElement = rulerIndicatorRef.current;\n\n if (!rulerIndicatorElement) return;\n\n rulerIndicatorElement.style.left = `${width}px`;\n }, [width]);\n\n if (!visible) return null;\n\n return (\n <div\n style={{ width }}\n className={cn(\n 'relative flex h-7 w-32 shrink-0 items-center justify-center border border-t-0 border-l-0 text-[#8E8EA9] text-xs',\n createClassName(),\n )}\n >\n <DragIndicator\n {...dragEventListeners}\n className={cn(\n '-right-[3px] -top-1 absolute z-50 opacity-0 hover:opacity-100',\n dragging && 'opacity-0',\n )}\n />\n\n <div\n ref={rulerIndicatorRef}\n style={{ height: rulerIndicatorHeight }}\n className={cn(\n '-top-4 pointer-events-none absolute z-50 h-full w-1.5 rounded-full bg-blue-400 shadow-lg outline outline-sky-100',\n dragging ? 'opacity-100' : 'opacity-0',\n )}\n >\n <span className=\"-translate-y-1/2 relative top-8 left-4 z-50 select-none rounded-md border bg-white p-1 font-semibold drop-shadow-md\">\n {rulerIndicatorToPx()}\n </span>\n </div>\n\n <span>{children || alphabetLetter}</span>\n </div>\n );\n}\n","import type { SVGProps } from 'react';\n\nexport function IntegerIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n stroke=\"currentColor\"\n fill=\"currentColor\"\n strokeWidth=\"0\"\n viewBox=\"0 0 24 24\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <title>Integer</title>\n <path d=\"M13.003 7.754a.75.75 0 0 1 .75-.75h5.232a.75.75 0 0 1 .53 1.28l-2.776 2.777c.55.097 1.057.253 1.492.483.905.477 1.504 1.284 1.504 2.418 0 .966-.471 1.75-1.172 2.27-.687.511-1.587.77-2.521.77-1.367 0-2.274-.528-2.667-.756a.75.75 0 0 1 .755-1.297c.331.193.953.553 1.912.553.673 0 1.243-.188 1.627-.473.37-.275.566-.635.566-1.067 0-.5-.219-.836-.703-1.091-.538-.284-1.375-.443-2.471-.443a.75.75 0 0 1-.53-1.28l2.643-2.644h-3.421a.75.75 0 0 1-.75-.75ZM7.88 15.215a1.4 1.4 0 0 0-1.446.83.75.75 0 0 1-1.37-.61 2.899 2.899 0 0 1 2.986-1.71c.589.06 1.139.323 1.557.743.434.446.685 1.058.685 1.778 0 1.641-1.254 2.437-2.12 2.986-.538.341-1.18.694-1.495 1.273H9.75a.75.75 0 0 1 0 1.5h-4a.75.75 0 0 1-.75-.75c0-1.799 1.337-2.63 2.243-3.21 1.032-.659 1.55-1.031 1.55-1.8 0-.355-.116-.584-.26-.732a1.071 1.071 0 0 0-.652-.298Zm.234-13.121a.75.75 0 0 1 .386.656V9h1.252a.75.75 0 0 1 0 1.5H5.75a.75.75 0 0 1 0-1.5H7V4.103l-.853.533a.749.749 0 1 1-.795-1.272l2-1.25a.749.749 0 0 1 .762-.02Z\" />\n </svg>\n );\n}\n","import * as React from 'react';\nimport { composeRefs } from '@radix-ui/react-compose-refs';\n\n/* -------------------------------------------------------------------------------------------------\n * Slot\n * -----------------------------------------------------------------------------------------------*/\n\ninterface SlotProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n}\n\nconst Slot = React.forwardRef<HTMLElement, SlotProps>((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n const childrenArray = React.Children.toArray(children);\n const slottable = childrenArray.find(isSlottable);\n\n if (slottable) {\n // the new element to render is the one passed as a child of `Slottable`\n const newElement = slottable.props.children as React.ReactNode;\n\n const newChildren = childrenArray.map((child) => {\n if (child === slottable) {\n // because the new element will be the one rendered, we are only interested\n // in grabbing its children (`newElement.props.children`)\n if (React.Children.count(newElement) > 1) return React.Children.only(null);\n return React.isValidElement(newElement)\n ? (newElement.props.children as React.ReactNode)\n : null;\n } else {\n return child;\n }\n });\n\n return (\n <SlotClone {...slotProps} ref={forwardedRef}>\n {React.isValidElement(newElement)\n ? React.cloneElement(newElement, undefined, newChildren)\n : null}\n </SlotClone>\n );\n }\n\n return (\n <SlotClone {...slotProps} ref={forwardedRef}>\n {children}\n </SlotClone>\n );\n});\n\nSlot.displayName = 'Slot';\n\n/* -------------------------------------------------------------------------------------------------\n * SlotClone\n * -----------------------------------------------------------------------------------------------*/\n\ninterface SlotCloneProps {\n children: React.ReactNode;\n}\n\nconst SlotClone = React.forwardRef<any, SlotCloneProps>((props, forwardedRef) => {\n const { children, ...slotProps } = props;\n\n if (React.isValidElement(children)) {\n return React.cloneElement(children, {\n ...mergeProps(slotProps, children.props),\n ref: forwardedRef ? composeRefs(forwardedRef, (children as any).ref) : (children as any).ref,\n });\n }\n\n return React.Children.count(children) > 1 ? React.Children.only(null) : null;\n});\n\nSlotClone.displayName = 'SlotClone';\n\n/* -------------------------------------------------------------------------------------------------\n * Slottable\n * -----------------------------------------------------------------------------------------------*/\n\nconst Slottable = ({ children }: { children: React.ReactNode }) => {\n return <>{children}</>;\n};\n\n/* ---------------------------------------------------------------------------------------------- */\n\ntype AnyProps = Record<string, any>;\n\nfunction isSlottable(child: React.ReactNode): child is React.ReactElement {\n return React.isValidElement(child) && child.type === Slottable;\n}\n\nfunction mergeProps(slotProps: AnyProps, childProps: AnyProps) {\n // all child props should override\n const overrideProps = { ...childProps };\n\n for (const propName in childProps) {\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n\n const isHandler = /^on[A-Z]/.test(propName);\n if (isHandler) {\n // if the handler exists on both, we compose them\n if (slotPropValue && childPropValue) {\n overrideProps[propName] = (...args: unknown[]) => {\n childPropValue(...args);\n slotPropValue(...args);\n };\n }\n // but if it exists only on the slot, we use only this one\n else if (slotPropValue) {\n overrideProps[propName] = slotPropValue;\n }\n }\n // if it's `style`, we merge them\n else if (propName === 'style') {\n overrideProps[propName] = { ...slotPropValue, ...childPropValue };\n } else if (propName === 'className') {\n overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(' ');\n }\n }\n\n return { ...slotProps, ...overrideProps };\n}\n\nconst Root = Slot;\n\nexport {\n Slot,\n Slottable,\n //\n Root,\n};\nexport type { SlotProps };\n","import * as React from 'react';\nimport { composeEventHandlers } from '@radix-ui/primitive';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { createContextScope } from '@radix-ui/react-context';\nimport { DismissableLayer } from '@radix-ui/react-dismissable-layer';\nimport { useId } from '@radix-ui/react-id';\nimport * as PopperPrimitive from '@radix-ui/react-popper';\nimport { createPopperScope } from '@radix-ui/react-popper';\nimport { Portal as PortalPrimitive } from '@radix-ui/react-portal';\nimport { Presence } from '@radix-ui/react-presence';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { Slottable } from '@radix-ui/react-slot';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport * as VisuallyHiddenPrimitive from '@radix-ui/react-visually-hidden';\n\nimport type * as Radix from '@radix-ui/react-primitive';\nimport type { Scope } from '@radix-ui/react-context';\n\ntype ScopedProps<P = {}> = P & { __scopeTooltip?: Scope };\nconst [createTooltipContext, createTooltipScope] = createContextScope('Tooltip', [\n createPopperScope,\n]);\nconst usePopperScope = createPopperScope();\n\n/* -------------------------------------------------------------------------------------------------\n * TooltipProvider\n * -----------------------------------------------------------------------------------------------*/\n\nconst PROVIDER_NAME = 'TooltipProvider';\nconst DEFAULT_DELAY_DURATION = 700;\nconst TOOLTIP_OPEN = 'tooltip.open';\n\ntype TooltipProviderContextValue = {\n isOpenDelayed: boolean;\n delayDuration: number;\n onOpen(): void;\n onClose(): void;\n onPointerInTransitChange(inTransit: boolean): void;\n isPointerInTransitRef: React.MutableRefObject<boolean>;\n disableHoverableContent: boolean;\n};\n\nconst [TooltipProviderContextProvider, useTooltipProviderContext] =\n createTooltipContext<TooltipProviderContextValue>(PROVIDER_NAME);\n\ninterface TooltipProviderProps {\n children: React.ReactNode;\n /**\n * The duration from when the pointer enters the trigger until the tooltip gets opened.\n * @defaultValue 700\n */\n delayDuration?: number;\n /**\n * How much time a user has to enter another trigger without incurring a delay again.\n * @defaultValue 300\n */\n skipDelayDuration?: number;\n /**\n * When `true`, trying to hover the content will result in the tooltip closing as the pointer leaves the trigger.\n * @defaultValue false\n */\n disableHoverableContent?: boolean;\n}\n\nconst TooltipProvider: React.FC<TooltipProviderProps> = (\n props: ScopedProps<TooltipProviderProps>\n) => {\n const {\n __scopeTooltip,\n delayDuration = DEFAULT_DELAY_DURATION,\n skipDelayDuration = 300,\n disableHoverableContent = false,\n children,\n } = props;\n const [isOpenDelayed, setIsOpenDelayed] = React.useState(true);\n const isPointerInTransitRef = React.useRef(false);\n const skipDelayTimerRef = React.useRef(0);\n\n React.useEffect(() => {\n const skipDelayTimer = skipDelayTimerRef.current;\n return () => window.clearTimeout(skipDelayTimer);\n }, []);\n\n return (\n <TooltipProviderContextProvider\n scope={__scopeTooltip}\n isOpenDelayed={isOpenDelayed}\n delayDuration={delayDuration}\n onOpen={React.useCallback(() => {\n window.clearTimeout(skipDelayTimerRef.current);\n setIsOpenDelayed(false);\n }, [])}\n onClose={React.useCallback(() => {\n window.clearTimeout(skipDelayTimerRef.current);\n skipDelayTimerRef.current = window.setTimeout(\n () => setIsOpenDelayed(true),\n skipDelayDuration\n );\n }, [skipDelayDuration])}\n isPointerInTransitRef={isPointerInTransitRef}\n onPointerInTransitChange={React.useCallback((inTransit: boolean) => {\n isPointerInTransitRef.current = inTransit;\n }, [])}\n disableHoverableContent={disableHoverableContent}\n >\n {children}\n </TooltipProviderContextProvider>\n );\n};\n\nTooltipProvider.displayName = PROVIDER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * Tooltip\n * -----------------------------------------------------------------------------------------------*/\n\nconst TOOLTIP_NAME = 'Tooltip';\n\ntype TooltipContextValue = {\n contentId: string;\n open: boolean;\n stateAttribute: 'closed' | 'delayed-open' | 'instant-open';\n trigger: TooltipTriggerElement | null;\n onTriggerChange(trigger: TooltipTriggerElement | null): void;\n onTriggerEnter(): void;\n onTriggerLeave(): void;\n onOpen(): void;\n onClose(): void;\n disableHoverableContent: boolean;\n};\n\nconst [TooltipContextProvider, useTooltipContext] =\n createTooltipContext<TooltipContextValue>(TOOLTIP_NAME);\n\ninterface TooltipProps {\n children?: React.ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /**\n * The duration from when the pointer enters the trigger until the tooltip gets opened. This will\n * override the prop with the same name passed to Provider.\n * @defaultValue 700\n */\n delayDuration?: number;\n /**\n * When `true`, trying to hover the content will result in the tooltip closing as the pointer leaves the trigger.\n * @defaultValue false\n */\n disableHoverableContent?: boolean;\n}\n\nconst Tooltip: React.FC<TooltipProps> = (props: ScopedProps<TooltipProps>) => {\n const {\n __scopeTooltip,\n children,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n disableHoverableContent: disableHoverableContentProp,\n delayDuration: delayDurationProp,\n } = props;\n const providerContext = useTooltipProviderContext(TOOLTIP_NAME, props.__scopeTooltip);\n const popperScope = usePopperScope(__scopeTooltip);\n const [trigger, setTrigger] = React.useState<HTMLButtonElement | null>(null);\n const contentId = useId();\n const openTimerRef = React.useRef(0);\n const disableHoverableContent =\n disableHoverableContentProp ?? providerContext.disableHoverableContent;\n const delayDuration = delayDurationProp ?? providerContext.delayDuration;\n const wasOpenDelayedRef = React.useRef(false);\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: (open) => {\n if (open) {\n providerContext.onOpen();\n\n // as `onChange` is called within a lifecycle method we\n // avoid dispatching via `dispatchDiscreteCustomEvent`.\n document.dispatchEvent(new CustomEvent(TOOLTIP_OPEN));\n } else {\n providerContext.onClose();\n }\n onOpenChange?.(open);\n },\n });\n const stateAttribute = React.useMemo(() => {\n return open ? (wasOpenDelayedRef.current ? 'delayed-open' : 'instant-open') : 'closed';\n }, [open]);\n\n const handleOpen = React.useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n wasOpenDelayedRef.current = false;\n setOpen(true);\n }, [setOpen]);\n\n const handleClose = React.useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n setOpen(false);\n }, [setOpen]);\n\n const handleDelayedOpen = React.useCallback(() => {\n window.clearTimeout(openTimerRef.current);\n openTimerRef.current = window.setTimeout(() => {\n wasOpenDelayedRef.current = true;\n setOpen(true);\n }, delayDuration);\n }, [delayDuration, setOpen]);\n\n React.useEffect(() => {\n return () => window.clearTimeout(openTimerRef.current);\n }, []);\n\n return (\n <PopperPrimitive.Root {...popperScope}>\n <TooltipContextProvider\n scope={__scopeTooltip}\n contentId={contentId}\n open={open}\n stateAttribute={stateAttribute}\n trigger={trigger}\n onTriggerChange={setTrigger}\n onTriggerEnter={React.useCallback(() => {\n if (providerContext.isOpenDelayed) handleDelayedOpen();\n else handleOpen();\n }, [providerContext.isOpenDelayed, handleDelayedOpen, handleOpen])}\n onTriggerLeave={React.useCallback(() => {\n if (disableHoverableContent) {\n handleClose();\n } else {\n // Clear the timer in case the pointer leaves the trigger before the tooltip is opened.\n window.clearTimeout(openTimerRef.current);\n }\n }, [handleClose, disableHoverableContent])}\n onOpen={handleOpen}\n onClose={handleClose}\n disableHoverableContent={disableHoverableContent}\n >\n {children}\n </TooltipContextProvider>\n </PopperPrimitive.Root>\n );\n};\n\nTooltip.displayName = TOOLTIP_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * TooltipTrigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst TRIGGER_NAME = 'TooltipTrigger';\n\ntype TooltipTriggerElement = React.ElementRef<typeof Primitive.button>;\ntype PrimitiveButtonProps = Radix.ComponentPropsWithoutRef<typeof Primitive.button>;\ninterface TooltipTriggerProps extends PrimitiveButtonProps {}\n\nconst TooltipTrigger = React.forwardRef<TooltipTriggerElement, TooltipTriggerProps>(\n (props: ScopedProps<TooltipTriggerProps>, forwardedRef) => {\n const { __scopeTooltip, ...triggerProps } = props;\n const context = useTooltipContext(TRIGGER_NAME, __scopeTooltip);\n const providerContext = useTooltipProviderContext(TRIGGER_NAME, __scopeTooltip);\n const popperScope = usePopperScope(__scopeTooltip);\n const ref = React.useRef<TooltipTriggerElement>(null);\n const composedRefs = useComposedRefs(forwardedRef, ref, context.onTriggerChange);\n const isPointerDownRef = React.useRef(false);\n const hasPointerMoveOpenedRef = React.useRef(false);\n const handlePointerUp = React.useCallback(() => (isPointerDownRef.current = false), []);\n\n React.useEffect(() => {\n return () => document.removeEventListener('pointerup', handlePointerUp);\n }, [handlePointerUp]);\n\n return (\n <PopperPrimitive.Anchor asChild {...popperScope}>\n <Primitive.button\n // We purposefully avoid adding `type=button` here because tooltip triggers are also\n // commonly anchors and the anchor `type` attribute signifies MIME type.\n aria-describedby={context.open ? context.contentId : undefined}\n data-state={context.stateAttribute}\n {...triggerProps}\n ref={composedRefs}\n onPointerMove={composeEventHandlers(props.onPointerMove, (event) => {\n if (event.pointerType === 'touch') return;\n if (\n !hasPointerMoveOpenedRef.current &&\n !providerContext.isPointerInTransitRef.current\n ) {\n context.onTriggerEnter();\n hasPointerMoveOpenedRef.current = true;\n }\n })}\n onPointerLeave={composeEventHandlers(props.onPointerLeave, () => {\n context.onTriggerLeave();\n hasPointerMoveOpenedRef.current = false;\n })}\n onPointerDown={composeEventHandlers(props.onPointerDown, () => {\n isPointerDownRef.current = true;\n document.addEventListener('pointerup', handlePointerUp, { once: true });\n })}\n onFocus={composeEventHandlers(props.onFocus, () => {\n if (!isPointerDownRef.current) context.onOpen();\n })}\n onBlur={composeEventHandlers(props.onBlur, context.onClose)}\n onClick={composeEventHandlers(props.onClick, context.onClose)}\n />\n </PopperPrimitive.Anchor>\n );\n }\n);\n\nTooltipTrigger.displayName = TRIGGER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * TooltipPortal\n * -----------------------------------------------------------------------------------------------*/\n\nconst PORTAL_NAME = 'TooltipPortal';\n\ntype PortalContextValue = { forceMount?: true };\nconst [PortalProvider, usePortalContext] = createTooltipContext<PortalContextValue>(PORTAL_NAME, {\n forceMount: undefined,\n});\n\ntype PortalProps = React.ComponentPropsWithoutRef<typeof PortalPrimitive>;\ninterface TooltipPortalProps {\n children?: React.ReactNode;\n /**\n * Specify a container element to portal the content into.\n */\n container?: PortalProps['container'];\n /**\n * Used to force mounting when more control is needed. Useful when\n * controlling animation with React animation libraries.\n */\n forceMount?: true;\n}\n\nconst TooltipPortal: React.FC<TooltipPortalProps> = (props: ScopedProps<TooltipPortalProps>) => {\n const { __scopeTooltip, forceMount, children, container } = props;\n const context = useTooltipContext(PORTAL_NAME, __scopeTooltip);\n return (\n <PortalProvider scope={__scopeTooltip} forceMount={forceMount}>\n <Presence present={forceMount || context.open}>\n <PortalPrimitive asChild container={container}>\n {children}\n </PortalPrimitive>\n </Presence>\n </PortalProvider>\n );\n};\n\nTooltipPortal.displayName = PORTAL_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * TooltipContent\n * -----------------------------------------------------------------------------------------------*/\n\nconst CONTENT_NAME = 'TooltipContent';\n\ntype TooltipContentElement = TooltipContentImplElement;\ninterface TooltipContentProps extends TooltipContentImplProps {\n /**\n * Used to force mounting when more control is needed. Useful when\n * controlling animation with React animation libraries.\n */\n forceMount?: true;\n}\n\nconst TooltipContent = React.forwardRef<TooltipContentElement, TooltipContentProps>(\n (props: ScopedProps<TooltipContentProps>, forwardedRef) => {\n const portalContext = usePortalContext(CONTENT_NAME, props.__scopeTooltip);\n const { forceMount = portalContext.forceMount, side = 'top', ...contentProps } = props;\n const context = useTooltipContext(CONTENT_NAME, props.__scopeTooltip);\n\n return (\n <Presence present={forceMount || context.open}>\n {context.disableHoverableContent ? (\n <TooltipContentImpl side={side} {...contentProps} ref={forwardedRef} />\n ) : (\n <TooltipContentHoverable side={side} {...contentProps} ref={forwardedRef} />\n )}\n </Presence>\n );\n }\n);\n\ntype Point = { x: number; y: number };\ntype Polygon = Point[];\n\ntype TooltipContentHoverableElement = TooltipContentImplElement;\ninterface TooltipContentHoverableProps extends TooltipContentImplProps {}\n\nconst TooltipContentHoverable = React.forwardRef<\n TooltipContentHoverableElement,\n TooltipContentHoverableProps\n>((props: ScopedProps<TooltipContentHoverableProps>, forwardedRef) => {\n const context = useTooltipContext(CONTENT_NAME, props.__scopeTooltip);\n const providerContext = useTooltipProviderContext(CONTENT_NAME, props.__scopeTooltip);\n const ref = React.useRef<TooltipContentHoverableElement>(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const [pointerGraceArea, setPointerGraceArea] = React.useState<Polygon | null>(null);\n\n const { trigger, onClose } = context;\n const content = ref.current;\n\n const { onPointerInTransitChange } = providerContext;\n\n const handleRemoveGraceArea = React.useCallback(() => {\n setPointerGraceArea(null);\n onPointerInTransitChange(false);\n }, [onPointerInTransitChange]);\n\n const handleCreateGraceArea = React.useCallback(\n (event: PointerEvent, hoverTarget: HTMLElement) => {\n const currentTarget = event.currentTarget as HTMLElement;\n const exitPoint = { x: event.clientX, y: event.clientY };\n const exitSide = getExitSideFromRect(exitPoint, currentTarget.getBoundingClientRect());\n const paddedExitPoints = getPaddedExitPoints(exitPoint, exitSide);\n const hoverTargetPoints = getPointsFromRect(hoverTarget.getBoundingClientRect());\n const graceArea = getHull([...paddedExitPoints, ...hoverTargetPoints]);\n setPointerGraceArea(graceArea);\n onPointerInTransitChange(true);\n },\n [onPointerInTransitChange]\n );\n\n React.useEffect(() => {\n return () => handleRemoveGraceArea();\n }, [handleRemoveGraceArea]);\n\n React.useEffect(() => {\n if (trigger && content) {\n const handleTriggerLeave = (event: PointerEvent) => handleCreateGraceArea(event, content);\n const handleContentLeave = (event: PointerEvent) => handleCreateGraceArea(event, trigger);\n\n trigger.addEventListener('pointerleave', handleTriggerLeave);\n content.addEventListener('pointerleave', handleContentLeave);\n return () => {\n trigger.removeEventListener('pointerleave', handleTriggerLeave);\n content.removeEventListener('pointerleave', handleContentLeave);\n };\n }\n }, [trigger, content, handleCreateGraceArea, handleRemoveGraceArea]);\n\n React.useEffect(() => {\n if (pointerGraceArea) {\n const handleTrackPointerGrace = (event: PointerEvent) => {\n const target = event.target as HTMLElement;\n const pointerPosition = { x: event.clientX, y: event.clientY };\n const hasEnteredTarget = trigger?.contains(target) || content?.contains(target);\n const isPointerOutsideGraceArea = !isPointInPolygon(pointerPosition, pointerGraceArea);\n\n if (hasEnteredTarget) {\n handleRemoveGraceArea();\n } else if (isPointerOutsideGraceArea) {\n handleRemoveGraceArea();\n onClose();\n }\n };\n document.addEventListener('pointermove', handleTrackPointerGrace);\n return () => document.removeEventListener('pointermove', handleTrackPointerGrace);\n }\n }, [trigger, content, pointerGraceArea, onClose, handleRemoveGraceArea]);\n\n return <TooltipContentImpl {...props} ref={composedRefs} />;\n});\n\nconst [VisuallyHiddenContentContextProvider, useVisuallyHiddenContentContext] =\n createTooltipContext(TOOLTIP_NAME, { isInside: false });\n\ntype TooltipContentImplElement = React.ElementRef<typeof PopperPrimitive.Content>;\ntype DismissableLayerProps = Radix.ComponentPropsWithoutRef<typeof DismissableLayer>;\ntype PopperContentProps = Radix.ComponentPropsWithoutRef<typeof PopperPrimitive.Content>;\ninterface TooltipContentImplProps extends Omit<PopperContentProps, 'onPlaced'> {\n /**\n * A more descriptive label for accessibility purpose\n */\n 'aria-label'?: string;\n\n /**\n * Event handler called when the escape key is down.\n * Can be prevented.\n */\n onEscapeKeyDown?: DismissableLayerProps['onEscapeKeyDown'];\n /**\n * Event handler called when the a `pointerdown` event happens outside of the `Tooltip`.\n * Can be prevented.\n */\n onPointerDownOutside?: DismissableLayerProps['onPointerDownOutside'];\n}\n\nconst TooltipContentImpl = React.forwardRef<TooltipContentImplElement, TooltipContentImplProps>(\n (props: ScopedProps<TooltipContentImplProps>, forwardedRef) => {\n const {\n __scopeTooltip,\n children,\n 'aria-label': ariaLabel,\n onEscapeKeyDown,\n onPointerDownOutside,\n ...contentProps\n } = props;\n const context = useTooltipContext(CONTENT_NAME, __scopeTooltip);\n const popperScope = usePopperScope(__scopeTooltip);\n const { onClose } = context;\n\n // Close this tooltip if another one opens\n React.useEffect(() => {\n document.addEventListener(TOOLTIP_OPEN, onClose);\n return () => document.removeEventListener(TOOLTIP_OPEN, onClose);\n }, [onClose]);\n\n // Close the tooltip if the trigger is scrolled\n React.useEffect(() => {\n if (context.trigger) {\n const handleScroll = (event: Event) => {\n const target = event.target as HTMLElement;\n if (target?.contains(context.trigger)) onClose();\n };\n window.addEventListener('scroll', handleScroll, { capture: true });\n return () => window.removeEventListener('scroll', handleScroll, { capture: true });\n }\n }, [context.trigger, onClose]);\n\n return (\n <DismissableLayer\n asChild\n disableOutsidePointerEvents={false}\n onEscapeKeyDown={onEscapeKeyDown}\n onPointerDownOutside={onPointerDownOutside}\n onFocusOutside={(event) => event.preventDefault()}\n onDismiss={onClose}\n >\n <PopperPrimitive.Content\n data-state={context.stateAttribute}\n {...popperScope}\n {...contentProps}\n ref={forwardedRef}\n style={{\n ...contentProps.style,\n // re-namespace exposed content custom properties\n ...{\n '--radix-tooltip-content-transform-origin': 'var(--radix-popper-transform-origin)',\n '--radix-tooltip-content-available-width': 'var(--radix-popper-available-width)',\n '--radix-tooltip-content-available-height': 'var(--radix-popper-available-height)',\n '--radix-tooltip-trigger-width': 'var(--radix-popper-anchor-width)',\n '--radix-tooltip-trigger-height': 'var(--radix-popper-anchor-height)',\n },\n }}\n >\n <Slottable>{children}</Slottable>\n <VisuallyHiddenContentContextProvider scope={__scopeTooltip} isInside={true}>\n <VisuallyHiddenPrimitive.Root id={context.contentId} role=\"tooltip\">\n {ariaLabel || children}\n </VisuallyHiddenPrimitive.Root>\n </VisuallyHiddenContentContextProvider>\n </PopperPrimitive.Content>\n </DismissableLayer>\n );\n }\n);\n\nTooltipContent.displayName = CONTENT_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * TooltipArrow\n * -----------------------------------------------------------------------------------------------*/\n\nconst ARROW_NAME = 'TooltipArrow';\n\ntype TooltipArrowElement = React.ElementRef<typeof PopperPrimitive.Arrow>;\ntype PopperArrowProps = Radix.ComponentPropsWithoutRef<typeof PopperPrimitive.Arrow>;\ninterface TooltipArrowProps extends PopperArrowProps {}\n\nconst TooltipArrow = React.forwardRef<TooltipArrowElement, TooltipArrowProps>(\n (props: ScopedProps<TooltipArrowProps>, forwardedRef) => {\n const { __scopeTooltip, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopeTooltip);\n const visuallyHiddenContentContext = useVisuallyHiddenContentContext(\n ARROW_NAME,\n __scopeTooltip\n );\n // if the arrow is inside the `VisuallyHidden`, we don't want to render it all to\n // prevent issues in positioning the arrow due to the duplicate\n return visuallyHiddenContentContext.isInside ? null : (\n <PopperPrimitive.Arrow {...popperScope} {...arrowProps} ref={forwardedRef} />\n );\n }\n);\n\nTooltipArrow.displayName = ARROW_NAME;\n\n/* -----------------------------------------------------------------------------------------------*/\n\ntype Side = NonNullable<TooltipContentProps['side']>;\n\nfunction getExitSideFromRect(point: Point, rect: DOMRect): Side {\n const top = Math.abs(rect.top - point.y);\n const bottom = Math.abs(rect.bottom - point.y);\n const right = Math.abs(rect.right - point.x);\n const left = Math.abs(rect.left - point.x);\n\n switch (Math.min(top, bottom, right, left)) {\n case left:\n return 'left';\n case right:\n return 'right';\n case top:\n return 'top';\n case bottom:\n return 'bottom';\n default:\n throw new Error('unreachable');\n }\n}\n\nfunction getPaddedExitPoints(exitPoint: Point, exitSide: Side, padding = 5) {\n const paddedExitPoints: Point[] = [];\n switch (exitSide) {\n case 'top':\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y + padding },\n { x: exitPoint.x + padding, y: exitPoint.y + padding }\n );\n break;\n case 'bottom':\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y - padding },\n { x: exitPoint.x + padding, y: exitPoint.y - padding }\n );\n break;\n case 'left':\n paddedExitPoints.push(\n { x: exitPoint.x + padding, y: exitPoint.y - padding },\n { x: exitPoint.x + padding, y: exitPoint.y + padding }\n );\n break;\n case 'right':\n paddedExitPoints.push(\n { x: exitPoint.x - padding, y: exitPoint.y - padding },\n { x: exitPoint.x - padding, y: exitPoint.y + padding }\n );\n break;\n }\n return paddedExitPoints;\n}\n\nfunction getPointsFromRect(rect: DOMRect) {\n const { top, right, bottom, left } = rect;\n return [\n { x: left, y: top },\n { x: right, y: top },\n { x: right, y: bottom },\n { x: left, y: bottom },\n ];\n}\n\n// Determine if a point is inside of a polygon.\n// Based on https://github.com/substack/point-in-polygon\nfunction isPointInPolygon(point: Point, polygon: Polygon) {\n const { x, y } = point;\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const xi = polygon[i].x;\n const yi = polygon[i].y;\n const xj = polygon[j].x;\n const yj = polygon[j].y;\n\n // prettier-ignore\n const intersect = ((yi > y) !== (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);\n if (intersect) inside = !inside;\n }\n\n return inside;\n}\n\n// Returns a new array of points representing the convex hull of the given set of points.\n// https://www.nayuki.io/page/convex-hull-algorithm\nfunction getHull<P extends Point>(points: Readonly<Array<P>>): Array<P> {\n const newPoints: Array<P> = points.slice();\n newPoints.sort((a: Point, b: Point) => {\n if (a.x < b.x) return -1;\n else if (a.x > b.x) return +1;\n else if (a.y < b.y) return -1;\n else if (a.y > b.y) return +1;\n else return 0;\n });\n return getHullPresorted(newPoints);\n}\n\n// Returns the convex hull, assuming that each points[i] <= points[i + 1]. Runs in O(n) time.\nfunction getHullPresorted<P extends Point>(points: Readonly<Array<P>>): Array<P> {\n if (points.length <= 1) return points.slice();\n\n const upperHull: Array<P> = [];\n for (let i = 0; i < points.length; i++) {\n const p = points[i];\n while (upperHull.length >= 2) {\n const q = upperHull[upperHull.length - 1];\n const r = upperHull[upperHull.length - 2];\n if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) upperHull.pop();\n else break;\n }\n upperHull.push(p);\n }\n upperHull.pop();\n\n const lowerHull: Array<P> = [];\n for (let i = points.length - 1; i >= 0; i--) {\n const p = points[i];\n while (lowerHull.length >= 2) {\n const q = lowerHull[lowerHull.length - 1];\n const r = lowerHull[lowerHull.length - 2];\n if ((q.x - r.x) * (p.y - r.y) >= (q.y - r.y) * (p.x - r.x)) lowerHull.pop();\n else break;\n }\n lowerHull.push(p);\n }\n lowerHull.pop();\n\n if (\n upperHull.length === 1 &&\n lowerHull.length === 1 &&\n upperHull[0].x === lowerHull[0].x &&\n upperHull[0].y === lowerHull[0].y\n ) {\n return upperHull;\n } else {\n return upperHull.concat(lowerHull);\n }\n}\n\nconst Provider = TooltipProvider;\nconst Root = Tooltip;\nconst Trigger = TooltipTrigger;\nconst Portal = TooltipPortal;\nconst Content = TooltipContent;\nconst Arrow = TooltipArrow;\n\nexport {\n createTooltipScope,\n //\n TooltipProvider,\n Tooltip,\n TooltipTrigger,\n TooltipPortal,\n TooltipContent,\n TooltipArrow,\n //\n Provider,\n Root,\n Trigger,\n Portal,\n Content,\n Arrow,\n};\nexport type {\n TooltipProps,\n TooltipTriggerProps,\n TooltipPortalProps,\n TooltipContentProps,\n TooltipArrowProps,\n};\n","'use client';\n\nimport { cn } from '@/src/shared/lib/cn';\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport * as React from 'react';\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'fade-in-0 zoom-in-95 data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 animate-in overflow-hidden rounded-md bg-primary px-3 py-1.5 text-primary-foreground text-xs data-[state=closed]:animate-out',\n className,\n )}\n {...props}\n />\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n","import * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { IntegerIcon } from '@/src/components/spreadsheet/ui/icons/integer-icon';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/src/shared/ui/tooltip';\nimport { QuestionMarkCircledIcon, TextIcon } from '@radix-ui/react-icons';\nimport {\n CalendarIcon,\n CopyCheckIcon,\n DivideIcon,\n DollarSignIcon,\n ListTodoIcon,\n PercentIcon,\n} from 'lucide-react';\n\nexport function ColumnTitleIndicator({ column }: { column: Spreadsheet.Column }) {\n const { width, name, visible, dataEditorType, description } = column;\n\n if (!visible) return null;\n\n return (\n <div\n className=\"flex h-9 w-32 shrink-0 items-center border border-t-0 border-l-0 bg-[#F6F6F9] px-2\"\n style={{\n width,\n height: Spreadsheet.COLUMN_TITLE_INITIAL_HEIGHT,\n }}\n >\n <div className=\"mr-2 w-4 shrink-0 text-[#8E8EA9]\">\n {dataEditorType === 'String' && <TextIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Date' && <CalendarIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Boolean' && <CopyCheckIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Select' && <ListTodoIcon className=\"h-4 w-4\" />}\n\n {dataEditorType === 'Float' && <DivideIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Decimal' && <DivideIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Integer' && <IntegerIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Currency' && <DollarSignIcon className=\"h-4 w-4\" />}\n {dataEditorType === 'Percentage' && <PercentIcon className=\"h-4 w-4\" />}\n </div>\n\n <p\n title={name}\n className=\"mr-2 line-clamp-2 w-full break-words font-semibold text-[#4A4A6A] text-xs\"\n >\n {name}\n </p>\n\n {description ? (\n <TooltipProvider>\n <Tooltip delayDuration={100}>\n <TooltipTrigger>\n <QuestionMarkCircledIcon className=\"h-4 w-4 text-[#4A4A6A]\" />\n </TooltipTrigger>\n\n <TooltipContent className=\"max-w-[240px]\">\n <p>{description}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : (\n <div className=\"w-4 shrink-0\" />\n )}\n </div>\n );\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\n\nexport function CornerIndicator({ className }: { className?: string }) {\n const { emptySize, onSelectSpreadsheet } = useSpreadsheet();\n\n return (\n <button\n type=\"button\"\n disabled={emptySize}\n className={cn(\n 'relative flex h-7 w-12 shrink-0 items-center justify-center border border-t border-l bg-white text-xs',\n className,\n )}\n onClick={onSelectSpreadsheet}\n >\n <span className=\"absolute top-0 right-0 h-full w-0.5 bg-gray-300\" />\n <span className=\"absolute bottom-0 left-0 h-0.5 w-full bg-gray-300\" />\n </button>\n );\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { ColumnIndicator } from '@/src/components/spreadsheet/ui/indicators/column-indicator';\nimport { ColumnTitleIndicator } from '@/src/components/spreadsheet/ui/indicators/column-title-indicator';\nimport { CornerIndicator } from '@/src/components/spreadsheet/ui/indicators/corner-indicator';\n\nexport function Header() {\n const { columns } = useSpreadsheet();\n\n return (\n <div className=\"sticky top-[58px] z-50\">\n <div className=\"relative flex items-center bg-white\">\n <CornerIndicator className=\"border-t-0 border-l-0\" />\n\n {columns.map((column) => (\n <ColumnIndicator\n key={`spreadsheet__column__indicator__key__${column.name}__${column.position}`}\n column={column}\n />\n ))}\n </div>\n\n <div className=\"flex items-center\">\n <div className=\"h-9 w-12 shrink-0 cursor-default border border-t-0 border-l-0 bg-[#F6F6F9]\" />\n\n {columns.map((column) => (\n <ColumnTitleIndicator\n key={`spreadsheet__column__header__key__${column.name}__${column.position}`}\n column={column}\n />\n ))}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { cn } from '@/src/shared/lib/cn';\nimport { CaretSortIcon, CheckIcon, ChevronDownIcon, ChevronUpIcon } from '@radix-ui/react-icons';\nimport * as SelectPrimitive from '@radix-ui/react-select';\nimport * as React from 'react';\n\nconst Select = SelectPrimitive.Root;\n\nconst SelectGroup = SelectPrimitive.Group;\n\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n 'flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent py-2 pr-px pl-3 text-sm shadow-sm ring-offset-background [&>span]:line-clamp-1 disabled:cursor-not-allowed placeholder:text-muted-foreground disabled:opacity-50 focus:outline-none focus:ring-1 focus:ring-ring',\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <CaretSortIcon className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronUpIcon />\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn('flex cursor-default items-center justify-center py-1', className)}\n {...props}\n >\n <ChevronDownIcon />\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = 'popper', ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-96 min-w-[8rem] overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=closed]:animate-out data-[state=open]:animate-in',\n position === 'popper' &&\n 'data-[side=left]:-translate-x-1 data-[side=top]:-translate-y-1 data-[side=right]:translate-x-1 data-[side=bottom]:translate-y-1',\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n 'p-1',\n position === 'popper' &&\n 'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]',\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 font-semibold text-sm', className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pr-8 pl-2 text-sm outline-none data-[disabled]:pointer-events-none focus:bg-accent focus:text-accent-foreground data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { clamp } from '@radix-ui/number';\nimport { composeEventHandlers } from '@radix-ui/primitive';\nimport { createCollection } from '@radix-ui/react-collection';\nimport { useComposedRefs } from '@radix-ui/react-compose-refs';\nimport { createContextScope } from '@radix-ui/react-context';\nimport { useDirection } from '@radix-ui/react-direction';\nimport { DismissableLayer } from '@radix-ui/react-dismissable-layer';\nimport { useFocusGuards } from '@radix-ui/react-focus-guards';\nimport { FocusScope } from '@radix-ui/react-focus-scope';\nimport { useId } from '@radix-ui/react-id';\nimport * as PopperPrimitive from '@radix-ui/react-popper';\nimport { createPopperScope } from '@radix-ui/react-popper';\nimport { Portal as PortalPrimitive } from '@radix-ui/react-portal';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport { Slot } from '@radix-ui/react-slot';\nimport { useCallbackRef } from '@radix-ui/react-use-callback-ref';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport { useLayoutEffect } from '@radix-ui/react-use-layout-effect';\nimport { usePrevious } from '@radix-ui/react-use-previous';\nimport { VisuallyHidden } from '@radix-ui/react-visually-hidden';\nimport { hideOthers } from 'aria-hidden';\nimport { RemoveScroll } from 'react-remove-scroll';\n\nimport type * as Radix from '@radix-ui/react-primitive';\nimport type { Scope } from '@radix-ui/react-context';\n\ntype Direction = 'ltr' | 'rtl';\n\nconst OPEN_KEYS = [' ', 'Enter', 'ArrowUp', 'ArrowDown'];\nconst SELECTION_KEYS = [' ', 'Enter'];\n\n/* -------------------------------------------------------------------------------------------------\n * Select\n * -----------------------------------------------------------------------------------------------*/\n\nconst SELECT_NAME = 'Select';\n\ntype ItemData = { value: string; disabled: boolean; textValue: string };\nconst [Collection, useCollection, createCollectionScope] = createCollection<\n SelectItemElement,\n ItemData\n>(SELECT_NAME);\n\ntype ScopedProps<P> = P & { __scopeSelect?: Scope };\nconst [createSelectContext, createSelectScope] = createContextScope(SELECT_NAME, [\n createCollectionScope,\n createPopperScope,\n]);\nconst usePopperScope = createPopperScope();\n\ntype SelectContextValue = {\n trigger: SelectTriggerElement | null;\n onTriggerChange(node: SelectTriggerElement | null): void;\n valueNode: SelectValueElement | null;\n onValueNodeChange(node: SelectValueElement): void;\n valueNodeHasChildren: boolean;\n onValueNodeHasChildrenChange(hasChildren: boolean): void;\n contentId: string;\n value?: string;\n onValueChange(value: string): void;\n open: boolean;\n required?: boolean;\n onOpenChange(open: boolean): void;\n dir: SelectProps['dir'];\n triggerPointerDownPosRef: React.MutableRefObject<{ x: number; y: number } | null>;\n disabled?: boolean;\n};\n\nconst [SelectProvider, useSelectContext] = createSelectContext<SelectContextValue>(SELECT_NAME);\n\ntype NativeOption = React.ReactElement<React.ComponentProps<'option'>>;\n\ntype SelectNativeOptionsContextValue = {\n onNativeOptionAdd(option: NativeOption): void;\n onNativeOptionRemove(option: NativeOption): void;\n};\nconst [SelectNativeOptionsProvider, useSelectNativeOptionsContext] =\n createSelectContext<SelectNativeOptionsContextValue>(SELECT_NAME);\n\ninterface SelectProps {\n children?: React.ReactNode;\n value?: string;\n defaultValue?: string;\n onValueChange?(value: string): void;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?(open: boolean): void;\n dir?: Direction;\n name?: string;\n autoComplete?: string;\n disabled?: boolean;\n required?: boolean;\n}\n\nconst Select: React.FC<SelectProps> = (props: ScopedProps<SelectProps>) => {\n const {\n __scopeSelect,\n children,\n open: openProp,\n defaultOpen,\n onOpenChange,\n value: valueProp,\n defaultValue,\n onValueChange,\n dir,\n name,\n autoComplete,\n disabled,\n required,\n } = props;\n const popperScope = usePopperScope(__scopeSelect);\n const [trigger, setTrigger] = React.useState<SelectTriggerElement | null>(null);\n const [valueNode, setValueNode] = React.useState<SelectValueElement | null>(null);\n const [valueNodeHasChildren, setValueNodeHasChildren] = React.useState(false);\n const direction = useDirection(dir);\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n const [value, setValue] = useControllableState({\n prop: valueProp,\n defaultProp: defaultValue,\n onChange: onValueChange,\n });\n const triggerPointerDownPosRef = React.useRef<{ x: number; y: number } | null>(null);\n\n // We set this to true by default so that events bubble to forms without JS (SSR)\n const isFormControl = trigger ? Boolean(trigger.closest('form')) : true;\n const [nativeOptionsSet, setNativeOptionsSet] = React.useState(new Set<NativeOption>());\n\n // The native `select` only associates the correct default value if the corresponding\n // `option` is rendered as a child **at the same time** as itself.\n // Because it might take a few renders for our items to gather the information to build\n // the native `option`(s), we generate a key on the `select` to make sure React re-builds it\n // each time the options change.\n const nativeSelectKey = Array.from(nativeOptionsSet)\n .map((option) => option.props.value)\n .join(';');\n\n return (\n <PopperPrimitive.Root {...popperScope}>\n <SelectProvider\n required={required}\n scope={__scopeSelect}\n trigger={trigger}\n onTriggerChange={setTrigger}\n valueNode={valueNode}\n onValueNodeChange={setValueNode}\n valueNodeHasChildren={valueNodeHasChildren}\n onValueNodeHasChildrenChange={setValueNodeHasChildren}\n contentId={useId()}\n value={value}\n onValueChange={setValue}\n open={open}\n onOpenChange={setOpen}\n dir={direction}\n triggerPointerDownPosRef={triggerPointerDownPosRef}\n disabled={disabled}\n >\n <Collection.Provider scope={__scopeSelect}>\n <SelectNativeOptionsProvider\n scope={props.__scopeSelect}\n onNativeOptionAdd={React.useCallback((option) => {\n setNativeOptionsSet((prev) => new Set(prev).add(option));\n }, [])}\n onNativeOptionRemove={React.useCallback((option) => {\n setNativeOptionsSet((prev) => {\n const optionsSet = new Set(prev);\n optionsSet.delete(option);\n return optionsSet;\n });\n }, [])}\n >\n {children}\n </SelectNativeOptionsProvider>\n </Collection.Provider>\n\n {isFormControl ? (\n <BubbleSelect\n key={nativeSelectKey}\n aria-hidden\n required={required}\n tabIndex={-1}\n name={name}\n autoComplete={autoComplete}\n value={value}\n // enable form autofill\n onChange={(event) => setValue(event.target.value)}\n disabled={disabled}\n >\n {value === undefined ? <option value=\"\" /> : null}\n {Array.from(nativeOptionsSet)}\n </BubbleSelect>\n ) : null}\n </SelectProvider>\n </PopperPrimitive.Root>\n );\n};\n\nSelect.displayName = SELECT_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectTrigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst TRIGGER_NAME = 'SelectTrigger';\n\ntype SelectTriggerElement = React.ElementRef<typeof Primitive.button>;\ntype PrimitiveButtonProps = Radix.ComponentPropsWithoutRef<typeof Primitive.button>;\ninterface SelectTriggerProps extends PrimitiveButtonProps {}\n\nconst SelectTrigger = React.forwardRef<SelectTriggerElement, SelectTriggerProps>(\n (props: ScopedProps<SelectTriggerProps>, forwardedRef) => {\n const { __scopeSelect, disabled = false, ...triggerProps } = props;\n const popperScope = usePopperScope(__scopeSelect);\n const context = useSelectContext(TRIGGER_NAME, __scopeSelect);\n const isDisabled = context.disabled || disabled;\n const composedRefs = useComposedRefs(forwardedRef, context.onTriggerChange);\n const getItems = useCollection(__scopeSelect);\n\n const [searchRef, handleTypeaheadSearch, resetTypeahead] = useTypeaheadSearch((search) => {\n const enabledItems = getItems().filter((item) => !item.disabled);\n const currentItem = enabledItems.find((item) => item.value === context.value);\n const nextItem = findNextItem(enabledItems, search, currentItem);\n if (nextItem !== undefined) {\n context.onValueChange(nextItem.value);\n }\n });\n\n const handleOpen = () => {\n if (!isDisabled) {\n context.onOpenChange(true);\n // reset typeahead when we open\n resetTypeahead();\n }\n };\n\n return (\n <PopperPrimitive.Anchor asChild {...popperScope}>\n <Primitive.button\n type=\"button\"\n role=\"combobox\"\n aria-controls={context.contentId}\n aria-expanded={context.open}\n aria-required={context.required}\n aria-autocomplete=\"none\"\n dir={context.dir}\n data-state={context.open ? 'open' : 'closed'}\n disabled={isDisabled}\n data-disabled={isDisabled ? '' : undefined}\n data-placeholder={shouldShowPlaceholder(context.value) ? '' : undefined}\n {...triggerProps}\n ref={composedRefs}\n // Enable compatibility with native label or custom `Label` \"click\" for Safari:\n onClick={composeEventHandlers(triggerProps.onClick, (event) => {\n // Whilst browsers generally have no issue focusing the trigger when clicking\n // on a label, Safari seems to struggle with the fact that there's no `onClick`.\n // We force `focus` in this case. Note: this doesn't create any other side-effect\n // because we are preventing default in `onPointerDown` so effectively\n // this only runs for a label \"click\"\n event.currentTarget.focus();\n })}\n onPointerDown={composeEventHandlers(triggerProps.onPointerDown, (event) => {\n // prevent implicit pointer capture\n // https://www.w3.org/TR/pointerevents3/#implicit-pointer-capture\n const target = event.target as HTMLElement;\n if (target.hasPointerCapture(event.pointerId)) {\n target.releasePointerCapture(event.pointerId);\n }\n\n // only call handler if it's the left button (mousedown gets triggered by all mouse buttons)\n // but not when the control key is pressed (avoiding MacOS right click)\n if (event.button === 0 && event.ctrlKey === false) {\n handleOpen();\n context.triggerPointerDownPosRef.current = {\n x: Math.round(event.pageX),\n y: Math.round(event.pageY),\n };\n // prevent trigger from stealing focus from the active item after opening.\n event.preventDefault();\n }\n })}\n onKeyDown={composeEventHandlers(triggerProps.onKeyDown, (event) => {\n const isTypingAhead = searchRef.current !== '';\n const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;\n if (!isModifierKey && event.key.length === 1) handleTypeaheadSearch(event.key);\n if (isTypingAhead && event.key === ' ') return;\n if (OPEN_KEYS.includes(event.key)) {\n handleOpen();\n event.preventDefault();\n }\n })}\n />\n </PopperPrimitive.Anchor>\n );\n }\n);\n\nSelectTrigger.displayName = TRIGGER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectValue\n * -----------------------------------------------------------------------------------------------*/\n\nconst VALUE_NAME = 'SelectValue';\n\ntype SelectValueElement = React.ElementRef<typeof Primitive.span>;\ntype PrimitiveSpanProps = Radix.ComponentPropsWithoutRef<typeof Primitive.span>;\ninterface SelectValueProps extends Omit<PrimitiveSpanProps, 'placeholder'> {\n placeholder?: React.ReactNode;\n}\n\nconst SelectValue = React.forwardRef<SelectValueElement, SelectValueProps>(\n (props: ScopedProps<SelectValueProps>, forwardedRef) => {\n // We ignore `className` and `style` as this part shouldn't be styled.\n const { __scopeSelect, className, style, children, placeholder = '', ...valueProps } = props;\n const context = useSelectContext(VALUE_NAME, __scopeSelect);\n const { onValueNodeHasChildrenChange } = context;\n const hasChildren = children !== undefined;\n const composedRefs = useComposedRefs(forwardedRef, context.onValueNodeChange);\n\n useLayoutEffect(() => {\n onValueNodeHasChildrenChange(hasChildren);\n }, [onValueNodeHasChildrenChange, hasChildren]);\n\n return (\n <Primitive.span\n {...valueProps}\n ref={composedRefs}\n // we don't want events from the portalled `SelectValue` children to bubble\n // through the item they came from\n style={{ pointerEvents: 'none' }}\n >\n {shouldShowPlaceholder(context.value) ? <>{placeholder}</> : children}\n </Primitive.span>\n );\n }\n);\n\nSelectValue.displayName = VALUE_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectIcon\n * -----------------------------------------------------------------------------------------------*/\n\nconst ICON_NAME = 'SelectIcon';\n\ntype SelectIconElement = React.ElementRef<typeof Primitive.span>;\ninterface SelectIconProps extends PrimitiveSpanProps {}\n\nconst SelectIcon = React.forwardRef<SelectIconElement, SelectIconProps>(\n (props: ScopedProps<SelectIconProps>, forwardedRef) => {\n const { __scopeSelect, children, ...iconProps } = props;\n return (\n <Primitive.span aria-hidden {...iconProps} ref={forwardedRef}>\n {children || '▼'}\n </Primitive.span>\n );\n }\n);\n\nSelectIcon.displayName = ICON_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectPortal\n * -----------------------------------------------------------------------------------------------*/\n\nconst PORTAL_NAME = 'SelectPortal';\n\ntype PortalProps = React.ComponentPropsWithoutRef<typeof PortalPrimitive>;\ninterface SelectPortalProps {\n children?: React.ReactNode;\n /**\n * Specify a container element to portal the content into.\n */\n container?: PortalProps['container'];\n}\n\nconst SelectPortal: React.FC<SelectPortalProps> = (props: ScopedProps<SelectPortalProps>) => {\n return <PortalPrimitive asChild {...props} />;\n};\n\nSelectPortal.displayName = PORTAL_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectContent\n * -----------------------------------------------------------------------------------------------*/\n\nconst CONTENT_NAME = 'SelectContent';\n\ntype SelectContentElement = SelectContentImplElement;\ninterface SelectContentProps extends SelectContentImplProps {}\n\nconst SelectContent = React.forwardRef<SelectContentElement, SelectContentProps>(\n (props: ScopedProps<SelectContentProps>, forwardedRef) => {\n const context = useSelectContext(CONTENT_NAME, props.__scopeSelect);\n const [fragment, setFragment] = React.useState<DocumentFragment>();\n\n // setting the fragment in `useLayoutEffect` as `DocumentFragment` doesn't exist on the server\n useLayoutEffect(() => {\n setFragment(new DocumentFragment());\n }, []);\n\n if (!context.open) {\n const frag = fragment as Element | undefined;\n return frag\n ? ReactDOM.createPortal(\n <SelectContentProvider scope={props.__scopeSelect}>\n <Collection.Slot scope={props.__scopeSelect}>\n <div>{props.children}</div>\n </Collection.Slot>\n </SelectContentProvider>,\n frag\n )\n : null;\n }\n\n return <SelectContentImpl {...props} ref={forwardedRef} />;\n }\n);\n\nSelectContent.displayName = CONTENT_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectContentImpl\n * -----------------------------------------------------------------------------------------------*/\n\nconst CONTENT_MARGIN = 10;\n\ntype SelectContentContextValue = {\n content?: SelectContentElement | null;\n viewport?: SelectViewportElement | null;\n onViewportChange?: (node: SelectViewportElement | null) => void;\n itemRefCallback?: (node: SelectItemElement | null, value: string, disabled: boolean) => void;\n selectedItem?: SelectItemElement | null;\n onItemLeave?: () => void;\n itemTextRefCallback?: (\n node: SelectItemTextElement | null,\n value: string,\n disabled: boolean\n ) => void;\n focusSelectedItem?: () => void;\n selectedItemText?: SelectItemTextElement | null;\n position?: SelectContentProps['position'];\n isPositioned?: boolean;\n searchRef?: React.RefObject<string>;\n};\n\nconst [SelectContentProvider, useSelectContentContext] =\n createSelectContext<SelectContentContextValue>(CONTENT_NAME);\n\nconst CONTENT_IMPL_NAME = 'SelectContentImpl';\n\ntype SelectContentImplElement = SelectPopperPositionElement | SelectItemAlignedPositionElement;\ntype DismissableLayerProps = React.ComponentPropsWithoutRef<typeof DismissableLayer>;\ntype FocusScopeProps = Radix.ComponentPropsWithoutRef<typeof FocusScope>;\n\ntype SelectPopperPrivateProps = { onPlaced?: PopperContentProps['onPlaced'] };\n\ninterface SelectContentImplProps\n extends Omit<SelectPopperPositionProps, keyof SelectPopperPrivateProps>,\n Omit<SelectItemAlignedPositionProps, keyof SelectPopperPrivateProps> {\n /**\n * Event handler called when auto-focusing on close.\n * Can be prevented.\n */\n onCloseAutoFocus?: FocusScopeProps['onUnmountAutoFocus'];\n /**\n * Event handler called when the escape key is down.\n * Can be prevented.\n */\n onEscapeKeyDown?: DismissableLayerProps['onEscapeKeyDown'];\n /**\n * Event handler called when the a `pointerdown` event happens outside of the `DismissableLayer`.\n * Can be prevented.\n */\n onPointerDownOutside?: DismissableLayerProps['onPointerDownOutside'];\n\n position?: 'item-aligned' | 'popper';\n}\n\nconst SelectContentImpl = React.forwardRef<SelectContentImplElement, SelectContentImplProps>(\n (props: ScopedProps<SelectContentImplProps>, forwardedRef) => {\n const {\n __scopeSelect,\n position = 'item-aligned',\n onCloseAutoFocus,\n onEscapeKeyDown,\n onPointerDownOutside,\n //\n // PopperContent props\n side,\n sideOffset,\n align,\n alignOffset,\n arrowPadding,\n collisionBoundary,\n collisionPadding,\n sticky,\n hideWhenDetached,\n avoidCollisions,\n //\n ...contentProps\n } = props;\n const context = useSelectContext(CONTENT_NAME, __scopeSelect);\n const [content, setContent] = React.useState<SelectContentImplElement | null>(null);\n const [viewport, setViewport] = React.useState<SelectViewportElement | null>(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setContent(node));\n const [selectedItem, setSelectedItem] = React.useState<SelectItemElement | null>(null);\n const [selectedItemText, setSelectedItemText] = React.useState<SelectItemTextElement | null>(\n null\n );\n const getItems = useCollection(__scopeSelect);\n const [isPositioned, setIsPositioned] = React.useState(false);\n const firstValidItemFoundRef = React.useRef(false);\n\n // aria-hide everything except the content (better supported equivalent to setting aria-modal)\n React.useEffect(() => {\n if (content) return hideOthers(content);\n }, [content]);\n\n // Make sure the whole tree has focus guards as our `Select` may be\n // the last element in the DOM (because of the `Portal`)\n useFocusGuards();\n\n const focusFirst = React.useCallback(\n (candidates: Array<HTMLElement | null>) => {\n const [firstItem, ...restItems] = getItems().map((item) => item.ref.current);\n const [lastItem] = restItems.slice(-1);\n\n const PREVIOUSLY_FOCUSED_ELEMENT = document.activeElement;\n for (const candidate of candidates) {\n // if focus is already where we want to go, we don't want to keep going through the candidates\n if (candidate === PREVIOUSLY_FOCUSED_ELEMENT) return;\n candidate?.scrollIntoView({ block: 'nearest' });\n // viewport might have padding so scroll to its edges when focusing first/last items.\n if (candidate === firstItem && viewport) viewport.scrollTop = 0;\n if (candidate === lastItem && viewport) viewport.scrollTop = viewport.scrollHeight;\n candidate?.focus();\n if (document.activeElement !== PREVIOUSLY_FOCUSED_ELEMENT) return;\n }\n },\n [getItems, viewport]\n );\n\n const focusSelectedItem = React.useCallback(\n () => focusFirst([selectedItem, content]),\n [focusFirst, selectedItem, content]\n );\n\n // Since this is not dependent on layout, we want to ensure this runs at the same time as\n // other effects across components. Hence why we don't call `focusSelectedItem` inside `position`.\n React.useEffect(() => {\n if (isPositioned) {\n focusSelectedItem();\n }\n }, [isPositioned, focusSelectedItem]);\n\n // prevent selecting items on `pointerup` in some cases after opening from `pointerdown`\n // and close on `pointerup` outside.\n const { onOpenChange, triggerPointerDownPosRef } = context;\n React.useEffect(() => {\n if (content) {\n let pointerMoveDelta = { x: 0, y: 0 };\n\n const handlePointerMove = (event: PointerEvent) => {\n pointerMoveDelta = {\n x: Math.abs(Math.round(event.pageX) - (triggerPointerDownPosRef.current?.x ?? 0)),\n y: Math.abs(Math.round(event.pageY) - (triggerPointerDownPosRef.current?.y ?? 0)),\n };\n };\n const handlePointerUp = (event: PointerEvent) => {\n // If the pointer hasn't moved by a certain threshold then we prevent selecting item on `pointerup`.\n if (pointerMoveDelta.x <= 10 && pointerMoveDelta.y <= 10) {\n event.preventDefault();\n } else {\n // otherwise, if the event was outside the content, close.\n if (!content.contains(event.target as HTMLElement)) {\n onOpenChange(false);\n }\n }\n document.removeEventListener('pointermove', handlePointerMove);\n triggerPointerDownPosRef.current = null;\n };\n\n if (triggerPointerDownPosRef.current !== null) {\n document.addEventListener('pointermove', handlePointerMove);\n document.addEventListener('pointerup', handlePointerUp, { capture: true, once: true });\n }\n\n return () => {\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp, { capture: true });\n };\n }\n }, [content, onOpenChange, triggerPointerDownPosRef]);\n\n React.useEffect(() => {\n const close = () => onOpenChange(false);\n window.addEventListener('blur', close);\n window.addEventListener('resize', close);\n return () => {\n window.removeEventListener('blur', close);\n window.removeEventListener('resize', close);\n };\n }, [onOpenChange]);\n\n const [searchRef, handleTypeaheadSearch] = useTypeaheadSearch((search) => {\n const enabledItems = getItems().filter((item) => !item.disabled);\n const currentItem = enabledItems.find((item) => item.ref.current === document.activeElement);\n const nextItem = findNextItem(enabledItems, search, currentItem);\n if (nextItem) {\n /**\n * Imperative focus during keydown is risky so we prevent React's batching updates\n * to avoid potential bugs. See: https://github.com/facebook/react/issues/20332\n */\n setTimeout(() => (nextItem.ref.current as HTMLElement).focus());\n }\n });\n\n const itemRefCallback = React.useCallback(\n (node: SelectItemElement | null, value: string, disabled: boolean) => {\n const isFirstValidItem = !firstValidItemFoundRef.current && !disabled;\n const isSelectedItem = context.value !== undefined && context.value === value;\n if (isSelectedItem || isFirstValidItem) {\n setSelectedItem(node);\n if (isFirstValidItem) firstValidItemFoundRef.current = true;\n }\n },\n [context.value]\n );\n const handleItemLeave = React.useCallback(() => content?.focus(), [content]);\n const itemTextRefCallback = React.useCallback(\n (node: SelectItemTextElement | null, value: string, disabled: boolean) => {\n const isFirstValidItem = !firstValidItemFoundRef.current && !disabled;\n const isSelectedItem = context.value !== undefined && context.value === value;\n if (isSelectedItem || isFirstValidItem) {\n setSelectedItemText(node);\n }\n },\n [context.value]\n );\n\n const SelectPosition = position === 'popper' ? SelectPopperPosition : SelectItemAlignedPosition;\n\n // Silently ignore props that are not supported by `SelectItemAlignedPosition`\n const popperContentProps =\n SelectPosition === SelectPopperPosition\n ? {\n side,\n sideOffset,\n align,\n alignOffset,\n arrowPadding,\n collisionBoundary,\n collisionPadding,\n sticky,\n hideWhenDetached,\n avoidCollisions,\n }\n : {};\n\n return (\n <SelectContentProvider\n scope={__scopeSelect}\n content={content}\n viewport={viewport}\n onViewportChange={setViewport}\n itemRefCallback={itemRefCallback}\n selectedItem={selectedItem}\n onItemLeave={handleItemLeave}\n itemTextRefCallback={itemTextRefCallback}\n focusSelectedItem={focusSelectedItem}\n selectedItemText={selectedItemText}\n position={position}\n isPositioned={isPositioned}\n searchRef={searchRef}\n >\n <RemoveScroll as={Slot} allowPinchZoom>\n <FocusScope\n asChild\n // we make sure we're not trapping once it's been closed\n // (closed !== unmounted when animating out)\n trapped={context.open}\n onMountAutoFocus={(event) => {\n // we prevent open autofocus because we manually focus the selected item\n event.preventDefault();\n }}\n onUnmountAutoFocus={composeEventHandlers(onCloseAutoFocus, (event) => {\n context.trigger?.focus({ preventScroll: true });\n event.preventDefault();\n })}\n >\n <DismissableLayer\n asChild\n disableOutsidePointerEvents\n onEscapeKeyDown={onEscapeKeyDown}\n onPointerDownOutside={onPointerDownOutside}\n // When focus is trapped, a focusout event may still happen.\n // We make sure we don't trigger our `onDismiss` in such case.\n onFocusOutside={(event) => event.preventDefault()}\n onDismiss={() => context.onOpenChange(false)}\n >\n <SelectPosition\n role=\"listbox\"\n id={context.contentId}\n data-state={context.open ? 'open' : 'closed'}\n dir={context.dir}\n onContextMenu={(event) => event.preventDefault()}\n {...contentProps}\n {...popperContentProps}\n onPlaced={() => setIsPositioned(true)}\n ref={composedRefs}\n style={{\n // flex layout so we can place the scroll buttons properly\n display: 'flex',\n flexDirection: 'column',\n // reset the outline by default as the content MAY get focused\n outline: 'none',\n ...contentProps.style,\n }}\n onKeyDown={composeEventHandlers(contentProps.onKeyDown, (event) => {\n const isModifierKey = event.ctrlKey || event.altKey || event.metaKey;\n\n // select should not be navigated using tab key so we prevent it\n if (event.key === 'Tab') event.preventDefault();\n\n if (!isModifierKey && event.key.length === 1) handleTypeaheadSearch(event.key);\n\n if (['ArrowUp', 'ArrowDown', 'Home', 'End'].includes(event.key)) {\n const items = getItems().filter((item) => !item.disabled);\n let candidateNodes = items.map((item) => item.ref.current!);\n\n if (['ArrowUp', 'End'].includes(event.key)) {\n candidateNodes = candidateNodes.slice().reverse();\n }\n if (['ArrowUp', 'ArrowDown'].includes(event.key)) {\n const currentElement = event.target as SelectItemElement;\n const currentIndex = candidateNodes.indexOf(currentElement);\n candidateNodes = candidateNodes.slice(currentIndex + 1);\n }\n\n /**\n * Imperative focus during keydown is risky so we prevent React's batching updates\n * to avoid potential bugs. See: https://github.com/facebook/react/issues/20332\n */\n setTimeout(() => focusFirst(candidateNodes));\n\n event.preventDefault();\n }\n })}\n />\n </DismissableLayer>\n </FocusScope>\n </RemoveScroll>\n </SelectContentProvider>\n );\n }\n);\n\nSelectContentImpl.displayName = CONTENT_IMPL_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectItemAlignedPosition\n * -----------------------------------------------------------------------------------------------*/\n\nconst ITEM_ALIGNED_POSITION_NAME = 'SelectItemAlignedPosition';\n\ntype SelectItemAlignedPositionElement = React.ElementRef<typeof Primitive.div>;\ninterface SelectItemAlignedPositionProps extends PrimitiveDivProps, SelectPopperPrivateProps {}\n\nconst SelectItemAlignedPosition = React.forwardRef<\n SelectItemAlignedPositionElement,\n SelectItemAlignedPositionProps\n>((props: ScopedProps<SelectItemAlignedPositionProps>, forwardedRef) => {\n const { __scopeSelect, onPlaced, ...popperProps } = props;\n const context = useSelectContext(CONTENT_NAME, __scopeSelect);\n const contentContext = useSelectContentContext(CONTENT_NAME, __scopeSelect);\n const [contentWrapper, setContentWrapper] = React.useState<HTMLDivElement | null>(null);\n const [content, setContent] = React.useState<SelectItemAlignedPositionElement | null>(null);\n const composedRefs = useComposedRefs(forwardedRef, (node) => setContent(node));\n const getItems = useCollection(__scopeSelect);\n const shouldExpandOnScrollRef = React.useRef(false);\n const shouldRepositionRef = React.useRef(true);\n\n const { viewport, selectedItem, selectedItemText, focusSelectedItem } = contentContext;\n const position = React.useCallback(() => {\n if (\n context.trigger &&\n context.valueNode &&\n contentWrapper &&\n content &&\n viewport &&\n selectedItem &&\n selectedItemText\n ) {\n const triggerRect = context.trigger.getBoundingClientRect();\n\n // -----------------------------------------------------------------------------------------\n // Horizontal positioning\n // -----------------------------------------------------------------------------------------\n const contentRect = content.getBoundingClientRect();\n const valueNodeRect = context.valueNode.getBoundingClientRect();\n const itemTextRect = selectedItemText.getBoundingClientRect();\n\n if (context.dir !== 'rtl') {\n const itemTextOffset = itemTextRect.left - contentRect.left;\n const left = valueNodeRect.left - itemTextOffset;\n const leftDelta = triggerRect.left - left;\n const minContentWidth = triggerRect.width + leftDelta;\n const contentWidth = Math.max(minContentWidth, contentRect.width);\n const rightEdge = window.innerWidth - CONTENT_MARGIN;\n const clampedLeft = clamp(left, [CONTENT_MARGIN, rightEdge - contentWidth]);\n\n contentWrapper.style.minWidth = minContentWidth + 'px';\n contentWrapper.style.left = clampedLeft + 'px';\n } else {\n const itemTextOffset = contentRect.right - itemTextRect.right;\n const right = window.innerWidth - valueNodeRect.right - itemTextOffset;\n const rightDelta = window.innerWidth - triggerRect.right - right;\n const minContentWidth = triggerRect.width + rightDelta;\n const contentWidth = Math.max(minContentWidth, contentRect.width);\n const leftEdge = window.innerWidth - CONTENT_MARGIN;\n const clampedRight = clamp(right, [CONTENT_MARGIN, leftEdge - contentWidth]);\n\n contentWrapper.style.minWidth = minContentWidth + 'px';\n contentWrapper.style.right = clampedRight + 'px';\n }\n\n // -----------------------------------------------------------------------------------------\n // Vertical positioning\n // -----------------------------------------------------------------------------------------\n const items = getItems();\n const availableHeight = window.innerHeight - CONTENT_MARGIN * 2;\n const itemsHeight = viewport.scrollHeight;\n\n const contentStyles = window.getComputedStyle(content);\n const contentBorderTopWidth = parseInt(contentStyles.borderTopWidth, 10);\n const contentPaddingTop = parseInt(contentStyles.paddingTop, 10);\n const contentBorderBottomWidth = parseInt(contentStyles.borderBottomWidth, 10);\n const contentPaddingBottom = parseInt(contentStyles.paddingBottom, 10);\n const fullContentHeight = contentBorderTopWidth + contentPaddingTop + itemsHeight + contentPaddingBottom + contentBorderBottomWidth; // prettier-ignore\n const minContentHeight = Math.min(selectedItem.offsetHeight * 5, fullContentHeight);\n\n const viewportStyles = window.getComputedStyle(viewport);\n const viewportPaddingTop = parseInt(viewportStyles.paddingTop, 10);\n const viewportPaddingBottom = parseInt(viewportStyles.paddingBottom, 10);\n\n const topEdgeToTriggerMiddle = triggerRect.top + triggerRect.height / 2 - CONTENT_MARGIN;\n const triggerMiddleToBottomEdge = availableHeight - topEdgeToTriggerMiddle;\n\n const selectedItemHalfHeight = selectedItem.offsetHeight / 2;\n const itemOffsetMiddle = selectedItem.offsetTop + selectedItemHalfHeight;\n const contentTopToItemMiddle = contentBorderTopWidth + contentPaddingTop + itemOffsetMiddle;\n const itemMiddleToContentBottom = fullContentHeight - contentTopToItemMiddle;\n\n const willAlignWithoutTopOverflow = contentTopToItemMiddle <= topEdgeToTriggerMiddle;\n\n if (willAlignWithoutTopOverflow) {\n const isLastItem = selectedItem === items[items.length - 1].ref.current;\n contentWrapper.style.bottom = 0 + 'px';\n const viewportOffsetBottom =\n content.clientHeight - viewport.offsetTop - viewport.offsetHeight;\n const clampedTriggerMiddleToBottomEdge = Math.max(\n triggerMiddleToBottomEdge,\n selectedItemHalfHeight +\n // viewport might have padding bottom, include it to avoid a scrollable viewport\n (isLastItem ? viewportPaddingBottom : 0) +\n viewportOffsetBottom +\n contentBorderBottomWidth\n );\n const height = contentTopToItemMiddle + clampedTriggerMiddleToBottomEdge;\n contentWrapper.style.height = height + 'px';\n } else {\n const isFirstItem = selectedItem === items[0].ref.current;\n contentWrapper.style.top = 0 + 'px';\n const clampedTopEdgeToTriggerMiddle = Math.max(\n topEdgeToTriggerMiddle,\n contentBorderTopWidth +\n viewport.offsetTop +\n // viewport might have padding top, include it to avoid a scrollable viewport\n (isFirstItem ? viewportPaddingTop : 0) +\n selectedItemHalfHeight\n );\n const height = clampedTopEdgeToTriggerMiddle + itemMiddleToContentBottom;\n contentWrapper.style.height = height + 'px';\n viewport.scrollTop = contentTopToItemMiddle - topEdgeToTriggerMiddle + viewport.offsetTop;\n }\n\n contentWrapper.style.margin = `${CONTENT_MARGIN}px 0`;\n contentWrapper.style.minHeight = minContentHeight + 'px';\n contentWrapper.style.maxHeight = availableHeight + 'px';\n // -----------------------------------------------------------------------------------------\n\n onPlaced?.();\n\n // we don't want the initial scroll position adjustment to trigger \"expand on scroll\"\n // so we explicitly turn it on only after they've registered.\n requestAnimationFrame(() => (shouldExpandOnScrollRef.current = true));\n }\n }, [\n getItems,\n context.trigger,\n context.valueNode,\n contentWrapper,\n content,\n viewport,\n selectedItem,\n selectedItemText,\n context.dir,\n onPlaced,\n ]);\n\n useLayoutEffect(() => position(), [position]);\n\n // copy z-index from content to wrapper\n const [contentZIndex, setContentZIndex] = React.useState<string>();\n useLayoutEffect(() => {\n if (content) setContentZIndex(window.getComputedStyle(content).zIndex);\n }, [content]);\n\n // When the viewport becomes scrollable at the top, the scroll up button will mount.\n // Because it is part of the normal flow, it will push down the viewport, thus throwing our\n // trigger => selectedItem alignment off by the amount the viewport was pushed down.\n // We wait for this to happen and then re-run the positining logic one more time to account for it.\n const handleScrollButtonChange = React.useCallback(\n (node: SelectScrollButtonImplElement | null) => {\n if (node && shouldRepositionRef.current === true) {\n position();\n focusSelectedItem?.();\n shouldRepositionRef.current = false;\n }\n },\n [position, focusSelectedItem]\n );\n\n return (\n <SelectViewportProvider\n scope={__scopeSelect}\n contentWrapper={contentWrapper}\n shouldExpandOnScrollRef={shouldExpandOnScrollRef}\n onScrollButtonChange={handleScrollButtonChange}\n >\n <div\n ref={setContentWrapper}\n style={{\n display: 'flex',\n flexDirection: 'column',\n position: 'fixed',\n zIndex: contentZIndex,\n }}\n >\n <Primitive.div\n {...popperProps}\n ref={composedRefs}\n style={{\n // When we get the height of the content, it includes borders. If we were to set\n // the height without having `boxSizing: 'border-box'` it would be too big.\n boxSizing: 'border-box',\n // We need to ensure the content doesn't get taller than the wrapper\n maxHeight: '100%',\n ...popperProps.style,\n }}\n />\n </div>\n </SelectViewportProvider>\n );\n});\n\nSelectItemAlignedPosition.displayName = ITEM_ALIGNED_POSITION_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectPopperPosition\n * -----------------------------------------------------------------------------------------------*/\n\nconst POPPER_POSITION_NAME = 'SelectPopperPosition';\n\ntype SelectPopperPositionElement = React.ElementRef<typeof PopperPrimitive.Content>;\ntype PopperContentProps = React.ComponentPropsWithoutRef<typeof PopperPrimitive.Content>;\ninterface SelectPopperPositionProps extends PopperContentProps, SelectPopperPrivateProps {}\n\nconst SelectPopperPosition = React.forwardRef<\n SelectPopperPositionElement,\n SelectPopperPositionProps\n>((props: ScopedProps<SelectPopperPositionProps>, forwardedRef) => {\n const {\n __scopeSelect,\n align = 'start',\n collisionPadding = CONTENT_MARGIN,\n ...popperProps\n } = props;\n const popperScope = usePopperScope(__scopeSelect);\n\n return (\n <PopperPrimitive.Content\n {...popperScope}\n {...popperProps}\n ref={forwardedRef}\n align={align}\n collisionPadding={collisionPadding}\n style={{\n // Ensure border-box for floating-ui calculations\n boxSizing: 'border-box',\n ...popperProps.style,\n // re-namespace exposed content custom properties\n ...{\n '--radix-select-content-transform-origin': 'var(--radix-popper-transform-origin)',\n '--radix-select-content-available-width': 'var(--radix-popper-available-width)',\n '--radix-select-content-available-height': 'var(--radix-popper-available-height)',\n '--radix-select-trigger-width': 'var(--radix-popper-anchor-width)',\n '--radix-select-trigger-height': 'var(--radix-popper-anchor-height)',\n },\n }}\n />\n );\n});\n\nSelectPopperPosition.displayName = POPPER_POSITION_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectViewport\n * -----------------------------------------------------------------------------------------------*/\n\ntype SelectViewportContextValue = {\n contentWrapper?: HTMLDivElement | null;\n shouldExpandOnScrollRef?: React.RefObject<boolean>;\n onScrollButtonChange?: (node: SelectScrollButtonImplElement | null) => void;\n};\n\nconst [SelectViewportProvider, useSelectViewportContext] =\n createSelectContext<SelectViewportContextValue>(CONTENT_NAME, {});\n\nconst VIEWPORT_NAME = 'SelectViewport';\n\ntype SelectViewportElement = React.ElementRef<typeof Primitive.div>;\ntype PrimitiveDivProps = Radix.ComponentPropsWithoutRef<typeof Primitive.div>;\ninterface SelectViewportProps extends PrimitiveDivProps {}\n\nconst SelectViewport = React.forwardRef<SelectViewportElement, SelectViewportProps>(\n (props: ScopedProps<SelectViewportProps>, forwardedRef) => {\n const { __scopeSelect, ...viewportProps } = props;\n const contentContext = useSelectContentContext(VIEWPORT_NAME, __scopeSelect);\n const viewportContext = useSelectViewportContext(VIEWPORT_NAME, __scopeSelect);\n const composedRefs = useComposedRefs(forwardedRef, contentContext.onViewportChange);\n const prevScrollTopRef = React.useRef(0);\n return (\n <>\n {/* Hide scrollbars cross-browser and enable momentum scroll for touch devices */}\n <style\n dangerouslySetInnerHTML={{\n __html: `[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}`,\n }}\n />\n <Collection.Slot scope={__scopeSelect}>\n <Primitive.div\n data-radix-select-viewport=\"\"\n role=\"presentation\"\n {...viewportProps}\n ref={composedRefs}\n style={{\n // we use position: 'relative' here on the `viewport` so that when we call\n // `selectedItem.offsetTop` in calculations, the offset is relative to the viewport\n // (independent of the scrollUpButton).\n position: 'relative',\n flex: 1,\n overflow: 'auto',\n ...viewportProps.style,\n }}\n onScroll={composeEventHandlers(viewportProps.onScroll, (event) => {\n const viewport = event.currentTarget;\n const { contentWrapper, shouldExpandOnScrollRef } = viewportContext;\n if (shouldExpandOnScrollRef?.current && contentWrapper) {\n const scrolledBy = Math.abs(prevScrollTopRef.current - viewport.scrollTop);\n if (scrolledBy > 0) {\n const availableHeight = window.innerHeight - CONTENT_MARGIN * 2;\n const cssMinHeight = parseFloat(contentWrapper.style.minHeight);\n const cssHeight = parseFloat(contentWrapper.style.height);\n const prevHeight = Math.max(cssMinHeight, cssHeight);\n\n if (prevHeight < availableHeight) {\n const nextHeight = prevHeight + scrolledBy;\n const clampedNextHeight = Math.min(availableHeight, nextHeight);\n const heightDiff = nextHeight - clampedNextHeight;\n\n contentWrapper.style.height = clampedNextHeight + 'px';\n if (contentWrapper.style.bottom === '0px') {\n viewport.scrollTop = heightDiff > 0 ? heightDiff : 0;\n // ensure the content stays pinned to the bottom\n contentWrapper.style.justifyContent = 'flex-end';\n }\n }\n }\n }\n prevScrollTopRef.current = viewport.scrollTop;\n })}\n />\n </Collection.Slot>\n </>\n );\n }\n);\n\nSelectViewport.displayName = VIEWPORT_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectGroup\n * -----------------------------------------------------------------------------------------------*/\n\nconst GROUP_NAME = 'SelectGroup';\n\ntype SelectGroupContextValue = { id: string };\n\nconst [SelectGroupContextProvider, useSelectGroupContext] =\n createSelectContext<SelectGroupContextValue>(GROUP_NAME);\n\ntype SelectGroupElement = React.ElementRef<typeof Primitive.div>;\ninterface SelectGroupProps extends PrimitiveDivProps {}\n\nconst SelectGroup = React.forwardRef<SelectGroupElement, SelectGroupProps>(\n (props: ScopedProps<SelectGroupProps>, forwardedRef) => {\n const { __scopeSelect, ...groupProps } = props;\n const groupId = useId();\n return (\n <SelectGroupContextProvider scope={__scopeSelect} id={groupId}>\n <Primitive.div role=\"group\" aria-labelledby={groupId} {...groupProps} ref={forwardedRef} />\n </SelectGroupContextProvider>\n );\n }\n);\n\nSelectGroup.displayName = GROUP_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectLabel\n * -----------------------------------------------------------------------------------------------*/\n\nconst LABEL_NAME = 'SelectLabel';\n\ntype SelectLabelElement = React.ElementRef<typeof Primitive.div>;\ninterface SelectLabelProps extends PrimitiveDivProps {}\n\nconst SelectLabel = React.forwardRef<SelectLabelElement, SelectLabelProps>(\n (props: ScopedProps<SelectLabelProps>, forwardedRef) => {\n const { __scopeSelect, ...labelProps } = props;\n const groupContext = useSelectGroupContext(LABEL_NAME, __scopeSelect);\n return <Primitive.div id={groupContext.id} {...labelProps} ref={forwardedRef} />;\n }\n);\n\nSelectLabel.displayName = LABEL_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectItem\n * -----------------------------------------------------------------------------------------------*/\n\nconst ITEM_NAME = 'SelectItem';\n\ntype SelectItemContextValue = {\n value: string;\n disabled: boolean;\n textId: string;\n isSelected: boolean;\n onItemTextChange(node: SelectItemTextElement | null): void;\n};\n\nconst [SelectItemContextProvider, useSelectItemContext] =\n createSelectContext<SelectItemContextValue>(ITEM_NAME);\n\ntype SelectItemElement = React.ElementRef<typeof Primitive.div>;\ninterface SelectItemProps extends PrimitiveDivProps {\n value: string;\n disabled?: boolean;\n textValue?: string;\n}\n\nconst SelectItem = React.forwardRef<SelectItemElement, SelectItemProps>(\n (props: ScopedProps<SelectItemProps>, forwardedRef) => {\n const {\n __scopeSelect,\n value,\n disabled = false,\n textValue: textValueProp,\n ...itemProps\n } = props;\n const context = useSelectContext(ITEM_NAME, __scopeSelect);\n const contentContext = useSelectContentContext(ITEM_NAME, __scopeSelect);\n const isSelected = context.value === value;\n const [textValue, setTextValue] = React.useState(textValueProp ?? '');\n const [isFocused, setIsFocused] = React.useState(false);\n const composedRefs = useComposedRefs(forwardedRef, (node) =>\n contentContext.itemRefCallback?.(node, value, disabled)\n );\n const textId = useId();\n\n const handleSelect = () => {\n if (!disabled) {\n context.onValueChange(value);\n context.onOpenChange(false);\n }\n };\n\n if (value === '') {\n throw new Error(\n 'A <Select.Item /> must have a value prop that is not an empty string. This is because the Select value can be set to an empty string to clear the selection and show the placeholder.'\n );\n }\n\n return (\n <SelectItemContextProvider\n scope={__scopeSelect}\n value={value}\n disabled={disabled}\n textId={textId}\n isSelected={isSelected}\n onItemTextChange={React.useCallback((node) => {\n setTextValue((prevTextValue) => prevTextValue || (node?.textContent ?? '').trim());\n }, [])}\n >\n <Collection.ItemSlot\n scope={__scopeSelect}\n value={value}\n disabled={disabled}\n textValue={textValue}\n >\n <Primitive.div\n role=\"option\"\n aria-labelledby={textId}\n data-highlighted={isFocused ? '' : undefined}\n // `isFocused` caveat fixes stuttering in VoiceOver\n aria-selected={isSelected && isFocused}\n data-state={isSelected ? 'checked' : 'unchecked'}\n aria-disabled={disabled || undefined}\n data-disabled={disabled ? '' : undefined}\n tabIndex={disabled ? undefined : -1}\n {...itemProps}\n ref={composedRefs}\n onFocus={composeEventHandlers(itemProps.onFocus, () => setIsFocused(true))}\n onBlur={composeEventHandlers(itemProps.onBlur, () => setIsFocused(false))}\n onPointerUp={composeEventHandlers(itemProps.onPointerUp, handleSelect)}\n onPointerMove={composeEventHandlers(itemProps.onPointerMove, (event) => {\n if (disabled) {\n contentContext.onItemLeave?.();\n } else {\n // even though safari doesn't support this option, it's acceptable\n // as it only means it might scroll a few pixels when using the pointer.\n event.currentTarget.focus({ preventScroll: true });\n }\n })}\n onPointerLeave={composeEventHandlers(itemProps.onPointerLeave, (event) => {\n if (event.currentTarget === document.activeElement) {\n contentContext.onItemLeave?.();\n }\n })}\n onKeyDown={composeEventHandlers(itemProps.onKeyDown, (event) => {\n const isTypingAhead = contentContext.searchRef?.current !== '';\n if (isTypingAhead && event.key === ' ') return;\n if (SELECTION_KEYS.includes(event.key)) handleSelect();\n // prevent page scroll if using the space key to select an item\n if (event.key === ' ') event.preventDefault();\n })}\n />\n </Collection.ItemSlot>\n </SelectItemContextProvider>\n );\n }\n);\n\nSelectItem.displayName = ITEM_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectItemText\n * -----------------------------------------------------------------------------------------------*/\n\nconst ITEM_TEXT_NAME = 'SelectItemText';\n\ntype SelectItemTextElement = React.ElementRef<typeof Primitive.span>;\ninterface SelectItemTextProps extends PrimitiveSpanProps {}\n\nconst SelectItemText = React.forwardRef<SelectItemTextElement, SelectItemTextProps>(\n (props: ScopedProps<SelectItemTextProps>, forwardedRef) => {\n // We ignore `className` and `style` as this part shouldn't be styled.\n const { __scopeSelect, className, style, ...itemTextProps } = props;\n const context = useSelectContext(ITEM_TEXT_NAME, __scopeSelect);\n const contentContext = useSelectContentContext(ITEM_TEXT_NAME, __scopeSelect);\n const itemContext = useSelectItemContext(ITEM_TEXT_NAME, __scopeSelect);\n const nativeOptionsContext = useSelectNativeOptionsContext(ITEM_TEXT_NAME, __scopeSelect);\n const [itemTextNode, setItemTextNode] = React.useState<SelectItemTextElement | null>(null);\n const composedRefs = useComposedRefs(\n forwardedRef,\n (node) => setItemTextNode(node),\n itemContext.onItemTextChange,\n (node) => contentContext.itemTextRefCallback?.(node, itemContext.value, itemContext.disabled)\n );\n\n const textContent = itemTextNode?.textContent;\n const nativeOption = React.useMemo(\n () => (\n <option key={itemContext.value} value={itemContext.value} disabled={itemContext.disabled}>\n {textContent}\n </option>\n ),\n [itemContext.disabled, itemContext.value, textContent]\n );\n\n const { onNativeOptionAdd, onNativeOptionRemove } = nativeOptionsContext;\n useLayoutEffect(() => {\n onNativeOptionAdd(nativeOption);\n return () => onNativeOptionRemove(nativeOption);\n }, [onNativeOptionAdd, onNativeOptionRemove, nativeOption]);\n\n return (\n <>\n <Primitive.span id={itemContext.textId} {...itemTextProps} ref={composedRefs} />\n\n {/* Portal the select item text into the trigger value node */}\n {itemContext.isSelected && context.valueNode && !context.valueNodeHasChildren\n ? ReactDOM.createPortal(itemTextProps.children, context.valueNode)\n : null}\n </>\n );\n }\n);\n\nSelectItemText.displayName = ITEM_TEXT_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectItemIndicator\n * -----------------------------------------------------------------------------------------------*/\n\nconst ITEM_INDICATOR_NAME = 'SelectItemIndicator';\n\ntype SelectItemIndicatorElement = React.ElementRef<typeof Primitive.span>;\ninterface SelectItemIndicatorProps extends PrimitiveSpanProps {}\n\nconst SelectItemIndicator = React.forwardRef<SelectItemIndicatorElement, SelectItemIndicatorProps>(\n (props: ScopedProps<SelectItemIndicatorProps>, forwardedRef) => {\n const { __scopeSelect, ...itemIndicatorProps } = props;\n const itemContext = useSelectItemContext(ITEM_INDICATOR_NAME, __scopeSelect);\n return itemContext.isSelected ? (\n <Primitive.span aria-hidden {...itemIndicatorProps} ref={forwardedRef} />\n ) : null;\n }\n);\n\nSelectItemIndicator.displayName = ITEM_INDICATOR_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectScrollUpButton\n * -----------------------------------------------------------------------------------------------*/\n\nconst SCROLL_UP_BUTTON_NAME = 'SelectScrollUpButton';\n\ntype SelectScrollUpButtonElement = SelectScrollButtonImplElement;\ninterface SelectScrollUpButtonProps extends Omit<SelectScrollButtonImplProps, 'onAutoScroll'> {}\n\nconst SelectScrollUpButton = React.forwardRef<\n SelectScrollUpButtonElement,\n SelectScrollUpButtonProps\n>((props: ScopedProps<SelectScrollUpButtonProps>, forwardedRef) => {\n const contentContext = useSelectContentContext(SCROLL_UP_BUTTON_NAME, props.__scopeSelect);\n const viewportContext = useSelectViewportContext(SCROLL_UP_BUTTON_NAME, props.__scopeSelect);\n const [canScrollUp, setCanScrollUp] = React.useState(false);\n const composedRefs = useComposedRefs(forwardedRef, viewportContext.onScrollButtonChange);\n\n useLayoutEffect(() => {\n if (contentContext.viewport && contentContext.isPositioned) {\n const viewport = contentContext.viewport;\n function handleScroll() {\n const canScrollUp = viewport.scrollTop > 0;\n setCanScrollUp(canScrollUp);\n }\n handleScroll();\n viewport.addEventListener('scroll', handleScroll);\n return () => viewport.removeEventListener('scroll', handleScroll);\n }\n }, [contentContext.viewport, contentContext.isPositioned]);\n\n return canScrollUp ? (\n <SelectScrollButtonImpl\n {...props}\n ref={composedRefs}\n onAutoScroll={() => {\n const { viewport, selectedItem } = contentContext;\n if (viewport && selectedItem) {\n viewport.scrollTop = viewport.scrollTop - selectedItem.offsetHeight;\n }\n }}\n />\n ) : null;\n});\n\nSelectScrollUpButton.displayName = SCROLL_UP_BUTTON_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectScrollDownButton\n * -----------------------------------------------------------------------------------------------*/\n\nconst SCROLL_DOWN_BUTTON_NAME = 'SelectScrollDownButton';\n\ntype SelectScrollDownButtonElement = SelectScrollButtonImplElement;\ninterface SelectScrollDownButtonProps extends Omit<SelectScrollButtonImplProps, 'onAutoScroll'> {}\n\nconst SelectScrollDownButton = React.forwardRef<\n SelectScrollDownButtonElement,\n SelectScrollDownButtonProps\n>((props: ScopedProps<SelectScrollDownButtonProps>, forwardedRef) => {\n const contentContext = useSelectContentContext(SCROLL_DOWN_BUTTON_NAME, props.__scopeSelect);\n const viewportContext = useSelectViewportContext(SCROLL_DOWN_BUTTON_NAME, props.__scopeSelect);\n const [canScrollDown, setCanScrollDown] = React.useState(false);\n const composedRefs = useComposedRefs(forwardedRef, viewportContext.onScrollButtonChange);\n\n useLayoutEffect(() => {\n if (contentContext.viewport && contentContext.isPositioned) {\n const viewport = contentContext.viewport;\n function handleScroll() {\n const maxScroll = viewport.scrollHeight - viewport.clientHeight;\n // we use Math.ceil here because if the UI is zoomed-in\n // `scrollTop` is not always reported as an integer\n const canScrollDown = Math.ceil(viewport.scrollTop) < maxScroll;\n setCanScrollDown(canScrollDown);\n }\n handleScroll();\n viewport.addEventListener('scroll', handleScroll);\n return () => viewport.removeEventListener('scroll', handleScroll);\n }\n }, [contentContext.viewport, contentContext.isPositioned]);\n\n return canScrollDown ? (\n <SelectScrollButtonImpl\n {...props}\n ref={composedRefs}\n onAutoScroll={() => {\n const { viewport, selectedItem } = contentContext;\n if (viewport && selectedItem) {\n viewport.scrollTop = viewport.scrollTop + selectedItem.offsetHeight;\n }\n }}\n />\n ) : null;\n});\n\nSelectScrollDownButton.displayName = SCROLL_DOWN_BUTTON_NAME;\n\ntype SelectScrollButtonImplElement = React.ElementRef<typeof Primitive.div>;\ninterface SelectScrollButtonImplProps extends PrimitiveDivProps {\n onAutoScroll(): void;\n}\n\nconst SelectScrollButtonImpl = React.forwardRef<\n SelectScrollButtonImplElement,\n SelectScrollButtonImplProps\n>((props: ScopedProps<SelectScrollButtonImplProps>, forwardedRef) => {\n const { __scopeSelect, onAutoScroll, ...scrollIndicatorProps } = props;\n const contentContext = useSelectContentContext('SelectScrollButton', __scopeSelect);\n const autoScrollTimerRef = React.useRef<number | null>(null);\n const getItems = useCollection(__scopeSelect);\n\n const clearAutoScrollTimer = React.useCallback(() => {\n if (autoScrollTimerRef.current !== null) {\n window.clearInterval(autoScrollTimerRef.current);\n autoScrollTimerRef.current = null;\n }\n }, []);\n\n React.useEffect(() => {\n return () => clearAutoScrollTimer();\n }, [clearAutoScrollTimer]);\n\n // When the viewport becomes scrollable on either side, the relevant scroll button will mount.\n // Because it is part of the normal flow, it will push down (top button) or shrink (bottom button)\n // the viewport, potentially causing the active item to now be partially out of view.\n // We re-run the `scrollIntoView` logic to make sure it stays within the viewport.\n useLayoutEffect(() => {\n const activeItem = getItems().find((item) => item.ref.current === document.activeElement);\n activeItem?.ref.current?.scrollIntoView({ block: 'nearest' });\n }, [getItems]);\n\n return (\n <Primitive.div\n aria-hidden\n {...scrollIndicatorProps}\n ref={forwardedRef}\n style={{ flexShrink: 0, ...scrollIndicatorProps.style }}\n onPointerDown={composeEventHandlers(scrollIndicatorProps.onPointerDown, () => {\n if (autoScrollTimerRef.current === null) {\n autoScrollTimerRef.current = window.setInterval(onAutoScroll, 50);\n }\n })}\n onPointerMove={composeEventHandlers(scrollIndicatorProps.onPointerMove, () => {\n contentContext.onItemLeave?.();\n if (autoScrollTimerRef.current === null) {\n autoScrollTimerRef.current = window.setInterval(onAutoScroll, 50);\n }\n })}\n onPointerLeave={composeEventHandlers(scrollIndicatorProps.onPointerLeave, () => {\n clearAutoScrollTimer();\n })}\n />\n );\n});\n\n/* -------------------------------------------------------------------------------------------------\n * SelectSeparator\n * -----------------------------------------------------------------------------------------------*/\n\nconst SEPARATOR_NAME = 'SelectSeparator';\n\ntype SelectSeparatorElement = React.ElementRef<typeof Primitive.div>;\ninterface SelectSeparatorProps extends PrimitiveDivProps {}\n\nconst SelectSeparator = React.forwardRef<SelectSeparatorElement, SelectSeparatorProps>(\n (props: ScopedProps<SelectSeparatorProps>, forwardedRef) => {\n const { __scopeSelect, ...separatorProps } = props;\n return <Primitive.div aria-hidden {...separatorProps} ref={forwardedRef} />;\n }\n);\n\nSelectSeparator.displayName = SEPARATOR_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * SelectArrow\n * -----------------------------------------------------------------------------------------------*/\n\nconst ARROW_NAME = 'SelectArrow';\n\ntype SelectArrowElement = React.ElementRef<typeof PopperPrimitive.Arrow>;\ntype PopperArrowProps = Radix.ComponentPropsWithoutRef<typeof PopperPrimitive.Arrow>;\ninterface SelectArrowProps extends PopperArrowProps {}\n\nconst SelectArrow = React.forwardRef<SelectArrowElement, SelectArrowProps>(\n (props: ScopedProps<SelectArrowProps>, forwardedRef) => {\n const { __scopeSelect, ...arrowProps } = props;\n const popperScope = usePopperScope(__scopeSelect);\n const context = useSelectContext(ARROW_NAME, __scopeSelect);\n const contentContext = useSelectContentContext(ARROW_NAME, __scopeSelect);\n return context.open && contentContext.position === 'popper' ? (\n <PopperPrimitive.Arrow {...popperScope} {...arrowProps} ref={forwardedRef} />\n ) : null;\n }\n);\n\nSelectArrow.displayName = ARROW_NAME;\n\n/* -----------------------------------------------------------------------------------------------*/\n\nfunction shouldShowPlaceholder(value?: string) {\n return value === '' || value === undefined;\n}\n\nconst BubbleSelect = React.forwardRef<HTMLSelectElement, React.ComponentPropsWithoutRef<'select'>>(\n (props, forwardedRef) => {\n const { value, ...selectProps } = props;\n const ref = React.useRef<HTMLSelectElement>(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n const prevValue = usePrevious(value);\n\n // Bubble value change to parents (e.g form change event)\n React.useEffect(() => {\n const select = ref.current!;\n const selectProto = window.HTMLSelectElement.prototype;\n const descriptor = Object.getOwnPropertyDescriptor(\n selectProto,\n 'value'\n ) as PropertyDescriptor;\n const setValue = descriptor.set;\n if (prevValue !== value && setValue) {\n const event = new Event('change', { bubbles: true });\n setValue.call(select, value);\n select.dispatchEvent(event);\n }\n }, [prevValue, value]);\n\n /**\n * We purposefully use a `select` here to support form autofill as much\n * as possible.\n *\n * We purposefully do not add the `value` attribute here to allow the value\n * to be set programatically and bubble to any parent form `onChange` event.\n * Adding the `value` will cause React to consider the programatic\n * dispatch a duplicate and it will get swallowed.\n *\n * We use `VisuallyHidden` rather than `display: \"none\"` because Safari autofill\n * won't work otherwise.\n */\n return (\n <VisuallyHidden asChild>\n <select {...selectProps} ref={composedRefs} defaultValue={value} />\n </VisuallyHidden>\n );\n }\n);\n\nBubbleSelect.displayName = 'BubbleSelect';\n\nfunction useTypeaheadSearch(onSearchChange: (search: string) => void) {\n const handleSearchChange = useCallbackRef(onSearchChange);\n const searchRef = React.useRef('');\n const timerRef = React.useRef(0);\n\n const handleTypeaheadSearch = React.useCallback(\n (key: string) => {\n const search = searchRef.current + key;\n handleSearchChange(search);\n\n (function updateSearch(value: string) {\n searchRef.current = value;\n window.clearTimeout(timerRef.current);\n // Reset `searchRef` 1 second after it was last updated\n if (value !== '') timerRef.current = window.setTimeout(() => updateSearch(''), 1000);\n })(search);\n },\n [handleSearchChange]\n );\n\n const resetTypeahead = React.useCallback(() => {\n searchRef.current = '';\n window.clearTimeout(timerRef.current);\n }, []);\n\n React.useEffect(() => {\n return () => window.clearTimeout(timerRef.current);\n }, []);\n\n return [searchRef, handleTypeaheadSearch, resetTypeahead] as const;\n}\n\n/**\n * This is the \"meat\" of the typeahead matching logic. It takes in a list of items,\n * the search and the current item, and returns the next item (or `undefined`).\n *\n * We normalize the search because if a user has repeatedly pressed a character,\n * we want the exact same behavior as if we only had that one character\n * (ie. cycle through items starting with that character)\n *\n * We also reorder the items by wrapping the array around the current item.\n * This is so we always look forward from the current item, and picking the first\n * item will always be the correct one.\n *\n * Finally, if the normalized search is exactly one character, we exclude the\n * current item from the values because otherwise it would be the first to match always\n * and focus would never move. This is as opposed to the regular case, where we\n * don't want focus to move if the current item still matches.\n */\nfunction findNextItem<T extends { textValue: string }>(\n items: T[],\n search: string,\n currentItem?: T\n) {\n const isRepeated = search.length > 1 && Array.from(search).every((char) => char === search[0]);\n const normalizedSearch = isRepeated ? search[0] : search;\n const currentItemIndex = currentItem ? items.indexOf(currentItem) : -1;\n let wrappedItems = wrapArray(items, Math.max(currentItemIndex, 0));\n const excludeCurrentItem = normalizedSearch.length === 1;\n if (excludeCurrentItem) wrappedItems = wrappedItems.filter((v) => v !== currentItem);\n const nextItem = wrappedItems.find((item) =>\n item.textValue.toLowerCase().startsWith(normalizedSearch.toLowerCase())\n );\n return nextItem !== currentItem ? nextItem : undefined;\n}\n\n/**\n * Wraps an array around itself at a given start index\n * Example: `wrapArray(['a', 'b', 'c', 'd'], 2) === ['c', 'd', 'a', 'b']`\n */\nfunction wrapArray<T>(array: T[], startIndex: number) {\n return array.map((_, index) => array[(startIndex + index) % array.length]);\n}\n\nconst Root = Select;\nconst Trigger = SelectTrigger;\nconst Value = SelectValue;\nconst Icon = SelectIcon;\nconst Portal = SelectPortal;\nconst Content = SelectContent;\nconst Viewport = SelectViewport;\nconst Group = SelectGroup;\nconst Label = SelectLabel;\nconst Item = SelectItem;\nconst ItemText = SelectItemText;\nconst ItemIndicator = SelectItemIndicator;\nconst ScrollUpButton = SelectScrollUpButton;\nconst ScrollDownButton = SelectScrollDownButton;\nconst Separator = SelectSeparator;\nconst Arrow = SelectArrow;\n\nexport {\n createSelectScope,\n //\n Select,\n SelectTrigger,\n SelectValue,\n SelectIcon,\n SelectPortal,\n SelectContent,\n SelectViewport,\n SelectGroup,\n SelectLabel,\n SelectItem,\n SelectItemText,\n SelectItemIndicator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n SelectSeparator,\n SelectArrow,\n //\n Root,\n Trigger,\n Value,\n Icon,\n Portal,\n Content,\n Viewport,\n Group,\n Label,\n Item,\n ItemText,\n ItemIndicator,\n ScrollUpButton,\n ScrollDownButton,\n Separator,\n Arrow,\n};\nexport type {\n SelectProps,\n SelectTriggerProps,\n SelectValueProps,\n SelectIconProps,\n SelectPortalProps,\n SelectContentProps,\n SelectViewportProps,\n SelectGroupProps,\n SelectLabelProps,\n SelectItemProps,\n SelectItemTextProps,\n SelectItemIndicatorProps,\n SelectScrollUpButtonProps,\n SelectScrollDownButtonProps,\n SelectSeparatorProps,\n SelectArrowProps,\n};\n","import type * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/src/shared/ui/select';\nimport { CaretSortIcon } from '@radix-ui/react-icons';\nimport { type ClipboardEvent, useCallback } from 'react';\n\nexport function BooleanDataEditor(props: Spreadsheet.DataEditor) {\n const { value, onBlur, onChange, onPaste } = props;\n\n const _onPaste = useCallback(\n (e: ClipboardEvent<HTMLButtonElement>) => {\n e.preventDefault();\n onPaste?.();\n },\n [onPaste],\n );\n\n return (\n <Select value={value as string} onValueChange={(data) => onChange?.({ data })} defaultOpen>\n <SelectTrigger\n onBlur={onBlur}\n onPaste={_onPaste}\n className={cn(\n 'h-full w-full rounded-none border-none pl-1 text-xs outline-none focus:ring-0',\n )}\n autoFocus\n >\n <SelectValue placeholder=\"Selecionar\" />\n </SelectTrigger>\n\n <SelectContent>\n <SelectItem className=\"text-xs\" value=\"true\">\n Sim\n </SelectItem>\n\n <SelectItem className=\"text-xs\" value=\"false\">\n Não\n </SelectItem>\n </SelectContent>\n </Select>\n );\n}\n\nexport function BooleanDataViewer({ value }: Spreadsheet.DataViewer) {\n const empty = value === '';\n const displayValue = empty ? 'Selecionar' : value === 'true' ? 'Sim' : 'Não';\n\n return (\n <div className=\"flex h-full w-full items-center justify-between pr-px pl-1\">\n <p className=\"line-clamp-1 text-xs\">{displayValue}</p>\n <CaretSortIcon className=\"h-4 w-4 opacity-50\" />\n </div>\n );\n}\n","import type * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport { type ClipboardEvent, useCallback } from 'react';\n\nexport function DateDataEditor(props: Spreadsheet.DataEditor) {\n const { value, onBlur, onChange, onPaste } = props;\n\n const _onPaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n onPaste?.();\n },\n [onPaste],\n );\n\n return (\n <input\n type=\"date\"\n onBlur={onBlur}\n onPaste={_onPaste}\n value={value as string}\n onChange={(e) => onChange?.({ data: e.target.value })}\n className={cn('h-full w-full bg-transparent pl-1 text-xs outline-none')}\n autoFocus\n />\n );\n}\n\nexport function DateDataViewer(props: Spreadsheet.DataViewer) {\n const { value } = props;\n const formatter = Intl.DateTimeFormat('pt-BR', { dateStyle: 'short' });\n const formatted = value ? formatter.format(new Date(value as string)) : 'dd/mm/yyyy';\n\n return (\n <div className=\"flex h-full w-full items-center\">\n <p className=\"line-clamp-1 pl-1 text-xs\">{formatted as string}</p>\n </div>\n );\n}\n","import type { Column, DataEditorType } from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport { type ClipboardEvent, type FocusEvent, type MouseEvent, useEffect, useState } from 'react';\nimport { type NumberFormatValues, NumericFormat } from 'react-number-format';\n\nexport type NumericFieldProps = {\n value?: string;\n onChange?: (value?: string) => void;\n onBlur?: () => void;\n onFocus?: (e: FocusEvent<HTMLInputElement>) => void;\n onClick?: (e: MouseEvent<HTMLInputElement>) => void;\n onPaste?: (e: ClipboardEvent<HTMLInputElement>) => void;\n tabIndex?: number;\n\n dataEditorType: DataEditorType;\n settings?: Partial<Column['settings']>;\n disabled?: boolean;\n\n testid?: string;\n className?: string;\n\n dataCypress?: string;\n};\n\nexport function NumericField(props: NumericFieldProps) {\n const {\n className,\n dataEditorType,\n onFocus,\n onBlur,\n onChange,\n onClick,\n onPaste,\n settings,\n testid,\n value,\n disabled,\n dataCypress,\n tabIndex,\n } = props;\n\n const thousandSeparator = '.';\n const decimalSeparator = ',';\n const decimalScale = getDecimalScale({\n dataEditorType,\n decimalScale: settings?.numeric?.decimalPlaces,\n });\n const allowNegative = settings?.numeric?.allowNegative;\n const min = settings?.numeric?.min;\n const max = settings?.numeric?.max;\n\n const prefix = dataEditorType.toLocaleLowerCase() === 'currency' ? 'R$ ' : '';\n const suffix = dataEditorType.toLocaleLowerCase() === 'percentage' ? '%' : '';\n\n const [strValue, setStrValue] = useState<string | undefined>(value);\n\n const [waitCapToOnBlur, setWaitCapToOnBlur] = useState(false);\n\n const onValueChange = ({ value }: NumberFormatValues) => {\n setStrValue(value);\n onChange?.(value);\n };\n\n const _onBlur = () => {\n let waitCapToOnBlur = false;\n\n const numValue = Number(value);\n\n let newStrValue = value;\n\n if (typeof min === 'number') {\n if (numValue < min) newStrValue = min.toString();\n }\n\n if (typeof max === 'number') {\n if (numValue > max) newStrValue = max.toString();\n }\n\n if (newStrValue !== value) {\n waitCapToOnBlur = true;\n\n onChange?.(newStrValue);\n setStrValue(newStrValue);\n setWaitCapToOnBlur(waitCapToOnBlur);\n }\n\n if (!waitCapToOnBlur) onBlur?.();\n };\n\n useEffect(() => {\n if (waitCapToOnBlur) {\n onBlur?.();\n setWaitCapToOnBlur(false);\n }\n }, [onBlur, waitCapToOnBlur]);\n\n useEffect(() => {\n setStrValue(value);\n }, [value]);\n\n return (\n <NumericFormat\n tabIndex={tabIndex}\n value={strValue}\n onPaste={onPaste}\n prefix={prefix}\n suffix={suffix}\n fixedDecimalScale\n onBlur={_onBlur}\n data-testid={testid}\n valueIsNumericString\n onFocus={onFocus}\n onClick={onClick}\n decimalScale={decimalScale}\n onValueChange={onValueChange}\n allowNegative={allowNegative}\n decimalSeparator={decimalSeparator}\n thousandSeparator={thousandSeparator}\n className={cn(\n 'h-full w-full rounded-none bg-transparent pl-1 text-xs outline-none',\n className,\n )}\n disabled={disabled}\n data-cypress={dataCypress}\n autoFocus\n />\n );\n}\n\nexport const percentageRatio = 100;\nexport const percentageScaleToBeDisregarded = 2;\n\nexport function getDecimalScale(params: { dataEditorType: DataEditorType; decimalScale?: number }) {\n const { dataEditorType, decimalScale } = params;\n\n let newDecimalScale = decimalScale;\n\n if (dataEditorType.toLowerCase() === 'percentage') {\n if (decimalScale) {\n newDecimalScale = decimalScale > 2 ? decimalScale - percentageScaleToBeDisregarded : 0;\n } else {\n newDecimalScale = 0;\n }\n }\n\n if (!decimalScale) {\n if (dataEditorType.toLowerCase() === 'decimal') newDecimalScale = 2;\n if (dataEditorType.toLowerCase() === 'float') newDecimalScale = 2;\n if (dataEditorType.toLowerCase() === 'integer') newDecimalScale = 0;\n if (dataEditorType.toLowerCase() === 'currency') newDecimalScale = 2;\n }\n\n return newDecimalScale;\n}\n","import type * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { NumericField } from '@/src/components/tmp/numeric';\nimport { type ClipboardEvent, useCallback } from 'react';\n\nexport function NumericEditor(props: Spreadsheet.DataEditor) {\n const { value, onBlur, onChange, onPaste, setMode, column } = props;\n\n const _onPaste = useCallback(\n (e: ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n onPaste?.();\n },\n [onPaste],\n );\n\n const _onBlur = useCallback(() => {\n onBlur?.();\n setMode?.('view');\n }, [onBlur, setMode]);\n\n return (\n <NumericField\n dataEditorType={column.dataEditorType}\n value={value as string}\n onPaste={_onPaste}\n onBlur={_onBlur}\n onChange={(value) => onChange?.({ data: value })}\n settings={column.settings}\n />\n );\n\n // return (\n // <input\n // type=\"number\"\n // onBlur={_onBlur}\n // onPaste={_onPaste}\n // value={value as string}\n // onChange={(e) => onChange?.({ data: e.target.value })}\n // className={cn('h-full w-full bg-transparent pl-1 text-xs outline-none')}\n // autoFocus\n // />\n // );\n}\n\nexport function NumericDataViewer(props: Spreadsheet.DataViewer) {\n const { value, column } = props;\n\n return (\n <NumericField\n dataEditorType={column.dataEditorType}\n value={value as string}\n settings={column.settings}\n disabled\n className=\"pointer-events-none\"\n />\n // <div className=\"flex h-full w-full items-center\">\n // <p className=\"line-clamp-1 pl-1 text-xs\">{value as string}</p>\n // </div>\n );\n}\n","import type * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@/src/shared/ui/select';\nimport { CaretSortIcon } from '@radix-ui/react-icons';\nimport { type ClipboardEvent, useCallback } from 'react';\n\nexport function SelectDataEditor(\n props: { items: Array<Spreadsheet.SelectItem> } & Spreadsheet.DataEditor,\n) {\n const { value, onBlur, onChange, onPaste, items } = props;\n\n const _onPaste = useCallback(\n (e: ClipboardEvent<HTMLButtonElement>) => {\n e.preventDefault();\n onPaste?.();\n },\n [onPaste],\n );\n\n return (\n <Select value={value as string} onValueChange={(data) => onChange?.({ data })} defaultOpen>\n <SelectTrigger\n onBlur={onBlur}\n onPaste={_onPaste}\n className={cn(\n 'h-full w-full rounded-none border-none pl-1 text-xs outline-none focus:ring-0',\n )}\n >\n <SelectValue placeholder=\"Selecionar\" />\n </SelectTrigger>\n\n <SelectContent>\n {items.map(({ value, text }) => (\n <SelectItem key={value} className=\"text-xs\" value={value}>\n {text}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n );\n}\n\nexport function SelectDataViewer(\n props: { items: Array<Spreadsheet.SelectItem> } & Spreadsheet.DataViewer,\n) {\n const { value, items } = props;\n\n const selected = useMemo(() => items.find((item) => item.value === value), [items, value]);\n const displayValue = useMemo(() => (selected ? selected.text : 'Selecionar'), [selected]);\n\n return (\n <div className=\"flex h-full w-full items-center justify-between pr-px pl-1\">\n <p className=\"line-clamp-1 text-xs\">{displayValue}</p>\n <CaretSortIcon className=\"h-4 w-4 opacity-50\" />\n </div>\n );\n}\n","/** Move the cursor of given input (or textarea) element to it's end */\nexport function moveInputCursorToEnd(element: HTMLInputElement | HTMLTextAreaElement) {\n element.selectionStart = element.selectionEnd = element.value.length;\n}\n","import type { ClipboardEvent } from 'react';\n\nexport const PLAIN_TEXT_MIME = 'text/plain';\n\n/** Read text from given clipboard event */\nexport function readTextFromClipboard<T>(event: ClipboardEvent<T>): string {\n // @ts-ignore\n if (window.clipboardData?.getData) {\n // @ts-ignore\n return window.clipboardData.getData('Text');\n }\n\n if (event.clipboardData?.getData) {\n return event.clipboardData.getData(PLAIN_TEXT_MIME);\n }\n\n return '';\n}\n","import * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport { moveInputCursorToEnd } from '@/src/shared/lib/move-input-cursor-to-end';\nimport { readTextFromClipboard } from '@/src/shared/lib/read-text-from-clipboard';\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/src/shared/ui/tooltip';\nimport {\n type ChangeEvent,\n type ClipboardEvent,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nconst CHAR_WIDTH = 6;\nconst INPUT_MAX_LENGTH = 200;\n\nexport function TextDataEditor(props: Spreadsheet.DataEditor) {\n const { value, onBlur, onChange, onPaste, setMode, column, selected } = props;\n const valueAsString = value as string;\n\n const textareaRef = useRef<null | HTMLTextAreaElement>(null);\n const [textareaHeight, setTextareaHeight] = useState(0);\n\n const overflow = useMemo(\n () => charOverflow(valueAsString, column.width),\n [valueAsString, column.width],\n );\n\n const _onPaste = useCallback(\n <T extends HTMLInputElement | HTMLTextAreaElement>(e: ClipboardEvent<T>) => {\n const clipboard = readTextFromClipboard(e);\n const singleLine = oneLineString(clipboard);\n\n if (!singleLine) {\n e.preventDefault();\n onPaste?.();\n }\n },\n [onPaste],\n );\n\n const _onBlur = useCallback(() => {\n onBlur?.();\n setMode?.('view');\n }, [onBlur, setMode]);\n\n const updateTextareaHeight = useCallback(() => {\n const element = textareaRef.current;\n\n if (!element) return;\n\n const scrollHeight = element.scrollHeight;\n element.style.height = `${scrollHeight}px`;\n setTextareaHeight(scrollHeight);\n }, []);\n\n const _onChange = useCallback(\n <T extends HTMLInputElement | HTMLTextAreaElement>(e: ChangeEvent<T>) => {\n onChange?.({ data: e.target.value });\n updateTextareaHeight();\n },\n [updateTextareaHeight, onChange],\n );\n\n if (overflow) {\n return (\n <div\n style={{ height: textareaHeight }}\n className={cn(\n '-left-0.5 -top-0.5 absolute z-40 h-fit w-fit border bg-white shadow-lg outline outline-2 outline-blue-500',\n selected ? 'bg-blue-50' : 'bg-white',\n )}\n >\n <div\n style={{ height: textareaHeight - 1 }}\n className=\"h-full w-full outline outline-[3px] outline-sky-200 outline-offset-2\"\n >\n <textarea\n ref={textareaRef}\n onBlur={_onBlur}\n onPaste={_onPaste}\n value={valueAsString}\n onChange={_onChange}\n className={cn(\n 'resize-none break-all rounded-none bg-transparent py-1.5 pr-3 pl-1 text-xs outline-none',\n )}\n onFocus={(e) => moveInputCursorToEnd(e.target)}\n maxLength={INPUT_MAX_LENGTH}\n style={{ width: column.width }}\n autoFocus\n />\n </div>\n </div>\n );\n }\n\n return (\n <input\n onBlur={onBlur}\n onPaste={_onPaste}\n value={valueAsString}\n maxLength={INPUT_MAX_LENGTH}\n onChange={_onChange}\n className={cn('h-full w-full bg-transparent pl-1 text-xs outline-none')}\n autoFocus\n />\n );\n}\n\nexport function TextDataViewer(props: Spreadsheet.DataViewer) {\n const { value, column, selected } = props;\n const valueAsString = value as string;\n\n const overflow = useMemo(\n () => charOverflow(valueAsString, column.width),\n [valueAsString, column.width],\n );\n\n if (overflow) {\n return (\n <TooltipProvider delayDuration={0}>\n <Tooltip>\n <TooltipTrigger className=\"w-full\">\n <div className=\"flex h-full w-full items-center overflow-hidden\">\n <p className=\"line-clamp-1 break-all pl-1 text-left text-xs\">{valueAsString}</p>\n </div>\n </TooltipTrigger>\n\n <TooltipContent\n align=\"start\"\n side=\"bottom\"\n alignOffset={-2}\n sideOffset={-Spreadsheet.CELL_INITIAL_HEIGHT}\n className={cn(\n 'h-fit w-full break-all rounded-none border bg-white pl-1 text-black shadow-lg',\n 'data-[state=closed]:transform-none data-[side=bottom]:animate-none data-[state=closed]:animate-none data-[state=closed]:transition-none',\n selected ? 'bg-blue-50' : 'bg-white',\n )}\n style={{ width: column.width }}\n >\n <p>{valueAsString}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return (\n <div className=\"flex h-full w-full items-center overflow-hidden\">\n <p className=\"line-clamp-1 break-all pl-1 text-left text-xs\" title={valueAsString}>\n {valueAsString}\n </p>\n </div>\n );\n}\n\nfunction charOverflow(string: string, width: number) {\n return CHAR_WIDTH * string?.length > width;\n}\n\nfunction oneLineString(value: string) {\n return ['\\t', '\\n', '\\r'].every((regex) => !value.includes(regex));\n}\n","import {\n BooleanDataEditor,\n BooleanDataViewer,\n} from '@/src/components/spreadsheet/ui/data-editor/boolean';\n\nimport { DateDataEditor, DateDataViewer } from '@/src/components/spreadsheet/ui/data-editor/date';\n\nimport {\n NumericDataViewer,\n NumericEditor,\n} from '@/src/components/spreadsheet/ui/data-editor/numeric';\n\nimport {\n SelectDataEditor,\n SelectDataViewer,\n} from '@/src/components/spreadsheet/ui/data-editor/select';\n\nimport { TextDataEditor, TextDataViewer } from '@/src/components/spreadsheet/ui/data-editor/text';\n\nexport const DataEditor = {\n Date: DateDataEditor,\n Text: TextDataEditor,\n Boolean: BooleanDataEditor,\n Numeric: NumericEditor,\n Select: SelectDataEditor,\n};\n\nexport const DataViewer = {\n Date: DateDataViewer,\n Text: TextDataViewer,\n Boolean: BooleanDataViewer,\n Numeric: NumericDataViewer,\n Select: SelectDataViewer,\n};\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { DataEditor, DataViewer } from '@/src/components/spreadsheet/ui/data-editor';\nimport { cn } from '@/src/shared/lib/cn';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { useClickAway } from 'react-use';\n\nexport function Cell(props: Spreadsheet.Cell) {\n const { value, coordinates } = props;\n\n const { columns, isCellSelected, onChange, onPaste, onSelectCell } = useSpreadsheet();\n const { dataEditorType, readonly, width, visible, settings } = columns[coordinates.column];\n\n const [mode, setMode] = useState<Spreadsheet.Mode>(readonly ? 'readonly' : 'view');\n const dataEditorContainerRef = useRef<HTMLDivElement | null>(null);\n\n /** Cell correspondent column */\n const column = useMemo(() => columns[coordinates.column], [columns, coordinates.column]);\n /** Whether the cell is selected */\n const selected = useMemo(() => isCellSelected(coordinates), [coordinates, isCellSelected]);\n /** Select component custom items by prop */\n const selectItems = useMemo(() => settings?.select?.items || [], [settings?.select?.items]);\n\n const common: Record<'dataEditor' | 'dataViewer', Spreadsheet.DataEditor> = useMemo(\n () => ({\n dataEditor: {\n value,\n column,\n setMode,\n selected,\n onPaste: () => onPaste(coordinates),\n onChange: ({ data }) => onChange({ data, point: coordinates }),\n },\n dataViewer: {\n value,\n column,\n selected,\n },\n }),\n [coordinates, value, column, selected, onPaste, onChange],\n );\n\n const dataEditorElementMap: Partial<Record<Spreadsheet.DataEditorType, JSX.Element>> = useMemo(\n () => ({\n Date: <DataEditor.Date {...common.dataEditor} />,\n String: <DataEditor.Text {...common.dataEditor} />,\n Currency: <DataEditor.Numeric {...common.dataEditor} />,\n Decimal: <DataEditor.Numeric {...common.dataEditor} />,\n Float: <DataEditor.Numeric {...common.dataEditor} />,\n Integer: <DataEditor.Numeric {...common.dataEditor} />,\n Percentage: <DataEditor.Numeric {...common.dataEditor} />,\n Boolean: <DataEditor.Boolean {...common.dataEditor} />,\n Select: <DataEditor.Select {...common.dataEditor} items={selectItems} />,\n }),\n [common.dataEditor, selectItems],\n );\n\n const dataViewerElementMap: Partial<Record<Spreadsheet.DataEditorType, JSX.Element>> = useMemo(\n () => ({\n Date: <DataViewer.Date {...common.dataViewer} />,\n String: <DataViewer.Text {...common.dataViewer} />,\n Currency: <DataViewer.Numeric {...common.dataViewer} />,\n Decimal: <DataViewer.Numeric {...common.dataViewer} />,\n Float: <DataViewer.Numeric {...common.dataViewer} />,\n Integer: <DataViewer.Numeric {...common.dataViewer} />,\n Percentage: <DataViewer.Numeric {...common.dataViewer} />,\n Boolean: <DataViewer.Boolean {...common.dataViewer} />,\n Select: <DataViewer.Select {...common.dataViewer} items={selectItems} />,\n }),\n [common.dataViewer, selectItems],\n );\n\n const dataEditorElement = useMemo(\n () => (dataEditorType ? dataEditorElementMap[dataEditorType] : null),\n [dataEditorType, dataEditorElementMap],\n );\n\n const dataViewerElement = useMemo(\n () => (dataEditorType ? dataViewerElementMap[dataEditorType] : null),\n [dataEditorType, dataViewerElementMap],\n );\n\n useEffect(() => {\n const enterEditMode = (e: KeyboardEvent) => {\n const enterKey = e.code === 'Enter';\n\n if (enterKey && selected && mode === 'view') {\n setMode('edit');\n }\n\n if (enterKey && selected && mode === 'edit') {\n setMode('view');\n }\n };\n\n window.addEventListener('keydown', enterEditMode);\n\n return () => window.removeEventListener('keydown', enterEditMode);\n }, [selected, mode]);\n\n useClickAway(dataEditorContainerRef, () => setMode('view'));\n\n if (!visible) return null;\n\n if (mode === 'readonly') {\n return (\n <div\n onClick={() => onSelectCell(coordinates)}\n className={cn(\n 'flex h-7 shrink-0 cursor-default select-none border border-t-transparent border-l-transparent bg-[#F6F6F9]',\n selected && 'bg-[#EAF5FF]',\n )}\n style={{ width, height: Spreadsheet.CELL_INITIAL_HEIGHT }}\n >\n {dataViewerElement}\n </div>\n );\n }\n\n if (mode === 'view') {\n return (\n <div\n onClick={() => onSelectCell(coordinates)}\n onDoubleClick={() => setMode('edit')}\n className={cn(\n 'relative flex h-7 shrink-0 cursor-default select-none border border-t-transparent border-l-transparent',\n selected && 'bg-[#EAF5FF]',\n )}\n style={{ width, height: Spreadsheet.CELL_INITIAL_HEIGHT }}\n >\n {dataViewerElement}\n </div>\n );\n }\n\n return (\n <div\n ref={dataEditorContainerRef}\n data-testid=\"cell__testid\"\n className=\"relative h-7 w-32 shrink-0 border border-l-transparent border-t-transparent bg-[#EAF5FF] shadow-lg outline outline-2 outline-blue-500\"\n style={{\n width,\n height: Spreadsheet.CELL_INITIAL_HEIGHT,\n top: coordinates.row === 0 ? '4px' : '0px',\n }}\n >\n <div className=\"h-full w-full outline outline-[3px] outline-offset-2 outline-sky-200\">\n {dataEditorElement}\n </div>\n </div>\n );\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport * as Matrix from '@/src/components/spreadsheet/model/matrix';\nimport * as Spreadsheet from '@/src/components/spreadsheet/model/spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\nimport { useMemo } from 'react';\n\nexport function RowIndicator({ row }: { row: number }) {\n const { onSelectRow, pointRange, matrix } = useSpreadsheet();\n\n const isRowInRange = useMemo(\n () => pointRange && row >= pointRange.start.row && row <= pointRange.end.row,\n [pointRange, row],\n );\n const isEntireRowSelected = useMemo(\n () => !!(pointRange && Matrix.hasEntireRows({ matrix, pointRange, row })),\n [matrix, pointRange, row],\n );\n\n return (\n <div\n className={cn(\n 'flex h-7 w-12 shrink-0 cursor-default select-none items-center justify-center border-r border-b text-[#8E8EA9] text-xs',\n isRowInRange && 'bg-blue-100 font-bold text-blue-700',\n isEntireRowSelected && 'bg-[#0085FF] font-bold text-white',\n )}\n onClick={(e) => onSelectRow(row, e)}\n style={{\n height: Spreadsheet.CELL_INITIAL_HEIGHT,\n }}\n >\n {row + 1}\n </div>\n );\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { Cell } from '@/src/components/spreadsheet/ui/cell';\nimport { RowIndicator } from '@/src/components/spreadsheet/ui/indicators/row-indicator';\nimport { cn } from '@/src/shared/lib/cn';\nimport { useId } from 'react';\n\nexport function Rows() {\n const id = useId();\n\n const { highlightLastRow, matrix } = useSpreadsheet();\n\n return (\n <div className=\"relative\">\n {matrix.map((rowValue, row) => (\n <div\n // biome-ignore lint/suspicious/noArrayIndexKey: Using ID as key.\n key={`spreadsheet__row__key__${id}__${row}}`}\n className={cn(\n 'flex items-center transition-all ease-linear',\n row === matrix.length - 1 && highlightLastRow && 'bg-blue-50',\n )}\n >\n <RowIndicator row={row} />\n\n {rowValue.map((columnValue, column) => (\n <Cell\n // biome-ignore lint/suspicious/noArrayIndexKey: Using ID as key.\n key={`spreadsheet__cell__key__${id}__${row}__${column}`}\n value={columnValue}\n coordinates={{ column, row }}\n />\n ))}\n </div>\n ))}\n </div>\n );\n}\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { cn } from '@/src/shared/lib/cn';\n\nexport function Start({ className }: { className?: string }) {\n const { staticRows, emptySize, onInsertNewRow } = useSpreadsheet();\n\n if (staticRows) return null;\n\n return (\n <div\n className={cn(\n 'pointer-events-none mt-[calc(28px+36px)] flex h-[calc(100%-28px-28px)] w-full items-center justify-center',\n emptySize && 'pointer-events-auto bg-white/25 backdrop-blur-sm',\n className,\n )}\n >\n {emptySize && (\n <p className=\"text-neutral-500\">\n <span>Clique </span>\n <button type=\"button\" onClick={onInsertNewRow} className=\"font-bold\">\n AQUI\n </button>\n <span> para começar a preencher a tabela.</span>\n </p>\n )}\n </div>\n );\n}\n","import type { SVGProps } from 'react';\n\nexport function AddRowIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n viewBox=\"0 0 20 20\"\n {...props}\n >\n <title>Add Row</title>\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n d=\"M10 6.667v6.666M6.667 10h6.666M6.5 17.5h7c1.4 0 2.1 0 2.635-.273a2.5 2.5 0 001.092-1.092c.273-.535.273-1.235.273-2.635v-7c0-1.4 0-2.1-.273-2.635a2.5 2.5 0 00-1.092-1.093C15.6 2.5 14.9 2.5 13.5 2.5h-7c-1.4 0-2.1 0-2.635.272a2.5 2.5 0 00-1.093 1.093C2.5 4.4 2.5 5.1 2.5 6.5v7c0 1.4 0 2.1.272 2.635a2.5 2.5 0 001.093 1.092C4.4 17.5 5.1 17.5 6.5 17.5z\"\n />\n </svg>\n );\n}\n","import type { SVGProps } from 'react';\n\nexport function RemoveRowIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n viewBox=\"0 0 20 20\"\n {...props}\n >\n <title>Remove Row</title>\n <path\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n d=\"M13.333 5v-.667c0-.933 0-1.4-.181-1.756a1.667 1.667 0 00-.729-.729c-.356-.181-.823-.181-1.756-.181H9.333c-.933 0-1.4 0-1.756.181-.314.16-.569.415-.729.729-.181.356-.181.823-.181 1.756V5m1.666 4.583v4.167m3.334-4.167v4.167M2.5 5h15m-1.667 0v9.333c0 1.4 0 2.1-.272 2.635a2.5 2.5 0 01-1.093 1.093c-.534.272-1.235.272-2.635.272H8.167c-1.4 0-2.1 0-2.635-.272a2.5 2.5 0 01-1.093-1.093c-.272-.535-.272-1.235-.272-2.635V5\"\n />\n </svg>\n );\n}\n","import { cn } from '@/src/shared/lib/cn';\nimport { Slot } from '@radix-ui/react-slot';\nimport { type VariantProps, cva } from 'class-variance-authority';\nimport * as React from 'react';\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90',\n destructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',\n outline:\n 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground',\n secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2',\n sm: 'h-8 rounded-md px-3 text-xs',\n lg: 'h-10 rounded-md px-8',\n icon: 'h-9 w-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n return (\n <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />\n );\n },\n);\n\nButton.displayName = 'Button';\n\nexport { Button, buttonVariants };\n","import * as React from 'react';\nimport { composeEventHandlers } from '@radix-ui/primitive';\nimport { composeRefs } from '@radix-ui/react-compose-refs';\nimport { createContextScope } from '@radix-ui/react-context';\nimport { useControllableState } from '@radix-ui/react-use-controllable-state';\nimport { Primitive } from '@radix-ui/react-primitive';\nimport * as MenuPrimitive from '@radix-ui/react-menu';\nimport { createMenuScope } from '@radix-ui/react-menu';\nimport { useId } from '@radix-ui/react-id';\n\nimport type * as Radix from '@radix-ui/react-primitive';\nimport type { Scope } from '@radix-ui/react-context';\n\ntype Direction = 'ltr' | 'rtl';\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenu\n * -----------------------------------------------------------------------------------------------*/\n\nconst DROPDOWN_MENU_NAME = 'DropdownMenu';\n\ntype ScopedProps<P> = P & { __scopeDropdownMenu?: Scope };\nconst [createDropdownMenuContext, createDropdownMenuScope] = createContextScope(\n DROPDOWN_MENU_NAME,\n [createMenuScope]\n);\nconst useMenuScope = createMenuScope();\n\ntype DropdownMenuContextValue = {\n triggerId: string;\n triggerRef: React.RefObject<HTMLButtonElement>;\n contentId: string;\n open: boolean;\n onOpenChange(open: boolean): void;\n onOpenToggle(): void;\n modal: boolean;\n};\n\nconst [DropdownMenuProvider, useDropdownMenuContext] =\n createDropdownMenuContext<DropdownMenuContextValue>(DROPDOWN_MENU_NAME);\n\ninterface DropdownMenuProps {\n children?: React.ReactNode;\n dir?: Direction;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?(open: boolean): void;\n modal?: boolean;\n}\n\nconst DropdownMenu: React.FC<DropdownMenuProps> = (props: ScopedProps<DropdownMenuProps>) => {\n const {\n __scopeDropdownMenu,\n children,\n dir,\n open: openProp,\n defaultOpen,\n onOpenChange,\n modal = true,\n } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n return (\n <DropdownMenuProvider\n scope={__scopeDropdownMenu}\n triggerId={useId()}\n triggerRef={triggerRef}\n contentId={useId()}\n open={open}\n onOpenChange={setOpen}\n onOpenToggle={React.useCallback(() => setOpen((prevOpen) => !prevOpen), [setOpen])}\n modal={modal}\n >\n <MenuPrimitive.Root {...menuScope} open={open} onOpenChange={setOpen} dir={dir} modal={modal}>\n {children}\n </MenuPrimitive.Root>\n </DropdownMenuProvider>\n );\n};\n\nDropdownMenu.displayName = DROPDOWN_MENU_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuTrigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst TRIGGER_NAME = 'DropdownMenuTrigger';\n\ntype DropdownMenuTriggerElement = React.ElementRef<typeof Primitive.button>;\ntype PrimitiveButtonProps = Radix.ComponentPropsWithoutRef<typeof Primitive.button>;\ninterface DropdownMenuTriggerProps extends PrimitiveButtonProps {}\n\nconst DropdownMenuTrigger = React.forwardRef<DropdownMenuTriggerElement, DropdownMenuTriggerProps>(\n (props: ScopedProps<DropdownMenuTriggerProps>, forwardedRef) => {\n const { __scopeDropdownMenu, disabled = false, ...triggerProps } = props;\n const context = useDropdownMenuContext(TRIGGER_NAME, __scopeDropdownMenu);\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return (\n <MenuPrimitive.Anchor asChild {...menuScope}>\n <Primitive.button\n type=\"button\"\n id={context.triggerId}\n aria-haspopup=\"menu\"\n aria-expanded={context.open}\n aria-controls={context.open ? context.contentId : undefined}\n data-state={context.open ? 'open' : 'closed'}\n data-disabled={disabled ? '' : undefined}\n disabled={disabled}\n {...triggerProps}\n ref={composeRefs(forwardedRef, context.triggerRef)}\n onPointerDown={composeEventHandlers(props.onPointerDown, (event) => {\n // only call handler if it's the left button (mousedown gets triggered by all mouse buttons)\n // but not when the control key is pressed (avoiding MacOS right click)\n if (!disabled && event.button === 0 && event.ctrlKey === false) {\n context.onOpenToggle();\n // prevent trigger focusing when opening\n // this allows the content to be given focus without competition\n if (!context.open) event.preventDefault();\n }\n })}\n onKeyDown={composeEventHandlers(props.onKeyDown, (event) => {\n if (disabled) return;\n if (['Enter', ' '].includes(event.key)) context.onOpenToggle();\n if (event.key === 'ArrowDown') context.onOpenChange(true);\n // prevent keydown from scrolling window / first focused item to execute\n // that keydown (inadvertently closing the menu)\n if (['Enter', ' ', 'ArrowDown'].includes(event.key)) event.preventDefault();\n })}\n />\n </MenuPrimitive.Anchor>\n );\n }\n);\n\nDropdownMenuTrigger.displayName = TRIGGER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuPortal\n * -----------------------------------------------------------------------------------------------*/\n\nconst PORTAL_NAME = 'DropdownMenuPortal';\n\ntype MenuPortalProps = React.ComponentPropsWithoutRef<typeof MenuPrimitive.Portal>;\ninterface DropdownMenuPortalProps extends MenuPortalProps {}\n\nconst DropdownMenuPortal: React.FC<DropdownMenuPortalProps> = (\n props: ScopedProps<DropdownMenuPortalProps>\n) => {\n const { __scopeDropdownMenu, ...portalProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.Portal {...menuScope} {...portalProps} />;\n};\n\nDropdownMenuPortal.displayName = PORTAL_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuContent\n * -----------------------------------------------------------------------------------------------*/\n\nconst CONTENT_NAME = 'DropdownMenuContent';\n\ntype DropdownMenuContentElement = React.ElementRef<typeof MenuPrimitive.Content>;\ntype MenuContentProps = Radix.ComponentPropsWithoutRef<typeof MenuPrimitive.Content>;\ninterface DropdownMenuContentProps extends Omit<MenuContentProps, 'onEntryFocus'> {}\n\nconst DropdownMenuContent = React.forwardRef<DropdownMenuContentElement, DropdownMenuContentProps>(\n (props: ScopedProps<DropdownMenuContentProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...contentProps } = props;\n const context = useDropdownMenuContext(CONTENT_NAME, __scopeDropdownMenu);\n const menuScope = useMenuScope(__scopeDropdownMenu);\n const hasInteractedOutsideRef = React.useRef(false);\n\n return (\n <MenuPrimitive.Content\n id={context.contentId}\n aria-labelledby={context.triggerId}\n {...menuScope}\n {...contentProps}\n ref={forwardedRef}\n onCloseAutoFocus={composeEventHandlers(props.onCloseAutoFocus, (event) => {\n if (!hasInteractedOutsideRef.current) context.triggerRef.current?.focus();\n hasInteractedOutsideRef.current = false;\n // Always prevent auto focus because we either focus manually or want user agent focus\n event.preventDefault();\n })}\n onInteractOutside={composeEventHandlers(props.onInteractOutside, (event) => {\n const originalEvent = event.detail.originalEvent as PointerEvent;\n const ctrlLeftClick = originalEvent.button === 0 && originalEvent.ctrlKey === true;\n const isRightClick = originalEvent.button === 2 || ctrlLeftClick;\n if (!context.modal || isRightClick) hasInteractedOutsideRef.current = true;\n })}\n style={{\n ...props.style,\n // re-namespace exposed content custom properties\n ...{\n '--radix-dropdown-menu-content-transform-origin':\n 'var(--radix-popper-transform-origin)',\n '--radix-dropdown-menu-content-available-width': 'var(--radix-popper-available-width)',\n '--radix-dropdown-menu-content-available-height':\n 'var(--radix-popper-available-height)',\n '--radix-dropdown-menu-trigger-width': 'var(--radix-popper-anchor-width)',\n '--radix-dropdown-menu-trigger-height': 'var(--radix-popper-anchor-height)',\n },\n }}\n />\n );\n }\n);\n\nDropdownMenuContent.displayName = CONTENT_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuGroup\n * -----------------------------------------------------------------------------------------------*/\n\nconst GROUP_NAME = 'DropdownMenuGroup';\n\ntype DropdownMenuGroupElement = React.ElementRef<typeof MenuPrimitive.Group>;\ntype MenuGroupProps = Radix.ComponentPropsWithoutRef<typeof MenuPrimitive.Group>;\ninterface DropdownMenuGroupProps extends MenuGroupProps {}\n\nconst DropdownMenuGroup = React.forwardRef<DropdownMenuGroupElement, DropdownMenuGroupProps>(\n (props: ScopedProps<DropdownMenuGroupProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...groupProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.Group {...menuScope} {...groupProps} ref={forwardedRef} />;\n }\n);\n\nDropdownMenuGroup.displayName = GROUP_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuLabel\n * -----------------------------------------------------------------------------------------------*/\n\nconst LABEL_NAME = 'DropdownMenuLabel';\n\ntype DropdownMenuLabelElement = React.ElementRef<typeof MenuPrimitive.Label>;\ntype MenuLabelProps = Radix.ComponentPropsWithoutRef<typeof MenuPrimitive.Label>;\ninterface DropdownMenuLabelProps extends MenuLabelProps {}\n\nconst DropdownMenuLabel = React.forwardRef<DropdownMenuLabelElement, DropdownMenuLabelProps>(\n (props: ScopedProps<DropdownMenuLabelProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...labelProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.Label {...menuScope} {...labelProps} ref={forwardedRef} />;\n }\n);\n\nDropdownMenuLabel.displayName = LABEL_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuItem\n * -----------------------------------------------------------------------------------------------*/\n\nconst ITEM_NAME = 'DropdownMenuItem';\n\ntype DropdownMenuItemElement = React.ElementRef<typeof MenuPrimitive.Item>;\ntype MenuItemProps = Radix.ComponentPropsWithoutRef<typeof MenuPrimitive.Item>;\ninterface DropdownMenuItemProps extends MenuItemProps {}\n\nconst DropdownMenuItem = React.forwardRef<DropdownMenuItemElement, DropdownMenuItemProps>(\n (props: ScopedProps<DropdownMenuItemProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...itemProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.Item {...menuScope} {...itemProps} ref={forwardedRef} />;\n }\n);\n\nDropdownMenuItem.displayName = ITEM_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuCheckboxItem\n * -----------------------------------------------------------------------------------------------*/\n\nconst CHECKBOX_ITEM_NAME = 'DropdownMenuCheckboxItem';\n\ntype DropdownMenuCheckboxItemElement = React.ElementRef<typeof MenuPrimitive.CheckboxItem>;\ntype MenuCheckboxItemProps = Radix.ComponentPropsWithoutRef<typeof MenuPrimitive.CheckboxItem>;\ninterface DropdownMenuCheckboxItemProps extends MenuCheckboxItemProps {}\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n DropdownMenuCheckboxItemElement,\n DropdownMenuCheckboxItemProps\n>((props: ScopedProps<DropdownMenuCheckboxItemProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...checkboxItemProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.CheckboxItem {...menuScope} {...checkboxItemProps} ref={forwardedRef} />;\n});\n\nDropdownMenuCheckboxItem.displayName = CHECKBOX_ITEM_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuRadioGroup\n * -----------------------------------------------------------------------------------------------*/\n\nconst RADIO_GROUP_NAME = 'DropdownMenuRadioGroup';\n\ntype DropdownMenuRadioGroupElement = React.ElementRef<typeof MenuPrimitive.RadioGroup>;\ntype MenuRadioGroupProps = Radix.ComponentPropsWithoutRef<typeof MenuPrimitive.RadioGroup>;\ninterface DropdownMenuRadioGroupProps extends MenuRadioGroupProps {}\n\nconst DropdownMenuRadioGroup = React.forwardRef<\n DropdownMenuRadioGroupElement,\n DropdownMenuRadioGroupProps\n>((props: ScopedProps<DropdownMenuRadioGroupProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...radioGroupProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.RadioGroup {...menuScope} {...radioGroupProps} ref={forwardedRef} />;\n});\n\nDropdownMenuRadioGroup.displayName = RADIO_GROUP_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuRadioItem\n * -----------------------------------------------------------------------------------------------*/\n\nconst RADIO_ITEM_NAME = 'DropdownMenuRadioItem';\n\ntype DropdownMenuRadioItemElement = React.ElementRef<typeof MenuPrimitive.RadioItem>;\ntype MenuRadioItemProps = Radix.ComponentPropsWithoutRef<typeof MenuPrimitive.RadioItem>;\ninterface DropdownMenuRadioItemProps extends MenuRadioItemProps {}\n\nconst DropdownMenuRadioItem = React.forwardRef<\n DropdownMenuRadioItemElement,\n DropdownMenuRadioItemProps\n>((props: ScopedProps<DropdownMenuRadioItemProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...radioItemProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.RadioItem {...menuScope} {...radioItemProps} ref={forwardedRef} />;\n});\n\nDropdownMenuRadioItem.displayName = RADIO_ITEM_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuItemIndicator\n * -----------------------------------------------------------------------------------------------*/\n\nconst INDICATOR_NAME = 'DropdownMenuItemIndicator';\n\ntype DropdownMenuItemIndicatorElement = React.ElementRef<typeof MenuPrimitive.ItemIndicator>;\ntype MenuItemIndicatorProps = Radix.ComponentPropsWithoutRef<typeof MenuPrimitive.ItemIndicator>;\ninterface DropdownMenuItemIndicatorProps extends MenuItemIndicatorProps {}\n\nconst DropdownMenuItemIndicator = React.forwardRef<\n DropdownMenuItemIndicatorElement,\n DropdownMenuItemIndicatorProps\n>((props: ScopedProps<DropdownMenuItemIndicatorProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...itemIndicatorProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.ItemIndicator {...menuScope} {...itemIndicatorProps} ref={forwardedRef} />;\n});\n\nDropdownMenuItemIndicator.displayName = INDICATOR_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuSeparator\n * -----------------------------------------------------------------------------------------------*/\n\nconst SEPARATOR_NAME = 'DropdownMenuSeparator';\n\ntype DropdownMenuSeparatorElement = React.ElementRef<typeof MenuPrimitive.Separator>;\ntype MenuSeparatorProps = Radix.ComponentPropsWithoutRef<typeof MenuPrimitive.Separator>;\ninterface DropdownMenuSeparatorProps extends MenuSeparatorProps {}\n\nconst DropdownMenuSeparator = React.forwardRef<\n DropdownMenuSeparatorElement,\n DropdownMenuSeparatorProps\n>((props: ScopedProps<DropdownMenuSeparatorProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...separatorProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.Separator {...menuScope} {...separatorProps} ref={forwardedRef} />;\n});\n\nDropdownMenuSeparator.displayName = SEPARATOR_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuArrow\n * -----------------------------------------------------------------------------------------------*/\n\nconst ARROW_NAME = 'DropdownMenuArrow';\n\ntype DropdownMenuArrowElement = React.ElementRef<typeof MenuPrimitive.Arrow>;\ntype MenuArrowProps = Radix.ComponentPropsWithoutRef<typeof MenuPrimitive.Arrow>;\ninterface DropdownMenuArrowProps extends MenuArrowProps {}\n\nconst DropdownMenuArrow = React.forwardRef<DropdownMenuArrowElement, DropdownMenuArrowProps>(\n (props: ScopedProps<DropdownMenuArrowProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...arrowProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.Arrow {...menuScope} {...arrowProps} ref={forwardedRef} />;\n }\n);\n\nDropdownMenuArrow.displayName = ARROW_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuSub\n * -----------------------------------------------------------------------------------------------*/\n\ninterface DropdownMenuSubProps {\n children?: React.ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?(open: boolean): void;\n}\n\nconst DropdownMenuSub: React.FC<DropdownMenuSubProps> = (\n props: ScopedProps<DropdownMenuSubProps>\n) => {\n const { __scopeDropdownMenu, children, open: openProp, onOpenChange, defaultOpen } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n const [open = false, setOpen] = useControllableState({\n prop: openProp,\n defaultProp: defaultOpen,\n onChange: onOpenChange,\n });\n\n return (\n <MenuPrimitive.Sub {...menuScope} open={open} onOpenChange={setOpen}>\n {children}\n </MenuPrimitive.Sub>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuSubTrigger\n * -----------------------------------------------------------------------------------------------*/\n\nconst SUB_TRIGGER_NAME = 'DropdownMenuSubTrigger';\n\ntype DropdownMenuSubTriggerElement = React.ElementRef<typeof MenuPrimitive.SubTrigger>;\ntype MenuSubTriggerProps = Radix.ComponentPropsWithoutRef<typeof MenuPrimitive.SubTrigger>;\ninterface DropdownMenuSubTriggerProps extends MenuSubTriggerProps {}\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n DropdownMenuSubTriggerElement,\n DropdownMenuSubTriggerProps\n>((props: ScopedProps<DropdownMenuSubTriggerProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...subTriggerProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n return <MenuPrimitive.SubTrigger {...menuScope} {...subTriggerProps} ref={forwardedRef} />;\n});\n\nDropdownMenuSubTrigger.displayName = SUB_TRIGGER_NAME;\n\n/* -------------------------------------------------------------------------------------------------\n * DropdownMenuSubContent\n * -----------------------------------------------------------------------------------------------*/\n\nconst SUB_CONTENT_NAME = 'DropdownMenuSubContent';\n\ntype DropdownMenuSubContentElement = React.ElementRef<typeof MenuPrimitive.Content>;\ntype MenuSubContentProps = Radix.ComponentPropsWithoutRef<typeof MenuPrimitive.SubContent>;\ninterface DropdownMenuSubContentProps extends MenuSubContentProps {}\n\nconst DropdownMenuSubContent = React.forwardRef<\n DropdownMenuSubContentElement,\n DropdownMenuSubContentProps\n>((props: ScopedProps<DropdownMenuSubContentProps>, forwardedRef) => {\n const { __scopeDropdownMenu, ...subContentProps } = props;\n const menuScope = useMenuScope(__scopeDropdownMenu);\n\n return (\n <MenuPrimitive.SubContent\n {...menuScope}\n {...subContentProps}\n ref={forwardedRef}\n style={{\n ...props.style,\n // re-namespace exposed content custom properties\n ...{\n '--radix-dropdown-menu-content-transform-origin': 'var(--radix-popper-transform-origin)',\n '--radix-dropdown-menu-content-available-width': 'var(--radix-popper-available-width)',\n '--radix-dropdown-menu-content-available-height': 'var(--radix-popper-available-height)',\n '--radix-dropdown-menu-trigger-width': 'var(--radix-popper-anchor-width)',\n '--radix-dropdown-menu-trigger-height': 'var(--radix-popper-anchor-height)',\n },\n }}\n />\n );\n});\n\nDropdownMenuSubContent.displayName = SUB_CONTENT_NAME;\n\n/* -----------------------------------------------------------------------------------------------*/\n\nconst Root = DropdownMenu;\nconst Trigger = DropdownMenuTrigger;\nconst Portal = DropdownMenuPortal;\nconst Content = DropdownMenuContent;\nconst Group = DropdownMenuGroup;\nconst Label = DropdownMenuLabel;\nconst Item = DropdownMenuItem;\nconst CheckboxItem = DropdownMenuCheckboxItem;\nconst RadioGroup = DropdownMenuRadioGroup;\nconst RadioItem = DropdownMenuRadioItem;\nconst ItemIndicator = DropdownMenuItemIndicator;\nconst Separator = DropdownMenuSeparator;\nconst Arrow = DropdownMenuArrow;\nconst Sub = DropdownMenuSub;\nconst SubTrigger = DropdownMenuSubTrigger;\nconst SubContent = DropdownMenuSubContent;\n\nexport {\n createDropdownMenuScope,\n //\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuPortal,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuItemIndicator,\n DropdownMenuSeparator,\n DropdownMenuArrow,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n //\n Root,\n Trigger,\n Portal,\n Content,\n Group,\n Label,\n Item,\n CheckboxItem,\n RadioGroup,\n RadioItem,\n ItemIndicator,\n Separator,\n Arrow,\n Sub,\n SubTrigger,\n SubContent,\n};\nexport type {\n DropdownMenuProps,\n DropdownMenuTriggerProps,\n DropdownMenuPortalProps,\n DropdownMenuContentProps,\n DropdownMenuGroupProps,\n DropdownMenuLabelProps,\n DropdownMenuItemProps,\n DropdownMenuCheckboxItemProps,\n DropdownMenuRadioGroupProps,\n DropdownMenuRadioItemProps,\n DropdownMenuItemIndicatorProps,\n DropdownMenuSeparatorProps,\n DropdownMenuArrowProps,\n DropdownMenuSubProps,\n DropdownMenuSubTriggerProps,\n DropdownMenuSubContentProps,\n};\n","'use client';\nimport { cn } from '@/src/shared/lib/cn';\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';\nimport { CheckIcon, ChevronRightIcon, DotFilledIcon } from '@radix-ui/react-icons';\nimport * as React from 'react';\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[state=open]:bg-accent focus:bg-accent',\n inset && 'pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRightIcon className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=closed]:animate-out data-[state=open]:animate-in',\n className,\n )}\n {...props}\n />\n));\nDropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=open]:animate-in',\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n));\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none focus:bg-accent focus:text-accent-foreground data-[disabled]:opacity-50',\n inset && 'pl-8',\n className,\n )}\n {...props}\n />\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none transition-colors data-[disabled]:pointer-events-none focus:bg-accent focus:text-accent-foreground data-[disabled]:opacity-50',\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <CheckIcon className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName;\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pr-2 pl-8 text-sm outline-none transition-colors data-[disabled]:pointer-events-none focus:bg-accent focus:text-accent-foreground data-[disabled]:opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <DotFilledIcon className=\"h-4 w-4 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn('px-2 py-1.5 font-semibold text-sm', inset && 'pl-8', className)}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nconst DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span className={cn('ml-auto text-xs tracking-widest opacity-60', className)} {...props} />\n );\n};\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut';\n\nexport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n};\n","import { useSpreadsheet } from '@/src/components/spreadsheet/lib/use-spreadsheet';\nimport { AddRowIcon } from '@/src/components/spreadsheet/ui/icons/add-row-icon';\nimport { RemoveRowIcon } from '@/src/components/spreadsheet/ui/icons/remove-row-icon';\nimport { Button } from '@/src/shared/ui/button';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from '@/src/shared/ui/dropdown-menu';\nimport { ChevronDown } from 'lucide-react';\nimport { nanoid } from 'nanoid';\nimport { useMemo } from 'react';\n\nexport function Toolbar() {\n const {\n hasSomeEntireRow,\n emptySize,\n staticRows,\n columns,\n onInsertNewRow,\n onRemoveRow,\n onColumnVisibilityChange,\n } = useSpreadsheet();\n\n const visibleColumns = useMemo(() => columns.filter(({ visible }) => visible), [columns]);\n const allVisible = useMemo(\n () => columns.length === visibleColumns.length,\n [columns.length, visibleColumns.length],\n );\n\n const allVisibleLabel = 'Exibindo todas as colunas';\n const visibleColumnsLabel = `Exibindo ${visibleColumns.length} de ${columns.length} colunas`;\n const columnVisibilityLabel = allVisible ? allVisibleLabel : visibleColumnsLabel;\n\n return (\n <div className=\"sticky top-0 z-50 flex w-full items-center justify-between rounded-t-md border bg-[#EAF5FF] px-4 py-2.5\">\n <div className=\"flex items-center gap-6\">\n <Button\n disabled={staticRows}\n size=\"icon\"\n variant=\"ghost\"\n onClick={onInsertNewRow}\n className=\"text-[#4A4A6A] transition-none active:bg-[#0085FF] hover:bg-[#8FD6FF] active:text-white\"\n >\n <AddRowIcon />\n </Button>\n\n <Button\n disabled={staticRows || emptySize || !hasSomeEntireRow}\n size=\"icon\"\n variant=\"ghost\"\n onClick={onRemoveRow}\n className=\"text-[#4A4A6A] transition-none active:bg-[#0085FF] hover:bg-[#8FD6FF] active:text-white\"\n >\n <RemoveRowIcon />\n </Button>\n </div>\n\n <DropdownMenu>\n <DropdownMenuTrigger asChild className=\"w-56\">\n <Button variant=\"outline\" className=\"justify-between px-2\">\n <span className=\"text-xs\">{columnVisibilityLabel}</span>\n <ChevronDown className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n\n <DropdownMenuContent className=\"w-56\">\n {columns.map(({ name, id, alphabetLetter, visible }) => (\n <DropdownMenuCheckboxItem\n key={`spreadsheet__column__dropdown_checkbox__key__${nanoid()}`}\n checked={visible}\n onCheckedChange={() => onColumnVisibilityChange(id)}\n className=\"justify-between text-xs\"\n >\n <span>{name}</span>\n <span className=\"text-[10px] text-neutral-500\">{alphabetLetter}</span>\n </DropdownMenuCheckboxItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n","import type { Props } from '@/src/components/spreadsheet/model/spreadsheet';\nimport { Container } from '@/src/components/spreadsheet/ui/containers/index';\nimport { SpreadsheetContextProvider } from '@/src/components/spreadsheet/ui/context';\nimport { Header } from '@/src/components/spreadsheet/ui/header';\nimport { Rows } from '@/src/components/spreadsheet/ui/rows';\nimport { Start } from '@/src/components/spreadsheet/ui/start';\nimport { Toolbar } from '@/src/components/spreadsheet/ui/toolbar';\n\nexport function Spreadsheet(props: Props) {\n const { className, ...rest } = props;\n\n return (\n <SpreadsheetContextProvider {...rest}>\n <Container.Root className={className}>\n <Toolbar />\n\n <Container.Matrix>\n <Start className=\"absolute z-50\" />\n <Header />\n <Rows />\n </Container.Matrix>\n </Container.Root>\n </SpreadsheetContextProvider>\n );\n}\n","import { Spreadsheet } from '@/src/components/spreadsheet/ui';\nimport '@/src/shared/styles/globals.css';\n\nexport const CapLink = {\n Spreadsheet,\n};\n"]}