sheetgl 0.0.0-stage → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +166 -2
- package/bin/cli.mjs +345 -0
- package/dist/lib/sheetgl.cjs +5 -0
- package/dist/lib/sheetgl.cjs.map +1 -0
- package/dist/lib/sheetgl.js +10316 -0
- package/dist/lib/sheetgl.js.map +1 -0
- package/dist/lib/types/columns/ColumnTypeRegistry.d.ts +9 -0
- package/dist/lib/types/columns/ColumnTypeRegistry.d.ts.map +1 -0
- package/dist/lib/types/columns/IColumnTypePlugin.d.ts +68 -0
- package/dist/lib/types/columns/IColumnTypePlugin.d.ts.map +1 -0
- package/dist/lib/types/columns/initPlugins.d.ts +2 -0
- package/dist/lib/types/columns/initPlugins.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ActionColumn/ActionPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/ActionColumn/ActionPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ActionColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/ActionColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/BooleanColumn/BooleanPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/BooleanColumn/BooleanPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/BooleanColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/BooleanColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ColorColumn/ColorEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/ColorColumn/ColorEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ColorColumn/index.d.ts +4 -0
- package/dist/lib/types/columns/types/ColorColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/CurrencyColumn/CurrencyPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/CurrencyColumn/CurrencyPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/CurrencyColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/CurrencyColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/DateColumn/DateEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/DateColumn/DateEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/DateColumn/DatePainter.d.ts +3 -0
- package/dist/lib/types/columns/types/DateColumn/DatePainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/DateColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/DateColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/DateTimeColumn/DateTimeEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/DateTimeColumn/DateTimeEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/DateTimeColumn/DateTimePainter.d.ts +7 -0
- package/dist/lib/types/columns/types/DateTimeColumn/DateTimePainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/DateTimeColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/DateTimeColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/DropdownColumn/DropdownPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/DropdownColumn/DropdownPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/DropdownColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/DropdownColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/EmailColumn/index.d.ts +4 -0
- package/dist/lib/types/columns/types/EmailColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/LookupColumn/LookupEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/LookupColumn/LookupEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/LookupColumn/LookupPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/LookupColumn/LookupPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/LookupColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/LookupColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/MultiSelectColumn/MultiSelectEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/MultiSelectColumn/MultiSelectEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/MultiSelectColumn/MultiSelectPainter.d.ts +4 -0
- package/dist/lib/types/columns/types/MultiSelectColumn/MultiSelectPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/MultiSelectColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/MultiSelectColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/NumberColumn/NumberEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/NumberColumn/NumberEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/NumberColumn/NumberPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/NumberColumn/NumberPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/NumberColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/NumberColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ObjectColumn/ObjectEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/ObjectColumn/ObjectEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ObjectColumn/ObjectPainter.d.ts +5 -0
- package/dist/lib/types/columns/types/ObjectColumn/ObjectPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ObjectColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/ObjectColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/PercentColumn/index.d.ts +5 -0
- package/dist/lib/types/columns/types/PercentColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/PhoneColumn/index.d.ts +4 -0
- package/dist/lib/types/columns/types/PhoneColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ProgressColumn/ProgressPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/ProgressColumn/ProgressPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/ProgressColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/ProgressColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/RatingColumn/RatingPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/RatingColumn/RatingPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/RatingColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/RatingColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/SelectColumn/SelectEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/SelectColumn/SelectEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/SelectColumn/SelectPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/SelectColumn/SelectPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/SelectColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/SelectColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/SparklineColumn/SparklinePainter.d.ts +3 -0
- package/dist/lib/types/columns/types/SparklineColumn/SparklinePainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/SparklineColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/SparklineColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/TextColumn/TextEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/TextColumn/TextEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/TextColumn/TextPainter.d.ts +3 -0
- package/dist/lib/types/columns/types/TextColumn/TextPainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/TextColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/TextColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/TimeColumn/TimeEditor.d.ts +4 -0
- package/dist/lib/types/columns/types/TimeColumn/TimeEditor.d.ts.map +1 -0
- package/dist/lib/types/columns/types/TimeColumn/TimePainter.d.ts +3 -0
- package/dist/lib/types/columns/types/TimeColumn/TimePainter.d.ts.map +1 -0
- package/dist/lib/types/columns/types/TimeColumn/index.d.ts +3 -0
- package/dist/lib/types/columns/types/TimeColumn/index.d.ts.map +1 -0
- package/dist/lib/types/columns/types/UrlColumn/index.d.ts +4 -0
- package/dist/lib/types/columns/types/UrlColumn/index.d.ts.map +1 -0
- package/dist/lib/types/core/FilterEngine.d.ts +16 -0
- package/dist/lib/types/core/FilterEngine.d.ts.map +1 -0
- package/dist/lib/types/core/GeometryEngine.d.ts +51 -0
- package/dist/lib/types/core/GeometryEngine.d.ts.map +1 -0
- package/dist/lib/types/core/GroupingEngine.d.ts +8 -0
- package/dist/lib/types/core/GroupingEngine.d.ts.map +1 -0
- package/dist/lib/types/core/HistoryManager.d.ts +18 -0
- package/dist/lib/types/core/HistoryManager.d.ts.map +1 -0
- package/dist/lib/types/core/SelectionModel.d.ts +17 -0
- package/dist/lib/types/core/SelectionModel.d.ts.map +1 -0
- package/dist/lib/types/core/SortEngine.d.ts +7 -0
- package/dist/lib/types/core/SortEngine.d.ts.map +1 -0
- package/dist/lib/types/core/ValidationEngine.d.ts +33 -0
- package/dist/lib/types/core/ValidationEngine.d.ts.map +1 -0
- package/dist/lib/types/data/BlockCache.d.ts +12 -0
- package/dist/lib/types/data/BlockCache.d.ts.map +1 -0
- package/dist/lib/types/data/LocalDataStore.d.ts +78 -0
- package/dist/lib/types/data/LocalDataStore.d.ts.map +1 -0
- package/dist/lib/types/data/RemoteDataStore.d.ts +45 -0
- package/dist/lib/types/data/RemoteDataStore.d.ts.map +1 -0
- package/dist/lib/types/i18n/IGridLocale.d.ts +25 -0
- package/dist/lib/types/i18n/IGridLocale.d.ts.map +1 -0
- package/dist/lib/types/i18n/LocaleEngine.d.ts +10 -0
- package/dist/lib/types/i18n/LocaleEngine.d.ts.map +1 -0
- package/dist/lib/types/i18n/locales/enUS.d.ts +3 -0
- package/dist/lib/types/i18n/locales/enUS.d.ts.map +1 -0
- package/dist/lib/types/i18n/locales/trTR.d.ts +3 -0
- package/dist/lib/types/i18n/locales/trTR.d.ts.map +1 -0
- package/dist/lib/types/index.d.ts +30 -0
- package/dist/lib/types/index.d.ts.map +1 -0
- package/dist/lib/types/overlays/ContextMenuOverlay.d.ts +44 -0
- package/dist/lib/types/overlays/ContextMenuOverlay.d.ts.map +1 -0
- package/dist/lib/types/overlays/DynamicCellEditor.d.ts +15 -0
- package/dist/lib/types/overlays/DynamicCellEditor.d.ts.map +1 -0
- package/dist/lib/types/overlays/HeaderFilterPopover.d.ts +31 -0
- package/dist/lib/types/overlays/HeaderFilterPopover.d.ts.map +1 -0
- package/dist/lib/types/overlays/SparklineModalOverlay.d.ts +18 -0
- package/dist/lib/types/overlays/SparklineModalOverlay.d.ts.map +1 -0
- package/dist/lib/types/renderer/CanvasRenderer.d.ts +41 -0
- package/dist/lib/types/renderer/CanvasRenderer.d.ts.map +1 -0
- package/dist/lib/types/renderer/GroupRowPainter.d.ts +10 -0
- package/dist/lib/types/renderer/GroupRowPainter.d.ts.map +1 -0
- package/dist/lib/types/renderer/SkeletonPainter.d.ts +5 -0
- package/dist/lib/types/renderer/SkeletonPainter.d.ts.map +1 -0
- package/dist/lib/types/theme/IGridTheme.d.ts +47 -0
- package/dist/lib/types/theme/IGridTheme.d.ts.map +1 -0
- package/dist/lib/types/theme/ThemeEngine.d.ts +10 -0
- package/dist/lib/types/theme/ThemeEngine.d.ts.map +1 -0
- package/dist/lib/types/theme/presets/appleDark.d.ts +3 -0
- package/dist/lib/types/theme/presets/appleDark.d.ts.map +1 -0
- package/dist/lib/types/theme/presets/appleLight.d.ts +3 -0
- package/dist/lib/types/theme/presets/appleLight.d.ts.map +1 -0
- package/dist/lib/types/theme/presets/googleDark.d.ts +3 -0
- package/dist/lib/types/theme/presets/googleDark.d.ts.map +1 -0
- package/dist/lib/types/theme/presets/googleLight.d.ts +3 -0
- package/dist/lib/types/theme/presets/googleLight.d.ts.map +1 -0
- package/dist/lib/types/types/filter.d.ts +26 -0
- package/dist/lib/types/types/filter.d.ts.map +1 -0
- package/dist/lib/types/types/grid.d.ts +332 -0
- package/dist/lib/types/types/grid.d.ts.map +1 -0
- package/dist/lib/types/types/group.d.ts +31 -0
- package/dist/lib/types/types/group.d.ts.map +1 -0
- package/dist/lib/types/types/store.d.ts +85 -0
- package/dist/lib/types/types/store.d.ts.map +1 -0
- package/dist/lib/types/ui/FormulaBar.d.ts +28 -0
- package/dist/lib/types/ui/FormulaBar.d.ts.map +1 -0
- package/dist/lib/types/ui/MaterialIcon.d.ts +28 -0
- package/dist/lib/types/ui/MaterialIcon.d.ts.map +1 -0
- package/dist/lib/types/ui/SheetGL.d.ts +48 -0
- package/dist/lib/types/ui/SheetGL.d.ts.map +1 -0
- package/dist/lib/types/ui/SheetGLLogo.d.ts +9 -0
- package/dist/lib/types/ui/SheetGLLogo.d.ts.map +1 -0
- package/dist/lib/types/ui/SummaryFooter.d.ts +27 -0
- package/dist/lib/types/ui/SummaryFooter.d.ts.map +1 -0
- package/dist/lib/types/ui/ToolBar.d.ts +44 -0
- package/dist/lib/types/ui/ToolBar.d.ts.map +1 -0
- package/package.json +76 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheetgl.cjs","names":["_Fragment","useState","useRef","useMemo","_Fragment","useRef","_Fragment","useState","_Fragment","useState","_Fragment","React","useState","_Fragment","useState","_Fragment","useState","useRef","formatters","getFormatter","useState","useRef","useState","useRef","useState","useRef","useState","useRef","useState","useRef","useState","useRef","useState","useRef","useState","useRef","useState","useRef","useMemo","useState","useCallback","useRef","__create","__defProp","__getOwnPropDesc","__getOwnPropNames","__getProtoOf","__hasOwnProp","__copyProps","from","keys","i","n","key","to","except","k","desc","__toESM","mod","isNodeMode","target","react","react_jsx_runtime","appleLight","appleDark","googleLight","googleDark","ThemeEngine","name","tokens","themeInput","s","el","theme","media","listener","onChange","e","GeometryEngine","rowHeight","headerHeight","columns","visibleCols","c","sum","acc","low","high","mid","start","end","scrollX","frozenCount","colIndex","x","scrollIdx","scrollLeft","canvasY","canvasX","clickedCol","headerX","headerW","curX","w","sx","sIdx","colDef","isFilterIconHit","virtualY","scrollTop","row","rowCount","norm","selection","rTopY","rHeight","leftColRect","rightColRect","rLeftX","rWidth","fhX","fhY","dupX","dupY","cellScreenY","localY","cellScreenX","width","borderX","SelectionModel","col","minRow","maxRow","minCol","maxCol","HistoryManager","maxHistory","command","cmd","BLANK_FILTER_TOKEN","FilterEngine","cached","targetVal","rawSet","lowerSet","hasBlank","t","filter","logicalOp","currentResult","item","lower","itemResult","field","op","rawVal","val","raw","hasDot","hasComma","v","tr2","numVal","tr0","en2","cleanTarget","targetStr","mode","isRawBlank","compiled","elem","valStr","numRaw","numTarget","bothNumeric","minRaw","maxRaw","minNum","maxNum","minS","maxS","parts","idx","cleanKeyword","Deferred","res","result","errorMessage","createDeferred","EMAIL_REGEX","URL_REGEX","ValidationEngine","fallbackMsg","colTitle","column","rule","outcome","value","isTR","maybePromise","isAsync","resolved","num","len","a","b","useNum","left","right","ok","fallback","deferred","rawReturn","err","ColumnTypeRegistry","plugin","type","GroupRowPainter","ctx","isHovered","y","height","groupRow","indent","midY","displayVal","locale","opt","o","title","titleW","countText","countW","badgeX","summaryText","sCol","sTitle","sType","numStr","SkeletonPainter","barY","barW","CanvasRenderer","permissions","params","canvas","dpr","rect","targetPixelWidth","targetPixelHeight","store","rowH","geometry","headerH","rowNumW","startRow","endRow","startScrollColIdx","endScrollColIdx","normSel","r","rowY","vRow","hoveredCell","rowData","rowKey","isRowInserted","isRowLoading","loadingRowKeys","isRowInActiveSel","sc","colIdx","cellX","searchKeyword","curFrozenX","fc","fillDragRange","fTopY","fHeight","fLeftRect","fRightRect","fLeftX","fWidth","activeViewRowForSel","activeColDef","cx","cy","sortRules","hoveredFilterColIndex","activeFilterColumnIds","cellVal","rowIndex","isReadonly","isDirty","isColDirty","colW","dirtyStroke","isColumnDirty","h","isColSelected","isFilterable","sortIndex","rightReserved","prefix","sort","arrow","badge","btnX","btnY","isFilterActive","isFilterHovered","fx","fy","DynamicCellEditor","EditorComponent","overlay","validationError","isValidating","NUMERIC_COLUMN_TYPES","formatCellStructureValue","digits","sym","formatLiveNumericInput","thousandSep","decSep","cleaned","rawInput","isNeg","intFormatted","initialConditionInputDisplay","HeaderFilterPopover","isNumericCol","tab","setTab","activeFilter","allItems","setAllItems","loading","setLoading","search","setSearch","selectedSet","setSelectedSet","listScrollTop","setListScrollTop","defaultOp","operator","setOperator","condVal1","setCondVal1","condVal2","setCondVal2","popoverRef","searchInputRef","condInputRef","mounted","handleOutside","onClose","formatItemLabel","it","visibleItems","q","conditionMatchCount","v1","v2","matched","total","itemCount","areAllVisibleChecked","isIndeterminate","toggleAllVisible","next","toggleSingleItem","handleApply","onApply","normalizedV1","normalizedV2","handleClear","renderStructuredConditionInput","setVal","autoFocusRef","prefixSym","suffixSym","parsedNum","cellPreview","placeholder","rawLeft","anchorRect","safeLeft","viewportWidth","onSort","onToggleGroup","isGrouped","nextQuery","m","totalH","startIdx","endIdx","slice","realIdx","isChecked","optMatch","MATERIAL_SYMBOLS_HREF","injected","ensureMaterialSymbolsLoaded","link","MaterialIcon","variant","size","weight","style","ContextMenuOverlay","menuRef","isWriteMode","canAdd","canDelete","canDuplicate","canPaste","isCellEditable","handleKey","estimatedHeight","menu","safeTop","viewportHeight","renderItem","disabled","onClick","danger","iconName","label","shortcut","divider","onTogglePinColumn","onSortColumn","isGroupedByCol","onToggleGroupColumn","onToggleColumnReadonly","isActive","currentSummaryType","onChangeSummaryType","onOpenSparklineModal","onCopy","onPaste","onDuplicateCellDown","onDuplicateCellRight","onDuplicateRow","onInsertRowAbove","onInsertRowBelow","onFilterByCellValue","onClearCells","onDeleteRow","SparklineModalOverlay","chartType","setChartType","hoveredIdx","setHoveredIdx","points","modal","firstVal","lastVal","diff","pctChange","minVal","maxVal","maxIdx","avgVal","variance","stdDev","accentColor","isPositive","yMin","yRange","getX","getY","linePath","areaPath","avgY","rowTitle","rowSubtitle","bw","bx","by","bh","isHov","delta","SheetGLLogo","glow","ToolBar","showColSettings","setShowColSettings","settingsTab","setSettingsTab","toolbarConfig","displayMode","allowDisplayModeSwitch","showBrand","showAddRow","showDuplicateRow","showDeleteRow","showUndoRedo","showSearch","showGroupBy","showClearFilters","showBatchActions","showPermissionsSwitch","showColumnSettings","showLocaleSwitch","showThemeSwitch","showExportCsv","isReadonlyMode","canDup","canDel","canEdit","btnStyle","modeOverride","highlight","renderBtnContent","iconSize","iconColor","renderCustomItem","itemMode","isPrimary","isDanger","isSuccess","baseStyle","leftCustomItems","rightCustomItems","onAddRow","onUndo","onRedo","canUndo","canRedo","onSearchChange","availableColumns","groups","activeFilterCount","onClearAllFilters","pendingChangesCount","onSaveBatch","onDiscardBatch","onUpdateToolbarConfig","active","onPermissionsChange","isRO","isPinned","sumType","summaryTypes","onUpdateColumn","onUpdateSummaryConfig","summaryConfig","onLocaleChange","currentThemeName","onThemeChange","onExportCsv","colId","onExpandAllGroups","onCollapseAllGroups","getExcelColName","FormulaBar","isSparkline","currentValue","draft","setDraft","isFocused","setIsFocused","activeCoords","excelRef","hasMultiSpan","selectionSpan","commitDraft","isEditable","onCommitValue","parsed","obj","out","pair","buttonDisplayMode","onDuplicateDown","onDuplicateRight","SUMMARY_TYPE_ICONS","SummaryFooter","openConfigCol","setOpenConfigCol","showAddSummary","setShowAddSummary","showTotalCount","showSelectionStats","showColumnSummaries","allowConfiguration","activeMetrics","hasMetric","formatSummaryVal","itemOverride","base","formattedNum","totalRowCount","selectionStats","summaries","sumVal","isOpen","cur","SortEngine","valA","valB","strA","strB","GroupingEngine","entries","visit","level","maxAutoExpandLevel","buckets","items","bucketItems","groupKey","parentKey","data","expandedKeys","bucket","isExpanded","sf","count","min","max","bi","LocalDataStore","options","sample","keyword","groupDescriptors","g","allKeys","snap","orig","set","columnId","newValue","updates","rowMap","changed","u","patch","maxId","newKey","newRow","insertIdx","targetViewRowIndex","rawIdx","sourceIdx","source","cloned","removed","origData","targetIdx","rawIndex","enabled","cols","inserted","clean","updated","values","changes","entry","ins","delKeys","baseItems","counts","blankCount","formatted","summaryType","nonNullCount","event","callback","args","cb","filtered","cmp","paintText","maxW","TextEditor","text","setText","initialChar","inputRef","committedRef","safeCommit","onCommit","dir","onCancel","TextColumnPlugin","openEditor","formatters$1","getFormatter$1","minDigits","maxDigits","useGrouping","fmt","paintNumber","textX","NumberEditor","commitParsed","moveDir","NumberColumnPlugin","formatters","getFormatter","paintCurrency","symbol","CurrencyColumnPlugin","paintPercent","showSign","PercentColumnPlugin","paintBoolean","boxX","boxY","BooleanColumnPlugin","setValue","resolveBadgeColors","isDark","bg","fg","paintSelect","colors","pillY","pillW","arrowX","arrowY","SelectEditor","highlightedIndex","setHighlightedIndex","containerRef","prev","isSelected","SelectColumnPlugin","localX","match","paintDropdown","displayLabel","textStartX","DropdownColumnPlugin","resolveTagColors","normalizeMultiValue","paintMultiSelect","maxRight","textW","remainingCount","reserveForMore","moreText","moreW","drawW","MultiSelectColumnPlugin","selected","setSelected","latestSelectedRef","toggleValue","p","getInitials","paintLookup","centerY","avatarCX","avatarBg","avatarFg","maxTextW","labelW","LookupColumnPlugin","normalizeObjectValue","trimmed","pairs","rawV","formatObjectSummary","displayKey","primary","rest","paintObject","badgeText","badgeW","badgeY","summary","parseScalarValue","ObjectColumnPlugin","initialObj","setMode","setPairs","jsonText","setJsonText","jsonError","setJsonError","buildObjectFromPairs","list","handleSave","switchMode","nextMode","paintDate","dateStr","yr","mon","day","d","iconX","iconY","parseIsoParts","now","str","isoMatch","dmyMatch","DateColumnPlugin","initial","dateVal","setDateVal","viewYear","setViewYear","viewMonth","setViewMonth","latestValRef","handleOutsideMouseDown","handleKeyDown","handlePrevMonth","handleNextMonth","selectDay","nextIso","selectToday","daysInMonth","firstDayOfWeek","cells","monthNames","weekDays","selectedParts","wd","isSelectedDay","dmy","formatDateTimeDisplay","hh","mm","paintDateTime","datePart","timePart","dateW","pillX","timeW","parseDateTimeParts","DateTimeColumnPlugin","textVal","setTextVal","selDay","setSelDay","selHour","setSelHour","selMinute","setSelMinute","buildFormatted","updateParts","handleSelectNow","hours","paintTime","parseTimeParts","TimeColumnPlugin","timeVal","setTimeVal","updateTime","nextStr","commitImmediate","paintEmail","email","EmailColumnPlugin","paintUrl","display","UrlColumnPlugin","href","paintPhone","phone","PhoneColumnPlugin","PRESET_COLORS","ColorEditor","hex","setHex","paintColor","color","swatchX","swatchY","ColorColumnPlugin","paintRating","rating","startX","drawStar","rot","step","spikes","outerRadius","innerRadius","RatingColumnPlugin","starIndex","paintProgress","pct","barTotalW","fillW","ProgressColumnPlugin","paintSparkline","rightReserve","range","strokeColor","px","py","lastX","lastY","SparklineColumnPlugin","paintAction","btnW","ActionColumnPlugin","initialized","initDefaultColumnPlugins","enUS","trTR","LocaleEngine","input","code","compileColumnFilters","states","map","singleFilters","st","composite","f","SheetGL","userColumns","userTheme","userLocale","userPermissions","userToolbar","userSummaryRow","dataSource","initialSummaries","batchEditMode","setCurrentThemeName","resolvedTheme","setResolvedTheme","currentLocale","setCurrentLocale","setPermissions","handleUpdatePermissions","setToolbarConfig","handleUpdateToolbarConfig","onToolbarConfigChange","setSummaryConfig","handleUpdateSummaryConfig","onSummaryConfigChange","setColumns","geometryRef","selectionRef","historyRef","setSortRules","initialSort","setGroups","initialGroups","columnFilters","setColumnFilters","setSearchKeyword","selectedCellUI","setSelectedCellUI","selectionVersion","setSelectionVersion","activeOverlay","setActiveOverlay","editorValidationError","setEditorValidationError","isEditorValidating","setIsEditorValidating","headerFilterState","setHeaderFilterState","contextMenu","setContextMenu","sparklineModal","setSparklineModal","toastMessage","setToastMessage","hoveredCellRef","hoveredFilterColRef","cursorStyle","setCursorStyle","resizingCol","setResizingCol","isDraggingSelection","setIsDraggingSelection","isDraggingRowNumbers","setIsDraggingRowNumbers","fillDragState","setFillDragState","loadingRowKeysRef","scrollPosRef","scrollIndicator","setScrollIndicator","scrollHideTimerRef","internalClipboardRef","gridSurfaceRef","canvasRef","scrollContainerRef","showToast","storeVersion","setStoreVersion","handleLoaded","requestRender","handleResize","observer","canEditCell","silent","onEditingStart","evt","commitSingleCellEdit","oldValue","hasAsyncRule","valRes","msg","finalValue","onCellValueChanging","changingEvt","onRowUpdating","rowUpdEvt","prevRowSnapshot","onCellChange","cascadingPatch","draftNewData","resolvedPatch","onCellValueChanged","asyncPatch","recordHistory","fullNewPatch","fullOldPatch","onRowUpdated","applyBatchCellUpdates","allowedUpdates","single","validatedUpdates","firstErrorMsg","rejectedCount","forwardBatch","backwardBatch","combined","handleInsertRow","defaultRow","onRowInserting","created","targetRowIndex","onRowInserted","handleDuplicateRow","sourceKey","duplicated","handleDeleteRow","snapshot","onRowRemoving","onRowRemoved","handleSaveBatch","onSaving","committed","onSaved","handleDiscardBatch","handleDuplicateCellDown","geom","topRow","targetRow","nextR","srcRow","dstRow","handleDuplicateCellRight","srcColDef","srcVal","dstColDef","coercedVal","nextC","handleHeaderSort","nextRules","existingIndex","explicitDesc","isShift","handleToggleGroupColumn","targetCol","exists","prevGroups","nextGroups","handleApplyColumnFilter","filterState","maxR","activeCol","matchedCount","handleClearAllFilters","handleUpdateColumnDef","handleChangeSummaryType","handleMouseMove","deltaX","newWidth","handleMouseUp","handleWindowMouseMove","surface","clampedY","hit","src","handleWindowMouseUp","isSameRange","sourceRange","targetRange","srcHeight","srcWidth","srcR","srcC","srcViewRow","offset","ensureCellVisible","cellTop","cellBottom","colRect","moveSelection","isRangeSelect","nextRow","dRow","nextCol","dCol","openEditorForCell","screenRect","getViewportCoords","handleSurfaceMouseMove","onScrollbar","sl","headerHit","nextFilterCol","hoveredRowIdx","hVRow","normForHover","activeColForHover","fhHit","handleSurfaceMouseDown","resizeHit","clickedRowIdx","clickedVRow","normForDup","activeColForDup","rowNumHit","shouldFocusContainer","newVal","handleSurfaceDoubleClick","handleSurfaceContextMenu","gRow","groupCol","handleClearSelectedCells","emptyVal","buildSelectedTsv","rowsText","cellsText","applyPastedTsv","lines","isSingleClipboardValue","hasMultiSelection","rawCellText","parsedVal","startCol","rOffset","line","cOffset","cellText","handleCopy","tsv","handlePaste","char","exportCsv","rows","cellVals","blob","url","rowSpan","colSpan","numericCount","currentColumn","activeViewRow","currentCellValue","isActiveCellEditable","pendingChanges","normRange","className","showFormulaBar","hasAsync","txt","nextRO","BlockCache","blockSize","maxBlocks","blockIndex","block","oldestKey","RemoteDataStore","startBlock","endBlock","missingBlocks","payload","json","distinctUrl"],"sources":["../../src/datagrid/theme/presets/appleLight.ts","../../src/datagrid/theme/presets/appleDark.ts","../../src/datagrid/theme/presets/googleLight.ts","../../src/datagrid/theme/presets/googleDark.ts","../../src/datagrid/theme/ThemeEngine.ts","../../src/datagrid/core/GeometryEngine.ts","../../src/datagrid/core/SelectionModel.ts","../../src/datagrid/core/HistoryManager.ts","../../src/datagrid/core/FilterEngine.ts","../../src/datagrid/core/ValidationEngine.ts","../../src/datagrid/columns/ColumnTypeRegistry.ts","../../src/datagrid/renderer/GroupRowPainter.ts","../../src/datagrid/renderer/SkeletonPainter.ts","../../src/datagrid/renderer/CanvasRenderer.ts","../../src/datagrid/overlays/DynamicCellEditor.tsx","../../src/datagrid/overlays/HeaderFilterPopover.tsx","../../src/datagrid/ui/MaterialIcon.tsx","../../src/datagrid/overlays/ContextMenuOverlay.tsx","../../src/datagrid/overlays/SparklineModalOverlay.tsx","../../src/datagrid/ui/SheetGLLogo.tsx","../../src/datagrid/ui/ToolBar.tsx","../../src/datagrid/ui/FormulaBar.tsx","../../src/datagrid/ui/SummaryFooter.tsx","../../src/datagrid/core/SortEngine.ts","../../src/datagrid/core/GroupingEngine.ts","../../src/datagrid/data/LocalDataStore.ts","../../src/datagrid/columns/types/TextColumn/TextPainter.ts","../../src/datagrid/columns/types/TextColumn/TextEditor.tsx","../../src/datagrid/columns/types/TextColumn/index.ts","../../src/datagrid/columns/types/NumberColumn/NumberPainter.ts","../../src/datagrid/columns/types/NumberColumn/NumberEditor.tsx","../../src/datagrid/columns/types/NumberColumn/index.ts","../../src/datagrid/columns/types/CurrencyColumn/CurrencyPainter.ts","../../src/datagrid/columns/types/CurrencyColumn/index.ts","../../src/datagrid/columns/types/PercentColumn/index.ts","../../src/datagrid/columns/types/BooleanColumn/BooleanPainter.ts","../../src/datagrid/columns/types/BooleanColumn/index.ts","../../src/datagrid/columns/types/SelectColumn/SelectPainter.ts","../../src/datagrid/columns/types/SelectColumn/SelectEditor.tsx","../../src/datagrid/columns/types/SelectColumn/index.ts","../../src/datagrid/columns/types/DropdownColumn/DropdownPainter.ts","../../src/datagrid/columns/types/DropdownColumn/index.ts","../../src/datagrid/columns/types/MultiSelectColumn/MultiSelectPainter.ts","../../src/datagrid/columns/types/MultiSelectColumn/MultiSelectEditor.tsx","../../src/datagrid/columns/types/MultiSelectColumn/index.ts","../../src/datagrid/columns/types/LookupColumn/LookupPainter.ts","../../src/datagrid/columns/types/LookupColumn/LookupEditor.tsx","../../src/datagrid/columns/types/LookupColumn/index.ts","../../src/datagrid/columns/types/ObjectColumn/ObjectPainter.ts","../../src/datagrid/columns/types/ObjectColumn/ObjectEditor.tsx","../../src/datagrid/columns/types/ObjectColumn/index.ts","../../src/datagrid/columns/types/DateColumn/DatePainter.ts","../../src/datagrid/columns/types/DateColumn/DateEditor.tsx","../../src/datagrid/columns/types/DateColumn/index.ts","../../src/datagrid/columns/types/DateTimeColumn/DateTimePainter.ts","../../src/datagrid/columns/types/DateTimeColumn/DateTimeEditor.tsx","../../src/datagrid/columns/types/DateTimeColumn/index.ts","../../src/datagrid/columns/types/TimeColumn/TimePainter.ts","../../src/datagrid/columns/types/TimeColumn/TimeEditor.tsx","../../src/datagrid/columns/types/TimeColumn/index.ts","../../src/datagrid/columns/types/EmailColumn/index.ts","../../src/datagrid/columns/types/UrlColumn/index.ts","../../src/datagrid/columns/types/PhoneColumn/index.ts","../../src/datagrid/columns/types/ColorColumn/ColorEditor.tsx","../../src/datagrid/columns/types/ColorColumn/index.ts","../../src/datagrid/columns/types/RatingColumn/RatingPainter.ts","../../src/datagrid/columns/types/RatingColumn/index.ts","../../src/datagrid/columns/types/ProgressColumn/ProgressPainter.ts","../../src/datagrid/columns/types/ProgressColumn/index.ts","../../src/datagrid/columns/types/SparklineColumn/SparklinePainter.ts","../../src/datagrid/columns/types/SparklineColumn/index.ts","../../src/datagrid/columns/types/ActionColumn/ActionPainter.ts","../../src/datagrid/columns/types/ActionColumn/index.ts","../../src/datagrid/columns/initPlugins.ts","../../src/datagrid/i18n/locales/enUS.ts","../../src/datagrid/i18n/locales/trTR.ts","../../src/datagrid/i18n/LocaleEngine.ts","../../src/datagrid/ui/SheetGL.tsx","../../src/datagrid/data/BlockCache.ts","../../src/datagrid/data/RemoteDataStore.ts"],"sourcesContent":["import { IGridThemeTokens } from '../IGridTheme';\n\nexport const appleLight: IGridThemeTokens = {\n name: 'apple-light',\n isDark: false,\n fontFamily: 'Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: 13,\n headerFontSize: 12,\n fontFeatureSettings: '\"tnum\"',\n\n canvas: {\n bg: '#FFFFFF',\n gridLine: '#E5E5EA',\n headerBg: '#F5F5F7',\n headerText: '#1D1D1F',\n headerBorder: '#D1D1D6',\n cellText: '#1D1D1F',\n rowNumberBg: '#FAFAFC',\n rowNumberText: '#8E8E93',\n rowNumberBorder: '#E5E5EA',\n frozenDividerShadow: 'rgba(0, 0, 0, 0.08)',\n groupRowBg: '#F2F2F7',\n groupRowText: '#1D1D1F',\n groupRowBorder: '#D1D1D6',\n selectionBorder: '#007AFF',\n selectionFill: 'rgba(0, 122, 255, 0.08)',\n fillHandleColor: '#007AFF',\n searchHighlight: 'rgba(255, 214, 10, 0.55)',\n skeletonBar: '#E5E5EA',\n },\n\n dom: {\n toolbarBg: 'rgba(255, 255, 255, 0.85)',\n toolbarBorder: 'rgba(0, 0, 0, 0.08)',\n toolbarText: '#1D1D1F',\n glassBackdrop: 'blur(20px) saturate(180%)',\n popoverBg: 'rgba(255, 255, 255, 0.95)',\n popoverBorder: 'rgba(0, 0, 0, 0.12)',\n popoverShadow: '0 12px 32px rgba(0, 0, 0, 0.12), 0 2px 6px rgba(0, 0, 0, 0.04)',\n popoverText: '#1D1D1F',\n inputBg: '#FFFFFF',\n inputText: '#1D1D1F',\n inputBorder: '#D1D1D6',\n inputFocusBorder: '#007AFF',\n accentColor: '#007AFF',\n buttonHoverBg: 'rgba(0, 0, 0, 0.05)',\n badgeBg: '#E5E5EA',\n badgeText: '#1D1D1F',\n },\n};\n","import { IGridThemeTokens } from '../IGridTheme';\n\nexport const appleDark: IGridThemeTokens = {\n name: 'apple-dark',\n isDark: true,\n fontFamily: 'Inter, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n fontSize: 13,\n headerFontSize: 12,\n fontFeatureSettings: '\"tnum\"',\n\n canvas: {\n bg: '#1C1C1E',\n gridLine: '#2C2C2E',\n headerBg: '#2C2C2E',\n headerText: '#F5F5F7',\n headerBorder: '#3A3A3C',\n cellText: '#F5F5F7',\n rowNumberBg: '#242426',\n rowNumberText: '#8E8E93',\n rowNumberBorder: '#2C2C2E',\n frozenDividerShadow: 'rgba(0, 0, 0, 0.45)',\n groupRowBg: '#252528',\n groupRowText: '#F5F5F7',\n groupRowBorder: '#3A3A3C',\n selectionBorder: '#0A84FF',\n selectionFill: 'rgba(10, 132, 255, 0.18)',\n fillHandleColor: '#0A84FF',\n searchHighlight: 'rgba(255, 214, 10, 0.35)',\n skeletonBar: '#2C2C2E',\n },\n\n dom: {\n toolbarBg: 'rgba(28, 28, 30, 0.88)',\n toolbarBorder: 'rgba(255, 255, 255, 0.08)',\n toolbarText: '#F5F5F7',\n glassBackdrop: 'blur(24px) saturate(180%)',\n popoverBg: 'rgba(38, 38, 42, 0.95)',\n popoverBorder: 'rgba(255, 255, 255, 0.12)',\n popoverShadow: '0 16px 40px rgba(0, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3)',\n popoverText: '#F5F5F7',\n inputBg: '#2C2C2E',\n inputText: '#F5F5F7',\n inputBorder: '#3A3A3C',\n inputFocusBorder: '#0A84FF',\n accentColor: '#0A84FF',\n buttonHoverBg: 'rgba(255, 255, 255, 0.08)',\n badgeBg: '#3A3A3C',\n badgeText: '#F5F5F7',\n },\n};\n","import { IGridThemeTokens } from '../IGridTheme';\n\nexport const googleLight: IGridThemeTokens = {\n name: 'google-light',\n isDark: false,\n fontFamily: 'Roboto, \"Google Sans\", -apple-system, BlinkMacSystemFont, sans-serif',\n fontSize: 13,\n headerFontSize: 12,\n fontFeatureSettings: '\"tnum\"',\n\n canvas: {\n bg: '#FFFFFF',\n gridLine: '#E0E0E0',\n headerBg: '#F8F9FA',\n headerText: '#3C4043',\n headerBorder: '#D2D3D6',\n cellText: '#202124',\n rowNumberBg: '#F8F9FA',\n rowNumberText: '#5F6368',\n rowNumberBorder: '#D2D3D6',\n frozenDividerShadow: 'rgba(60, 64, 67, 0.15)',\n groupRowBg: '#F1F3F4',\n groupRowText: '#202124',\n groupRowBorder: '#D2D3D6',\n selectionBorder: '#1A73E8',\n selectionFill: 'rgba(26, 115, 232, 0.08)',\n fillHandleColor: '#1A73E8',\n searchHighlight: 'rgba(253, 214, 51, 0.6)',\n skeletonBar: '#F1F3F4',\n },\n\n dom: {\n toolbarBg: '#FFFFFF',\n toolbarBorder: '#E0E0E0',\n toolbarText: '#3C4043',\n glassBackdrop: 'none',\n popoverBg: '#FFFFFF',\n popoverBorder: '#DADCE0',\n popoverShadow: '0 8px 24px rgba(60, 64, 67, 0.15)',\n popoverText: '#202124',\n inputBg: '#FFFFFF',\n inputText: '#202124',\n inputBorder: '#DADCE0',\n inputFocusBorder: '#1A73E8',\n accentColor: '#1A73E8',\n buttonHoverBg: '#F1F3F4',\n badgeBg: '#E8F0FE',\n badgeText: '#1967D2',\n },\n};\n","import { IGridThemeTokens } from '../IGridTheme';\n\nexport const googleDark: IGridThemeTokens = {\n name: 'google-dark',\n isDark: true,\n fontFamily: 'Roboto, \"Google Sans\", -apple-system, BlinkMacSystemFont, sans-serif',\n fontSize: 13,\n headerFontSize: 12,\n fontFeatureSettings: '\"tnum\"',\n\n canvas: {\n bg: '#202124',\n gridLine: '#3C4043',\n headerBg: '#2D2E30',\n headerText: '#E8EAED',\n headerBorder: '#5F6368',\n cellText: '#E8EAED',\n rowNumberBg: '#2D2E30',\n rowNumberText: '#9AA0A6',\n rowNumberBorder: '#5F6368',\n frozenDividerShadow: 'rgba(0, 0, 0, 0.5)',\n groupRowBg: '#282A2D',\n groupRowText: '#E8EAED',\n groupRowBorder: '#5F6368',\n selectionBorder: '#8AB4F8',\n selectionFill: 'rgba(138, 180, 248, 0.16)',\n fillHandleColor: '#8AB4F8',\n searchHighlight: 'rgba(253, 214, 51, 0.35)',\n skeletonBar: '#3C4043',\n },\n\n dom: {\n toolbarBg: '#202124',\n toolbarBorder: '#3C4043',\n toolbarText: '#E8EAED',\n glassBackdrop: 'none',\n popoverBg: '#2D2E30',\n popoverBorder: '#5F6368',\n popoverShadow: '0 12px 32px rgba(0, 0, 0, 0.4)',\n popoverText: '#E8EAED',\n inputBg: '#202124',\n inputText: '#E8EAED',\n inputBorder: '#5F6368',\n inputFocusBorder: '#8AB4F8',\n accentColor: '#8AB4F8',\n buttonHoverBg: '#3C4043',\n badgeBg: '#394457',\n badgeText: '#8AB4F8',\n },\n};\n","import { IGridThemeTokens } from './IGridTheme';\nimport { appleLight } from './presets/appleLight';\nimport { appleDark } from './presets/appleDark';\nimport { googleLight } from './presets/googleLight';\nimport { googleDark } from './presets/googleDark';\n\nexport type ThemeInput = 'system' | 'apple-light' | 'apple-dark' | 'google-light' | 'google-dark' | IGridThemeTokens;\n\nexport class ThemeEngine {\n private static presets: Map<string, IGridThemeTokens> = new Map([\n ['apple-light', appleLight],\n ['apple-dark', appleDark],\n ['google-light', googleLight],\n ['google-dark', googleDark],\n ]);\n\n public static registerPreset(name: string, tokens: IGridThemeTokens): void {\n this.presets.set(name, tokens);\n }\n\n public static resolve(themeInput?: ThemeInput): IGridThemeTokens {\n if (!themeInput || themeInput === 'system') {\n const prefersDark =\n typeof window !== 'undefined' &&\n window.matchMedia &&\n window.matchMedia('(prefers-color-scheme: dark)').matches;\n return prefersDark ? appleDark : appleLight;\n }\n\n if (typeof themeInput === 'string') {\n const found = this.presets.get(themeInput);\n if (found) return found;\n return appleLight;\n }\n\n return themeInput;\n }\n\n public static applyToElement(el: HTMLElement, theme: IGridThemeTokens): void {\n const s = el.style;\n s.setProperty('--grid-font-family', theme.fontFamily);\n s.setProperty('--grid-font-size', `${theme.fontSize}px`);\n s.setProperty('--grid-header-font-size', `${theme.headerFontSize}px`);\n\n // DOM renkleri\n s.setProperty('--grid-toolbar-bg', theme.dom.toolbarBg);\n s.setProperty('--grid-toolbar-border', theme.dom.toolbarBorder);\n s.setProperty('--grid-toolbar-text', theme.dom.toolbarText);\n s.setProperty('--grid-glass-backdrop', theme.dom.glassBackdrop);\n s.setProperty('--grid-popover-bg', theme.dom.popoverBg);\n s.setProperty('--grid-popover-border', theme.dom.popoverBorder);\n s.setProperty('--grid-popover-shadow', theme.dom.popoverShadow);\n s.setProperty('--grid-popover-text', theme.dom.popoverText);\n s.setProperty('--grid-input-bg', theme.dom.inputBg);\n s.setProperty('--grid-input-text', theme.dom.inputText);\n s.setProperty('--grid-input-border', theme.dom.inputBorder);\n s.setProperty('--grid-input-focus-border', theme.dom.inputFocusBorder);\n s.setProperty('--grid-accent-color', theme.dom.accentColor);\n s.setProperty('--grid-button-hover-bg', theme.dom.buttonHoverBg);\n s.setProperty('--grid-badge-bg', theme.dom.badgeBg);\n s.setProperty('--grid-badge-text', theme.dom.badgeText);\n }\n\n public static watchSystem(onChange: (isDark: boolean) => void): () => void {\n if (typeof window === 'undefined' || !window.matchMedia) return () => {};\n const media = window.matchMedia('(prefers-color-scheme: dark)');\n const listener = (e: MediaQueryListEvent) => onChange(e.matches);\n media.addEventListener('change', listener);\n return () => media.removeEventListener('change', listener);\n }\n}\n","import { ColumnDef } from '../types/grid';\nimport { SelectionModel } from './SelectionModel';\n\nexport interface HitTestResult {\n row: number;\n col: number;\n localX: number;\n localY: number;\n isFrozen: boolean;\n cellRect: { x: number; y: number; width: number; height: number };\n}\n\nexport interface HeaderHitTestResult {\n colIndex: number;\n column: ColumnDef;\n headerX: number;\n headerWidth: number;\n isFilterIconHit: boolean;\n}\n\nexport class GeometryEngine {\n public rowHeight: number = 34;\n public headerHeight: number = 38;\n public rowNumberWidth: number = 54;\n\n public columns: ColumnDef[] = [];\n public frozenColumns: ColumnDef[] = [];\n public scrollableColumns: ColumnDef[] = [];\n public totalFrozenWidth: number = 0;\n public totalScrollableWidth: number = 0;\n public scrollableColOffsets: Float32Array = new Float32Array(0);\n\n constructor(columns: ColumnDef[] = [], rowHeight: number = 34, headerHeight: number = 38) {\n this.rowHeight = rowHeight;\n this.headerHeight = headerHeight;\n this.setColumns(columns);\n }\n\n public setColumns(columns: ColumnDef[]): void {\n const visibleCols = columns.filter((c) => c.visible !== false);\n this.columns = [\n ...visibleCols.filter((c) => Boolean(c.pinned)),\n ...visibleCols.filter((c) => !c.pinned),\n ];\n this.recalculateGeometry();\n }\n\n public recalculateGeometry(): void {\n this.frozenColumns = this.columns.filter((c) => Boolean(c.pinned));\n this.scrollableColumns = this.columns.filter((c) => !c.pinned);\n\n this.totalFrozenWidth =\n this.rowNumberWidth + this.frozenColumns.reduce((sum, c) => sum + c.width, 0);\n\n this.scrollableColOffsets = new Float32Array(this.scrollableColumns.length + 1);\n let acc = 0;\n for (let i = 0; i < this.scrollableColumns.length; i++) {\n this.scrollableColOffsets[i] = acc;\n acc += this.scrollableColumns[i].width;\n }\n this.scrollableColOffsets[this.scrollableColumns.length] = acc;\n this.totalScrollableWidth = acc;\n }\n\n public findScrollableColIndexAtX(scrollX: number): number {\n let low = 0;\n let high = this.scrollableColumns.length - 1;\n while (low <= high) {\n const mid = (low + high) >>> 1;\n const start = this.scrollableColOffsets[mid];\n const end = this.scrollableColOffsets[mid + 1];\n if (scrollX >= start && scrollX < end) {\n return mid;\n } else if (scrollX < start) {\n high = mid - 1;\n } else {\n low = mid + 1;\n }\n }\n return Math.min(Math.max(0, low), Math.max(0, this.scrollableColumns.length - 1));\n }\n\n public getColumnScreenRect(\n colIndex: number,\n scrollLeft: number\n ): { x: number; width: number; isFrozen: boolean } {\n const frozenCount = this.frozenColumns.length;\n if (colIndex < frozenCount) {\n let x = this.rowNumberWidth;\n for (let i = 0; i < colIndex; i++) {\n x += this.frozenColumns[i].width;\n }\n return {\n x,\n width: this.frozenColumns[colIndex]?.width || 0,\n isFrozen: true,\n };\n } else {\n const scrollIdx = colIndex - frozenCount;\n if (scrollIdx < 0 || scrollIdx >= this.scrollableColumns.length) {\n return { x: 0, width: 0, isFrozen: false };\n }\n const x = this.totalFrozenWidth + this.scrollableColOffsets[scrollIdx] - scrollLeft;\n return {\n x,\n width: this.scrollableColumns[scrollIdx].width,\n isFrozen: false,\n };\n }\n }\n\n public hitTestHeader(canvasX: number, canvasY: number, scrollLeft: number): HeaderHitTestResult | null {\n if (canvasY < 0 || canvasY > this.headerHeight || canvasX <= this.rowNumberWidth) {\n return null;\n }\n\n let clickedCol = -1;\n let headerX = 0;\n let headerW = 0;\n\n // 1. Frozen Columns\n let curX = this.rowNumberWidth;\n for (let i = 0; i < this.frozenColumns.length; i++) {\n const w = this.frozenColumns[i].width;\n if (canvasX >= curX && canvasX < curX + w) {\n clickedCol = i;\n headerX = curX;\n headerW = w;\n break;\n }\n curX += w;\n }\n\n // 2. Scrollable Columns\n if (clickedCol === -1 && canvasX >= this.totalFrozenWidth) {\n const sx = canvasX - this.totalFrozenWidth + scrollLeft;\n if (sx >= 0 && sx < this.totalScrollableWidth && this.scrollableColumns.length > 0) {\n const sIdx = this.findScrollableColIndexAtX(sx);\n clickedCol = this.frozenColumns.length + sIdx;\n headerX = this.totalFrozenWidth + this.scrollableColOffsets[sIdx] - scrollLeft;\n headerW = this.scrollableColumns[sIdx]?.width || 100;\n }\n }\n\n if (clickedCol === -1 || !this.columns[clickedCol]) {\n return null;\n }\n\n const colDef = this.columns[clickedCol];\n const isFilterable = colDef.filterable !== false && colDef.type !== 'sparkline' && colDef.type !== 'action';\n const isFilterIconHit = isFilterable && canvasX >= headerX + headerW - 28 && canvasX <= headerX + headerW - 2;\n\n return {\n colIndex: clickedCol,\n column: colDef,\n headerX,\n headerWidth: headerW,\n isFilterIconHit,\n };\n }\n\n public hitTestRowNumber(\n canvasX: number,\n canvasY: number,\n scrollTop: number,\n rowCount: number\n ): number | null {\n if (canvasX < 0 || canvasX > this.rowNumberWidth || canvasY <= this.headerHeight) {\n return null;\n }\n const virtualY = canvasY - this.headerHeight + scrollTop;\n const row = Math.floor(virtualY / this.rowHeight);\n if (row < 0 || row >= rowCount) return null;\n return row;\n }\n\n public hitTestFillHandle(\n canvasX: number,\n canvasY: number,\n scrollLeft: number,\n scrollTop: number,\n selection: SelectionModel\n ): 'corner' | 'right-duplicate' | null {\n if (canvasY <= this.headerHeight || canvasX <= this.rowNumberWidth) return null;\n\n const norm = selection.getNormalizedRange();\n const rTopY = this.headerHeight + norm.minRow * this.rowHeight - scrollTop;\n const rHeight = (norm.maxRow - norm.minRow + 1) * this.rowHeight;\n const leftColRect = this.getColumnScreenRect(norm.minCol, scrollLeft);\n const rightColRect = this.getColumnScreenRect(norm.maxCol, scrollLeft);\n\n if (!leftColRect || !rightColRect) return null;\n\n const rLeftX = leftColRect.x;\n const rWidth = rightColRect.x + rightColRect.width - leftColRect.x;\n\n // 1. Bottom-right corner fill handle (12x12 hit box)\n const fhX = rLeftX + rWidth;\n const fhY = rTopY + rHeight;\n if (Math.abs(canvasX - fhX) <= 7 && Math.abs(canvasY - fhY) <= 7) {\n return 'corner';\n }\n\n // 2. Right-side quick duplicate button handle (centered vertically on right edge of selection)\n const dupX = rLeftX + rWidth;\n const dupY = rTopY + rHeight / 2;\n if (Math.abs(canvasX - dupX) <= 9 && Math.abs(canvasY - dupY) <= 9) {\n return 'right-duplicate';\n }\n\n return null;\n }\n\n public hitTest(\n canvasX: number,\n canvasY: number,\n scrollLeft: number,\n scrollTop: number,\n rowCount: number\n ): HitTestResult | null {\n if (canvasY <= this.headerHeight || canvasX <= this.rowNumberWidth) {\n return null;\n }\n\n const virtualY = canvasY - this.headerHeight + scrollTop;\n const row = Math.floor(virtualY / this.rowHeight);\n if (row < 0 || row >= rowCount) return null;\n\n const cellScreenY = this.headerHeight + row * this.rowHeight - scrollTop;\n const localY = canvasY - cellScreenY;\n\n // 1. Frozen Columns\n if (canvasX < this.totalFrozenWidth) {\n let curX = this.rowNumberWidth;\n for (let i = 0; i < this.frozenColumns.length; i++) {\n const w = this.frozenColumns[i].width;\n if (canvasX >= curX && canvasX < curX + w) {\n return {\n row,\n col: i,\n localX: canvasX - curX,\n localY,\n isFrozen: true,\n cellRect: { x: curX, y: cellScreenY, width: w, height: this.rowHeight },\n };\n }\n curX += w;\n }\n return null;\n }\n\n // 2. Scrollable Columns\n const scrollX = canvasX - this.totalFrozenWidth + scrollLeft;\n if (scrollX < 0 || scrollX >= this.totalScrollableWidth || this.scrollableColumns.length === 0) {\n return null;\n }\n\n const scrollIdx = this.findScrollableColIndexAtX(scrollX);\n const colIndex = this.frozenColumns.length + scrollIdx;\n const cellScreenX = this.totalFrozenWidth + this.scrollableColOffsets[scrollIdx] - scrollLeft;\n const width = this.scrollableColumns[scrollIdx].width;\n\n return {\n row,\n col: colIndex,\n localX: canvasX - cellScreenX,\n localY,\n isFrozen: false,\n cellRect: { x: cellScreenX, y: cellScreenY, width, height: this.rowHeight },\n };\n }\n\n public hitTestColumnResize(\n canvasX: number,\n canvasY: number,\n scrollLeft: number\n ): { colIndex: number; isFrozen: boolean } | null {\n if (canvasY > this.headerHeight || canvasY < 0) return null;\n\n let curX = this.rowNumberWidth;\n for (let i = 0; i < this.frozenColumns.length; i++) {\n curX += this.frozenColumns[i].width;\n if (Math.abs(canvasX - curX) <= 4) {\n return { colIndex: i, isFrozen: true };\n }\n }\n\n if (canvasX >= this.totalFrozenWidth) {\n for (let i = 0; i < this.scrollableColumns.length; i++) {\n const borderX =\n this.totalFrozenWidth + this.scrollableColOffsets[i + 1] - scrollLeft;\n if (Math.abs(canvasX - borderX) <= 4) {\n return { colIndex: this.frozenColumns.length + i, isFrozen: false };\n }\n }\n }\n\n return null;\n }\n}\n","import { CellCoords, CellRange } from '../types/grid';\n\nexport class SelectionModel {\n public activeCell: CellCoords = { row: 0, col: 0 };\n public selectionRange: CellRange | null = null;\n public isSelecting: boolean = false;\n\n public setActiveCell(row: number, col: number): void {\n this.activeCell = { row, col };\n this.selectionRange = { startRow: row, startCol: col, endRow: row, endCol: col };\n }\n\n public setRangeEnd(row: number, col: number): void {\n if (!this.selectionRange) {\n this.selectionRange = { startRow: this.activeCell.row, startCol: this.activeCell.col, endRow: row, endCol: col };\n } else {\n this.selectionRange = {\n ...this.selectionRange,\n endRow: row,\n endCol: col,\n };\n }\n }\n\n public getNormalizedRange(): { minRow: number; maxRow: number; minCol: number; maxCol: number } {\n if (!this.selectionRange) {\n return {\n minRow: this.activeCell.row,\n maxRow: this.activeCell.row,\n minCol: this.activeCell.col,\n maxCol: this.activeCell.col,\n };\n }\n\n return {\n minRow: Math.min(this.selectionRange.startRow, this.selectionRange.endRow),\n maxRow: Math.max(this.selectionRange.startRow, this.selectionRange.endRow),\n minCol: Math.min(this.selectionRange.startCol, this.selectionRange.endCol),\n maxCol: Math.max(this.selectionRange.startCol, this.selectionRange.endCol),\n };\n }\n\n public isCellSelected(row: number, col: number): boolean {\n const { minRow, maxRow, minCol, maxCol } = this.getNormalizedRange();\n return row >= minRow && row <= maxRow && col >= minCol && col <= maxCol;\n }\n\n public hasMultiCellSelection(): boolean {\n const { minRow, maxRow, minCol, maxCol } = this.getNormalizedRange();\n return minRow !== maxRow || minCol !== maxCol;\n }\n}\n","export interface GridCommand {\n description?: string;\n undo: () => void;\n redo: () => void;\n}\n\nexport class HistoryManager {\n private undoStack: GridCommand[] = [];\n private redoStack: GridCommand[] = [];\n private maxHistory: number = 50;\n\n constructor(maxHistory: number = 50) {\n this.maxHistory = maxHistory;\n }\n\n public push(command: GridCommand): void {\n this.undoStack.push(command);\n if (this.undoStack.length > this.maxHistory) {\n this.undoStack.shift();\n }\n // Yeni bir işlem yapıldığında redo stack temizlenir\n this.redoStack = [];\n }\n\n public undo(): boolean {\n const cmd = this.undoStack.pop();\n if (!cmd) return false;\n cmd.undo();\n this.redoStack.push(cmd);\n return true;\n }\n\n public redo(): boolean {\n const cmd = this.redoStack.pop();\n if (!cmd) return false;\n cmd.redo();\n this.undoStack.push(cmd);\n return true;\n }\n\n public canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n public canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n public clear(): void {\n this.undoStack = [];\n this.redoStack = [];\n }\n}\n","import { FilterDescriptor, FilterOperation, SingleFilter } from '../types/filter';\n\nexport const BLANK_FILTER_TOKEN = '__SHEETGL_BLANK__';\n\ninterface CompiledSetCache {\n rawSet: Set<any>;\n lowerSet: Set<string>;\n hasBlank: boolean;\n}\n\nexport class FilterEngine {\n private static inSetCache = new WeakMap<any[], CompiledSetCache>();\n\n private static getCompiledSet(targetVal: any[]): CompiledSetCache {\n let cached = this.inSetCache.get(targetVal);\n if (!cached) {\n const rawSet = new Set<any>();\n const lowerSet = new Set<string>();\n let hasBlank = false;\n for (let i = 0; i < targetVal.length; i++) {\n const t = targetVal[i];\n if (t === BLANK_FILTER_TOKEN || t === '' || t === null || t === undefined) {\n hasBlank = true;\n } else {\n rawSet.add(t);\n if (typeof t === 'string') {\n lowerSet.add(t.toLowerCase());\n } else {\n lowerSet.add(String(t).toLowerCase());\n }\n }\n }\n cached = { rawSet, lowerSet, hasBlank };\n this.inSetCache.set(targetVal, cached);\n }\n return cached;\n }\n\n public static evaluateRow(row: Record<string, any>, filter: FilterDescriptor | null): boolean {\n if (!filter || !Array.isArray(filter) || filter.length === 0) {\n return true;\n }\n\n if (this.isSingleFilter(filter)) {\n return this.evaluateSingleFilter(row, filter as SingleFilter);\n }\n\n let logicalOp: 'and' | 'or' = 'and';\n let currentResult = true;\n\n for (let i = 0; i < filter.length; i++) {\n const item = filter[i];\n\n if (typeof item === 'string') {\n const lower = item.toLowerCase();\n if (lower === 'and' || lower === 'or') {\n logicalOp = lower;\n }\n continue;\n }\n\n const itemResult = this.evaluateRow(row, item as FilterDescriptor);\n\n if (i === 0) {\n currentResult = itemResult;\n } else {\n if (logicalOp === 'and') {\n currentResult = currentResult && itemResult;\n if (!currentResult) return false;\n } else {\n currentResult = currentResult || itemResult;\n if (currentResult) return true;\n }\n }\n }\n\n return currentResult;\n }\n\n private static isSingleFilter(filter: any[]): boolean {\n return (\n filter.length === 3 &&\n typeof filter[0] === 'string' &&\n typeof filter[1] === 'string' &&\n !['and', 'or'].includes(filter[1].toLowerCase())\n );\n }\n\n private static evaluateSingleFilter(row: Record<string, any>, [field, op, targetVal]: SingleFilter): boolean {\n const rawVal = row[field];\n return this.match(rawVal, op, targetVal);\n }\n\n public static parseNumeric(val: any): number {\n if (typeof val === 'number') return val;\n if (val === null || val === undefined || val === '') return NaN;\n const raw = String(val)\n .replace(/[^0-9.,+-]/g, '')\n .trim();\n if (!raw) return NaN;\n\n const hasDot = raw.includes('.');\n const hasComma = raw.includes(',');\n\n if (hasDot && hasComma) {\n if (raw.lastIndexOf(',') > raw.lastIndexOf('.')) {\n // TR/EU format: 15.000,47 -> 15000.47\n return parseFloat(raw.replace(/\\./g, '').replace(',', '.'));\n } else {\n // US/UK format: 15,000.47 -> 15000.47\n return parseFloat(raw.replace(/,/g, ''));\n }\n }\n\n if (hasComma) {\n // Check if multiple commas or 3-digit grouping like 40,000,000\n if (/^[+-]?\\d{1,3}(,\\d{3}){2,}$/.test(raw)) {\n return parseFloat(raw.replace(/,/g, ''));\n }\n // Decimal comma: 15000,47 -> 15000.47\n return parseFloat(raw.replace(',', '.'));\n }\n\n if (hasDot) {\n // TR/EU thousands separator without decimals: 15.000 or 400.000 or 1.250.000\n if (/^[+-]?\\d{1,3}(\\.\\d{3})+$/.test(raw)) {\n return parseFloat(raw.replace(/\\./g, ''));\n }\n return parseFloat(raw);\n }\n\n return parseFloat(raw);\n }\n\n private static stringifyValue(rawVal: any): string {\n if (rawVal === null || rawVal === undefined) return '';\n if (Array.isArray(rawVal)) return rawVal.join(', ');\n if (typeof rawVal === 'object') {\n return Object.entries(rawVal)\n .map(([k, v]) => `${k}: ${String(v)}`)\n .join(' • ');\n }\n return String(rawVal);\n }\n\n private static matchesFormattedNumber(numVal: number, targetStr: string, mode: 'contains' | 'startswith' | 'endswith'): boolean {\n const tr2 = numVal.toLocaleString('tr-TR', { minimumFractionDigits: 2, maximumFractionDigits: 2 }).toLowerCase();\n const tr0 = numVal.toLocaleString('tr-TR').toLowerCase();\n const en2 = numVal.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }).toLowerCase();\n const cleanTarget = targetStr.replace(/[$€₺£%\\s]/g, '').trim();\n if (!cleanTarget) return false;\n\n if (mode === 'contains') {\n return tr2.includes(cleanTarget) || tr0.includes(cleanTarget) || en2.includes(cleanTarget);\n }\n if (mode === 'startswith') {\n return tr2.startsWith(cleanTarget) || tr0.startsWith(cleanTarget) || en2.startsWith(cleanTarget);\n }\n return tr2.endsWith(cleanTarget) || tr0.endsWith(cleanTarget) || en2.endsWith(cleanTarget);\n }\n\n public static match(rawVal: any, op: FilterOperation, targetVal: any): boolean {\n const isRawBlank =\n rawVal === null ||\n rawVal === undefined ||\n rawVal === '' ||\n (Array.isArray(rawVal) && rawVal.length === 0) ||\n (typeof rawVal === 'object' && !Array.isArray(rawVal) && Object.keys(rawVal).length === 0);\n\n if (op === 'in') {\n if (!Array.isArray(targetVal) || targetVal.length === 0) return false;\n const compiled = this.getCompiledSet(targetVal);\n if (isRawBlank) return compiled.hasBlank;\n if (Array.isArray(rawVal)) {\n for (let i = 0; i < rawVal.length; i++) {\n const elem = rawVal[i];\n if (compiled.rawSet.has(elem) || compiled.lowerSet.has(String(elem).toLowerCase())) {\n return true;\n }\n }\n return false;\n }\n if (compiled.rawSet.has(rawVal)) return true;\n return compiled.lowerSet.has(this.stringifyValue(rawVal).toLowerCase());\n }\n\n if (op === 'notin') {\n if (!Array.isArray(targetVal) || targetVal.length === 0) return true;\n const compiled = this.getCompiledSet(targetVal);\n if (isRawBlank) return !compiled.hasBlank;\n if (Array.isArray(rawVal)) {\n for (let i = 0; i < rawVal.length; i++) {\n const elem = rawVal[i];\n if (compiled.rawSet.has(elem) || compiled.lowerSet.has(String(elem).toLowerCase())) {\n return false;\n }\n }\n return true;\n }\n if (compiled.rawSet.has(rawVal)) return false;\n return !compiled.lowerSet.has(this.stringifyValue(rawVal).toLowerCase());\n }\n\n if (op === '=' && (targetVal === null || targetVal === undefined || targetVal === '' || targetVal === BLANK_FILTER_TOKEN)) {\n return isRawBlank;\n }\n\n if (isRawBlank) {\n return op === '<>' || op === 'notcontains';\n }\n\n const valStr = this.stringifyValue(rawVal).toLowerCase();\n const targetStr = String(targetVal ?? '').toLowerCase().trim();\n const numRaw = typeof rawVal === 'number' ? rawVal : this.parseNumeric(rawVal);\n const numTarget = this.parseNumeric(targetVal);\n const bothNumeric = typeof rawVal === 'number' && !isNaN(numTarget);\n\n switch (op) {\n case 'contains':\n if (valStr.includes(targetStr)) return true;\n if (typeof rawVal === 'number') {\n return this.matchesFormattedNumber(rawVal, targetStr, 'contains');\n }\n return false;\n case 'notcontains':\n if (valStr.includes(targetStr)) return false;\n if (typeof rawVal === 'number' && this.matchesFormattedNumber(rawVal, targetStr, 'contains')) {\n return false;\n }\n return true;\n case 'startswith':\n if (valStr.startsWith(targetStr)) return true;\n if (typeof rawVal === 'number') {\n return this.matchesFormattedNumber(rawVal, targetStr, 'startswith');\n }\n return false;\n case 'endswith':\n if (valStr.endsWith(targetStr)) return true;\n if (typeof rawVal === 'number') {\n return this.matchesFormattedNumber(rawVal, targetStr, 'endswith');\n }\n return false;\n case '=':\n if (bothNumeric) {\n return Math.abs(numRaw - numTarget) < 0.0001;\n }\n if (typeof rawVal === 'boolean') {\n if (typeof targetVal === 'boolean') return rawVal === targetVal;\n const bTarget = ['true', '1', 'evet', 'doğru', 'yes'].includes(targetStr);\n return rawVal === bTarget;\n }\n return valStr === targetStr;\n case '<>':\n if (bothNumeric) {\n return Math.abs(numRaw - numTarget) >= 0.0001;\n }\n return valStr !== targetStr;\n case '<':\n if (bothNumeric) return numRaw < numTarget;\n return valStr < targetStr;\n case '<=':\n if (bothNumeric) return numRaw <= numTarget;\n return valStr <= targetStr;\n case '>':\n if (bothNumeric) return numRaw > numTarget;\n return valStr > targetStr;\n case '>=':\n if (bothNumeric) return numRaw >= numTarget;\n return valStr >= targetStr;\n case 'between': {\n const [minRaw, maxRaw] = Array.isArray(targetVal) ? targetVal : [0, 0];\n const minNum = this.parseNumeric(minRaw);\n const maxNum = this.parseNumeric(maxRaw);\n if (typeof rawVal === 'number' && !isNaN(minNum) && !isNaN(maxNum)) {\n const lo = Math.min(minNum, maxNum);\n const hi = Math.max(minNum, maxNum);\n return rawVal >= lo && rawVal <= hi;\n }\n const minS = String(minRaw ?? '').toLowerCase().trim();\n const maxS = String(maxRaw ?? '').toLowerCase().trim();\n return valStr >= minS && valStr <= maxS;\n }\n default:\n return true;\n }\n }\n\n public static buildRowSearchIndex(row: Record<string, any>): string {\n const parts: string[] = [];\n for (const k in row) {\n if (k.startsWith('__') || k === 'sparkline') continue;\n const v = row[k];\n if (v !== null && v !== undefined && v !== '') {\n parts.push(this.stringifyValue(v));\n }\n }\n const idx = parts.join('\\x1f').toLowerCase();\n row.__searchIndex = idx;\n return idx;\n }\n\n public static matchSearch(row: Record<string, any>, cleanKeyword: string): boolean {\n if (!cleanKeyword) return true;\n const indexStr: string = row.__searchIndex ?? this.buildRowSearchIndex(row);\n return indexStr.includes(cleanKeyword);\n }\n}\n","import { ColumnDef, IDeferred, ValidationRule, ValidationRuleResult } from '../types/grid';\nimport { FilterEngine } from './FilterEngine';\n\nexport interface ValidationOutcome {\n valid: boolean;\n message?: string;\n isAsync?: boolean;\n}\n\n/**\n * DevExtreme-compatible Deferred class for asynchronous backend validation.\n * Supports:\n * - `d.resolve(true)` or `d.resolve()` -> Valid\n * - `d.resolve(false)` -> Invalid (displays rule.message)\n * - `d.reject(\"Custom backend error message\")` -> Invalid (displays custom message)\n * - `return d.promise()` or `return d`\n */\nexport class Deferred<T = ValidationRuleResult> implements IDeferred<T> {\n private _promise: Promise<ValidationRuleResult>;\n private _resolve!: (val: ValidationRuleResult) => void;\n\n constructor() {\n this._promise = new Promise<ValidationRuleResult>((res) => {\n this._resolve = res;\n });\n }\n\n public resolve = (result?: T): void => {\n if (result === undefined) {\n this._resolve(true);\n } else {\n this._resolve(result as unknown as ValidationRuleResult);\n }\n };\n\n public reject = (errorMessage?: string | { valid?: boolean; message?: string }): void => {\n if (typeof errorMessage === 'string' && errorMessage.trim()) {\n this._resolve({ valid: false, message: errorMessage });\n } else if (errorMessage && typeof errorMessage === 'object') {\n this._resolve({ valid: false, message: errorMessage.message });\n } else {\n this._resolve(false);\n }\n };\n\n public promise = (): Promise<ValidationRuleResult> => {\n return this._promise;\n };\n}\n\nexport function createDeferred<T = ValidationRuleResult>(): Deferred<T> {\n return new Deferred<T>();\n}\n\nconst EMAIL_REGEX = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst URL_REGEX = /^(https?:\\/\\/)?([\\w-]+\\.)+[\\w-]{2,}(\\/\\S*)?$/i;\n\nexport class ValidationEngine {\n private static normalizeResult(\n res: ValidationRuleResult,\n fallbackMsg: string\n ): { valid: boolean; message?: string } {\n if (typeof res === 'boolean') {\n return res ? { valid: true } : { valid: false, message: fallbackMsg };\n }\n if (typeof res === 'string') {\n return res.trim() === '' ? { valid: true } : { valid: false, message: res };\n }\n if (res && typeof res === 'object') {\n return {\n valid: Boolean(res.valid),\n message: res.valid ? undefined : res.message || fallbackMsg,\n };\n }\n return { valid: true };\n }\n\n private static isEmpty(val: any): boolean {\n if (val === null || val === undefined) return true;\n if (typeof val === 'string' && val.trim() === '') return true;\n if (Array.isArray(val) && val.length === 0) return true;\n if (typeof val === 'object' && !Array.isArray(val) && Object.keys(val).length === 0) {\n return true;\n }\n return false;\n }\n\n public static async validateCell(\n value: any,\n row: Record<string, any>,\n column: ColumnDef,\n isTR: boolean = false\n ): Promise<ValidationOutcome> {\n const colTitle = column.title.replace(' ⚡', '');\n\n // 1. Evaluate declarative validationRules (static & async)\n if (column.validationRules && column.validationRules.length > 0) {\n for (const rule of column.validationRules) {\n const outcome = await this.evaluateSingleRule(rule, value, row, column, colTitle, isTR);\n if (!outcome.valid) {\n return outcome;\n }\n }\n }\n\n // 2. Evaluate column.validator callback (supports sync or async Promise)\n if (column.validator) {\n const fallbackMsg = isTR\n ? `${colTitle}: Geçersiz değer!`\n : `${colTitle}: Invalid cell value!`;\n const maybePromise = column.validator(value, row, column);\n const isAsync = maybePromise instanceof Promise;\n const resolved = isAsync ? await maybePromise : maybePromise;\n const norm = this.normalizeResult(resolved, fallbackMsg);\n if (!norm.valid) {\n return { ...norm, isAsync };\n }\n }\n\n return { valid: true };\n }\n\n private static async evaluateSingleRule(\n rule: ValidationRule,\n value: any,\n row: Record<string, any>,\n column: ColumnDef,\n colTitle: string,\n isTR: boolean\n ): Promise<ValidationOutcome> {\n switch (rule.type) {\n case 'required': {\n if (this.isEmpty(value)) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR ? `${colTitle} alanı boş bırakılamaz!` : `${colTitle} is required!`),\n };\n }\n return { valid: true };\n }\n\n case 'range': {\n if (this.isEmpty(value)) return { valid: true };\n const num = FilterEngine.parseNumeric(value);\n if (isNaN(num)) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR ? `${colTitle} geçerli bir sayı olmalıdır!` : `${colTitle} must be a number!`),\n };\n }\n if (rule.min !== undefined && num < rule.min) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR\n ? `${colTitle} en az ${rule.min.toLocaleString('tr-TR')} olmalıdır!`\n : `${colTitle} must be at least ${rule.min.toLocaleString('en-US')}!`),\n };\n }\n if (rule.max !== undefined && num > rule.max) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR\n ? `${colTitle} en fazla ${rule.max.toLocaleString('tr-TR')} olabilir!`\n : `${colTitle} cannot exceed ${rule.max.toLocaleString('en-US')}!`),\n };\n }\n return { valid: true };\n }\n\n case 'stringLength': {\n if (this.isEmpty(value)) return { valid: true };\n const len = String(value).trim().length;\n if (rule.min !== undefined && len < rule.min) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR\n ? `${colTitle} en az ${rule.min} karakter olmalıdır!`\n : `${colTitle} must be at least ${rule.min} characters!`),\n };\n }\n if (rule.max !== undefined && len > rule.max) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR\n ? `${colTitle} en fazla ${rule.max} karakter olabilir!`\n : `${colTitle} must be at most ${rule.max} characters!`),\n };\n }\n return { valid: true };\n }\n\n case 'pattern': {\n if (this.isEmpty(value)) return { valid: true };\n const regex =\n typeof rule.pattern === 'string' ? new RegExp(rule.pattern) : rule.pattern;\n if (!regex.test(String(value).trim())) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR\n ? `${colTitle} beklenen formata uymuyor!`\n : `${colTitle} does not match the required pattern!`),\n };\n }\n return { valid: true };\n }\n\n case 'email': {\n if (this.isEmpty(value)) return { valid: true };\n if (!EMAIL_REGEX.test(String(value).trim())) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR\n ? `${colTitle}: Geçerli bir e-posta adresi girin!`\n : `${colTitle}: Enter a valid email address!`),\n };\n }\n return { valid: true };\n }\n\n case 'url': {\n if (this.isEmpty(value)) return { valid: true };\n if (!URL_REGEX.test(String(value).trim())) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR\n ? `${colTitle}: Geçerli bir URL girin!`\n : `${colTitle}: Enter a valid URL!`),\n };\n }\n return { valid: true };\n }\n\n case 'compare': {\n const target = rule.comparisonTarget(row);\n const op = rule.comparisonType || '==';\n const a = FilterEngine.parseNumeric(value);\n const b = FilterEngine.parseNumeric(target);\n const useNum = !isNaN(a) && !isNaN(b);\n const left = useNum ? a : value;\n const right = useNum ? b : target;\n\n let ok = true;\n if (op === '==') ok = left === right;\n else if (op === '!=') ok = left !== right;\n else if (op === '<') ok = left < right;\n else if (op === '<=') ok = left <= right;\n else if (op === '>') ok = left > right;\n else if (op === '>=') ok = left >= right;\n\n if (!ok) {\n return {\n valid: false,\n message:\n rule.message ||\n (isTR\n ? `${colTitle} karşılaştırma kuralını sağlamıyor!`\n : `${colTitle} failed comparison validation!`),\n };\n }\n return { valid: true };\n }\n\n case 'custom': {\n const fallback =\n rule.message ||\n (isTR ? `${colTitle}: Doğrulama başarısız!` : `${colTitle}: Validation failed!`);\n const deferred = new Deferred<ValidationRuleResult>();\n const res = rule.validationCallback({ value, data: row, column, rule, deferred });\n return this.normalizeResult(res, fallback);\n }\n\n case 'async': {\n const fallback =\n rule.message ||\n (isTR\n ? `${colTitle}: Asenkron doğrulama başarısız!`\n : `${colTitle}: Async validation failed!`);\n const deferred = new Deferred<ValidationRuleResult>();\n try {\n const rawReturn = rule.validationCallback({ value, data: row, column, rule, deferred });\n let resolved: ValidationRuleResult;\n if (rawReturn && typeof (rawReturn as IDeferred).promise === 'function') {\n resolved = await (rawReturn as IDeferred).promise();\n } else if (rawReturn instanceof Promise) {\n resolved = await rawReturn;\n } else if (rawReturn === undefined) {\n // Developer used params.deferred.resolve(...) without returning\n resolved = await deferred.promise();\n } else {\n resolved = rawReturn as ValidationRuleResult;\n }\n return {\n ...this.normalizeResult(resolved, fallback),\n isAsync: true,\n };\n } catch (err: any) {\n const errMsg =\n typeof err === 'string' && err.trim()\n ? err\n : err && typeof err.message === 'string' && err.message.trim()\n ? err.message\n : fallback;\n return {\n valid: false,\n message: errMsg,\n isAsync: true,\n };\n }\n }\n\n default:\n return { valid: true };\n }\n }\n}\n","import { IColumnTypePlugin } from './IColumnTypePlugin';\n\nexport class ColumnTypeRegistry {\n private static plugins: Map<string, IColumnTypePlugin> = new Map();\n\n public static register(plugin: IColumnTypePlugin): void {\n this.plugins.set(plugin.type, plugin);\n }\n\n public static get(type: string): IColumnTypePlugin {\n const plugin = this.plugins.get(type);\n if (!plugin) {\n // Bulunamadıysa text eklentisine geri dön\n return this.plugins.get('text')!;\n }\n return plugin;\n }\n\n public static has(type: string): boolean {\n return this.plugins.has(type);\n }\n\n public static getAll(): IColumnTypePlugin[] {\n return Array.from(this.plugins.values());\n }\n}\n","import { VirtualRow } from '../types/group';\nimport { IGridThemeTokens } from '../theme/IGridTheme';\nimport { IGridLocale } from '../i18n/IGridLocale';\nimport { ColumnDef } from '../types/grid';\n\nexport class GroupRowPainter {\n public static paintGroupRow(\n ctx: CanvasRenderingContext2D,\n groupRow: Extract<VirtualRow, { type: 'group' }>,\n y: number,\n width: number,\n height: number,\n theme: IGridThemeTokens,\n locale: IGridLocale,\n columns?: ColumnDef[],\n isHovered?: boolean\n ): void {\n ctx.save();\n\n // 1. Background\n ctx.fillStyle = isHovered\n ? theme.isDark\n ? 'rgba(56, 189, 248, 0.14)'\n : 'rgba(2, 132, 199, 0.09)'\n : theme.canvas.groupRowBg;\n ctx.fillRect(0, y, width, height);\n\n // 2. Bottom Border\n ctx.strokeStyle = theme.canvas.groupRowBorder;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, y + height - 0.5);\n ctx.lineTo(width, y + height - 0.5);\n ctx.stroke();\n\n // 3. Left Accent Bar by Level\n ctx.fillStyle = theme.dom.accentColor;\n ctx.fillRect(groupRow.level * 6, y, 4, height);\n\n // 4. Interactive Expand/Collapse Button Box + Chevron (▶ / ▼)\n const indent = 16 + groupRow.level * 22;\n const midY = y + height / 2;\n const boxSize = 18;\n\n ctx.fillStyle = groupRow.isExpanded\n ? theme.dom.accentColor\n : theme.isDark\n ? 'rgba(255,255,255,0.1)'\n : 'rgba(0,0,0,0.07)';\n ctx.beginPath();\n ctx.roundRect(indent - boxSize / 2, midY - boxSize / 2, boxSize, boxSize, 4);\n ctx.fill();\n\n ctx.fillStyle = groupRow.isExpanded ? '#FFFFFF' : theme.canvas.groupRowText;\n ctx.beginPath();\n if (groupRow.isExpanded) {\n ctx.moveTo(indent - 4, midY - 2);\n ctx.lineTo(indent + 4, midY - 2);\n ctx.lineTo(indent, midY + 3);\n } else {\n ctx.moveTo(indent - 2, midY - 4);\n ctx.lineTo(indent - 2, midY + 4);\n ctx.lineTo(indent + 3, midY);\n }\n ctx.closePath();\n ctx.fill();\n\n // 5. Resolve human-readable Column Title & Value Label\n const colDef = columns?.find((c) => c.id === groupRow.field);\n const colTitle = colDef ? colDef.title.replace(' ⚡', '') : groupRow.field.toUpperCase();\n\n let displayVal = String(groupRow.value ?? locale.emptyText);\n if ((colDef?.type === 'select' || colDef?.type === 'dropdown') && colDef.options) {\n const opt = colDef.options.find((o) => o.value === groupRow.value);\n if (opt) displayVal = opt.label;\n } else if (colDef?.type === 'multiselect' && colDef.options) {\n displayVal = String(groupRow.value ?? '')\n .split(',')\n .map((s) => s.trim())\n .map((v) => colDef.options?.find((o) => o.value === v)?.label || v)\n .join(', ');\n } else if (colDef?.type === 'boolean') {\n displayVal = groupRow.value ? locale.trueText : locale.falseText;\n }\n\n // 6. Group Header Title + Count Badge\n ctx.fillStyle = theme.canvas.groupRowText;\n ctx.font = `700 ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n const title = `${colTitle}: ${displayVal}`;\n ctx.fillText(title, indent + 16, midY);\n\n const titleW = ctx.measureText(title).width;\n const countText = `${locale.groupRecordCount(groupRow.rowCount)}`;\n ctx.font = `600 ${theme.fontSize - 2}px ${theme.fontFamily}`;\n const countW = ctx.measureText(countText).width + 12;\n const badgeX = indent + 24 + titleW;\n\n ctx.fillStyle = theme.dom.badgeBg;\n ctx.beginPath();\n ctx.roundRect(badgeX, midY - 9, countW, 18, 9);\n ctx.fill();\n\n ctx.fillStyle = theme.dom.badgeText;\n ctx.textAlign = 'center';\n ctx.fillText(countText, badgeX + countW / 2, midY);\n\n // 7. Group Summaries on the right\n if (groupRow.summaries && Object.keys(groupRow.summaries).length > 0) {\n const summaryText = Object.entries(groupRow.summaries)\n .slice(0, 4)\n .map(([k, v]) => {\n const sCol = columns?.find((c) => c.id === k);\n const sTitle = sCol ? sCol.title.replace(' ⚡', '') : k;\n const sType = groupRow.summaryTypes?.[k] || 'sum';\n const numStr = Number(v).toLocaleString(locale.code, {\n maximumFractionDigits: 2,\n });\n return `${sTitle} (${sType.toUpperCase()}): ${sCol?.currencySymbol || ''}${numStr}`;\n })\n .join(' • ');\n\n ctx.fillStyle = theme.isDark ? '#98989D' : '#6E6E73';\n ctx.font = `600 ${theme.fontSize - 1}px ${theme.fontFamily}`;\n ctx.textAlign = 'right';\n ctx.fillText(summaryText, width - 24, midY);\n }\n\n ctx.restore();\n }\n}\n","import { IGridThemeTokens } from '../theme/IGridTheme';\n\nexport class SkeletonPainter {\n public static paintSkeletonCell(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n theme: IGridThemeTokens\n ): void {\n const padX = 10;\n const barH = 12;\n const barY = y + (height - barH) / 2;\n const barW = Math.max(30, width - padX * 2);\n\n ctx.save();\n ctx.fillStyle = theme.canvas.skeletonBar;\n ctx.beginPath();\n ctx.roundRect(x + padX, barY, barW, barH, 4);\n ctx.fill();\n ctx.restore();\n }\n}\n","import { GeometryEngine } from '../core/GeometryEngine';\nimport { SelectionModel } from '../core/SelectionModel';\nimport { IDataStore } from '../types/store';\nimport { IGridThemeTokens } from '../theme/IGridTheme';\nimport { ColumnTypeRegistry } from '../columns/ColumnTypeRegistry';\nimport { GroupRowPainter } from './GroupRowPainter';\nimport { SkeletonPainter } from './SkeletonPainter';\nimport { SortDescriptor } from '../types/filter';\nimport { IGridLocale } from '../i18n/IGridLocale';\nimport { ColumnDef, GridPermissions } from '../types/grid';\n\nexport interface RenderParams {\n canvas: HTMLCanvasElement;\n geometry: GeometryEngine;\n store: IDataStore;\n selection: SelectionModel;\n theme: IGridThemeTokens;\n locale: IGridLocale;\n scrollLeft: number;\n scrollTop: number;\n sortRules: SortDescriptor[];\n searchKeyword?: string;\n hoveredCell?: { row: number; col: number } | null;\n hoveredFilterColIndex?: number | null;\n activeFilterColumnIds?: Set<string>;\n fillDragRange?: { minRow: number; maxRow: number; minCol: number; maxCol: number } | null;\n loadingRowKeys?: Set<any>;\n permissions?: GridPermissions;\n}\n\nexport class CanvasRenderer {\n public static isColumnReadonly(col: ColumnDef, permissions?: GridPermissions): boolean {\n if (permissions?.mode === 'read' || permissions?.mode === 'readonly') return true;\n if (permissions?.allowUpdating === false) return true;\n if (col.readonly || col.permission === 'readonly' || col.permission === 'read') return true;\n return false;\n }\n\n public static render(params: RenderParams): void {\n const {\n canvas,\n geometry,\n store,\n selection,\n theme,\n locale,\n scrollLeft,\n scrollTop,\n sortRules,\n searchKeyword,\n hoveredCell,\n hoveredFilterColIndex,\n activeFilterColumnIds,\n fillDragRange,\n loadingRowKeys,\n permissions,\n } = params;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const dpr = typeof window !== 'undefined' ? window.devicePixelRatio || 1 : 1;\n const rect = canvas.getBoundingClientRect();\n const width = Math.round(rect.width) || canvas.clientWidth || 0;\n const height = Math.round(rect.height) || canvas.clientHeight || 0;\n\n if (width <= 0 || height <= 0) return;\n\n const targetPixelWidth = Math.round(width * dpr);\n const targetPixelHeight = Math.round(height * dpr);\n\n if (canvas.width !== targetPixelWidth || canvas.height !== targetPixelHeight) {\n canvas.width = targetPixelWidth;\n canvas.height = targetPixelHeight;\n }\n\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.save();\n ctx.scale(dpr, dpr);\n\n try {\n // 1. Background Fill\n ctx.fillStyle = theme.canvas.bg;\n ctx.fillRect(0, 0, width, height);\n\n const rowCount = store.getRowCount();\n const rowH = geometry.rowHeight;\n const headerH = geometry.headerHeight;\n const rowNumW = geometry.rowNumberWidth;\n\n // 2. Viewport Row Bounds\n const startRow = Math.max(0, Math.floor(scrollTop / rowH));\n const endRow = Math.min(rowCount - 1, Math.ceil((scrollTop + height - headerH) / rowH));\n\n if (rowCount > 0 && endRow >= startRow) {\n store.ensureRange(startRow, endRow);\n }\n\n // 3. Viewport Scrollable Column Bounds\n let startScrollColIdx = 0;\n let endScrollColIdx = geometry.scrollableColumns.length - 1;\n\n if (geometry.scrollableColumns.length > 0) {\n startScrollColIdx = geometry.findScrollableColIndexAtX(scrollLeft);\n endScrollColIdx = geometry.findScrollableColIndexAtX(\n scrollLeft + Math.max(0, width - geometry.totalFrozenWidth)\n );\n }\n\n const normSel = selection.getNormalizedRange();\n\n // ========================================================================\n // DATA ROWS & CELLS\n // ========================================================================\n for (let r = startRow; r <= endRow; r++) {\n const rowY = headerH + r * rowH - scrollTop;\n const vRow = store.getViewRow(r);\n\n if (!vRow) {\n SkeletonPainter.paintSkeletonCell(ctx, rowNumW, rowY, width - rowNumW, rowH, theme);\n continue;\n }\n\n if (vRow.type === 'group') {\n GroupRowPainter.paintGroupRow(\n ctx,\n vRow,\n rowY,\n width,\n rowH,\n theme,\n locale,\n geometry.columns,\n hoveredCell?.row === r\n );\n continue;\n }\n\n const rowData = vRow.data;\n const rowKey = rowData.id ?? r;\n const isRowInserted = store.isRowInserted?.(rowKey) ?? false;\n const isRowLoading = loadingRowKeys?.has(rowKey) ?? false;\n const isRowInActiveSel = r >= normSel.minRow && r <= normSel.maxRow;\n\n // 1. SCROLLABLE COLUMNS\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n geometry.totalFrozenWidth,\n headerH,\n Math.max(0, width - geometry.totalFrozenWidth),\n Math.max(0, height - headerH)\n );\n ctx.clip();\n\n for (let sc = startScrollColIdx; sc <= endScrollColIdx; sc++) {\n const colIdx = geometry.frozenColumns.length + sc;\n const col = geometry.columns[colIdx];\n if (!col) continue;\n\n const cellX = geometry.totalFrozenWidth + geometry.scrollableColOffsets[sc] - scrollLeft;\n this.renderCell(\n ctx,\n rowData,\n rowKey,\n r,\n col,\n colIdx,\n cellX,\n rowY,\n col.width,\n rowH,\n theme,\n locale,\n selection,\n store,\n hoveredCell,\n searchKeyword,\n isRowInserted,\n isRowLoading,\n permissions\n );\n }\n ctx.restore();\n\n // 2. FROZEN COLUMNS\n let curFrozenX = rowNumW;\n for (let fc = 0; fc < geometry.frozenColumns.length; fc++) {\n const col = geometry.frozenColumns[fc];\n ctx.fillStyle = theme.canvas.bg;\n ctx.fillRect(curFrozenX, rowY, col.width, rowH);\n\n this.renderCell(\n ctx,\n rowData,\n rowKey,\n r,\n col,\n fc,\n curFrozenX,\n rowY,\n col.width,\n rowH,\n theme,\n locale,\n selection,\n store,\n hoveredCell,\n searchKeyword,\n isRowInserted,\n isRowLoading,\n permissions\n );\n\n curFrozenX += col.width;\n }\n\n // 3. ROW NUMBER GUTTER (Leftmost)\n ctx.fillStyle = isRowInActiveSel\n ? theme.isDark\n ? 'rgba(10, 132, 255, 0.22)'\n : 'rgba(0, 122, 255, 0.12)'\n : theme.canvas.rowNumberBg;\n ctx.fillRect(0, rowY, rowNumW, rowH);\n\n // Inserted row left indicator bar\n if (isRowInserted) {\n ctx.fillStyle = '#30D158';\n ctx.fillRect(0, rowY, 4, rowH);\n } else if (isRowLoading) {\n ctx.fillStyle = '#FF9F0A';\n ctx.fillRect(0, rowY, 4, rowH);\n }\n\n ctx.fillStyle = isRowInActiveSel ? theme.dom.accentColor : theme.canvas.rowNumberText;\n ctx.font = `${isRowInActiveSel ? '700' : '500'} ${theme.fontSize - 1}px ${theme.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(isRowLoading ? '⟳' : String(r + 1), rowNumW / 2, rowY + rowH / 2);\n\n // Row number border\n ctx.strokeStyle = theme.canvas.rowNumberBorder;\n ctx.beginPath();\n ctx.moveTo(rowNumW - 0.5, rowY);\n ctx.lineTo(rowNumW - 0.5, rowY + rowH);\n ctx.moveTo(0, rowY + rowH - 0.5);\n ctx.lineTo(rowNumW, rowY + rowH - 0.5);\n ctx.stroke();\n }\n\n // Frozen column divider shadow\n if (geometry.frozenColumns.length > 0) {\n ctx.save();\n ctx.fillStyle = theme.canvas.frozenDividerShadow;\n ctx.fillRect(geometry.totalFrozenWidth, headerH, 3, height - headerH);\n ctx.restore();\n }\n\n // ========================================================================\n // FILL HANDLE DRAG PREVIEW RECTANGLE (Excel AutoFill Dashed Box)\n // ========================================================================\n if (fillDragRange && rowCount > 0) {\n const fTopY = headerH + fillDragRange.minRow * rowH - scrollTop;\n const fHeight = (fillDragRange.maxRow - fillDragRange.minRow + 1) * rowH;\n const fLeftRect = geometry.getColumnScreenRect(fillDragRange.minCol, scrollLeft);\n const fRightRect = geometry.getColumnScreenRect(fillDragRange.maxCol, scrollLeft);\n\n if (fLeftRect && fRightRect) {\n const fLeftX = fLeftRect.x;\n const fWidth = fRightRect.x + fRightRect.width - fLeftRect.x;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(rowNumW, headerH, width - rowNumW, height - headerH);\n ctx.clip();\n\n ctx.fillStyle = theme.isDark ? 'rgba(48, 209, 88, 0.14)' : 'rgba(52, 199, 89, 0.12)';\n ctx.fillRect(fLeftX, fTopY, fWidth, fHeight);\n\n ctx.strokeStyle = theme.isDark ? '#30D158' : '#28CD41';\n ctx.lineWidth = 2;\n ctx.setLineDash([5, 3]);\n ctx.strokeRect(fLeftX, fTopY, fWidth, fHeight);\n ctx.restore();\n }\n }\n\n // ========================================================================\n // SELECTION HIGHLIGHT, CORNER FILL HANDLE & RIGHT DUPLICATE HANDLE\n // ========================================================================\n const activeViewRowForSel = store.getViewRow(normSel.minRow);\n const isSingleGroupRowSelected =\n normSel.minRow === normSel.maxRow && activeViewRowForSel?.type === 'group';\n\n if (\n !isSingleGroupRowSelected &&\n rowCount > 0 &&\n normSel.minRow <= endRow &&\n normSel.maxRow >= startRow\n ) {\n const rTopY = headerH + normSel.minRow * rowH - scrollTop;\n const rHeight = (normSel.maxRow - normSel.minRow + 1) * rowH;\n\n const leftColRect = geometry.getColumnScreenRect(normSel.minCol, scrollLeft);\n const rightColRect = geometry.getColumnScreenRect(normSel.maxCol, scrollLeft);\n\n if (leftColRect && rightColRect) {\n const rLeftX = leftColRect.x;\n const rWidth = rightColRect.x + rightColRect.width - leftColRect.x;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(rowNumW, headerH, width - rowNumW, height - headerH);\n ctx.clip();\n\n // Selection translucent fill\n ctx.fillStyle = theme.canvas.selectionFill;\n ctx.fillRect(rLeftX, rTopY, rWidth, rHeight);\n\n // Selection border\n ctx.strokeStyle = theme.canvas.selectionBorder;\n ctx.lineWidth = 2;\n ctx.strokeRect(rLeftX, rTopY, rWidth, rHeight);\n\n const activeColDef = geometry.columns[normSel.maxCol];\n const isSpecialNonDuplicatable =\n !activeColDef ||\n activeColDef.type === 'sparkline' ||\n activeColDef.type === 'action' ||\n this.isColumnReadonly(activeColDef, permissions);\n\n const canDuplicate =\n !isSpecialNonDuplicatable &&\n permissions?.mode !== 'read' &&\n permissions?.mode !== 'readonly' &&\n permissions?.allowUpdating !== false &&\n permissions?.allowDuplicating !== false;\n\n if (canDuplicate) {\n // 1. Bottom-Right Corner Fill Handle (Excel Square)\n const fhSize = 8;\n const fhX = rLeftX + rWidth - fhSize / 2;\n const fhY = rTopY + rHeight - fhSize / 2;\n ctx.fillStyle = theme.canvas.fillHandleColor;\n ctx.fillRect(fhX, fhY, fhSize, fhSize);\n ctx.strokeStyle = theme.canvas.bg;\n ctx.lineWidth = 1.5;\n ctx.strokeRect(fhX, fhY, fhSize, fhSize);\n\n // 2. Right-Side Quick Cell Duplicate Handle (\"+\" pill on right edge)\n const dupSize = 14;\n const dupX = rLeftX + rWidth - dupSize / 2;\n const dupY = rTopY + rHeight / 2 - dupSize / 2;\n\n ctx.fillStyle = theme.dom.accentColor;\n ctx.beginPath();\n ctx.roundRect(dupX, dupY, dupSize, dupSize, 4);\n ctx.fill();\n\n ctx.strokeStyle = theme.canvas.bg;\n ctx.lineWidth = 1.2;\n ctx.stroke();\n\n // Draw tiny '+' inside the right duplicate handle\n const cx = dupX + dupSize / 2;\n const cy = dupY + dupSize / 2;\n ctx.strokeStyle = '#FFFFFF';\n ctx.lineWidth = 1.5;\n ctx.beginPath();\n ctx.moveTo(cx - 3, cy);\n ctx.lineTo(cx + 3, cy);\n ctx.moveTo(cx, cy - 3);\n ctx.lineTo(cx, cy + 3);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }\n\n // ========================================================================\n // COLUMN HEADERS (FIXED AT TOP)\n // ========================================================================\n this.renderHeaders(\n ctx,\n geometry,\n store,\n theme,\n scrollLeft,\n width,\n headerH,\n rowNumW,\n sortRules,\n normSel,\n hoveredFilterColIndex,\n activeFilterColumnIds,\n permissions\n );\n } finally {\n ctx.restore();\n }\n }\n\n private static renderCell(\n ctx: CanvasRenderingContext2D,\n rowData: Record<string, any>,\n rowKey: any,\n rowIndex: number,\n col: ColumnDef,\n colIdx: number,\n cellX: number,\n rowY: number,\n colW: number,\n rowH: number,\n theme: IGridThemeTokens,\n locale: IGridLocale,\n selection: SelectionModel,\n store: IDataStore,\n hoveredCell?: { row: number; col: number } | null,\n searchKeyword?: string,\n isRowInserted?: boolean,\n isRowLoading?: boolean,\n permissions?: GridPermissions\n ): void {\n const cellVal = rowData[col.id];\n const isHovered = hoveredCell?.row === rowIndex && hoveredCell?.col === colIdx;\n const isReadonly =\n this.isColumnReadonly(col, permissions) ||\n (col.canEdit ? !col.canEdit(rowData, col) : false);\n const isDirty = store.isCellDirty?.(rowKey, col.id) ?? false;\n const isColDirty = store.isColumnDirty?.(col.id) ?? false;\n\n // DevExtreme-style background for dirty cells (dx-cell-modified), dirty columns, inserted rows, loading, or readonly\n if (isRowLoading) {\n ctx.fillStyle = theme.isDark ? 'rgba(255, 159, 10, 0.14)' : 'rgba(255, 149, 0, 0.10)';\n ctx.fillRect(cellX, rowY, colW, rowH);\n } else if (isDirty) {\n // DevExtreme dx-cell-modified distinct green highlight\n ctx.fillStyle = theme.isDark ? 'rgba(34, 197, 94, 0.22)' : 'rgba(22, 163, 74, 0.15)';\n ctx.fillRect(cellX, rowY, colW, rowH);\n } else if (isRowInserted) {\n // DevExtreme dx-row-inserted highlight\n ctx.fillStyle = theme.isDark ? 'rgba(48, 209, 88, 0.10)' : 'rgba(52, 199, 89, 0.08)';\n ctx.fillRect(cellX, rowY, colW, rowH);\n } else if (isColDirty) {\n // Subtle column-wide tint when this column has uncommitted modifications\n ctx.fillStyle = theme.isDark ? 'rgba(34, 197, 94, 0.05)' : 'rgba(22, 163, 74, 0.04)';\n ctx.fillRect(cellX, rowY, colW, rowH);\n } else if (isReadonly && col.type !== 'action' && col.type !== 'sparkline') {\n ctx.fillStyle = theme.isDark ? 'rgba(255, 255, 255, 0.018)' : 'rgba(0, 0, 0, 0.018)';\n ctx.fillRect(cellX, rowY, colW, rowH);\n }\n\n // Search keyword highlight\n if (\n searchKeyword &&\n cellVal != null &&\n String(cellVal).toLowerCase().includes(searchKeyword.toLowerCase())\n ) {\n ctx.fillStyle = theme.canvas.searchHighlight;\n ctx.fillRect(cellX, rowY, colW, rowH);\n }\n\n // Column type plugin paint\n const plugin = ColumnTypeRegistry.get(col.type);\n plugin.paint({\n ctx,\n value: cellVal,\n row: rowData,\n rowIndex,\n column: col,\n theme,\n locale,\n x: cellX,\n y: rowY,\n width: colW,\n height: rowH,\n isSelected: selection.isCellSelected(rowIndex, colIdx),\n isHovered,\n isReadonly,\n isDirty,\n });\n\n // DevExtreme dx-cell-modified Crisp Green Cell Border + Top-Right Triangle Indicator\n if (isDirty) {\n ctx.save();\n const dirtyStroke = theme.isDark ? '#22C55E' : '#16A34A';\n ctx.strokeStyle = dirtyStroke;\n ctx.lineWidth = 1.5;\n ctx.strokeRect(cellX + 0.75, rowY + 0.75, colW - 1.5, rowH - 1.5);\n\n ctx.fillStyle = dirtyStroke;\n ctx.beginPath();\n ctx.moveTo(cellX + colW - 8, rowY);\n ctx.lineTo(cellX + colW, rowY);\n ctx.lineTo(cellX + colW, rowY + 8);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n }\n\n // Cell Grid Lines\n ctx.strokeStyle = theme.canvas.gridLine;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(cellX + colW - 0.5, rowY);\n ctx.lineTo(cellX + colW - 0.5, rowY + rowH);\n ctx.moveTo(cellX, rowY + rowH - 0.5);\n ctx.lineTo(cellX + colW, rowY + rowH - 0.5);\n ctx.stroke();\n }\n\n private static renderHeaders(\n ctx: CanvasRenderingContext2D,\n geometry: GeometryEngine,\n store: IDataStore,\n theme: IGridThemeTokens,\n scrollLeft: number,\n width: number,\n headerH: number,\n rowNumW: number,\n sortRules: SortDescriptor[],\n normSel: { minRow: number; maxRow: number; minCol: number; maxCol: number },\n hoveredFilterColIndex?: number | null,\n activeFilterColumnIds?: Set<string>,\n permissions?: GridPermissions\n ): void {\n // 1. SCROLLABLE HEADERS\n ctx.save();\n ctx.beginPath();\n ctx.rect(geometry.totalFrozenWidth, 0, Math.max(0, width - geometry.totalFrozenWidth), headerH);\n ctx.clip();\n\n ctx.fillStyle = theme.canvas.headerBg;\n ctx.fillRect(geometry.totalFrozenWidth, 0, Math.max(0, width - geometry.totalFrozenWidth), headerH);\n\n for (let i = 0; i < geometry.scrollableColumns.length; i++) {\n const col = geometry.scrollableColumns[i];\n const colIdx = geometry.frozenColumns.length + i;\n const x = geometry.totalFrozenWidth + geometry.scrollableColOffsets[i] - scrollLeft;\n this.renderSingleHeader(\n ctx,\n col,\n colIdx,\n x,\n 0,\n col.width,\n headerH,\n theme,\n sortRules,\n colIdx >= normSel.minCol && colIdx <= normSel.maxCol,\n hoveredFilterColIndex === colIdx,\n activeFilterColumnIds?.has(col.id) ?? false,\n store.isColumnDirty?.(col.id) ?? false,\n permissions\n );\n }\n ctx.restore();\n\n // 2. FROZEN HEADERS\n let curX = rowNumW;\n for (let i = 0; i < geometry.frozenColumns.length; i++) {\n const col = geometry.frozenColumns[i];\n ctx.fillStyle = theme.canvas.headerBg;\n ctx.fillRect(curX, 0, col.width, headerH);\n this.renderSingleHeader(\n ctx,\n col,\n i,\n curX,\n 0,\n col.width,\n headerH,\n theme,\n sortRules,\n i >= normSel.minCol && i <= normSel.maxCol,\n hoveredFilterColIndex === i,\n activeFilterColumnIds?.has(col.id) ?? false,\n store.isColumnDirty?.(col.id) ?? false,\n permissions\n );\n curX += col.width;\n }\n\n // 3. TOP-LEFT CORNER BOX (Select All)\n ctx.fillStyle = theme.canvas.rowNumberBg;\n ctx.fillRect(0, 0, rowNumW, headerH);\n ctx.strokeStyle = theme.canvas.headerBorder;\n ctx.strokeRect(0, 0, rowNumW, headerH);\n\n // Draw subtle corner triangle in top-left select-all box\n ctx.fillStyle = theme.isDark ? 'rgba(255,255,255,0.25)' : 'rgba(0,0,0,0.22)';\n ctx.beginPath();\n ctx.moveTo(rowNumW - 8, headerH - 16);\n ctx.lineTo(rowNumW - 8, headerH - 6);\n ctx.lineTo(rowNumW - 18, headerH - 6);\n ctx.closePath();\n ctx.fill();\n\n // Frozen header divider shadow\n if (geometry.frozenColumns.length > 0) {\n ctx.save();\n ctx.fillStyle = theme.canvas.frozenDividerShadow;\n ctx.fillRect(geometry.totalFrozenWidth, 0, 3, headerH);\n ctx.restore();\n }\n }\n\n private static renderSingleHeader(\n ctx: CanvasRenderingContext2D,\n col: ColumnDef,\n colIdx: number,\n x: number,\n y: number,\n w: number,\n h: number,\n theme: IGridThemeTokens,\n sortRules: SortDescriptor[],\n isColSelected: boolean,\n isFilterHovered: boolean,\n isFilterActive: boolean,\n isColumnDirty: boolean,\n permissions?: GridPermissions\n ): void {\n ctx.save();\n\n if (isColumnDirty) {\n ctx.fillStyle = theme.isDark ? 'rgba(34, 197, 94, 0.16)' : 'rgba(22, 163, 74, 0.12)';\n ctx.fillRect(x, y, w, h);\n ctx.fillStyle = theme.isDark ? '#22C55E' : '#16A34A';\n ctx.fillRect(x, y, w, 2.5);\n } else if (isColSelected) {\n ctx.fillStyle = theme.isDark ? 'rgba(10, 132, 255, 0.12)' : 'rgba(0, 122, 255, 0.07)';\n ctx.fillRect(x, y, w, h);\n }\n\n // Borders\n ctx.strokeStyle = theme.canvas.headerBorder;\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(x + w - 0.5, y);\n ctx.lineTo(x + w - 0.5, y + h);\n ctx.moveTo(x, y + h - 0.5);\n ctx.lineTo(x + w, y + h - 0.5);\n ctx.stroke();\n\n // Active column bottom highlight bar\n if (isColSelected) {\n ctx.fillStyle = theme.dom.accentColor;\n ctx.fillRect(x, y + h - 2, w, 2);\n }\n\n const isReadonly = this.isColumnReadonly(col, permissions);\n const isFilterable =\n col.filterable !== false && col.type !== 'sparkline' && col.type !== 'action';\n const sortIndex = sortRules.findIndex((s) => s.selector === col.id);\n\n const rightReserved = (isFilterable ? 28 : 8) + (sortIndex !== -1 ? 18 : 0);\n\n // Header Title + Optional Readonly Lock Icon\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 8, y, Math.max(0, w - rightReserved - 8), h);\n ctx.clip();\n\n ctx.fillStyle = theme.canvas.headerText;\n ctx.font = `600 ${theme.headerFontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n\n const prefix = isReadonly && col.type !== 'action' && col.type !== 'sparkline' ? '🔒 ' : '';\n ctx.fillText(`${prefix}${col.title}`, x + 8, y + h / 2);\n ctx.restore();\n\n // Sort Arrow\n if (sortIndex !== -1) {\n const sort = sortRules[sortIndex];\n ctx.save();\n ctx.fillStyle = theme.dom.accentColor;\n ctx.font = `700 10px ${theme.fontFamily}`;\n ctx.textAlign = 'right';\n ctx.textBaseline = 'middle';\n const arrow = sort.desc ? '▼' : '▲';\n const badge = sortRules.length > 1 ? `${arrow}${sortIndex + 1}` : arrow;\n ctx.fillText(badge, x + w - (isFilterable ? 28 : 8), y + h / 2);\n ctx.restore();\n }\n\n // Filter Funnel Button (Easy-to-click 22x22 button box)\n if (isFilterable && w >= 48) {\n const btnSize = 20;\n const btnX = x + w - btnSize - 5;\n const btnY = y + (h - btnSize) / 2;\n\n ctx.save();\n if (isFilterActive) {\n ctx.fillStyle = theme.dom.accentColor;\n ctx.beginPath();\n ctx.roundRect(btnX, btnY, btnSize, btnSize, 5);\n ctx.fill();\n } else if (isFilterHovered) {\n ctx.fillStyle = theme.isDark ? 'rgba(255,255,255,0.14)' : 'rgba(0,0,0,0.08)';\n ctx.beginPath();\n ctx.roundRect(btnX, btnY, btnSize, btnSize, 5);\n ctx.fill();\n }\n\n const fx = btnX + btnSize / 2;\n const fy = btnY + btnSize / 2;\n ctx.fillStyle = isFilterActive\n ? '#FFFFFF'\n : isFilterHovered\n ? theme.canvas.headerText\n : theme.isDark\n ? '#98989D'\n : '#8E8E93';\n\n ctx.beginPath();\n ctx.moveTo(fx - 5, fy - 4);\n ctx.lineTo(fx + 5, fy - 4);\n ctx.lineTo(fx + 1.5, fy + 0.5);\n ctx.lineTo(fx + 1.5, fy + 4.5);\n ctx.lineTo(fx - 1.5, fy + 3.5);\n ctx.lineTo(fx - 1.5, fy + 0.5);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n }\n\n ctx.restore();\n }\n}\n","import React from 'react';\nimport { ColumnTypeRegistry } from '../columns/ColumnTypeRegistry';\nimport { ActiveOverlayState } from '../types/grid';\nimport { IGridThemeTokens } from '../theme/IGridTheme';\nimport { IGridLocale } from '../i18n/IGridLocale';\n\nexport interface DynamicCellEditorProps {\n overlay: ActiveOverlayState;\n theme: IGridThemeTokens;\n locale: IGridLocale;\n validationError?: string | null;\n isValidating?: boolean;\n onCommit: (newValue: any, moveDir?: 'down' | 'right' | 'left' | 'none') => void;\n onCancel: () => void;\n}\n\nexport const DynamicCellEditor: React.FC<DynamicCellEditorProps> = ({\n overlay,\n theme,\n locale,\n validationError,\n isValidating,\n onCommit,\n onCancel,\n}) => {\n const plugin = ColumnTypeRegistry.get(overlay.column.type);\n const EditorComponent = plugin.editorComponent;\n const isTR = locale.code.startsWith('tr');\n\n if (!EditorComponent) {\n return null;\n }\n\n return (\n <>\n <EditorComponent\n value={overlay.initialValue}\n column={overlay.column}\n theme={theme}\n rect={{\n x: overlay.x,\n y: overlay.y,\n width: overlay.width,\n height: overlay.height,\n }}\n locale={locale}\n initialChar={overlay.initialChar}\n onCommit={onCommit}\n onCancel={onCancel}\n />\n {(validationError || isValidating) && (\n <div\n style={{\n position: 'absolute',\n left: Math.max(4, overlay.x),\n top: overlay.y + overlay.height + 3,\n zIndex: 210,\n maxWidth: 320,\n padding: '5px 10px',\n borderRadius: 6,\n backgroundColor: isValidating ? '#0284C7' : '#DC2626',\n color: '#FFFFFF',\n fontSize: 11.5,\n fontWeight: 700,\n fontFamily: theme.fontFamily,\n boxShadow: '0 8px 20px rgba(0, 0, 0, 0.45)',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n pointerEvents: 'none',\n }}\n >\n <span>{isValidating ? '⏳' : '⛔'}</span>\n <span>\n {isValidating\n ? isTR\n ? 'Kural doğrulanıyor (Async)...'\n : 'Validating rule (Async)...'\n : validationError}\n </span>\n </div>\n )}\n </>\n );\n};\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { ColumnDef } from '../types/grid';\nimport { IGridThemeTokens } from '../theme/IGridTheme';\nimport { IGridLocale } from '../i18n/IGridLocale';\nimport { IDataStore } from '../types/store';\nimport { ColumnFilterState, DistinctItem, FilterOperation } from '../types/filter';\nimport { BLANK_FILTER_TOKEN, FilterEngine } from '../core/FilterEngine';\n\nexport interface HeaderFilterPopoverProps {\n column: ColumnDef;\n anchorRect: { x: number; y: number; width: number; height: number };\n viewportWidth?: number;\n theme: IGridThemeTokens;\n locale: IGridLocale;\n store: IDataStore;\n activeFilter?: ColumnFilterState;\n onApply: (filterState: ColumnFilterState | null) => void;\n onSort?: (desc: boolean) => void;\n onToggleGroup?: () => void;\n isGrouped?: boolean;\n onClose: () => void;\n}\n\nconst NUMERIC_COLUMN_TYPES = new Set([\n 'number',\n 'currency',\n 'percent',\n 'progress',\n 'rating',\n]);\n\n/**\n * Formats a raw cell value identically to how the cell painter renders it on Canvas.\n */\nexport function formatCellStructureValue(\n rawVal: any,\n column: ColumnDef,\n locale: IGridLocale\n): string {\n if (rawVal === BLANK_FILTER_TOKEN || rawVal === null || rawVal === undefined || rawVal === '') {\n return locale.emptyText;\n }\n\n const isTR = locale.code.startsWith('tr');\n\n if (column.type === 'currency') {\n const num = FilterEngine.parseNumeric(rawVal);\n if (isNaN(num)) return String(rawVal);\n const digits = column.decimalDigits ?? 2;\n const sym = column.currencySymbol || '$';\n const numStr = num.toLocaleString(locale.code, {\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n });\n return isTR ? `${numStr} ${sym}` : `${sym}${numStr}`;\n }\n\n if (column.type === 'number') {\n const num = FilterEngine.parseNumeric(rawVal);\n if (isNaN(num)) return String(rawVal);\n const isInt = column.decimalDigits === 0 || (column.decimalDigits === undefined && Number.isInteger(num));\n const digits = isInt ? 0 : column.decimalDigits ?? 2;\n return num.toLocaleString(locale.code, {\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n });\n }\n\n if (column.type === 'percent') {\n const num = FilterEngine.parseNumeric(rawVal);\n if (isNaN(num)) return String(rawVal);\n const digits = column.decimalDigits ?? 1;\n const numStr = num.toLocaleString(locale.code, {\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n });\n const sign = (column.showVarianceSign ?? true) && num > 0 ? '+' : '';\n return `${sign}${numStr}%`;\n }\n\n if (column.type === 'progress') {\n const num = FilterEngine.parseNumeric(rawVal);\n if (isNaN(num)) return String(rawVal);\n return isTR ? `%${Math.round(num)}` : `${Math.round(num)}%`;\n }\n\n if (column.type === 'rating') {\n const num = Math.max(0, Math.min(5, Math.round(FilterEngine.parseNumeric(rawVal) || 0)));\n return `${'★'.repeat(num)}${'☆'.repeat(5 - num)} (${num})`;\n }\n\n if (column.type === 'boolean') {\n const b =\n typeof rawVal === 'boolean'\n ? rawVal\n : ['true', '1', 'evet', 'doğru', 'yes'].includes(String(rawVal).toLowerCase());\n return b ? locale.trueText : locale.falseText;\n }\n\n if (\n (column.type === 'select' ||\n column.type === 'dropdown' ||\n column.type === 'lookup' ||\n column.type === 'multiselect') &&\n column.options\n ) {\n const opt = column.options.find((o) => String(o.value) === String(rawVal));\n if (opt) return opt.subtitle ? `${opt.label} (${opt.subtitle})` : opt.label;\n }\n\n if (column.type === 'object' && typeof rawVal === 'object' && !Array.isArray(rawVal)) {\n return Object.entries(rawVal)\n .map(([k, v]) => `${k}: ${String(v)}`)\n .join(' • ');\n }\n\n return String(rawVal);\n}\n\n/**\n * Formats a numeric input string live with locale thousands separators while preserving the user's decimal typing.\n */\nfunction formatLiveNumericInput(rawInput: string, isTR: boolean): string {\n const thousandSep = isTR ? '.' : ',';\n const decSep = isTR ? ',' : '.';\n\n // Strip everything except digits, minus, and decimal separator\n let cleaned = rawInput.replace(new RegExp(`[^0-9\\\\-${decSep === ',' ? ',' : '\\\\.'}]`, 'g'), '');\n if (!cleaned) return '';\n\n const isNeg = cleaned.startsWith('-');\n cleaned = cleaned.replace(/-/g, '');\n\n const parts = cleaned.split(decSep);\n const intPartRaw = parts[0].replace(/^0+(?=\\d)/, '');\n const intFormatted = intPartRaw.replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandSep);\n\n if (parts.length > 1) {\n return `${isNeg ? '-' : ''}${intFormatted}${decSep}${parts[1].slice(0, 4)}`;\n }\n return `${isNeg ? '-' : ''}${intFormatted}`;\n}\n\nfunction initialConditionInputDisplay(rawVal: any, column: ColumnDef, isTR: boolean): string {\n if (rawVal === undefined || rawVal === null || rawVal === '') return '';\n if (NUMERIC_COLUMN_TYPES.has(column.type)) {\n const num = FilterEngine.parseNumeric(rawVal);\n if (!isNaN(num)) {\n const decSep = isTR ? ',' : '.';\n const str = String(num).replace('.', decSep);\n return formatLiveNumericInput(str, isTR);\n }\n }\n return String(rawVal);\n}\n\nexport const HeaderFilterPopover: React.FC<HeaderFilterPopoverProps> = ({\n column,\n anchorRect,\n viewportWidth = 1000,\n theme,\n locale,\n store,\n activeFilter,\n onApply,\n onSort,\n onToggleGroup,\n isGrouped,\n onClose,\n}) => {\n const isTR = locale.code.startsWith('tr');\n const isNumericCol = NUMERIC_COLUMN_TYPES.has(column.type);\n\n const [tab, setTab] = useState<'values' | 'condition'>(activeFilter?.mode || 'values');\n const [allItems, setAllItems] = useState<DistinctItem[]>([]);\n const [loading, setLoading] = useState<boolean>(true);\n const [search, setSearch] = useState<string>('');\n const [selectedSet, setSelectedSet] = useState<Set<any>>(\n () => new Set(activeFilter?.selectedValues || [])\n );\n const [listScrollTop, setListScrollTop] = useState<number>(0);\n\n // Condition filter states\n const defaultOp: FilterOperation = isNumericCol\n ? '<'\n : column.type === 'date' || column.type === 'datetime' || column.type === 'time' || column.type === 'boolean'\n ? '='\n : 'contains';\n\n const [operator, setOperator] = useState<FilterOperation>(activeFilter?.operator || defaultOp);\n const [condVal1, setCondVal1] = useState<string>(() =>\n initialConditionInputDisplay(activeFilter?.value1, column, isTR)\n );\n const [condVal2, setCondVal2] = useState<string>(() =>\n initialConditionInputDisplay(activeFilter?.value2, column, isTR)\n );\n\n const popoverRef = useRef<HTMLDivElement | null>(null);\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const condInputRef = useRef<HTMLInputElement | null>(null);\n\n // Fetch all distinct values once when opened for this column\n useEffect(() => {\n let mounted = true;\n setLoading(true);\n store.getDistinctValues(column.id).then((res) => {\n if (!mounted) return;\n setAllItems(res);\n if (activeFilter && activeFilter.mode === 'values' && activeFilter.selectedValues) {\n setSelectedSet(new Set(activeFilter.selectedValues));\n } else {\n setSelectedSet(new Set(res.map((r) => r.value)));\n }\n setLoading(false);\n });\n return () => {\n mounted = false;\n };\n }, [column.id, store]);\n\n useEffect(() => {\n if (tab === 'values') {\n searchInputRef.current?.focus();\n } else {\n condInputRef.current?.focus();\n }\n }, [tab]);\n\n // Outside click listener\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (popoverRef.current && !popoverRef.current.contains(e.target as Node)) {\n onClose();\n }\n };\n document.addEventListener('mousedown', handleOutside, true);\n return () => document.removeEventListener('mousedown', handleOutside, true);\n }, [onClose]);\n\n const formatItemLabel = (it: DistinctItem): string => {\n return formatCellStructureValue(it.value, column, locale);\n };\n\n const visibleItems = useMemo(() => {\n if (!search.trim()) return allItems;\n const q = search.toLowerCase().trim();\n return allItems.filter((it) => {\n const display = formatItemLabel(it).toLowerCase();\n return display.includes(q) || String(it.value).toLowerCase().includes(q);\n });\n }, [allItems, search, column, locale]);\n\n // Live count of rows matching the current Condition Rule\n const conditionMatchCount = useMemo(() => {\n if (tab !== 'condition') return null;\n if (!condVal1.trim() && operator !== '=') return null;\n const v1 = isNumericCol ? FilterEngine.parseNumeric(condVal1) : condVal1;\n const v2 = isNumericCol ? FilterEngine.parseNumeric(condVal2) : condVal2;\n const target = operator === 'between' ? [v1, v2] : v1;\n\n let matched = 0;\n let total = 0;\n for (let i = 0; i < allItems.length; i++) {\n const item = allItems[i];\n const itemCount = item.count ?? 1;\n total += itemCount;\n const rawVal = item.value === BLANK_FILTER_TOKEN ? '' : item.value;\n if (FilterEngine.match(rawVal, operator, target)) {\n matched += itemCount;\n }\n }\n return { matched, total };\n }, [tab, condVal1, condVal2, operator, allItems, isNumericCol]);\n\n const areAllVisibleChecked =\n visibleItems.length > 0 && visibleItems.every((it) => selectedSet.has(it.value));\n\n const isIndeterminate =\n visibleItems.some((it) => selectedSet.has(it.value)) && !areAllVisibleChecked;\n\n const toggleAllVisible = () => {\n const next = new Set(selectedSet);\n if (areAllVisibleChecked) {\n for (const it of visibleItems) {\n next.delete(it.value);\n }\n } else {\n for (const it of visibleItems) {\n next.add(it.value);\n }\n }\n setSelectedSet(next);\n };\n\n const toggleSingleItem = (val: any) => {\n const next = new Set(selectedSet);\n if (next.has(val)) {\n next.delete(val);\n } else {\n next.add(val);\n }\n setSelectedSet(next);\n };\n\n const handleApply = () => {\n if (tab === 'values') {\n if (allItems.length > 0 && selectedSet.size === allItems.length) {\n onApply(null);\n } else {\n onApply({\n columnId: column.id,\n mode: 'values',\n selectedValues: Array.from(selectedSet),\n });\n }\n } else {\n if (!condVal1.trim() && operator !== '=') {\n onApply(null);\n } else {\n const normalizedV1 = isNumericCol\n ? (() => {\n const n = FilterEngine.parseNumeric(condVal1);\n return isNaN(n) ? condVal1 : n;\n })()\n : condVal1;\n const normalizedV2 = isNumericCol\n ? (() => {\n const n = FilterEngine.parseNumeric(condVal2);\n return isNaN(n) ? condVal2 : n;\n })()\n : condVal2;\n\n onApply({\n columnId: column.id,\n mode: 'condition',\n operator,\n value1: normalizedV1,\n value2: normalizedV2,\n });\n }\n }\n onClose();\n };\n\n const handleClear = () => {\n setSearch('');\n setCondVal1('');\n setCondVal2('');\n setSelectedSet(new Set(allItems.map((r) => r.value)));\n onApply(null);\n onClose();\n };\n\n const renderStructuredConditionInput = (\n val: string,\n setVal: (v: string) => void,\n placeholder: string,\n autoFocusRef?: React.RefObject<HTMLInputElement | null>\n ) => {\n // 1. Boolean Column -> True / False Select\n if (column.type === 'boolean') {\n return (\n <select\n value={val || 'true'}\n onChange={(e) => setVal(e.target.value)}\n style={{\n width: '100%',\n padding: '7px 8px',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `1px solid ${theme.dom.inputBorder}`,\n borderRadius: 6,\n outline: 'none',\n fontSize: 12,\n }}\n >\n <option value=\"\">{isTR ? 'Seçiniz...' : 'Select...'}</option>\n <option value=\"true\">✓ {locale.trueText}</option>\n <option value=\"false\">✕ {locale.falseText}</option>\n </select>\n );\n }\n\n // 2. Select / Dropdown / Lookup / MultiSelect with Options\n if (\n (column.type === 'select' ||\n column.type === 'dropdown' ||\n column.type === 'lookup' ||\n column.type === 'multiselect') &&\n column.options &&\n column.options.length > 0 &&\n (operator === '=' || operator === '<>' || operator === 'contains')\n ) {\n return (\n <select\n value={val}\n onChange={(e) => setVal(e.target.value)}\n style={{\n width: '100%',\n padding: '7px 8px',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `1px solid ${theme.dom.inputBorder}`,\n borderRadius: 6,\n outline: 'none',\n fontSize: 12,\n }}\n >\n <option value=\"\">{isTR ? 'Seçenek seçin...' : 'Choose option...'}</option>\n {column.options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label} {opt.subtitle ? `(${opt.subtitle})` : ''}\n </option>\n ))}\n </select>\n );\n }\n\n // 3. Date Column -> Native Date Picker\n if (column.type === 'date') {\n return (\n <input\n ref={autoFocusRef}\n type=\"date\"\n value={val}\n onChange={(e) => setVal(e.target.value)}\n style={{\n width: '100%',\n padding: '6px 8px',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `1px solid ${theme.dom.inputBorder}`,\n borderRadius: 6,\n outline: 'none',\n fontSize: 12,\n fontFamily: 'monospace',\n boxSizing: 'border-box',\n }}\n />\n );\n }\n\n // 4. Time Column -> Native Time Picker\n if (column.type === 'time') {\n return (\n <input\n ref={autoFocusRef}\n type=\"time\"\n value={val}\n onChange={(e) => setVal(e.target.value)}\n style={{\n width: '100%',\n padding: '6px 8px',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `1px solid ${theme.dom.inputBorder}`,\n borderRadius: 6,\n outline: 'none',\n fontSize: 12,\n fontFamily: 'monospace',\n boxSizing: 'border-box',\n }}\n />\n );\n }\n\n // 5. Currency / Number / Percent / Progress / Rating -> Live Formatted Cell-Structured Input\n if (isNumericCol) {\n const sym =\n column.type === 'currency'\n ? column.currencySymbol || '$'\n : column.type === 'percent' || column.type === 'progress'\n ? '%'\n : column.type === 'rating'\n ? '★'\n : '';\n const prefixSym =\n (column.type === 'currency' && !isTR) || (column.type === 'progress' && isTR) ? sym : '';\n const suffixSym =\n (column.type === 'currency' && isTR) ||\n (column.type === 'progress' && !isTR) ||\n column.type === 'percent' ||\n column.type === 'rating'\n ? sym\n : '';\n\n const parsedNum = FilterEngine.parseNumeric(val);\n const cellPreview =\n val.trim() !== '' && !isNaN(parsedNum)\n ? formatCellStructureValue(parsedNum, column, locale)\n : null;\n\n return (\n <div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n backgroundColor: theme.dom.inputBg,\n border: `1px solid ${theme.dom.inputBorder}`,\n borderRadius: 6,\n padding: '0 8px',\n }}\n >\n {prefixSym && (\n <span\n style={{\n color: theme.dom.accentColor,\n fontWeight: 700,\n fontSize: 12,\n marginRight: 6,\n fontFamily: 'monospace',\n }}\n >\n {prefixSym}\n </span>\n )}\n <input\n ref={autoFocusRef}\n type=\"text\"\n inputMode=\"decimal\"\n value={val}\n onChange={(e) => {\n setVal(formatLiveNumericInput(e.target.value, isTR));\n }}\n placeholder={\n column.type === 'currency'\n ? isTR\n ? '15.000,47'\n : '15,000.47'\n : column.type === 'progress' || column.type === 'percent'\n ? '20'\n : placeholder\n }\n style={{\n flex: 1,\n padding: '6px 0',\n backgroundColor: 'transparent',\n color: theme.dom.inputText,\n border: 'none',\n outline: 'none',\n fontSize: 12.5,\n fontWeight: 600,\n fontFamily: theme.fontFamily,\n textAlign: column.type === 'currency' || column.type === 'number' || column.type === 'percent' ? 'right' : 'left',\n }}\n />\n {suffixSym && (\n <span\n style={{\n color: theme.dom.accentColor,\n fontWeight: 700,\n fontSize: 12,\n marginLeft: 6,\n fontFamily: 'monospace',\n }}\n >\n {suffixSym}\n </span>\n )}\n </div>\n {cellPreview && (\n <div\n style={{\n marginTop: 4,\n fontSize: 11,\n color: theme.dom.accentColor,\n display: 'flex',\n justifyContent: 'space-between',\n fontWeight: 600,\n }}\n >\n <span>{isTR ? 'Hücre biçimi:' : 'Cell format:'}</span>\n <span style={{ fontFamily: 'monospace' }}>{cellPreview}</span>\n </div>\n )}\n </div>\n );\n }\n\n // 6. Default Text / Email / URL / Phone / Object Input\n return (\n <input\n ref={autoFocusRef}\n type=\"text\"\n value={val}\n onChange={(e) => setVal(e.target.value)}\n placeholder={placeholder}\n style={{\n width: '100%',\n padding: '6px 8px',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `1px solid ${theme.dom.inputBorder}`,\n borderRadius: 6,\n outline: 'none',\n fontSize: 12,\n boxSizing: 'border-box',\n }}\n />\n );\n };\n\n // Compute safe horizontal position inside viewport\n const popoverWidth = 295;\n const rawLeft = anchorRect.x + anchorRect.width - popoverWidth;\n const safeLeft = Math.max(8, Math.min(rawLeft, viewportWidth - popoverWidth - 16));\n\n return (\n <div\n ref={popoverRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Escape') onClose();\n if (e.key === 'Enter') handleApply();\n }}\n style={{\n position: 'absolute',\n left: safeLeft,\n top: anchorRect.y + anchorRect.height + 4,\n width: popoverWidth,\n zIndex: 150,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n fontFamily: theme.fontFamily,\n fontSize: 12,\n overflow: 'hidden',\n userSelect: 'none',\n }}\n >\n {/* Header Title & Quick Sort/Group Actions */}\n <div\n style={{\n padding: '8px 12px',\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\n display: 'flex',\n flexDirection: 'column',\n gap: 6,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <span style={{ fontWeight: 700, fontSize: 12 }}>{column.title}</span>\n <span\n style={{\n fontSize: 10,\n padding: '1px 6px',\n borderRadius: 4,\n backgroundColor: theme.dom.badgeBg,\n color: theme.dom.badgeText,\n textTransform: 'uppercase',\n fontFamily: 'monospace',\n }}\n >\n {column.type}\n </span>\n </div>\n\n <div style={{ display: 'flex', gap: 6 }}>\n {column.sortable !== false && onSort && (\n <>\n <button\n type=\"button\"\n onClick={() => {\n onSort(false);\n onClose();\n }}\n style={{\n flex: 1,\n padding: '4px 6px',\n fontSize: 11,\n borderRadius: 5,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n fontWeight: 500,\n }}\n >\n ▲ {isTR ? 'Artan Sırala' : 'Sort A → Z'}\n </button>\n <button\n type=\"button\"\n onClick={() => {\n onSort(true);\n onClose();\n }}\n style={{\n flex: 1,\n padding: '4px 6px',\n fontSize: 11,\n borderRadius: 5,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n fontWeight: 500,\n }}\n >\n ▼ {isTR ? 'Azalan Sırala' : 'Sort Z → A'}\n </button>\n </>\n )}\n {column.groupable !== false &&\n column.type !== 'sparkline' &&\n column.type !== 'action' &&\n onToggleGroup && (\n <button\n type=\"button\"\n onClick={() => {\n onToggleGroup();\n onClose();\n }}\n style={{\n padding: '4px 8px',\n fontSize: 11,\n borderRadius: 5,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: isGrouped ? theme.dom.accentColor : 'transparent',\n color: isGrouped ? '#FFFFFF' : theme.dom.popoverText,\n cursor: 'pointer',\n fontWeight: 500,\n }}\n >\n {isGrouped ? (isTR ? 'Grubu Kaldır' : 'Ungroup') : isTR ? 'Grupla' : 'Group'}\n </button>\n )}\n </div>\n </div>\n\n {/* Mode Tabs: Values vs Condition */}\n <div\n style={{\n display: 'flex',\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: theme.isDark ? 'rgba(255,255,255,0.03)' : 'rgba(0,0,0,0.02)',\n }}\n >\n <button\n type=\"button\"\n onClick={() => setTab('values')}\n style={{\n flex: 1,\n padding: '7px 0',\n fontSize: 11,\n fontWeight: tab === 'values' ? 700 : 500,\n border: 'none',\n borderBottom:\n tab === 'values' ? `2px solid ${theme.dom.accentColor}` : '2px solid transparent',\n backgroundColor: 'transparent',\n color: tab === 'values' ? theme.dom.accentColor : theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {isTR\n ? `Değer Listesi (${selectedSet.size}/${allItems.length})`\n : `Value List (${selectedSet.size}/${allItems.length})`}\n </button>\n <button\n type=\"button\"\n onClick={() => setTab('condition')}\n style={{\n flex: 1,\n padding: '7px 0',\n fontSize: 11,\n fontWeight: tab === 'condition' ? 700 : 500,\n border: 'none',\n borderBottom:\n tab === 'condition' ? `2px solid ${theme.dom.accentColor}` : '2px solid transparent',\n backgroundColor: 'transparent',\n color: tab === 'condition' ? theme.dom.accentColor : theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {isTR ? 'Koşul Filtresi' : 'Condition Rule'}\n </button>\n </div>\n\n {tab === 'values' ? (\n <>\n {/* Search Input */}\n <div style={{ padding: '8px 12px', borderBottom: `1px solid ${theme.dom.popoverBorder}` }}>\n <input\n ref={searchInputRef}\n type=\"text\"\n value={search}\n onChange={(e) => {\n const nextQuery = e.target.value;\n setSearch(nextQuery);\n setListScrollTop(0);\n const q = nextQuery.toLowerCase().trim();\n if (q) {\n const matched = allItems.filter((it) => {\n const display = formatItemLabel(it).toLowerCase();\n return display.includes(q) || String(it.value).toLowerCase().includes(q);\n });\n setSelectedSet(new Set(matched.map((m) => m.value)));\n } else if (\n activeFilter &&\n activeFilter.mode === 'values' &&\n activeFilter.selectedValues\n ) {\n setSelectedSet(new Set(activeFilter.selectedValues));\n } else {\n setSelectedSet(new Set(allItems.map((r) => r.value)));\n }\n }}\n placeholder={locale.searchValuesPlaceholder}\n style={{\n width: '100%',\n padding: '6px 8px',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `1px solid ${theme.dom.inputBorder}`,\n borderRadius: 5,\n outline: 'none',\n fontSize: 12,\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n {/* Select All Bar */}\n <div\n onClick={toggleAllVisible}\n style={{\n padding: '7px 12px',\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n cursor: 'pointer',\n fontWeight: 600,\n backgroundColor: theme.isDark ? 'rgba(255,255,255,0.02)' : 'rgba(0,0,0,0.015)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"checkbox\"\n checked={areAllVisibleChecked}\n ref={(el) => {\n if (el) el.indeterminate = isIndeterminate;\n }}\n onChange={() => {}}\n style={{\n cursor: 'pointer',\n accentColor: theme.dom.accentColor,\n width: 14,\n height: 14,\n }}\n />\n <span>\n {search.trim()\n ? isTR\n ? '(Arama Sonuçlarını Seç)'\n : '(Select Search Results)'\n : locale.selectAll}\n </span>\n </div>\n <span style={{ fontSize: 10, color: '#8E8E93' }}>\n {selectedSet.size} / {allItems.length}\n </span>\n </div>\n\n {/* Virtualized Distinct Values Checkbox List */}\n <div\n onScroll={(e) => setListScrollTop(e.currentTarget.scrollTop)}\n style={{ height: 196, overflowY: 'auto', padding: '4px 6px', position: 'relative' }}\n >\n {loading ? (\n <div style={{ padding: '12px 8px', color: '#8E8E93' }}>{locale.loading}</div>\n ) : visibleItems.length === 0 ? (\n <div style={{ padding: '12px 8px', color: '#8E8E93' }}>{locale.noMatches}</div>\n ) : (\n (() => {\n const ITEM_H = 28;\n const totalH = visibleItems.length * ITEM_H;\n const startIdx = Math.max(0, Math.floor(listScrollTop / ITEM_H) - 3);\n const endIdx = Math.min(\n visibleItems.length - 1,\n Math.ceil((listScrollTop + 196) / ITEM_H) + 3\n );\n const slice = visibleItems.slice(startIdx, endIdx + 1);\n\n return (\n <div style={{ height: totalH, position: 'relative' }}>\n {slice.map((it, idx) => {\n const realIdx = startIdx + idx;\n const isChecked = selectedSet.has(it.value);\n const optMatch =\n column.type === 'select' ||\n column.type === 'dropdown' ||\n column.type === 'lookup' ||\n column.type === 'multiselect'\n ? column.options?.find((o) => o.value === it.value)\n : undefined;\n return (\n <div\n key={String(it.value)}\n onClick={() => toggleSingleItem(it.value)}\n style={{\n position: 'absolute',\n top: realIdx * ITEM_H,\n left: 0,\n right: 0,\n height: ITEM_H - 2,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '0 8px',\n borderRadius: 5,\n cursor: 'pointer',\n backgroundColor: isChecked\n ? theme.isDark\n ? 'rgba(10, 132, 255, 0.12)'\n : 'rgba(0, 122, 255, 0.06)'\n : 'transparent',\n boxSizing: 'border-box',\n }}\n >\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n overflow: 'hidden',\n }}\n >\n <input\n type=\"checkbox\"\n checked={isChecked}\n onChange={() => {}}\n style={{\n cursor: 'pointer',\n accentColor: theme.dom.accentColor,\n width: 14,\n height: 14,\n flexShrink: 0,\n }}\n />\n {optMatch && (\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: theme.isDark\n ? optMatch.darkFg || '#60A5FA'\n : optMatch.fg || '#2563EB',\n flexShrink: 0,\n }}\n />\n )}\n {column.type === 'color' && typeof it.value === 'string' && (\n <span\n style={{\n width: 10,\n height: 10,\n borderRadius: 3,\n backgroundColor: it.value,\n border: '1px solid rgba(255,255,255,0.25)',\n flexShrink: 0,\n }}\n />\n )}\n <span\n style={{\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n fontWeight: isChecked ? 600 : 400,\n }}\n >\n {formatItemLabel(it)}\n </span>\n </div>\n {it.count !== undefined && (\n <span\n style={{\n color: '#8E8E93',\n fontSize: 11,\n marginLeft: 6,\n flexShrink: 0,\n }}\n >\n {it.count}\n </span>\n )}\n </div>\n );\n })}\n </div>\n );\n })()\n )}\n </div>\n </>\n ) : (\n /* Condition Filter Tab */\n <div style={{ padding: '12px', display: 'flex', flexDirection: 'column', gap: 10 }}>\n <div>\n <label style={{ display: 'block', fontSize: 11, color: '#8E8E93', marginBottom: 4 }}>\n {isTR ? 'Operatör' : 'Operator'}\n </label>\n <select\n value={operator}\n onChange={(e) => setOperator(e.target.value as FilterOperation)}\n style={{\n width: '100%',\n padding: '6px 8px',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `1px solid ${theme.dom.inputBorder}`,\n borderRadius: 6,\n outline: 'none',\n fontSize: 12,\n }}\n >\n {isNumericCol ? (\n <>\n <option value=\"<\">{isTR ? 'Küçüktür (<)' : 'Less than (<)'}</option>\n <option value=\"<=\">{isTR ? 'Küçük veya Eşit (≤)' : 'Less or equal (≤)'}</option>\n <option value=\">\">{isTR ? 'Büyüktür (>)' : 'Greater than (>)'}</option>\n <option value=\">=\">{isTR ? 'Büyük veya Eşit (≥)' : 'Greater or equal (≥)'}</option>\n <option value=\"=\">{isTR ? 'Eşittir (=)' : 'Equals (=)'}</option>\n <option value=\"<>\">{isTR ? 'Eşit Değildir (≠)' : 'Does not equal (≠)'}</option>\n <option value=\"between\">{isTR ? 'Arasında (Between)' : 'Between'}</option>\n <option value=\"contains\">{isTR ? 'İçerir (Contains)' : 'Contains'}</option>\n </>\n ) : (\n <>\n <option value=\"contains\">{isTR ? 'İçerir (Contains)' : 'Contains'}</option>\n <option value=\"notcontains\">\n {isTR ? 'İçermez (Does not contain)' : 'Does not contain'}\n </option>\n <option value=\"=\">{isTR ? 'Eşittir (=)' : 'Equals (=)'}</option>\n <option value=\"<>\">{isTR ? 'Eşit Değildir (≠)' : 'Does not equal (≠)'}</option>\n <option value=\"startswith\">{isTR ? 'İle Başlar (Starts with)' : 'Starts with'}</option>\n <option value=\"endswith\">{isTR ? 'İle Biter (Ends with)' : 'Ends with'}</option>\n <option value=\">\">{isTR ? 'Büyüktür (>)' : 'Greater than (>)'}</option>\n <option value=\">=\">{isTR ? 'Büyük veya Eşit (≥)' : 'Greater or equal (≥)'}</option>\n <option value=\"<\">{isTR ? 'Küçüktür (<)' : 'Less than (<)'}</option>\n <option value=\"<=\">{isTR ? 'Küçük veya Eşit (≤)' : 'Less or equal (≤)'}</option>\n <option value=\"between\">{isTR ? 'Arasında (Between)' : 'Between'}</option>\n </>\n )}\n </select>\n </div>\n\n <div>\n <label style={{ display: 'block', fontSize: 11, color: '#8E8E93', marginBottom: 4 }}>\n {operator === 'between'\n ? isTR\n ? 'Başlangıç Değeri'\n : 'Minimum Value'\n : isTR\n ? 'Değer'\n : 'Value'}\n </label>\n {renderStructuredConditionInput(\n condVal1,\n setCondVal1,\n isTR ? 'Değer girin...' : 'Enter value...',\n condInputRef\n )}\n </div>\n\n {operator === 'between' && (\n <div>\n <label style={{ display: 'block', fontSize: 11, color: '#8E8E93', marginBottom: 4 }}>\n {isTR ? 'Bitiş Değeri' : 'Maximum Value'}\n </label>\n {renderStructuredConditionInput(\n condVal2,\n setCondVal2,\n isTR ? 'Maksimum değer...' : 'Enter max value...'\n )}\n </div>\n )}\n\n {/* Live Matching Rows Feedback */}\n {conditionMatchCount && (\n <div\n style={{\n padding: '6px 10px',\n borderRadius: 6,\n backgroundColor:\n conditionMatchCount.matched > 0\n ? 'rgba(16, 185, 129, 0.12)'\n : 'rgba(245, 158, 11, 0.14)',\n color: conditionMatchCount.matched > 0 ? '#10B981' : '#F59E0B',\n fontSize: 11.5,\n fontWeight: 600,\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <span>{isTR ? 'Eşleşen Kayıt:' : 'Matching Rows:'}</span>\n <span>\n {conditionMatchCount.matched.toLocaleString(locale.code)} /{' '}\n {conditionMatchCount.total.toLocaleString(locale.code)}\n </span>\n </div>\n )}\n </div>\n )}\n\n {/* Footer Buttons */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '8px 12px',\n borderTop: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: theme.isDark ? 'rgba(255,255,255,0.02)' : 'rgba(0,0,0,0.02)',\n }}\n >\n <button\n type=\"button\"\n onClick={handleClear}\n style={{\n padding: '5px 10px',\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 5,\n cursor: 'pointer',\n fontSize: 11,\n fontWeight: 600,\n }}\n >\n {locale.clear}\n </button>\n <div style={{ display: 'flex', gap: 6 }}>\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n padding: '5px 10px',\n backgroundColor: 'transparent',\n color: '#8E8E93',\n border: 'none',\n borderRadius: 5,\n cursor: 'pointer',\n fontSize: 11,\n }}\n >\n {isTR ? 'İptal' : 'Cancel'}\n </button>\n <button\n type=\"button\"\n onClick={handleApply}\n style={{\n padding: '5px 14px',\n backgroundColor: theme.dom.accentColor,\n color: '#FFFFFF',\n border: 'none',\n borderRadius: 5,\n cursor: 'pointer',\n fontWeight: 600,\n fontSize: 11,\n }}\n >\n {locale.apply}\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import React, { useEffect } from 'react';\n\nconst MATERIAL_SYMBOLS_HREF =\n 'https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&family=Material+Symbols+Rounded:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap';\n\nlet injected = false;\n\n/**\n * Ensures the Google Material Symbols font stylesheet (https://fonts.google.com/icons)\n * is present in the document head when SheetGL is used as an npm package.\n */\nexport function ensureMaterialSymbolsLoaded(): void {\n if (injected || typeof document === 'undefined') return;\n injected = true;\n\n const existing = document.querySelector(\n 'link[href*=\"Material+Symbols+Outlined\"], link[href*=\"Material+Symbols+Rounded\"]'\n );\n if (existing) return;\n\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = MATERIAL_SYMBOLS_HREF;\n document.head.appendChild(link);\n}\n\nexport interface MaterialIconProps {\n /** Google Material Symbols icon ligature name (from https://fonts.google.com/icons), e.g. 'add', 'delete', 'tune' */\n name: string;\n /** Icon size in pixels (default: 16) */\n size?: number;\n /** Whether to render the filled variant (FILL 1 vs 0) */\n filled?: boolean;\n /** Font weight (100 - 700, default: 500) */\n weight?: number;\n /** Icon style family ('outlined' | 'rounded', default: 'outlined') */\n variant?: 'outlined' | 'rounded';\n /** Optional CSS color override */\n color?: string;\n /** Optional inline styles */\n style?: React.CSSProperties;\n /** Optional CSS class name */\n className?: string;\n /** Optional tooltip */\n title?: string;\n}\n\nexport const MaterialIcon: React.FC<MaterialIconProps> = ({\n name,\n size = 16,\n filled = false,\n weight = 500,\n variant = 'outlined',\n color,\n style,\n className,\n title,\n}) => {\n useEffect(() => {\n ensureMaterialSymbolsLoaded();\n }, []);\n\n const fontFamily =\n variant === 'rounded' ? '\"Material Symbols Rounded\"' : '\"Material Symbols Outlined\"';\n\n return (\n <span\n className={className}\n title={title}\n aria-hidden={title ? undefined : 'true'}\n style={{\n fontFamily,\n fontWeight: 'normal',\n fontStyle: 'normal',\n fontSize: size,\n lineHeight: 1,\n letterSpacing: 'normal',\n textTransform: 'none',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n whiteSpace: 'nowrap',\n wordWrap: 'normal',\n direction: 'ltr',\n WebkitFontSmoothing: 'antialiased',\n MozOsxFontSmoothing: 'grayscale',\n fontFeatureSettings: '\"liga\"',\n fontVariationSettings: `'FILL' ${filled ? 1 : 0}, 'wght' ${weight}, 'GRAD' 0, 'opsz' ${Math.max(20, Math.min(48, size))}`,\n width: size,\n height: size,\n flexShrink: 0,\n userSelect: 'none',\n color,\n ...style,\n }}\n >\n {name}\n </span>\n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport { ColumnDef, GridPermissions } from '../types/grid';\nimport { SummaryType } from '../types/group';\nimport { IGridThemeTokens } from '../theme/IGridTheme';\nimport { IGridLocale } from '../i18n/IGridLocale';\nimport { MaterialIcon } from '../ui/MaterialIcon';\n\nexport interface ContextMenuState {\n targetType: 'cell' | 'header' | 'rownumber';\n x: number;\n y: number;\n row: number;\n col: number;\n column?: ColumnDef;\n rowData?: Record<string, any>;\n}\n\nexport interface ContextMenuOverlayProps {\n menu: ContextMenuState;\n viewportWidth: number;\n viewportHeight: number;\n theme: IGridThemeTokens;\n locale: IGridLocale;\n permissions?: GridPermissions;\n isCellEditable: boolean;\n isGroupedByCol: boolean;\n currentSummaryType?: SummaryType;\n onCopy: () => void;\n onPaste: () => void;\n onDuplicateCellDown: () => void;\n onDuplicateCellRight: () => void;\n onDuplicateRow: () => void;\n onInsertRowAbove: () => void;\n onInsertRowBelow: () => void;\n onClearCells: () => void;\n onDeleteRow: () => void;\n onFilterByCellValue: () => void;\n onToggleGroupColumn: () => void;\n onSortColumn: (desc: boolean | null) => void;\n onTogglePinColumn: () => void;\n onToggleColumnReadonly: () => void;\n onChangeSummaryType: (summaryType: SummaryType) => void;\n onOpenSparklineModal?: () => void;\n onClose: () => void;\n}\n\nexport const ContextMenuOverlay: React.FC<ContextMenuOverlayProps> = ({\n menu,\n viewportWidth,\n viewportHeight,\n theme,\n locale,\n permissions,\n isCellEditable,\n isGroupedByCol,\n currentSummaryType = 'none',\n onCopy,\n onPaste,\n onDuplicateCellDown,\n onDuplicateCellRight,\n onDuplicateRow,\n onInsertRowAbove,\n onInsertRowBelow,\n onClearCells,\n onDeleteRow,\n onFilterByCellValue,\n onToggleGroupColumn,\n onSortColumn,\n onTogglePinColumn,\n onToggleColumnReadonly,\n onChangeSummaryType,\n onOpenSparklineModal,\n onClose,\n}) => {\n const menuRef = useRef<HTMLDivElement | null>(null);\n const isTR = locale.code.startsWith('tr');\n\n const isWriteMode = permissions?.mode !== 'read' && permissions?.mode !== 'readonly';\n const canAdd = isWriteMode && permissions?.allowAdding !== false;\n const canDelete = isWriteMode && permissions?.allowDeleting !== false;\n const canDuplicate = isWriteMode && permissions?.allowDuplicating !== false;\n const canPaste = isWriteMode && permissions?.allowClipboardPaste !== false && isCellEditable;\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n onClose();\n }\n };\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('mousedown', handleOutside, true);\n document.addEventListener('keydown', handleKey, true);\n return () => {\n document.removeEventListener('mousedown', handleOutside, true);\n document.removeEventListener('keydown', handleKey, true);\n };\n }, [onClose]);\n\n const menuWidth = 256;\n const estimatedHeight = menu.targetType === 'header' ? 320 : 350;\n const safeLeft = Math.max(8, Math.min(menu.x, viewportWidth - menuWidth - 12));\n const safeTop = Math.max(8, Math.min(menu.y, viewportHeight - estimatedHeight - 12));\n\n const renderItem = (\n iconName: string,\n label: string,\n shortcut: string | undefined,\n onClick: () => void,\n disabled: boolean = false,\n danger: boolean = false,\n badge?: string\n ) => (\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => {\n if (disabled) return;\n onClick();\n onClose();\n }}\n style={{\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '6px 10px',\n border: 'none',\n borderRadius: 5,\n backgroundColor: 'transparent',\n color: disabled ? '#8E8E93' : danger ? '#FF453A' : theme.dom.popoverText,\n opacity: disabled ? 0.45 : 1,\n cursor: disabled ? 'not-allowed' : 'pointer',\n fontSize: 12,\n fontFamily: theme.fontFamily,\n textAlign: 'left',\n }}\n onMouseEnter={(e) => {\n if (!disabled) {\n e.currentTarget.style.backgroundColor = theme.isDark\n ? 'rgba(255,255,255,0.08)'\n : 'rgba(0,0,0,0.05)';\n }\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = 'transparent';\n }}\n >\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 7, fontWeight: 500 }}>\n <MaterialIcon\n name={iconName}\n size={15}\n color={disabled ? '#8E8E93' : danger ? '#FF453A' : theme.dom.accentColor}\n />\n <span>{label}</span>\n </span>\n {badge ? (\n <span\n style={{\n fontSize: 10,\n padding: '1px 6px',\n borderRadius: 4,\n backgroundColor: theme.dom.badgeBg,\n color: theme.dom.badgeText,\n fontWeight: 600,\n }}\n >\n {badge}\n </span>\n ) : shortcut ? (\n <span style={{ fontSize: 10, color: '#8E8E93', fontFamily: 'monospace' }}>{shortcut}</span>\n ) : null}\n </button>\n );\n\n const divider = (\n <div\n style={{\n height: 1,\n backgroundColor: theme.dom.popoverBorder,\n margin: '4px 0',\n }}\n />\n );\n\n return (\n <div\n ref={menuRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onContextMenu={(e) => e.preventDefault()}\n style={{\n position: 'absolute',\n left: safeLeft,\n top: safeTop,\n width: menuWidth,\n zIndex: 180,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n padding: 5,\n userSelect: 'none',\n fontFamily: theme.fontFamily,\n }}\n >\n {menu.targetType === 'header' && menu.column ? (\n menu.column.type === 'sparkline' || menu.column.type === 'action' ? (\n <>\n <div\n style={{\n padding: '5px 10px',\n fontSize: 11,\n fontWeight: 700,\n color: theme.dom.accentColor,\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\n marginBottom: 4,\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <span>{menu.column.title}</span>\n <span>{menu.column.type.toUpperCase()}</span>\n </div>\n {renderItem(\n 'push_pin',\n menu.column.pinned\n ? isTR\n ? 'Sabitlemeyi Kaldır (Unpin)'\n : 'Unpin Column'\n : isTR\n ? 'Sola Sabitle (Pin Left)'\n : 'Pin Column Left',\n undefined,\n onTogglePinColumn\n )}\n </>\n ) : (\n <>\n <div\n style={{\n padding: '5px 10px',\n fontSize: 11,\n fontWeight: 700,\n color: theme.dom.accentColor,\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\n marginBottom: 4,\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <span>{menu.column.title}</span>\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 3 }}>\n <MaterialIcon name={menu.column.readonly ? 'lock' : 'edit'} size={12} />\n {menu.column.readonly ? 'ReadOnly' : 'Write'}\n </span>\n </div>\n\n {renderItem(\n 'north',\n isTR ? 'Artan Sırala (A → Z)' : 'Sort Ascending (A → Z)',\n undefined,\n () => onSortColumn(false),\n menu.column.sortable === false\n )}\n {renderItem(\n 'south',\n isTR ? 'Azalan Sırala (Z → A)' : 'Sort Descending (Z → A)',\n undefined,\n () => onSortColumn(true),\n menu.column.sortable === false\n )}\n {renderItem(\n 'sort',\n isTR ? 'Sıralamayı Temizle' : 'Clear Sort',\n undefined,\n () => onSortColumn(null),\n menu.column.sortable === false\n )}\n\n {divider}\n\n {renderItem(\n 'push_pin',\n menu.column.pinned\n ? isTR\n ? 'Sabitlemeyi Kaldır (Unpin)'\n : 'Unpin Column'\n : isTR\n ? 'Sola Sabitle (Pin Left)'\n : 'Pin Column Left',\n undefined,\n onTogglePinColumn\n )}\n {renderItem(\n isGroupedByCol ? 'folder_open' : 'workspaces',\n isGroupedByCol\n ? isTR\n ? 'Grubu Kaldır'\n : 'Ungroup Column'\n : isTR\n ? 'Bu Sütuna Göre Grupla'\n : 'Group by This Column',\n undefined,\n onToggleGroupColumn\n )}\n {renderItem(\n menu.column.readonly ? 'lock_open' : 'lock',\n menu.column.readonly\n ? isTR\n ? 'Yazma İznini Aç (Write Mode)'\n : 'Set Column Editable (Write)'\n : isTR\n ? 'Salt Okunur Yap (Read-Only)'\n : 'Set Column Read-Only',\n undefined,\n onToggleColumnReadonly\n )}\n\n {divider}\n\n <div\n style={{\n padding: '4px 10px 2px',\n fontSize: 10,\n fontWeight: 700,\n color: '#8E8E93',\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n }}\n >\n <MaterialIcon name=\"functions\" size={12} color=\"#8E8E93\" />\n {isTR ? 'ALT ÖZET HESAPLAMASI (SUMMARY)' : 'SUMMARY AGGREGATION'}\n </div>\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(3, 1fr)',\n gap: 4,\n padding: '4px 6px',\n }}\n >\n {(['sum', 'avg', 'min', 'max', 'count', 'none'] as SummaryType[]).map((sType) => {\n const isActive = currentSummaryType === sType;\n return (\n <button\n key={sType}\n type=\"button\"\n onClick={() => {\n onChangeSummaryType(sType);\n onClose();\n }}\n style={{\n padding: '4px 0',\n fontSize: 10,\n fontWeight: isActive ? 700 : 500,\n textTransform: 'uppercase',\n borderRadius: 4,\n border: `1px solid ${\n isActive ? theme.dom.accentColor : theme.dom.popoverBorder\n }`,\n backgroundColor: isActive ? theme.dom.accentColor : 'transparent',\n color: isActive ? '#FFFFFF' : theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {sType}\n </button>\n );\n })}\n </div>\n </>\n )\n ) : menu.column?.type === 'sparkline' ? (\n <>\n <div\n style={{\n padding: '5px 10px',\n fontSize: 11,\n fontWeight: 700,\n color: theme.dom.accentColor,\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\n marginBottom: 4,\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <MaterialIcon name=\"show_chart\" size={14} color={theme.dom.accentColor} />\n {menu.column.title}\n </span>\n <span>CHART</span>\n </div>\n {onOpenSparklineModal &&\n renderItem(\n 'monitoring',\n isTR ? 'Detaylı Trend Grafiğini Görüntüle' : 'View Detailed Trend Chart',\n 'Enter',\n onOpenSparklineModal\n )}\n </>\n ) : (\n <>\n <div\n style={{\n padding: '5px 10px',\n fontSize: 11,\n fontWeight: 700,\n color: theme.dom.accentColor,\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\n marginBottom: 4,\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n }}\n >\n <span>\n R{menu.row + 1} : C{menu.col + 1} {menu.column ? `(${menu.column.title})` : ''}\n </span>\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 3 }}>\n <MaterialIcon name={isCellEditable ? 'edit' : 'lock'} size={12} />\n {isCellEditable ? 'WRITE' : 'READONLY'}\n </span>\n </div>\n\n {renderItem(\n 'content_copy',\n isTR ? 'Kopyala (Excel TSV)' : 'Copy (Excel TSV)',\n 'Ctrl+C',\n onCopy\n )}\n {renderItem(\n 'content_paste',\n isTR ? 'Yapıştır (Excel TSV)' : 'Paste (Excel TSV)',\n 'Ctrl+V',\n onPaste,\n !canPaste\n )}\n\n {divider}\n\n {renderItem(\n 'south',\n isTR ? 'Hücreyi Aşağı Çoğalt' : 'Duplicate Cell Down',\n 'Ctrl+D',\n onDuplicateCellDown,\n !canDuplicate || !isCellEditable\n )}\n {renderItem(\n 'east',\n isTR ? 'Hücreyi Sağa Çoğalt' : 'Duplicate Cell Right',\n 'Ctrl+R',\n onDuplicateCellRight,\n !canDuplicate\n )}\n {renderItem(\n 'library_add',\n isTR ? 'Satırı Çoğalt (Duplicate Row)' : 'Duplicate Entire Row',\n 'Shift+D',\n onDuplicateRow,\n !canDuplicate || !canAdd\n )}\n\n {divider}\n\n {renderItem(\n 'add_row_above',\n isTR ? 'Üste Yeni Satır Ekle' : 'Insert Row Above',\n undefined,\n onInsertRowAbove,\n !canAdd\n )}\n {renderItem(\n 'add_row_below',\n isTR ? 'Alta Yeni Satır Ekle' : 'Insert Row Below',\n undefined,\n onInsertRowBelow,\n !canAdd\n )}\n\n {divider}\n\n {renderItem(\n 'filter_alt',\n isTR ? 'Bu Hücre Değerine Göre Filtrele' : 'Filter by Cell Value',\n undefined,\n onFilterByCellValue,\n !menu.column || menu.column.filterable === false\n )}\n {renderItem(\n isGroupedByCol ? 'folder_open' : 'workspaces',\n isGroupedByCol\n ? isTR\n ? 'Sütun Grubunu Kaldır'\n : 'Ungroup Column'\n : isTR\n ? 'Bu Sütuna Göre Grupla'\n : 'Group by This Column',\n undefined,\n onToggleGroupColumn,\n !menu.column\n )}\n\n {divider}\n\n {renderItem(\n 'backspace',\n isTR ? 'Hücre Değerini Temizle' : 'Clear Cell Value(s)',\n 'Del',\n onClearCells,\n !isCellEditable\n )}\n {renderItem(\n 'delete',\n isTR ? 'Satırı Sil (Delete Row)' : 'Delete Row',\n undefined,\n onDeleteRow,\n !canDelete,\n true\n )}\n </>\n )}\n </div>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport { ColumnDef } from '../types/grid';\nimport { IGridThemeTokens } from '../theme/IGridTheme';\nimport { IGridLocale } from '../i18n/IGridLocale';\n\nexport interface SparklineModalState {\n rowIndex: number;\n rowData: Record<string, any>;\n column: ColumnDef;\n points: number[];\n}\n\nexport interface SparklineModalOverlayProps {\n modal: SparklineModalState;\n theme: IGridThemeTokens;\n locale: IGridLocale;\n onClose: () => void;\n}\n\nexport const SparklineModalOverlay: React.FC<SparklineModalOverlayProps> = ({\n modal,\n theme,\n locale,\n onClose,\n}) => {\n const isTR = locale.code.startsWith('tr');\n const [chartType, setChartType] = useState<'area' | 'bar'>('area');\n const [hoveredIdx, setHoveredIdx] = useState<number | null>(null);\n\n const points = Array.isArray(modal.points) && modal.points.length > 0 ? modal.points : [0, 0];\n const n = points.length;\n\n const firstVal = points[0] ?? 0;\n const lastVal = points[n - 1] ?? 0;\n const diff = lastVal - firstVal;\n const pctChange = firstVal !== 0 ? (diff / Math.abs(firstVal)) * 100 : 0;\n\n const minVal = Math.min(...points);\n const maxVal = Math.max(...points);\n const minIdx = points.indexOf(minVal);\n const maxIdx = points.indexOf(maxVal);\n const sumVal = points.reduce((a, b) => a + b, 0);\n const avgVal = sumVal / n;\n const variance = points.reduce((acc, v) => acc + Math.pow(v - avgVal, 2), 0) / n;\n const stdDev = Math.sqrt(variance);\n\n const accentColor = modal.column.sparklineColor || '#38BDF8';\n const isPositive = diff >= 0;\n\n useEffect(() => {\n const handleKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', handleKey, true);\n return () => document.removeEventListener('keydown', handleKey, true);\n }, [onClose]);\n\n // SVG Chart dimensions\n const svgW = 580;\n const svgH = 220;\n const padL = 44;\n const padR = 24;\n const padT = 24;\n const padB = 34;\n const plotW = svgW - padL - padR;\n const plotH = svgH - padT - padB;\n\n const yMin = Math.max(0, Math.floor(minVal * 0.85));\n const yMax = Math.ceil(maxVal * 1.12) || 100;\n const yRange = yMax - yMin || 1;\n\n const getX = (i: number) => padL + (n > 1 ? (i / (n - 1)) * plotW : plotW / 2);\n const getY = (val: number) => padT + plotH - ((val - yMin) / yRange) * plotH;\n\n const linePath = points\n .map((v, i) => `${i === 0 ? 'M' : 'L'} ${getX(i).toFixed(1)} ${getY(v).toFixed(1)}`)\n .join(' ');\n const areaPath = `${linePath} L ${getX(n - 1).toFixed(1)} ${(padT + plotH).toFixed(1)} L ${getX(0).toFixed(1)} ${(padT + plotH).toFixed(1)} Z`;\n\n const avgY = getY(avgVal);\n\n const rowTitle =\n modal.rowData.company ||\n modal.rowData.code ||\n `Row #${modal.rowData.id ?? modal.rowIndex + 1}`;\n const rowSubtitle = [\n modal.rowData.code,\n modal.rowData.city,\n modal.rowData.category,\n ]\n .filter(Boolean)\n .join(' • ');\n\n return (\n <div\n onMouseDown={onClose}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 500,\n backgroundColor: 'rgba(0, 0, 0, 0.6)',\n backdropFilter: 'blur(6px)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: theme.fontFamily,\n userSelect: 'none',\n }}\n >\n <div\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n style={{\n width: 650,\n maxWidth: '94vw',\n maxHeight: '90vh',\n overflowY: 'auto',\n backgroundColor: theme.isDark ? '#0F172A' : '#FFFFFF',\n color: theme.isDark ? '#F8FAFC' : '#0F172A',\n border: `1px solid ${theme.isDark ? '#1E293B' : '#E2E8F0'}`,\n borderRadius: 16,\n boxShadow: '0 25px 70px rgba(0, 0, 0, 0.55)',\n padding: 22,\n }}\n >\n {/* Modal Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'space-between',\n paddingBottom: 14,\n borderBottom: `1px solid ${theme.isDark ? '#1E293B' : '#E2E8F0'}`,\n marginBottom: 16,\n }}\n >\n <div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <span\n style={{\n padding: '3px 8px',\n borderRadius: 6,\n backgroundColor: 'rgba(56, 189, 248, 0.16)',\n color: '#38BDF8',\n fontSize: 11,\n fontWeight: 800,\n }}\n >\n 📈 {modal.column.title}\n </span>\n <span style={{ fontSize: 16, fontWeight: 800 }}>{rowTitle}</span>\n </div>\n {rowSubtitle && (\n <div style={{ fontSize: 12, color: '#94A3B8', marginTop: 4 }}>{rowSubtitle}</div>\n )}\n </div>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n {/* Chart Mode Switcher */}\n <div\n style={{\n display: 'flex',\n padding: 2,\n borderRadius: 8,\n backgroundColor: theme.isDark ? '#1E293B' : '#F1F5F9',\n }}\n >\n <button\n type=\"button\"\n onClick={() => setChartType('area')}\n style={{\n padding: '4px 10px',\n fontSize: 11,\n fontWeight: 700,\n borderRadius: 6,\n border: 'none',\n backgroundColor:\n chartType === 'area'\n ? theme.isDark\n ? '#0284C7'\n : '#FFFFFF'\n : 'transparent',\n color:\n chartType === 'area'\n ? theme.isDark\n ? '#FFFFFF'\n : '#0284C7'\n : '#94A3B8',\n cursor: 'pointer',\n }}\n >\n {isTR ? '📈 Çizgi / Alan' : '📈 Area Line'}\n </button>\n <button\n type=\"button\"\n onClick={() => setChartType('bar')}\n style={{\n padding: '4px 10px',\n fontSize: 11,\n fontWeight: 700,\n borderRadius: 6,\n border: 'none',\n backgroundColor:\n chartType === 'bar'\n ? theme.isDark\n ? '#0284C7'\n : '#FFFFFF'\n : 'transparent',\n color:\n chartType === 'bar'\n ? theme.isDark\n ? '#FFFFFF'\n : '#0284C7'\n : '#94A3B8',\n cursor: 'pointer',\n }}\n >\n {isTR ? '📊 Sütun' : '📊 Bar Chart'}\n </button>\n </div>\n\n <button\n type=\"button\"\n onClick={onClose}\n style={{\n width: 30,\n height: 30,\n borderRadius: 8,\n border: `1px solid ${theme.isDark ? '#334155' : '#CBD5E1'}`,\n backgroundColor: 'transparent',\n color: '#94A3B8',\n fontSize: 15,\n cursor: 'pointer',\n }}\n >\n ✕\n </button>\n </div>\n </div>\n\n {/* KPI Summary Cards */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(5, 1fr)',\n gap: 10,\n marginBottom: 16,\n }}\n >\n <div\n style={{\n padding: '10px 12px',\n borderRadius: 10,\n backgroundColor: theme.isDark ? '#1E293B' : '#F8FAFC',\n border: `1px solid ${theme.isDark ? '#334155' : '#E2E8F0'}`,\n }}\n >\n <div style={{ fontSize: 10, color: '#94A3B8', fontWeight: 700 }}>\n {isTR ? 'SON DEĞER' : 'CURRENT'}\n </div>\n <div style={{ fontSize: 18, fontWeight: 800, marginTop: 2 }}>{lastVal}</div>\n </div>\n\n <div\n style={{\n padding: '10px 12px',\n borderRadius: 10,\n backgroundColor: theme.isDark ? '#1E293B' : '#F8FAFC',\n border: `1px solid ${theme.isDark ? '#334155' : '#E2E8F0'}`,\n }}\n >\n <div style={{ fontSize: 10, color: '#94A3B8', fontWeight: 700 }}>\n {isTR ? '7G DEĞİŞİM' : '7D CHANGE'}\n </div>\n <div\n style={{\n fontSize: 16,\n fontWeight: 800,\n marginTop: 2,\n color: isPositive ? '#10B981' : '#EF4444',\n }}\n >\n {isPositive ? '+' : ''}\n {pctChange.toFixed(1)}% ({isPositive ? `+${diff}` : diff})\n </div>\n </div>\n\n <div\n style={{\n padding: '10px 12px',\n borderRadius: 10,\n backgroundColor: theme.isDark ? '#1E293B' : '#F8FAFC',\n border: `1px solid ${theme.isDark ? '#334155' : '#E2E8F0'}`,\n }}\n >\n <div style={{ fontSize: 10, color: '#94A3B8', fontWeight: 700 }}>\n {isTR ? 'ORTALAMA' : 'AVERAGE'}\n </div>\n <div style={{ fontSize: 18, fontWeight: 800, marginTop: 2, color: '#38BDF8' }}>\n {avgVal.toFixed(1)}\n </div>\n </div>\n\n <div\n style={{\n padding: '10px 12px',\n borderRadius: 10,\n backgroundColor: theme.isDark ? '#1E293B' : '#F8FAFC',\n border: `1px solid ${theme.isDark ? '#334155' : '#E2E8F0'}`,\n }}\n >\n <div style={{ fontSize: 10, color: '#94A3B8', fontWeight: 700 }}>\n {isTR ? `ZİRVE (GÜN ${maxIdx + 1})` : `PEAK (D${maxIdx + 1})`}\n </div>\n <div style={{ fontSize: 18, fontWeight: 800, marginTop: 2, color: '#10B981' }}>\n {maxVal}\n </div>\n </div>\n\n <div\n style={{\n padding: '10px 12px',\n borderRadius: 10,\n backgroundColor: theme.isDark ? '#1E293B' : '#F8FAFC',\n border: `1px solid ${theme.isDark ? '#334155' : '#E2E8F0'}`,\n }}\n >\n <div style={{ fontSize: 10, color: '#94A3B8', fontWeight: 700 }}>\n {isTR ? `DİP / SAPMA` : `LOW / STD`}\n </div>\n <div style={{ fontSize: 15, fontWeight: 800, marginTop: 2 }}>\n {minVal} <span style={{ fontSize: 11, color: '#94A3B8' }}>(±{stdDev.toFixed(1)})</span>\n </div>\n </div>\n </div>\n\n {/* Interactive SVG Chart */}\n <div\n style={{\n padding: '14px 12px 8px',\n borderRadius: 12,\n backgroundColor: theme.isDark ? '#0B1120' : '#F8FAFC',\n border: `1px solid ${theme.isDark ? '#1E293B' : '#E2E8F0'}`,\n marginBottom: 16,\n position: 'relative',\n }}\n >\n <svg\n viewBox={`0 0 ${svgW} ${svgH}`}\n style={{ width: '100%', height: 220, overflow: 'visible', display: 'block' }}\n >\n <defs>\n <linearGradient id=\"sparkModalGrad\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={accentColor} stopOpacity=\"0.38\" />\n <stop offset=\"100%\" stopColor={accentColor} stopOpacity=\"0.0\" />\n </linearGradient>\n </defs>\n\n {/* Horizontal Grid Lines & Y-Axis Labels */}\n {[0, 0.25, 0.5, 0.75, 1].map((t, idx) => {\n const val = Math.round(yMin + t * yRange);\n const y = getY(val);\n return (\n <g key={idx}>\n <line\n x1={padL}\n y1={y}\n x2={svgW - padR}\n y2={y}\n stroke={theme.isDark ? 'rgba(255,255,255,0.07)' : 'rgba(15,23,42,0.07)'}\n strokeWidth=\"1\"\n />\n <text\n x={padL - 8}\n y={y + 4}\n textAnchor=\"end\"\n fill=\"#94A3B8\"\n fontSize=\"10\"\n fontFamily=\"monospace\"\n >\n {val}\n </text>\n </g>\n );\n })}\n\n {/* Average Reference Dashed Line */}\n <line\n x1={padL}\n y1={avgY}\n x2={svgW - padR}\n y2={avgY}\n stroke=\"#F59E0B\"\n strokeWidth=\"1.3\"\n strokeDasharray=\"5 4\"\n />\n <text\n x={svgW - padR - 4}\n y={avgY - 5}\n textAnchor=\"end\"\n fill=\"#F59E0B\"\n fontSize=\"10\"\n fontWeight=\"700\"\n >\n AVG: {avgVal.toFixed(1)}\n </text>\n\n {chartType === 'area' ? (\n <>\n <path d={areaPath} fill=\"url(#sparkModalGrad)\" />\n <path\n d={linePath}\n fill=\"none\"\n stroke={accentColor}\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </>\n ) : (\n points.map((v, i) => {\n const bw = Math.min(38, plotW / (n * 1.6));\n const bx = getX(i) - bw / 2;\n const by = getY(v);\n const bh = Math.max(2, padT + plotH - by);\n const isHov = hoveredIdx === i;\n return (\n <rect\n key={i}\n x={bx}\n y={by}\n width={bw}\n height={bh}\n rx={5}\n fill={isHov ? '#38BDF8' : accentColor}\n opacity={isHov ? 1 : 0.82}\n style={{ cursor: 'pointer' }}\n onMouseEnter={() => setHoveredIdx(i)}\n onMouseLeave={() => setHoveredIdx(null)}\n />\n );\n })\n )}\n\n {/* Data Points & X-Axis Labels */}\n {points.map((v, i) => {\n const cx = getX(i);\n const cy = getY(v);\n const isHov = hoveredIdx === i;\n return (\n <g\n key={i}\n style={{ cursor: 'pointer' }}\n onMouseEnter={() => setHoveredIdx(i)}\n onMouseLeave={() => setHoveredIdx(null)}\n >\n {/* Hover vertical guide */}\n {isHov && (\n <line\n x1={cx}\n y1={padT}\n x2={cx}\n y2={padT + plotH}\n stroke={accentColor}\n strokeWidth=\"1\"\n strokeDasharray=\"3 3\"\n />\n )}\n\n <circle\n cx={cx}\n cy={cy}\n r={isHov ? 6.5 : 4.5}\n fill={isHov ? '#FFFFFF' : accentColor}\n stroke={accentColor}\n strokeWidth={isHov ? 3 : 2}\n />\n\n {/* Value label above node */}\n <text\n x={cx}\n y={cy - 10}\n textAnchor=\"middle\"\n fill={isHov ? '#38BDF8' : theme.isDark ? '#E2E8F0' : '#334155'}\n fontSize={isHov ? '12' : '10'}\n fontWeight=\"700\"\n >\n {v}\n </text>\n\n {/* X-Axis Day Label */}\n <text\n x={cx}\n y={svgH - 10}\n textAnchor=\"middle\"\n fill={isHov ? '#38BDF8' : '#94A3B8'}\n fontSize=\"11\"\n fontWeight={isHov ? '700' : '600'}\n >\n {isTR ? `Gün ${i + 1}` : `Day ${i + 1}`}\n </text>\n </g>\n );\n })}\n </svg>\n </div>\n\n {/* Day-by-Day Breakdown Table */}\n <div>\n <div\n style={{\n fontSize: 11,\n fontWeight: 700,\n color: '#94A3B8',\n marginBottom: 8,\n textTransform: 'uppercase',\n }}\n >\n {isTR ? 'GÜNLÜK DETAYLI KIRILIM TABLOSU' : 'DAILY TREND BREAKDOWN'}\n </div>\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: 6,\n }}\n >\n {points.map((v, i) => {\n const prev = i > 0 ? points[i - 1] : v;\n const delta = v - prev;\n const isHov = hoveredIdx === i;\n return (\n <div\n key={i}\n onMouseEnter={() => setHoveredIdx(i)}\n onMouseLeave={() => setHoveredIdx(null)}\n style={{\n padding: '8px 6px',\n borderRadius: 8,\n textAlign: 'center',\n backgroundColor: isHov\n ? 'rgba(56, 189, 248, 0.15)'\n : theme.isDark\n ? '#1E293B'\n : '#F1F5F9',\n border: `1px solid ${\n isHov ? '#38BDF8' : theme.isDark ? '#334155' : '#E2E8F0'\n }`,\n cursor: 'pointer',\n }}\n >\n <div style={{ fontSize: 10, color: '#94A3B8', fontWeight: 600 }}>\n {isTR ? `Gün ${i + 1}` : `Day ${i + 1}`}\n </div>\n <div style={{ fontSize: 14, fontWeight: 800, margin: '3px 0' }}>{v}</div>\n <div\n style={{\n fontSize: 10,\n fontWeight: 700,\n color:\n i === 0\n ? '#94A3B8'\n : delta > 0\n ? '#10B981'\n : delta < 0\n ? '#EF4444'\n : '#94A3B8',\n }}\n >\n {i === 0 ? '—' : delta > 0 ? `▲ +${delta}` : delta < 0 ? `▼ ${delta}` : '0'}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\n\nexport interface SheetGLLogoProps {\n size?: number;\n glow?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const SheetGLLogo: React.FC<SheetGLLogoProps> = ({\n size = 22,\n glow = false,\n className,\n style,\n}) => {\n const height = (size * 46) / 48;\n return (\n <div\n className={className}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n position: 'relative',\n width: size,\n height,\n filter: glow\n ? 'drop-shadow(0 0 16px rgba(134, 59, 255, 0.6)) drop-shadow(0 0 30px rgba(71, 191, 255, 0.4))'\n : 'drop-shadow(0 1px 2px rgba(0, 0, 0, 0.15))',\n flexShrink: 0,\n ...style,\n }}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={height}\n fill=\"none\"\n viewBox=\"0 0 48 46\"\n style={{ width: '100%', height: '100%', display: 'block' }}\n >\n <path\n fill=\"#863bff\"\n d=\"M25.946 44.938c-.664.845-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.287c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.497 0-3.578-1.842-3.578H1.237c-.92 0-1.456-1.04-.92-1.788L10.013.474c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.579 1.842 3.579h11.377c.943 0 1.473 1.088.89 1.83L25.947 44.94z\"\n style={{ fill: '#863bff', fillOpacity: 1 }}\n />\n <mask\n id=\"sheetgl-logo-mask\"\n width=\"48\"\n height=\"46\"\n x=\"0\"\n y=\"0\"\n maskUnits=\"userSpaceOnUse\"\n style={{ maskType: 'alpha' }}\n >\n <path\n fill=\"#000\"\n d=\"M25.842 44.938c-.664.844-2.021.375-2.021-.698V33.937a2.26 2.26 0 0 0-2.262-2.262H10.183c-.92 0-1.456-1.04-.92-1.788l7.48-10.471c1.07-1.498 0-3.579-1.842-3.579H1.133c-.92 0-1.456-1.04-.92-1.787L9.91.473c.214-.297.556-.474.92-.474h28.894c.92 0 1.456 1.04.92 1.788l-7.48 10.471c-1.07 1.498 0 3.578 1.842 3.578h11.377c.943 0 1.473 1.088.89 1.832L25.843 44.94z\"\n style={{ fill: '#000', fillOpacity: 1 }}\n />\n </mask>\n <g mask=\"url(#sheetgl-logo-mask)\">\n <g filter=\"url(#sgl-b)\">\n <ellipse\n cx=\"5.508\"\n cy=\"14.704\"\n fill=\"#ede6ff\"\n rx=\"5.508\"\n ry=\"14.704\"\n transform=\"matrix(.00324 1 1 -.00324 -4.47 31.516)\"\n />\n </g>\n <g filter=\"url(#sgl-c)\">\n <ellipse\n cx=\"10.399\"\n cy=\"29.851\"\n fill=\"#ede6ff\"\n rx=\"10.399\"\n ry=\"29.851\"\n transform=\"matrix(.00324 1 1 -.00324 -39.328 7.883)\"\n />\n </g>\n <g filter=\"url(#sgl-d)\">\n <ellipse\n cx=\"5.508\"\n cy=\"30.487\"\n fill=\"#7e14ff\"\n rx=\"5.508\"\n ry=\"30.487\"\n transform=\"rotate(89.814 -25.913 -14.639)scale(1 -1)\"\n />\n </g>\n <g filter=\"url(#sgl-e)\">\n <ellipse\n cx=\"5.508\"\n cy=\"30.599\"\n fill=\"#7e14ff\"\n rx=\"5.508\"\n ry=\"30.599\"\n transform=\"rotate(89.814 -32.644 -3.334)scale(1 -1)\"\n />\n </g>\n <g filter=\"url(#sgl-f)\">\n <ellipse\n cx=\"5.508\"\n cy=\"30.599\"\n fill=\"#7e14ff\"\n rx=\"5.508\"\n ry=\"30.599\"\n transform=\"matrix(.00324 1 1 -.00324 -34.34 30.47)\"\n />\n </g>\n <g filter=\"url(#sgl-g)\">\n <ellipse\n cx=\"14.072\"\n cy=\"22.078\"\n fill=\"#ede6ff\"\n rx=\"14.072\"\n ry=\"22.078\"\n transform=\"rotate(93.35 24.506 48.493)scale(-1 1)\"\n />\n </g>\n <g filter=\"url(#sgl-h)\">\n <ellipse\n cx=\"3.47\"\n cy=\"21.501\"\n fill=\"#7e14ff\"\n rx=\"3.47\"\n ry=\"21.501\"\n transform=\"rotate(89.009 28.708 47.59)scale(-1 1)\"\n />\n </g>\n <g filter=\"url(#sgl-i)\">\n <ellipse\n cx=\"3.47\"\n cy=\"21.501\"\n fill=\"#7e14ff\"\n rx=\"3.47\"\n ry=\"21.501\"\n transform=\"rotate(89.009 28.708 47.59)scale(-1 1)\"\n />\n </g>\n <g filter=\"url(#sgl-j)\">\n <ellipse\n cx=\".387\"\n cy=\"8.972\"\n fill=\"#7e14ff\"\n rx=\"4.407\"\n ry=\"29.108\"\n transform=\"rotate(39.51 .387 8.972)\"\n />\n </g>\n <g filter=\"url(#sgl-k)\">\n <ellipse\n cx=\"47.523\"\n cy=\"-6.092\"\n fill=\"#7e14ff\"\n rx=\"4.407\"\n ry=\"29.108\"\n transform=\"rotate(37.892 47.523 -6.092)\"\n />\n </g>\n <g filter=\"url(#sgl-l)\">\n <ellipse\n cx=\"41.412\"\n cy=\"6.333\"\n fill=\"#47bfff\"\n rx=\"5.971\"\n ry=\"9.665\"\n transform=\"rotate(37.892 41.412 6.333)\"\n />\n </g>\n <g filter=\"url(#sgl-m)\">\n <ellipse\n cx=\"-1.879\"\n cy=\"38.332\"\n fill=\"#7e14ff\"\n rx=\"4.407\"\n ry=\"29.108\"\n transform=\"rotate(37.892 -1.88 38.332)\"\n />\n </g>\n <g filter=\"url(#sgl-n)\">\n <ellipse\n cx=\"-1.879\"\n cy=\"38.332\"\n fill=\"#7e14ff\"\n rx=\"4.407\"\n ry=\"29.108\"\n transform=\"rotate(37.892 -1.88 38.332)\"\n />\n </g>\n <g filter=\"url(#sgl-o)\">\n <ellipse\n cx=\"35.651\"\n cy=\"29.907\"\n fill=\"#7e14ff\"\n rx=\"4.407\"\n ry=\"29.108\"\n transform=\"rotate(37.892 35.651 29.907)\"\n />\n </g>\n <g filter=\"url(#sgl-p)\">\n <ellipse\n cx=\"38.418\"\n cy=\"32.4\"\n fill=\"#47bfff\"\n rx=\"5.971\"\n ry=\"15.297\"\n transform=\"rotate(37.892 38.418 32.4)\"\n />\n </g>\n </g>\n <defs>\n <filter id=\"sgl-b\" width=\"60.045\" height=\"41.654\" x=\"-19.77\" y=\"16.149\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"7.659\" />\n </filter>\n <filter id=\"sgl-c\" width=\"90.34\" height=\"51.437\" x=\"-54.613\" y=\"-7.533\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"7.659\" />\n </filter>\n <filter id=\"sgl-d\" width=\"79.355\" height=\"29.4\" x=\"-49.64\" y=\"2.03\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id=\"sgl-e\" width=\"79.579\" height=\"29.4\" x=\"-45.045\" y=\"20.029\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id=\"sgl-f\" width=\"79.579\" height=\"29.4\" x=\"-43.513\" y=\"21.178\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id=\"sgl-g\" width=\"74.749\" height=\"58.852\" x=\"15.756\" y=\"-17.901\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"7.659\" />\n </filter>\n <filter id=\"sgl-h\" width=\"61.377\" height=\"25.362\" x=\"23.548\" y=\"2.284\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id=\"sgl-i\" width=\"61.377\" height=\"25.362\" x=\"23.548\" y=\"2.284\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id=\"sgl-j\" width=\"56.045\" height=\"63.649\" x=\"-27.636\" y=\"-22.853\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id=\"sgl-k\" width=\"54.814\" height=\"64.646\" x=\"20.116\" y=\"-38.415\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id=\"sgl-l\" width=\"33.541\" height=\"35.313\" x=\"24.641\" y=\"-11.323\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id=\"sgl-m\" width=\"54.814\" height=\"64.646\" x=\"-29.286\" y=\"6.009\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id=\"sgl-n\" width=\"54.814\" height=\"64.646\" x=\"-29.286\" y=\"6.009\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id=\"sgl-o\" width=\"54.814\" height=\"64.646\" x=\"8.244\" y=\"-2.416\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n <filter id=\"sgl-p\" width=\"39.409\" height=\"43.623\" x=\"18.713\" y=\"10.588\" colorInterpolationFilters=\"sRGB\" filterUnits=\"userSpaceOnUse\">\n <feFlood floodOpacity=\"0\" result=\"BackgroundImageFix\" />\n <feBlend in=\"SourceGraphic\" in2=\"BackgroundImageFix\" result=\"shape\" />\n <feGaussianBlur result=\"effect1_foregroundBlur\" stdDeviation=\"4.596\" />\n </filter>\n </defs>\n </svg>\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { IGridThemeTokens } from '../theme/IGridTheme';\nimport { ThemeInput } from '../theme/ThemeEngine';\nimport {\n ColumnDef,\n GridPermissions,\n GridSummaryConfig,\n GridToolbarConfig,\n GridToolbarCustomItem,\n ToolbarButtonDisplayMode,\n} from '../types/grid';\nimport { SummaryType } from '../types/group';\nimport { IGridLocale } from '../i18n/IGridLocale';\nimport { SheetGLLogo } from './SheetGLLogo';\nimport { MaterialIcon } from './MaterialIcon';\n\nexport interface ToolBarProps {\n theme: IGridThemeTokens;\n locale: IGridLocale;\n currentThemeName: string;\n onThemeChange: (theme: ThemeInput) => void;\n onLocaleChange?: (localeCode: string) => void;\n searchKeyword: string;\n onSearchChange: (keyword: string) => void;\n onExportCsv: () => void;\n groups: string[];\n onToggleGroupColumn: (columnId: string) => void;\n onExpandAllGroups?: () => void;\n onCollapseAllGroups?: () => void;\n availableColumns: ColumnDef[];\n onUpdateColumn?: (colId: string, patch: Partial<ColumnDef>) => void;\n summaryTypes?: Record<string, SummaryType>;\n onChangeSummaryType?: (colId: string, sType: SummaryType) => void;\n permissions?: GridPermissions;\n onPermissionsChange?: (perms: GridPermissions) => void;\n onAddRow?: () => void;\n onDuplicateRow?: () => void;\n onDeleteRow?: () => void;\n canUndo?: boolean;\n canRedo?: boolean;\n onUndo?: () => void;\n onRedo?: () => void;\n pendingChangesCount?: number;\n onSaveBatch?: () => void;\n onDiscardBatch?: () => void;\n activeFilterCount?: number;\n onClearAllFilters?: () => void;\n toolbarConfig?: GridToolbarConfig;\n onUpdateToolbarConfig?: (patch: Partial<GridToolbarConfig>) => void;\n summaryConfig?: GridSummaryConfig;\n onUpdateSummaryConfig?: (patch: Partial<GridSummaryConfig>) => void;\n}\n\nexport const ToolBar: React.FC<ToolBarProps> = ({\n theme,\n locale,\n currentThemeName,\n onThemeChange,\n onLocaleChange,\n searchKeyword,\n onSearchChange,\n onExportCsv,\n groups,\n onToggleGroupColumn,\n onExpandAllGroups,\n onCollapseAllGroups,\n availableColumns,\n onUpdateColumn,\n summaryTypes = {},\n onChangeSummaryType,\n permissions,\n onPermissionsChange,\n onAddRow,\n onDuplicateRow,\n onDeleteRow,\n canUndo,\n canRedo,\n onUndo,\n onRedo,\n pendingChangesCount = 0,\n onSaveBatch,\n onDiscardBatch,\n activeFilterCount = 0,\n onClearAllFilters,\n toolbarConfig,\n onUpdateToolbarConfig,\n summaryConfig,\n onUpdateSummaryConfig,\n}) => {\n const [showColSettings, setShowColSettings] = useState(false);\n const [settingsTab, setSettingsTab] = useState<'columns' | 'layout'>('columns');\n const isTR = locale.code.startsWith('tr');\n\n if (toolbarConfig?.visible === false) {\n return null;\n }\n\n const displayMode: ToolbarButtonDisplayMode = toolbarConfig?.buttonDisplayMode || 'icon-text';\n const allowDisplayModeSwitch = toolbarConfig?.allowDisplayModeSwitch !== false;\n\n const showBrand = toolbarConfig?.showBrand !== false;\n const showAddRow = toolbarConfig?.showAddRow !== false;\n const showDuplicateRow = toolbarConfig?.showDuplicateRow !== false;\n const showDeleteRow = toolbarConfig?.showDeleteRow !== false;\n const showUndoRedo = toolbarConfig?.showUndoRedo !== false;\n const showSearch = toolbarConfig?.showSearch !== false;\n const showGroupBy = toolbarConfig?.showGroupBy !== false;\n const showClearFilters = toolbarConfig?.showClearFilters !== false;\n const showBatchActions = toolbarConfig?.showBatchActions !== false;\n const showPermissionsSwitch = toolbarConfig?.showPermissionsSwitch !== false;\n const showColumnSettings = toolbarConfig?.showColumnSettings !== false;\n const showLocaleSwitch = toolbarConfig?.showLocaleSwitch !== false;\n const showThemeSwitch = toolbarConfig?.showThemeSwitch !== false;\n const showExportCsv = toolbarConfig?.showExportCsv !== false;\n\n const isReadonlyMode = permissions?.mode === 'readonly' || permissions?.mode === 'read';\n const canAdd = !isReadonlyMode && permissions?.allowAdding !== false;\n const canDup = !isReadonlyMode && permissions?.allowDuplicating !== false;\n const canDel = !isReadonlyMode && permissions?.allowDeleting !== false;\n const canEdit = !isReadonlyMode && permissions?.allowUpdating !== false;\n\n const btnStyle = (\n disabled?: boolean,\n highlight?: boolean,\n modeOverride?: ToolbarButtonDisplayMode\n ): React.CSSProperties => {\n const m = modeOverride || displayMode;\n return {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: m === 'icon-text' ? 5 : 0,\n padding: m === 'icon' ? '5px 7px' : '4px 9px',\n borderRadius: 6,\n border: `1px solid ${highlight ? theme.dom.accentColor : theme.dom.inputBorder}`,\n backgroundColor: highlight ? theme.dom.accentColor : theme.dom.inputBg,\n color: highlight ? '#FFFFFF' : theme.dom.toolbarText,\n fontSize: 11,\n fontWeight: 600,\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.42 : 1,\n fontFamily: theme.fontFamily,\n whiteSpace: 'nowrap',\n transition: 'all 0.12s ease',\n };\n };\n\n /**\n * Renders button content according to ToolbarButtonDisplayMode:\n * - 'icon': Google Material Symbols icon only\n * - 'icon-text': Google Material Symbols icon + text label\n * - 'text': Text label only\n */\n const renderBtnContent = (\n iconName: string,\n label: string,\n modeOverride?: ToolbarButtonDisplayMode,\n iconColor?: string,\n iconSize: number = 15\n ) => {\n const m = modeOverride || displayMode;\n return (\n <>\n {(m === 'icon' || m === 'icon-text') && (\n <MaterialIcon name={iconName} size={iconSize} color={iconColor} />\n )}\n {(m === 'icon-text' || m === 'text') && <span>{label}</span>}\n </>\n );\n };\n\n const renderCustomItem = (item: GridToolbarCustomItem) => {\n const itemMode = item.displayMode || displayMode;\n const isPrimary = item.variant === 'primary' || item.active;\n const isDanger = item.variant === 'danger';\n const isSuccess = item.variant === 'success';\n\n const baseStyle = btnStyle(item.disabled, isPrimary, itemMode);\n if (isDanger) {\n baseStyle.color = '#FF453A';\n baseStyle.borderColor = 'rgba(255, 69, 58, 0.35)';\n } else if (isSuccess) {\n baseStyle.backgroundColor = '#30D158';\n baseStyle.borderColor = '#30D158';\n baseStyle.color = '#FFFFFF';\n }\n\n return (\n <button\n key={item.id}\n type=\"button\"\n disabled={item.disabled}\n title={item.tooltip || item.label}\n onClick={item.onClick}\n style={baseStyle}\n >\n {item.icon\n ? renderBtnContent(\n item.icon,\n item.label,\n itemMode,\n isPrimary || isSuccess ? '#FFFFFF' : isDanger ? '#FF453A' : undefined\n )\n : item.label}\n </button>\n );\n };\n\n const leftCustomItems = (toolbarConfig?.customItems || []).filter(\n (i) => (i.position || 'left') === 'left'\n );\n const rightCustomItems = (toolbarConfig?.customItems || []).filter(\n (i) => i.position === 'right'\n );\n\n return (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n backgroundColor: theme.dom.toolbarBg,\n borderBottom: `1px solid ${theme.dom.toolbarBorder}`,\n backdropFilter: theme.dom.glassBackdrop,\n WebkitBackdropFilter: theme.dom.glassBackdrop,\n color: theme.dom.toolbarText,\n fontFamily: theme.fontFamily,\n fontSize: 12,\n userSelect: 'none',\n position: 'relative',\n zIndex: 140,\n }}\n >\n {/* PRIMARY TOOLBAR ROW */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '7px 12px',\n gap: 10,\n flexWrap: 'wrap',\n }}\n >\n {/* Left: Brand + CRUD Action Buttons + Undo/Redo + Custom Left Items */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>\n {showBrand && (\n <>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n fontWeight: 700,\n fontSize: 13,\n marginRight: 4,\n }}\n >\n <SheetGLLogo size={20} />\n <span>SheetGL</span>\n </div>\n\n <div\n style={{\n width: 1,\n height: 18,\n backgroundColor: theme.dom.toolbarBorder,\n margin: '0 2px',\n }}\n />\n </>\n )}\n\n {/* CRUD Action Buttons */}\n {showAddRow && onAddRow && (\n <button\n type=\"button\"\n disabled={!canAdd}\n onClick={onAddRow}\n title={isTR ? 'Yeni Satır Ekle (Insert)' : 'Insert New Row'}\n style={btnStyle(!canAdd)}\n >\n {renderBtnContent('add', isTR ? 'Satır Ekle' : 'Add Row', undefined, '#30D158')}\n </button>\n )}\n\n {showDuplicateRow && onDuplicateRow && (\n <button\n type=\"button\"\n disabled={!canDup}\n onClick={onDuplicateRow}\n title={isTR ? 'Seçili Satırı Çoğalt (Ctrl+Shift+D)' : 'Duplicate Selected Row'}\n style={btnStyle(!canDup)}\n >\n {renderBtnContent(\n 'content_copy',\n isTR ? 'Çoğalt' : 'Duplicate',\n undefined,\n theme.dom.accentColor\n )}\n </button>\n )}\n\n {showDeleteRow && onDeleteRow && (\n <button\n type=\"button\"\n disabled={!canDel}\n onClick={onDeleteRow}\n title={isTR ? 'Seçili Satırı Sil' : 'Delete Selected Row'}\n style={{\n ...btnStyle(!canDel),\n color: canDel ? '#FF453A' : theme.dom.toolbarText,\n }}\n >\n {renderBtnContent(\n 'delete',\n isTR ? 'Sil' : 'Delete',\n undefined,\n canDel ? '#FF453A' : undefined\n )}\n </button>\n )}\n\n {/* Undo / Redo */}\n {showUndoRedo && (onUndo || onRedo) && (\n <>\n <div\n style={{\n width: 1,\n height: 18,\n backgroundColor: theme.dom.toolbarBorder,\n margin: '0 2px',\n }}\n />\n <button\n type=\"button\"\n disabled={!canUndo || !canEdit}\n onClick={onUndo}\n title={isTR ? 'Geri Al (Ctrl+Z)' : 'Undo (Ctrl+Z)'}\n style={btnStyle(!canUndo || !canEdit)}\n >\n {renderBtnContent('undo', isTR ? 'Geri Al' : 'Undo')}\n </button>\n <button\n type=\"button\"\n disabled={!canRedo || !canEdit}\n onClick={onRedo}\n title={isTR ? 'İleri Al (Ctrl+Y)' : 'Redo (Ctrl+Y)'}\n style={btnStyle(!canRedo || !canEdit)}\n >\n {renderBtnContent('redo', isTR ? 'İleri Al' : 'Redo')}\n </button>\n </>\n )}\n\n {leftCustomItems.map(renderCustomItem)}\n </div>\n\n {/* Center: Search + Group Selector + Active Filter Clear */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flex: 1,\n maxWidth: 500,\n minWidth: 200,\n }}\n >\n {showSearch && (\n <div style={{ position: 'relative', flex: 1 }}>\n <span\n style={{\n position: 'absolute',\n left: 8,\n top: '50%',\n transform: 'translateY(-50%)',\n display: 'inline-flex',\n alignItems: 'center',\n pointerEvents: 'none',\n }}\n >\n <MaterialIcon\n name=\"search\"\n size={15}\n color={theme.isDark ? '#8E8E93' : '#6E6E73'}\n />\n </span>\n <input\n type=\"text\"\n placeholder={locale.searchPlaceholder}\n value={searchKeyword}\n onChange={(e) => onSearchChange(e.target.value)}\n style={{\n width: '100%',\n padding: '5px 26px 5px 28px',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `1px solid ${theme.dom.inputBorder}`,\n borderRadius: 6,\n outline: 'none',\n fontSize: 12,\n fontFamily: theme.fontFamily,\n boxSizing: 'border-box',\n }}\n />\n {searchKeyword && (\n <button\n type=\"button\"\n onClick={() => onSearchChange('')}\n style={{\n position: 'absolute',\n right: 5,\n top: '50%',\n transform: 'translateY(-50%)',\n border: 'none',\n background: 'transparent',\n color: '#8E8E93',\n cursor: 'pointer',\n padding: 2,\n display: 'inline-flex',\n alignItems: 'center',\n }}\n >\n <MaterialIcon name=\"close\" size={14} color=\"#8E8E93\" />\n </button>\n )}\n </div>\n )}\n\n {showGroupBy && (\n <div style={{ position: 'relative', display: 'inline-flex', alignItems: 'center' }}>\n <MaterialIcon\n name=\"workspaces\"\n size={14}\n color={theme.isDark ? '#8E8E93' : '#6E6E73'}\n style={{ position: 'absolute', left: 7, pointerEvents: 'none' }}\n />\n <select\n value=\"\"\n disabled={permissions?.allowGrouping === false}\n onChange={(e) => {\n if (e.target.value) {\n onToggleGroupColumn(e.target.value);\n }\n }}\n style={{\n padding: '5px 8px 5px 24px',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `1px solid ${theme.dom.inputBorder}`,\n borderRadius: 6,\n outline: 'none',\n fontSize: 11,\n cursor: 'pointer',\n }}\n >\n <option value=\"\">{locale.addGroup}</option>\n {availableColumns\n .filter((c) => c.type !== 'sparkline' && c.type !== 'action')\n .map((c) => (\n <option key={c.id} value={c.id}>\n {c.title} {groups.includes(c.id) ? '✓' : ''}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {showClearFilters && activeFilterCount > 0 && onClearAllFilters && (\n <button\n type=\"button\"\n onClick={onClearAllFilters}\n title={isTR ? 'Tüm aktif filtreleri temizle' : 'Clear all active filters'}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: displayMode === 'icon' ? '5px 7px' : '4px 8px',\n borderRadius: 6,\n border: `1px solid ${theme.dom.accentColor}`,\n backgroundColor: theme.isDark\n ? 'rgba(10,132,255,0.16)'\n : 'rgba(0,122,255,0.1)',\n color: theme.dom.accentColor,\n fontSize: 11,\n fontWeight: 600,\n cursor: 'pointer',\n whiteSpace: 'nowrap',\n }}\n >\n {renderBtnContent(\n 'filter_alt_off',\n isTR ? `Filtreler (${activeFilterCount})` : `Filters (${activeFilterCount})`,\n undefined,\n theme.dom.accentColor\n )}\n </button>\n )}\n </div>\n\n {/* Right: Batch Save Bar + Display Mode Switch + Permissions + Column/Summary Settings + Locale + Theme + Export */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>\n {/* Batch Save / Discard Controls */}\n {showBatchActions && pendingChangesCount > 0 && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 5,\n padding: '2px 6px',\n borderRadius: 7,\n backgroundColor: theme.isDark\n ? 'rgba(48, 209, 88, 0.14)'\n : 'rgba(52, 199, 89, 0.12)',\n border: '1px solid rgba(48, 209, 88, 0.4)',\n }}\n >\n <span\n style={{\n fontSize: 11,\n fontWeight: 700,\n color: '#30D158',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 3,\n }}\n >\n <MaterialIcon name=\"pending_actions\" size={14} color=\"#30D158\" />\n {pendingChangesCount} {isTR ? 'Değişiklik' : 'Unsaved'}\n </span>\n {onSaveBatch && (\n <button\n type=\"button\"\n onClick={onSaveBatch}\n title={isTR ? 'Toplu Kaydet (Batch Save)' : 'Batch Save Changes'}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: displayMode === 'icon' ? '4px 6px' : '3px 8px',\n borderRadius: 5,\n border: 'none',\n backgroundColor: '#30D158',\n color: '#FFFFFF',\n fontSize: 11,\n fontWeight: 700,\n cursor: 'pointer',\n }}\n >\n {renderBtnContent(\n 'save',\n isTR ? 'Toplu Kaydet' : 'Batch Save',\n undefined,\n '#FFFFFF',\n 14\n )}\n </button>\n )}\n {onDiscardBatch && (\n <button\n type=\"button\"\n onClick={onDiscardBatch}\n title={isTR ? 'Değişiklikleri Geri Al' : 'Discard Changes'}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: displayMode === 'icon' ? '4px 6px' : '3px 7px',\n borderRadius: 5,\n border: `1px solid ${theme.dom.inputBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.toolbarText,\n fontSize: 11,\n cursor: 'pointer',\n }}\n >\n {renderBtnContent(\n 'restore',\n isTR ? 'Vazgeç' : 'Discard',\n undefined,\n undefined,\n 14\n )}\n </button>\n )}\n </div>\n )}\n\n {/* Toolbar Button Display Mode Switcher (Icon | Icon+Text | Text) */}\n {allowDisplayModeSwitch && onUpdateToolbarConfig && (\n <div\n title={\n isTR\n ? 'Toolbar Buton Görünümü: İkon / İkon+Metin / Metin'\n : 'Toolbar Button Display Mode: Icon / Icon+Text / Text'\n }\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n backgroundColor: theme.dom.inputBg,\n border: `1px solid ${theme.dom.inputBorder}`,\n borderRadius: 6,\n padding: 1,\n gap: 1,\n }}\n >\n {(\n [\n {\n mode: 'icon' as ToolbarButtonDisplayMode,\n icon: 'apps',\n label: isTR ? 'İkon' : 'Icon',\n tip: isTR ? 'Sadece İkon (Icon Only)' : 'Icon Only',\n },\n {\n mode: 'icon-text' as ToolbarButtonDisplayMode,\n icon: 'view_sidebar',\n label: isTR ? 'İkon+Metin' : 'Icon+Text',\n tip: isTR ? 'İkon + Metin (Icon + Text)' : 'Icon + Text',\n },\n {\n mode: 'text' as ToolbarButtonDisplayMode,\n icon: 'text_fields',\n label: isTR ? 'Metin' : 'Text',\n tip: isTR ? 'Sadece Metin (Text Only)' : 'Text Only',\n },\n ] as const\n ).map((opt) => {\n const active = displayMode === opt.mode;\n return (\n <button\n key={opt.mode}\n type=\"button\"\n title={opt.tip}\n onClick={() => onUpdateToolbarConfig({ buttonDisplayMode: opt.mode })}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 3,\n padding: '3px 6px',\n borderRadius: 4,\n border: 'none',\n backgroundColor: active ? theme.dom.accentColor : 'transparent',\n color: active ? '#FFFFFF' : theme.dom.toolbarText,\n fontSize: 10,\n fontWeight: active ? 700 : 500,\n cursor: 'pointer',\n fontFamily: theme.fontFamily,\n }}\n >\n <MaterialIcon\n name={opt.icon}\n size={13}\n color={active ? '#FFFFFF' : undefined}\n />\n <span>{opt.label}</span>\n </button>\n );\n })}\n </div>\n )}\n\n {/* Permission Mode Switcher */}\n {showPermissionsSwitch && onPermissionsChange && (\n <div style={{ position: 'relative', display: 'inline-flex', alignItems: 'center' }}>\n <MaterialIcon\n name={\n permissions?.mode === 'readonly'\n ? 'lock'\n : permissions?.mode === 'read'\n ? 'visibility'\n : 'edit_note'\n }\n size={14}\n color={isReadonlyMode ? '#FF9F0A' : theme.dom.accentColor}\n style={{ position: 'absolute', left: 7, pointerEvents: 'none' }}\n />\n <select\n value={permissions?.mode || 'write'}\n onChange={(e) => {\n const mode = e.target.value as 'write' | 'read' | 'readonly';\n onPermissionsChange({\n ...permissions,\n mode,\n allowUpdating: mode === 'write',\n allowAdding: mode === 'write',\n allowDeleting: mode === 'write',\n allowDuplicating: mode === 'write',\n allowClipboardPaste: mode === 'write',\n });\n }}\n title={isTR ? 'Tablo Yetki Modu (Permissions)' : 'Grid Permission Mode'}\n style={{\n padding: '4px 8px 4px 24px',\n backgroundColor: isReadonlyMode\n ? 'rgba(255, 159, 10, 0.16)'\n : theme.dom.inputBg,\n color: isReadonlyMode ? '#FF9F0A' : theme.dom.inputText,\n border: `1px solid ${\n isReadonlyMode ? 'rgba(255,159,10,0.4)' : theme.dom.inputBorder\n }`,\n borderRadius: 6,\n outline: 'none',\n fontSize: 11,\n fontWeight: 600,\n cursor: 'pointer',\n }}\n >\n <option value=\"write\">\n {isTR ? 'Yetki: Yazma (Write)' : 'Perm: Write (Full)'}\n </option>\n <option value=\"readonly\">\n {isTR ? 'Yetki: Salt Okunur (ReadOnly)' : 'Perm: Read-Only'}\n </option>\n <option value=\"read\">\n {isTR ? 'Yetki: Sadece Okuma (Read)' : 'Perm: Read View'}\n </option>\n </select>\n </div>\n )}\n\n {/* Column, Toolbar & Summary Settings Popover Toggle */}\n {showColumnSettings && (\n <div style={{ position: 'relative' }}>\n <button\n type=\"button\"\n title={\n isTR\n ? 'Sütun, Toolbar ve Özet Satırı Ayarları'\n : 'Columns, Toolbar & Summary Settings'\n }\n onClick={() => setShowColSettings((v) => !v)}\n style={btnStyle(false, showColSettings)}\n >\n {renderBtnContent(\n 'tune',\n isTR ? 'Ayarlar' : 'Configure',\n undefined,\n showColSettings ? '#FFFFFF' : undefined\n )}\n </button>\n\n {showColSettings && (\n <div\n onMouseDown={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n right: 0,\n top: 'calc(100% + 6px)',\n width: 400,\n maxHeight: 420,\n overflowY: 'auto',\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n padding: 12,\n zIndex: 200,\n }}\n >\n {/* Header + Tabs */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 8,\n paddingBottom: 6,\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\n }}\n >\n <div style={{ display: 'flex', gap: 4 }}>\n <button\n type=\"button\"\n onClick={() => setSettingsTab('columns')}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: '4px 8px',\n borderRadius: 5,\n border: 'none',\n backgroundColor:\n settingsTab === 'columns' ? theme.dom.accentColor : 'transparent',\n color:\n settingsTab === 'columns' ? '#FFFFFF' : theme.dom.popoverText,\n fontSize: 11,\n fontWeight: 700,\n cursor: 'pointer',\n }}\n >\n <MaterialIcon\n name=\"view_column\"\n size={14}\n color={settingsTab === 'columns' ? '#FFFFFF' : undefined}\n />\n <span>{isTR ? 'Sütunlar ve Özet' : 'Columns & Summary'}</span>\n </button>\n <button\n type=\"button\"\n onClick={() => setSettingsTab('layout')}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: '4px 8px',\n borderRadius: 5,\n border: 'none',\n backgroundColor:\n settingsTab === 'layout' ? theme.dom.accentColor : 'transparent',\n color:\n settingsTab === 'layout' ? '#FFFFFF' : theme.dom.popoverText,\n fontSize: 11,\n fontWeight: 700,\n cursor: 'pointer',\n }}\n >\n <MaterialIcon\n name=\"dashboard_customize\"\n size={14}\n color={settingsTab === 'layout' ? '#FFFFFF' : undefined}\n />\n <span>{isTR ? 'Toolbar & Özet Satırı' : 'Toolbar & Summary Row'}</span>\n </button>\n </div>\n <button\n type=\"button\"\n onClick={() => setShowColSettings(false)}\n style={{\n border: 'none',\n background: 'transparent',\n color: '#8E8E93',\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n }}\n >\n <MaterialIcon name=\"close\" size={16} color=\"#8E8E93\" />\n </button>\n </div>\n\n {settingsTab === 'columns' ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {availableColumns.map((col) => {\n const isRO = Boolean(col.readonly || col.permission === 'readonly');\n const isPinned = Boolean(col.pinned);\n const sumType = summaryTypes[col.id] || 'none';\n return (\n <div\n key={col.id}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 6,\n padding: '5px 8px',\n borderRadius: 6,\n backgroundColor: theme.isDark\n ? 'rgba(255,255,255,0.03)'\n : 'rgba(0,0,0,0.025)',\n fontSize: 11,\n }}\n >\n <div\n style={{\n flex: 1,\n fontWeight: 600,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {col.title}\n </div>\n\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n {/* Toggle ReadOnly vs Write */}\n <button\n type=\"button\"\n onClick={() =>\n onUpdateColumn?.(col.id, {\n readonly: !isRO,\n permission: !isRO ? 'readonly' : 'write',\n })\n }\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 3,\n padding: '2px 6px',\n fontSize: 10,\n borderRadius: 4,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: isRO\n ? 'rgba(255,159,10,0.16)'\n : 'rgba(48,209,88,0.15)',\n color: isRO ? '#FF9F0A' : '#30D158',\n cursor: 'pointer',\n fontWeight: 600,\n }}\n >\n <MaterialIcon\n name={isRO ? 'lock' : 'edit'}\n size={11}\n color={isRO ? '#FF9F0A' : '#30D158'}\n />\n <span>{isRO ? 'ReadOnly' : 'Write'}</span>\n </button>\n\n {/* Toggle Pin */}\n <button\n type=\"button\"\n onClick={() =>\n onUpdateColumn?.(col.id, {\n pinned: isPinned ? false : 'left',\n })\n }\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 3,\n padding: '2px 6px',\n fontSize: 10,\n borderRadius: 4,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: isPinned\n ? theme.dom.accentColor\n : 'transparent',\n color: isPinned ? '#FFFFFF' : theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n <MaterialIcon\n name=\"push_pin\"\n size={11}\n filled={isPinned}\n color={isPinned ? '#FFFFFF' : undefined}\n />\n <span>{isPinned ? 'Pinned' : 'Pin'}</span>\n </button>\n\n {/* Summary Selector */}\n <select\n value={sumType}\n onChange={(e) =>\n onChangeSummaryType?.(col.id, e.target.value as SummaryType)\n }\n style={{\n padding: '2px 4px',\n fontSize: 10,\n borderRadius: 4,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n cursor: 'pointer',\n }}\n >\n <option value=\"none\">No Sum</option>\n <option value=\"sum\">SUM</option>\n <option value=\"avg\">AVG</option>\n <option value=\"min\">MIN</option>\n <option value=\"max\">MAX</option>\n <option value=\"count\">COUNT</option>\n </select>\n </div>\n </div>\n );\n })}\n </div>\n ) : (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n {/* Toolbar Button Display Mode */}\n {onUpdateToolbarConfig && (\n <div\n style={{\n padding: 8,\n borderRadius: 7,\n backgroundColor: theme.isDark\n ? 'rgba(255,255,255,0.03)'\n : 'rgba(0,0,0,0.025)',\n }}\n >\n <div\n style={{\n fontSize: 11,\n fontWeight: 700,\n marginBottom: 6,\n display: 'flex',\n alignItems: 'center',\n gap: 5,\n }}\n >\n <MaterialIcon\n name=\"smart_button\"\n size={14}\n color={theme.dom.accentColor}\n />\n <span>\n {isTR\n ? 'Toolbar Buton Görünüm Modu'\n : 'Toolbar Button Display Mode'}\n </span>\n </div>\n <div style={{ display: 'flex', gap: 6 }}>\n {(\n [\n {\n mode: 'icon' as ToolbarButtonDisplayMode,\n icon: 'apps',\n label: isTR ? 'Sadece İkon' : 'Icon Only',\n },\n {\n mode: 'icon-text' as ToolbarButtonDisplayMode,\n icon: 'view_sidebar',\n label: isTR ? 'İkon + Metin' : 'Icon + Text',\n },\n {\n mode: 'text' as ToolbarButtonDisplayMode,\n icon: 'text_fields',\n label: isTR ? 'Sadece Metin' : 'Text Only',\n },\n ] as const\n ).map((m) => {\n const active = displayMode === m.mode;\n return (\n <button\n key={m.mode}\n type=\"button\"\n onClick={() =>\n onUpdateToolbarConfig({ buttonDisplayMode: m.mode })\n }\n style={{\n flex: 1,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 4,\n padding: '5px 8px',\n borderRadius: 6,\n border: `1px solid ${\n active ? theme.dom.accentColor : theme.dom.popoverBorder\n }`,\n backgroundColor: active\n ? theme.dom.accentColor\n : 'transparent',\n color: active ? '#FFFFFF' : theme.dom.popoverText,\n fontSize: 11,\n fontWeight: 600,\n cursor: 'pointer',\n }}\n >\n <MaterialIcon\n name={m.icon}\n size={14}\n color={active ? '#FFFFFF' : undefined}\n />\n <span>{m.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Toolbar Items Visibility */}\n {onUpdateToolbarConfig && (\n <div\n style={{\n padding: 8,\n borderRadius: 7,\n backgroundColor: theme.isDark\n ? 'rgba(255,255,255,0.03)'\n : 'rgba(0,0,0,0.025)',\n display: 'flex',\n flexDirection: 'column',\n gap: 5,\n }}\n >\n <div\n style={{\n fontSize: 11,\n fontWeight: 700,\n marginBottom: 2,\n display: 'flex',\n alignItems: 'center',\n gap: 5,\n }}\n >\n <MaterialIcon\n name=\"web_asset\"\n size={14}\n color={theme.dom.accentColor}\n />\n <span>\n {isTR ? 'Toolbar Elemanları' : 'Toolbar Visible Controls'}\n </span>\n </div>\n {(\n [\n {\n key: 'showAddRow' as const,\n val: showAddRow,\n label: isTR ? 'Satır Ekle Butonu' : 'Add Row Button',\n },\n {\n key: 'showDuplicateRow' as const,\n val: showDuplicateRow,\n label: isTR ? 'Çoğalt Butonu' : 'Duplicate Button',\n },\n {\n key: 'showDeleteRow' as const,\n val: showDeleteRow,\n label: isTR ? 'Sil Butonu' : 'Delete Button',\n },\n {\n key: 'showUndoRedo' as const,\n val: showUndoRedo,\n label: isTR ? 'Geri Al / İleri Al' : 'Undo / Redo Buttons',\n },\n {\n key: 'showSearch' as const,\n val: showSearch,\n label: isTR ? 'Arama Kutusu' : 'Global Search Box',\n },\n {\n key: 'showGroupBy' as const,\n val: showGroupBy,\n label: isTR ? 'Gruplama Seçicisi' : 'Group By Selector',\n },\n {\n key: 'showExportCsv' as const,\n val: showExportCsv,\n label: isTR ? 'CSV Dışa Aktar' : 'Export CSV Button',\n },\n ] as const\n ).map((item) => (\n <label\n key={item.key}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n fontSize: 11,\n cursor: 'pointer',\n }}\n >\n <span>{item.label}</span>\n <input\n type=\"checkbox\"\n checked={item.val}\n onChange={(e) =>\n onUpdateToolbarConfig({ [item.key]: e.target.checked })\n }\n />\n </label>\n ))}\n </div>\n )}\n\n {/* Summary Row Settings */}\n {onUpdateSummaryConfig && (\n <div\n style={{\n padding: 8,\n borderRadius: 7,\n backgroundColor: theme.isDark\n ? 'rgba(255,255,255,0.03)'\n : 'rgba(0,0,0,0.025)',\n display: 'flex',\n flexDirection: 'column',\n gap: 5,\n }}\n >\n <div\n style={{\n fontSize: 11,\n fontWeight: 700,\n marginBottom: 2,\n display: 'flex',\n alignItems: 'center',\n gap: 5,\n }}\n >\n <MaterialIcon\n name=\"functions\"\n size={14}\n color={theme.dom.accentColor}\n />\n <span>\n {isTR\n ? 'Özet Satırı (Summary Row) Ayarları'\n : 'Summary Row Configuration'}\n </span>\n </div>\n {(\n [\n {\n key: 'visible' as const,\n val: summaryConfig?.visible !== false,\n label: isTR\n ? 'Özet Satırını Göster (Summary Row)'\n : 'Show Summary Footer Row',\n },\n {\n key: 'showTotalCount' as const,\n val: summaryConfig?.showTotalCount !== false,\n label: isTR\n ? 'Toplam Kayıt Sayısı'\n : 'Show Total Row Count',\n },\n {\n key: 'showSelectionStats' as const,\n val: summaryConfig?.showSelectionStats !== false,\n label: isTR\n ? 'Canlı Hücre Seçim İstatistikleri'\n : 'Show Live Selection Stats',\n },\n {\n key: 'showColumnSummaries' as const,\n val: summaryConfig?.showColumnSummaries !== false,\n label: isTR\n ? 'Sütun Özet Hesaplamaları'\n : 'Show Column Summaries',\n },\n ] as const\n ).map((item) => (\n <label\n key={item.key}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n fontSize: 11,\n cursor: 'pointer',\n }}\n >\n <span>{item.label}</span>\n <input\n type=\"checkbox\"\n checked={item.val}\n onChange={(e) =>\n onUpdateSummaryConfig({ [item.key]: e.target.checked })\n }\n />\n </label>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {showLocaleSwitch && onLocaleChange && (\n <select\n value={locale.code}\n onChange={(e) => onLocaleChange(e.target.value)}\n style={{\n padding: '4px 7px',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `1px solid ${theme.dom.inputBorder}`,\n borderRadius: 6,\n outline: 'none',\n fontSize: 11,\n cursor: 'pointer',\n fontWeight: 500,\n }}\n >\n <option value=\"en-US\">EN</option>\n <option value=\"tr-TR\">TR</option>\n </select>\n )}\n\n {showThemeSwitch && (\n <select\n value={currentThemeName}\n onChange={(e) => onThemeChange(e.target.value as ThemeInput)}\n style={{\n padding: '4px 7px',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `1px solid ${theme.dom.inputBorder}`,\n borderRadius: 6,\n outline: 'none',\n fontSize: 11,\n cursor: 'pointer',\n }}\n >\n <option value=\"apple-light\">Apple Light</option>\n <option value=\"apple-dark\">Apple Dark</option>\n <option value=\"google-light\">Google Light</option>\n <option value=\"google-dark\">Google Dark</option>\n <option value=\"system\">{locale.systemTheme}</option>\n </select>\n )}\n\n {rightCustomItems.map(renderCustomItem)}\n\n {showExportCsv && permissions?.allowExport !== false && (\n <button\n type=\"button\"\n onClick={onExportCsv}\n title={locale.exportCsv}\n style={btnStyle(false, true)}\n >\n {renderBtnContent('download', locale.exportCsv, undefined, '#FFFFFF')}\n </button>\n )}\n </div>\n </div>\n\n {/* SECONDARY GROUPING BREADCRUMB BAR (Shown when grouping is active) */}\n {groups.length > 0 && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '4px 14px',\n borderTop: `1px solid ${theme.dom.toolbarBorder}`,\n backgroundColor: theme.isDark ? 'rgba(255,255,255,0.02)' : 'rgba(0,0,0,0.02)',\n fontSize: 11,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, flexWrap: 'wrap' }}>\n <span\n style={{\n color: '#8E8E93',\n fontWeight: 600,\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n }}\n >\n <MaterialIcon name=\"account_tree\" size={14} color=\"#8E8E93\" />\n {isTR ? 'Aktif Gruplar:' : 'Grouped By:'}\n </span>\n {groups.map((colId, idx) => {\n const col = availableColumns.find((c) => c.id === colId);\n return (\n <React.Fragment key={colId}>\n {idx > 0 && <span style={{ color: '#8E8E93' }}>›</span>}\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 5,\n padding: '2px 8px',\n borderRadius: 12,\n backgroundColor: theme.dom.badgeBg,\n color: theme.dom.badgeText,\n fontWeight: 600,\n }}\n >\n <span>{col?.title || colId}</span>\n <button\n type=\"button\"\n onClick={() => onToggleGroupColumn(colId)}\n style={{\n border: 'none',\n background: 'transparent',\n color: theme.dom.badgeText,\n cursor: 'pointer',\n padding: 0,\n display: 'inline-flex',\n alignItems: 'center',\n }}\n >\n <MaterialIcon name=\"close\" size={13} color={theme.dom.badgeText} />\n </button>\n </span>\n </React.Fragment>\n );\n })}\n </div>\n\n <div style={{ display: 'flex', gap: 6 }}>\n {onExpandAllGroups && (\n <button\n type=\"button\"\n onClick={onExpandAllGroups}\n title={isTR ? 'Tüm Grupları Aç' : 'Expand All Groups'}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: '2px 8px',\n fontSize: 10,\n borderRadius: 4,\n border: `1px solid ${theme.dom.inputBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.toolbarText,\n cursor: 'pointer',\n }}\n >\n {renderBtnContent(\n 'unfold_more',\n isTR ? 'Tümünü Aç' : 'Expand All',\n undefined,\n undefined,\n 13\n )}\n </button>\n )}\n {onCollapseAllGroups && (\n <button\n type=\"button\"\n onClick={onCollapseAllGroups}\n title={isTR ? 'Tüm Grupları Kapat' : 'Collapse All Groups'}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: '2px 8px',\n fontSize: 10,\n borderRadius: 4,\n border: `1px solid ${theme.dom.inputBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.toolbarText,\n cursor: 'pointer',\n }}\n >\n {renderBtnContent(\n 'unfold_less',\n isTR ? 'Tümünü Kapat' : 'Collapse All',\n undefined,\n undefined,\n 13\n )}\n </button>\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport { IGridThemeTokens } from '../theme/IGridTheme';\nimport { ColumnDef, ToolbarButtonDisplayMode } from '../types/grid';\nimport { IGridLocale } from '../i18n/IGridLocale';\nimport { MaterialIcon } from './MaterialIcon';\n\nexport interface FormulaBarProps {\n activeCoords: { row: number; col: number };\n selectionSpan?: { rows: number; cols: number };\n column?: ColumnDef;\n currentValue: any;\n isEditable?: boolean;\n canDuplicate?: boolean;\n buttonDisplayMode?: ToolbarButtonDisplayMode;\n onCommitValue?: (newValue: any) => void;\n onDuplicateDown?: () => void;\n onDuplicateRight?: () => void;\n onDuplicateRow?: () => void;\n onOpenSparklineModal?: () => void;\n theme: IGridThemeTokens;\n locale?: IGridLocale;\n}\n\nfunction getExcelColName(colIndex: number): string {\n let n = colIndex;\n let name = '';\n while (n >= 0) {\n name = String.fromCharCode((n % 26) + 65) + name;\n n = Math.floor(n / 26) - 1;\n }\n return name;\n}\n\nexport const FormulaBar: React.FC<FormulaBarProps> = ({\n activeCoords,\n selectionSpan,\n column,\n currentValue,\n isEditable = true,\n canDuplicate = true,\n buttonDisplayMode = 'icon-text',\n onCommitValue,\n onDuplicateDown,\n onDuplicateRight,\n onDuplicateRow,\n onOpenSparklineModal,\n theme,\n locale,\n}) => {\n const isTR = locale?.code?.startsWith('tr');\n const isSparkline = column?.type === 'sparkline';\n const displayVal = isSparkline\n ? isTR\n ? '[7 Günlük Trend Grafiği — Detaylı grafik görünümü için hücreye tıklayın]'\n : '[7-Day Trend Chart — Click cell to open detailed chart dialog]'\n : currentValue != null\n ? Array.isArray(currentValue)\n ? currentValue.join(', ')\n : typeof currentValue === 'object'\n ? JSON.stringify(currentValue)\n : String(currentValue)\n : '';\n\n const [draft, setDraft] = useState<string>(displayVal);\n const [isFocused, setIsFocused] = useState<boolean>(false);\n\n useEffect(() => {\n if (!isFocused) {\n setDraft(displayVal);\n }\n }, [displayVal, isFocused, activeCoords.row, activeCoords.col]);\n\n const excelRef = `${getExcelColName(activeCoords.col)}${activeCoords.row + 1}`;\n const hasMultiSpan = selectionSpan && (selectionSpan.rows > 1 || selectionSpan.cols > 1);\n\n const commitDraft = () => {\n if (!isEditable || !onCommitValue || !column) return;\n if (draft === displayVal) return;\n\n let parsed: any = draft;\n if (\n column.type === 'number' ||\n column.type === 'currency' ||\n column.type === 'percent' ||\n column.type === 'progress' ||\n column.type === 'rating'\n ) {\n const n = parseFloat(draft.replace(/[%$,]/g, (m) => (m === ',' ? '.' : '')));\n parsed = isNaN(n) ? 0 : n;\n } else if (column.type === 'boolean') {\n parsed = ['true', '1', 'yes', 'evet', 'doğru'].includes(draft.trim().toLowerCase());\n } else if (column.type === 'multiselect') {\n parsed = draft\n .split(/[,;|]/)\n .map((s) => s.trim())\n .filter(Boolean);\n } else if (column.type === 'object') {\n try {\n const obj = JSON.parse(draft);\n if (obj && typeof obj === 'object' && !Array.isArray(obj)) {\n parsed = obj;\n }\n } catch {\n const out: Record<string, any> = {};\n for (const pair of draft.split(/[,;|]/)) {\n const idx = pair.indexOf(':');\n if (idx > 0) {\n const k = pair.slice(0, idx).trim();\n const v = pair.slice(idx + 1).trim();\n if (k) out[k] = v;\n }\n }\n if (Object.keys(out).length > 0) parsed = out;\n }\n }\n onCommitValue(parsed);\n };\n\n const renderBtnContent = (iconName: string, label: string, iconColor?: string) => (\n <>\n {(buttonDisplayMode === 'icon' || buttonDisplayMode === 'icon-text') && (\n <MaterialIcon name={iconName} size={13} color={iconColor} />\n )}\n {(buttonDisplayMode === 'icon-text' || buttonDisplayMode === 'text') && <span>{label}</span>}\n </>\n );\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n padding: '4px 12px',\n backgroundColor: theme.canvas.rowNumberBg,\n borderBottom: `1px solid ${theme.canvas.gridLine}`,\n gap: 8,\n fontFamily: theme.fontFamily,\n fontSize: 12,\n userSelect: 'none',\n }}\n >\n {/* Coordinate Box (Excel Name Box) */}\n <div\n style={{\n padding: '2px 8px',\n backgroundColor: theme.canvas.bg,\n color: theme.dom.accentColor,\n border: `1px solid ${theme.canvas.gridLine}`,\n borderRadius: 4,\n fontFamily: 'monospace',\n fontWeight: 700,\n minWidth: 84,\n textAlign: 'center',\n fontSize: 11,\n }}\n >\n {hasMultiSpan\n ? `${selectionSpan.rows}R × ${selectionSpan.cols}C`\n : `${excelRef} (R${activeCoords.row + 1}:C${activeCoords.col + 1})`}\n </div>\n\n {/* Column Type & Permission Badges */}\n {column && (\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n <span\n style={{\n padding: '2px 6px',\n backgroundColor: theme.dom.badgeBg,\n color: theme.dom.badgeText,\n borderRadius: 4,\n fontSize: 10,\n fontFamily: 'monospace',\n fontWeight: 600,\n textTransform: 'uppercase',\n }}\n >\n {column.type}\n </span>\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 3,\n padding: '2px 6px',\n backgroundColor: isEditable\n ? 'rgba(48, 209, 88, 0.14)'\n : 'rgba(255, 159, 10, 0.16)',\n color: isEditable ? '#30D158' : '#FF9F0A',\n borderRadius: 4,\n fontSize: 10,\n fontFamily: 'monospace',\n fontWeight: 700,\n }}\n >\n <MaterialIcon\n name={isEditable ? 'edit' : 'lock'}\n size={11}\n color={isEditable ? '#30D158' : '#FF9F0A'}\n />\n <span>{isEditable ? 'WRITE' : 'READONLY'}</span>\n </span>\n </div>\n )}\n\n {/* fx Symbol */}\n <MaterialIcon\n name=\"functions\"\n size={15}\n color={theme.isDark ? '#8E8E93' : '#AEAEB2'}\n title=\"Formula / Value Bar\"\n />\n\n {/* Interactive Formula / Value Input */}\n <input\n type=\"text\"\n value={draft}\n readOnly={!isEditable || column?.type === 'sparkline' || column?.type === 'action'}\n onFocus={() => setIsFocused(true)}\n onBlur={() => {\n setIsFocused(false);\n commitDraft();\n }}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n commitDraft();\n (e.target as HTMLInputElement).blur();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n setDraft(displayVal);\n (e.target as HTMLInputElement).blur();\n }\n }}\n placeholder={\n isEditable ? locale?.formulaBarPlaceholder || 'Enter value...' : 'Read-only cell'\n }\n style={{\n flex: 1,\n padding: '3px 8px',\n backgroundColor: theme.canvas.bg,\n color: theme.canvas.cellText,\n border: `1px solid ${isFocused ? theme.dom.inputFocusBorder : theme.canvas.gridLine}`,\n borderRadius: 4,\n outline: 'none',\n fontSize: 12,\n fontFamily: theme.fontFamily,\n }}\n />\n\n {/* Quick Cell & Row Duplication Controls */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n {isSparkline && onOpenSparklineModal ? (\n <button\n type=\"button\"\n onClick={onOpenSparklineModal}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: '2px 10px',\n fontSize: 11,\n borderRadius: 4,\n border: `1px solid ${theme.dom.accentColor}`,\n backgroundColor: theme.dom.accentColor,\n color: '#FFFFFF',\n cursor: 'pointer',\n fontWeight: 700,\n }}\n >\n {renderBtnContent(\n 'show_chart',\n isTR ? 'Detaylı Trend Grafiğini Aç' : 'Open Detailed Chart',\n '#FFFFFF'\n )}\n </button>\n ) : (\n <>\n {onDuplicateDown && (\n <button\n type=\"button\"\n disabled={!canDuplicate || !isEditable}\n onClick={onDuplicateDown}\n title={isTR ? 'Hücreyi Aşağı Çoğalt (Ctrl+D)' : 'Duplicate Cell Down (Ctrl+D)'}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: '2px 7px',\n fontSize: 11,\n borderRadius: 4,\n border: `1px solid ${theme.canvas.gridLine}`,\n backgroundColor: theme.canvas.bg,\n color: theme.canvas.cellText,\n cursor: canDuplicate && isEditable ? 'pointer' : 'not-allowed',\n opacity: canDuplicate && isEditable ? 1 : 0.45,\n fontWeight: 600,\n }}\n >\n {renderBtnContent('south', isTR ? 'Aşağı Çoğalt' : 'Fill Down')}\n </button>\n )}\n {onDuplicateRight && (\n <button\n type=\"button\"\n disabled={!canDuplicate || !isEditable}\n onClick={onDuplicateRight}\n title={isTR ? 'Hücreyi Sağa Çoğalt (Ctrl+R)' : 'Duplicate Cell Right (Ctrl+R)'}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: '2px 7px',\n fontSize: 11,\n borderRadius: 4,\n border: `1px solid ${theme.canvas.gridLine}`,\n backgroundColor: theme.canvas.bg,\n color: theme.canvas.cellText,\n cursor: canDuplicate && isEditable ? 'pointer' : 'not-allowed',\n opacity: canDuplicate && isEditable ? 1 : 0.45,\n fontWeight: 600,\n }}\n >\n {renderBtnContent('east', isTR ? 'Sağa Çoğalt' : 'Fill Right')}\n </button>\n )}\n </>\n )}\n {onDuplicateRow && (\n <button\n type=\"button\"\n disabled={!canDuplicate}\n onClick={onDuplicateRow}\n title={isTR ? 'Satırı Çoğalt (Duplicate Row)' : 'Duplicate Entire Row'}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: '2px 7px',\n fontSize: 11,\n borderRadius: 4,\n border: `1px solid ${theme.canvas.gridLine}`,\n backgroundColor: theme.canvas.bg,\n color: theme.dom.accentColor,\n cursor: canDuplicate ? 'pointer' : 'not-allowed',\n opacity: canDuplicate ? 1 : 0.45,\n fontWeight: 600,\n }}\n >\n {renderBtnContent(\n 'content_copy',\n isTR ? 'Satır Çoğalt' : 'Dup Row',\n theme.dom.accentColor\n )}\n </button>\n )}\n </div>\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { IGridThemeTokens } from '../theme/IGridTheme';\nimport { ColumnDef, GridSummaryConfig, SelectionStatMetric } from '../types/grid';\nimport { SummaryType } from '../types/group';\nimport { IGridLocale } from '../i18n/IGridLocale';\nimport { MaterialIcon } from './MaterialIcon';\n\nexport interface SelectionSummaryStats {\n count: number;\n numericCount: number;\n sum: number;\n avg: number;\n min: number;\n max: number;\n}\n\nexport interface SummaryFooterProps {\n summaries?: Record<string, number>;\n summaryTypes?: Record<string, SummaryType>;\n onChangeSummaryType?: (columnId: string, summaryType: SummaryType) => void;\n summaryConfig?: GridSummaryConfig;\n onUpdateSummaryConfig?: (patch: Partial<GridSummaryConfig>) => void;\n selectionStats?: SelectionSummaryStats | null;\n columns: ColumnDef[];\n theme: IGridThemeTokens;\n locale: IGridLocale;\n totalRowCount: number;\n}\n\nconst SUMMARY_TYPE_ICONS: Record<SummaryType, string> = {\n sum: 'functions',\n avg: 'analytics',\n min: 'south',\n max: 'north',\n count: 'tag',\n none: 'block',\n};\n\nexport const SummaryFooter: React.FC<SummaryFooterProps> = ({\n summaries,\n summaryTypes = {},\n onChangeSummaryType,\n summaryConfig,\n onUpdateSummaryConfig,\n selectionStats,\n columns,\n theme,\n locale,\n totalRowCount,\n}) => {\n const [openConfigCol, setOpenConfigCol] = useState<string | null>(null);\n const [showAddSummary, setShowAddSummary] = useState<boolean>(false);\n const isTR = locale.code.startsWith('tr');\n\n const isVisible = summaryConfig?.visible !== false;\n if (!isVisible) return null;\n\n const showTotalCount = summaryConfig?.showTotalCount !== false;\n const showSelectionStats = summaryConfig?.showSelectionStats !== false;\n const showColumnSummaries = summaryConfig?.showColumnSummaries !== false;\n const allowConfiguration = summaryConfig?.allowConfiguration !== false;\n const activeMetrics: SelectionStatMetric[] = summaryConfig?.selectionMetrics || [\n 'count',\n 'sum',\n 'avg',\n 'min',\n 'max',\n ];\n\n const hasMetric = (m: SelectionStatMetric) => activeMetrics.includes(m);\n\n const formatSummaryVal = (colId: string, val: number, sType: SummaryType): string => {\n const itemOverride = summaryConfig?.items?.find((i) => i.columnId === colId);\n if (sType === 'count') {\n const base = val.toLocaleString(locale.code);\n return `${itemOverride?.prefix || ''}${base}${itemOverride?.suffix || ''}`;\n }\n const col = columns.find((c) => c.id === colId);\n const digits = itemOverride?.decimalDigits ?? (col?.type === 'currency' ? 2 : 2);\n const formattedNum = val.toLocaleString(locale.code, {\n minimumFractionDigits: col?.type === 'currency' ? Math.min(2, digits) : 0,\n maximumFractionDigits: digits,\n });\n if (itemOverride?.prefix || itemOverride?.suffix) {\n return `${itemOverride.prefix || ''}${formattedNum}${itemOverride.suffix || ''}`;\n }\n if (col?.type === 'currency') {\n return `${col.currencySymbol || '$'}${formattedNum}`;\n }\n if (col?.type === 'progress' || col?.type === 'percent') {\n return `${formattedNum}%`;\n }\n return formattedNum;\n };\n\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '6px 14px',\n backgroundColor: theme.canvas.rowNumberBg,\n borderTop: `1px solid ${theme.canvas.gridLine}`,\n color: theme.dom.toolbarText,\n fontFamily: theme.fontFamily,\n fontSize: 11,\n userSelect: 'none',\n position: 'relative',\n zIndex: 130,\n flexWrap: 'wrap',\n gap: 8,\n }}\n >\n {/* Left: Total Records + Live Excel Range Selection Aggregations */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, flexWrap: 'wrap' }}>\n {showTotalCount && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 5 }}>\n <MaterialIcon\n name=\"table_rows\"\n size={14}\n color={theme.isDark ? '#98989D' : '#6E6E73'}\n />\n <span>\n {locale.totalRecords}:{' '}\n <strong>{totalRowCount.toLocaleString(locale.code)}</strong>\n </span>\n </span>\n )}\n\n {showSelectionStats && selectionStats && selectionStats.count > 1 && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '2px 9px',\n borderRadius: 6,\n backgroundColor: theme.isDark\n ? 'rgba(10, 132, 255, 0.15)'\n : 'rgba(0, 122, 255, 0.08)',\n border: `1px solid ${\n theme.isDark ? 'rgba(10,132,255,0.35)' : 'rgba(0,122,255,0.25)'\n }`,\n color: theme.dom.accentColor,\n fontWeight: 600,\n }}\n >\n {hasMetric('count') && (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>\n <MaterialIcon name=\"select_all\" size={13} color={theme.dom.accentColor} />\n {isTR ? 'Seçim' : 'Selected'} ({selectionStats.count})\n </span>\n )}\n {selectionStats.numericCount > 0 && (\n <>\n {hasMetric('sum') && (\n <span>\n SUM:{' '}\n <strong>\n {selectionStats.sum.toLocaleString(locale.code, {\n maximumFractionDigits: 2,\n })}\n </strong>\n </span>\n )}\n {hasMetric('avg') && (\n <span>\n AVG:{' '}\n <strong>\n {selectionStats.avg.toLocaleString(locale.code, {\n maximumFractionDigits: 2,\n })}\n </strong>\n </span>\n )}\n {hasMetric('min') && (\n <span>\n MIN:{' '}\n <strong>\n {selectionStats.min.toLocaleString(locale.code, {\n maximumFractionDigits: 2,\n })}\n </strong>\n </span>\n )}\n {hasMetric('max') && (\n <span>\n MAX:{' '}\n <strong>\n {selectionStats.max.toLocaleString(locale.code, {\n maximumFractionDigits: 2,\n })}\n </strong>\n </span>\n )}\n </>\n )}\n </div>\n )}\n </div>\n\n {/* Right: Configurable Column Summaries */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, flexWrap: 'wrap' }}>\n {showColumnSummaries &&\n summaries &&\n Object.entries(summaries).map(([field, sumVal]) => {\n const col = columns.find((c) => c.id === field);\n const itemOverride = summaryConfig?.items?.find((i) => i.columnId === field);\n const sType = summaryTypes[field] || itemOverride?.summaryType || 'sum';\n const isOpen = openConfigCol === field;\n\n return (\n <div key={field} style={{ position: 'relative' }}>\n <button\n type=\"button\"\n onClick={() => {\n if (allowConfiguration) {\n setOpenConfigCol(isOpen ? null : field);\n }\n }}\n title={\n allowConfiguration\n ? isTR\n ? 'Özet tipini değiştirmek için tıklayın'\n : 'Click to change summary aggregation'\n : undefined\n }\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 5,\n padding: '3px 8px',\n borderRadius: 6,\n border: `1px solid ${isOpen ? theme.dom.accentColor : theme.canvas.gridLine}`,\n backgroundColor: theme.canvas.bg,\n color: theme.canvas.cellText,\n fontSize: 11,\n cursor: allowConfiguration ? 'pointer' : 'default',\n fontFamily: theme.fontFamily,\n }}\n >\n <MaterialIcon\n name={SUMMARY_TYPE_ICONS[sType] || 'functions'}\n size={13}\n color={theme.dom.accentColor}\n />\n <span style={{ color: theme.isDark ? '#98989D' : '#6E6E73' }}>\n {itemOverride?.label || col?.title || field}\n </span>\n <span\n style={{\n fontSize: 9,\n padding: '1px 4px',\n borderRadius: 3,\n backgroundColor: theme.dom.badgeBg,\n color: theme.dom.badgeText,\n fontWeight: 700,\n textTransform: 'uppercase',\n }}\n >\n {sType}\n </span>\n <strong>{formatSummaryVal(field, sumVal, sType)}</strong>\n </button>\n\n {isOpen && allowConfiguration && onChangeSummaryType && (\n <div\n onMouseDown={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n bottom: 'calc(100% + 6px)',\n right: 0,\n width: 165,\n padding: 6,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 8,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n zIndex: 200,\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n }}\n >\n <div\n style={{\n fontSize: 10,\n fontWeight: 700,\n color: '#8E8E93',\n padding: '2px 6px 4px',\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n }}\n >\n <span>{col?.title || field}</span>\n <MaterialIcon name=\"functions\" size={12} color=\"#8E8E93\" />\n </div>\n {(['sum', 'avg', 'min', 'max', 'count', 'none'] as SummaryType[]).map((t) => (\n <button\n key={t}\n type=\"button\"\n onClick={() => {\n onChangeSummaryType(field, t);\n setOpenConfigCol(null);\n }}\n style={{\n padding: '5px 8px',\n textAlign: 'left',\n fontSize: 11,\n fontWeight: sType === t ? 700 : 500,\n border: 'none',\n borderRadius: 4,\n backgroundColor:\n sType === t ? theme.dom.accentColor : 'transparent',\n color: sType === t ? '#FFFFFF' : theme.dom.popoverText,\n cursor: 'pointer',\n textTransform: 'uppercase',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n <MaterialIcon\n name={t === 'none' ? 'delete' : SUMMARY_TYPE_ICONS[t]}\n size={13}\n color={sType === t ? '#FFFFFF' : theme.dom.accentColor}\n />\n <span>\n {t === 'none'\n ? isTR\n ? 'Kaldır (None)'\n : 'Remove (None)'\n : t}\n </span>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n })}\n\n {/* Add / Configure Summary Row Button */}\n {allowConfiguration && onChangeSummaryType && (\n <div style={{ position: 'relative' }}>\n <button\n type=\"button\"\n onClick={() => setShowAddSummary((v) => !v)}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: '3px 8px',\n borderRadius: 6,\n border: `1px dashed ${theme.dom.accentColor}`,\n backgroundColor: showAddSummary\n ? theme.isDark\n ? 'rgba(10,132,255,0.16)'\n : 'rgba(0,122,255,0.1)'\n : 'transparent',\n color: theme.dom.accentColor,\n fontSize: 11,\n fontWeight: 600,\n cursor: 'pointer',\n fontFamily: theme.fontFamily,\n }}\n >\n <MaterialIcon name=\"calculate\" size={14} color={theme.dom.accentColor} />\n <span>{isTR ? 'Özet Satırı Ayarları' : 'Summary Settings'}</span>\n </button>\n\n {showAddSummary && (\n <div\n onMouseDown={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n bottom: 'calc(100% + 6px)',\n right: 0,\n width: 300,\n maxHeight: 340,\n overflowY: 'auto',\n padding: 12,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n zIndex: 200,\n }}\n >\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 8,\n paddingBottom: 6,\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\n }}\n >\n <span\n style={{\n fontWeight: 700,\n fontSize: 11,\n display: 'inline-flex',\n alignItems: 'center',\n gap: 5,\n }}\n >\n <MaterialIcon\n name=\"functions\"\n size={15}\n color={theme.dom.accentColor}\n />\n {isTR ? 'Özet Satırı (Summary Row) Ayarları' : 'Summary Row Configuration'}\n </span>\n <button\n type=\"button\"\n onClick={() => setShowAddSummary(false)}\n style={{\n border: 'none',\n background: 'transparent',\n color: '#8E8E93',\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n }}\n >\n <MaterialIcon name=\"close\" size={15} color=\"#8E8E93\" />\n </button>\n </div>\n\n {/* Summary Row Display Toggles */}\n {onUpdateSummaryConfig && (\n <div\n style={{\n display: 'flex',\n flexDirection: 'column',\n gap: 5,\n marginBottom: 10,\n paddingBottom: 8,\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\n }}\n >\n <label\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n fontSize: 11,\n cursor: 'pointer',\n }}\n >\n <span>{isTR ? 'Toplam Kayıt Sayısı' : 'Show Total Row Count'}</span>\n <input\n type=\"checkbox\"\n checked={showTotalCount}\n onChange={(e) =>\n onUpdateSummaryConfig({ showTotalCount: e.target.checked })\n }\n />\n </label>\n <label\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n fontSize: 11,\n cursor: 'pointer',\n }}\n >\n <span>{isTR ? 'Canlı Hücre Seçim Özeti' : 'Show Range Selection Stats'}</span>\n <input\n type=\"checkbox\"\n checked={showSelectionStats}\n onChange={(e) =>\n onUpdateSummaryConfig({ showSelectionStats: e.target.checked })\n }\n />\n </label>\n <label\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n fontSize: 11,\n cursor: 'pointer',\n }}\n >\n <span>{isTR ? 'Sütun Özet Hesaplamaları' : 'Show Column Aggregations'}</span>\n <input\n type=\"checkbox\"\n checked={showColumnSummaries}\n onChange={(e) =>\n onUpdateSummaryConfig({ showColumnSummaries: e.target.checked })\n }\n />\n </label>\n </div>\n )}\n\n <div\n style={{\n fontSize: 10,\n fontWeight: 700,\n color: '#8E8E93',\n marginBottom: 4,\n textTransform: 'uppercase',\n }}\n >\n {isTR ? 'Sütun Bazlı Hesaplama Türü' : 'Column Aggregation Type'}\n </div>\n\n {columns\n .filter((c) => c.type !== 'sparkline' && c.type !== 'action')\n .map((col) => {\n const cur = summaryTypes[col.id] || 'none';\n return (\n <div\n key={col.id}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '4px 0',\n fontSize: 11,\n }}\n >\n <span style={{ fontWeight: cur !== 'none' ? 600 : 400 }}>{col.title}</span>\n <select\n value={cur}\n onChange={(e) =>\n onChangeSummaryType(col.id, e.target.value as SummaryType)\n }\n style={{\n padding: '2px 6px',\n borderRadius: 4,\n border: `1px solid ${theme.dom.inputBorder}`,\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n fontSize: 10,\n fontWeight: 600,\n }}\n >\n <option value=\"none\">NONE</option>\n <option value=\"sum\">SUM</option>\n <option value=\"avg\">AVG</option>\n <option value=\"min\">MIN</option>\n <option value=\"max\">MAX</option>\n <option value=\"count\">COUNT</option>\n </select>\n </div>\n );\n })}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n","import { SortDescriptor } from '../types/filter';\n\nexport class SortEngine {\n private static collator = new Intl.Collator('tr-TR', {\n numeric: true,\n sensitivity: 'base',\n });\n\n public static createComparator(sortRules: SortDescriptor[]): (a: any, b: any) => number {\n if (!sortRules || sortRules.length === 0) {\n return () => 0;\n }\n\n return (a: any, b: any) => {\n for (const rule of sortRules) {\n const valA = a?.[rule.selector];\n const valB = b?.[rule.selector];\n\n const diff = this.compareValues(valA, valB);\n if (diff !== 0) {\n return rule.desc ? -diff : diff;\n }\n }\n return 0;\n };\n }\n\n public static compareValues(a: any, b: any): number {\n if (a === b) return 0;\n if (a === null || a === undefined || a === '') return 1;\n if (b === null || b === undefined || b === '') return -1;\n\n // Sayısal karşılaştırma\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n\n // Tarih karşılaştırması\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() - b.getTime();\n }\n\n // Boolean karşılaştırması\n if (typeof a === 'boolean' && typeof b === 'boolean') {\n return a === b ? 0 : a ? 1 : -1;\n }\n\n const strA =\n typeof a === 'object' && a !== null\n ? Array.isArray(a)\n ? a.join(', ')\n : JSON.stringify(a)\n : String(a);\n const strB =\n typeof b === 'object' && b !== null\n ? Array.isArray(b)\n ? b.join(', ')\n : JSON.stringify(b)\n : String(b);\n\n // Metin karşılaştırması (Türkçe ve doğal sayı duyarlı)\n return this.collator.compare(strA, strB);\n }\n}\n","import { GroupDescriptor, SummaryType, VirtualRow } from '../types/group';\n\nexport class GroupingEngine {\n private static formatGroupKeyVal(raw: any): string {\n if (raw === null || raw === undefined || raw === '') return '(Blank)';\n if (Array.isArray(raw)) {\n return raw.length > 0 ? raw.join(', ') : '(Blank)';\n }\n if (typeof raw === 'object') {\n const entries = Object.entries(raw);\n return entries.length > 0\n ? entries.map(([k, v]) => `${k}: ${String(v)}`).join(' • ')\n : '(Blank)';\n }\n return String(raw);\n }\n\n public static collectGroupKeys(\n data: any[],\n groups: GroupDescriptor[],\n maxAutoExpandLevel: number = 0\n ): Set<string> {\n const keys = new Set<string>();\n if (!groups || groups.length === 0) return keys;\n\n const visit = (items: any[], level: number, parentKey: string) => {\n if (level >= groups.length || level > maxAutoExpandLevel) return;\n const field = groups[level].selector;\n const buckets = new Map<any, any[]>();\n for (let i = 0; i < items.length; i++) {\n const val = this.formatGroupKeyVal(items[i][field]);\n let b = buckets.get(val);\n if (!b) {\n b = [];\n buckets.set(val, b);\n }\n b.push(items[i]);\n }\n for (const [val, bucketItems] of buckets.entries()) {\n const groupKey = parentKey ? `${parentKey}|${field}:${val}` : `${field}:${val}`;\n keys.add(groupKey);\n visit(bucketItems, level + 1, groupKey);\n }\n };\n\n visit(data, 0, '');\n return keys;\n }\n\n public static projectVirtualRows(\n data: any[],\n groups: GroupDescriptor[],\n expandedKeys: Set<string>,\n summaryConfig?: Record<string, SummaryType>\n ): VirtualRow[] {\n if (!groups || groups.length === 0) {\n return data.map((item, rawIndex) => ({\n type: 'data',\n rawIndex,\n data: item,\n }));\n }\n\n const result: VirtualRow[] = [];\n this.groupRecursive(data, groups, 0, '', expandedKeys, result, summaryConfig);\n return result;\n }\n\n private static groupRecursive(\n items: any[],\n groups: GroupDescriptor[],\n level: number,\n parentKey: string,\n expandedKeys: Set<string>,\n out: VirtualRow[],\n summaryConfig?: Record<string, SummaryType>\n ): void {\n if (level >= groups.length) {\n for (const item of items) {\n out.push({\n type: 'data',\n rawIndex: item.__rawIndex ?? 0,\n data: item,\n });\n }\n return;\n }\n\n const currentGroup = groups[level];\n const field = currentGroup.selector;\n\n const buckets = new Map<any, any[]>();\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n const val = this.formatGroupKeyVal(item[field]);\n let bucket = buckets.get(val);\n if (!bucket) {\n bucket = [];\n buckets.set(val, bucket);\n }\n bucket.push(item);\n }\n\n for (const [val, bucketItems] of buckets.entries()) {\n const groupKey = parentKey ? `${parentKey}|${field}:${val}` : `${field}:${val}`;\n const isExpanded = expandedKeys.has(groupKey);\n\n const summaries: Record<string, number> = {};\n const summaryTypes: Record<string, SummaryType> = {};\n\n if (summaryConfig) {\n for (const [sf, sType] of Object.entries(summaryConfig)) {\n if (!sType || sType === 'none') continue;\n if (sType === 'count') {\n summaries[sf] = bucketItems.length;\n summaryTypes[sf] = 'count';\n continue;\n }\n let sum = 0;\n let count = 0;\n let min = Infinity;\n let max = -Infinity;\n for (const bi of bucketItems) {\n const num = Number(bi[sf]);\n if (!isNaN(num)) {\n sum += num;\n count++;\n if (num < min) min = num;\n if (num > max) max = num;\n }\n }\n if (count > 0) {\n summaryTypes[sf] = sType;\n if (sType === 'sum') summaries[sf] = sum;\n else if (sType === 'avg') summaries[sf] = sum / count;\n else if (sType === 'min') summaries[sf] = min;\n else if (sType === 'max') summaries[sf] = max;\n }\n }\n }\n\n out.push({\n type: 'group',\n level,\n groupKey,\n field,\n value: val,\n rowCount: bucketItems.length,\n isExpanded,\n summaries,\n summaryTypes,\n });\n\n if (isExpanded) {\n this.groupRecursive(\n bucketItems,\n groups,\n level + 1,\n groupKey,\n expandedKeys,\n out,\n summaryConfig\n );\n }\n }\n }\n}\n","import { IDataStore, BatchChanges } from '../types/store';\nimport { FilterDescriptor, SortDescriptor, DistinctItem } from '../types/filter';\nimport { GroupDescriptor, SummaryType, VirtualRow } from '../types/group';\nimport { FilterEngine, BLANK_FILTER_TOKEN } from '../core/FilterEngine';\nimport { SortEngine } from '../core/SortEngine';\nimport { GroupingEngine } from '../core/GroupingEngine';\n\nexport interface LocalDataStoreOptions {\n data: any[];\n keyField?: string;\n batchMode?: boolean;\n initialSummaries?: Record<string, SummaryType>;\n}\n\nexport class LocalDataStore implements IDataStore {\n private rawData: any[] = [];\n private keyField: string;\n\n // Filtered & sorted data\n private processedData: any[] = [];\n // Projected virtual rows (data + group headers)\n private virtualRows: VirtualRow[] = [];\n\n private currentFilter: FilterDescriptor | null = null;\n private currentSearch: string = '';\n private currentSort: SortDescriptor[] = [];\n private currentGroups: GroupDescriptor[] = [];\n private expandedGroupKeys = new Set<string>();\n\n // Configurable summary types per column\n private summaryTypes: Record<string, SummaryType> = {};\n\n // Batch / Dirty tracking\n private batchMode: boolean = true;\n private originalRowSnapshots = new Map<any, Record<string, any>>();\n private dirtyCells = new Map<any, Set<string>>();\n private insertedKeys = new Set<any>();\n private deletedRows = new Map<any, { data: Record<string, any>; index: number }>();\n private distinctCache = new Map<string, DistinctItem[]>();\n\n private listeners = new Map<string, Set<(...args: any[]) => void>>();\n\n constructor(options: LocalDataStoreOptions) {\n this.keyField = options.keyField || 'id';\n this.batchMode = options.batchMode ?? true;\n if (options.initialSummaries) {\n this.summaryTypes = { ...options.initialSummaries };\n }\n this.setData(options.data || []);\n }\n\n public isRemote(): boolean {\n return false;\n }\n\n public setData(data: any[]): void {\n this.rawData = data.map((item, idx) => ({\n ...item,\n __rawIndex: idx,\n [this.keyField]: item[this.keyField] ?? idx + 1,\n }));\n\n // Auto-initialize default summary types if empty\n if (Object.keys(this.summaryTypes).length === 0 && this.rawData.length > 0) {\n const sample = this.rawData[0];\n for (const key of Object.keys(sample)) {\n if (key === this.keyField || key.startsWith('__')) continue;\n if (typeof sample[key] === 'number') {\n if (key === 'rating' || key === 'progress') {\n this.summaryTypes[key] = 'avg';\n } else {\n this.summaryTypes[key] = 'sum';\n }\n }\n }\n }\n\n this.originalRowSnapshots.clear();\n this.dirtyCells.clear();\n this.insertedKeys.clear();\n this.deletedRows.clear();\n this.distinctCache.clear();\n\n this.recompute();\n }\n\n public getRowCount(): number {\n return this.virtualRows.length;\n }\n\n public getViewRow(rowIndex: number): VirtualRow | undefined {\n return this.virtualRows[rowIndex];\n }\n\n public getRawData(): any[] {\n return this.rawData;\n }\n\n public getRawRowByKey(rowKey: any): Record<string, any> | undefined {\n return this.rawData.find((r) => r[this.keyField] === rowKey);\n }\n\n public async ensureRange(_startRow: number, _endRow: number): Promise<void> {\n return Promise.resolve();\n }\n\n public async setFilter(filter: FilterDescriptor | null): Promise<void> {\n this.currentFilter = filter;\n this.recompute();\n return Promise.resolve();\n }\n\n public async setSearch(keyword: string): Promise<void> {\n this.currentSearch = keyword;\n this.recompute();\n return Promise.resolve();\n }\n\n public async setSorting(sortRules: SortDescriptor[]): Promise<void> {\n this.currentSort = sortRules;\n this.recompute();\n return Promise.resolve();\n }\n\n public async setGrouping(groupDescriptors: GroupDescriptor[]): Promise<void> {\n this.currentGroups = groupDescriptors;\n // Start groups collapsed so all group headers & summaries are immediately visible\n this.expandedGroupKeys.clear();\n for (const g of groupDescriptors) {\n if (g.isExpanded) {\n const keys = GroupingEngine.collectGroupKeys(this.processedData, groupDescriptors, 0);\n keys.forEach((k) => this.expandedGroupKeys.add(k));\n break;\n }\n }\n this.recompute();\n return Promise.resolve();\n }\n\n public async toggleGroup(groupKey: string): Promise<void> {\n if (this.expandedGroupKeys.has(groupKey)) {\n this.expandedGroupKeys.delete(groupKey);\n } else {\n this.expandedGroupKeys.add(groupKey);\n }\n this.recomputeVirtualRowsOnly();\n return Promise.resolve();\n }\n\n public expandAllGroups(): void {\n const allKeys = GroupingEngine.collectGroupKeys(\n this.processedData,\n this.currentGroups,\n this.currentGroups.length\n );\n this.expandedGroupKeys = allKeys;\n this.recomputeVirtualRowsOnly();\n }\n\n public collapseAllGroups(): void {\n this.expandedGroupKeys.clear();\n this.recomputeVirtualRowsOnly();\n }\n\n private isValueEqual(a: any, b: any): boolean {\n if (a === b) return true;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n }\n if (\n a &&\n b &&\n typeof a === 'object' &&\n typeof b === 'object' &&\n !Array.isArray(a) &&\n !Array.isArray(b)\n ) {\n return JSON.stringify(a) === JSON.stringify(b);\n }\n return false;\n }\n\n private ensureSnapshot(rowKey: any, item: Record<string, any>): void {\n if (!this.originalRowSnapshots.has(rowKey) && !this.insertedKeys.has(rowKey)) {\n const snap: Record<string, any> = {};\n for (const [k, v] of Object.entries(item)) {\n snap[k] = Array.isArray(v)\n ? [...v]\n : v && typeof v === 'object'\n ? { ...v }\n : v;\n }\n this.originalRowSnapshots.set(rowKey, snap);\n }\n }\n\n private markCellDirty(rowKey: any, columnId: string, newValue: any): void {\n if (this.insertedKeys.has(rowKey)) return;\n const orig = this.originalRowSnapshots.get(rowKey);\n let set = this.dirtyCells.get(rowKey);\n if (!set) {\n set = new Set<string>();\n this.dirtyCells.set(rowKey, set);\n }\n if (orig && this.isValueEqual(orig[columnId], newValue)) {\n set.delete(columnId);\n if (set.size === 0) {\n this.dirtyCells.delete(rowKey);\n }\n } else {\n set.add(columnId);\n }\n }\n\n public async setCell(rowKey: any, columnId: string, value: any): Promise<void> {\n const item = this.rawData.find((r) => r[this.keyField] === rowKey);\n if (item) {\n if (this.isValueEqual(item[columnId], value)) return Promise.resolve();\n if (this.batchMode) {\n this.ensureSnapshot(rowKey, item);\n this.markCellDirty(rowKey, columnId, value);\n }\n item[columnId] = Array.isArray(value) ? [...value] : value;\n delete item.__searchIndex;\n this.distinctCache.delete(columnId);\n this.recompute();\n }\n return Promise.resolve();\n }\n\n public async setCellsBatch(\n updates: Array<{ rowKey: any; columnId: string; value: any }>\n ): Promise<void> {\n if (!updates || updates.length === 0) return Promise.resolve();\n const rowMap = new Map<any, Record<string, any>>();\n for (const r of this.rawData) {\n rowMap.set(r[this.keyField], r);\n }\n\n let changed = false;\n for (const u of updates) {\n const item = rowMap.get(u.rowKey);\n if (item && item[u.columnId] !== u.value) {\n if (this.batchMode) {\n this.ensureSnapshot(u.rowKey, item);\n this.markCellDirty(u.rowKey, u.columnId, u.value);\n }\n item[u.columnId] = u.value;\n delete item.__searchIndex;\n this.distinctCache.delete(u.columnId);\n changed = true;\n }\n }\n\n if (changed) {\n this.recompute();\n }\n return Promise.resolve();\n }\n\n public async updateRowFields(rowKey: any, patch: Record<string, any>): Promise<void> {\n const item = this.rawData.find((r) => r[this.keyField] === rowKey);\n if (item) {\n for (const [colId, val] of Object.entries(patch)) {\n if (colId === this.keyField || colId.startsWith('__')) continue;\n if (this.batchMode) {\n this.ensureSnapshot(rowKey, item);\n this.markCellDirty(rowKey, colId, val);\n }\n item[colId] = val;\n this.distinctCache.delete(colId);\n }\n delete item.__searchIndex;\n this.recompute();\n }\n return Promise.resolve();\n }\n\n private generateNextKey(): any {\n let maxId = 0;\n for (const r of this.rawData) {\n const k = Number(r[this.keyField]);\n if (!isNaN(k) && k > maxId) maxId = k;\n }\n return maxId > 0 ? maxId + 1 : Date.now();\n }\n\n public async insertRow(\n rowData: Record<string, any>,\n targetViewRowIndex?: number\n ): Promise<Record<string, any>> {\n const newKey = rowData[this.keyField] ?? this.generateNextKey();\n const newRow: Record<string, any> = {\n ...rowData,\n [this.keyField]: newKey,\n __rawIndex: this.rawData.length,\n };\n\n let insertIdx = 0; // Default at top so user immediately sees newly added row\n if (targetViewRowIndex !== undefined && targetViewRowIndex >= 0) {\n const vRow = this.virtualRows[targetViewRowIndex];\n if (vRow && vRow.type === 'data') {\n const rawIdx = this.rawData.findIndex(\n (r) => r[this.keyField] === vRow.data[this.keyField]\n );\n if (rawIdx !== -1) {\n insertIdx = rawIdx + 1;\n }\n } else if (targetViewRowIndex >= this.virtualRows.length) {\n insertIdx = this.rawData.length;\n }\n }\n\n this.rawData.splice(insertIdx, 0, newRow);\n // Reindex __rawIndex\n for (let i = 0; i < this.rawData.length; i++) {\n this.rawData[i].__rawIndex = i;\n }\n\n if (this.batchMode) {\n this.insertedKeys.add(newKey);\n }\n\n this.recompute();\n return Promise.resolve(newRow);\n }\n\n public async duplicateRow(\n rowKey: any,\n targetViewRowIndex?: number\n ): Promise<Record<string, any> | null> {\n const sourceIdx = this.rawData.findIndex((r) => r[this.keyField] === rowKey);\n if (sourceIdx === -1) return Promise.resolve(null);\n\n const source = this.rawData[sourceIdx];\n const newKey = this.generateNextKey();\n\n // Deep clone arrays/objects inside row (like sparkline)\n const cloned: Record<string, any> = {};\n for (const [k, v] of Object.entries(source)) {\n if (Array.isArray(v)) cloned[k] = [...v];\n else if (v && typeof v === 'object') cloned[k] = { ...v };\n else cloned[k] = v;\n }\n\n cloned[this.keyField] = newKey;\n if (typeof cloned.code === 'string' && cloned.code.startsWith('ACC-')) {\n cloned.code = `ACC-${100000 + Number(newKey)}`;\n }\n\n const insertIdx =\n targetViewRowIndex !== undefined ? sourceIdx + 1 : sourceIdx + 1;\n this.rawData.splice(insertIdx, 0, cloned);\n\n for (let i = 0; i < this.rawData.length; i++) {\n this.rawData[i].__rawIndex = i;\n }\n\n if (this.batchMode) {\n this.insertedKeys.add(newKey);\n }\n\n this.recompute();\n return Promise.resolve(cloned);\n }\n\n public async deleteRow(rowKey: any): Promise<void> {\n const idx = this.rawData.findIndex((r) => r[this.keyField] === rowKey);\n if (idx === -1) return Promise.resolve();\n\n const [removed] = this.rawData.splice(idx, 1);\n if (this.batchMode) {\n if (this.insertedKeys.has(rowKey)) {\n this.insertedKeys.delete(rowKey);\n } else {\n const origData = this.originalRowSnapshots.get(rowKey) || removed;\n this.deletedRows.set(rowKey, { data: { ...origData }, index: idx });\n }\n this.dirtyCells.delete(rowKey);\n }\n\n for (let i = 0; i < this.rawData.length; i++) {\n this.rawData[i].__rawIndex = i;\n }\n\n this.recompute();\n return Promise.resolve();\n }\n\n public async restoreRow(rowData: Record<string, any>, rawIndex?: number): Promise<void> {\n const key = rowData[this.keyField];\n const existingIdx = this.rawData.findIndex((r) => r[this.keyField] === key);\n if (existingIdx !== -1) return Promise.resolve();\n\n const targetIdx =\n rawIndex !== undefined ? Math.min(Math.max(0, rawIndex), this.rawData.length) : 0;\n this.rawData.splice(targetIdx, 0, { ...rowData });\n this.deletedRows.delete(key);\n\n for (let i = 0; i < this.rawData.length; i++) {\n this.rawData[i].__rawIndex = i;\n }\n\n this.recompute();\n return Promise.resolve();\n }\n\n // ============================================================================\n // BATCH MODE & DIRTY STATE METHODS\n // ============================================================================\n public setBatchMode(enabled: boolean): void {\n this.batchMode = enabled;\n }\n\n public isBatchMode(): boolean {\n return this.batchMode;\n }\n\n public isCellDirty(rowKey: any, columnId: string): boolean {\n return this.dirtyCells.get(rowKey)?.has(columnId) ?? false;\n }\n\n public isColumnDirty(columnId: string): boolean {\n for (const cols of this.dirtyCells.values()) {\n if (cols.has(columnId)) return true;\n }\n return false;\n }\n\n public isRowInserted(rowKey: any): boolean {\n return this.insertedKeys.has(rowKey);\n }\n\n public hasPendingChanges(): boolean {\n return (\n this.insertedKeys.size > 0 ||\n this.dirtyCells.size > 0 ||\n this.deletedRows.size > 0\n );\n }\n\n public getPendingChanges(): BatchChanges {\n const inserted: any[] = [];\n for (const key of this.insertedKeys) {\n const row = this.rawData.find((r) => r[this.keyField] === key);\n if (row) {\n const clean = { ...row };\n delete clean.__rawIndex;\n inserted.push(clean);\n }\n }\n\n const updated: Array<{ key: any; values: Record<string, any> }> = [];\n for (const [key, cols] of this.dirtyCells.entries()) {\n if (cols.size === 0 || this.insertedKeys.has(key)) continue;\n const row = this.rawData.find((r) => r[this.keyField] === key);\n if (row) {\n const values: Record<string, any> = {};\n for (const c of cols) {\n values[c] = row[c];\n }\n updated.push({ key, values });\n }\n }\n\n const deleted = Array.from(this.deletedRows.keys());\n\n return { inserted, updated, deleted };\n }\n\n public async saveBatchChanges(): Promise<BatchChanges> {\n const changes = this.getPendingChanges();\n this.originalRowSnapshots.clear();\n this.dirtyCells.clear();\n this.insertedKeys.clear();\n this.deletedRows.clear();\n this.emit('loaded');\n return Promise.resolve(changes);\n }\n\n public discardBatchChanges(): void {\n // 1. Remove uncommitted inserted rows\n if (this.insertedKeys.size > 0) {\n this.rawData = this.rawData.filter((r) => !this.insertedKeys.has(r[this.keyField]));\n }\n\n // 2. Restore deleted rows\n if (this.deletedRows.size > 0) {\n const entries = Array.from(this.deletedRows.values()).sort((a, b) => a.index - b.index);\n for (const entry of entries) {\n const idx = Math.min(entry.index, this.rawData.length);\n this.rawData.splice(idx, 0, { ...entry.data });\n }\n }\n\n // 3. Revert modified cells to original snapshots\n for (const [key, orig] of this.originalRowSnapshots.entries()) {\n const row = this.rawData.find((r) => r[this.keyField] === key);\n if (row) {\n Object.assign(row, orig);\n }\n }\n\n for (let i = 0; i < this.rawData.length; i++) {\n this.rawData[i].__rawIndex = i;\n }\n\n this.originalRowSnapshots.clear();\n this.dirtyCells.clear();\n this.insertedKeys.clear();\n this.deletedRows.clear();\n this.distinctCache.clear();\n\n this.recompute();\n }\n\n public async commitBatch(changes: BatchChanges): Promise<void> {\n if (changes.updated) {\n for (const u of changes.updated) {\n const item = this.rawData.find((r) => r[this.keyField] === u.key);\n if (item) Object.assign(item, u.values);\n }\n }\n if (changes.inserted) {\n for (const ins of changes.inserted) {\n this.rawData.unshift({\n ...ins,\n __rawIndex: 0,\n [this.keyField]: ins[this.keyField] ?? this.generateNextKey(),\n });\n }\n }\n if (changes.deleted) {\n const delKeys = new Set(changes.deleted);\n this.rawData = this.rawData.filter((r) => !delKeys.has(r[this.keyField]));\n }\n this.originalRowSnapshots.clear();\n this.dirtyCells.clear();\n this.insertedKeys.clear();\n this.deletedRows.clear();\n this.recompute();\n return Promise.resolve();\n }\n\n public async getDistinctValues(columnId: string, search?: string): Promise<DistinctItem[]> {\n let baseItems = this.distinctCache.get(columnId);\n\n if (!baseItems) {\n const counts = new Map<any, number>();\n let blankCount = 0;\n\n for (let i = 0; i < this.rawData.length; i++) {\n const val = this.rawData[i][columnId];\n if (\n val === undefined ||\n val === null ||\n val === '' ||\n (Array.isArray(val) && val.length === 0) ||\n (typeof val === 'object' && !Array.isArray(val) && Object.keys(val).length === 0)\n ) {\n blankCount++;\n } else if (Array.isArray(val)) {\n for (const elem of val) {\n if (elem !== undefined && elem !== null && elem !== '') {\n counts.set(elem, (counts.get(elem) || 0) + 1);\n }\n }\n } else if (typeof val === 'object') {\n const formatted = Object.entries(val)\n .map(([k, v]) => `${k}: ${String(v)}`)\n .join(' • ');\n counts.set(formatted, (counts.get(formatted) || 0) + 1);\n } else {\n counts.set(val, (counts.get(val) || 0) + 1);\n }\n }\n\n baseItems = Array.from(counts.entries()).map(([val, count]) => ({\n value: val,\n label: String(val),\n count,\n }));\n\n baseItems.sort((a, b) => SortEngine.compareValues(a.value, b.value));\n\n if (blankCount > 0) {\n baseItems.unshift({\n value: BLANK_FILTER_TOKEN,\n label: '(Blank)',\n count: blankCount,\n });\n }\n\n this.distinctCache.set(columnId, baseItems);\n }\n\n if (search) {\n const s = search.toLowerCase().trim();\n if (s) {\n return Promise.resolve(baseItems.filter((it) => it.label.toLowerCase().includes(s)));\n }\n }\n\n return Promise.resolve(baseItems);\n }\n\n // ============================================================================\n // DYNAMIC SUMMARY ENGINE\n // ============================================================================\n public getSummaryTypes(): Record<string, SummaryType> {\n return { ...this.summaryTypes };\n }\n\n public setSummaryType(columnId: string, summaryType: SummaryType): void {\n if (summaryType === 'none') {\n delete this.summaryTypes[columnId];\n } else {\n this.summaryTypes[columnId] = summaryType;\n }\n this.recomputeVirtualRowsOnly();\n }\n\n public getSummaries(): Record<string, number> | undefined {\n if (this.processedData.length === 0) return undefined;\n const result: Record<string, number> = {};\n\n for (const [colId, sType] of Object.entries(this.summaryTypes)) {\n if (!sType || sType === 'none') continue;\n\n if (sType === 'count') {\n let nonNullCount = 0;\n for (let i = 0; i < this.processedData.length; i++) {\n const v = this.processedData[i][colId];\n if (v !== null && v !== undefined && v !== '') nonNullCount++;\n }\n result[colId] = nonNullCount;\n continue;\n }\n\n let sum = 0;\n let count = 0;\n let min = Infinity;\n let max = -Infinity;\n\n for (let i = 0; i < this.processedData.length; i++) {\n const raw = this.processedData[i][colId];\n const num = Number(raw);\n if (raw !== null && raw !== undefined && raw !== '' && !isNaN(num)) {\n sum += num;\n count++;\n if (num < min) min = num;\n if (num > max) max = num;\n }\n }\n\n if (count > 0) {\n if (sType === 'sum') result[colId] = sum;\n else if (sType === 'avg') result[colId] = sum / count;\n else if (sType === 'min') result[colId] = min;\n else if (sType === 'max') result[colId] = max;\n } else {\n result[colId] = 0;\n }\n }\n\n return result;\n }\n\n public on(event: string, callback: (...args: any[]) => void): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(callback);\n }\n\n public off(event: string, callback: (...args: any[]) => void): void {\n this.listeners.get(event)?.delete(callback);\n }\n\n private emit(event: string, ...args: any[]): void {\n this.listeners.get(event)?.forEach((cb) => cb(...args));\n }\n\n private recompute(): void {\n this.emit('loading');\n\n // 1. Filter\n let filtered = this.rawData;\n if (this.currentFilter) {\n filtered = filtered.filter((row) => FilterEngine.evaluateRow(row, this.currentFilter));\n }\n\n // 2. Global Search (Fast Lowercase Pre-Indexed Substring Search)\n if (this.currentSearch) {\n const cleanKeyword = this.currentSearch.toLowerCase().trim();\n if (cleanKeyword) {\n filtered = filtered.filter((row) => FilterEngine.matchSearch(row, cleanKeyword));\n }\n }\n\n // 3. Multi-Sort\n if (this.currentSort.length > 0) {\n const cmp = SortEngine.createComparator(this.currentSort);\n filtered = [...filtered].sort(cmp);\n }\n\n this.processedData = filtered;\n\n // 4. Grouping & Virtual Row Projection\n this.recomputeVirtualRowsOnly();\n }\n\n private recomputeVirtualRowsOnly(): void {\n this.virtualRows = GroupingEngine.projectVirtualRows(\n this.processedData,\n this.currentGroups,\n this.expandedGroupKeys,\n this.summaryTypes\n );\n this.emit('loaded');\n }\n}\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintText({ ctx, value, theme, x, y, width, height }: CellPaintContext<string>): void {\n if (value === null || value === undefined || value === '') return;\n\n const padX = 10;\n const maxW = width - padX * 2;\n if (maxW <= 0) return;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + padX, y, maxW, height);\n ctx.clip();\n\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `normal ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(String(value), x + padX, y + height / 2);\n\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\n\nexport const TextEditor: React.FC<CellEditorProps<string>> = ({\n value,\n rect,\n theme,\n initialChar,\n onCommit,\n onCancel,\n}) => {\n const [text, setText] = useState<string>(initialChar ?? (value != null ? String(value) : ''));\n const inputRef = useRef<HTMLInputElement | null>(null);\n const committedRef = useRef<boolean>(false);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n if (!initialChar) {\n inputRef.current.select();\n } else {\n const len = inputRef.current.value.length;\n inputRef.current.setSelectionRange(len, len);\n }\n }\n }, [initialChar]);\n\n const safeCommit = (val: string, dir?: 'down' | 'right' | 'left' | 'none') => {\n if (committedRef.current) return;\n committedRef.current = true;\n onCommit(val, dir);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n safeCommit(text, e.shiftKey ? 'none' : 'down');\n } else if (e.key === 'Tab') {\n e.preventDefault();\n safeCommit(text, e.shiftKey ? 'left' : 'right');\n } else if (e.key === 'Escape') {\n e.preventDefault();\n committedRef.current = true;\n onCancel();\n }\n };\n\n return (\n <div\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: rect.x,\n top: rect.y,\n width: Math.max(rect.width, 110),\n height: rect.height,\n zIndex: 100,\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={() => safeCommit(text, 'none')}\n style={{\n width: '100%',\n height: '100%',\n padding: '0 8px',\n boxSizing: 'border-box',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `2px solid ${theme.dom.inputFocusBorder}`,\n outline: 'none',\n fontFamily: theme.fontFamily,\n fontSize: `${theme.fontSize}px`,\n borderRadius: 3,\n boxShadow: theme.dom.popoverShadow,\n }}\n />\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintText } from './TextPainter';\nimport { TextEditor } from './TextEditor';\n\nexport const TextColumnPlugin: IColumnTypePlugin<string> = {\n type: 'text',\n paint: paintText,\n editorComponent: TextEditor,\n\n onKeyDown({ event, openEditor }) {\n // First-key capture: Klavyeden herhangi bir harfe basıldığında editörü doğrudan o harfle aç\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n return text.trim();\n },\n\n formatClipboard(value) {\n return value != null ? String(value) : '';\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR', { numeric: true });\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nconst formatters = new Map<string, Intl.NumberFormat>();\n\nfunction getFormatter(minDigits: number, maxDigits: number, useGrouping: boolean = true): Intl.NumberFormat {\n const key = `${minDigits}_${maxDigits}_${useGrouping}`;\n let fmt = formatters.get(key);\n if (!fmt) {\n fmt = new Intl.NumberFormat('tr-TR', {\n minimumFractionDigits: minDigits,\n maximumFractionDigits: maxDigits,\n useGrouping,\n });\n formatters.set(key, fmt);\n }\n return fmt;\n}\n\nexport function paintNumber({ ctx, value, column, theme, x, y, width, height }: CellPaintContext<number>): void {\n if (value === null || value === undefined || value === ('' as any) || isNaN(Number(value))) return;\n\n const num = Number(value);\n let formatted: string;\n\n if (column.id === 'id') {\n formatted = String(Math.trunc(num));\n } else if (column.decimalDigits !== undefined) {\n formatted = getFormatter(column.decimalDigits, column.decimalDigits, true).format(num);\n } else if (Number.isInteger(num)) {\n formatted = getFormatter(0, 0, true).format(num);\n } else {\n formatted = getFormatter(0, 2, true).format(num);\n }\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 6, y, width - 12, height);\n ctx.clip();\n\n ctx.fillStyle = num < 0 ? (theme.isDark ? '#FF453A' : '#DC2626') : theme.canvas.cellText;\n ctx.font = `normal ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = column.align || 'right';\n const textX = column.align === 'center' ? x + width / 2 : column.align === 'left' ? x + 10 : x + width - 10;\n ctx.textBaseline = 'middle';\n ctx.fillText(formatted, textX, y + height / 2);\n\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\n\nexport const NumberEditor: React.FC<CellEditorProps<number>> = ({\n value,\n rect,\n theme,\n initialChar,\n onCommit,\n onCancel,\n}) => {\n const [val, setVal] = useState<string>(initialChar ?? (value != null ? String(value) : ''));\n const inputRef = useRef<HTMLInputElement | null>(null);\n const committedRef = useRef<boolean>(false);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n if (!initialChar) {\n inputRef.current.select();\n } else {\n const len = inputRef.current.value.length;\n inputRef.current.setSelectionRange(len, len);\n }\n }\n }, [initialChar]);\n\n const commitParsed = (moveDir?: 'down' | 'right' | 'left' | 'none') => {\n if (committedRef.current) return;\n committedRef.current = true;\n const clean = val.replace(/\\s/g, '').replace(',', '.');\n const parsed = parseFloat(clean);\n onCommit(isNaN(parsed) ? 0 : parsed, moveDir);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n commitParsed(e.shiftKey ? 'none' : 'down');\n } else if (e.key === 'Tab') {\n e.preventDefault();\n commitParsed(e.shiftKey ? 'left' : 'right');\n } else if (e.key === 'Escape') {\n e.preventDefault();\n committedRef.current = true;\n onCancel();\n }\n };\n\n return (\n <div\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: rect.x,\n top: rect.y,\n width: Math.max(rect.width, 100),\n height: rect.height,\n zIndex: 100,\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={val}\n onChange={(e) => setVal(e.target.value)}\n onKeyDown={handleKeyDown}\n onBlur={() => commitParsed('none')}\n style={{\n width: '100%',\n height: '100%',\n padding: '0 8px',\n textAlign: 'right',\n boxSizing: 'border-box',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `2px solid ${theme.dom.inputFocusBorder}`,\n outline: 'none',\n fontFamily: theme.fontFamily,\n fontSize: `${theme.fontSize}px`,\n borderRadius: 3,\n boxShadow: theme.dom.popoverShadow,\n }}\n />\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintNumber } from './NumberPainter';\nimport { NumberEditor } from './NumberEditor';\n\nexport const NumberColumnPlugin: IColumnTypePlugin<number> = {\n type: 'number',\n paint: paintNumber,\n editorComponent: NumberEditor,\n\n onKeyDown({ event, openEditor }) {\n if (/^[0-9.,-]$/.test(event.key) && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n const clean = text.replace(/\\./g, '').replace(',', '.').replace(/[^0-9.-]/g, '');\n const num = parseFloat(clean);\n return isNaN(num) ? 0 : num;\n },\n\n formatClipboard(value) {\n return value != null ? String(value) : '';\n },\n\n comparator(a, b) {\n return (Number(a) || 0) - (Number(b) || 0);\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nconst formatters = new Map<number, Intl.NumberFormat>();\n\nfunction getFormatter(digits: number): Intl.NumberFormat {\n let fmt = formatters.get(digits);\n if (!fmt) {\n fmt = new Intl.NumberFormat('tr-TR', {\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n });\n formatters.set(digits, fmt);\n }\n return fmt;\n}\n\nexport function paintCurrency({ ctx, value, column, theme, x, y, width, height }: CellPaintContext<number>): void {\n if (value === null || value === undefined || isNaN(Number(value))) return;\n\n const num = Number(value);\n const digits = column.decimalDigits ?? 2;\n const symbol = column.currencySymbol ?? '₺';\n const formatted = `${getFormatter(digits).format(num)} ${symbol}`;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 6, y, width - 12, height);\n ctx.clip();\n\n ctx.fillStyle = num < 0 ? (theme.isDark ? '#FF453A' : '#DC2626') : theme.canvas.cellText;\n ctx.font = `500 ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'right';\n ctx.textBaseline = 'middle';\n ctx.fillText(formatted, x + width - 10, y + height / 2);\n\n ctx.restore();\n}\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintCurrency } from './CurrencyPainter';\nimport { NumberEditor } from '../NumberColumn/NumberEditor';\n\nexport const CurrencyColumnPlugin: IColumnTypePlugin<number> = {\n type: 'currency',\n paint: paintCurrency,\n editorComponent: NumberEditor,\n\n onKeyDown({ event, openEditor }) {\n if (/^[0-9.,-]$/.test(event.key) && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n const clean = text.trim();\n // Handle both US (12,345.67) and TR/EU (12.345,67) formats gracefully\n if (clean.includes(',') && clean.includes('.')) {\n const lastComma = clean.lastIndexOf(',');\n const lastDot = clean.lastIndexOf('.');\n if (lastComma > lastDot) {\n const num = parseFloat(clean.replace(/\\./g, '').replace(',', '.').replace(/[^0-9.-]/g, ''));\n return isNaN(num) ? 0 : num;\n } else {\n const num = parseFloat(clean.replace(/,/g, '').replace(/[^0-9.-]/g, ''));\n return isNaN(num) ? 0 : num;\n }\n } else if (clean.includes(',')) {\n const num = parseFloat(clean.replace(',', '.').replace(/[^0-9.-]/g, ''));\n return isNaN(num) ? 0 : num;\n }\n const num = parseFloat(clean.replace(/[^0-9.-]/g, ''));\n return isNaN(num) ? 0 : num;\n },\n\n formatClipboard(value, column) {\n const sym = column.currencySymbol ?? '$';\n return value != null ? `${value} ${sym}` : '';\n },\n\n comparator(a, b) {\n return (Number(a) || 0) - (Number(b) || 0);\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\nimport { NumberEditor } from '../NumberColumn/NumberEditor';\nimport { IColumnTypePlugin } from '../../IColumnTypePlugin';\n\nexport function paintPercent({\n ctx,\n value,\n column,\n theme,\n locale,\n x,\n y,\n width,\n height,\n}: CellPaintContext<number>): void {\n if (value === null || value === undefined || value === ('' as any)) return;\n const num = Number(value);\n if (isNaN(num)) return;\n\n const digits = column.decimalDigits ?? 1;\n const formatted = num.toLocaleString(locale.code, {\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n });\n\n const showSign = column.showVarianceSign ?? true;\n const signPrefix = showSign && num > 0 ? '+' : '';\n const arrow = showSign ? (num > 0 ? '▲ ' : num < 0 ? '▼ ' : '') : '';\n const text = `${arrow}${signPrefix}${formatted}%`;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 6, y, width - 12, height);\n ctx.clip();\n\n if (showSign && num > 0) {\n ctx.fillStyle = theme.isDark ? '#34D399' : '#059669';\n } else if (showSign && num < 0) {\n ctx.fillStyle = theme.isDark ? '#F87171' : '#DC2626';\n } else {\n ctx.fillStyle = theme.canvas.cellText;\n }\n\n ctx.font = `600 ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'right';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, x + width - 10, y + height / 2);\n ctx.restore();\n}\n\nexport const PercentColumnPlugin: IColumnTypePlugin<number> = {\n type: 'percent',\n paint: paintPercent,\n editorComponent: NumberEditor,\n\n onKeyDown({ event, openEditor }) {\n if (/^[0-9.,+-]$/.test(event.key) && !event.ctrlKey && !event.metaKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n const clean = text.replace(/[%▲▼+\\s]/g, '').replace(',', '.');\n const n = parseFloat(clean);\n return isNaN(n) ? 0 : n;\n },\n\n formatClipboard(value) {\n const n = Number(value);\n return isNaN(n) ? '0%' : `${n}%`;\n },\n\n comparator(a, b) {\n return (Number(a) || 0) - (Number(b) || 0);\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintBoolean({ ctx, value, theme, x, y, width, height }: CellPaintContext<boolean>): void {\n const size = 16;\n const boxX = Math.round(x + (width - size) / 2);\n const boxY = Math.round(y + (height - size) / 2);\n\n ctx.save();\n ctx.lineWidth = 1.5;\n\n if (value) {\n ctx.fillStyle = theme.canvas.selectionBorder;\n ctx.beginPath();\n ctx.roundRect(boxX, boxY, size, size, 3);\n ctx.fill();\n\n ctx.strokeStyle = '#FFFFFF';\n ctx.beginPath();\n ctx.moveTo(boxX + 3.5, boxY + 8);\n ctx.lineTo(boxX + 6.5, boxY + 11.5);\n ctx.lineTo(boxX + 12.5, boxY + 4.5);\n ctx.stroke();\n } else {\n ctx.strokeStyle = theme.isDark ? '#5A5A5E' : '#C7C7CC';\n ctx.fillStyle = theme.canvas.bg;\n ctx.beginPath();\n ctx.roundRect(boxX, boxY, size, size, 3);\n ctx.fill();\n ctx.stroke();\n }\n\n ctx.restore();\n}\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintBoolean } from './BooleanPainter';\n\nexport const BooleanColumnPlugin: IColumnTypePlugin<boolean> = {\n type: 'boolean',\n paint: paintBoolean,\n editorComponent: undefined, // Zero-DOM: DOM açmadan doğrudan canvas üstünden çalışır\n\n onPointerDown({ value, setValue }) {\n setValue(!value);\n return { handled: true };\n },\n\n onKeyDown({ event, value, setValue }) {\n if (event.key === ' ') {\n event.preventDefault();\n setValue(!value);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n const clean = text.trim().toLowerCase();\n return ['true', '1', 'evet', 'aktif', 'yes'].includes(clean);\n },\n\n formatClipboard(value) {\n return value ? 'DOĞRU' : 'YANLIŞ';\n },\n\n comparator(a, b) {\n return (a === b ? 0 : a ? 1 : -1);\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\nimport { SelectOption } from '../../../types/grid';\n\n/**\n * Açık renkleri Dark Mode için Apple / Google tarzı yarı saydam ve canlı renklere dönüştürür\n */\nfunction resolveBadgeColors(opt: SelectOption, isDark: boolean): { bg: string; fg: string; border?: string } {\n if (!isDark) {\n return {\n bg: opt.bg || '#E5E5EA',\n fg: opt.fg || '#1D1D1F',\n border: undefined,\n };\n }\n\n // 1. Kullanıcı özel darkBg / darkFg verdiyse öncelikle onu kullan\n if (opt.darkBg && opt.darkFg) {\n return {\n bg: opt.darkBg,\n fg: opt.darkFg,\n border: opt.darkFg ? `${opt.darkFg}33` : undefined,\n };\n }\n\n // 2. Akıllı renk tahmini (Hex veya Tailwind/pastel renkler)\n const bg = (opt.bg || '').toLowerCase();\n const fg = (opt.fg || '').toLowerCase();\n\n // Yeşil (Aktif / Onay / Başarılı)\n if (bg.includes('dcfce7') || fg.includes('166534') || bg.includes('green') || bg.includes('emerald')) {\n return { bg: 'rgba(48, 209, 88, 0.16)', fg: '#30D158', border: 'rgba(48, 209, 88, 0.28)' };\n }\n // Sarı / Turuncu (Beklemede / Uyarı)\n if (bg.includes('fef3c7') || fg.includes('92400e') || bg.includes('yellow') || bg.includes('amber')) {\n return { bg: 'rgba(255, 159, 10, 0.16)', fg: '#FF9F0A', border: 'rgba(255, 159, 10, 0.28)' };\n }\n // Mavi / Cyan (İncelemede / Bilgi)\n if (bg.includes('e0f2fe') || fg.includes('075985') || bg.includes('blue') || bg.includes('sky')) {\n return { bg: 'rgba(10, 132, 255, 0.16)', fg: '#64D2FF', border: 'rgba(10, 132, 255, 0.28)' };\n }\n // Kırmızı / Rose (İptal / Hata)\n if (bg.includes('fee2e2') || fg.includes('991b1b') || bg.includes('red') || bg.includes('rose')) {\n return { bg: 'rgba(255, 69, 58, 0.16)', fg: '#FF453A', border: 'rgba(255, 69, 58, 0.28)' };\n }\n // Mor / Violet\n if (bg.includes('purple') || bg.includes('violet') || bg.includes('f3e8ff')) {\n return { bg: 'rgba(191, 90, 242, 0.16)', fg: '#BF5AF2', border: 'rgba(191, 90, 242, 0.28)' };\n }\n\n // Varsayılan koyu nötr rozet\n return {\n bg: opt.darkBg || 'rgba(255, 255, 255, 0.08)',\n fg: opt.darkFg || '#F5F5F7',\n border: 'rgba(255, 255, 255, 0.12)',\n };\n}\n\nexport function paintSelect({ ctx, value, column, theme, x, y, width, height }: CellPaintContext<string>): void {\n if (!value) return;\n\n const opt = column.options?.find((o) => o.value === value) ?? {\n value,\n label: String(value),\n };\n\n const colors = resolveBadgeColors(opt, theme.isDark);\n\n ctx.save();\n const pad = 6;\n const pillH = 22;\n const pillY = y + (height - pillH) / 2;\n const pillW = Math.min(width - pad * 2 - 18, 180);\n\n if (pillW > 20) {\n // Rozet Zemin\n ctx.fillStyle = colors.bg;\n ctx.beginPath();\n ctx.roundRect(x + pad, pillY, pillW, pillH, 4);\n ctx.fill();\n\n // Rozet Kenarlık (Koyu modda derinlik için)\n if (colors.border) {\n ctx.strokeStyle = colors.border;\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n\n // Rozet Metin\n ctx.beginPath();\n ctx.rect(x + pad + 6, pillY, pillW - 12, pillH);\n ctx.clip();\n\n ctx.fillStyle = colors.fg;\n ctx.font = `600 ${theme.fontSize - 1}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(opt.label, x + pad + 8, y + height / 2);\n }\n\n // Açılır ok ikonu (▼)\n ctx.restore();\n ctx.save();\n ctx.fillStyle = theme.isDark ? '#8E8E93' : '#AEAEB2';\n ctx.beginPath();\n const arrowX = x + width - 12;\n const arrowY = y + height / 2;\n ctx.moveTo(arrowX - 3.5, arrowY - 2);\n ctx.lineTo(arrowX + 3.5, arrowY - 2);\n ctx.lineTo(arrowX, arrowY + 2.5);\n ctx.closePath();\n ctx.fill();\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\n\nexport const SelectEditor: React.FC<CellEditorProps<string>> = ({\n value,\n column,\n rect,\n theme,\n locale,\n initialChar,\n onCommit,\n onCancel,\n}) => {\n const options = column.options || [];\n const [search, setSearch] = useState<string>(initialChar || '');\n const [highlightedIndex, setHighlightedIndex] = useState<number>(() => {\n const idx = options.findIndex((o) => o.value === value);\n return idx >= 0 ? idx : 0;\n });\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n const filtered = options.filter(\n (o) =>\n o.label.toLowerCase().includes(search.toLowerCase()) ||\n o.value.toLowerCase().includes(search.toLowerCase())\n );\n\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n onCancel();\n }\n };\n document.addEventListener('mousedown', handleOutside, true);\n return () => document.removeEventListener('mousedown', handleOutside, true);\n }, [onCancel]);\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n e.stopPropagation();\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setHighlightedIndex((prev) => Math.min(prev + 1, Math.max(0, filtered.length - 1)));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setHighlightedIndex((prev) => Math.max(prev - 1, 0));\n } else if (e.key === 'Enter') {\n e.preventDefault();\n if (filtered[highlightedIndex]) {\n onCommit(filtered[highlightedIndex].value, 'down');\n } else {\n onCancel();\n }\n } else if (e.key === 'Tab') {\n e.preventDefault();\n if (filtered[highlightedIndex]) {\n onCommit(filtered[highlightedIndex].value, e.shiftKey ? 'left' : 'right');\n } else {\n onCancel();\n }\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n }\n };\n\n return (\n <div\n ref={containerRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: Math.max(4, rect.x),\n top: rect.y,\n minWidth: Math.max(rect.width, 190),\n zIndex: 120,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 8,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n overflow: 'hidden',\n }}\n >\n <div style={{ padding: 6, borderBottom: `1px solid ${theme.dom.popoverBorder}` }}>\n <input\n ref={inputRef}\n type=\"text\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value);\n setHighlightedIndex(0);\n }}\n onKeyDown={handleKeyDown}\n placeholder={locale?.searchValuesPlaceholder || 'Search values...'}\n style={{\n width: '100%',\n padding: '5px 8px',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `1px solid ${theme.dom.inputBorder}`,\n borderRadius: 4,\n outline: 'none',\n fontSize: 12,\n fontFamily: theme.fontFamily,\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n <div style={{ maxHeight: 190, overflowY: 'auto', padding: 4 }}>\n {filtered.length === 0 ? (\n <div style={{ padding: '8px 12px', fontSize: 12, color: '#8E8E93' }}>\n {locale?.noMatches || 'No matching records'}\n </div>\n ) : (\n filtered.map((opt, i) => {\n const isSelected = opt.value === value;\n const isHigh = i === highlightedIndex;\n return (\n <div\n key={opt.value}\n onMouseDown={(e) => {\n e.stopPropagation();\n onCommit(opt.value, 'none');\n }}\n onMouseEnter={() => setHighlightedIndex(i)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '6px 10px',\n borderRadius: 4,\n cursor: 'pointer',\n backgroundColor: isHigh\n ? theme.isDark\n ? 'rgba(255,255,255,0.08)'\n : 'rgba(0,0,0,0.05)'\n : 'transparent',\n fontSize: 12,\n fontFamily: theme.fontFamily,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n {(opt.bg || opt.darkFg) && (\n <span\n style={{\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: theme.isDark\n ? opt.darkFg || '#60A5FA'\n : opt.fg || opt.bg || '#3B82F6',\n }}\n />\n )}\n <span>{opt.label}</span>\n </div>\n {isSelected && <span style={{ color: theme.dom.accentColor, fontWeight: 700 }}>✓</span>}\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintSelect } from './SelectPainter';\nimport { SelectEditor } from './SelectEditor';\n\nexport const SelectColumnPlugin: IColumnTypePlugin<string> = {\n type: 'select',\n paint: paintSelect,\n editorComponent: SelectEditor,\n\n onPointerDown({ localX, column }) {\n // Sağdaki ok alanına tıklandıysa doğrudan editörü aç\n if (localX > column.width - 28) {\n return { handled: true, shouldOpenEditor: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n openEditor();\n return true;\n }\n return false;\n },\n\n parseClipboard(text, column) {\n const clean = text.trim().toLowerCase();\n const match = column.options?.find(\n (o) => o.value.toLowerCase() === clean || o.label.toLowerCase() === clean\n );\n return match ? match.value : text.trim();\n },\n\n formatClipboard(value, column) {\n const match = column.options?.find((o) => o.value === value);\n return match ? match.label : String(value ?? '');\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR');\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintDropdown({\n ctx,\n value,\n column,\n theme,\n x,\n y,\n width,\n height,\n isHovered,\n isSelected,\n}: CellPaintContext<string>): void {\n ctx.save();\n\n const opt = column.options?.find(\n (o) => o.value === value || o.label.toLowerCase() === String(value ?? '').toLowerCase()\n );\n const displayLabel = opt ? opt.label : value != null ? String(value) : '';\n\n // Optional subtle color dot on left if option defines colors\n let textStartX = x + 8;\n if (displayLabel && opt && (opt.bg || opt.darkFg || opt.fg)) {\n const dotColor = theme.isDark\n ? opt.darkFg || '#38BDF8'\n : opt.fg || '#0284C7';\n ctx.fillStyle = dotColor;\n ctx.beginPath();\n ctx.arc(x + 12, y + height / 2, 3.5, 0, Math.PI * 2);\n ctx.fill();\n textStartX = x + 21;\n }\n\n // Cell label text\n if (displayLabel) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(textStartX, y, Math.max(0, width - (textStartX - x) - 28), height);\n ctx.clip();\n\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `500 ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(displayLabel, textStartX, y + height / 2);\n ctx.restore();\n }\n\n // ComboBox Dropdown Button on right side of cell\n if (width > 48) {\n const btnSize = 18;\n const btnX = x + width - btnSize - 5;\n const btnY = y + (height - btnSize) / 2;\n\n ctx.fillStyle =\n isSelected || isHovered\n ? theme.isDark\n ? 'rgba(56, 189, 248, 0.16)'\n : 'rgba(2, 132, 199, 0.10)'\n : theme.isDark\n ? 'rgba(255, 255, 255, 0.05)'\n : 'rgba(15, 23, 42, 0.04)';\n ctx.beginPath();\n ctx.roundRect(btnX, btnY, btnSize, btnSize, 4);\n ctx.fill();\n\n // Chevron arrow\n ctx.fillStyle =\n isSelected || isHovered\n ? theme.dom.accentColor\n : theme.isDark\n ? '#94A3B8'\n : '#64748B';\n ctx.beginPath();\n const cx = btnX + btnSize / 2;\n const cy = btnY + btnSize / 2;\n ctx.moveTo(cx - 3.5, cy - 1.5);\n ctx.lineTo(cx + 3.5, cy - 1.5);\n ctx.lineTo(cx, cy + 2.5);\n ctx.closePath();\n ctx.fill();\n }\n\n ctx.restore();\n}\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintDropdown } from './DropdownPainter';\nimport { SelectEditor } from '../SelectColumn/SelectEditor';\n\nexport const DropdownColumnPlugin: IColumnTypePlugin<string> = {\n type: 'dropdown',\n paint: paintDropdown,\n editorComponent: SelectEditor,\n\n onPointerDown({ localX, column }) {\n if (localX > column.width - 28) {\n return { handled: true, shouldOpenEditor: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n openEditor();\n return true;\n }\n return false;\n },\n\n parseClipboard(text, column) {\n const clean = text.trim().toLowerCase();\n const match = column.options?.find(\n (o) => o.value.toLowerCase() === clean || o.label.toLowerCase() === clean\n );\n return match ? match.value : text.trim();\n },\n\n formatClipboard(value, column) {\n const match = column.options?.find((o) => o.value === value);\n return match ? match.label : String(value ?? '');\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR');\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\nimport { SelectOption } from '../../../types/grid';\n\nfunction resolveTagColors(opt: SelectOption, isDark: boolean): { bg: string; fg: string; border?: string } {\n if (!isDark) {\n return {\n bg: opt.bg || '#E0E7FF',\n fg: opt.fg || '#1E40AF',\n border: undefined,\n };\n }\n\n if (opt.darkBg && opt.darkFg) {\n return {\n bg: opt.darkBg,\n fg: opt.darkFg,\n border: `${opt.darkFg}33`,\n };\n }\n\n return {\n bg: 'rgba(99, 102, 241, 0.18)',\n fg: '#818CF8',\n border: 'rgba(99, 102, 241, 0.32)',\n };\n}\n\nexport function normalizeMultiValue(value: any): string[] {\n if (!value) return [];\n if (Array.isArray(value)) {\n return value.map((v) => String(v).trim()).filter(Boolean);\n }\n if (typeof value === 'string') {\n return value\n .split(/[,;|]/)\n .map((s) => s.trim())\n .filter(Boolean);\n }\n return [String(value)];\n}\n\nexport function paintMultiSelect({\n ctx,\n value,\n column,\n theme,\n x,\n y,\n width,\n height,\n isHovered,\n isSelected,\n}: CellPaintContext<string[] | string>): void {\n const items = normalizeMultiValue(value);\n\n ctx.save();\n const pad = 6;\n const pillH = 20;\n const pillY = y + (height - pillH) / 2;\n const maxRight = x + width - 22; // Reserve space for dropdown arrow\n\n let curX = x + pad;\n ctx.font = `600 ${theme.fontSize - 2}px ${theme.fontFamily}`;\n ctx.textBaseline = 'middle';\n ctx.textAlign = 'left';\n\n for (let i = 0; i < items.length; i++) {\n const rawVal = items[i];\n const opt = column.options?.find((o) => o.value === rawVal) ?? {\n value: rawVal,\n label: rawVal,\n };\n const colors = resolveTagColors(opt, theme.isDark);\n const textW = ctx.measureText(opt.label).width;\n const pillW = Math.min(textW + 14, 110);\n\n const remainingCount = items.length - i;\n const reserveForMore = remainingCount > 1 ? 28 : 0;\n\n if (curX + pillW + reserveForMore > maxRight && i > 0) {\n // Draw +N overflow badge\n const moreText = `+${remainingCount}`;\n const moreW = ctx.measureText(moreText).width + 10;\n if (curX + moreW <= maxRight + 6) {\n ctx.fillStyle = theme.isDark ? 'rgba(255,255,255,0.12)' : 'rgba(15,23,42,0.08)';\n ctx.beginPath();\n ctx.roundRect(curX, pillY, moreW, pillH, 4);\n ctx.fill();\n\n ctx.fillStyle = theme.canvas.cellText;\n ctx.fillText(moreText, curX + 5, y + height / 2);\n }\n break;\n }\n\n const drawW = Math.max(24, Math.min(pillW, maxRight - curX));\n if (drawW < 24) break;\n\n // Pill background\n ctx.fillStyle = colors.bg;\n ctx.beginPath();\n ctx.roundRect(curX, pillY, drawW, pillH, 4);\n ctx.fill();\n\n if (colors.border) {\n ctx.strokeStyle = colors.border;\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n\n // Pill label clipped\n ctx.save();\n ctx.beginPath();\n ctx.rect(curX + 4, pillY, drawW - 8, pillH);\n ctx.clip();\n ctx.fillStyle = colors.fg;\n ctx.fillText(opt.label, curX + 7, y + height / 2);\n ctx.restore();\n\n curX += drawW + 4;\n }\n\n // Dropdown arrow icon (▼) on right\n ctx.fillStyle =\n isSelected || isHovered\n ? theme.dom.accentColor\n : theme.isDark\n ? '#8E8E93'\n : '#AEAEB2';\n ctx.beginPath();\n const arrowX = x + width - 12;\n const arrowY = y + height / 2;\n ctx.moveTo(arrowX - 3.5, arrowY - 2);\n ctx.lineTo(arrowX + 3.5, arrowY - 2);\n ctx.lineTo(arrowX, arrowY + 2.5);\n ctx.closePath();\n ctx.fill();\n\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\nimport { normalizeMultiValue } from './MultiSelectPainter';\n\nexport const MultiSelectEditor: React.FC<CellEditorProps<string[] | string>> = ({\n value,\n column,\n rect,\n theme,\n locale,\n initialChar,\n onCommit,\n onCancel,\n}) => {\n const options = column.options || [];\n const [selected, setSelected] = useState<string[]>(() => normalizeMultiValue(value));\n const [search, setSearch] = useState<string>(initialChar || '');\n const [highlightedIndex, setHighlightedIndex] = useState<number>(0);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const latestSelectedRef = useRef<string[]>(selected);\n latestSelectedRef.current = selected;\n\n const isTR = locale?.code?.startsWith('tr');\n\n const filtered = options.filter(\n (o) =>\n o.label.toLowerCase().includes(search.toLowerCase()) ||\n o.value.toLowerCase().includes(search.toLowerCase())\n );\n\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n // Commit when clicking outside\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n onCommit(latestSelectedRef.current, 'none');\n }\n };\n document.addEventListener('mousedown', handleOutside, true);\n return () => document.removeEventListener('mousedown', handleOutside, true);\n }, [onCommit]);\n\n const toggleValue = (val: string) => {\n setSelected((prev) =>\n prev.includes(val) ? prev.filter((item) => item !== val) : [...prev, val]\n );\n };\n\n const handleSelectAll = () => {\n setSelected(options.map((o) => o.value));\n };\n\n const handleClearAll = () => {\n setSelected([]);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n e.stopPropagation();\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setHighlightedIndex((prev) => Math.min(prev + 1, Math.max(0, filtered.length - 1)));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setHighlightedIndex((prev) => Math.max(prev - 1, 0));\n } else if (e.key === ' ' && filtered[highlightedIndex] && search === '') {\n e.preventDefault();\n toggleValue(filtered[highlightedIndex].value);\n } else if (e.key === 'Enter') {\n e.preventDefault();\n onCommit(selected, 'down');\n } else if (e.key === 'Tab') {\n e.preventDefault();\n onCommit(selected, e.shiftKey ? 'left' : 'right');\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n }\n };\n\n return (\n <div\n ref={containerRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: Math.max(4, rect.x),\n top: rect.y,\n minWidth: Math.max(rect.width, 235),\n zIndex: 125,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n overflow: 'hidden',\n fontFamily: theme.fontFamily,\n userSelect: 'none',\n }}\n >\n {/* Search Box */}\n <div style={{ padding: 8, borderBottom: `1px solid ${theme.dom.popoverBorder}` }}>\n <input\n ref={inputRef}\n type=\"text\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value);\n setHighlightedIndex(0);\n }}\n onKeyDown={handleKeyDown}\n placeholder={isTR ? 'Çoklu seçim ara...' : 'Search multiple choices...'}\n style={{\n width: '100%',\n padding: '5px 8px',\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n border: `1px solid ${theme.dom.inputBorder}`,\n borderRadius: 6,\n outline: 'none',\n fontSize: 12,\n fontFamily: theme.fontFamily,\n boxSizing: 'border-box',\n }}\n />\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginTop: 6,\n fontSize: 11,\n }}\n >\n <span style={{ color: '#8E8E93', fontWeight: 600 }}>\n {isTR ? `${selected.length} seçildi` : `${selected.length} selected`}\n </span>\n <div style={{ display: 'flex', gap: 8 }}>\n <button\n type=\"button\"\n onClick={handleSelectAll}\n style={{\n border: 'none',\n background: 'none',\n color: theme.dom.accentColor,\n fontSize: 11,\n fontWeight: 600,\n cursor: 'pointer',\n padding: 0,\n }}\n >\n {isTR ? 'Tümünü Seç' : 'Select All'}\n </button>\n <button\n type=\"button\"\n onClick={handleClearAll}\n style={{\n border: 'none',\n background: 'none',\n color: '#8E8E93',\n fontSize: 11,\n fontWeight: 600,\n cursor: 'pointer',\n padding: 0,\n }}\n >\n {isTR ? 'Temizle' : 'Clear'}\n </button>\n </div>\n </div>\n </div>\n\n {/* Multi-Checkbox Options List */}\n <div style={{ maxHeight: 200, overflowY: 'auto', padding: 4 }}>\n {filtered.length === 0 ? (\n <div style={{ padding: '8px 12px', fontSize: 12, color: '#8E8E93' }}>\n {locale?.noMatches || 'No matching options'}\n </div>\n ) : (\n filtered.map((opt, i) => {\n const isChecked = selected.includes(opt.value);\n const isHigh = i === highlightedIndex;\n return (\n <div\n key={opt.value}\n onClick={() => toggleValue(opt.value)}\n onMouseEnter={() => setHighlightedIndex(i)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '6px 10px',\n borderRadius: 6,\n cursor: 'pointer',\n backgroundColor: isHigh\n ? theme.isDark\n ? 'rgba(255,255,255,0.08)'\n : 'rgba(0,0,0,0.05)'\n : 'transparent',\n fontSize: 12,\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n <input\n type=\"checkbox\"\n checked={isChecked}\n onChange={() => {}}\n style={{\n cursor: 'pointer',\n accentColor: theme.dom.accentColor,\n margin: 0,\n }}\n />\n <span\n style={{\n padding: '2px 7px',\n borderRadius: 4,\n fontSize: 11,\n fontWeight: 600,\n backgroundColor: theme.isDark\n ? opt.darkBg || 'rgba(99,102,241,0.18)'\n : opt.bg || '#E0E7FF',\n color: theme.isDark\n ? opt.darkFg || '#818CF8'\n : opt.fg || '#1E40AF',\n }}\n >\n {opt.label}\n </span>\n </div>\n </div>\n );\n })\n )}\n </div>\n\n {/* Footer Commit Buttons */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'flex-end',\n gap: 6,\n padding: '6px 8px',\n borderTop: `1px solid ${theme.dom.popoverBorder}`,\n }}\n >\n <button\n type=\"button\"\n onClick={onCancel}\n style={{\n padding: '4px 10px',\n fontSize: 11,\n borderRadius: 5,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {locale?.cancel || (isTR ? 'İptal' : 'Cancel')}\n </button>\n <button\n type=\"button\"\n onClick={() => onCommit(selected, 'none')}\n style={{\n padding: '4px 12px',\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 5,\n border: 'none',\n backgroundColor: theme.dom.accentColor,\n color: '#FFFFFF',\n cursor: 'pointer',\n }}\n >\n {locale?.apply || (isTR ? 'Uygula' : 'Apply')} ({selected.length})\n </button>\n </div>\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintMultiSelect, normalizeMultiValue } from './MultiSelectPainter';\nimport { MultiSelectEditor } from './MultiSelectEditor';\n\nexport const MultiSelectColumnPlugin: IColumnTypePlugin<string[] | string> = {\n type: 'multiselect',\n paint: paintMultiSelect,\n editorComponent: MultiSelectEditor,\n\n onPointerDown({ localX, column }) {\n if (localX > column.width - 28) {\n return { handled: true, shouldOpenEditor: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n openEditor();\n return true;\n }\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text, column) {\n const parts = normalizeMultiValue(text);\n if (!column.options || column.options.length === 0) return parts;\n return parts.map((p) => {\n const clean = p.toLowerCase();\n const match = column.options?.find(\n (o) => o.value.toLowerCase() === clean || o.label.toLowerCase() === clean\n );\n return match ? match.value : p;\n });\n },\n\n formatClipboard(value, column) {\n const items = normalizeMultiValue(value);\n return items\n .map((v) => {\n const match = column.options?.find((o) => o.value === v);\n return match ? match.label : v;\n })\n .join(', ');\n },\n\n comparator(a, b) {\n const strA = normalizeMultiValue(a).join(', ');\n const strB = normalizeMultiValue(b).join(', ');\n return strA.localeCompare(strB, 'tr-TR');\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nfunction getInitials(label: string): string {\n const parts = label.trim().split(/\\s+/);\n if (parts.length >= 2) {\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n return label.slice(0, 2).toUpperCase();\n}\n\nexport function paintLookup({\n ctx,\n value,\n column,\n theme,\n x,\n y,\n width,\n height,\n isHovered,\n isSelected,\n}: CellPaintContext<string>): void {\n const rawVal = value != null ? String(value) : '';\n if (!rawVal) return;\n\n const opt = column.options?.find((o) => String(o.value) === rawVal) || {\n value: rawVal,\n label: rawVal,\n };\n\n ctx.save();\n const centerY = y + height / 2;\n const avatarR = 10;\n const avatarCX = x + 8 + avatarR;\n\n // 1. Draw Circular Avatar Badge\n const avatarBg = theme.isDark\n ? opt.darkBg || 'rgba(139, 92, 246, 0.25)'\n : opt.bg || '#EDE9FE';\n const avatarFg = theme.isDark ? opt.darkFg || '#C4B5FD' : opt.fg || '#5B21B6';\n\n ctx.fillStyle = avatarBg;\n ctx.beginPath();\n ctx.arc(avatarCX, centerY, avatarR, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.fillStyle = avatarFg;\n ctx.font = `700 9.5px ${theme.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(getInitials(opt.label), avatarCX, centerY);\n\n // 2. Draw Primary Display Label + Subtitle clipped\n const textX = avatarCX + avatarR + 7;\n const maxTextW = width - (textX - x) - 22;\n\n if (maxTextW > 16) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(textX, y, maxTextW, height);\n ctx.clip();\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.font = `600 ${theme.fontSize - 1}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.canvas.cellText;\n ctx.fillText(opt.label, textX, centerY);\n\n if (opt.subtitle) {\n const labelW = ctx.measureText(opt.label).width;\n ctx.font = `400 ${theme.fontSize - 2.5}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.isDark ? '#94A3B8' : '#64748B';\n ctx.fillText(` · ${opt.subtitle}`, textX + labelW, centerY);\n }\n\n ctx.restore();\n }\n\n // 3. Draw Chevron\n ctx.fillStyle =\n isSelected || isHovered\n ? theme.dom.accentColor\n : theme.isDark\n ? '#64748B'\n : '#94A3B8';\n ctx.beginPath();\n const arrowX = x + width - 11;\n ctx.moveTo(arrowX - 3.5, centerY - 2);\n ctx.lineTo(arrowX + 3.5, centerY - 2);\n ctx.lineTo(arrowX, centerY + 2.5);\n ctx.closePath();\n ctx.fill();\n\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\n\nexport const LookupEditor: React.FC<CellEditorProps<string>> = ({\n value,\n column,\n rect,\n theme,\n locale,\n initialChar,\n onCommit,\n onCancel,\n}) => {\n const options = column.options || [];\n const [search, setSearch] = useState<string>(initialChar || '');\n const [highlightedIndex, setHighlightedIndex] = useState<number>(0);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const isTR = locale?.code?.startsWith('tr');\n\n const filtered = options.filter((o) => {\n const q = search.toLowerCase();\n return (\n o.label.toLowerCase().includes(q) ||\n o.value.toLowerCase().includes(q) ||\n (o.subtitle && o.subtitle.toLowerCase().includes(q))\n );\n });\n\n useEffect(() => {\n inputRef.current?.focus();\n }, []);\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n onCancel();\n }\n };\n document.addEventListener('mousedown', handleOutside, true);\n return () => document.removeEventListener('mousedown', handleOutside, true);\n }, [onCancel]);\n\n return (\n <div\n ref={containerRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: Math.max(4, rect.x),\n top: rect.y,\n minWidth: Math.max(rect.width, 250),\n zIndex: 128,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n overflow: 'hidden',\n fontFamily: theme.fontFamily,\n userSelect: 'none',\n }}\n >\n <div style={{ padding: 8, borderBottom: `1px solid ${theme.dom.popoverBorder}` }}>\n <input\n ref={inputRef}\n type=\"text\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value);\n setHighlightedIndex(0);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setHighlightedIndex((p) => Math.min(p + 1, Math.max(0, filtered.length - 1)));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setHighlightedIndex((p) => Math.max(p - 1, 0));\n } else if (e.key === 'Enter' && filtered[highlightedIndex]) {\n e.preventDefault();\n onCommit(filtered[highlightedIndex].value, 'down');\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n }\n }}\n placeholder={isTR ? 'Kayıt, isim veya ID ara...' : 'Search entity, name, or ID...'}\n style={{\n width: '100%',\n padding: '6px 9px',\n borderRadius: 6,\n border: `1px solid ${theme.dom.inputBorder}`,\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n fontSize: 12,\n outline: 'none',\n boxSizing: 'border-box',\n }}\n />\n </div>\n\n <div style={{ maxHeight: 220, overflowY: 'auto', padding: 4 }}>\n {filtered.map((opt, idx) => {\n const isSelected = String(opt.value) === String(value);\n const isHigh = idx === highlightedIndex;\n return (\n <div\n key={opt.value}\n onClick={() => onCommit(opt.value, 'none')}\n onMouseEnter={() => setHighlightedIndex(idx)}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '7px 10px',\n borderRadius: 6,\n cursor: 'pointer',\n backgroundColor: isHigh\n ? theme.isDark\n ? 'rgba(255,255,255,0.08)'\n : 'rgba(0,0,0,0.05)'\n : 'transparent',\n }}\n >\n <div>\n <div style={{ fontWeight: 600, fontSize: 12.5 }}>{opt.label}</div>\n {opt.subtitle && (\n <div style={{ fontSize: 11, color: '#8E8E93' }}>{opt.subtitle}</div>\n )}\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <span\n style={{\n fontSize: 10.5,\n fontFamily: 'monospace',\n padding: '2px 6px',\n borderRadius: 4,\n backgroundColor: theme.dom.badgeBg,\n color: theme.dom.badgeText,\n }}\n >\n {opt.value}\n </span>\n {isSelected && <span style={{ color: theme.dom.accentColor, fontWeight: 700 }}>✓</span>}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintLookup } from './LookupPainter';\nimport { LookupEditor } from './LookupEditor';\n\nexport const LookupColumnPlugin: IColumnTypePlugin<string> = {\n type: 'lookup',\n paint: paintLookup,\n editorComponent: LookupEditor,\n\n onPointerDown({ localX, column }) {\n if (localX > column.width - 26) {\n return { handled: true, shouldOpenEditor: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n openEditor();\n return true;\n }\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text, column) {\n const clean = text.trim().toLowerCase();\n const match = column.options?.find(\n (o) => o.value.toLowerCase() === clean || o.label.toLowerCase() === clean\n );\n return match ? match.value : text.trim();\n },\n\n formatClipboard(value, column) {\n const match = column.options?.find((o) => o.value === value);\n return match ? match.label : String(value ?? '');\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR');\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function normalizeObjectValue(value: any): Record<string, any> {\n if (!value) return {};\n if (typeof value === 'object' && !Array.isArray(value)) {\n return value as Record<string, any>;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) return {};\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n try {\n const parsed = JSON.parse(trimmed);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed;\n }\n } catch {\n // Fallback to key:value parser below\n }\n }\n const out: Record<string, any> = {};\n const pairs = trimmed.split(/[,;|]/);\n for (const pair of pairs) {\n const idx = pair.indexOf(':');\n if (idx > 0) {\n const k = pair.slice(0, idx).trim();\n const rawV = pair.slice(idx + 1).trim();\n if (k) {\n if (rawV === 'true') out[k] = true;\n else if (rawV === 'false') out[k] = false;\n else if (rawV !== '' && !isNaN(Number(rawV))) out[k] = Number(rawV);\n else out[k] = rawV;\n }\n }\n }\n if (Object.keys(out).length > 0) return out;\n return { value: trimmed };\n }\n return { value };\n}\n\nexport function formatObjectSummary(value: any, displayKey?: string): string {\n const obj = normalizeObjectValue(value);\n const entries = Object.entries(obj);\n if (entries.length === 0) return '';\n\n if (displayKey && obj[displayKey] !== undefined) {\n const primary = String(obj[displayKey]);\n const rest = entries\n .filter(([k]) => k !== displayKey)\n .map(([k, v]) => `${k}: ${String(v)}`)\n .join(' • ');\n return rest ? `${primary} (${rest})` : primary;\n }\n\n return entries.map(([k, v]) => `${k}: ${String(v)}`).join(' • ');\n}\n\nexport function paintObject({\n ctx,\n value,\n column,\n theme,\n x,\n y,\n width,\n height,\n isHovered,\n isSelected,\n}: CellPaintContext<Record<string, any>>): void {\n const obj = normalizeObjectValue(value);\n const entries = Object.entries(obj);\n\n ctx.save();\n const pad = 8;\n const centerY = y + height / 2;\n\n // 1. Draw {N} Object Badge\n const badgeText = `{${entries.length}}`;\n ctx.font = `700 ${theme.fontSize - 3}px monospace`;\n const badgeW = Math.max(24, ctx.measureText(badgeText).width + 10);\n const badgeH = 18;\n const badgeX = x + pad;\n const badgeY = centerY - badgeH / 2;\n\n ctx.fillStyle = theme.isDark ? 'rgba(56, 189, 248, 0.16)' : 'rgba(2, 132, 199, 0.1)';\n ctx.beginPath();\n ctx.roundRect(badgeX, badgeY, badgeW, badgeH, 4);\n ctx.fill();\n\n ctx.strokeStyle = theme.isDark ? 'rgba(56, 189, 248, 0.35)' : 'rgba(2, 132, 199, 0.25)';\n ctx.lineWidth = 1;\n ctx.stroke();\n\n ctx.fillStyle = theme.isDark ? '#38BDF8' : '#0284C7';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(badgeText, badgeX + badgeW / 2, centerY);\n\n // 2. Draw Key-Value Summary Text clipped\n const textStartX = badgeX + badgeW + 7;\n const maxTextW = width - (textStartX - x) - 24;\n\n if (maxTextW > 16 && entries.length > 0) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(textStartX, y, maxTextW, height);\n ctx.clip();\n\n const summary = formatObjectSummary(obj, column.objectDisplayKey);\n ctx.font = `500 ${theme.fontSize - 1}px ${theme.fontFamily}`;\n ctx.fillStyle = theme.canvas.cellText;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(summary, textStartX, centerY);\n ctx.restore();\n }\n\n // 3. Draw Inspector Icon on right\n ctx.fillStyle =\n isSelected || isHovered\n ? theme.dom.accentColor\n : theme.isDark\n ? '#64748B'\n : '#94A3B8';\n ctx.font = `700 11px ${theme.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText('⤢', x + width - 12, centerY);\n\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\nimport { normalizeObjectValue } from './ObjectPainter';\n\ninterface KeyValuePair {\n key: string;\n value: string;\n}\n\nfunction parseScalarValue(raw: string): any {\n const trimmed = raw.trim();\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n if (trimmed === 'null') return null;\n if (trimmed !== '' && !isNaN(Number(trimmed))) return Number(trimmed);\n return raw;\n}\n\nexport const ObjectEditor: React.FC<CellEditorProps<Record<string, any>>> = ({\n value,\n column,\n rect,\n theme,\n locale,\n onCommit,\n onCancel,\n}) => {\n const initialObj = normalizeObjectValue(value);\n const [mode, setMode] = useState<'kv' | 'json'>('kv');\n const [pairs, setPairs] = useState<KeyValuePair[]>(() => {\n const entries = Object.entries(initialObj);\n return entries.length > 0\n ? entries.map(([k, v]) => ({\n key: k,\n value: typeof v === 'object' ? JSON.stringify(v) : String(v ?? ''),\n }))\n : [{ key: 'key', value: '' }];\n });\n const [jsonText, setJsonText] = useState<string>(() => JSON.stringify(initialObj, null, 2));\n const [jsonError, setJsonError] = useState<string | null>(null);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const isTR = locale?.code?.startsWith('tr');\n\n const buildObjectFromPairs = (list: KeyValuePair[]): Record<string, any> => {\n const out: Record<string, any> = {};\n for (const item of list) {\n const k = item.key.trim();\n if (!k) continue;\n out[k] = parseScalarValue(item.value);\n }\n return out;\n };\n\n const handleSave = (moveDir: 'down' | 'right' | 'left' | 'none' = 'none') => {\n if (mode === 'json') {\n try {\n const parsed = JSON.parse(jsonText || '{}');\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n setJsonError(isTR ? 'Geçerli bir JSON nesnesi ({...}) girin' : 'Must be a valid JSON object ({...})');\n return;\n }\n onCommit(parsed, moveDir);\n } catch (err: any) {\n setJsonError(err?.message || 'Invalid JSON');\n }\n } else {\n onCommit(buildObjectFromPairs(pairs), moveDir);\n }\n };\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n handleSave('none');\n }\n };\n document.addEventListener('mousedown', handleOutside, true);\n return () => document.removeEventListener('mousedown', handleOutside, true);\n });\n\n const switchMode = (nextMode: 'kv' | 'json') => {\n if (nextMode === mode) return;\n if (nextMode === 'json') {\n const obj = buildObjectFromPairs(pairs);\n setJsonText(JSON.stringify(obj, null, 2));\n setJsonError(null);\n setMode('json');\n } else {\n try {\n const parsed = JSON.parse(jsonText || '{}');\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n setPairs(\n Object.entries(parsed).map(([k, v]) => ({\n key: k,\n value: typeof v === 'object' ? JSON.stringify(v) : String(v ?? ''),\n }))\n );\n setJsonError(null);\n setMode('kv');\n }\n } catch {\n setJsonError(isTR ? 'JSON hatası düzeltilmeden geçiş yapılamaz' : 'Fix JSON syntax error first');\n }\n }\n };\n\n return (\n <div\n ref={containerRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n } else if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) {\n e.preventDefault();\n handleSave('down');\n }\n }}\n style={{\n position: 'absolute',\n left: Math.max(4, rect.x),\n top: rect.y,\n width: Math.max(rect.width, 320),\n zIndex: 130,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n overflow: 'hidden',\n fontFamily: theme.fontFamily,\n userSelect: 'none',\n }}\n >\n {/* Header & Mode Switcher */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '8px 10px',\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: theme.isDark ? 'rgba(255,255,255,0.03)' : 'rgba(0,0,0,0.02)',\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, fontSize: 12, fontWeight: 700 }}>\n <span style={{ color: theme.dom.accentColor, fontFamily: 'monospace' }}>{'{ }'}</span>\n <span>{column.title}</span>\n </div>\n <div style={{ display: 'flex', gap: 4 }}>\n <button\n type=\"button\"\n onClick={() => switchMode('kv')}\n style={{\n padding: '3px 8px',\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 5,\n border: 'none',\n cursor: 'pointer',\n backgroundColor: mode === 'kv' ? theme.dom.accentColor : 'transparent',\n color: mode === 'kv' ? '#FFFFFF' : theme.dom.popoverText,\n }}\n >\n Key-Value\n </button>\n <button\n type=\"button\"\n onClick={() => switchMode('json')}\n style={{\n padding: '3px 8px',\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 5,\n border: 'none',\n cursor: 'pointer',\n backgroundColor: mode === 'json' ? theme.dom.accentColor : 'transparent',\n color: mode === 'json' ? '#FFFFFF' : theme.dom.popoverText,\n }}\n >\n JSON\n </button>\n </div>\n </div>\n\n {/* Body */}\n <div style={{ padding: 10, maxHeight: 230, overflowY: 'auto' }}>\n {mode === 'kv' ? (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {pairs.map((p, idx) => (\n <div key={idx} style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n <input\n type=\"text\"\n value={p.key}\n placeholder=\"key\"\n onChange={(e) => {\n const next = [...pairs];\n next[idx] = { ...next[idx], key: e.target.value };\n setPairs(next);\n }}\n style={{\n width: 100,\n padding: '5px 7px',\n borderRadius: 5,\n border: `1px solid ${theme.dom.inputBorder}`,\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.accentColor,\n fontSize: 12,\n fontFamily: 'monospace',\n fontWeight: 600,\n outline: 'none',\n }}\n />\n <span style={{ color: '#8E8E93', fontWeight: 700 }}>:</span>\n <input\n type=\"text\"\n value={p.value}\n placeholder=\"value\"\n onChange={(e) => {\n const next = [...pairs];\n next[idx] = { ...next[idx], value: e.target.value };\n setPairs(next);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleSave('down');\n }\n }}\n style={{\n flex: 1,\n padding: '5px 7px',\n borderRadius: 5,\n border: `1px solid ${theme.dom.inputBorder}`,\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n fontSize: 12,\n outline: 'none',\n }}\n />\n <button\n type=\"button\"\n onClick={() => setPairs((prev) => prev.filter((_, i) => i !== idx))}\n style={{\n border: 'none',\n background: 'transparent',\n color: '#EF4444',\n cursor: 'pointer',\n fontSize: 12,\n padding: '2px 4px',\n }}\n title={isTR ? 'Alanı Sil' : 'Remove Field'}\n >\n ✕\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={() => setPairs((prev) => [...prev, { key: '', value: '' }])}\n style={{\n alignSelf: 'flex-start',\n marginTop: 4,\n padding: '4px 9px',\n borderRadius: 5,\n border: `1px dashed ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.accentColor,\n fontSize: 11.5,\n fontWeight: 600,\n cursor: 'pointer',\n }}\n >\n + {isTR ? 'Alan Ekle (Key-Value)' : 'Add Property'}\n </button>\n </div>\n ) : (\n <div>\n <textarea\n value={jsonText}\n onChange={(e) => {\n setJsonText(e.target.value);\n setJsonError(null);\n }}\n rows={6}\n style={{\n width: '100%',\n padding: 8,\n borderRadius: 6,\n border: `1px solid ${jsonError ? '#EF4444' : theme.dom.inputBorder}`,\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n fontFamily: 'monospace',\n fontSize: 12,\n outline: 'none',\n boxSizing: 'border-box',\n resize: 'vertical',\n }}\n />\n {jsonError && (\n <div style={{ color: '#EF4444', fontSize: 11, marginTop: 4, fontWeight: 600 }}>\n ⚠ {jsonError}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '6px 10px',\n borderTop: `1px solid ${theme.dom.popoverBorder}`,\n }}\n >\n <span style={{ fontSize: 10.5, color: '#8E8E93' }}>\n {isTR ? 'Ctrl+Enter ile kaydet' : 'Ctrl+Enter to save'}\n </span>\n <div style={{ display: 'flex', gap: 6 }}>\n <button\n type=\"button\"\n onClick={onCancel}\n style={{\n padding: '4px 10px',\n fontSize: 11,\n borderRadius: 5,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {isTR ? 'İptal' : 'Cancel'}\n </button>\n <button\n type=\"button\"\n onClick={() => handleSave('none')}\n style={{\n padding: '4px 12px',\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 5,\n border: 'none',\n backgroundColor: theme.dom.accentColor,\n color: '#FFFFFF',\n cursor: 'pointer',\n }}\n >\n {isTR ? 'Uygula' : 'Apply'}\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintObject, normalizeObjectValue, formatObjectSummary } from './ObjectPainter';\nimport { ObjectEditor } from './ObjectEditor';\n\nexport const ObjectColumnPlugin: IColumnTypePlugin<Record<string, any>> = {\n type: 'object',\n paint: paintObject,\n editorComponent: ObjectEditor,\n\n onPointerDown({ localX, column }) {\n if (localX > column.width - 26) {\n return { handled: true, shouldOpenEditor: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n openEditor();\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n return normalizeObjectValue(text);\n },\n\n formatClipboard(value) {\n const obj = normalizeObjectValue(value);\n return JSON.stringify(obj);\n },\n\n comparator(a, b) {\n const strA = formatObjectSummary(a);\n const strB = formatObjectSummary(b);\n return strA.localeCompare(strB, 'tr-TR');\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintDate({\n ctx,\n value,\n theme,\n x,\n y,\n width,\n height,\n isHovered,\n isSelected,\n}: CellPaintContext<string | Date>): void {\n ctx.save();\n\n if (value) {\n let dateStr = '';\n try {\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(value)) {\n const [yr, mon, day] = value.slice(0, 10).split('-');\n dateStr = `${day}.${mon}.${yr}`;\n } else {\n const d = typeof value === 'string' ? new Date(value) : value;\n if (!isNaN(d.getTime())) {\n const day = String(d.getDate()).padStart(2, '0');\n const mon = String(d.getMonth() + 1).padStart(2, '0');\n const yr = d.getFullYear();\n dateStr = `${day}.${mon}.${yr}`;\n } else {\n dateStr = String(value);\n }\n }\n } catch {\n dateStr = String(value);\n }\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 8, y, Math.max(0, width - 30), height);\n ctx.clip();\n\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `normal ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(dateStr, x + 8, y + height / 2);\n ctx.restore();\n }\n\n // Subtle Calendar Icon on right side of cell\n if (width > 60) {\n const iconX = x + width - 19;\n const iconY = y + height / 2 - 6;\n ctx.strokeStyle = isSelected || isHovered\n ? theme.dom.accentColor\n : theme.isDark\n ? 'rgba(255,255,255,0.35)'\n : 'rgba(0,0,0,0.35)';\n ctx.lineWidth = 1.2;\n ctx.strokeRect(iconX, iconY + 1, 11, 10);\n ctx.beginPath();\n ctx.moveTo(iconX, iconY + 4);\n ctx.lineTo(iconX + 11, iconY + 4);\n ctx.moveTo(iconX + 3, iconY - 1);\n ctx.lineTo(iconX + 3, iconY + 2);\n ctx.moveTo(iconX + 8, iconY - 1);\n ctx.lineTo(iconX + 8, iconY + 2);\n ctx.stroke();\n }\n\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\n\nfunction parseIsoParts(raw: any): { year: number; month: number; day: number; formatted: string } {\n const now = new Date();\n if (!raw) {\n const y = now.getFullYear();\n const m = now.getMonth() + 1;\n const d = now.getDate();\n return {\n year: y,\n month: m,\n day: d,\n formatted: `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`,\n };\n }\n const str = String(raw).trim();\n const isoMatch = str.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})/);\n if (isoMatch) {\n const y = parseInt(isoMatch[1], 10);\n const m = parseInt(isoMatch[2], 10);\n const d = parseInt(isoMatch[3], 10);\n return {\n year: y,\n month: m,\n day: d,\n formatted: `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`,\n };\n }\n const dmyMatch = str.match(/^(\\d{1,2})[./-](\\d{1,2})[./-](\\d{4})/);\n if (dmyMatch) {\n const d = parseInt(dmyMatch[1], 10);\n const m = parseInt(dmyMatch[2], 10);\n const y = parseInt(dmyMatch[3], 10);\n return {\n year: y,\n month: m,\n day: d,\n formatted: `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`,\n };\n }\n const parsed = new Date(str);\n if (!isNaN(parsed.getTime())) {\n const y = parsed.getFullYear();\n const m = parsed.getMonth() + 1;\n const d = parsed.getDate();\n return {\n year: y,\n month: m,\n day: d,\n formatted: `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`,\n };\n }\n return {\n year: now.getFullYear(),\n month: now.getMonth() + 1,\n day: now.getDate(),\n formatted: str,\n };\n}\n\nexport const DateEditor: React.FC<CellEditorProps<string>> = ({\n value,\n rect,\n theme,\n locale,\n onCommit,\n onCancel,\n}) => {\n const initial = parseIsoParts(value);\n const [dateVal, setDateVal] = useState<string>(value ? initial.formatted : '');\n const [viewYear, setViewYear] = useState<number>(initial.year);\n const [viewMonth, setViewMonth] = useState<number>(initial.month); // 1..12\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const latestValRef = useRef<string>(dateVal);\n latestValRef.current = dateVal;\n\n useEffect(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, []);\n\n // Close & commit when clicking outside the DateEditor container\n useEffect(() => {\n const handleOutsideMouseDown = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n onCommit(latestValRef.current, 'none');\n }\n };\n document.addEventListener('mousedown', handleOutsideMouseDown, true);\n return () => {\n document.removeEventListener('mousedown', handleOutsideMouseDown, true);\n };\n }, [onCommit]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n onCommit(dateVal, e.shiftKey ? 'none' : 'down');\n } else if (e.key === 'Tab') {\n e.preventDefault();\n onCommit(dateVal, e.shiftKey ? 'left' : 'right');\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n }\n };\n\n const handlePrevMonth = () => {\n if (viewMonth === 1) {\n setViewMonth(12);\n setViewYear((y) => y - 1);\n } else {\n setViewMonth((m) => m - 1);\n }\n };\n\n const handleNextMonth = () => {\n if (viewMonth === 12) {\n setViewMonth(1);\n setViewYear((y) => y + 1);\n } else {\n setViewMonth((m) => m + 1);\n }\n };\n\n const selectDay = (day: number) => {\n const nextIso = `${viewYear}-${String(viewMonth).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n setDateVal(nextIso);\n onCommit(nextIso, 'none');\n };\n\n const selectToday = () => {\n const now = new Date();\n const nextIso = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')}`;\n setDateVal(nextIso);\n onCommit(nextIso, 'none');\n };\n\n // Build days in current month view\n const daysInMonth = new Date(viewYear, viewMonth, 0).getDate();\n const firstDayOfWeek = (new Date(viewYear, viewMonth - 1, 1).getDay() + 6) % 7; // Monday = 0\n const cells: Array<number | null> = [];\n for (let i = 0; i < firstDayOfWeek; i++) cells.push(null);\n for (let d = 1; d <= daysInMonth; d++) cells.push(d);\n\n const isTR = locale?.code?.startsWith('tr');\n const monthNames = isTR\n ? ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık']\n : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n const weekDays = isTR\n ? ['Pt', 'Sa', 'Ça', 'Pe', 'Cu', 'Ct', 'Pz']\n : ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];\n\n const selectedParts = dateVal ? parseIsoParts(dateVal) : null;\n\n return (\n <div\n ref={containerRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: Math.max(4, rect.x),\n top: rect.y,\n zIndex: 120,\n fontFamily: theme.fontFamily,\n }}\n >\n {/* Inline Cell Input */}\n <div\n style={{\n width: Math.max(rect.width, 145),\n height: rect.height,\n backgroundColor: theme.dom.inputBg,\n border: `2px solid ${theme.dom.inputFocusBorder}`,\n borderRadius: 4,\n display: 'flex',\n alignItems: 'center',\n boxSizing: 'border-box',\n boxShadow: theme.dom.popoverShadow,\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={dateVal}\n placeholder=\"YYYY-MM-DD\"\n onChange={(e) => {\n const val = e.target.value;\n setDateVal(val);\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(val)) {\n const p = parseIsoParts(val);\n setViewYear(p.year);\n setViewMonth(p.month);\n }\n }}\n onKeyDown={handleKeyDown}\n style={{\n width: '100%',\n height: '100%',\n padding: '0 8px',\n boxSizing: 'border-box',\n backgroundColor: 'transparent',\n color: theme.dom.inputText,\n border: 'none',\n outline: 'none',\n fontFamily: theme.fontFamily,\n fontSize: `${theme.fontSize}px`,\n }}\n />\n </div>\n\n {/* Interactive Calendar Dropdown */}\n <div\n style={{\n marginTop: 4,\n width: 236,\n padding: 10,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n userSelect: 'none',\n }}\n >\n {/* Header: Month / Year Navigation */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 8,\n }}\n >\n <button\n type=\"button\"\n onClick={handlePrevMonth}\n style={{\n width: 26,\n height: 26,\n borderRadius: 6,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n fontWeight: 700,\n }}\n >\n ‹\n </button>\n <div style={{ fontWeight: 600, fontSize: 12 }}>\n {monthNames[viewMonth - 1]} {viewYear}\n </div>\n <button\n type=\"button\"\n onClick={handleNextMonth}\n style={{\n width: 26,\n height: 26,\n borderRadius: 6,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n fontWeight: 700,\n }}\n >\n ›\n </button>\n </div>\n\n {/* Weekday Headers */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: 2,\n marginBottom: 4,\n textAlign: 'center',\n fontSize: 10,\n fontWeight: 600,\n color: '#8E8E93',\n }}\n >\n {weekDays.map((wd) => (\n <div key={wd} style={{ padding: '2px 0' }}>\n {wd}\n </div>\n ))}\n </div>\n\n {/* Days Grid */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: 2,\n }}\n >\n {cells.map((day, idx) => {\n if (day === null) {\n return <div key={`empty_${idx}`} style={{ height: 26 }} />;\n }\n const isSelectedDay =\n selectedParts &&\n selectedParts.year === viewYear &&\n selectedParts.month === viewMonth &&\n selectedParts.day === day;\n\n return (\n <button\n key={day}\n type=\"button\"\n onClick={() => selectDay(day)}\n style={{\n height: 26,\n borderRadius: 6,\n border: 'none',\n backgroundColor: isSelectedDay\n ? theme.dom.accentColor\n : 'transparent',\n color: isSelectedDay ? '#FFFFFF' : theme.dom.popoverText,\n fontWeight: isSelectedDay ? 700 : 500,\n fontSize: 11,\n cursor: 'pointer',\n transition: 'background 0.12s',\n }}\n >\n {day}\n </button>\n );\n })}\n </div>\n\n {/* Footer Actions: Clear & Today */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n marginTop: 8,\n paddingTop: 8,\n borderTop: `1px solid ${theme.dom.popoverBorder}`,\n }}\n >\n <button\n type=\"button\"\n onClick={() => onCommit('', 'none')}\n style={{\n padding: '4px 8px',\n fontSize: 11,\n borderRadius: 4,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {locale?.clear || 'Clear'}\n </button>\n <button\n type=\"button\"\n onClick={selectToday}\n style={{\n padding: '4px 10px',\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 4,\n border: 'none',\n backgroundColor: theme.dom.accentColor,\n color: '#FFFFFF',\n cursor: 'pointer',\n }}\n >\n {isTR ? 'Bugün' : 'Today'}\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintDate } from './DatePainter';\nimport { DateEditor } from './DateEditor';\n\nexport const DateColumnPlugin: IColumnTypePlugin<string> = {\n type: 'date',\n paint: paintDate,\n editorComponent: DateEditor,\n\n onPointerDown({ localX, column }) {\n if (localX > column.width - 28) {\n return { handled: true, shouldOpenEditor: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n openEditor();\n return true;\n }\n if (/^[0-9]$/.test(event.key) && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n const raw = text.trim();\n // Convert DD.MM.YYYY to YYYY-MM-DD if pasted in European format\n const dmy = raw.match(/^(\\d{1,2})[./-](\\d{1,2})[./-](\\d{4})$/);\n if (dmy) {\n return `${dmy[3]}-${dmy[2].padStart(2, '0')}-${dmy[1].padStart(2, '0')}`;\n }\n return raw;\n },\n\n formatClipboard(value) {\n return value != null ? String(value) : '';\n },\n\n comparator(a, b) {\n const timeA = a ? new Date(a).getTime() : 0;\n const timeB = b ? new Date(b).getTime() : 0;\n return timeA - timeB;\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function formatDateTimeDisplay(value: string | Date): { datePart: string; timePart: string } {\n if (!value) return { datePart: '', timePart: '' };\n try {\n const raw = typeof value === 'string' ? value.trim() : value.toISOString();\n const match = raw.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})(?:[T\\s]+(\\d{1,2}):(\\d{1,2}))?/);\n if (match) {\n const yr = match[1];\n const mon = match[2].padStart(2, '0');\n const day = match[3].padStart(2, '0');\n const hh = (match[4] || '09').padStart(2, '0');\n const mm = (match[5] || '00').padStart(2, '0');\n return { datePart: `${day}.${mon}.${yr}`, timePart: `${hh}:${mm}` };\n }\n const d = typeof value === 'string' ? new Date(value) : value;\n if (!isNaN(d.getTime())) {\n const day = String(d.getDate()).padStart(2, '0');\n const mon = String(d.getMonth() + 1).padStart(2, '0');\n const yr = d.getFullYear();\n const hh = String(d.getHours()).padStart(2, '0');\n const mm = String(d.getMinutes()).padStart(2, '0');\n return { datePart: `${day}.${mon}.${yr}`, timePart: `${hh}:${mm}` };\n }\n } catch {\n // fallback\n }\n return { datePart: String(value), timePart: '' };\n}\n\nexport function paintDateTime({\n ctx,\n value,\n theme,\n x,\n y,\n width,\n height,\n isHovered,\n isSelected,\n}: CellPaintContext<string | Date>): void {\n ctx.save();\n\n if (value) {\n const { datePart, timePart } = formatDateTimeDisplay(value);\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 8, y, Math.max(0, width - 30), height);\n ctx.clip();\n\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `normal ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(datePart, x + 8, y + height / 2);\n\n if (timePart) {\n const dateW = ctx.measureText(datePart).width;\n const pillX = x + 14 + dateW;\n const pillH = 18;\n const pillY = y + (height - pillH) / 2;\n\n ctx.font = `600 ${theme.fontSize - 2}px monospace`;\n const timeW = ctx.measureText(timePart).width + 10;\n\n ctx.fillStyle = theme.isDark ? 'rgba(56, 189, 248, 0.14)' : 'rgba(2, 132, 199, 0.09)';\n ctx.beginPath();\n ctx.roundRect(pillX, pillY, timeW, pillH, 4);\n ctx.fill();\n\n ctx.fillStyle = theme.isDark ? '#38BDF8' : '#0284C7';\n ctx.fillText(timePart, pillX + 5, y + height / 2);\n }\n\n ctx.restore();\n }\n\n // Calendar + Clock Icon on right side of cell\n if (width > 70) {\n const iconX = x + width - 19;\n const iconY = y + height / 2 - 6;\n ctx.strokeStyle =\n isSelected || isHovered\n ? theme.dom.accentColor\n : theme.isDark\n ? 'rgba(255,255,255,0.35)'\n : 'rgba(0,0,0,0.35)';\n ctx.lineWidth = 1.2;\n ctx.strokeRect(iconX, iconY + 1, 11, 10);\n ctx.beginPath();\n ctx.moveTo(iconX, iconY + 4);\n ctx.lineTo(iconX + 11, iconY + 4);\n ctx.moveTo(iconX + 3, iconY - 1);\n ctx.lineTo(iconX + 3, iconY + 2);\n ctx.moveTo(iconX + 8, iconY - 1);\n ctx.lineTo(iconX + 8, iconY + 2);\n ctx.stroke();\n }\n\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\n\ninterface ParsedDateTime {\n year: number;\n month: number;\n day: number;\n hour: number;\n minute: number;\n formatted: string;\n}\n\nfunction parseDateTimeParts(raw: any): ParsedDateTime {\n const now = new Date();\n if (!raw) {\n const y = now.getFullYear();\n const m = now.getMonth() + 1;\n const d = now.getDate();\n const hh = now.getHours();\n const mm = now.getMinutes();\n return {\n year: y,\n month: m,\n day: d,\n hour: hh,\n minute: mm,\n formatted: `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')} ${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}`,\n };\n }\n const str = String(raw).trim();\n const isoMatch = str.match(\n /^(\\d{4})-(\\d{1,2})-(\\d{1,2})(?:[T\\s]+(\\d{1,2}):(\\d{1,2}))?/\n );\n if (isoMatch) {\n const y = parseInt(isoMatch[1], 10);\n const m = parseInt(isoMatch[2], 10);\n const d = parseInt(isoMatch[3], 10);\n const hh = isoMatch[4] !== undefined ? parseInt(isoMatch[4], 10) : 9;\n const mm = isoMatch[5] !== undefined ? parseInt(isoMatch[5], 10) : 0;\n return {\n year: y,\n month: m,\n day: d,\n hour: hh,\n minute: mm,\n formatted: `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')} ${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}`,\n };\n }\n return {\n year: now.getFullYear(),\n month: now.getMonth() + 1,\n day: now.getDate(),\n hour: 9,\n minute: 0,\n formatted: str,\n };\n}\n\nexport const DateTimeEditor: React.FC<CellEditorProps<string>> = ({\n value,\n rect,\n theme,\n locale,\n onCommit,\n onCancel,\n}) => {\n const initial = parseDateTimeParts(value);\n const [textVal, setTextVal] = useState<string>(value ? initial.formatted : initial.formatted);\n const [viewYear, setViewYear] = useState<number>(initial.year);\n const [viewMonth, setViewMonth] = useState<number>(initial.month);\n const [selDay, setSelDay] = useState<number>(initial.day);\n const [selHour, setSelHour] = useState<number>(initial.hour);\n const [selMinute, setSelMinute] = useState<number>(initial.minute);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const latestValRef = useRef<string>(textVal);\n latestValRef.current = textVal;\n\n useEffect(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, []);\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n onCommit(latestValRef.current, 'none');\n }\n };\n document.addEventListener('mousedown', handleOutside, true);\n return () => document.removeEventListener('mousedown', handleOutside, true);\n }, [onCommit]);\n\n const buildFormatted = (y: number, m: number, d: number, hh: number, mm: number) =>\n `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')} ${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}`;\n\n const updateParts = (y: number, m: number, d: number, hh: number, mm: number) => {\n setViewYear(y);\n setViewMonth(m);\n setSelDay(d);\n setSelHour(hh);\n setSelMinute(mm);\n setTextVal(buildFormatted(y, m, d, hh, mm));\n };\n\n const handlePrevMonth = () => {\n if (viewMonth === 1) {\n updateParts(viewYear - 1, 12, selDay, selHour, selMinute);\n } else {\n updateParts(viewYear, viewMonth - 1, selDay, selHour, selMinute);\n }\n };\n\n const handleNextMonth = () => {\n if (viewMonth === 12) {\n updateParts(viewYear + 1, 1, selDay, selHour, selMinute);\n } else {\n updateParts(viewYear, viewMonth + 1, selDay, selHour, selMinute);\n }\n };\n\n const handleSelectNow = () => {\n const now = new Date();\n const nextStr = buildFormatted(\n now.getFullYear(),\n now.getMonth() + 1,\n now.getDate(),\n now.getHours(),\n now.getMinutes()\n );\n onCommit(nextStr, 'none');\n };\n\n const daysInMonth = new Date(viewYear, viewMonth, 0).getDate();\n const firstDayOfWeek = (new Date(viewYear, viewMonth - 1, 1).getDay() + 6) % 7;\n const cells: Array<number | null> = [];\n for (let i = 0; i < firstDayOfWeek; i++) cells.push(null);\n for (let d = 1; d <= daysInMonth; d++) cells.push(d);\n\n const isTR = locale?.code?.startsWith('tr');\n const monthNames = isTR\n ? ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık']\n : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\n const weekDays = isTR\n ? ['Pt', 'Sa', 'Ça', 'Pe', 'Cu', 'Ct', 'Pz']\n : ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];\n\n const hours = Array.from({ length: 24 }, (_, i) => i);\n const minutes = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];\n\n return (\n <div\n ref={containerRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: Math.max(4, rect.x),\n top: rect.y,\n zIndex: 125,\n fontFamily: theme.fontFamily,\n }}\n >\n {/* Inline Input */}\n <div\n style={{\n width: Math.max(rect.width, 175),\n height: rect.height,\n backgroundColor: theme.dom.inputBg,\n border: `2px solid ${theme.dom.inputFocusBorder}`,\n borderRadius: 4,\n display: 'flex',\n alignItems: 'center',\n boxSizing: 'border-box',\n boxShadow: theme.dom.popoverShadow,\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={textVal}\n placeholder=\"YYYY-MM-DD HH:mm\"\n onChange={(e) => setTextVal(e.target.value)}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n onCommit(textVal, 'down');\n } else if (e.key === 'Tab') {\n e.preventDefault();\n onCommit(textVal, e.shiftKey ? 'left' : 'right');\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n }\n }}\n style={{\n width: '100%',\n height: '100%',\n padding: '0 8px',\n boxSizing: 'border-box',\n backgroundColor: 'transparent',\n color: theme.dom.inputText,\n border: 'none',\n outline: 'none',\n fontFamily: theme.fontFamily,\n fontSize: `${theme.fontSize}px`,\n }}\n />\n </div>\n\n {/* Calendar + Time Popover */}\n <div\n style={{\n marginTop: 4,\n width: 330,\n padding: 10,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n userSelect: 'none',\n }}\n >\n <div style={{ display: 'flex', gap: 10 }}>\n {/* Left: Calendar */}\n <div style={{ flex: 1 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: 6,\n }}\n >\n <button\n type=\"button\"\n onClick={handlePrevMonth}\n style={{\n width: 24,\n height: 24,\n borderRadius: 5,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n fontWeight: 700,\n }}\n >\n ‹\n </button>\n <div style={{ fontWeight: 600, fontSize: 12 }}>\n {monthNames[viewMonth - 1]} {viewYear}\n </div>\n <button\n type=\"button\"\n onClick={handleNextMonth}\n style={{\n width: 24,\n height: 24,\n borderRadius: 5,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n fontWeight: 700,\n }}\n >\n ›\n </button>\n </div>\n\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(7, 1fr)',\n gap: 2,\n marginBottom: 4,\n textAlign: 'center',\n fontSize: 10,\n fontWeight: 600,\n color: '#8E8E93',\n }}\n >\n {weekDays.map((wd) => (\n <div key={wd}>{wd}</div>\n ))}\n </div>\n\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(7, 1fr)', gap: 2 }}>\n {cells.map((day, idx) => {\n if (day === null) return <div key={`e_${idx}`} style={{ height: 24 }} />;\n const isSelectedDay = day === selDay;\n return (\n <button\n key={day}\n type=\"button\"\n onClick={() => updateParts(viewYear, viewMonth, day, selHour, selMinute)}\n onDoubleClick={() => {\n const nextStr = buildFormatted(viewYear, viewMonth, day, selHour, selMinute);\n onCommit(nextStr, 'none');\n }}\n style={{\n height: 24,\n borderRadius: 5,\n border: 'none',\n backgroundColor: isSelectedDay ? theme.dom.accentColor : 'transparent',\n color: isSelectedDay ? '#FFFFFF' : theme.dom.popoverText,\n fontWeight: isSelectedDay ? 700 : 500,\n fontSize: 11,\n cursor: 'pointer',\n }}\n >\n {day}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Right: Hour & Minute Columns */}\n <div\n style={{\n width: 98,\n borderLeft: `1px solid ${theme.dom.popoverBorder}`,\n paddingLeft: 8,\n display: 'flex',\n flexDirection: 'column',\n }}\n >\n <div\n style={{\n fontSize: 10,\n fontWeight: 700,\n color: '#8E8E93',\n textAlign: 'center',\n marginBottom: 4,\n }}\n >\n {isTR ? 'SAAT : DK' : 'HR : MIN'}\n </div>\n <div style={{ display: 'flex', gap: 4, height: 170 }}>\n {/* Hours */}\n <div style={{ flex: 1, overflowY: 'auto', display: 'flex', flexDirection: 'column', gap: 2 }}>\n {hours.map((h) => {\n const active = h === selHour;\n return (\n <button\n key={h}\n type=\"button\"\n onClick={() => updateParts(viewYear, viewMonth, selDay, h, selMinute)}\n style={{\n padding: '3px 0',\n fontSize: 11,\n fontFamily: 'monospace',\n fontWeight: active ? 700 : 500,\n borderRadius: 4,\n border: 'none',\n backgroundColor: active ? theme.dom.accentColor : 'transparent',\n color: active ? '#FFFFFF' : theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {String(h).padStart(2, '0')}\n </button>\n );\n })}\n </div>\n {/* Minutes */}\n <div style={{ flex: 1, overflowY: 'auto', display: 'flex', flexDirection: 'column', gap: 2 }}>\n {minutes.map((m) => {\n const active = m === selMinute;\n return (\n <button\n key={m}\n type=\"button\"\n onClick={() => updateParts(viewYear, viewMonth, selDay, selHour, m)}\n style={{\n padding: '3px 0',\n fontSize: 11,\n fontFamily: 'monospace',\n fontWeight: active ? 700 : 500,\n borderRadius: 4,\n border: 'none',\n backgroundColor: active ? theme.dom.accentColor : 'transparent',\n color: active ? '#FFFFFF' : theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {String(m).padStart(2, '0')}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n\n {/* Footer Actions */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginTop: 8,\n paddingTop: 8,\n borderTop: `1px solid ${theme.dom.popoverBorder}`,\n }}\n >\n <div style={{ display: 'flex', gap: 6 }}>\n <button\n type=\"button\"\n onClick={() => onCommit('', 'none')}\n style={{\n padding: '4px 8px',\n fontSize: 11,\n borderRadius: 4,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {locale?.clear || (isTR ? 'Temizle' : 'Clear')}\n </button>\n <button\n type=\"button\"\n onClick={handleSelectNow}\n style={{\n padding: '4px 8px',\n fontSize: 11,\n borderRadius: 4,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.accentColor,\n fontWeight: 600,\n cursor: 'pointer',\n }}\n >\n {isTR ? 'Şimdi' : 'Now'}\n </button>\n </div>\n\n <button\n type=\"button\"\n onClick={() => onCommit(textVal, 'none')}\n style={{\n padding: '4px 12px',\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 4,\n border: 'none',\n backgroundColor: theme.dom.accentColor,\n color: '#FFFFFF',\n cursor: 'pointer',\n }}\n >\n {locale?.apply || (isTR ? 'Uygula' : 'Apply')}\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintDateTime } from './DateTimePainter';\nimport { DateTimeEditor } from './DateTimeEditor';\n\nexport const DateTimeColumnPlugin: IColumnTypePlugin<string> = {\n type: 'datetime',\n paint: paintDateTime,\n editorComponent: DateTimeEditor,\n\n onPointerDown({ localX, column }) {\n if (localX > column.width - 28) {\n return { handled: true, shouldOpenEditor: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n openEditor();\n return true;\n }\n if (/^[0-9]$/.test(event.key) && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n const raw = text.trim();\n const dmy = raw.match(\n /^(\\d{1,2})[./-](\\d{1,2})[./-](\\d{4})(?:\\s+(\\d{1,2}):(\\d{1,2}))?/\n );\n if (dmy) {\n const hh = (dmy[4] || '09').padStart(2, '0');\n const mm = (dmy[5] || '00').padStart(2, '0');\n return `${dmy[3]}-${dmy[2].padStart(2, '0')}-${dmy[1].padStart(2, '0')} ${hh}:${mm}`;\n }\n return raw;\n },\n\n formatClipboard(value) {\n return value != null ? String(value) : '';\n },\n\n comparator(a, b) {\n const strA = String(a ?? '');\n const strB = String(b ?? '');\n return strA.localeCompare(strB);\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintTime({\n ctx,\n value,\n theme,\n x,\n y,\n width,\n height,\n isHovered,\n isSelected,\n}: CellPaintContext<string>): void {\n ctx.save();\n\n if (value) {\n const str = String(value).trim();\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 8, y, Math.max(0, width - 30), height);\n ctx.clip();\n\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `600 ${theme.fontSize}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(str, x + 8, y + height / 2);\n ctx.restore();\n }\n\n // Subtle Clock Icon on right side of cell\n if (width > 55) {\n const cx = x + width - 14;\n const cy = y + height / 2;\n const r = 5.5;\n\n ctx.strokeStyle =\n isSelected || isHovered\n ? theme.dom.accentColor\n : theme.isDark\n ? 'rgba(255,255,255,0.38)'\n : 'rgba(0,0,0,0.38)';\n ctx.lineWidth = 1.25;\n ctx.beginPath();\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n ctx.stroke();\n\n // Clock hands\n ctx.beginPath();\n ctx.moveTo(cx, cy);\n ctx.lineTo(cx, cy - 3.2);\n ctx.moveTo(cx, cy);\n ctx.lineTo(cx + 2.6, cy + 1.2);\n ctx.stroke();\n }\n\n ctx.restore();\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\n\nfunction parseTimeParts(raw: any): { hour: number; minute: number; formatted: string } {\n if (!raw) {\n return { hour: 9, minute: 0, formatted: '09:00' };\n }\n const str = String(raw).trim();\n const m = str.match(/^(\\d{1,2}):(\\d{1,2})/);\n if (m) {\n const hh = Math.min(23, Math.max(0, parseInt(m[1], 10)));\n const mm = Math.min(59, Math.max(0, parseInt(m[2], 10)));\n return {\n hour: hh,\n minute: mm,\n formatted: `${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}`,\n };\n }\n return { hour: 9, minute: 0, formatted: str };\n}\n\nexport const TimeEditor: React.FC<CellEditorProps<string>> = ({\n value,\n rect,\n theme,\n locale,\n onCommit,\n onCancel,\n}) => {\n const initial = parseTimeParts(value);\n const [timeVal, setTimeVal] = useState<string>(value ? initial.formatted : '09:00');\n const [selHour, setSelHour] = useState<number>(initial.hour);\n const [selMinute, setSelMinute] = useState<number>(initial.minute);\n\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const latestValRef = useRef<string>(timeVal);\n latestValRef.current = timeVal;\n\n const isTR = locale?.code?.startsWith('tr');\n\n useEffect(() => {\n inputRef.current?.focus();\n inputRef.current?.select();\n }, []);\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n onCommit(latestValRef.current, 'none');\n }\n };\n document.addEventListener('mousedown', handleOutside, true);\n return () => document.removeEventListener('mousedown', handleOutside, true);\n }, [onCommit]);\n\n const updateTime = (hh: number, mm: number, commitImmediate = false) => {\n const nextStr = `${String(hh).padStart(2, '0')}:${String(mm).padStart(2, '0')}`;\n setSelHour(hh);\n setSelMinute(mm);\n setTimeVal(nextStr);\n if (commitImmediate) {\n onCommit(nextStr, 'none');\n }\n };\n\n const handleSelectNow = () => {\n const now = new Date();\n updateTime(now.getHours(), now.getMinutes(), true);\n };\n\n const hours = Array.from({ length: 24 }, (_, i) => i);\n const minutes = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];\n const presets = ['08:30', '09:00', '12:00', '14:30', '17:00', '18:00'];\n\n return (\n <div\n ref={containerRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n onDoubleClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: Math.max(4, rect.x),\n top: rect.y,\n zIndex: 125,\n fontFamily: theme.fontFamily,\n }}\n >\n {/* Inline Input */}\n <div\n style={{\n width: Math.max(rect.width, 115),\n height: rect.height,\n backgroundColor: theme.dom.inputBg,\n border: `2px solid ${theme.dom.inputFocusBorder}`,\n borderRadius: 4,\n display: 'flex',\n alignItems: 'center',\n boxSizing: 'border-box',\n boxShadow: theme.dom.popoverShadow,\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={timeVal}\n placeholder=\"HH:mm\"\n onChange={(e) => {\n setTimeVal(e.target.value);\n const p = parseTimeParts(e.target.value);\n setSelHour(p.hour);\n setSelMinute(p.minute);\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Enter') {\n e.preventDefault();\n onCommit(timeVal, 'down');\n } else if (e.key === 'Tab') {\n e.preventDefault();\n onCommit(timeVal, e.shiftKey ? 'left' : 'right');\n } else if (e.key === 'Escape') {\n e.preventDefault();\n onCancel();\n }\n }}\n style={{\n width: '100%',\n height: '100%',\n padding: '0 8px',\n boxSizing: 'border-box',\n backgroundColor: 'transparent',\n color: theme.dom.inputText,\n border: 'none',\n outline: 'none',\n fontFamily: theme.fontFamily,\n fontSize: `${theme.fontSize}px`,\n }}\n />\n </div>\n\n {/* Time Picker Popover */}\n <div\n style={{\n marginTop: 4,\n width: 215,\n padding: 10,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n userSelect: 'none',\n }}\n >\n {/* Quick Preset Chips */}\n <div\n style={{\n display: 'flex',\n flexWrap: 'wrap',\n gap: 4,\n marginBottom: 8,\n paddingBottom: 8,\n borderBottom: `1px solid ${theme.dom.popoverBorder}`,\n }}\n >\n {presets.map((p) => {\n const active = timeVal === p;\n return (\n <button\n key={p}\n type=\"button\"\n onClick={() => onCommit(p, 'none')}\n style={{\n padding: '3px 7px',\n fontSize: 11,\n fontFamily: 'monospace',\n fontWeight: active ? 700 : 500,\n borderRadius: 5,\n border: `1px solid ${active ? theme.dom.accentColor : theme.dom.popoverBorder}`,\n backgroundColor: active ? theme.dom.accentColor : 'transparent',\n color: active ? '#FFFFFF' : theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {p}\n </button>\n );\n })}\n </div>\n\n {/* Hour & Minute Columns */}\n <div style={{ display: 'flex', gap: 8 }}>\n <div style={{ flex: 1 }}>\n <div style={{ fontSize: 10, fontWeight: 700, color: '#8E8E93', textAlign: 'center', marginBottom: 4 }}>\n {isTR ? 'SAAT' : 'HOUR'}\n </div>\n <div\n style={{\n height: 140,\n overflowY: 'auto',\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: 2,\n }}\n >\n {hours.map((h) => {\n const active = h === selHour;\n return (\n <button\n key={h}\n type=\"button\"\n onClick={() => updateTime(h, selMinute)}\n style={{\n padding: '4px 0',\n fontSize: 11,\n fontFamily: 'monospace',\n fontWeight: active ? 700 : 500,\n borderRadius: 4,\n border: 'none',\n backgroundColor: active ? theme.dom.accentColor : 'transparent',\n color: active ? '#FFFFFF' : theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {String(h).padStart(2, '0')}\n </button>\n );\n })}\n </div>\n </div>\n\n <div style={{ flex: 1 }}>\n <div style={{ fontSize: 10, fontWeight: 700, color: '#8E8E93', textAlign: 'center', marginBottom: 4 }}>\n {isTR ? 'DAKİKA' : 'MIN'}\n </div>\n <div\n style={{\n height: 140,\n overflowY: 'auto',\n display: 'grid',\n gridTemplateColumns: 'repeat(2, 1fr)',\n gap: 2,\n }}\n >\n {minutes.map((m) => {\n const active = m === selMinute;\n return (\n <button\n key={m}\n type=\"button\"\n onClick={() => updateTime(selHour, m)}\n style={{\n padding: '4px 0',\n fontSize: 11,\n fontFamily: 'monospace',\n fontWeight: active ? 700 : 500,\n borderRadius: 4,\n border: 'none',\n backgroundColor: active ? theme.dom.accentColor : 'transparent',\n color: active ? '#FFFFFF' : theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {String(m).padStart(2, '0')}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginTop: 8,\n paddingTop: 8,\n borderTop: `1px solid ${theme.dom.popoverBorder}`,\n }}\n >\n <div style={{ display: 'flex', gap: 6 }}>\n <button\n type=\"button\"\n onClick={() => onCommit('', 'none')}\n style={{\n padding: '4px 8px',\n fontSize: 11,\n borderRadius: 4,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.popoverText,\n cursor: 'pointer',\n }}\n >\n {locale?.clear || (isTR ? 'Temizle' : 'Clear')}\n </button>\n <button\n type=\"button\"\n onClick={handleSelectNow}\n style={{\n padding: '4px 8px',\n fontSize: 11,\n borderRadius: 4,\n border: `1px solid ${theme.dom.popoverBorder}`,\n backgroundColor: 'transparent',\n color: theme.dom.accentColor,\n fontWeight: 600,\n cursor: 'pointer',\n }}\n >\n {isTR ? 'Şimdi' : 'Now'}\n </button>\n </div>\n <button\n type=\"button\"\n onClick={() => onCommit(timeVal, 'none')}\n style={{\n padding: '4px 12px',\n fontSize: 11,\n fontWeight: 600,\n borderRadius: 4,\n border: 'none',\n backgroundColor: theme.dom.accentColor,\n color: '#FFFFFF',\n cursor: 'pointer',\n }}\n >\n {locale?.apply || (isTR ? 'Uygula' : 'Apply')}\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintTime } from './TimePainter';\nimport { TimeEditor } from './TimeEditor';\n\nexport const TimeColumnPlugin: IColumnTypePlugin<string> = {\n type: 'time',\n paint: paintTime,\n editorComponent: TimeEditor,\n\n onPointerDown({ localX, column }) {\n if (localX > column.width - 28) {\n return { handled: true, shouldOpenEditor: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n openEditor();\n return true;\n }\n if (/^[0-9]$/.test(event.key) && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n return text.trim();\n },\n\n formatClipboard(value) {\n return value != null ? String(value) : '';\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''));\n },\n};\n","import { CellPaintContext, IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { TextEditor } from '../TextColumn/TextEditor';\n\nexport function paintEmail({\n ctx,\n value,\n theme,\n x,\n y,\n width,\n height,\n}: CellPaintContext<string>): void {\n const email = value != null ? String(value).trim() : '';\n if (!email) return;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 6, y, width - 12, height);\n ctx.clip();\n\n const centerY = y + height / 2;\n\n // Draw mail icon badge\n ctx.fillStyle = theme.isDark ? '#38BDF8' : '#0284C7';\n ctx.font = `600 12px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText('✉', x + 8, centerY);\n\n // Draw email text\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `500 ${theme.fontSize - 1}px ${theme.fontFamily}`;\n ctx.fillText(email, x + 26, centerY);\n\n ctx.restore();\n}\n\nexport const EmailColumnPlugin: IColumnTypePlugin<string> = {\n type: 'email',\n paint: paintEmail,\n editorComponent: TextEditor,\n\n onKeyDown({ event, openEditor }) {\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n return text.trim();\n },\n\n formatClipboard(value) {\n return String(value ?? '');\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR');\n },\n};\n","import { CellPaintContext, IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { TextEditor } from '../TextColumn/TextEditor';\n\nexport function paintUrl({\n ctx,\n value,\n theme,\n x,\n y,\n width,\n height,\n isHovered,\n}: CellPaintContext<string>): void {\n const raw = value != null ? String(value).trim() : '';\n if (!raw) return;\n\n const display = raw.replace(/^https?:\\/\\/(www\\.)?/i, '').replace(/\\/$/, '');\n const centerY = y + height / 2;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 6, y, width - 26, height);\n ctx.clip();\n\n ctx.fillStyle = theme.isDark ? '#38BDF8' : '#0284C7';\n ctx.font = `500 ${theme.fontSize - 1}px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(display, x + 8, centerY);\n\n if (isHovered) {\n const textW = Math.min(ctx.measureText(display).width, width - 34);\n ctx.strokeStyle = theme.isDark ? '#38BDF8' : '#0284C7';\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(x + 8, centerY + 7);\n ctx.lineTo(x + 8 + textW, centerY + 7);\n ctx.stroke();\n }\n ctx.restore();\n\n // Draw external link launch icon on right\n ctx.save();\n ctx.fillStyle = isHovered ? theme.dom.accentColor : theme.isDark ? '#64748B' : '#94A3B8';\n ctx.font = `700 11px ${theme.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText('↗', x + width - 12, centerY);\n ctx.restore();\n}\n\nexport const UrlColumnPlugin: IColumnTypePlugin<string> = {\n type: 'url',\n paint: paintUrl,\n editorComponent: TextEditor,\n\n onPointerDown({ localX, column, value }) {\n if (localX > column.width - 24 && value) {\n const href = /^https?:\\/\\//i.test(String(value))\n ? String(value)\n : `https://${String(value)}`;\n if (typeof window !== 'undefined') {\n window.open(href, '_blank', 'noopener,noreferrer');\n }\n return { handled: true, shouldOpenEditor: false };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n return text.trim();\n },\n\n formatClipboard(value) {\n return String(value ?? '');\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR');\n },\n};\n","import { CellPaintContext, IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { TextEditor } from '../TextColumn/TextEditor';\n\nexport function paintPhone({\n ctx,\n value,\n theme,\n x,\n y,\n width,\n height,\n}: CellPaintContext<string>): void {\n const phone = value != null ? String(value).trim() : '';\n if (!phone) return;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 6, y, width - 12, height);\n ctx.clip();\n\n const centerY = y + height / 2;\n\n ctx.fillStyle = theme.isDark ? '#34D399' : '#059669';\n ctx.font = `600 11px ${theme.fontFamily}`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText('☎', x + 8, centerY);\n\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `500 ${theme.fontSize - 1}px monospace`;\n ctx.fillText(phone, x + 24, centerY);\n\n ctx.restore();\n}\n\nexport const PhoneColumnPlugin: IColumnTypePlugin<string> = {\n type: 'phone',\n paint: paintPhone,\n editorComponent: TextEditor,\n\n onKeyDown({ event, openEditor }) {\n if (/^[0-9+()-\\s]$/.test(event.key) && !event.ctrlKey && !event.metaKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n return text.trim();\n },\n\n formatClipboard(value) {\n return String(value ?? '');\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR');\n },\n};\n","import React, { useEffect, useRef, useState } from 'react';\nimport { CellEditorProps } from '../../IColumnTypePlugin';\n\nconst PRESET_COLORS = [\n '#38BDF8',\n '#2563EB',\n '#6366F1',\n '#8B5CF6',\n '#EC4899',\n '#F43F5E',\n '#EF4444',\n '#F97316',\n '#F59E0B',\n '#EAB308',\n '#10B981',\n '#14B8A6',\n];\n\nexport const ColorEditor: React.FC<CellEditorProps<string>> = ({\n value,\n rect,\n theme,\n onCommit,\n onCancel,\n}) => {\n const [hex, setHex] = useState<string>(String(value || '#38BDF8'));\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n const handleOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n onCommit(hex, 'none');\n }\n };\n document.addEventListener('mousedown', handleOutside, true);\n return () => document.removeEventListener('mousedown', handleOutside, true);\n }, [hex, onCommit]);\n\n return (\n <div\n ref={containerRef}\n onMouseDown={(e) => e.stopPropagation()}\n onClick={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n left: Math.max(4, rect.x),\n top: rect.y,\n width: 210,\n zIndex: 130,\n padding: 10,\n backgroundColor: theme.dom.popoverBg,\n color: theme.dom.popoverText,\n border: `1px solid ${theme.dom.popoverBorder}`,\n borderRadius: 10,\n boxShadow: theme.dom.popoverShadow,\n backdropFilter: theme.dom.glassBackdrop,\n fontFamily: theme.fontFamily,\n }}\n >\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(6, 1fr)',\n gap: 6,\n marginBottom: 10,\n }}\n >\n {PRESET_COLORS.map((c) => (\n <button\n key={c}\n type=\"button\"\n onClick={() => onCommit(c, 'none')}\n style={{\n width: 24,\n height: 24,\n borderRadius: 5,\n backgroundColor: c,\n border:\n hex.toLowerCase() === c.toLowerCase()\n ? '2px solid #FFFFFF'\n : '1px solid rgba(255,255,255,0.2)',\n cursor: 'pointer',\n padding: 0,\n }}\n />\n ))}\n </div>\n <div style={{ display: 'flex', gap: 6, alignItems: 'center' }}>\n <input\n type=\"color\"\n value={/^#[0-9a-fA-F]{6}$/.test(hex) ? hex : '#38BDF8'}\n onChange={(e) => setHex(e.target.value.toUpperCase())}\n style={{ width: 28, height: 28, padding: 0, border: 'none', cursor: 'pointer', background: 'none' }}\n />\n <input\n type=\"text\"\n value={hex}\n onChange={(e) => setHex(e.target.value)}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === 'Enter') onCommit(hex, 'down');\n if (e.key === 'Escape') onCancel();\n }}\n style={{\n flex: 1,\n padding: '5px 7px',\n borderRadius: 5,\n border: `1px solid ${theme.dom.inputBorder}`,\n backgroundColor: theme.dom.inputBg,\n color: theme.dom.inputText,\n fontSize: 12,\n fontFamily: 'monospace',\n outline: 'none',\n }}\n />\n </div>\n </div>\n );\n};\n","import { CellPaintContext, IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { ColorEditor } from './ColorEditor';\n\nexport function paintColor({\n ctx,\n value,\n theme,\n x,\n y,\n width,\n height,\n}: CellPaintContext<string>): void {\n const color = value != null && String(value).trim() ? String(value).trim() : '#38BDF8';\n const centerY = y + height / 2;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + 6, y, width - 12, height);\n ctx.clip();\n\n // Swatch box\n const swatchSize = 16;\n const swatchX = x + 8;\n const swatchY = centerY - swatchSize / 2;\n\n ctx.fillStyle = color;\n ctx.beginPath();\n ctx.roundRect(swatchX, swatchY, swatchSize, swatchSize, 4);\n ctx.fill();\n\n ctx.strokeStyle = theme.isDark ? 'rgba(255,255,255,0.25)' : 'rgba(0,0,0,0.18)';\n ctx.lineWidth = 1;\n ctx.stroke();\n\n // Hex text\n ctx.fillStyle = theme.canvas.cellText;\n ctx.font = `600 ${theme.fontSize - 2}px monospace`;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n ctx.fillText(color.toUpperCase(), swatchX + swatchSize + 8, centerY);\n\n ctx.restore();\n}\n\nexport const ColorColumnPlugin: IColumnTypePlugin<string> = {\n type: 'color',\n paint: paintColor,\n editorComponent: ColorEditor,\n\n onPointerDown() {\n return { handled: true, shouldOpenEditor: true };\n },\n\n onKeyDown({ event, openEditor }) {\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault();\n openEditor();\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n return text.trim();\n },\n\n formatClipboard(value) {\n return String(value ?? '#38BDF8');\n },\n\n comparator(a, b) {\n return String(a ?? '').localeCompare(String(b ?? ''), 'tr-TR');\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintRating({ ctx, value, theme, x, y, width, height }: CellPaintContext<number>): void {\n const rating = Math.max(0, Math.min(5, Math.round(Number(value) || 0)));\n const starCount = 5;\n const starSize = 13;\n const gap = 3;\n const startX = x + 8;\n const midY = y + height / 2;\n\n ctx.save();\n for (let i = 0; i < starCount; i++) {\n const sx = startX + i * (starSize + gap);\n if (sx + starSize > x + width) break;\n\n const isFilled = i < rating;\n ctx.fillStyle = isFilled ? '#F59E0B' : theme.isDark ? '#48484A' : '#D1D1D6';\n\n // 5 köşeli vektörel yıldız çizimi\n drawStar(ctx, sx + starSize / 2, midY, 5, starSize / 2, starSize / 4);\n ctx.fill();\n }\n ctx.restore();\n}\n\nfunction drawStar(\n ctx: CanvasRenderingContext2D,\n cx: number,\n cy: number,\n spikes: number,\n outerRadius: number,\n innerRadius: number\n) {\n let rot = (Math.PI / 2) * 3;\n let x = cx;\n let y = cy;\n const step = Math.PI / spikes;\n\n ctx.beginPath();\n ctx.moveTo(cx, cy - outerRadius);\n for (let i = 0; i < spikes; i++) {\n x = cx + Math.cos(rot) * outerRadius;\n y = cy + Math.sin(rot) * outerRadius;\n ctx.lineTo(x, y);\n rot += step;\n\n x = cx + Math.cos(rot) * innerRadius;\n y = cy + Math.sin(rot) * innerRadius;\n ctx.lineTo(x, y);\n rot += step;\n }\n ctx.lineTo(cx, cy - outerRadius);\n ctx.closePath();\n}\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintRating } from './RatingPainter';\n\nexport const RatingColumnPlugin: IColumnTypePlugin<number> = {\n type: 'rating',\n paint: paintRating,\n editorComponent: undefined, // Zero-DOM: Tıklamayla doğrudan puanlama\n\n onPointerDown({ localX, setValue }) {\n // Tıklanan yıldızın indeksini hesapla (1..5)\n const starIndex = Math.ceil((localX - 8) / 16);\n if (starIndex >= 1 && starIndex <= 5) {\n setValue(starIndex);\n return { handled: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, setValue }) {\n // 1-5 tuşlarına basıldığında doğrudan o puanı ata\n if (/^[1-5]$/.test(event.key)) {\n event.preventDefault();\n setValue(Number(event.key));\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n const num = parseInt(text.trim(), 10);\n return isNaN(num) ? 0 : Math.max(0, Math.min(5, num));\n },\n\n formatClipboard(value) {\n return `${value ?? 0} / 5 Yıldız`;\n },\n\n comparator(a, b) {\n return (Number(a) || 0) - (Number(b) || 0);\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintProgress({ ctx, value, theme, x, y, width, height }: CellPaintContext<number>): void {\n const pct = Math.max(0, Math.min(100, Math.round(Number(value) || 0)));\n const pad = 6;\n const barH = 18;\n const barY = y + (height - barH) / 2;\n const barTotalW = width - pad * 2;\n const fillW = (barTotalW * pct) / 100;\n\n ctx.save();\n\n // Arka plan rayı (Track)\n ctx.fillStyle = theme.isDark ? '#2C2C2E' : '#E5E5EA';\n ctx.beginPath();\n ctx.roundRect(x + pad, barY, barTotalW, barH, 4);\n ctx.fill();\n\n // Doluluk barı (Fill)\n if (fillW > 0) {\n const isCompleted = pct === 100;\n ctx.fillStyle = isCompleted ? '#10B981' : theme.canvas.selectionBorder;\n ctx.beginPath();\n ctx.roundRect(x + pad, barY, fillW, barH, 4);\n ctx.fill();\n }\n\n // Yüzde metni\n ctx.fillStyle = pct > 55 ? '#FFFFFF' : theme.canvas.cellText;\n ctx.font = `600 11px ${theme.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(`%${pct}`, x + width / 2, y + height / 2);\n\n ctx.restore();\n}\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintProgress } from './ProgressPainter';\nimport { NumberEditor } from '../NumberColumn/NumberEditor';\n\nexport const ProgressColumnPlugin: IColumnTypePlugin<number> = {\n type: 'progress',\n paint: paintProgress,\n editorComponent: NumberEditor,\n\n onKeyDown({ event, openEditor }) {\n if (/^[0-9]$/.test(event.key) && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n openEditor(event.key);\n return true;\n }\n return false;\n },\n\n parseClipboard(text) {\n const num = parseFloat(text.replace(/[^0-9.-]/g, ''));\n return isNaN(num) ? 0 : Math.max(0, Math.min(100, num));\n },\n\n formatClipboard(value) {\n return `${value ?? 0}%`;\n },\n\n comparator(a, b) {\n return (Number(a) || 0) - (Number(b) || 0);\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintSparkline({\n ctx,\n value,\n column,\n theme,\n x,\n y,\n width,\n height,\n isHovered,\n isSelected,\n}: CellPaintContext<number[]>): void {\n const points: number[] = Array.isArray(value) ? value : [];\n if (points.length < 2) return;\n\n const padX = 8;\n const rightReserve = isHovered || isSelected ? 26 : 10;\n const padY = 8;\n const w = width - padX - rightReserve;\n const h = height - padY * 2;\n if (w <= 0 || h <= 0) return;\n\n const min = Math.min(...points);\n const max = Math.max(...points);\n const range = max - min || 1;\n\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + padX, y, w + 4, height);\n ctx.clip();\n\n const strokeColor = column.sparklineColor || theme.canvas.selectionBorder;\n ctx.strokeStyle = strokeColor;\n ctx.lineWidth = 1.8;\n ctx.lineJoin = 'round';\n ctx.lineCap = 'round';\n\n ctx.beginPath();\n points.forEach((val, i) => {\n const px = x + padX + (i / (points.length - 1)) * w;\n const py = y + height - padY - ((val - min) / range) * h;\n if (i === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n });\n ctx.stroke();\n\n // Son noktanın üzerine minik nokta koy\n const lastVal = points[points.length - 1];\n const lastX = x + padX + w;\n const lastY = y + height - padY - ((lastVal - min) / range) * h;\n ctx.fillStyle = strokeColor;\n ctx.beginPath();\n ctx.arc(lastX, lastY, 2.5, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n\n // Hover veya seçili durumda sağda \"Detaylı Grafik Modalı Aç (↗)\" ikonu göster\n if (isHovered || isSelected) {\n ctx.save();\n const btnSize = 18;\n const btnX = x + width - btnSize - 4;\n const btnY = y + (height - btnSize) / 2;\n\n ctx.fillStyle = theme.isDark ? 'rgba(56, 189, 248, 0.2)' : 'rgba(2, 132, 199, 0.12)';\n ctx.beginPath();\n ctx.roundRect(btnX, btnY, btnSize, btnSize, 4);\n ctx.fill();\n\n ctx.fillStyle = theme.dom.accentColor;\n ctx.font = `700 11px ${theme.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText('↗', btnX + btnSize / 2, btnY + btnSize / 2);\n ctx.restore();\n }\n}\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintSparkline } from './SparklinePainter';\n\nexport const SparklineColumnPlugin: IColumnTypePlugin<number[]> = {\n type: 'sparkline',\n paint: paintSparkline,\n editorComponent: undefined, // Salt okunur grafik\n\n parseClipboard(text) {\n return text.split(',').map((s) => parseFloat(s.trim())).filter((n) => !isNaN(n));\n },\n\n formatClipboard(value) {\n return Array.isArray(value) ? value.join(',') : '';\n },\n};\n","import { CellPaintContext } from '../../IColumnTypePlugin';\n\nexport function paintAction({ ctx, column, theme, x, y, width, height, isHovered }: CellPaintContext): void {\n const pad = 6;\n const btnH = 22;\n const btnY = y + (height - btnH) / 2;\n const btnW = width - pad * 2;\n if (btnW <= 10) return;\n\n ctx.save();\n\n // Buton arka planı\n ctx.fillStyle = isHovered\n ? theme.canvas.selectionBorder\n : theme.isDark\n ? '#2C2C2E'\n : '#F2F2F7';\n ctx.beginPath();\n ctx.roundRect(x + pad, btnY, btnW, btnH, 4);\n ctx.fill();\n\n // Buton çerçevesi\n ctx.strokeStyle = theme.isDark ? '#3A3A3C' : '#E5E5EA';\n ctx.lineWidth = 1;\n ctx.stroke();\n\n // Buton metni\n ctx.fillStyle = isHovered ? '#FFFFFF' : theme.canvas.cellText;\n ctx.font = `500 11px ${theme.fontFamily}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(column.buttonText || 'İşlem', x + width / 2, y + height / 2);\n\n ctx.restore();\n}\n","import { IColumnTypePlugin } from '../../IColumnTypePlugin';\nimport { paintAction } from './ActionPainter';\n\nexport const ActionColumnPlugin: IColumnTypePlugin<any> = {\n type: 'action',\n paint: paintAction,\n\n onPointerDown({ column, row, rowIndex, value }) {\n if (column.onActionClick) {\n column.onActionClick(row ?? value, rowIndex ?? 0);\n return { handled: true };\n }\n return { handled: false };\n },\n\n onKeyDown({ event, column, row, rowIndex, value }) {\n if (event.key === 'Enter') {\n event.preventDefault();\n if (column.onActionClick) {\n column.onActionClick(row ?? value, rowIndex ?? 0);\n return true;\n }\n }\n return false;\n },\n};\n","import { ColumnTypeRegistry } from './ColumnTypeRegistry';\nimport { TextColumnPlugin } from './types/TextColumn';\nimport { NumberColumnPlugin } from './types/NumberColumn';\nimport { CurrencyColumnPlugin } from './types/CurrencyColumn';\nimport { PercentColumnPlugin } from './types/PercentColumn';\nimport { BooleanColumnPlugin } from './types/BooleanColumn';\nimport { SelectColumnPlugin } from './types/SelectColumn';\nimport { DropdownColumnPlugin } from './types/DropdownColumn';\nimport { MultiSelectColumnPlugin } from './types/MultiSelectColumn';\nimport { LookupColumnPlugin } from './types/LookupColumn';\nimport { ObjectColumnPlugin } from './types/ObjectColumn';\nimport { DateColumnPlugin } from './types/DateColumn';\nimport { DateTimeColumnPlugin } from './types/DateTimeColumn';\nimport { TimeColumnPlugin } from './types/TimeColumn';\nimport { EmailColumnPlugin } from './types/EmailColumn';\nimport { UrlColumnPlugin } from './types/UrlColumn';\nimport { PhoneColumnPlugin } from './types/PhoneColumn';\nimport { ColorColumnPlugin } from './types/ColorColumn';\nimport { RatingColumnPlugin } from './types/RatingColumn';\nimport { ProgressColumnPlugin } from './types/ProgressColumn';\nimport { SparklineColumnPlugin } from './types/SparklineColumn';\nimport { ActionColumnPlugin } from './types/ActionColumn';\n\nlet initialized = false;\n\nexport function initDefaultColumnPlugins(): void {\n if (initialized) return;\n\n ColumnTypeRegistry.register(TextColumnPlugin);\n ColumnTypeRegistry.register(NumberColumnPlugin);\n ColumnTypeRegistry.register(CurrencyColumnPlugin);\n ColumnTypeRegistry.register(PercentColumnPlugin);\n ColumnTypeRegistry.register(BooleanColumnPlugin);\n ColumnTypeRegistry.register(SelectColumnPlugin);\n ColumnTypeRegistry.register(DropdownColumnPlugin);\n ColumnTypeRegistry.register(MultiSelectColumnPlugin);\n ColumnTypeRegistry.register(LookupColumnPlugin);\n ColumnTypeRegistry.register(ObjectColumnPlugin);\n ColumnTypeRegistry.register(DateColumnPlugin);\n ColumnTypeRegistry.register(DateTimeColumnPlugin);\n ColumnTypeRegistry.register(TimeColumnPlugin);\n ColumnTypeRegistry.register(EmailColumnPlugin);\n ColumnTypeRegistry.register(UrlColumnPlugin);\n ColumnTypeRegistry.register(PhoneColumnPlugin);\n ColumnTypeRegistry.register(ColorColumnPlugin);\n ColumnTypeRegistry.register(RatingColumnPlugin);\n ColumnTypeRegistry.register(ProgressColumnPlugin);\n ColumnTypeRegistry.register(SparklineColumnPlugin);\n ColumnTypeRegistry.register(ActionColumnPlugin);\n\n initialized = true;\n}\n","import { IGridLocale } from '../IGridLocale';\n\nexport const enUS: IGridLocale = {\n code: 'en-US',\n language: 'English (US)',\n\n searchPlaceholder: 'Search in table (Ctrl+F)...',\n addGroup: '+ Add to Group',\n exportCsv: 'Export CSV',\n rows: 'Rows',\n columns: 'Columns',\n systemTheme: 'System (Auto)',\n\n formulaBarPlaceholder: 'Empty',\n totalRecords: 'Total Records',\n\n searchValuesPlaceholder: 'Search values...',\n selectAll: '(Select All)',\n clear: 'Clear',\n apply: 'Apply',\n cancel: 'Cancel',\n loading: 'Loading...',\n noMatches: 'No matching records',\n\n emptyText: '(Blank)',\n trueText: 'TRUE',\n falseText: 'FALSE',\n ratingOutOf: (val: number) => `${val} / 5 Stars`,\n groupRecordCount: (count: number) => `${count.toLocaleString('en-US')} records`,\n};\n","import { IGridLocale } from '../IGridLocale';\n\nexport const trTR: IGridLocale = {\n code: 'tr-TR',\n language: 'Türkçe (TR)',\n\n searchPlaceholder: 'Tabloda ara (Ctrl+F)...',\n addGroup: '+ Gruba Ekle',\n exportCsv: 'CSV İndir',\n rows: 'Satır',\n columns: 'Sütun',\n systemTheme: 'Sistem (Otomatik)',\n\n formulaBarPlaceholder: 'Boş',\n totalRecords: 'Toplam Kayıt',\n\n searchValuesPlaceholder: 'Değer ara...',\n selectAll: '(Tümünü Seç)',\n clear: 'Temizle',\n apply: 'Uygula',\n cancel: 'İptal',\n loading: 'Yükleniyor...',\n noMatches: 'Kayıt bulunamadı',\n\n emptyText: '(Boş)',\n trueText: 'DOĞRU',\n falseText: 'YANLIŞ',\n ratingOutOf: (val: number) => `${val} / 5 Yıldız`,\n groupRecordCount: (count: number) => `${count.toLocaleString('tr-TR')} kayıt`,\n};\n","import { IGridLocale } from './IGridLocale';\nimport { enUS } from './locales/enUS';\nimport { trTR } from './locales/trTR';\n\nexport type { IGridLocale };\nexport type LocaleInput = string | Partial<IGridLocale>;\n\nexport class LocaleEngine {\n private static locales: Map<string, IGridLocale> = new Map([\n ['en', enUS],\n ['en-US', enUS],\n ['tr', trTR],\n ['tr-TR', trTR],\n ]);\n\n public static registerLocale(name: string, locale: IGridLocale): void {\n this.locales.set(name, locale);\n }\n\n public static detectBrowserLocaleCode(): 'tr' | 'en' {\n if (typeof navigator !== 'undefined' && navigator.language) {\n return navigator.language.toLowerCase().startsWith('tr') ? 'tr' : 'en';\n }\n return 'en';\n }\n\n public static resolve(input?: LocaleInput): IGridLocale {\n if (!input || input === 'auto') {\n const code = this.detectBrowserLocaleCode();\n return this.locales.get(code) || enUS;\n }\n\n if (typeof input === 'string') {\n const exact = this.locales.get(input);\n if (exact) return exact;\n if (input.toLowerCase().startsWith('tr')) return trTR;\n return enUS;\n }\n\n return {\n ...enUS,\n ...input,\n };\n }\n}\n","import React, { useEffect, useRef, useState, useMemo, useCallback } from 'react';\nimport {\n ColumnDef,\n ActiveOverlayState,\n GridPermissions,\n GridToolbarConfig,\n GridSummaryConfig,\n EditingStartEvent,\n CellValueChangingEvent,\n CellValueChangedEvent,\n RowInsertingEvent,\n RowInsertedEvent,\n RowUpdatingEvent,\n RowUpdatedEvent,\n RowRemovingEvent,\n RowRemovedEvent,\n SavingEvent,\n SavedEvent,\n} from '../types/grid';\nimport { IDataStore, BatchChanges } from '../types/store';\nimport { ColumnFilterState, FilterDescriptor, SortDescriptor } from '../types/filter';\nimport { GroupDescriptor, SummaryType } from '../types/group';\nimport { IGridThemeTokens } from '../theme/IGridTheme';\nimport { ThemeEngine, ThemeInput } from '../theme/ThemeEngine';\nimport { GeometryEngine } from '../core/GeometryEngine';\nimport { SelectionModel } from '../core/SelectionModel';\nimport { HistoryManager } from '../core/HistoryManager';\nimport { ValidationEngine } from '../core/ValidationEngine';\nimport { CanvasRenderer } from '../renderer/CanvasRenderer';\nimport { DynamicCellEditor } from '../overlays/DynamicCellEditor';\nimport { HeaderFilterPopover } from '../overlays/HeaderFilterPopover';\nimport { ContextMenuOverlay, ContextMenuState } from '../overlays/ContextMenuOverlay';\nimport { SparklineModalOverlay, SparklineModalState } from '../overlays/SparklineModalOverlay';\nimport { ToolBar } from './ToolBar';\nimport { FormulaBar } from './FormulaBar';\nimport { SummaryFooter, SelectionSummaryStats } from './SummaryFooter';\nimport { MaterialIcon } from './MaterialIcon';\nimport { LocalDataStore } from '../data/LocalDataStore';\nimport { initDefaultColumnPlugins } from '../columns/initPlugins';\nimport { ColumnTypeRegistry } from '../columns/ColumnTypeRegistry';\nimport { LocaleEngine, LocaleInput, IGridLocale } from '../i18n/LocaleEngine';\n\nexport interface SheetGLProps {\n dataSource: any[] | IDataStore;\n columns: ColumnDef[];\n theme?: ThemeInput;\n locale?: LocaleInput;\n rowHeight?: number;\n headerHeight?: number;\n initialSort?: SortDescriptor[];\n initialGroups?: GroupDescriptor[];\n permissions?: GridPermissions;\n batchEditMode?: boolean;\n /**\n * Toolbar visibility & configuration (`buttonDisplayMode: 'icon' | 'icon-text' | 'text'`, item visibility, customItems)\n */\n toolbar?: boolean | GridToolbarConfig;\n onToolbarConfigChange?: (config: GridToolbarConfig) => void;\n /**\n * Summary Row (bottom footer) visibility & configuration (`showTotalCount`, `showSelectionStats`, `showColumnSummaries`, `items`, `columnSummaryTypes`)\n */\n summaryRow?: boolean | GridSummaryConfig;\n onSummaryConfigChange?: (config: GridSummaryConfig) => void;\n /** Whether to show the Excel Formula & Coordinate Bar below the toolbar (default: true) */\n showFormulaBar?: boolean;\n onPermissionsChange?: (permissions: GridPermissions) => void;\n onCellChange?: (row: any, columnId: string, value: any) => void;\n\n // Enterprise Lifecycle Event Triggers\n onEditingStart?: (e: EditingStartEvent) => void;\n onCellValueChanging?: (e: CellValueChangingEvent) => void;\n onCellValueChanged?: (\n e: CellValueChangedEvent\n ) => void | Record<string, any> | Promise<void | Record<string, any>>;\n onRowInserting?: (e: RowInsertingEvent) => void | Promise<void>;\n onRowInserted?: (e: RowInsertedEvent) => void;\n onRowUpdating?: (e: RowUpdatingEvent) => void | Promise<void>;\n onRowUpdated?: (e: RowUpdatedEvent) => void;\n onRowRemoving?: (e: RowRemovingEvent) => void | Promise<void>;\n onRowRemoved?: (e: RowRemovedEvent) => void;\n onSaving?: (e: SavingEvent) => void | Promise<void>;\n onSaved?: (e: SavedEvent) => void;\n\n style?: React.CSSProperties;\n className?: string;\n}\n\nfunction compileColumnFilters(map: Record<string, ColumnFilterState>): FilterDescriptor | null {\n const states = Object.values(map);\n if (states.length === 0) return null;\n\n const singleFilters: FilterDescriptor[] = [];\n for (const st of states) {\n if (st.mode === 'values' && st.selectedValues) {\n singleFilters.push([st.columnId, 'in', st.selectedValues]);\n } else if (st.mode === 'condition' && st.operator) {\n if (st.operator === 'between') {\n singleFilters.push([st.columnId, 'between', [st.value1, st.value2]]);\n } else {\n singleFilters.push([st.columnId, st.operator, st.value1]);\n }\n }\n }\n\n if (singleFilters.length === 0) return null;\n if (singleFilters.length === 1) return singleFilters[0];\n\n const composite: any[] = [];\n singleFilters.forEach((f, idx) => {\n if (idx > 0) composite.push('and');\n composite.push(f);\n });\n return composite;\n}\n\nexport const SheetGL: React.FC<SheetGLProps> = ({\n dataSource,\n columns: userColumns,\n theme: userTheme = 'apple-dark',\n locale: userLocale,\n rowHeight = 34,\n headerHeight = 38,\n initialSort = [],\n initialGroups = [],\n permissions: userPermissions,\n batchEditMode = true,\n toolbar: userToolbar,\n onToolbarConfigChange,\n summaryRow: userSummaryRow,\n onSummaryConfigChange,\n showFormulaBar = true,\n onPermissionsChange,\n onCellChange,\n onEditingStart,\n onCellValueChanging,\n onCellValueChanged,\n onRowInserting,\n onRowInserted,\n onRowUpdating,\n onRowUpdated,\n onRowRemoving,\n onRowRemoved,\n onSaving,\n onSaved,\n style,\n className,\n}) => {\n // 1. Initialize Default Column Plugins synchronously on first render\n useMemo(() => {\n initDefaultColumnPlugins();\n }, []);\n\n // 2. DataStore Adaptation\n const store = useMemo<IDataStore>(() => {\n if (Array.isArray(dataSource)) {\n const initialSummaries: Record<string, SummaryType> = {};\n userColumns.forEach((c) => {\n if (c.summaryType) {\n initialSummaries[c.id] = c.summaryType;\n }\n });\n if (userSummaryRow && typeof userSummaryRow === 'object') {\n if (userSummaryRow.columnSummaryTypes) {\n Object.assign(initialSummaries, userSummaryRow.columnSummaryTypes);\n }\n if (Array.isArray(userSummaryRow.items)) {\n userSummaryRow.items.forEach((item) => {\n initialSummaries[item.columnId] = item.summaryType;\n });\n }\n }\n return new LocalDataStore({\n data: dataSource,\n keyField: 'id',\n batchMode: batchEditMode,\n initialSummaries: Object.keys(initialSummaries).length > 0 ? initialSummaries : undefined,\n });\n }\n return dataSource;\n }, [dataSource]);\n\n useEffect(() => {\n store.setBatchMode?.(batchEditMode);\n }, [store, batchEditMode]);\n\n // 3. Theme Resolution\n const [currentThemeName, setCurrentThemeName] = useState<ThemeInput>(userTheme);\n const [resolvedTheme, setResolvedTheme] = useState<IGridThemeTokens>(() =>\n ThemeEngine.resolve(userTheme)\n );\n\n useEffect(() => {\n setCurrentThemeName(userTheme);\n }, [userTheme]);\n\n useEffect(() => {\n setResolvedTheme(ThemeEngine.resolve(currentThemeName));\n if (currentThemeName === 'system') {\n const unsub = ThemeEngine.watchSystem(() => {\n setResolvedTheme(ThemeEngine.resolve('system'));\n });\n return unsub;\n }\n }, [currentThemeName]);\n\n // 3b. Locale Resolution (i18n)\n const [currentLocale, setCurrentLocale] = useState<IGridLocale>(() =>\n LocaleEngine.resolve(userLocale)\n );\n\n useEffect(() => {\n if (userLocale) {\n setCurrentLocale(LocaleEngine.resolve(userLocale));\n }\n }, [userLocale]);\n\n // 3c. Permissions State\n const [permissions, setPermissions] = useState<GridPermissions>(\n userPermissions || {\n mode: 'write',\n allowAdding: true,\n allowUpdating: true,\n allowDeleting: true,\n allowDuplicating: true,\n allowClipboardPaste: true,\n allowExport: true,\n allowFiltering: true,\n allowSorting: true,\n allowGrouping: true,\n allowBatchSave: true,\n }\n );\n\n useEffect(() => {\n if (userPermissions) {\n setPermissions(userPermissions);\n }\n }, [userPermissions]);\n\n const handleUpdatePermissions = (next: GridPermissions) => {\n setPermissions(next);\n onPermissionsChange?.(next);\n };\n\n // 3d. Toolbar & Summary Row Configuration State\n const [toolbarConfig, setToolbarConfig] = useState<GridToolbarConfig>(() => {\n if (userToolbar === false) return { visible: false, buttonDisplayMode: 'icon-text' };\n if (userToolbar && typeof userToolbar === 'object') {\n return { visible: true, buttonDisplayMode: 'icon-text', ...userToolbar };\n }\n return { visible: true, buttonDisplayMode: 'icon-text' };\n });\n\n useEffect(() => {\n if (userToolbar === false) {\n setToolbarConfig((prev) => ({ ...prev, visible: false }));\n } else if (userToolbar === true) {\n setToolbarConfig((prev) => ({ ...prev, visible: true }));\n } else if (userToolbar && typeof userToolbar === 'object') {\n setToolbarConfig((prev) => ({\n ...prev,\n visible: userToolbar.visible !== false,\n ...userToolbar,\n }));\n }\n }, [userToolbar]);\n\n const handleUpdateToolbarConfig = useCallback(\n (patch: Partial<GridToolbarConfig>) => {\n setToolbarConfig((prev) => {\n const next = { ...prev, ...patch };\n onToolbarConfigChange?.(next);\n return next;\n });\n },\n [onToolbarConfigChange]\n );\n\n const [summaryConfig, setSummaryConfig] = useState<GridSummaryConfig>(() => {\n if (userSummaryRow === false) return { visible: false };\n if (userSummaryRow && typeof userSummaryRow === 'object') {\n return {\n visible: true,\n showTotalCount: true,\n showSelectionStats: true,\n showColumnSummaries: true,\n allowConfiguration: true,\n ...userSummaryRow,\n };\n }\n return {\n visible: true,\n showTotalCount: true,\n showSelectionStats: true,\n showColumnSummaries: true,\n allowConfiguration: true,\n };\n });\n\n useEffect(() => {\n if (userSummaryRow === false) {\n setSummaryConfig((prev) => ({ ...prev, visible: false }));\n } else if (userSummaryRow === true) {\n setSummaryConfig((prev) => ({ ...prev, visible: true }));\n } else if (userSummaryRow && typeof userSummaryRow === 'object') {\n setSummaryConfig((prev) => ({\n ...prev,\n visible: userSummaryRow.visible !== false,\n ...userSummaryRow,\n }));\n if (userSummaryRow.columnSummaryTypes) {\n Object.entries(userSummaryRow.columnSummaryTypes).forEach(([colId, sType]) => {\n store.setSummaryType?.(colId, sType);\n });\n }\n if (Array.isArray(userSummaryRow.items)) {\n userSummaryRow.items.forEach((item) => {\n store.setSummaryType?.(item.columnId, item.summaryType);\n });\n }\n }\n }, [userSummaryRow, store]);\n\n const handleUpdateSummaryConfig = useCallback(\n (patch: Partial<GridSummaryConfig>) => {\n setSummaryConfig((prev) => {\n const next = { ...prev, ...patch };\n onSummaryConfigChange?.(next);\n return next;\n });\n },\n [onSummaryConfigChange]\n );\n\n // 4. Core Engines\n const [columns, setColumns] = useState<ColumnDef[]>(userColumns);\n useEffect(() => {\n setColumns(userColumns);\n }, [userColumns]);\n\n const geometryRef = useRef<GeometryEngine>(\n new GeometryEngine(userColumns, rowHeight, headerHeight)\n );\n const selectionRef = useRef<SelectionModel>(new SelectionModel());\n const historyRef = useRef<HistoryManager>(new HistoryManager(100));\n\n useEffect(() => {\n geometryRef.current.rowHeight = rowHeight;\n geometryRef.current.headerHeight = headerHeight;\n geometryRef.current.setColumns(columns);\n }, [columns, rowHeight, headerHeight]);\n\n // 5. UI State Management\n const [sortRules, setSortRules] = useState<SortDescriptor[]>(initialSort);\n const [groups, setGroups] = useState<GroupDescriptor[]>(initialGroups);\n const [columnFilters, setColumnFilters] = useState<Record<string, ColumnFilterState>>({});\n const [searchKeyword, setSearchKeyword] = useState<string>('');\n const [selectedCellUI, setSelectedCellUI] = useState<{ row: number; col: number }>({ row: 0, col: 0 });\n const [selectionVersion, setSelectionVersion] = useState<number>(0);\n const [activeOverlay, setActiveOverlay] = useState<ActiveOverlayState | null>(null);\n const [editorValidationError, setEditorValidationError] = useState<string | null>(null);\n const [isEditorValidating, setIsEditorValidating] = useState<boolean>(false);\n const [headerFilterState, setHeaderFilterState] = useState<{\n column: ColumnDef;\n rect: { x: number; y: number; width: number; height: number };\n } | null>(null);\n const [contextMenu, setContextMenu] = useState<ContextMenuState | null>(null);\n const [sparklineModal, setSparklineModal] = useState<SparklineModalState | null>(null);\n const [toastMessage, setToastMessage] = useState<{ text: string; type: 'info' | 'warning' | 'success' } | null>(null);\n\n // Hover & Drag States\n const hoveredCellRef = useRef<{ row: number; col: number } | null>(null);\n const hoveredFilterColRef = useRef<number | null>(null);\n const [cursorStyle, setCursorStyle] = useState<string>('cell');\n const [resizingCol, setResizingCol] = useState<{\n colIndex: number;\n colId: string;\n startX: number;\n initialWidth: number;\n } | null>(null);\n const [isDraggingSelection, setIsDraggingSelection] = useState<boolean>(false);\n const [isDraggingRowNumbers, setIsDraggingRowNumbers] = useState<boolean>(false);\n const [fillDragState, setFillDragState] = useState<{\n mode: 'corner' | 'right-duplicate';\n sourceRange: { minRow: number; maxRow: number; minCol: number; maxCol: number };\n targetRange: { minRow: number; maxRow: number; minCol: number; maxCol: number };\n } | null>(null);\n\n // Async Backend Cascading Row Loading Keys\n const loadingRowKeysRef = useRef<Set<any>>(new Set());\n\n // Right-side Scroll Indicator State\n const scrollPosRef = useRef<{ left: number; top: number }>({ left: 0, top: 0 });\n const [scrollIndicator, setScrollIndicator] = useState<{ visible: boolean; row: number }>({\n visible: false,\n row: 1,\n });\n const scrollHideTimerRef = useRef<number | null>(null);\n\n // Internal clipboard fallback for context menu Copy/Paste\n const internalClipboardRef = useRef<string>('');\n\n // DOM Element Refs\n const containerRef = useRef<HTMLDivElement | null>(null);\n const gridSurfaceRef = useRef<HTMLDivElement | null>(null);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const scrollContainerRef = useRef<HTMLDivElement | null>(null);\n\n const showToast = useCallback((text: string, type: 'info' | 'warning' | 'success' = 'info') => {\n setToastMessage({ text, type });\n setTimeout(() => {\n setToastMessage((prev) => (prev?.text === text ? null : prev));\n }, 2600);\n }, []);\n\n // Store listener\n const [storeVersion, setStoreVersion] = useState<number>(0);\n useEffect(() => {\n const handleLoaded = () => {\n setStoreVersion((v) => v + 1);\n };\n store.on('loaded', handleLoaded);\n return () => store.off('loaded', handleLoaded);\n }, [store]);\n\n // Apply initialSort and initialGroups if provided\n useEffect(() => {\n if (initialSort.length > 0) {\n store.setSorting(initialSort);\n }\n if (initialGroups.length > 0) {\n store.setGrouping(initialGroups);\n }\n }, []);\n\n const activeFilterColumnIds = useMemo(\n () => new Set(Object.keys(columnFilters)),\n [columnFilters]\n );\n\n // 6. 60 FPS Render Loop\n const requestRender = useCallback(() => {\n if (!canvasRef.current) return;\n requestAnimationFrame(() => {\n if (!canvasRef.current) return;\n CanvasRenderer.render({\n canvas: canvasRef.current,\n geometry: geometryRef.current,\n store,\n selection: selectionRef.current,\n theme: resolvedTheme,\n locale: currentLocale,\n scrollLeft: scrollPosRef.current.left,\n scrollTop: scrollPosRef.current.top,\n sortRules,\n searchKeyword,\n hoveredCell: hoveredCellRef.current,\n hoveredFilterColIndex: hoveredFilterColRef.current,\n activeFilterColumnIds,\n fillDragRange: fillDragState?.targetRange || null,\n loadingRowKeys: loadingRowKeysRef.current,\n permissions,\n });\n });\n }, [\n store,\n resolvedTheme,\n currentLocale,\n sortRules,\n searchKeyword,\n activeFilterColumnIds,\n fillDragState,\n permissions,\n ]);\n\n useEffect(() => {\n requestRender();\n }, [requestRender, resolvedTheme, currentLocale, storeVersion, columns, selectionVersion]);\n\n // 6b. Resize Observer\n useEffect(() => {\n const handleResize = () => requestRender();\n window.addEventListener('resize', handleResize);\n\n let observer: ResizeObserver | null = null;\n if (typeof ResizeObserver !== 'undefined') {\n observer = new ResizeObserver(() => requestRender());\n if (gridSurfaceRef.current) observer.observe(gridSurfaceRef.current);\n if (containerRef.current) observer.observe(containerRef.current);\n }\n\n return () => {\n window.removeEventListener('resize', handleResize);\n observer?.disconnect();\n };\n }, [requestRender]);\n\n // ============================================================================\n // PERMISSION & EDITABILITY CHECKER\n // ============================================================================\n const canEditCell = useCallback(\n (row: Record<string, any> | undefined, colDef: ColumnDef | undefined, rowIndex: number = 0, silent: boolean = false): boolean => {\n if (!colDef || !row) return false;\n if (colDef.type === 'sparkline' || colDef.type === 'action') return false;\n\n if (\n permissions.mode === 'read' ||\n permissions.mode === 'readonly' ||\n permissions.allowUpdating === false\n ) {\n if (!silent) {\n showToast(\n currentLocale.code.startsWith('tr')\n ? '🔒 Tablo şu anda Salt Okunur (Read-Only) modunda.'\n : '🔒 Grid is currently in Read-Only permission mode.',\n 'warning'\n );\n }\n return false;\n }\n\n if (colDef.readonly || colDef.permission === 'readonly' || colDef.permission === 'read') {\n if (!silent) {\n showToast(\n currentLocale.code.startsWith('tr')\n ? `🔒 \"${colDef.title}\" sütunu salt okunurdur (Read-Only).`\n : `🔒 Column \"${colDef.title}\" is Read-Only.`,\n 'warning'\n );\n }\n return false;\n }\n\n if (colDef.canEdit && !colDef.canEdit(row, colDef)) {\n if (!silent) {\n showToast(\n currentLocale.code.startsWith('tr')\n ? `🔒 Bu satır için \"${colDef.title}\" düzenlenemez.`\n : `🔒 \"${colDef.title}\" is locked for this record.`,\n 'warning'\n );\n }\n return false;\n }\n\n if (onEditingStart && !silent) {\n const evt: EditingStartEvent = {\n row,\n rowKey: row.id ?? rowIndex,\n rowIndex,\n column: colDef,\n value: row[colDef.id],\n cancel: false,\n };\n onEditingStart(evt);\n if (evt.cancel) {\n showToast(\n currentLocale.code.startsWith('tr')\n ? `🔒 Düzenleme onEditingStart kuralı tarafından engellendi.`\n : `🔒 Editing canceled by onEditingStart trigger.`,\n 'warning'\n );\n return false;\n }\n }\n\n return true;\n },\n [permissions, onEditingStart, currentLocale, showToast]\n );\n\n // ============================================================================\n // UNIFIED CELL MUTATION & CASCADING TRIGGER PIPELINE\n // ============================================================================\n const commitSingleCellEdit = useCallback(\n async (\n rowIndex: number,\n colDef: ColumnDef,\n newValue: any,\n recordHistory: boolean = true\n ): Promise<boolean> => {\n const vRow = store.getViewRow(rowIndex);\n if (!vRow || vRow.type !== 'data') return false;\n\n const rowData = vRow.data;\n const rowKey = rowData.id ?? rowIndex;\n const oldValue = rowData[colDef.id];\n\n if (oldValue === newValue) {\n setEditorValidationError(null);\n return true;\n }\n if (!canEditCell(rowData, colDef, rowIndex, false)) return false;\n\n // 1. Static & Async Column Validation Rules + Legacy Validator Check\n const isTR = currentLocale.code.startsWith('tr');\n const hasAsyncRule =\n colDef.validationRules?.some((r) => r.type === 'async') || Boolean(colDef.validator);\n if (hasAsyncRule) {\n loadingRowKeysRef.current.add(rowKey);\n requestRender();\n }\n try {\n const valRes = await ValidationEngine.validateCell(newValue, rowData, colDef, isTR);\n if (!valRes.valid) {\n const msg =\n valRes.message ||\n (isTR ? 'Doğrulama kuralı hatası: Giriş engellendi!' : 'Validation rule failed: Entry blocked!');\n setEditorValidationError(msg);\n showToast(`⛔ ${msg}`, 'warning');\n return false;\n }\n setEditorValidationError(null);\n } finally {\n if (hasAsyncRule) {\n loadingRowKeysRef.current.delete(rowKey);\n requestRender();\n }\n }\n\n // 2. Lifecycle onCellValueChanging Trigger\n let finalValue = newValue;\n if (onCellValueChanging) {\n const changingEvt: CellValueChangingEvent = {\n row: rowData,\n rowKey,\n rowIndex,\n column: colDef,\n oldValue,\n newValue,\n cancel: false,\n };\n onCellValueChanging(changingEvt);\n if (changingEvt.cancel) {\n if (changingEvt.errorMessage) {\n showToast(`⚠️ ${changingEvt.errorMessage}`, 'warning');\n }\n return false;\n }\n finalValue = changingEvt.newValue;\n }\n\n // 3. Lifecycle onRowUpdating Trigger\n if (onRowUpdating) {\n const rowUpdEvt: RowUpdatingEvent = {\n key: rowKey,\n oldData: { ...rowData },\n newData: { [colDef.id]: finalValue },\n cancel: false,\n };\n await onRowUpdating(rowUpdEvt);\n if (rowUpdEvt.cancel) return false;\n }\n\n const prevRowSnapshot = { ...rowData };\n\n // 4. Commit Primary Value\n await store.setCell(rowKey, colDef.id, finalValue);\n onCellChange?.(rowData, colDef.id, finalValue);\n\n // 5. Cascading Column setCellValue & Async Backend Lookup Trigger\n const cascadingPatch: Record<string, any> = {};\n if (colDef.setCellValue) {\n try {\n loadingRowKeysRef.current.add(rowKey);\n requestRender();\n\n const draftNewData: Record<string, any> = {};\n const maybePromise = colDef.setCellValue(draftNewData, finalValue, prevRowSnapshot, {\n rowKey,\n columnId: colDef.id,\n store,\n });\n\n const resolvedPatch =\n maybePromise instanceof Promise ? await maybePromise : maybePromise;\n\n Object.assign(cascadingPatch, draftNewData, resolvedPatch || {});\n if (Object.keys(cascadingPatch).length > 0) {\n await store.updateRowFields?.(rowKey, cascadingPatch);\n }\n } finally {\n loadingRowKeysRef.current.delete(rowKey);\n requestRender();\n }\n }\n\n // 6. Lifecycle onCellValueChanged Trigger (supports sync or async backend patch)\n if (onCellValueChanged) {\n try {\n const changedEvt: CellValueChangedEvent = {\n row: rowData,\n rowKey,\n rowIndex,\n column: colDef,\n oldValue,\n newValue: finalValue,\n updateRow: (patch) => {\n Object.assign(cascadingPatch, patch);\n store.updateRowFields?.(rowKey, patch);\n },\n };\n const res = onCellValueChanged(changedEvt);\n if (res instanceof Promise) {\n loadingRowKeysRef.current.add(rowKey);\n requestRender();\n const asyncPatch = await res;\n if (asyncPatch && typeof asyncPatch === 'object') {\n Object.assign(cascadingPatch, asyncPatch);\n await store.updateRowFields?.(rowKey, asyncPatch);\n }\n loadingRowKeysRef.current.delete(rowKey);\n } else if (res && typeof res === 'object') {\n Object.assign(cascadingPatch, res);\n await store.updateRowFields?.(rowKey, res);\n }\n } catch {\n loadingRowKeysRef.current.delete(rowKey);\n }\n }\n\n // 7. Record Undo/Redo Command (including any cascading fields!)\n if (recordHistory) {\n const fullNewPatch: Record<string, any> = {\n [colDef.id]: finalValue,\n ...cascadingPatch,\n };\n const fullOldPatch: Record<string, any> = {};\n for (const k of Object.keys(fullNewPatch)) {\n fullOldPatch[k] = prevRowSnapshot[k];\n }\n\n historyRef.current.push({\n description: `Edit ${colDef.title}`,\n undo: () => {\n store.updateRowFields?.(rowKey, fullOldPatch);\n setStoreVersion((v) => v + 1);\n },\n redo: () => {\n store.updateRowFields?.(rowKey, fullNewPatch);\n setStoreVersion((v) => v + 1);\n },\n });\n }\n\n onRowUpdated?.({ key: rowKey, data: rowData });\n setStoreVersion((v) => v + 1);\n requestRender();\n return true;\n },\n [\n store,\n canEditCell,\n onCellValueChanging,\n onRowUpdating,\n onCellChange,\n onCellValueChanged,\n onRowUpdated,\n currentLocale,\n showToast,\n requestRender,\n ]\n );\n\n // ============================================================================\n // BATCH RANGE MUTATION (FOR FILL HANDLE, DUPLICATE & PASTE)\n // ============================================================================\n const applyBatchCellUpdates = useCallback(\n async (\n updates: Array<{ rowIndex: number; rowKey: any; colDef: ColumnDef; newValue: any }>,\n description: string\n ) => {\n if (updates.length === 0) return;\n\n const allowedUpdates: Array<{\n rowIndex: number;\n rowKey: any;\n colDef: ColumnDef;\n oldValue: any;\n newValue: any;\n rowData: Record<string, any>;\n }> = [];\n\n for (const u of updates) {\n const vRow = store.getViewRow(u.rowIndex);\n if (!vRow || vRow.type !== 'data') continue;\n if (!canEditCell(vRow.data, u.colDef, u.rowIndex, true)) continue;\n allowedUpdates.push({\n ...u,\n oldValue: vRow.data[u.colDef.id],\n rowData: vRow.data,\n });\n }\n\n if (allowedUpdates.length === 0) {\n showToast(\n currentLocale.code.startsWith('tr')\n ? '🔒 Seçili hücreler salt okunur (Read-Only).'\n : '🔒 Target cells are Read-Only.',\n 'warning'\n );\n return;\n }\n\n // If single cell, run through full cascading pipeline\n if (allowedUpdates.length === 1) {\n const single = allowedUpdates[0];\n await commitSingleCellEdit(single.rowIndex, single.colDef, single.newValue, true);\n return;\n }\n\n // Validate all items against column validationRules & validator\n const isTR = currentLocale.code.startsWith('tr');\n const validatedUpdates: typeof allowedUpdates = [];\n let firstErrorMsg: string | null = null;\n let rejectedCount = 0;\n\n for (const u of allowedUpdates) {\n const valRes = await ValidationEngine.validateCell(u.newValue, u.rowData, u.colDef, isTR);\n if (valRes.valid) {\n validatedUpdates.push(u);\n } else {\n rejectedCount++;\n if (!firstErrorMsg) {\n firstErrorMsg =\n valRes.message ||\n (isTR ? 'Doğrulama kuralına uymayan değer engellendi!' : 'Invalid value blocked by validation rule!');\n }\n }\n }\n\n if (rejectedCount > 0 && firstErrorMsg) {\n showToast(\n rejectedCount === 1\n ? `⛔ ${firstErrorMsg}`\n : isTR\n ? `⛔ ${rejectedCount} hücre doğrulama kuralına uymadığı için engellendi (${firstErrorMsg})`\n : `⛔ ${rejectedCount} cells blocked by validation rule (${firstErrorMsg})`,\n 'warning'\n );\n }\n\n if (validatedUpdates.length === 0) {\n return;\n }\n\n const forwardBatch = validatedUpdates.map((u) => ({\n rowKey: u.rowKey,\n columnId: u.colDef.id,\n value: u.newValue,\n }));\n const backwardBatch = validatedUpdates.map((u) => ({\n rowKey: u.rowKey,\n columnId: u.colDef.id,\n value: u.oldValue,\n }));\n\n if (store.setCellsBatch) {\n await store.setCellsBatch(forwardBatch);\n } else {\n for (const f of forwardBatch) {\n await store.setCell(f.rowKey, f.columnId, f.value);\n }\n }\n\n // Also trigger cascading setCellValue for updated rows if any column defines setCellValue\n for (const u of validatedUpdates) {\n onCellChange?.(u.rowData, u.colDef.id, u.newValue);\n if (u.colDef.setCellValue) {\n const draft: Record<string, any> = {};\n const res = u.colDef.setCellValue(draft, u.newValue, u.rowData, {\n rowKey: u.rowKey,\n columnId: u.colDef.id,\n store,\n });\n if (res instanceof Promise) {\n loadingRowKeysRef.current.add(u.rowKey);\n res.then((patch) => {\n const combined = { ...draft, ...(patch || {}) };\n if (Object.keys(combined).length > 0) {\n store.updateRowFields?.(u.rowKey, combined);\n }\n loadingRowKeysRef.current.delete(u.rowKey);\n requestRender();\n });\n } else {\n const combined = { ...draft, ...(res || {}) };\n if (Object.keys(combined).length > 0) {\n await store.updateRowFields?.(u.rowKey, combined);\n }\n }\n }\n }\n\n historyRef.current.push({\n description,\n undo: () => {\n store.setCellsBatch?.(backwardBatch);\n setStoreVersion((v) => v + 1);\n },\n redo: () => {\n store.setCellsBatch?.(forwardBatch);\n setStoreVersion((v) => v + 1);\n },\n });\n\n setStoreVersion((v) => v + 1);\n requestRender();\n },\n [store, canEditCell, commitSingleCellEdit, onCellChange, currentLocale, showToast, requestRender]\n );\n\n // ============================================================================\n // CRUD ROW ACTIONS (INSERT, DUPLICATE ROW, DELETE ROW, BATCH SAVE)\n // ============================================================================\n const handleInsertRow = useCallback(\n async (targetRowIndex?: number) => {\n if (\n permissions.mode === 'read' ||\n permissions.mode === 'readonly' ||\n permissions.allowAdding === false\n ) {\n showToast(\n currentLocale.code.startsWith('tr')\n ? '🔒 Yeni satır ekleme yetkiniz kapalı.'\n : '🔒 Row insertion is disabled by permissions.',\n 'warning'\n );\n return;\n }\n\n const defaultRow: Record<string, any> = {};\n for (const col of columns) {\n if (col.id === 'id') continue;\n if (col.defaultValue !== undefined) {\n defaultRow[col.id] = col.defaultValue;\n } else if (col.type === 'number' || col.type === 'currency') {\n defaultRow[col.id] = 0;\n } else if (col.type === 'boolean') {\n defaultRow[col.id] = false;\n } else if (col.type === 'rating') {\n defaultRow[col.id] = 3;\n } else if (col.type === 'progress') {\n defaultRow[col.id] = 50;\n } else if (col.type === 'select' || col.type === 'dropdown') {\n defaultRow[col.id] = col.options?.[0]?.value ?? '';\n } else if (col.type === 'multiselect') {\n defaultRow[col.id] = col.options?.slice(0, 2).map((o) => o.value) ?? [];\n } else if (col.type === 'date') {\n defaultRow[col.id] = new Date().toISOString().split('T')[0];\n } else if (col.type === 'datetime') {\n const now = new Date();\n defaultRow[col.id] = `${now.toISOString().split('T')[0]} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`;\n } else if (col.type === 'time') {\n defaultRow[col.id] = '09:30';\n } else if (col.type === 'sparkline') {\n defaultRow[col.id] = [25, 40, 35, 60, 55, 75, 85];\n } else if (col.type === 'text') {\n defaultRow[col.id] = col.id === 'company' ? 'New Enterprise Record' : col.id === 'city' ? 'New York' : col.id === 'category' ? 'Enterprise SaaS' : col.id === 'code' ? `ACC-${Math.floor(100000 + Math.random() * 900000)}` : '';\n }\n }\n\n if (onRowInserting) {\n const evt: RowInsertingEvent = {\n data: defaultRow,\n targetRowIndex,\n cancel: false,\n };\n await onRowInserting(evt);\n if (evt.cancel) return;\n }\n\n const created = await store.insertRow?.(defaultRow, targetRowIndex);\n if (created) {\n const newKey = created.id;\n historyRef.current.push({\n description: 'Insert Row',\n undo: () => {\n store.deleteRow?.(newKey);\n setStoreVersion((v) => v + 1);\n },\n redo: () => {\n store.restoreRow?.(created, 0);\n setStoreVersion((v) => v + 1);\n },\n });\n onRowInserted?.({ data: created, key: newKey });\n showToast(\n currentLocale.code.startsWith('tr')\n ? `✨ Yeni satır eklendi (#${newKey})`\n : `✨ New row inserted (#${newKey})`,\n 'success'\n );\n setStoreVersion((v) => v + 1);\n requestRender();\n }\n },\n [permissions, columns, onRowInserting, store, onRowInserted, currentLocale, showToast, requestRender]\n );\n\n const handleDuplicateRow = useCallback(\n async (rowIndex?: number) => {\n const targetIdx = rowIndex ?? selectionRef.current.activeCell.row;\n const vRow = store.getViewRow(targetIdx);\n if (!vRow || vRow.type !== 'data') return;\n\n if (\n permissions.mode === 'read' ||\n permissions.mode === 'readonly' ||\n permissions.allowDuplicating === false ||\n permissions.allowAdding === false\n ) {\n showToast(\n currentLocale.code.startsWith('tr')\n ? '🔒 Satır çoğaltma yetkisi kapalı.'\n : '🔒 Row duplication is disabled by permissions.',\n 'warning'\n );\n return;\n }\n\n const sourceKey = vRow.data.id ?? targetIdx;\n const duplicated = await store.duplicateRow?.(sourceKey, targetIdx);\n if (duplicated) {\n const newKey = duplicated.id;\n historyRef.current.push({\n description: 'Duplicate Row',\n undo: () => {\n store.deleteRow?.(newKey);\n setStoreVersion((v) => v + 1);\n },\n redo: () => {\n store.restoreRow?.(duplicated, targetIdx + 1);\n setStoreVersion((v) => v + 1);\n },\n });\n onRowInserted?.({ data: duplicated, key: newKey });\n showToast(\n currentLocale.code.startsWith('tr')\n ? `📑 Satır çoğaltıldı (#${sourceKey} → #${newKey})`\n : `📑 Row duplicated (#${sourceKey} → #${newKey})`,\n 'success'\n );\n setStoreVersion((v) => v + 1);\n requestRender();\n }\n },\n [store, permissions, onRowInserted, currentLocale, showToast, requestRender]\n );\n\n const handleDeleteRow = useCallback(\n async (rowIndex?: number) => {\n const targetIdx = rowIndex ?? selectionRef.current.activeCell.row;\n const vRow = store.getViewRow(targetIdx);\n if (!vRow || vRow.type !== 'data') return;\n\n if (\n permissions.mode === 'read' ||\n permissions.mode === 'readonly' ||\n permissions.allowDeleting === false\n ) {\n showToast(\n currentLocale.code.startsWith('tr')\n ? '🔒 Satır silme yetkisi kapalı.'\n : '🔒 Row deletion is disabled by permissions.',\n 'warning'\n );\n return;\n }\n\n const rowKey = vRow.data.id ?? targetIdx;\n const snapshot = { ...vRow.data };\n\n if (onRowRemoving) {\n const evt: RowRemovingEvent = { key: rowKey, data: snapshot, cancel: false };\n await onRowRemoving(evt);\n if (evt.cancel) return;\n }\n\n await store.deleteRow?.(rowKey);\n historyRef.current.push({\n description: 'Delete Row',\n undo: () => {\n store.restoreRow?.(snapshot, targetIdx);\n setStoreVersion((v) => v + 1);\n },\n redo: () => {\n store.deleteRow?.(rowKey);\n setStoreVersion((v) => v + 1);\n },\n });\n onRowRemoved?.({ key: rowKey, data: snapshot });\n showToast(\n currentLocale.code.startsWith('tr')\n ? `🗑️ Satır silindi (#${rowKey})`\n : `🗑️ Row deleted (#${rowKey})`,\n 'info'\n );\n setStoreVersion((v) => v + 1);\n requestRender();\n },\n [store, permissions, onRowRemoving, onRowRemoved, currentLocale, showToast, requestRender]\n );\n\n const handleSaveBatch = useCallback(async () => {\n const changes = store.getPendingChanges?.();\n if (!changes) return;\n\n if (onSaving) {\n const evt: SavingEvent = { changes, cancel: false };\n await onSaving(evt);\n if (evt.cancel) return;\n }\n\n const committed = await store.saveBatchChanges?.();\n if (committed) {\n onSaved?.({ changes: committed });\n const count =\n (committed.inserted?.length || 0) +\n (committed.updated?.length || 0) +\n (committed.deleted?.length || 0);\n showToast(\n currentLocale.code.startsWith('tr')\n ? `✅ Toplu kayıt başarılı (${count} işlem kaydedildi).`\n : `✅ Batch save completed (${count} changes committed).`,\n 'success'\n );\n setStoreVersion((v) => v + 1);\n requestRender();\n }\n }, [store, onSaving, onSaved, currentLocale, showToast, requestRender]);\n\n const handleDiscardBatch = useCallback(() => {\n store.discardBatchChanges?.();\n historyRef.current.clear();\n showToast(\n currentLocale.code.startsWith('tr')\n ? '↩️ Kaydedilmemiş tüm değişiklikler geri alındı.'\n : '↩️ All unsaved batch changes discarded.',\n 'info'\n );\n setStoreVersion((v) => v + 1);\n requestRender();\n }, [store, currentLocale, showToast, requestRender]);\n\n // ============================================================================\n // CELL DUPLICATION HELPERS (FILL DOWN, FILL RIGHT & DRAG AUTOFILL)\n // ============================================================================\n const handleDuplicateCellDown = useCallback(() => {\n const norm = selectionRef.current.getNormalizedRange();\n const geom = geometryRef.current;\n const updates: Array<{ rowIndex: number; rowKey: any; colDef: ColumnDef; newValue: any }> = [];\n\n if (norm.maxRow > norm.minRow) {\n // Excel Ctrl+D when multiple rows selected: copy top row of selection down into all selected rows\n const topRow = store.getViewRow(norm.minRow);\n if (!topRow || topRow.type !== 'data') return;\n for (let r = norm.minRow + 1; r <= norm.maxRow; r++) {\n const targetRow = store.getViewRow(r);\n if (!targetRow || targetRow.type !== 'data') continue;\n for (let c = norm.minCol; c <= norm.maxCol; c++) {\n const colDef = geom.columns[c];\n if (!colDef) continue;\n updates.push({\n rowIndex: r,\n rowKey: targetRow.data.id ?? r,\n colDef,\n newValue: topRow.data[colDef.id],\n });\n }\n }\n } else {\n // Single row selected: duplicate active cell(s) into the row directly below (and move selection down)\n const nextR = norm.minRow + 1;\n if (nextR >= store.getRowCount()) return;\n const srcRow = store.getViewRow(norm.minRow);\n const dstRow = store.getViewRow(nextR);\n if (!srcRow || srcRow.type !== 'data' || !dstRow || dstRow.type !== 'data') return;\n\n for (let c = norm.minCol; c <= norm.maxCol; c++) {\n const colDef = geom.columns[c];\n if (!colDef) continue;\n updates.push({\n rowIndex: nextR,\n rowKey: dstRow.data.id ?? nextR,\n colDef,\n newValue: srcRow.data[colDef.id],\n });\n }\n selectionRef.current.setActiveCell(nextR, selectionRef.current.activeCell.col);\n setSelectedCellUI({ row: nextR, col: selectionRef.current.activeCell.col });\n setSelectionVersion((v) => v + 1);\n }\n\n applyBatchCellUpdates(updates, 'Duplicate Cell Down');\n }, [store, applyBatchCellUpdates]);\n\n const handleDuplicateCellRight = useCallback(() => {\n const norm = selectionRef.current.getNormalizedRange();\n const geom = geometryRef.current;\n const updates: Array<{ rowIndex: number; rowKey: any; colDef: ColumnDef; newValue: any }> = [];\n\n if (norm.maxCol > norm.minCol) {\n // Excel Ctrl+R when multiple columns selected: copy leftmost column into selected columns on right\n for (let r = norm.minRow; r <= norm.maxRow; r++) {\n const vRow = store.getViewRow(r);\n if (!vRow || vRow.type !== 'data') continue;\n const srcColDef = geom.columns[norm.minCol];\n if (!srcColDef) continue;\n const srcVal = vRow.data[srcColDef.id];\n\n for (let c = norm.minCol + 1; c <= norm.maxCol; c++) {\n const dstColDef = geom.columns[c];\n if (!dstColDef) continue;\n const plugin = ColumnTypeRegistry.get(dstColDef.type);\n const coercedVal = plugin.parseClipboard\n ? plugin.parseClipboard(String(srcVal ?? ''), dstColDef)\n : srcVal;\n updates.push({\n rowIndex: r,\n rowKey: vRow.data.id ?? r,\n colDef: dstColDef,\n newValue: coercedVal,\n });\n }\n }\n } else {\n // Single column selected: duplicate into next editable column on the right (or below if same type)\n const nextC = norm.minCol + 1;\n if (nextC < geom.columns.length) {\n const srcColDef = geom.columns[norm.minCol];\n const dstColDef = geom.columns[nextC];\n if (srcColDef && dstColDef) {\n for (let r = norm.minRow; r <= norm.maxRow; r++) {\n const vRow = store.getViewRow(r);\n if (!vRow || vRow.type !== 'data') continue;\n const srcVal = vRow.data[srcColDef.id];\n const plugin = ColumnTypeRegistry.get(dstColDef.type);\n const coercedVal = plugin.parseClipboard\n ? plugin.parseClipboard(String(srcVal ?? ''), dstColDef)\n : srcVal;\n updates.push({\n rowIndex: r,\n rowKey: vRow.data.id ?? r,\n colDef: dstColDef,\n newValue: coercedVal,\n });\n }\n selectionRef.current.setActiveCell(selectionRef.current.activeCell.row, nextC);\n setSelectedCellUI({ row: selectionRef.current.activeCell.row, col: nextC });\n setSelectionVersion((v) => v + 1);\n }\n }\n }\n\n applyBatchCellUpdates(updates, 'Duplicate Cell Right');\n }, [store, applyBatchCellUpdates]);\n\n // ============================================================================\n // COLUMN SORTING, GROUPING, FILTERING & COLUMN UPDATES\n // ============================================================================\n const handleHeaderSort = (colIndex: number, isShift: boolean, explicitDesc?: boolean | null) => {\n if (permissions.allowSorting === false) return;\n const col = geometryRef.current.columns[colIndex];\n if (!col || col.sortable === false) return;\n\n let nextRules: SortDescriptor[] = [];\n const existingIndex = sortRules.findIndex((s) => s.selector === col.id);\n\n if (explicitDesc !== undefined) {\n if (explicitDesc === null) {\n nextRules = sortRules.filter((s) => s.selector !== col.id);\n } else {\n nextRules = [{ selector: col.id, desc: explicitDesc }];\n }\n } else if (isShift) {\n nextRules = [...sortRules];\n if (existingIndex !== -1) {\n if (!nextRules[existingIndex].desc) {\n nextRules[existingIndex] = { ...nextRules[existingIndex], desc: true };\n } else {\n nextRules.splice(existingIndex, 1);\n }\n } else {\n nextRules.push({ selector: col.id, desc: false });\n }\n } else {\n if (existingIndex !== -1) {\n if (!sortRules[existingIndex].desc) {\n nextRules = [{ selector: col.id, desc: true }];\n } else {\n nextRules = [];\n }\n } else {\n nextRules = [{ selector: col.id, desc: false }];\n }\n }\n\n setSortRules(nextRules);\n store.setSorting(nextRules);\n };\n\n const handleToggleGroupColumn = (colId: string) => {\n if (permissions.allowGrouping === false) return;\n const targetCol = columns.find((c) => c.id === colId);\n if (targetCol && (targetCol.type === 'sparkline' || targetCol.type === 'action' || targetCol.groupable === false)) {\n return;\n }\n setGroups((prevGroups) => {\n const exists = prevGroups.some((g) => g.selector === colId);\n const nextGroups = exists\n ? prevGroups.filter((g) => g.selector !== colId)\n : [...prevGroups, { selector: colId }];\n store.setGrouping(nextGroups);\n if (scrollContainerRef.current) {\n scrollContainerRef.current.scrollTop = 0;\n }\n scrollPosRef.current.top = 0;\n selectionRef.current.setActiveCell(0, 0);\n setSelectedCellUI({ row: 0, col: 0 });\n setStoreVersion((v) => v + 1);\n requestRender();\n\n const colTitle = columns.find((c) => c.id === colId)?.title.replace(' ⚡', '') || colId;\n showToast(\n exists\n ? currentLocale.code.startsWith('tr')\n ? `📂 \"${colTitle}\" gruplaması kaldırıldı.`\n : `📂 Ungrouped \"${colTitle}\".`\n : currentLocale.code.startsWith('tr')\n ? `📁 \"${colTitle}\" sütununa göre gruplandı. Satırları görmek için gruba tıklayın.`\n : `📁 Grouped by \"${colTitle}\". Click any group row to expand.`,\n 'info'\n );\n return nextGroups;\n });\n };\n\n const handleApplyColumnFilter = (colId: string, filterState: ColumnFilterState | null) => {\n const next = { ...columnFilters };\n if (!filterState) {\n delete next[colId];\n } else {\n next[colId] = filterState;\n }\n setColumnFilters(next);\n\n const compiled = compileColumnFilters(next);\n store.setFilter(compiled);\n\n if (scrollContainerRef.current) {\n scrollContainerRef.current.scrollTop = 0;\n }\n scrollPosRef.current.top = 0;\n\n const maxR = Math.max(0, store.getRowCount() - 1);\n const activeCol = selectionRef.current.activeCell.col;\n selectionRef.current.setActiveCell(Math.min(selectionRef.current.activeCell.row, maxR), activeCol);\n\n setStoreVersion((v) => v + 1);\n requestRender();\n\n const matchedCount = store.getRowCount();\n const isTR = currentLocale.code.startsWith('tr');\n if (filterState) {\n showToast(\n isTR\n ? `🔍 Filtre uygulandı: ${matchedCount.toLocaleString('tr-TR')} kayıt listeleniyor.`\n : `🔍 Filter applied: ${matchedCount.toLocaleString('en-US')} matching rows.`,\n 'info'\n );\n } else {\n showToast(\n isTR ? '🧹 Sütun filtresi temizlendi.' : '🧹 Column filter cleared.',\n 'info'\n );\n }\n };\n\n const handleClearAllFilters = () => {\n setColumnFilters({});\n store.setFilter(null);\n if (scrollContainerRef.current) {\n scrollContainerRef.current.scrollTop = 0;\n }\n scrollPosRef.current.top = 0;\n setStoreVersion((v) => v + 1);\n requestRender();\n };\n\n const handleUpdateColumnDef = (colId: string, patch: Partial<ColumnDef>) => {\n setColumns((prev) =>\n prev.map((c) => (c.id === colId ? { ...c, ...patch } : c))\n );\n };\n\n const handleChangeSummaryType = (colId: string, summaryType: SummaryType) => {\n store.setSummaryType?.(colId, summaryType);\n setStoreVersion((v) => v + 1);\n requestRender();\n };\n\n // ============================================================================\n // COLUMN RESIZING EFFECT\n // ============================================================================\n useEffect(() => {\n if (!resizingCol) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const deltaX = e.clientX - resizingCol.startX;\n const newWidth = Math.max(48, resizingCol.initialWidth + deltaX);\n setColumns((prev) =>\n prev.map((c) => (c.id === resizingCol.colId ? { ...c, width: newWidth } : c))\n );\n };\n\n const handleMouseUp = () => {\n setResizingCol(null);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [resizingCol]);\n\n // ============================================================================\n // DRAG SELECTION & FILL HANDLE DRAG EFFECT (WITH AUTO-SCROLL AT EDGES)\n // ============================================================================\n useEffect(() => {\n if (!isDraggingSelection && !isDraggingRowNumbers && !fillDragState) return;\n\n const handleWindowMouseMove = (e: MouseEvent) => {\n const surface = gridSurfaceRef.current;\n const sc = scrollContainerRef.current;\n if (!surface || !sc) return;\n\n const rect = surface.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n // Auto-scroll when dragging near viewport edges\n const edgeThreshold = 36;\n if (y > rect.height - edgeThreshold) {\n sc.scrollTop += 18;\n } else if (y < geometryRef.current.headerHeight + edgeThreshold && y > geometryRef.current.headerHeight) {\n sc.scrollTop = Math.max(0, sc.scrollTop - 18);\n }\n if (x > rect.width - edgeThreshold) {\n sc.scrollLeft += 24;\n } else if (x < geometryRef.current.totalFrozenWidth + edgeThreshold && x > geometryRef.current.totalFrozenWidth) {\n sc.scrollLeft = Math.max(0, sc.scrollLeft - 24);\n }\n\n const rowCount = store.getRowCount();\n if (rowCount === 0) return;\n\n const clampedY = Math.max(geometryRef.current.headerHeight + 2, Math.min(y, rect.height - 2));\n const virtualY = clampedY - geometryRef.current.headerHeight + scrollPosRef.current.top;\n const targetRow = Math.max(0, Math.min(rowCount - 1, Math.floor(virtualY / geometryRef.current.rowHeight)));\n\n if (isDraggingRowNumbers) {\n selectionRef.current.setRangeEnd(targetRow, geometryRef.current.columns.length - 1);\n setSelectionVersion((v) => v + 1);\n requestRender();\n return;\n }\n\n const hit = geometryRef.current.hitTest(\n Math.max(geometryRef.current.rowNumberWidth + 2, Math.min(x, rect.width - 2)),\n clampedY,\n scrollPosRef.current.left,\n scrollPosRef.current.top,\n rowCount\n );\n if (!hit) return;\n\n if (isDraggingSelection) {\n selectionRef.current.setRangeEnd(hit.row, hit.col);\n setSelectionVersion((v) => v + 1);\n requestRender();\n } else if (fillDragState) {\n const src = fillDragState.sourceRange;\n const minRow = Math.min(src.minRow, hit.row);\n const maxRow = Math.max(src.maxRow, hit.row);\n const minCol = Math.min(src.minCol, hit.col);\n const maxCol = Math.max(src.maxCol, hit.col);\n\n setFillDragState((prev) =>\n prev\n ? {\n ...prev,\n targetRange: { minRow, maxRow, minCol, maxCol },\n }\n : null\n );\n }\n };\n\n const handleWindowMouseUp = () => {\n if (isDraggingSelection) {\n setIsDraggingSelection(false);\n }\n if (isDraggingRowNumbers) {\n setIsDraggingRowNumbers(false);\n }\n if (fillDragState) {\n const { mode, sourceRange, targetRange } = fillDragState;\n setFillDragState(null);\n\n const isSameRange =\n sourceRange.minRow === targetRange.minRow &&\n sourceRange.maxRow === targetRange.maxRow &&\n sourceRange.minCol === targetRange.minCol &&\n sourceRange.maxCol === targetRange.maxCol;\n\n if (isSameRange && mode === 'right-duplicate') {\n // Single click on right-side duplicate button -> duplicate cell down or right!\n handleDuplicateCellDown();\n return;\n }\n\n if (!isSameRange) {\n const geom = geometryRef.current;\n const updates: Array<{ rowIndex: number; rowKey: any; colDef: ColumnDef; newValue: any }> = [];\n const srcHeight = sourceRange.maxRow - sourceRange.minRow + 1;\n const srcWidth = sourceRange.maxCol - sourceRange.minCol + 1;\n\n for (let r = targetRange.minRow; r <= targetRange.maxRow; r++) {\n const dstRow = store.getViewRow(r);\n if (!dstRow || dstRow.type !== 'data') continue;\n\n for (let c = targetRange.minCol; c <= targetRange.maxCol; c++) {\n // Skip cells that were already inside sourceRange\n if (\n r >= sourceRange.minRow &&\n r <= sourceRange.maxRow &&\n c >= sourceRange.minCol &&\n c <= sourceRange.maxCol\n ) {\n continue;\n }\n\n const srcR =\n sourceRange.minRow +\n ((((r - sourceRange.minRow) % srcHeight) + srcHeight) % srcHeight);\n const srcC =\n sourceRange.minCol +\n ((((c - sourceRange.minCol) % srcWidth) + srcWidth) % srcWidth);\n\n const srcViewRow = store.getViewRow(srcR);\n const srcColDef = geom.columns[srcC];\n const dstColDef = geom.columns[c];\n if (!srcViewRow || srcViewRow.type !== 'data' || !srcColDef || !dstColDef) continue;\n\n let val = srcViewRow.data[srcColDef.id];\n\n // Smart Series increment for Account Code patterns (e.g. ACC-100001)\n if (typeof val === 'string' && /^([A-Za-z-]+)(\\d+)$/.test(val) && srcC === c) {\n const m = val.match(/^([A-Za-z-]+)(\\d+)$/);\n if (m) {\n const offset = r - srcR;\n val = `${m[1]}${Number(m[2]) + offset}`;\n }\n } else if (srcC !== c) {\n const plugin = ColumnTypeRegistry.get(dstColDef.type);\n if (plugin.parseClipboard) {\n val = plugin.parseClipboard(String(val ?? ''), dstColDef);\n }\n }\n\n updates.push({\n rowIndex: r,\n rowKey: dstRow.data.id ?? r,\n colDef: dstColDef,\n newValue: val,\n });\n }\n }\n\n selectionRef.current.selectionRange = {\n startRow: targetRange.minRow,\n startCol: targetRange.minCol,\n endRow: targetRange.maxRow,\n endCol: targetRange.maxCol,\n };\n setSelectionVersion((v) => v + 1);\n applyBatchCellUpdates(updates, 'AutoFill Cells');\n }\n }\n };\n\n window.addEventListener('mousemove', handleWindowMouseMove);\n window.addEventListener('mouseup', handleWindowMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleWindowMouseMove);\n window.removeEventListener('mouseup', handleWindowMouseUp);\n };\n }, [\n isDraggingSelection,\n isDraggingRowNumbers,\n fillDragState,\n store,\n applyBatchCellUpdates,\n handleDuplicateCellDown,\n requestRender,\n ]);\n\n // ============================================================================\n // NAVIGATION & AUTO-SCROLL INTO VIEW\n // ============================================================================\n const ensureCellVisible = (row: number, col: number) => {\n const geom = geometryRef.current;\n const sc = scrollContainerRef.current;\n if (!sc) return;\n\n const cellTop = geom.headerHeight + row * geom.rowHeight;\n const cellBottom = cellTop + geom.rowHeight;\n\n if (cellTop < sc.scrollTop + geom.headerHeight) {\n sc.scrollTop = cellTop - geom.headerHeight;\n } else if (cellBottom > sc.scrollTop + sc.clientHeight) {\n sc.scrollTop = cellBottom - sc.clientHeight;\n }\n\n const colRect = geom.getColumnScreenRect(col, sc.scrollLeft);\n if (!colRect.isFrozen) {\n if (colRect.x < geom.totalFrozenWidth) {\n sc.scrollLeft -= geom.totalFrozenWidth - colRect.x;\n } else if (colRect.x + colRect.width > sc.clientWidth) {\n sc.scrollLeft += colRect.x + colRect.width - sc.clientWidth;\n }\n }\n };\n\n const moveSelection = (dRow: number, dCol: number, isRangeSelect: boolean = false) => {\n const geom = geometryRef.current;\n const rowCount = store.getRowCount();\n if (rowCount === 0 || geom.columns.length === 0) return;\n\n const cur = isRangeSelect && selectionRef.current.selectionRange\n ? {\n row: selectionRef.current.selectionRange.endRow,\n col: selectionRef.current.selectionRange.endCol,\n }\n : selectionRef.current.activeCell;\n\n const nextRow = Math.max(0, Math.min(rowCount - 1, cur.row + dRow));\n const nextCol = Math.max(0, Math.min(geom.columns.length - 1, cur.col + dCol));\n\n if (isRangeSelect) {\n selectionRef.current.setRangeEnd(nextRow, nextCol);\n } else {\n selectionRef.current.setActiveCell(nextRow, nextCol);\n setSelectedCellUI({ row: nextRow, col: nextCol });\n }\n\n setSelectionVersion((v) => v + 1);\n ensureCellVisible(nextRow, nextCol);\n requestRender();\n };\n\n // ============================================================================\n // OPEN INLINE MICRO-DOM EDITOR\n // ============================================================================\n const openEditorForCell = (row: number, col: number, initialChar?: string) => {\n const geom = geometryRef.current;\n const colDef = geom.columns[col];\n const vRow = store.getViewRow(row);\n if (!vRow || vRow.type === 'group') return;\n\n if (colDef?.type === 'sparkline') {\n setSparklineModal({\n rowIndex: row,\n rowData: vRow.data,\n column: colDef,\n points: Array.isArray(vRow.data[colDef.id]) ? vRow.data[colDef.id] : [],\n });\n return;\n }\n\n if (!canEditCell(vRow.data, colDef, row, false)) return;\n\n const plugin = ColumnTypeRegistry.get(colDef.type);\n if (!plugin.editorComponent) return;\n\n const screenRect = geom.getColumnScreenRect(col, scrollPosRef.current.left);\n const y = geom.headerHeight + row * geom.rowHeight - scrollPosRef.current.top;\n\n setEditorValidationError(null);\n setIsEditorValidating(false);\n setActiveOverlay({\n row,\n col,\n x: screenRect.x,\n y,\n width: screenRect.width,\n height: geom.rowHeight,\n column: colDef,\n initialValue: vRow.data[colDef.id],\n initialChar,\n });\n };\n\n // ============================================================================\n // VIEWPORT MOUSE EVENTS (FIXED COORDINATE SYSTEM)\n // ============================================================================\n const getViewportCoords = (e: React.MouseEvent): { x: number; y: number; onScrollbar: boolean } => {\n const surface = gridSurfaceRef.current;\n const sc = scrollContainerRef.current;\n if (!surface) return { x: 0, y: 0, onScrollbar: false };\n\n const rect = surface.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n\n const onScrollbar = Boolean(\n sc && (x >= sc.clientWidth || y >= sc.clientHeight)\n );\n return { x, y, onScrollbar };\n };\n\n const handleSurfaceMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {\n if (resizingCol || isDraggingSelection || isDraggingRowNumbers || fillDragState) return;\n const { x, y, onScrollbar } = getViewportCoords(e);\n if (onScrollbar) {\n setCursorStyle('default');\n return;\n }\n\n const geom = geometryRef.current;\n const sl = scrollPosRef.current.left;\n const st = scrollPosRef.current.top;\n\n // 1. Check Resize Handle\n const resizeHit = geom.hitTestColumnResize(x, y, sl);\n if (resizeHit) {\n setCursorStyle('col-resize');\n if (hoveredFilterColRef.current !== null) {\n hoveredFilterColRef.current = null;\n requestRender();\n }\n return;\n }\n\n // 2. Check Header & Filter Button Hover\n if (y <= geom.headerHeight) {\n const headerHit = geom.hitTestHeader(x, y, sl);\n const nextFilterCol = headerHit?.isFilterIconHit ? headerHit.colIndex : null;\n if (hoveredFilterColRef.current !== nextFilterCol) {\n hoveredFilterColRef.current = nextFilterCol;\n requestRender();\n }\n setCursorStyle(headerHit ? 'pointer' : 'default');\n return;\n }\n\n if (hoveredFilterColRef.current !== null) {\n hoveredFilterColRef.current = null;\n requestRender();\n }\n\n // 2b. Check Group Row Hover (Across entire row width including left chevron)\n const hoveredRowIdx = Math.floor((y - geom.headerHeight + st) / geom.rowHeight);\n if (hoveredRowIdx >= 0 && hoveredRowIdx < store.getRowCount()) {\n const hVRow = store.getViewRow(hoveredRowIdx);\n if (hVRow && hVRow.type === 'group') {\n if (hoveredCellRef.current?.row !== hoveredRowIdx || hoveredCellRef.current?.col !== -1) {\n hoveredCellRef.current = { row: hoveredRowIdx, col: -1 };\n requestRender();\n }\n setCursorStyle('pointer');\n return;\n }\n }\n\n // 3. Check Fill Handle / Right Duplicate Button Hover (Skip for sparkline / action / readonly)\n const normForHover = selectionRef.current.getNormalizedRange();\n const activeColForHover = geom.columns[normForHover.maxCol];\n const isSpecialNonDup =\n !activeColForHover ||\n activeColForHover.type === 'sparkline' ||\n activeColForHover.type === 'action' ||\n CanvasRenderer.isColumnReadonly(activeColForHover, permissions);\n\n if (!isSpecialNonDup) {\n const fhHit = geom.hitTestFillHandle(x, y, sl, st, selectionRef.current);\n if (fhHit) {\n setCursorStyle(fhHit === 'corner' ? 'crosshair' : 'copy');\n return;\n }\n }\n\n // 4. Check Row Number Gutter\n if (x <= geom.rowNumberWidth) {\n setCursorStyle('pointer');\n return;\n }\n\n // 5. Cell Hover\n const hit = geom.hitTest(x, y, sl, st, store.getRowCount());\n if (\n hit?.row !== hoveredCellRef.current?.row ||\n hit?.col !== hoveredCellRef.current?.col\n ) {\n hoveredCellRef.current = hit ? { row: hit.row, col: hit.col } : null;\n requestRender();\n }\n setCursorStyle('cell');\n };\n\n const handleSurfaceMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {\n if (e.button !== 0) return; // Only left click here; right click handled in onContextMenu\n\n const { x, y, onScrollbar } = getViewportCoords(e);\n if (onScrollbar) return; // Let native scrollbar handle thumb dragging\n\n if (activeOverlay) setActiveOverlay(null);\n if (headerFilterState) setHeaderFilterState(null);\n if (contextMenu) setContextMenu(null);\n\n const geom = geometryRef.current;\n const sl = scrollPosRef.current.left;\n const st = scrollPosRef.current.top;\n const rowCount = store.getRowCount();\n\n // A. Column Resize Handle\n const resizeHit = geom.hitTestColumnResize(x, y, sl);\n if (resizeHit) {\n const col = geom.columns[resizeHit.colIndex];\n setResizingCol({\n colIndex: resizeHit.colIndex,\n colId: col.id,\n startX: e.clientX,\n initialWidth: col.width,\n });\n return;\n }\n\n // B. Top-Left Select-All Box\n if (x <= geom.rowNumberWidth && y <= geom.headerHeight) {\n if (rowCount > 0 && geom.columns.length > 0) {\n selectionRef.current.setActiveCell(0, 0);\n selectionRef.current.setRangeEnd(rowCount - 1, geom.columns.length - 1);\n setSelectedCellUI({ row: 0, col: 0 });\n setSelectionVersion((v) => v + 1);\n requestRender();\n }\n return;\n }\n\n // C. Header Click (Sort or Filter Funnel Button)\n if (y <= geom.headerHeight && x > geom.rowNumberWidth) {\n const headerHit = geom.hitTestHeader(x, y, sl);\n if (headerHit) {\n if (headerHit.isFilterIconHit && permissions.allowFiltering !== false) {\n setHeaderFilterState({\n column: headerHit.column,\n rect: {\n x: headerHit.headerX,\n y: 0,\n width: headerHit.headerWidth,\n height: geom.headerHeight,\n },\n });\n } else {\n handleHeaderSort(headerHit.colIndex, e.shiftKey);\n }\n }\n return;\n }\n\n // C2. Group Row Click (Works anywhere across the group row, including the left ▶/▼ chevron!)\n if (y > geom.headerHeight) {\n const clickedRowIdx = Math.floor((y - geom.headerHeight + st) / geom.rowHeight);\n if (clickedRowIdx >= 0 && clickedRowIdx < rowCount) {\n const clickedVRow = store.getViewRow(clickedRowIdx);\n if (clickedVRow && clickedVRow.type === 'group') {\n store.toggleGroup(clickedVRow.groupKey);\n setStoreVersion((v) => v + 1);\n requestRender();\n containerRef.current?.focus();\n return;\n }\n }\n }\n\n // D. Fill Handle or Right-Side Cell Duplicate Handle\n const normForDup = selectionRef.current.getNormalizedRange();\n const activeColForDup = geom.columns[normForDup.maxCol];\n const isSpecialNonDupCol =\n !activeColForDup ||\n activeColForDup.type === 'sparkline' ||\n activeColForDup.type === 'action' ||\n CanvasRenderer.isColumnReadonly(activeColForDup, permissions);\n\n const canDup =\n !isSpecialNonDupCol &&\n permissions.mode !== 'read' &&\n permissions.mode !== 'readonly' &&\n permissions.allowUpdating !== false &&\n permissions.allowDuplicating !== false;\n\n if (canDup) {\n const fhHit = geom.hitTestFillHandle(x, y, sl, st, selectionRef.current);\n if (fhHit) {\n const norm = selectionRef.current.getNormalizedRange();\n setFillDragState({\n mode: fhHit,\n sourceRange: norm,\n targetRange: norm,\n });\n return;\n }\n }\n\n // E. Row Number Gutter Click (Select Full Row)\n const rowNumHit = geom.hitTestRowNumber(x, y, st, rowCount);\n if (rowNumHit !== null && geom.columns.length > 0) {\n if (e.shiftKey) {\n selectionRef.current.setRangeEnd(rowNumHit, geom.columns.length - 1);\n } else {\n selectionRef.current.setActiveCell(rowNumHit, 0);\n selectionRef.current.setRangeEnd(rowNumHit, geom.columns.length - 1);\n setSelectedCellUI({ row: rowNumHit, col: 0 });\n }\n setIsDraggingRowNumbers(true);\n setSelectionVersion((v) => v + 1);\n requestRender();\n containerRef.current?.focus();\n return;\n }\n\n // F. Data Cell Click\n const hit = geom.hitTest(x, y, sl, st, rowCount);\n if (!hit) return;\n\n const vRow = store.getViewRow(hit.row);\n // Group Header Expand/Collapse\n if (vRow && vRow.type === 'group') {\n store.toggleGroup(vRow.groupKey);\n return;\n }\n\n if (e.shiftKey) {\n selectionRef.current.setRangeEnd(hit.row, hit.col);\n } else {\n selectionRef.current.setActiveCell(hit.row, hit.col);\n setSelectedCellUI({ row: hit.row, col: hit.col });\n setIsDraggingSelection(true);\n }\n setSelectionVersion((v) => v + 1);\n\n const colDef = geom.columns[hit.col];\n const plugin = ColumnTypeRegistry.get(colDef.type);\n\n // Clicking the expand icon (or clicking a sparkline cell) opens the Detailed Trend Chart Modal\n if (colDef.type === 'sparkline' && vRow && vRow.type === 'data') {\n if (hit.localX > colDef.width - 28) {\n setIsDraggingSelection(false);\n setSparklineModal({\n rowIndex: hit.row,\n rowData: vRow.data,\n column: colDef,\n points: Array.isArray(vRow.data[colDef.id]) ? vRow.data[colDef.id] : [],\n });\n requestRender();\n return;\n }\n }\n\n if (plugin.onPointerDown && vRow && vRow.type === 'data') {\n // Action column works even in read mode; mutable plugins check canEditCell\n const isAction = colDef.type === 'action';\n if (isAction || canEditCell(vRow.data, colDef, hit.row, false)) {\n let shouldFocusContainer = true;\n const res = plugin.onPointerDown({\n localX: hit.localX,\n localY: hit.localY,\n value: vRow.data[colDef.id],\n row: vRow.data,\n rowIndex: hit.row,\n column: colDef,\n setValue: (newVal) => {\n commitSingleCellEdit(hit.row, colDef, newVal, true);\n },\n });\n\n if (res.shouldOpenEditor) {\n shouldFocusContainer = false;\n setIsDraggingSelection(false);\n openEditorForCell(hit.row, hit.col);\n }\n\n requestRender();\n if (shouldFocusContainer) {\n containerRef.current?.focus();\n }\n return;\n }\n }\n\n requestRender();\n containerRef.current?.focus();\n };\n\n const handleSurfaceDoubleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n const { x, y, onScrollbar } = getViewportCoords(e);\n if (onScrollbar) return;\n\n const geom = geometryRef.current;\n const sl = scrollPosRef.current.left;\n const st = scrollPosRef.current.top;\n\n // Double-clicking Fill Handle -> duplicate down!\n const fhHit = geom.hitTestFillHandle(x, y, sl, st, selectionRef.current);\n if (fhHit) {\n handleDuplicateCellDown();\n return;\n }\n\n const hit = geom.hitTest(x, y, sl, st, store.getRowCount());\n if (!hit) return;\n\n setIsDraggingSelection(false);\n openEditorForCell(hit.row, hit.col);\n };\n\n const handleSurfaceContextMenu = (e: React.MouseEvent<HTMLDivElement>) => {\n e.preventDefault();\n const { x, y, onScrollbar } = getViewportCoords(e);\n if (onScrollbar) return;\n\n if (activeOverlay) setActiveOverlay(null);\n if (headerFilterState) setHeaderFilterState(null);\n\n const geom = geometryRef.current;\n const sl = scrollPosRef.current.left;\n const st = scrollPosRef.current.top;\n const rowCount = store.getRowCount();\n\n // 1. Header Right-Click\n if (y <= geom.headerHeight && x > geom.rowNumberWidth) {\n const headerHit = geom.hitTestHeader(x, y, sl);\n if (headerHit) {\n setContextMenu({\n targetType: 'header',\n x,\n y,\n row: 0,\n col: headerHit.colIndex,\n column: headerHit.column,\n });\n }\n return;\n }\n\n // 1b. Group Row Right-Click\n if (y > geom.headerHeight) {\n const clickedRowIdx = Math.floor((y - geom.headerHeight + st) / geom.rowHeight);\n if (clickedRowIdx >= 0 && clickedRowIdx < rowCount) {\n const gRow = store.getViewRow(clickedRowIdx);\n if (gRow && gRow.type === 'group') {\n const groupCol = geom.columns.find((c) => c.id === gRow.field) || geom.columns[0];\n setContextMenu({\n targetType: 'cell',\n x,\n y,\n row: clickedRowIdx,\n col: 0,\n column: groupCol,\n rowData: {},\n });\n return;\n }\n }\n }\n\n // 2. Row Number Right-Click\n const rowNumHit = geom.hitTestRowNumber(x, y, st, rowCount);\n if (rowNumHit !== null) {\n const vRow = store.getViewRow(rowNumHit);\n if (vRow && vRow.type === 'data') {\n selectionRef.current.setActiveCell(rowNumHit, 0);\n selectionRef.current.setRangeEnd(rowNumHit, geom.columns.length - 1);\n setSelectedCellUI({ row: rowNumHit, col: 0 });\n setSelectionVersion((v) => v + 1);\n requestRender();\n\n setContextMenu({\n targetType: 'rownumber',\n x,\n y,\n row: rowNumHit,\n col: 0,\n column: geom.columns[0],\n rowData: vRow.data,\n });\n }\n return;\n }\n\n // 3. Cell Right-Click\n const hit = geom.hitTest(x, y, sl, st, rowCount);\n if (!hit) return;\n\n const vRow = store.getViewRow(hit.row);\n if (!vRow || vRow.type !== 'data') return;\n\n if (!selectionRef.current.isCellSelected(hit.row, hit.col)) {\n selectionRef.current.setActiveCell(hit.row, hit.col);\n setSelectedCellUI({ row: hit.row, col: hit.col });\n setSelectionVersion((v) => v + 1);\n requestRender();\n }\n\n setContextMenu({\n targetType: 'cell',\n x,\n y,\n row: hit.row,\n col: hit.col,\n column: geom.columns[hit.col],\n rowData: vRow.data,\n });\n };\n\n // ============================================================================\n // CLEAR SELECTED CELLS\n // ============================================================================\n const handleClearSelectedCells = useCallback(() => {\n const norm = selectionRef.current.getNormalizedRange();\n const geom = geometryRef.current;\n const updates: Array<{ rowIndex: number; rowKey: any; colDef: ColumnDef; newValue: any }> = [];\n\n for (let r = norm.minRow; r <= norm.maxRow; r++) {\n const vRow = store.getViewRow(r);\n if (!vRow || vRow.type !== 'data') continue;\n for (let c = norm.minCol; c <= norm.maxCol; c++) {\n const colDef = geom.columns[c];\n if (!colDef) continue;\n const emptyVal =\n colDef.type === 'number' || colDef.type === 'currency' || colDef.type === 'progress' || colDef.type === 'rating'\n ? 0\n : colDef.type === 'boolean'\n ? false\n : '';\n updates.push({\n rowIndex: r,\n rowKey: vRow.data.id ?? r,\n colDef,\n newValue: emptyVal,\n });\n }\n }\n\n applyBatchCellUpdates(updates, 'Clear Cells');\n }, [store, applyBatchCellUpdates]);\n\n // ============================================================================\n // EXCEL TSV CLIPBOARD COPY & PASTE\n // ============================================================================\n const buildSelectedTsv = useCallback((): string => {\n const norm = selectionRef.current.getNormalizedRange();\n const rowsText: string[] = [];\n\n for (let r = norm.minRow; r <= norm.maxRow; r++) {\n const vRow = store.getViewRow(r);\n if (!vRow || vRow.type === 'group') continue;\n\n const cellsText: string[] = [];\n for (let c = norm.minCol; c <= norm.maxCol; c++) {\n const colDef = geometryRef.current.columns[c];\n if (!colDef) continue;\n const val = vRow.data[colDef.id];\n const plugin = ColumnTypeRegistry.get(colDef.type);\n const formatted = plugin.formatClipboard\n ? plugin.formatClipboard(val, colDef)\n : String(val ?? '');\n cellsText.push(formatted);\n }\n rowsText.push(cellsText.join('\\t'));\n }\n\n return rowsText.join('\\n');\n }, [store]);\n\n const applyPastedTsv = useCallback(\n (text: string) => {\n if (!text) return;\n if (\n permissions.mode === 'read' ||\n permissions.mode === 'readonly' ||\n permissions.allowUpdating === false ||\n permissions.allowClipboardPaste === false\n ) {\n showToast(\n currentLocale.code.startsWith('tr')\n ? '🔒 Panodan yapıştırma yetkisi kapalı.'\n : '🔒 Clipboard paste is disabled by permissions.',\n 'warning'\n );\n return;\n }\n\n const lines = text.replace(/\\r/g, '').split('\\n');\n if (lines.length > 1 && lines[lines.length - 1] === '') {\n lines.pop();\n }\n\n const norm = selectionRef.current.getNormalizedRange();\n const geom = geometryRef.current;\n const updates: Array<{ rowIndex: number; rowKey: any; colDef: ColumnDef; newValue: any }> = [];\n\n // Excel Behavior: If a single cell is in clipboard and multiple cells are selected, fill entire selection!\n const isSingleClipboardValue = lines.length === 1 && !lines[0].includes('\\t');\n const hasMultiSelection = norm.maxRow > norm.minRow || norm.maxCol > norm.minCol;\n\n if (isSingleClipboardValue && hasMultiSelection) {\n const rawCellText = lines[0];\n for (let r = norm.minRow; r <= norm.maxRow; r++) {\n const vRow = store.getViewRow(r);\n if (!vRow || vRow.type !== 'data') continue;\n for (let c = norm.minCol; c <= norm.maxCol; c++) {\n const colDef = geom.columns[c];\n if (!colDef) continue;\n const plugin = ColumnTypeRegistry.get(colDef.type);\n const parsedVal = plugin.parseClipboard\n ? plugin.parseClipboard(rawCellText, colDef)\n : rawCellText.trim();\n updates.push({\n rowIndex: r,\n rowKey: vRow.data.id ?? r,\n colDef,\n newValue: parsedVal,\n });\n }\n }\n } else {\n const startRow = norm.minRow;\n const startCol = norm.minCol;\n\n lines.forEach((line, rOffset) => {\n const targetRow = startRow + rOffset;\n if (targetRow >= store.getRowCount()) return;\n\n const vRow = store.getViewRow(targetRow);\n if (!vRow || vRow.type !== 'data') return;\n\n const cells = line.split('\\t');\n cells.forEach((cellText, cOffset) => {\n const targetCol = startCol + cOffset;\n if (targetCol >= geom.columns.length) return;\n\n const colDef = geom.columns[targetCol];\n if (!colDef) return;\n const plugin = ColumnTypeRegistry.get(colDef.type);\n const parsedVal = plugin.parseClipboard\n ? plugin.parseClipboard(cellText, colDef)\n : cellText.trim();\n\n updates.push({\n rowIndex: targetRow,\n rowKey: vRow.data.id ?? targetRow,\n colDef,\n newValue: parsedVal,\n });\n });\n });\n }\n\n applyBatchCellUpdates(updates, 'Paste from Clipboard');\n },\n [permissions, store, applyBatchCellUpdates, currentLocale, showToast]\n );\n\n const handleCopy = (e: React.ClipboardEvent) => {\n if (activeOverlay) return;\n const { col } = selectionRef.current.activeCell;\n const colDef = geometryRef.current.columns[col];\n if (colDef?.type === 'sparkline') return;\n e.preventDefault();\n const tsv = buildSelectedTsv();\n internalClipboardRef.current = tsv;\n e.clipboardData.setData('text/plain', tsv);\n showToast(\n currentLocale.code.startsWith('tr')\n ? '📋 Seçili hücreler panoya kopyalandı (TSV).'\n : '📋 Selected range copied to clipboard (TSV).',\n 'info'\n );\n };\n\n const handlePaste = (e: React.ClipboardEvent) => {\n if (activeOverlay) return;\n const text = e.clipboardData.getData('text/plain') || internalClipboardRef.current;\n if (!text) return;\n e.preventDefault();\n applyPastedTsv(text);\n };\n\n // ============================================================================\n // KEYBOARD NAVIGATION & EXCEL SHORTCUTS\n // ============================================================================\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (activeOverlay) return;\n\n const { row, col } = selectionRef.current.activeCell;\n const colDef = geometryRef.current.columns[col];\n const vRow = store.getViewRow(row);\n\n // Excel Shortcuts with Ctrl / Meta\n if (e.ctrlKey || e.metaKey) {\n const k = e.key.toLowerCase();\n if (k === 'd') {\n e.preventDefault();\n handleDuplicateCellDown();\n return;\n }\n if (k === 'r') {\n e.preventDefault();\n handleDuplicateCellRight();\n return;\n }\n if (k === 'z') {\n e.preventDefault();\n if (e.shiftKey) historyRef.current.redo();\n else historyRef.current.undo();\n setStoreVersion((v) => v + 1);\n requestRender();\n return;\n }\n if (k === 'y') {\n e.preventDefault();\n historyRef.current.redo();\n setStoreVersion((v) => v + 1);\n requestRender();\n return;\n }\n if (k === 'a') {\n e.preventDefault();\n if (store.getRowCount() > 0 && geometryRef.current.columns.length > 0) {\n selectionRef.current.setActiveCell(0, 0);\n selectionRef.current.setRangeEnd(\n store.getRowCount() - 1,\n geometryRef.current.columns.length - 1\n );\n setSelectionVersion((v) => v + 1);\n requestRender();\n }\n return;\n }\n }\n\n // Shift+D for Row Duplication\n if (e.shiftKey && e.key === 'D' && !e.ctrlKey && !e.metaKey) {\n e.preventDefault();\n handleDuplicateRow(row);\n return;\n }\n\n // Toggle Group Row with Space or Enter\n if (vRow && vRow.type === 'group' && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n store.toggleGroup(vRow.groupKey);\n setStoreVersion((v) => v + 1);\n requestRender();\n return;\n }\n\n // Plugin-specific key handlers (Space toggle for Boolean, 1-5 for Rating, initial char for Text/Number)\n if (colDef && vRow && vRow.type === 'data' && !e.ctrlKey && !e.metaKey && !e.altKey) {\n const plugin = ColumnTypeRegistry.get(colDef.type);\n if (plugin.onKeyDown) {\n const isAction = colDef.type === 'action';\n if (isAction || canEditCell(vRow.data, colDef, row, true)) {\n const handled = plugin.onKeyDown({\n event: e,\n value: vRow.data[colDef.id],\n row: vRow.data,\n rowIndex: row,\n column: colDef,\n setValue: (newVal) => {\n commitSingleCellEdit(row, colDef, newVal, true);\n },\n openEditor: (char) => openEditorForCell(row, col, char),\n });\n if (handled) return;\n }\n }\n }\n\n switch (e.key) {\n case 'ArrowUp':\n e.preventDefault();\n moveSelection(-1, 0, e.shiftKey);\n break;\n case 'ArrowDown':\n e.preventDefault();\n moveSelection(1, 0, e.shiftKey);\n break;\n case 'ArrowLeft':\n e.preventDefault();\n moveSelection(0, -1, e.shiftKey);\n break;\n case 'ArrowRight':\n e.preventDefault();\n moveSelection(0, 1, e.shiftKey);\n break;\n case 'Tab':\n e.preventDefault();\n moveSelection(0, e.shiftKey ? -1 : 1);\n break;\n case 'Enter':\n case 'F2':\n e.preventDefault();\n openEditorForCell(row, col);\n break;\n case 'Delete':\n case 'Backspace':\n e.preventDefault();\n handleClearSelectedCells();\n break;\n }\n };\n\n // ============================================================================\n // CSV EXPORT\n // ============================================================================\n const exportCsv = () => {\n if (permissions.allowExport === false) return;\n const cols = geometryRef.current.columns;\n const headerRow = cols.map((c) => `\"${c.title.replace(/\"/g, '\"\"')}\"`).join(',');\n const rows: string[] = [headerRow];\n\n for (let r = 0; r < store.getRowCount(); r++) {\n const vRow = store.getViewRow(r);\n if (!vRow || vRow.type === 'group') continue;\n\n const cellVals = cols.map((c) => {\n const val = vRow.data[c.id];\n return `\"${String(val ?? '').replace(/\"/g, '\"\"')}\"`;\n });\n rows.push(cellVals.join(','));\n }\n\n const blob = new Blob(['\\uFEFF' + rows.join('\\r\\n')], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.setAttribute('download', `sheetgl_export_${new Date().toISOString().slice(0, 10)}.csv`);\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n\n // ============================================================================\n // LIVE SELECTION AGGREGATIONS (EXCEL STATUS BAR STATS)\n // ============================================================================\n const selectionStats = useMemo<SelectionSummaryStats | null>(() => {\n const norm = selectionRef.current.getNormalizedRange();\n const rowSpan = norm.maxRow - norm.minRow + 1;\n const colSpan = norm.maxCol - norm.minCol + 1;\n if (rowSpan * colSpan <= 1) return null;\n\n // Cap calculation to 2,000 cells for instant 60 FPS responsiveness\n if (rowSpan * colSpan > 2000) {\n return {\n count: rowSpan * colSpan,\n numericCount: 0,\n sum: 0,\n avg: 0,\n min: 0,\n max: 0,\n };\n }\n\n let count = 0;\n let numericCount = 0;\n let sum = 0;\n let min = Infinity;\n let max = -Infinity;\n\n for (let r = norm.minRow; r <= norm.maxRow; r++) {\n const vRow = store.getViewRow(r);\n if (!vRow || vRow.type !== 'data') continue;\n for (let c = norm.minCol; c <= norm.maxCol; c++) {\n const colDef = geometryRef.current.columns[c];\n if (!colDef) continue;\n const val = vRow.data[colDef.id];\n if (val !== null && val !== undefined && val !== '') {\n count++;\n if (typeof val === 'number' && !isNaN(val)) {\n numericCount++;\n sum += val;\n if (val < min) min = val;\n if (val > max) max = val;\n }\n }\n }\n }\n\n return {\n count,\n numericCount,\n sum,\n avg: numericCount > 0 ? sum / numericCount : 0,\n min: numericCount > 0 ? min : 0,\n max: numericCount > 0 ? max : 0,\n };\n }, [store, selectionVersion, storeVersion]);\n\n // Active Cell & Pending Batch Changes Info\n const currentColumn = geometryRef.current.columns[selectedCellUI.col];\n const activeViewRow = store.getViewRow(selectedCellUI.row);\n const currentCellValue =\n activeViewRow && activeViewRow.type === 'data' && currentColumn\n ? activeViewRow.data[currentColumn.id]\n : '';\n const isActiveCellEditable = Boolean(\n activeViewRow &&\n activeViewRow.type === 'data' &&\n currentColumn &&\n canEditCell(activeViewRow.data, currentColumn, selectedCellUI.row, true)\n );\n\n const pendingChanges = store.getPendingChanges?.();\n const pendingChangesCount =\n (pendingChanges?.inserted?.length || 0) +\n (pendingChanges?.updated?.length || 0) +\n (pendingChanges?.deleted?.length || 0);\n\n const normRange = selectionRef.current.getNormalizedRange();\n const selectionSpan = {\n rows: normRange.maxRow - normRange.minRow + 1,\n cols: normRange.maxCol - normRange.minCol + 1,\n };\n\n return (\n <div\n ref={containerRef}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n onCopy={handleCopy}\n onPaste={handlePaste}\n className={`sheetgl-container ${className || ''}`}\n style={{\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n height: '100%',\n outline: 'none',\n backgroundColor: resolvedTheme.canvas.bg,\n color: resolvedTheme.canvas.cellText,\n fontFamily: resolvedTheme.fontFamily,\n boxSizing: 'border-box',\n overflow: activeOverlay || headerFilterState || contextMenu ? 'visible' : 'hidden',\n position: 'relative',\n zIndex: activeOverlay || headerFilterState || contextMenu ? 60 : undefined,\n ...style,\n }}\n >\n {/* 1. TOP TOOLBAR */}\n <ToolBar\n theme={resolvedTheme}\n locale={currentLocale}\n currentThemeName={typeof currentThemeName === 'string' ? currentThemeName : 'custom'}\n onThemeChange={setCurrentThemeName}\n onLocaleChange={(code) => setCurrentLocale(LocaleEngine.resolve(code))}\n searchKeyword={searchKeyword}\n onSearchChange={(k) => {\n setSearchKeyword(k);\n store.setSearch(k);\n }}\n onExportCsv={exportCsv}\n groups={groups.map((g) => g.selector)}\n onToggleGroupColumn={handleToggleGroupColumn}\n onExpandAllGroups={() => {\n store.expandAllGroups?.();\n setStoreVersion((v) => v + 1);\n requestRender();\n }}\n onCollapseAllGroups={() => {\n store.collapseAllGroups?.();\n if (scrollContainerRef.current) {\n scrollContainerRef.current.scrollTop = 0;\n }\n scrollPosRef.current.top = 0;\n setStoreVersion((v) => v + 1);\n requestRender();\n }}\n availableColumns={columns}\n onUpdateColumn={handleUpdateColumnDef}\n summaryTypes={store.getSummaryTypes?.()}\n onChangeSummaryType={handleChangeSummaryType}\n permissions={permissions}\n onPermissionsChange={handleUpdatePermissions}\n onAddRow={() => handleInsertRow(0)}\n onDuplicateRow={() => handleDuplicateRow(selectedCellUI.row)}\n onDeleteRow={() => handleDeleteRow(selectedCellUI.row)}\n canUndo={historyRef.current.canUndo()}\n canRedo={historyRef.current.canRedo()}\n onUndo={() => {\n historyRef.current.undo();\n setStoreVersion((v) => v + 1);\n requestRender();\n }}\n onRedo={() => {\n historyRef.current.redo();\n setStoreVersion((v) => v + 1);\n requestRender();\n }}\n pendingChangesCount={pendingChangesCount}\n onSaveBatch={handleSaveBatch}\n onDiscardBatch={handleDiscardBatch}\n activeFilterCount={Object.keys(columnFilters).length}\n onClearAllFilters={handleClearAllFilters}\n toolbarConfig={toolbarConfig}\n onUpdateToolbarConfig={handleUpdateToolbarConfig}\n summaryConfig={summaryConfig}\n onUpdateSummaryConfig={handleUpdateSummaryConfig}\n />\n\n {/* 2. FORMULA & COORDINATE BAR */}\n {showFormulaBar && (\n <FormulaBar\n activeCoords={selectedCellUI}\n selectionSpan={selectionSpan}\n column={currentColumn}\n currentValue={currentCellValue}\n isEditable={isActiveCellEditable}\n buttonDisplayMode={toolbarConfig.buttonDisplayMode || 'icon-text'}\n canDuplicate={\n permissions.mode !== 'read' &&\n permissions.mode !== 'readonly' &&\n permissions.allowDuplicating !== false\n }\n onCommitValue={(newVal) => {\n if (currentColumn) {\n commitSingleCellEdit(selectedCellUI.row, currentColumn, newVal, true);\n }\n }}\n onDuplicateDown={handleDuplicateCellDown}\n onDuplicateRight={handleDuplicateCellRight}\n onDuplicateRow={() => handleDuplicateRow(selectedCellUI.row)}\n onOpenSparklineModal={() => {\n if (\n currentColumn?.type === 'sparkline' &&\n activeViewRow &&\n activeViewRow.type === 'data'\n ) {\n setSparklineModal({\n rowIndex: selectedCellUI.row,\n rowData: activeViewRow.data,\n column: currentColumn,\n points: Array.isArray(activeViewRow.data[currentColumn.id])\n ? activeViewRow.data[currentColumn.id]\n : [],\n });\n }\n }}\n theme={resolvedTheme}\n locale={currentLocale}\n />\n )}\n\n {/* 3. MAIN GRID SURFACE (CANVAS + VIRTUAL SCROLLBAR + MICRO-DOM OVERLAYS) */}\n <div\n ref={gridSurfaceRef}\n onMouseDown={handleSurfaceMouseDown}\n onMouseMove={handleSurfaceMouseMove}\n onDoubleClick={handleSurfaceDoubleClick}\n onContextMenu={handleSurfaceContextMenu}\n style={{\n position: 'relative',\n flex: 1,\n overflow: activeOverlay || headerFilterState || contextMenu ? 'visible' : 'hidden',\n cursor: resizingCol ? 'col-resize' : cursorStyle,\n }}\n >\n {/* Physical 2D Canvas */}\n <canvas\n ref={canvasRef}\n style={{\n position: 'absolute',\n inset: 0,\n width: '100%',\n height: '100%',\n display: 'block',\n pointerEvents: 'none',\n zIndex: 10,\n }}\n />\n\n {/* Virtual Scroll Container */}\n <div\n ref={scrollContainerRef}\n onScroll={(e) => {\n const target = e.currentTarget;\n scrollPosRef.current = {\n left: target.scrollLeft,\n top: target.scrollTop,\n };\n const topRow = Math.max(\n 1,\n Math.floor(target.scrollTop / geometryRef.current.rowHeight) + 1\n );\n setScrollIndicator({ visible: true, row: topRow });\n if (scrollHideTimerRef.current) {\n window.clearTimeout(scrollHideTimerRef.current);\n }\n scrollHideTimerRef.current = window.setTimeout(() => {\n setScrollIndicator((prev) => ({ ...prev, visible: false }));\n }, 900);\n\n if (activeOverlay) setActiveOverlay(null);\n requestRender();\n }}\n style={{\n position: 'absolute',\n inset: 0,\n overflow: 'auto',\n zIndex: 20,\n }}\n >\n {/* Virtual Sizing Spacer (Adds 18px right buffer so vertical scrollbar never covers rightmost header filter icon) */}\n <div\n style={{\n width:\n geometryRef.current.totalFrozenWidth +\n geometryRef.current.totalScrollableWidth +\n 18,\n height:\n geometryRef.current.headerHeight +\n store.getRowCount() * geometryRef.current.rowHeight,\n pointerEvents: 'none',\n }}\n />\n </div>\n\n {/* Right-Side Scroll Indicator Pill & Quick Jump Buttons */}\n {scrollIndicator.visible && store.getRowCount() > 30 && (\n <div\n style={{\n position: 'absolute',\n right: 24,\n top: Math.max(\n geometryRef.current.headerHeight + 8,\n Math.min(\n (gridSurfaceRef.current?.clientHeight || 400) - 44,\n geometryRef.current.headerHeight +\n ((scrollIndicator.row / Math.max(1, store.getRowCount())) *\n ((gridSurfaceRef.current?.clientHeight || 400) -\n geometryRef.current.headerHeight -\n 44))\n )\n ),\n zIndex: 90,\n padding: '4px 10px',\n borderRadius: 6,\n backgroundColor: resolvedTheme.dom.popoverBg,\n color: resolvedTheme.dom.popoverText,\n border: `1px solid ${resolvedTheme.dom.popoverBorder}`,\n boxShadow: resolvedTheme.dom.popoverShadow,\n fontSize: 11,\n fontWeight: 700,\n pointerEvents: 'none',\n fontFamily: 'monospace',\n }}\n >\n {currentLocale.rows}: {scrollIndicator.row.toLocaleString(currentLocale.code)} /{' '}\n {store.getRowCount().toLocaleString(currentLocale.code)}\n </div>\n )}\n\n {/* Right-Bottom Quick Scroll Navigation Controls */}\n {store.getRowCount() > 25 && (\n <div\n onMouseDown={(e) => e.stopPropagation()}\n style={{\n position: 'absolute',\n right: 22,\n bottom: 18,\n zIndex: 85,\n display: 'flex',\n flexDirection: 'column',\n gap: 4,\n }}\n >\n <button\n type=\"button\"\n title=\"Scroll to Top\"\n onClick={() => {\n if (scrollContainerRef.current) {\n scrollContainerRef.current.scrollTo({ top: 0, behavior: 'smooth' });\n }\n }}\n style={{\n width: 26,\n height: 26,\n borderRadius: 6,\n border: `1px solid ${resolvedTheme.dom.popoverBorder}`,\n backgroundColor: resolvedTheme.dom.popoverBg,\n color: resolvedTheme.dom.popoverText,\n boxShadow: resolvedTheme.dom.popoverShadow,\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <MaterialIcon name=\"vertical_align_top\" size={16} />\n </button>\n <button\n type=\"button\"\n title=\"Scroll to Bottom\"\n onClick={() => {\n if (scrollContainerRef.current) {\n scrollContainerRef.current.scrollTo({\n top: scrollContainerRef.current.scrollHeight,\n behavior: 'smooth',\n });\n }\n }}\n style={{\n width: 26,\n height: 26,\n borderRadius: 6,\n border: `1px solid ${resolvedTheme.dom.popoverBorder}`,\n backgroundColor: resolvedTheme.dom.popoverBg,\n color: resolvedTheme.dom.popoverText,\n boxShadow: resolvedTheme.dom.popoverShadow,\n cursor: 'pointer',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <MaterialIcon name=\"vertical_align_bottom\" size={16} />\n </button>\n </div>\n )}\n\n {/* Toast Feedback Notification */}\n {toastMessage && (\n <div\n style={{\n position: 'absolute',\n bottom: 16,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 200,\n padding: '7px 14px',\n borderRadius: 8,\n backgroundColor:\n toastMessage.type === 'warning'\n ? 'rgba(255, 159, 10, 0.95)'\n : toastMessage.type === 'success'\n ? 'rgba(48, 209, 88, 0.95)'\n : resolvedTheme.dom.popoverBg,\n color:\n toastMessage.type === 'warning' || toastMessage.type === 'success'\n ? '#FFFFFF'\n : resolvedTheme.dom.popoverText,\n border: `1px solid ${resolvedTheme.dom.popoverBorder}`,\n boxShadow: resolvedTheme.dom.popoverShadow,\n fontSize: 12,\n fontWeight: 600,\n pointerEvents: 'none',\n }}\n >\n {toastMessage.text}\n </div>\n )}\n\n {/* 4. DYNAMIC MICRO-DOM CELL EDITOR */}\n {activeOverlay && (\n <DynamicCellEditor\n overlay={activeOverlay}\n theme={resolvedTheme}\n locale={currentLocale}\n validationError={editorValidationError}\n isValidating={isEditorValidating}\n onCommit={async (newVal, moveDir) => {\n if (isEditorValidating) return;\n const targetRow = activeOverlay.row;\n const targetCol = activeOverlay.column;\n const hasAsync =\n targetCol.validationRules?.some((r) => r.type === 'async') ||\n Boolean(targetCol.validator);\n\n if (hasAsync) {\n setIsEditorValidating(true);\n }\n const ok = await commitSingleCellEdit(targetRow, targetCol, newVal, true);\n if (hasAsync) {\n setIsEditorValidating(false);\n }\n\n if (ok) {\n setEditorValidationError(null);\n setActiveOverlay(null);\n if (moveDir === 'down') moveSelection(1, 0);\n else if (moveDir === 'right') moveSelection(0, 1);\n else if (moveDir === 'left') moveSelection(0, -1);\n else requestRender();\n containerRef.current?.focus();\n } else {\n // Keep editor open with user's attempted value so they can fix the validation error or press Escape\n setActiveOverlay((prev) =>\n prev\n ? {\n ...prev,\n initialValue: newVal,\n initialChar: undefined,\n }\n : null\n );\n }\n }}\n onCancel={() => {\n setEditorValidationError(null);\n setIsEditorValidating(false);\n setActiveOverlay(null);\n containerRef.current?.focus();\n }}\n />\n )}\n\n {/* 5. EXCEL HEADER FILTER POPOVER */}\n {headerFilterState && (\n <HeaderFilterPopover\n column={headerFilterState.column}\n anchorRect={headerFilterState.rect}\n viewportWidth={gridSurfaceRef.current?.clientWidth || 1000}\n theme={resolvedTheme}\n locale={currentLocale}\n store={store}\n activeFilter={columnFilters[headerFilterState.column.id]}\n onApply={(filterState) => {\n handleApplyColumnFilter(headerFilterState.column.id, filterState);\n setHeaderFilterState(null);\n }}\n onSort={(desc) => {\n const colIdx = geometryRef.current.columns.findIndex(\n (c) => c.id === headerFilterState.column.id\n );\n if (colIdx !== -1) {\n handleHeaderSort(colIdx, false, desc);\n }\n }}\n onToggleGroup={() => handleToggleGroupColumn(headerFilterState.column.id)}\n isGrouped={groups.some((g) => g.selector === headerFilterState.column.id)}\n onClose={() => setHeaderFilterState(null)}\n />\n )}\n\n {/* 6. EXCEL RIGHT-CLICK CONTEXT MENU */}\n {contextMenu && (\n <ContextMenuOverlay\n menu={contextMenu}\n viewportWidth={gridSurfaceRef.current?.clientWidth || 1000}\n viewportHeight={gridSurfaceRef.current?.clientHeight || 600}\n theme={resolvedTheme}\n locale={currentLocale}\n permissions={permissions}\n isCellEditable={\n contextMenu.rowData && contextMenu.column\n ? canEditCell(contextMenu.rowData, contextMenu.column, contextMenu.row, true)\n : false\n }\n isGroupedByCol={\n contextMenu.column\n ? groups.some((g) => g.selector === contextMenu.column!.id)\n : false\n }\n currentSummaryType={\n contextMenu.column\n ? store.getSummaryTypes?.()[contextMenu.column.id] || 'none'\n : 'none'\n }\n onCopy={() => {\n const tsv = buildSelectedTsv();\n internalClipboardRef.current = tsv;\n navigator.clipboard?.writeText(tsv).catch(() => {});\n showToast(\n currentLocale.code.startsWith('tr')\n ? '📋 Kopyalandı (TSV)'\n : '📋 Copied to clipboard (TSV)',\n 'info'\n );\n }}\n onPaste={() => {\n if (navigator.clipboard?.readText) {\n navigator.clipboard\n .readText()\n .then((txt) => applyPastedTsv(txt || internalClipboardRef.current))\n .catch(() => applyPastedTsv(internalClipboardRef.current));\n } else {\n applyPastedTsv(internalClipboardRef.current);\n }\n }}\n onDuplicateCellDown={handleDuplicateCellDown}\n onDuplicateCellRight={handleDuplicateCellRight}\n onDuplicateRow={() => handleDuplicateRow(contextMenu.row)}\n onInsertRowAbove={() => handleInsertRow(Math.max(0, contextMenu.row - 1))}\n onInsertRowBelow={() => handleInsertRow(contextMenu.row)}\n onClearCells={handleClearSelectedCells}\n onDeleteRow={() => handleDeleteRow(contextMenu.row)}\n onFilterByCellValue={() => {\n if (contextMenu.column && contextMenu.rowData) {\n const val = contextMenu.rowData[contextMenu.column.id];\n handleApplyColumnFilter(contextMenu.column.id, {\n columnId: contextMenu.column.id,\n mode: 'values',\n selectedValues: [val],\n });\n }\n }}\n onToggleGroupColumn={() => {\n if (contextMenu.column) {\n handleToggleGroupColumn(contextMenu.column.id);\n }\n }}\n onSortColumn={(desc) => {\n handleHeaderSort(contextMenu.col, false, desc);\n }}\n onTogglePinColumn={() => {\n if (contextMenu.column) {\n handleUpdateColumnDef(contextMenu.column.id, {\n pinned: contextMenu.column.pinned ? false : 'left',\n });\n }\n }}\n onToggleColumnReadonly={() => {\n if (contextMenu.column) {\n const nextRO = !contextMenu.column.readonly;\n handleUpdateColumnDef(contextMenu.column.id, {\n readonly: nextRO,\n permission: nextRO ? 'readonly' : 'write',\n });\n }\n }}\n onChangeSummaryType={(sType) => {\n if (contextMenu.column) {\n handleChangeSummaryType(contextMenu.column.id, sType);\n }\n }}\n onOpenSparklineModal={() => {\n if (contextMenu.column?.type === 'sparkline' && contextMenu.rowData) {\n setSparklineModal({\n rowIndex: contextMenu.row,\n rowData: contextMenu.rowData,\n column: contextMenu.column,\n points: Array.isArray(contextMenu.rowData[contextMenu.column.id])\n ? contextMenu.rowData[contextMenu.column.id]\n : [],\n });\n }\n }}\n onClose={() => setContextMenu(null)}\n />\n )}\n\n {/* 6b. DETAILED SPARKLINE TREND CHART MODAL DIALOG */}\n {sparklineModal && (\n <SparklineModalOverlay\n modal={sparklineModal}\n theme={resolvedTheme}\n locale={currentLocale}\n onClose={() => {\n setSparklineModal(null);\n containerRef.current?.focus();\n }}\n />\n )}\n </div>\n\n {/* 7. CONFIGURABLE SUMMARY FOOTER & LIVE RANGE SELECTION STATS */}\n <SummaryFooter\n summaries={store.getSummaries()}\n summaryTypes={store.getSummaryTypes?.()}\n onChangeSummaryType={handleChangeSummaryType}\n summaryConfig={summaryConfig}\n onUpdateSummaryConfig={handleUpdateSummaryConfig}\n selectionStats={selectionStats}\n columns={columns}\n theme={resolvedTheme}\n locale={currentLocale}\n totalRowCount={store.getRowCount()}\n />\n </div>\n );\n};\n","export class BlockCache<T = any> {\n private cache = new Map<number, T[]>();\n private readonly maxBlocks: number;\n public readonly blockSize: number;\n\n constructor(blockSize: number = 100, maxBlocks: number = 30) {\n this.blockSize = blockSize;\n this.maxBlocks = maxBlocks;\n }\n\n public getBlockIndex(rowIndex: number): number {\n return Math.floor(rowIndex / this.blockSize);\n }\n\n public getRow(rowIndex: number): T | undefined {\n const blockIndex = this.getBlockIndex(rowIndex);\n const block = this.cache.get(blockIndex);\n if (!block) return undefined;\n\n // LRU tazeleme\n this.cache.delete(blockIndex);\n this.cache.set(blockIndex, block);\n\n const offset = rowIndex % this.blockSize;\n return block[offset];\n }\n\n public setBlock(blockIndex: number, rows: T[]): void {\n if (this.cache.has(blockIndex)) {\n this.cache.delete(blockIndex);\n } else if (this.cache.size >= this.maxBlocks) {\n // En eski bloğu sil (LRU eviction)\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.cache.delete(oldestKey);\n }\n }\n this.cache.set(blockIndex, rows);\n }\n\n public hasBlock(blockIndex: number): boolean {\n return this.cache.has(blockIndex);\n }\n\n public clear(): void {\n this.cache.clear();\n }\n}\n","import { IDataStore, BatchChanges, RemoteOperationsConfig } from '../types/store';\nimport { FilterDescriptor, SortDescriptor, DistinctItem } from '../types/filter';\nimport { GroupDescriptor, VirtualRow } from '../types/group';\nimport { BlockCache } from './BlockCache';\n\nexport interface RemoteDataStoreOptions {\n url: string;\n keyField?: string;\n remoteOperations?: RemoteOperationsConfig;\n headers?: Record<string, string>;\n blockSize?: number;\n}\n\nexport class RemoteDataStore implements IDataStore {\n private url: string;\n private keyField: string;\n private headers: Record<string, string>;\n private cache: BlockCache<any>;\n\n private totalCount: number = 0;\n private summaries?: Record<string, number>;\n private currentFilter: FilterDescriptor | null = null;\n private currentSearch: string = '';\n private currentSort: SortDescriptor[] = [];\n private currentGroups: GroupDescriptor[] = [];\n\n private currentAbortController: AbortController | null = null;\n private pendingBlockRequests = new Set<number>();\n private listeners = new Map<string, Set<(...args: any[]) => void>>();\n\n constructor(options: RemoteDataStoreOptions) {\n this.url = options.url;\n this.keyField = options.keyField || 'id';\n this.headers = options.headers || { 'Content-Type': 'application/json' };\n this.cache = new BlockCache<any>(options.blockSize || 50, 30);\n }\n\n public isRemote(): boolean {\n return true;\n }\n\n public getRowCount(): number {\n return this.totalCount;\n }\n\n public getViewRow(rowIndex: number): VirtualRow | undefined {\n const data = this.cache.getRow(rowIndex);\n if (!data) return undefined;\n return {\n type: 'data',\n rawIndex: rowIndex,\n data,\n };\n }\n\n public async ensureRange(startRow: number, endRow: number): Promise<void> {\n const startBlock = this.cache.getBlockIndex(startRow);\n const endBlock = this.cache.getBlockIndex(endRow);\n\n const missingBlocks: number[] = [];\n for (let b = startBlock; b <= endBlock; b++) {\n if (!this.cache.hasBlock(b) && !this.pendingBlockRequests.has(b)) {\n missingBlocks.push(b);\n }\n }\n\n if (missingBlocks.length === 0) return Promise.resolve();\n\n // Eksik blokları sunucudan çek\n return Promise.all(missingBlocks.map((b) => this.fetchBlock(b))).then(() => {});\n }\n\n private async fetchBlock(blockIndex: number): Promise<void> {\n this.pendingBlockRequests.add(blockIndex);\n const skip = blockIndex * this.cache.blockSize;\n const take = this.cache.blockSize;\n\n const payload = {\n skip,\n take,\n requireTotalCount: true,\n filter: this.currentFilter,\n sort: this.currentSort,\n search: this.currentSearch,\n group: this.currentGroups,\n };\n\n try {\n this.emit('loading');\n const res = await fetch(this.url, {\n method: 'POST',\n headers: this.headers,\n body: JSON.stringify(payload),\n });\n\n if (!res.ok) throw new Error(`HTTP Error: ${res.status}`);\n\n const json = await res.json();\n const rows = json.data || [];\n this.totalCount = json.totalCount ?? rows.length;\n if (json.summary) {\n this.summaries = json.summary;\n }\n\n this.cache.setBlock(blockIndex, rows);\n this.pendingBlockRequests.delete(blockIndex);\n this.emit('loaded');\n } catch (err: any) {\n this.pendingBlockRequests.delete(blockIndex);\n if (err.name !== 'AbortError') {\n this.emit('error', err);\n }\n }\n }\n\n public async setFilter(filter: FilterDescriptor | null): Promise<void> {\n this.currentFilter = filter;\n this.resetAndReload();\n return Promise.resolve();\n }\n\n public async setSearch(keyword: string): Promise<void> {\n this.currentSearch = keyword;\n this.resetAndReload();\n return Promise.resolve();\n }\n\n public async setSorting(sortRules: SortDescriptor[]): Promise<void> {\n this.currentSort = sortRules;\n this.resetAndReload();\n return Promise.resolve();\n }\n\n public async setGrouping(groupDescriptors: GroupDescriptor[]): Promise<void> {\n this.currentGroups = groupDescriptors;\n this.resetAndReload();\n return Promise.resolve();\n }\n\n public async toggleGroup(_groupKey: string): Promise<void> {\n // Sunucu taraflı lazy gruplama genişletmesi\n this.resetAndReload();\n return Promise.resolve();\n }\n\n public async setCell(rowKey: any, columnId: string, value: any): Promise<void> {\n try {\n await fetch(`${this.url}/${rowKey}`, {\n method: 'PATCH',\n headers: this.headers,\n body: JSON.stringify({ [columnId]: value }),\n });\n this.resetAndReload();\n } catch (err) {\n this.emit('error', err);\n }\n }\n\n public async commitBatch(changes: BatchChanges): Promise<void> {\n try {\n await fetch(`${this.url}/batch`, {\n method: 'POST',\n headers: this.headers,\n body: JSON.stringify(changes),\n });\n this.resetAndReload();\n } catch (err) {\n this.emit('error', err);\n }\n }\n\n public async getDistinctValues(columnId: string, search?: string): Promise<DistinctItem[]> {\n try {\n const distinctUrl = `${this.url}/distinct?column=${encodeURIComponent(columnId)}&search=${encodeURIComponent(search || '')}`;\n const res = await fetch(distinctUrl, {\n method: 'GET',\n headers: this.headers,\n });\n if (!res.ok) return [];\n const json = await res.json();\n return json.items || [];\n } catch {\n return [];\n }\n }\n\n public getSummaries(): Record<string, number> | undefined {\n return this.summaries;\n }\n\n public on(event: string, callback: (...args: any[]) => void): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(callback);\n }\n\n public off(event: string, callback: (...args: any[]) => void): void {\n this.listeners.get(event)?.delete(callback);\n }\n\n private emit(event: string, ...args: any[]): void {\n this.listeners.get(event)?.forEach((cb) => cb(...args));\n }\n\n private resetAndReload(): void {\n if (this.currentAbortController) {\n this.currentAbortController.abort();\n }\n this.currentAbortController = new AbortController();\n this.cache.clear();\n this.pendingBlockRequests.clear();\n this.fetchBlock(0);\n }\n}\n"],"mappings":"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"}
|