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.js","names":["_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","formatters","getFormatter","React","appleLight","appleDark","googleLight","googleDark","ThemeEngine","name","tokens","themeInput","s","el","theme","media","listener","onChange","e","GeometryEngine","rowHeight","headerHeight","columns","visibleCols","c","sum","acc","i","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","k","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","target","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","Fragment","validationError","isValidating","NUMERIC_COLUMN_TYPES","formatCellStructureValue","digits","sym","formatLiveNumericInput","thousandSep","decSep","cleaned","rawInput","isNeg","intFormatted","initialConditionInputDisplay","HeaderFilterPopover","isNumericCol","tab","setTab","useState","activeFilter","allItems","setAllItems","loading","setLoading","search","setSearch","selectedSet","setSelectedSet","listScrollTop","setListScrollTop","defaultOp","operator","setOperator","condVal1","setCondVal1","condVal2","setCondVal2","popoverRef","useRef","searchInputRef","condInputRef","useEffect","mounted","handleOutside","onClose","formatItemLabel","it","visibleItems","useMemo","q","conditionMatchCount","v1","v2","matched","total","itemCount","areAllVisibleChecked","isIndeterminate","toggleAllVisible","next","toggleSingleItem","handleApply","onApply","normalizedV1","n","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","keys","visit","level","maxAutoExpandLevel","buckets","items","bucketItems","groupKey","parentKey","data","expandedKeys","bucket","isExpanded","sf","count","min","max","bi","LocalDataStore","options","sample","key","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","useCallback","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","desc","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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"}
|