@gp-grid/react 0.20.0 → 0.22.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/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import React$1 from "react";
2
- import { CellDataType, CellPosition, CellRange, CellRendererParams, CellRendererParams as CellRendererParams$1, CellValue, CellValue as CellValue$1, CellValueChangedEvent, CellValueChangedEvent as CellValueChangedEvent$1, ColumnDefinition, ColumnDefinition as ColumnDefinition$1, ColumnFilterModel, DataSource, DataSource as DataSource$1, DataSourceLoadMode, DataSourceRange, DataSourceRequest, DataSourceResponse, EditRendererParams, EditRendererParams as EditRendererParams$1, FilterCondition, FilterModel, GridCore, GridCore as GridCore$1, GridInstruction, HeaderRendererParams, HeaderRendererParams as HeaderRendererParams$1, HighlightingOptions, MutableDataSource, MutableDataSource as MutableDataSource$1, ParallelSortOptions, RowCacheEviction, RowCacheOptions, RowId, RowId as RowId$1, RowLoadingMode, RowLoadingOptions, RowLoadingOptions as RowLoadingOptions$1, SortDirection, SortModel, createClientDataSource, createDataSourceFromArray, createMutableClientDataSource, createServerDataSource } from "@gp-grid/core";
2
+ import { CellDataType, CellPosition, CellRange, CellRendererParams, CellRendererParams as CellRendererParams$1, CellValue, CellValue as CellValue$1, CellValueChangedEvent, CellValueChangedEvent as CellValueChangedEvent$1, ColumnDefinition, ColumnDefinition as ColumnDefinition$1, ColumnFilterModel, DataSource, DataSource as DataSource$1, DataSourceLoadMode, DataSourceRange, DataSourceRequest, DataSourceResponse, EditRendererParams, EditRendererParams as EditRendererParams$1, FilterCondition, FilterModel, GridCore, GridCore as GridCore$1, GridFilterOperatorLabels, GridInstruction, GridLabels, GridLabels as GridLabels$1, HeaderRendererParams, HeaderRendererParams as HeaderRendererParams$1, HighlightingOptions, MutableDataSource, MutableDataSource as MutableDataSource$1, ParallelSortOptions, RowCacheEviction, RowCacheOptions, RowId, RowId as RowId$1, RowLoadingMode, RowLoadingOptions, RowLoadingOptions as RowLoadingOptions$1, SortDirection, SortModel, createClientDataSource, createDataSourceFromArray, createMutableClientDataSource, createServerDataSource } from "@gp-grid/core";
3
3
  //#region src/types.d.ts
4
4
  /** Ref handle exposed by the Grid component */
5
5
  interface GridRef<TData = unknown> {
@@ -72,6 +72,8 @@ interface GridProps<TData = unknown> {
72
72
  onColumnResized?: (colIndex: number, newWidth: number) => void;
73
73
  /** Called when a column is moved/reordered. */
74
74
  onColumnMoved?: (fromIndex: number, toIndex: number) => void;
75
+ /** Override any user-visible grid label. Unspecified labels fall back to English defaults. */
76
+ labels?: Partial<GridLabels$1>;
75
77
  }
76
78
  //#endregion
77
79
  //#region src/Grid.d.ts
@@ -130,4 +132,4 @@ interface UseGridDataResult<TData> {
130
132
  */
131
133
  declare const useGridData: <TData = unknown>(initialData: TData[], options: UseGridDataOptions<TData>) => UseGridDataResult<TData>;
132
134
  //#endregion
133
- export { type CellDataType, type CellPosition, type CellRange, type CellRendererParams, type CellValue, type CellValueChangedEvent, type ColumnDefinition, type ColumnFilterModel, type DataSource, type DataSourceLoadMode, type DataSourceRange, type DataSourceRequest, type DataSourceResponse, type EditRendererParams, type FilterCondition, type FilterModel, Grid as GpGrid, Grid, GridCore, type GridInstruction, type GridProps, type GridRef, type HeaderRendererParams, type MutableDataSource, type ReactCellRenderer, type ReactEditRenderer, type ReactHeaderRenderer, type RowCacheEviction, type RowCacheOptions, type RowId, type RowLoadingMode, type RowLoadingOptions, type SortDirection, type SortModel, type UseGridDataOptions, type UseGridDataResult, createClientDataSource, createDataSourceFromArray, createMutableClientDataSource, createServerDataSource, useGridData };
135
+ export { type CellDataType, type CellPosition, type CellRange, type CellRendererParams, type CellValue, type CellValueChangedEvent, type ColumnDefinition, type ColumnFilterModel, type DataSource, type DataSourceLoadMode, type DataSourceRange, type DataSourceRequest, type DataSourceResponse, type EditRendererParams, type FilterCondition, type FilterModel, Grid as GpGrid, Grid, GridCore, type GridFilterOperatorLabels, type GridInstruction, type GridLabels, type GridProps, type GridRef, type HeaderRendererParams, type MutableDataSource, type ReactCellRenderer, type ReactEditRenderer, type ReactHeaderRenderer, type RowCacheEviction, type RowCacheOptions, type RowId, type RowLoadingMode, type RowLoadingOptions, type SortDirection, type SortModel, type UseGridDataOptions, type UseGridDataResult, createClientDataSource, createDataSourceFromArray, createMutableClientDataSource, createServerDataSource, useGridData };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import e,{useCallback as t,useEffect as n,useLayoutEffect as r,useMemo as i,useReducer as a,useRef as o,useState as s}from"react";import{GridCore as c,GridCore as l,PendingCellTapController as u,ROW_DRAG_HOLD_MS as d,TAP_SLOP_PX as f,TouchScrollController as p,applyInstruction as m,bindPeekSelectAll as h,buildCellClasses as g,calculateFillHandlePosition as _,calculateFilterPopupPosition as v,calculateScaledColumnPositions as y,createClientDataSource as b,createClientDataSource as x,createDataSourceFromArray as S,createDataSourceFromArray as C,createInitialState as w,createInitialState as T,createMutableClientDataSource as E,createMutableClientDataSource as D,createServerDataSource as O,formatCellValue as k,getFieldValue as ee,getFieldValue as A,getTotalWidth as j,groupDistinctValues as M,isBlankCellValue as N,isCellActive as P,isCellEditing as F,isCellInFillPreview as I,isCellSelected as te,labelsForSelectedValues as ne,rawValuesForLabels as re,scrollCellIntoView as ie}from"@gp-grid/core";import{Fragment as L,jsx as R,jsxs as z}from"react/jsx-runtime";const ae=[{value:`contains`,label:`Contains`},{value:`notContains`,label:`Does not contain`},{value:`equals`,label:`Equals`},{value:`notEquals`,label:`Does not equal`},{value:`startsWith`,label:`Starts with`},{value:`endsWith`,label:`Ends with`},{value:`blank`,label:`Is blank`},{value:`notBlank`,label:`Is not blank`}];function B({distinctValues:e,valueFormatter:n,currentFilter:r,onApply:a,onClose:o}){let c=i(()=>M(e,n),[e,n]),l=c.length>100,[u,d]=s(i(()=>{if(!r?.conditions[0])return l?`condition`:`values`;let e=r.conditions[0];return e.selectedValues&&e.selectedValues.size>0?`values`:`condition`},[r,l])),f=i(()=>{if(!r?.conditions[0])return new Set;let e=r.conditions[0];return e.selectedValues?ne(c,e.selectedValues):new Set},[r,c]),p=i(()=>r?.conditions[0]?r.conditions[0].includeBlank??!0:!0,[r]),[m,h]=s(``),[g,_]=s(f),[v,y]=s(p),[b,x]=s(i(()=>{if(!r?.conditions.length)return[{operator:`contains`,value:``,nextOperator:`and`}];let e=r.conditions[0];if(e.selectedValues&&e.selectedValues.size>0)return[{operator:`contains`,value:``,nextOperator:`and`}];let t=r.combination??`and`;return r.conditions.map(e=>{let n=e;return{operator:n.operator,value:n.value??``,nextOperator:n.nextOperator??t}})},[r])),S=i(()=>{if(!m)return c;let e=m.toLowerCase();return c.filter(t=>t.label.toLowerCase().includes(e))},[c,m]),C=i(()=>e.some(N),[e]),w=i(()=>S.every(e=>g.has(e.label))&&(!C||v),[S,g,C,v]),T=t(()=>{_(new Set(S.map(e=>e.label))),C&&y(!0)},[S,C]),E=t(()=>{_(new Set),y(!1)},[]),D=t(e=>{_(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),O=t((e,t)=>{x(n=>{let r=[...n];return r[e]={...r[e],...t},r})},[]),k=t(()=>{x(e=>[...e,{operator:`contains`,value:``,nextOperator:`and`}])},[]),ee=t(e=>{x(t=>t.filter((t,n)=>n!==e))},[]),A=t(()=>{if(u===`values`){if(c.every(e=>g.has(e.label))&&(!C||v)){a(null);return}a({conditions:[{type:`text`,operator:`equals`,selectedValues:re(c,g),includeBlank:v}],combination:`and`})}else{let e=b.filter(e=>e.operator===`blank`||e.operator===`notBlank`||e.value.trim()!==``);if(e.length===0){a(null);return}a({conditions:e.map(e=>({type:`text`,operator:e.operator,value:e.value,nextOperator:e.nextOperator})),combination:`and`})}},[u,c,g,v,C,b,a]),j=t(()=>{a(null)},[a]);return z(`div`,{className:`gp-grid-filter-content gp-grid-filter-text`,children:[!l&&z(`div`,{className:`gp-grid-filter-mode-toggle`,children:[R(`button`,{type:`button`,className:u===`values`?`active`:``,onClick:()=>d(`values`),children:`Values`}),R(`button`,{type:`button`,className:u===`condition`?`active`:``,onClick:()=>d(`condition`),children:`Condition`})]}),l&&u===`condition`&&z(`div`,{className:`gp-grid-filter-info`,children:[`Too many unique values (`,c.length,`). Use conditions to filter.`]}),u===`values`&&z(L,{children:[R(`input`,{className:`gp-grid-filter-search`,type:`text`,placeholder:`Search...`,value:m,onChange:e=>h(e.target.value),autoFocus:!0}),z(`div`,{className:`gp-grid-filter-actions`,children:[R(`button`,{type:`button`,onClick:T,disabled:w,children:`Select All`}),R(`button`,{type:`button`,onClick:E,children:`Deselect All`})]}),z(`div`,{className:`gp-grid-filter-list`,children:[C&&z(`label`,{className:`gp-grid-filter-option`,children:[R(`input`,{type:`checkbox`,checked:v,onChange:()=>y(!v)}),R(`span`,{className:`gp-grid-filter-blank`,children:`(Blanks)`})]}),S.map(e=>z(`label`,{className:`gp-grid-filter-option`,children:[R(`input`,{type:`checkbox`,checked:g.has(e.label),onChange:()=>D(e.label)}),R(`span`,{children:e.label})]},e.label))]})]}),u===`condition`&&z(L,{children:[b.map((e,t)=>z(`div`,{className:`gp-grid-filter-condition`,children:[t>0&&z(`div`,{className:`gp-grid-filter-combination`,children:[R(`button`,{type:`button`,className:b[t-1]?.nextOperator===`and`?`active`:``,onClick:()=>O(t-1,{nextOperator:`and`}),children:`AND`}),R(`button`,{type:`button`,className:b[t-1]?.nextOperator===`or`?`active`:``,onClick:()=>O(t-1,{nextOperator:`or`}),children:`OR`})]}),z(`div`,{className:`gp-grid-filter-row`,children:[R(`select`,{value:e.operator,onChange:e=>O(t,{operator:e.target.value}),autoFocus:t===0,children:ae.map(e=>R(`option`,{value:e.value,children:e.label},e.value))}),e.operator!==`blank`&&e.operator!==`notBlank`&&R(`input`,{type:`text`,value:e.value,onChange:e=>O(t,{value:e.target.value}),placeholder:`Value`,className:`gp-grid-filter-text-input`}),b.length>1&&R(`button`,{type:`button`,className:`gp-grid-filter-remove`,onClick:()=>ee(t),children:`×`})]})]},t)),R(`button`,{type:`button`,className:`gp-grid-filter-add`,onClick:k,children:`+ Add condition`})]}),z(`div`,{className:`gp-grid-filter-buttons`,children:[R(`button`,{type:`button`,className:`gp-grid-filter-btn-clear`,onClick:j,children:`Clear`}),R(`button`,{type:`button`,className:`gp-grid-filter-btn-apply`,onClick:A,children:`Apply`})]})]})}const V=[{value:`=`,label:`=`},{value:`!=`,label:`≠`},{value:`>`,label:`>`},{value:`<`,label:`<`},{value:`>=`,label:`≥`},{value:`<=`,label:`≤`},{value:`between`,label:`↔`},{value:`blank`,label:`Is blank`},{value:`notBlank`,label:`Not blank`}];function H({currentFilter:e,onApply:n,onClose:r}){let[a,o]=s(i(()=>{if(!e?.conditions.length)return[{operator:`=`,value:``,valueTo:``,nextOperator:`and`}];let t=e.combination??`and`;return e.conditions.map(e=>{let n=e;return{operator:n.operator,value:n.value==null?``:String(n.value),valueTo:n.valueTo==null?``:String(n.valueTo),nextOperator:n.nextOperator??t}})},[e])),c=t((e,t)=>{o(n=>{let r=[...n];return r[e]={...r[e],...t},r})},[]),l=t(()=>{o(e=>[...e,{operator:`=`,value:``,valueTo:``,nextOperator:`and`}])},[]),u=t(e=>{o(t=>t.filter((t,n)=>n!==e))},[]),d=t(()=>{let e=a.filter(e=>e.operator===`blank`||e.operator===`notBlank`?!0:e.operator===`between`?e.value!==``&&e.valueTo!==``:e.value!==``);if(e.length===0){n(null);return}n({conditions:e.map(e=>({type:`number`,operator:e.operator,value:e.value?parseFloat(e.value):void 0,valueTo:e.valueTo?parseFloat(e.valueTo):void 0,nextOperator:e.nextOperator})),combination:`and`})},[a,n]),f=t(()=>{n(null)},[n]);return z(`div`,{className:`gp-grid-filter-content gp-grid-filter-number`,children:[a.map((e,t)=>z(`div`,{className:`gp-grid-filter-condition`,children:[t>0&&z(`div`,{className:`gp-grid-filter-combination`,children:[R(`button`,{type:`button`,className:a[t-1]?.nextOperator===`and`?`active`:``,onClick:()=>c(t-1,{nextOperator:`and`}),children:`AND`}),R(`button`,{type:`button`,className:a[t-1]?.nextOperator===`or`?`active`:``,onClick:()=>c(t-1,{nextOperator:`or`}),children:`OR`})]}),z(`div`,{className:`gp-grid-filter-row`,children:[R(`select`,{value:e.operator,onChange:e=>c(t,{operator:e.target.value}),children:V.map(e=>R(`option`,{value:e.value,children:e.label},e.value))}),e.operator!==`blank`&&e.operator!==`notBlank`&&R(`input`,{type:`number`,value:e.value,onChange:e=>c(t,{value:e.target.value}),placeholder:`Value`}),e.operator===`between`&&z(L,{children:[R(`span`,{className:`gp-grid-filter-to`,children:`to`}),R(`input`,{type:`number`,value:e.valueTo,onChange:e=>c(t,{valueTo:e.target.value}),placeholder:`Value`})]}),a.length>1&&R(`button`,{type:`button`,className:`gp-grid-filter-remove`,onClick:()=>u(t),children:`×`})]})]},t)),R(`button`,{type:`button`,className:`gp-grid-filter-add`,onClick:l,children:`+ Add condition`}),z(`div`,{className:`gp-grid-filter-buttons`,children:[R(`button`,{type:`button`,className:`gp-grid-filter-btn-clear`,onClick:f,children:`Clear`}),R(`button`,{type:`button`,className:`gp-grid-filter-btn-apply`,onClick:d,children:`Apply`})]})]})}const U=[{value:`=`,label:`=`},{value:`!=`,label:`≠`},{value:`>`,label:`>`},{value:`<`,label:`<`},{value:`between`,label:`↔`},{value:`blank`,label:`Is blank`},{value:`notBlank`,label:`Not blank`}];function W(e){if(!e)return``;let t=typeof e==`string`?new Date(e):e;return isNaN(t.getTime())?``:t.toISOString().split(`T`)[0]}function oe({currentFilter:e,onApply:n,onClose:r}){let[a,o]=s(i(()=>{if(!e?.conditions.length)return[{operator:`=`,value:``,valueTo:``,nextOperator:`and`}];let t=e.combination??`and`;return e.conditions.map(e=>{let n=e;return{operator:n.operator,value:W(n.value),valueTo:W(n.valueTo),nextOperator:n.nextOperator??t}})},[e])),c=t((e,t)=>{o(n=>{let r=[...n];return r[e]={...r[e],...t},r})},[]),l=t(()=>{o(e=>[...e,{operator:`=`,value:``,valueTo:``,nextOperator:`and`}])},[]),u=t(e=>{o(t=>t.filter((t,n)=>n!==e))},[]),d=t(()=>{let e=a.filter(e=>e.operator===`blank`||e.operator===`notBlank`?!0:e.operator===`between`?e.value!==``&&e.valueTo!==``:e.value!==``);if(e.length===0){n(null);return}n({conditions:e.map(e=>({type:`date`,operator:e.operator,value:e.value||void 0,valueTo:e.valueTo||void 0,nextOperator:e.nextOperator})),combination:`and`})},[a,n]),f=t(()=>{n(null)},[n]);return z(`div`,{className:`gp-grid-filter-content gp-grid-filter-date`,children:[a.map((e,t)=>z(`div`,{className:`gp-grid-filter-condition`,children:[t>0&&z(`div`,{className:`gp-grid-filter-combination`,children:[R(`button`,{type:`button`,className:a[t-1]?.nextOperator===`and`?`active`:``,onClick:()=>c(t-1,{nextOperator:`and`}),children:`AND`}),R(`button`,{type:`button`,className:a[t-1]?.nextOperator===`or`?`active`:``,onClick:()=>c(t-1,{nextOperator:`or`}),children:`OR`})]}),z(`div`,{className:`gp-grid-filter-row`,children:[R(`select`,{value:e.operator,onChange:e=>c(t,{operator:e.target.value}),children:U.map(e=>R(`option`,{value:e.value,children:e.label},e.value))}),e.operator!==`blank`&&e.operator!==`notBlank`&&R(`input`,{type:`date`,value:e.value,onChange:e=>c(t,{value:e.target.value})}),e.operator===`between`&&z(L,{children:[R(`span`,{className:`gp-grid-filter-to`,children:`to`}),R(`input`,{type:`date`,value:e.valueTo,onChange:e=>c(t,{valueTo:e.target.value})})]}),a.length>1&&R(`button`,{type:`button`,className:`gp-grid-filter-remove`,onClick:()=>u(t),children:`×`})]})]},t)),R(`button`,{type:`button`,className:`gp-grid-filter-add`,onClick:l,children:`+ Add condition`}),z(`div`,{className:`gp-grid-filter-buttons`,children:[R(`button`,{type:`button`,className:`gp-grid-filter-btn-clear`,onClick:f,children:`Clear`}),R(`button`,{type:`button`,className:`gp-grid-filter-btn-apply`,onClick:d,children:`Apply`})]})]})}function se({column:e,colIndex:i,containerRef:a,distinctValues:c,currentFilter:l,onApply:u,onClose:d}){let f=o(null),[p,m]=s({position:`fixed`,zIndex:1e4,visibility:`hidden`}),h=t(()=>{let e=a.current,t=f.current;if(!e||!t)return;let n=e.querySelector(`[data-col-index="${i}"]`);if(!n)return;let r=v(n,t);m({position:`fixed`,top:r.top,left:r.left,minWidth:r.minWidth,zIndex:1e4,visibility:`visible`})},[a,i]);r(()=>{h()},[h]),n(()=>{let e=null,t=()=>{e===null&&(e=requestAnimationFrame(()=>{e=null,h()}))};return window.addEventListener(`scroll`,t,{passive:!0,capture:!0}),window.addEventListener(`resize`,t),()=>{window.removeEventListener(`scroll`,t,{capture:!0}),window.removeEventListener(`resize`,t),e!==null&&cancelAnimationFrame(e)}},[h]),n(()=>{let e=e=>{let t=e.target;t.closest(`.gp-grid-filter-icon`)||f.current&&!f.current.contains(t)&&d()},t=e=>{e.key===`Escape`&&d()};return requestAnimationFrame(()=>{document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t)}),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t)}},[d]);let g=t(t=>{u(e.colId??e.field,t),d()},[e,u,d]),_=e.cellDataType,y=_===`text`||_===`object`,b=_===`number`,x=_===`date`||_===`dateString`||_===`dateTime`||_===`dateTimeString`;return z(`div`,{ref:f,className:`gp-grid-filter-popup`,style:p,children:[z(`div`,{className:`gp-grid-filter-header`,children:[`Filter: `,e.headerName??e.field]}),y&&R(B,{distinctValues:c,valueFormatter:e.valueFormatter,currentFilter:l,onApply:g,onClose:d}),b&&R(H,{currentFilter:l,onApply:g,onClose:d}),x&&R(oe,{currentFilter:l,onApply:g,onClose:d}),!y&&!b&&!x&&R(B,{distinctValues:c,valueFormatter:e.valueFormatter,currentFilter:l,onApply:g,onClose:d})]})}const ce=e=>{let t=e.cellDataType;return t===`text`||t===`boolean`||t===`object`};function G(e){let{column:t,colIndex:n,sortDirection:r,sortIndex:i,sortable:a,filterable:o,hasFilter:s,coreRef:c,containerRef:l,headerRenderers:u,globalHeaderRenderer:d}=e,f=c.current,p={column:t,colIndex:n,sortDirection:r,sortIndex:i,sortable:a,filterable:o,hasFilter:s,onSort:(e,n)=>{f&&a&&f.setSort(t.colId??t.field,e,n)},onFilterClick:()=>{if(f&&o){let e=l.current?.querySelector(`[data-col-index="${n}"]`);if(e){let r=e.getBoundingClientRect();f.openFilterPopup(n,{top:r.top,left:r.left,width:r.width,height:r.height},ce(t))}}}};if(t.headerRenderer){if(typeof t.headerRenderer==`function`)return t.headerRenderer(p);let e=u[t.headerRenderer];if(e)return e(p)}return d?d(p):z(L,{children:[R(`span`,{className:`gp-grid-header-text`,children:t.headerName??t.field}),z(`span`,{className:`gp-grid-header-icons`,children:[a&&z(`span`,{className:`gp-grid-sort-arrows`,children:[z(`span`,{className:`gp-grid-sort-arrows-stack`,children:[R(`svg`,{className:`gp-grid-sort-arrow-up${r===`asc`?` active`:``}`,width:`8`,height:`6`,viewBox:`0 0 8 6`,children:R(`path`,{d:`M4 0L8 6H0L4 0Z`,fill:`currentColor`})}),R(`svg`,{className:`gp-grid-sort-arrow-down${r===`desc`?` active`:``}`,width:`8`,height:`6`,viewBox:`0 0 8 6`,children:R(`path`,{d:`M4 6L0 0H8L4 6Z`,fill:`currentColor`})})]}),i!==void 0&&i>0&&R(`span`,{className:`gp-grid-sort-index`,children:i})]}),o&&R(`span`,{className:`gp-grid-filter-icon${s?` active`:``}`,onPointerDown:e=>{e.stopPropagation(),e.preventDefault(),p.onFilterClick()},onClick:e=>{e.stopPropagation()},children:R(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`currentColor`,children:R(`path`,{d:`M4 4h16l-6 8v5l-4 2v-7L4 4z`})})})]})]})}const le=e=>{let{headerHeight:t,scrollLeft:n,contentWidth:r,totalWidth:i,isLoading:a,visibleColumnsWithIndices:o,columnPositions:s,columnWidths:c,headers:l,sortingEnabled:u,onHeaderMouseDown:d,onHeaderResizeMouseDown:f,coreRef:p,outerContainerRef:m,headerRenderers:h,globalHeaderRenderer:g}=e;return R(`div`,{className:`gp-grid-header${a?` gp-grid-header--loading`:``}`,style:{height:t},children:R(`div`,{style:{position:`absolute`,top:0,left:0,transform:`translateX(${-n}px)`,width:Math.max(r,i),height:t},children:o.map(({column:e,originalIndex:n},r)=>{let i=l.get(n),a=c[r]??0;return z(`div`,{className:`gp-grid-header-cell`,"data-col-index":n,style:{left:`${s[r]}px`,width:`${a}px`,height:`${t}px`},onPointerDown:e=>d(n,a,t,e),children:[G({column:e,colIndex:n,sortDirection:i?.sortDirection,sortIndex:i?.sortIndex,sortable:e.sortable!==!1&&u,filterable:e.filterable!==!1,hasFilter:i?.hasFilter??!1,coreRef:p,containerRef:m,headerRenderers:h,globalHeaderRenderer:g}),e.resizable!==!1&&R(`div`,{className:`gp-grid-header-resize-handle`,onPointerDown:e=>{e.stopPropagation(),f(n,a,e)}})]},e.colId??e.field)})})})};function ue(e){let{column:t,rowData:n,rowIndex:r,colIndex:i,isActive:a,isSelected:o,isEditing:s,cellRenderers:c,globalCellRenderer:l}=e,u=ee(n,t.field),d={value:t.valueFormatter?t.valueFormatter(u):u,rowData:n,column:t,rowIndex:r,colIndex:i,isActive:a,isSelected:o,isEditing:s};if(t.cellRenderer){if(typeof t.cellRenderer==`function`)return t.cellRenderer(d);let e=c[t.cellRenderer];if(e)return e(d)}return l?l(d):k(u,t.valueFormatter)}function K(e){let{column:t,rowData:n,rowIndex:r,colIndex:i,initialValue:a,coreRef:o,editRenderers:s,globalEditRenderer:c}=e,l=o.current;if(!l)return null;let u=A(n,t.field),d={value:t.valueFormatter?t.valueFormatter(u):u,rowData:n,column:t,rowIndex:r,colIndex:i,isActive:!0,isSelected:!0,isEditing:!0,initialValue:a,onValueChange:e=>l.updateEditValue(e),onCommit:()=>l.commitEdit(),onCancel:()=>l.cancelEdit()};if(t.editRenderer){if(typeof t.editRenderer==`function`)return t.editRenderer(d);let e=s[t.editRenderer];if(e)return e(d)}return c?c(d):R(`input`,{className:`gp-grid-edit-input`,type:`text`,defaultValue:a==null?``:String(a),autoFocus:!0,onFocus:e=>e.target.select(),onChange:e=>l.updateEditValue(e.target.value),onKeyDown:e=>{e.stopPropagation(),e.key===`Enter`?l.commitEdit():e.key===`Escape`?l.cancelEdit():e.key===`Tab`&&(e.preventDefault(),l.commitEdit(),l.selection.moveFocus(e.shiftKey?`left`:`right`,!1))},onBlur:()=>l.commitEdit()})}const de=e.forwardRef((e,t)=>{let{rowHeight:n,totalHeaderHeight:r,contentWidth:i,contentHeight:a,totalWidth:o,rowsWrapperOffset:s,activeCell:c,selectionRange:l,editingCell:u,error:d,isLoading:f,totalRows:p,slotsArray:m,visibleColumnsWithIndices:h,columnPositions:_,columnWidths:v,fillHandlePosition:y,dragState:b,onScroll:x,onCellMouseDown:S,onCellDoubleClick:C,onCellMouseEnter:w,onCellMouseLeave:T,onFillHandleMouseDown:E,coreRef:D,cellRenderers:O,editRenderers:A,globalCellRenderer:j,globalEditRenderer:M}=e;return z(`div`,{ref:t,style:{flex:1,overflow:`auto`,position:`relative`},onScroll:x,children:[R(`div`,{style:{width:Math.max(i,o),height:Math.max(a-r,0),position:`relative`,minWidth:`100%`},children:z(`div`,{className:`gp-grid-rows-wrapper`,style:{width:`${Math.max(i,o)}px`,transform:`translateY(${s}px)`},children:[m.map(e=>e.rowIndex<0?null:R(`div`,{className:[`gp-grid-row`,...D.current?.highlight?.computeRowClasses(e.rowIndex,e.rowData)??[]].filter(Boolean).join(` `),style:{position:`absolute`,top:0,left:0,transform:`translateY(${e.translateY}px)`,width:`${Math.max(i,o)}px`,height:`${n}px`},children:h.map(({column:t,originalIndex:r},i)=>{let a=F(e.rowIndex,r,u),o=P(e.rowIndex,r,c),s=te(e.rowIndex,r,l),d=g(o,s,a,I(e.rowIndex,r,b.dragType===`fill`,b.fillSourceRange,b.fillTarget)),f=D.current?.highlight?.computeCombinedCellClasses(e.rowIndex,r,t,e.rowData)??[],p=t.rowDrag===!0,m=[d,...f,p?`gp-grid-cell--row-drag-handle`:``].filter(Boolean).join(` `),h=t.tooltip===!1||a?``:k(ee(e.rowData,t.field),t.valueFormatter);return R(`div`,{className:m,"data-cell-row":e.rowIndex,"data-cell-col":r,title:h||void 0,style:{position:`absolute`,left:`${_[i]}px`,top:0,width:`${v[i]}px`,height:`${n}px`},onPointerDown:t=>S(e.rowIndex,r,t),onDoubleClick:()=>C(e.rowIndex,r),onMouseEnter:()=>w(e.rowIndex,r),onMouseLeave:T,children:a&&u?K({column:t,rowData:e.rowData,rowIndex:e.rowIndex,colIndex:r,initialValue:u.initialValue,coreRef:D,editRenderers:A,globalEditRenderer:M}):ue({column:t,rowData:e.rowData,rowIndex:e.rowIndex,colIndex:r,isActive:o,isSelected:s,isEditing:a,cellRenderers:O,globalCellRenderer:j})},`${e.slotId}-${r}`)})},e.slotId)),y&&!u&&R(`div`,{className:`gp-grid-fill-handle`,style:{top:y.top,left:y.left},onPointerDown:E}),b.dragType===`row-drag`&&b.rowDrag?.dropTargetIndex!==null&&R(`div`,{className:`gp-grid-row-drop-indicator`,style:{transform:`translateY(${b.rowDrag.dropIndicatorY}px)`,width:`${Math.max(i,o)}px`}})]})}),d&&z(`div`,{className:`gp-grid-error`,children:[`Error: `,d]}),!f&&!d&&p===0&&R(`div`,{className:`gp-grid-empty`,children:`No data to display`})]})}),q={top:0,left:0,width:0,visibility:`hidden`};function fe({peekCell:e,column:i,rowData:a,containerRef:c,cellRenderers:l,globalCellRenderer:u,onClose:d}){let f=o(null),[p,m]=s(q),g=t(()=>{let t=c.current,n=f.current;if(!t||!n)return;let r=t.querySelector(`[data-cell-row="${e.row}"][data-cell-col="${e.col}"]`);if(!r){d();return}let i=r.getBoundingClientRect();m({top:i.top,left:i.left,width:i.width,visibility:`visible`})},[c,e.row,e.col,d]);r(()=>{g()},[g]),n(()=>{let e=null,t=()=>{e===null&&(e=requestAnimationFrame(()=>{e=null,g()}))};return window.addEventListener(`scroll`,t,{passive:!0,capture:!0}),window.addEventListener(`resize`,t),()=>{window.removeEventListener(`scroll`,t,{capture:!0}),window.removeEventListener(`resize`,t),e!==null&&cancelAnimationFrame(e)}},[g]),n(()=>{let e=e=>{let t=e.target;f.current?.contains(t)||d()},t=requestAnimationFrame(()=>{document.addEventListener(`pointerdown`,e)});return()=>{cancelAnimationFrame(t),document.removeEventListener(`pointerdown`,e)}},[d]),n(()=>{let e=f.current;if(e)return h(e)},[]);let _=ue({column:i,rowData:a,rowIndex:e.row,colIndex:e.col,isActive:!0,isSelected:!1,isEditing:!1,cellRenderers:l,globalCellRenderer:u});return R(`div`,{ref:f,className:`gp-grid-cell-peek`,style:{position:`fixed`,top:p.top,left:p.left,width:p.width,visibility:p.visibility},children:_})}function pe(e,t){if(t.type===`RESET`)return w();let{instructions:n}=t;if(n.length===0)return e;let r=new Map(e.slots),i=new Map(e.headers),a={pendingScrollTop:null};for(let e of n){let t=m(e,r,i);t&&(a={...a,...t})}return{...e,...a,slots:r,headers:i}}function me(e,r,i,a){let{activeCell:c,selectionRange:l,editingCell:p,filterPopupOpen:m,rowHeight:h,headerHeight:g,columnPositions:_,columnWidths:v,visibleColumnsWithIndices:y,slots:b,rowsWrapperOffset:x}=a,S=o(null),C=o(null),w=o(null),T=o(null),E=o(null),D=t(e=>{e.preventDefault()},[]),O=o(null),k=t(()=>(O.current??=new u({getCore:()=>e.current,isBrowser:!0,onTapConfirmed:()=>r.current?.focus()}),O.current),[e,r]),[ee,A]=s({isDragging:!1,dragType:null,fillSourceRange:null,fillTarget:null,columnResize:null,columnMove:null,rowDrag:null});n(()=>{let t=e.current;t?.input&&t.input.updateDeps({getHeaderHeight:()=>g,getRowHeight:()=>h,getColumnPositions:()=>_,getColumnCount:()=>y.length,getOriginalColumnIndex:e=>{let t=y[e];return t?t.originalIndex:e}})},[e,g,h,_,y]);let j=t(()=>{let e=r.current;if(!e)return null;let t=e.getBoundingClientRect();return{top:t.top,left:t.left,width:t.width,height:t.height,scrollTop:e.scrollTop,scrollLeft:e.scrollLeft}},[r]),M=t((t,n)=>{S.current&&clearInterval(S.current),S.current=setInterval(()=>{let i=r.current,a=e.current;if(i){i.scrollTop+=n,i.scrollLeft+=t;let e=C.current;if(e&&a?.input){let t=j();t&&(a.input.handleDragMove(e,t),A(a.input.getDragState()))}}},16)},[r,e,j]),N=t(()=>{S.current&&=(clearInterval(S.current),null)},[]),P=e=>({clientX:e.clientX,clientY:e.clientY,button:e.button,shiftKey:e.shiftKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,pointerId:e.pointerId,pointerType:e.pointerType}),F=t(()=>{let t=t=>{t.preventDefault();let n=e.current,r=j();if(!n?.input||!r)return;let i=P(t);C.current=i;let a=n.input.handleDragMove(i,r);a&&(a.autoScroll?M(a.autoScroll.dx,a.autoScroll.dy):N(),A(n.input.getDragState()))},n=()=>{let i=e.current;i?.input&&(i.input.handleDragEnd(),A(i.input.getDragState())),C.current=null,N(),document.removeEventListener(`touchmove`,D),E.current!==null&&r.current&&(r.current.style.overflow=E.current,E.current=null),document.removeEventListener(`pointermove`,t),document.removeEventListener(`pointerup`,n),document.removeEventListener(`pointercancel`,n)};document.addEventListener(`pointermove`,t,{passive:!1}),document.addEventListener(`pointerup`,n),document.addEventListener(`pointercancel`,n)},[e,j,M,N]),I=t(()=>{w.current!==null&&(clearTimeout(w.current),w.current=null,e.current?.input?.cancelPendingRowDrag()),T.current=null},[e]),te=t((t,n,i)=>{let a=e.current;if(!a?.input)return;let o=a.input.handleCellMouseDown(t,n,P(i));if(o.focusContainer&&r.current?.focus(),o.startTap&&k().start(i.nativeEvent),o.startDrag===`selection`)a.input.startSelectionDrag(),A(a.input.getDragState()),F();else if(o.startDrag===`row-drag`)A(a.input.getDragState()),F();else if(o.startDrag===`row-drag-pending`){I(),T.current={pointerId:i.pointerId,target:i.currentTarget};let e=i.clientX,t=i.clientY,n=n=>{let r=n.clientX-e,i=n.clientY-t;(Math.abs(r)>f||Math.abs(i)>f)&&(I(),s())},o=()=>{I(),s()},s=()=>{document.removeEventListener(`pointermove`,n),document.removeEventListener(`pointerup`,o),document.removeEventListener(`pointercancel`,o)};document.addEventListener(`pointermove`,n),document.addEventListener(`pointerup`,o,{once:!0}),document.addEventListener(`pointercancel`,o,{once:!0}),w.current=setTimeout(()=>{w.current=null,s();let e=T.current;if(T.current=null,a.input.confirmPendingRowDrag()){if(r.current&&(E.current=r.current.style.overflow,r.current.style.overflow=`hidden`),document.addEventListener(`touchmove`,D,{passive:!1}),e)try{e.target.setPointerCapture(e.pointerId)}catch{}A(a.input.getDragState()),F()}},d)}},[e,r,F,I,k]),ne=t((t,n)=>{let r=e.current;r?.input&&r.input.handleCellDoubleClick(t,n)},[e]),re=t(t=>{let n=e.current;if(!n?.input)return;let r=n.input.handleFillHandleMouseDown(c,l,P(t));if(r.preventDefault&&t.preventDefault(),r.stopPropagation&&t.stopPropagation(),r.startDrag===`fill`){try{t.target.setPointerCapture(t.pointerId)}catch{}A(n.input.getDragState()),F()}},[e,c,l,F]),L=t((t,n)=>{let r=e.current;if(!r?.input)return;let a=i[t];if(!a)return;let o=a.colId??a.field;r.input.handleHeaderClick(o,n.shiftKey)},[e,i]),R=t((t,n,r,i)=>{let a=e.current;if(!a?.input)return;let o=a.input.handleHeaderMouseDown(t,n,r,P(i));if(o.preventDefault&&i.preventDefault(),o.stopPropagation&&i.stopPropagation(),o.startDrag===`column-move`){try{i.target.setPointerCapture(i.pointerId)}catch{}A(a.input.getDragState()),F()}},[e,F]),z=t((t,n,r)=>{let i=e.current;if(!i?.input)return;let a=i.input.handleHeaderResizeMouseDown(t,n,P(r));a.preventDefault&&r.preventDefault(),a.stopPropagation&&r.stopPropagation(),a.startDrag===`column-resize`&&(A(i.input.getDragState()),F())},[e,F]),ae=t(t=>{let n=e.current,i=r.current;if(!n?.input)return;let a=n.input.handleKeyDown({key:t.key,shiftKey:t.shiftKey,ctrlKey:t.ctrlKey,metaKey:t.metaKey},c,p,m);a.preventDefault&&t.preventDefault(),a.scrollToCell&&i&&ie(n,i,a.scrollToCell.row,h,b,x,{colIndex:a.scrollToCell.col,visibleColumns:y,columnPositions:_,columnWidths:v})},[e,r,c,p,m,h,b,x,y,_,v]),B=t(t=>{let n=e.current;if(!n||p!==null||m)return;let r=t.clipboardData.getData(`text/plain`);n.pasteClipboardText(r)&&t.preventDefault()},[e,p,m]),V=t((t,n)=>{let i=e.current,a=r.current;if(!i?.input||!a)return;let o=i.input.handleWheel(t.deltaY,t.deltaX,n);o&&(t.preventDefault(),a.scrollTop+=o.dy,a.scrollLeft+=o.dx)},[e,r]);return n(()=>()=>{N(),I(),O.current?.cancel(),document.removeEventListener(`touchmove`,D),E.current!==null&&r.current&&(r.current.style.overflow=E.current,E.current=null)},[N,I,D,r]),{handleCellMouseDown:te,handleCellDoubleClick:ne,handleFillHandleMouseDown:re,handleHeaderClick:L,handleHeaderMouseDown:R,handleHeaderResizeMouseDown:z,handleKeyDown:ae,handlePaste:B,handleWheel:V,dragState:ee}}function J(s){let{columns:c,dataSource:u,rowData:d,rowHeight:f,headerHeight:m=f,overscan:h=3,rowLoading:g,sortingEnabled:v=!0,darkMode:b=!1,wheelDampening:S=.1,maxFlingVelocity:w,cellRenderers:E={},editRenderers:D={},headerRenderers:O={},cellRenderer:k,editRenderer:ee,headerRenderer:A,initialWidth:M,initialHeight:N,gridRef:P,highlighting:F,getRowId:I,onCellValueChanged:te,loadingComponent:ne,rowDragEntireRow:re=!1,onRowDragEnd:ie,onColumnResized:ae,onColumnMoved:B}=s,V=o(null),H=o(null),U=o(null),W=o(null),oe=o(null),ce=o(!1),[G,ue]=a(pe,{initialWidth:M,initialHeight:N},T),K=m,q=o(null),J=q.current;(!J||J.providedDataSource!==u||J.rowData!==d)&&(J&&d&&d.length>1e4&&console.warn(`[gp-grid] rowData prop changed with ${d.length} rows — this triggers a full rebuild. Use useGridData() for efficient updates.`),J?.ownsDataSource&&J.dataSource.destroy?.(),u?q.current={dataSource:u,ownsDataSource:!1,providedDataSource:u,rowData:d}:d?q.current={dataSource:C(d),ownsDataSource:!0,providedDataSource:u,rowData:d}:q.current={dataSource:x([]),ownsDataSource:!0,providedDataSource:u,rowData:d});let{dataSource:Y}=q.current;n(()=>()=>{q.current?.ownsDataSource&&(q.current.dataSource.destroy?.(),q.current=null)},[]);let he=o(I);he.current=I;let ge=o(te);ge.current=te;let _e=o(ie);_e.current=ie;let ve=o(ae);ve.current=ae;let ye=o(B);ye.current=B;let be=o(F);be.current=F;let xe=o(Y);xe.current=Y;let X=G.columns??c,Z=i(()=>X.map((e,t)=>({column:e,originalIndex:t})).filter(({column:e})=>!e.hidden),[X]),{positions:Q,widths:Se}=i(()=>y(Z.map(e=>e.column),G.viewportWidth),[Z,G.viewportWidth]),Ce=j(Q),{handleCellMouseDown:we,handleCellDoubleClick:Te,handleFillHandleMouseDown:Ee,handleHeaderMouseDown:De,handleHeaderResizeMouseDown:Oe,handleKeyDown:ke,handlePaste:Ae,handleWheel:je,dragState:$}=me(U,H,X,{activeCell:G.activeCell,selectionRange:G.selectionRange,editingCell:G.editingCell,filterPopupOpen:G.filterPopup?.isOpen??!1,rowHeight:f,headerHeight:K,columnPositions:Q,columnWidths:Se,visibleColumnsWithIndices:Z,slots:G.slots,rowsWrapperOffset:G.rowsWrapperOffset});n(()=>{ce.current&&ue({type:`RESET`}),ce.current=!0;let e=new l({columns:c,dataSource:xe.current,rowHeight:f,headerHeight:K,overscan:h,maxFlingVelocity:w,rowLoading:g,sortingEnabled:v,highlighting:be.current,getRowId:he.current,onCellValueChanged:ge.current?e=>ge.current?.(e):void 0,rowDragEntireRow:re,onRowDragEnd:(e,t)=>_e.current?.(e,t),onColumnResized:(e,t)=>ve.current?.(e,t),onColumnMoved:(e,t)=>ye.current?.(e,t)});U.current=e,W.current?.syncCore(),e.input.updateDeps({getHeaderHeight:()=>K,getRowHeight:()=>f,getColumnPositions:()=>Q,getColumnCount:()=>Z.length,getOriginalColumnIndex:e=>{let t=Z[e];return t?t.originalIndex:e}}),P&&(P.current={core:e});let t=e.onBatchInstruction(e=>{ue({type:`BATCH_INSTRUCTIONS`,instructions:e})});e.initialize();let n=H.current;return n&&e.setViewport(n.scrollTop,n.scrollLeft,n.clientWidth,n.clientHeight),()=>{t(),e.destroy(),U.current=null,P&&(P.current=null)}},[c,f,K,h,w,g,v,P,re]),n(()=>{let e=U.current;if(!e)return;let t=oe.current;if(!t||t===Y){oe.current=Y;return}oe.current=Y,e.setDataSource(Y)},[Y]),n(()=>{let e=Y;if(e.subscribe)return e.subscribe(()=>{U.current?.refreshFromTransaction()})},[Y]),n(()=>{let e=U.current;!e?.highlight||!F||e.highlight.updateOptions(F)},[F]);let Me=t(()=>{let e=H.current,t=U.current;!e||!t||t.setViewport(e.scrollTop,e.scrollLeft,e.clientWidth,e.clientHeight)},[]);n(()=>{let e=H.current,t=U.current;if(!e||!t)return;if(typeof ResizeObserver>`u`){Me();return}let n=new ResizeObserver(()=>{t.setViewport(e.scrollTop,e.scrollLeft,e.clientWidth,e.clientHeight)});return n.observe(e),Me(),()=>n.disconnect()},[Me]),n(()=>{let e=H.current;if(!e)return;let t=e=>{je(e,S)};return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[je,S]),n(()=>{let e=new p({getCore:()=>U.current,getScrollEl:()=>H.current,isBrowser:typeof window<`u`});return W.current=e,e.attach(),()=>{e.detach(),W.current=null}},[]),r(()=>{if(G.pendingScrollTop!==null){let e=H.current;e&&(W.current?.stop(),e.scrollTop=G.pendingScrollTop)}},[G.pendingScrollTop]);let Ne=t((e,t)=>{let n=U.current;n&&n.setFilter(e,t)},[]),Pe=t(()=>{let e=U.current;e&&e.closeFilterPopup()},[]),Fe=t(()=>{U.current?.stopPeek()},[]),Ie=t((e,t)=>{U.current?.input.handleCellMouseEnter(e,t)},[]),Le=t(()=>{U.current?.input.handleCellMouseLeave()},[]),Re=i(()=>Array.from(G.slots.values()),[G.slots]),ze=i(()=>_({activeCell:G.activeCell,selectionRange:G.selectionRange,slots:G.slots,columns:X,visibleColumnsWithIndices:Z,columnPositions:Q,columnWidths:Se,rowHeight:f}),[G.activeCell,G.selectionRange,G.slots,f,Q,Se,X,Z]),[Be,Ve]=e.useState(0),He=t(()=>{let e=H.current;e&&(Ve(e.scrollLeft),Me())},[Me]);return z(`div`,{ref:V,className:`gp-grid-container${b?` gp-grid-container--dark`:``}`,style:{width:`100%`,height:`100%`,position:`relative`,display:`flex`,flexDirection:`column`},onKeyDown:ke,onPaste:Ae,tabIndex:0,children:[R(le,{headerHeight:m,scrollLeft:Be,contentWidth:G.contentWidth,totalWidth:Ce,isLoading:G.isLoading,visibleColumnsWithIndices:Z,columnPositions:Q,columnWidths:Se,headers:G.headers,sortingEnabled:v,onHeaderMouseDown:De,onHeaderResizeMouseDown:Oe,coreRef:U,outerContainerRef:V,headerRenderers:O,globalHeaderRenderer:A}),R(de,{ref:H,rowHeight:f,totalHeaderHeight:K,contentWidth:G.contentWidth,contentHeight:G.contentHeight,totalWidth:Ce,rowsWrapperOffset:G.rowsWrapperOffset,activeCell:G.activeCell,selectionRange:G.selectionRange,editingCell:G.editingCell,error:G.error,isLoading:G.isLoading,totalRows:G.totalRows,slotsArray:Re,visibleColumnsWithIndices:Z,columnPositions:Q,columnWidths:Se,fillHandlePosition:ze,dragState:$,onScroll:He,onCellMouseDown:we,onCellDoubleClick:Te,onCellMouseEnter:Ie,onCellMouseLeave:Le,onFillHandleMouseDown:Ee,coreRef:U,cellRenderers:E,editRenderers:D,globalCellRenderer:k,globalEditRenderer:ee}),G.isLoading&&z(`div`,{style:{position:`absolute`,top:m,left:0,right:0,bottom:0,zIndex:50,pointerEvents:`none`},children:[R(`div`,{className:`gp-grid-loading-overlay`}),ne?e.createElement(ne,{isLoading:!0}):R(`div`,{className:`gp-grid-loading`,children:R(`div`,{className:`gp-grid-loading-spinner`})})]}),G.filterPopup?.isOpen&&G.filterPopup.column&&R(se,{column:G.filterPopup.column,colIndex:G.filterPopup.colIndex,containerRef:V,distinctValues:G.filterPopup.distinctValues,currentFilter:G.filterPopup.currentFilter,onApply:Ne,onClose:Pe}),G.peekCell&&(()=>{let e=X[G.peekCell.col],t=Re.find(e=>e.rowIndex===G.peekCell.row);return!e||!t?null:R(fe,{peekCell:G.peekCell,column:e,rowData:t.rowData,containerRef:V,cellRenderers:E,globalCellRenderer:k,onClose:Fe})})(),$.dragType===`column-resize`&&$.columnResize&&(()=>{let e=Z.findIndex(e=>e.originalIndex===$.columnResize.colIndex);return e===-1?null:R(`div`,{className:`gp-grid-column-resize-line`,style:{left:(Q[e]??0)+$.columnResize.currentWidth-Be}})})(),$.dragType===`column-move`&&$.columnMove&&(()=>{let e=$.columnMove,t=X[e.sourceColIndex],n=t?.headerName??t?.field??``;return z(L,{children:[R(`div`,{className:`gp-grid-column-move-ghost`,style:{left:e.currentX-e.ghostWidth/2,top:e.currentY-e.ghostHeight/2,width:e.ghostWidth,height:e.ghostHeight},children:n}),e.dropTargetIndex!==null&&R(`div`,{className:`gp-grid-column-drop-indicator`,style:{position:`absolute`,top:0,left:(Q[e.dropTargetIndex]??0)-Be,height:m}})]})})(),$.dragType===`row-drag`&&$.rowDrag&&R(`div`,{className:`gp-grid-row-drag-ghost`,style:{left:$.rowDrag.currentX+12,top:$.rowDrag.currentY-f/2,width:Math.min(300,Ce),height:f}})]})}const Y=(e,t)=>{let n=i(()=>D(e,{getRowId:t.getRowId,debounceMs:t.debounceMs??0,useWorker:t.useWorker,parallelSort:t.parallelSort}),[]);return{dataSource:n,updateRow:n.updateRow,addRows:n.addRows,removeRows:n.removeRows,updateCell:n.updateCell,clear:n.clear,getRowById:n.getRowById,getTotalRowCount:n.getTotalRowCount,flushTransactions:n.flushTransactions}};export{J as GpGrid,J as Grid,c as GridCore,b as createClientDataSource,S as createDataSourceFromArray,E as createMutableClientDataSource,O as createServerDataSource,Y as useGridData};
1
+ import e,{useCallback as t,useEffect as n,useLayoutEffect as r,useMemo as i,useReducer as a,useRef as o,useState as s}from"react";import{GridCore as c,GridCore as l,PendingCellTapController as u,ROW_DRAG_HOLD_MS as d,TAP_SLOP_PX as f,TouchScrollController as p,applyInstruction as m,bindPeekSelectAll as h,buildCellClasses as g,calculateFillHandlePosition as _,calculateFilterPopupPosition as v,calculateScaledColumnPositions as y,createClientDataSource as b,createClientDataSource as x,createDataSourceFromArray as S,createDataSourceFromArray as C,createInitialState as w,createInitialState as T,createMutableClientDataSource as E,createMutableClientDataSource as D,createServerDataSource as O,formatCellValue as k,formatLabel as A,getDateOperatorOptions as j,getFieldValue as M,getFieldValue as N,getNumberOperatorOptions as P,getTextOperatorOptions as F,getTotalWidth as I,groupDistinctValues as L,isBlankCellValue as ee,isCellActive as te,isCellEditing as ne,isCellInFillPreview as re,isCellSelected as ie,labelsForSelectedValues as ae,rawValuesForLabels as oe,resolveGridLabels as se,scrollCellIntoView as ce}from"@gp-grid/core";import{Fragment as R,jsx as z,jsxs as B}from"react/jsx-runtime";function V({distinctValues:e,valueFormatter:n,currentFilter:r,labels:a,onApply:o,onClose:c}){let l=i(()=>F(a),[a]),u=i(()=>L(e,n),[e,n]),d=u.length>100,[f,p]=s(i(()=>{if(!r?.conditions[0])return d?`condition`:`values`;let e=r.conditions[0];return e.selectedValues&&e.selectedValues.size>0?`values`:`condition`},[r,d])),m=i(()=>{if(!r?.conditions[0])return new Set;let e=r.conditions[0];return e.selectedValues?ae(u,e.selectedValues):new Set},[r,u]),h=i(()=>r?.conditions[0]?r.conditions[0].includeBlank??!0:!0,[r]),[g,_]=s(``),[v,y]=s(m),[b,x]=s(h),[S,C]=s(i(()=>{if(!r?.conditions.length)return[{operator:`contains`,value:``,nextOperator:`and`}];let e=r.conditions[0];if(e.selectedValues&&e.selectedValues.size>0)return[{operator:`contains`,value:``,nextOperator:`and`}];let t=r.combination??`and`;return r.conditions.map(e=>{let n=e;return{operator:n.operator,value:n.value??``,nextOperator:n.nextOperator??t}})},[r])),w=i(()=>{if(!g)return u;let e=g.toLowerCase();return u.filter(t=>t.label.toLowerCase().includes(e))},[u,g]),T=i(()=>e.some(ee),[e]),E=i(()=>w.every(e=>v.has(e.label))&&(!T||b),[w,v,T,b]),D=t(()=>{y(new Set(w.map(e=>e.label))),T&&x(!0)},[w,T]),O=t(()=>{y(new Set),x(!1)},[]),k=t(e=>{y(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),j=t((e,t)=>{C(n=>{let r=[...n];return r[e]={...r[e],...t},r})},[]),M=t(()=>{C(e=>[...e,{operator:`contains`,value:``,nextOperator:`and`}])},[]),N=t(e=>{C(t=>t.filter((t,n)=>n!==e))},[]),P=t(()=>{if(f===`values`){if(u.every(e=>v.has(e.label))&&(!T||b)){o(null);return}o({conditions:[{type:`text`,operator:`equals`,selectedValues:oe(u,v),includeBlank:b}],combination:`and`})}else{let e=S.filter(e=>e.operator===`blank`||e.operator===`notBlank`||e.value.trim()!==``);if(e.length===0){o(null);return}o({conditions:e.map(e=>({type:`text`,operator:e.operator,value:e.value,nextOperator:e.nextOperator})),combination:`and`})}},[f,u,v,b,T,S,o]),I=t(()=>{o(null)},[o]);return B(`div`,{className:`gp-grid-filter-content gp-grid-filter-text`,children:[!d&&B(`div`,{className:`gp-grid-filter-mode-toggle`,children:[z(`button`,{type:`button`,className:f===`values`?`active`:``,onClick:()=>p(`values`),children:a.valuesMode}),z(`button`,{type:`button`,className:f===`condition`?`active`:``,onClick:()=>p(`condition`),children:a.conditionMode})]}),d&&f===`condition`&&z(`div`,{className:`gp-grid-filter-info`,children:A(a.tooManyValues,{count:u.length})}),f===`values`&&B(R,{children:[z(`input`,{className:`gp-grid-filter-search`,type:`text`,placeholder:a.searchPlaceholder,value:g,onChange:e=>_(e.target.value),autoFocus:!0}),B(`div`,{className:`gp-grid-filter-actions`,children:[z(`button`,{type:`button`,onClick:D,disabled:E,children:a.selectAll}),z(`button`,{type:`button`,onClick:O,children:a.deselectAll})]}),B(`div`,{className:`gp-grid-filter-list`,children:[T&&B(`label`,{className:`gp-grid-filter-option`,children:[z(`input`,{type:`checkbox`,checked:b,onChange:()=>x(!b)}),z(`span`,{className:`gp-grid-filter-blank`,children:a.blanks})]}),w.map(e=>B(`label`,{className:`gp-grid-filter-option`,children:[z(`input`,{type:`checkbox`,checked:v.has(e.label),onChange:()=>k(e.label)}),z(`span`,{children:e.label})]},e.label))]})]}),f===`condition`&&B(R,{children:[S.map((e,t)=>B(`div`,{className:`gp-grid-filter-condition`,children:[t>0&&B(`div`,{className:`gp-grid-filter-combination`,children:[z(`button`,{type:`button`,className:S[t-1]?.nextOperator===`and`?`active`:``,onClick:()=>j(t-1,{nextOperator:`and`}),children:a.and}),z(`button`,{type:`button`,className:S[t-1]?.nextOperator===`or`?`active`:``,onClick:()=>j(t-1,{nextOperator:`or`}),children:a.or})]}),B(`div`,{className:`gp-grid-filter-row`,children:[z(`select`,{value:e.operator,onChange:e=>j(t,{operator:e.target.value}),autoFocus:t===0,children:l.map(e=>z(`option`,{value:e.value,children:e.label},e.value))}),e.operator!==`blank`&&e.operator!==`notBlank`&&z(`input`,{type:`text`,value:e.value,onChange:e=>j(t,{value:e.target.value}),placeholder:a.valuePlaceholder,className:`gp-grid-filter-text-input`}),S.length>1&&z(`button`,{type:`button`,className:`gp-grid-filter-remove`,onClick:()=>N(t),children:a.removeCondition})]})]},t)),z(`button`,{type:`button`,className:`gp-grid-filter-add`,onClick:M,children:a.addCondition})]}),B(`div`,{className:`gp-grid-filter-buttons`,children:[z(`button`,{type:`button`,className:`gp-grid-filter-btn-clear`,onClick:I,children:a.clear}),z(`button`,{type:`button`,className:`gp-grid-filter-btn-apply`,onClick:P,children:a.apply})]})]})}function H({currentFilter:e,labels:n,onApply:r,onClose:a}){let o=i(()=>P(n),[n]),[c,l]=s(i(()=>{if(!e?.conditions.length)return[{operator:`=`,value:``,valueTo:``,nextOperator:`and`}];let t=e.combination??`and`;return e.conditions.map(e=>{let n=e;return{operator:n.operator,value:n.value==null?``:String(n.value),valueTo:n.valueTo==null?``:String(n.valueTo),nextOperator:n.nextOperator??t}})},[e])),u=t((e,t)=>{l(n=>{let r=[...n];return r[e]={...r[e],...t},r})},[]),d=t(()=>{l(e=>[...e,{operator:`=`,value:``,valueTo:``,nextOperator:`and`}])},[]),f=t(e=>{l(t=>t.filter((t,n)=>n!==e))},[]),p=t(()=>{let e=c.filter(e=>e.operator===`blank`||e.operator===`notBlank`?!0:e.operator===`between`?e.value!==``&&e.valueTo!==``:e.value!==``);if(e.length===0){r(null);return}r({conditions:e.map(e=>({type:`number`,operator:e.operator,value:e.value?parseFloat(e.value):void 0,valueTo:e.valueTo?parseFloat(e.valueTo):void 0,nextOperator:e.nextOperator})),combination:`and`})},[c,r]),m=t(()=>{r(null)},[r]);return B(`div`,{className:`gp-grid-filter-content gp-grid-filter-number`,children:[c.map((e,t)=>B(`div`,{className:`gp-grid-filter-condition`,children:[t>0&&B(`div`,{className:`gp-grid-filter-combination`,children:[z(`button`,{type:`button`,className:c[t-1]?.nextOperator===`and`?`active`:``,onClick:()=>u(t-1,{nextOperator:`and`}),children:n.and}),z(`button`,{type:`button`,className:c[t-1]?.nextOperator===`or`?`active`:``,onClick:()=>u(t-1,{nextOperator:`or`}),children:n.or})]}),B(`div`,{className:`gp-grid-filter-row`,children:[z(`select`,{value:e.operator,onChange:e=>u(t,{operator:e.target.value}),children:o.map(e=>z(`option`,{value:e.value,children:e.label},e.value))}),e.operator!==`blank`&&e.operator!==`notBlank`&&z(`input`,{type:`number`,value:e.value,onChange:e=>u(t,{value:e.target.value}),placeholder:n.valuePlaceholder}),e.operator===`between`&&B(R,{children:[z(`span`,{className:`gp-grid-filter-to`,children:n.betweenSeparator}),z(`input`,{type:`number`,value:e.valueTo,onChange:e=>u(t,{valueTo:e.target.value}),placeholder:n.valuePlaceholder})]}),c.length>1&&z(`button`,{type:`button`,className:`gp-grid-filter-remove`,onClick:()=>f(t),children:n.removeCondition})]})]},t)),z(`button`,{type:`button`,className:`gp-grid-filter-add`,onClick:d,children:n.addCondition}),B(`div`,{className:`gp-grid-filter-buttons`,children:[z(`button`,{type:`button`,className:`gp-grid-filter-btn-clear`,onClick:m,children:n.clear}),z(`button`,{type:`button`,className:`gp-grid-filter-btn-apply`,onClick:p,children:n.apply})]})]})}function U(e){if(!e)return``;let t=typeof e==`string`?new Date(e):e;return isNaN(t.getTime())?``:t.toISOString().split(`T`)[0]}function W({currentFilter:e,labels:n,onApply:r,onClose:a}){let o=i(()=>j(n),[n]),[c,l]=s(i(()=>{if(!e?.conditions.length)return[{operator:`=`,value:``,valueTo:``,nextOperator:`and`}];let t=e.combination??`and`;return e.conditions.map(e=>{let n=e;return{operator:n.operator,value:U(n.value),valueTo:U(n.valueTo),nextOperator:n.nextOperator??t}})},[e])),u=t((e,t)=>{l(n=>{let r=[...n];return r[e]={...r[e],...t},r})},[]),d=t(()=>{l(e=>[...e,{operator:`=`,value:``,valueTo:``,nextOperator:`and`}])},[]),f=t(e=>{l(t=>t.filter((t,n)=>n!==e))},[]),p=t(()=>{let e=c.filter(e=>e.operator===`blank`||e.operator===`notBlank`?!0:e.operator===`between`?e.value!==``&&e.valueTo!==``:e.value!==``);if(e.length===0){r(null);return}r({conditions:e.map(e=>({type:`date`,operator:e.operator,value:e.value||void 0,valueTo:e.valueTo||void 0,nextOperator:e.nextOperator})),combination:`and`})},[c,r]),m=t(()=>{r(null)},[r]);return B(`div`,{className:`gp-grid-filter-content gp-grid-filter-date`,children:[c.map((e,t)=>B(`div`,{className:`gp-grid-filter-condition`,children:[t>0&&B(`div`,{className:`gp-grid-filter-combination`,children:[z(`button`,{type:`button`,className:c[t-1]?.nextOperator===`and`?`active`:``,onClick:()=>u(t-1,{nextOperator:`and`}),children:n.and}),z(`button`,{type:`button`,className:c[t-1]?.nextOperator===`or`?`active`:``,onClick:()=>u(t-1,{nextOperator:`or`}),children:n.or})]}),B(`div`,{className:`gp-grid-filter-row`,children:[z(`select`,{value:e.operator,onChange:e=>u(t,{operator:e.target.value}),children:o.map(e=>z(`option`,{value:e.value,children:e.label},e.value))}),e.operator!==`blank`&&e.operator!==`notBlank`&&z(`input`,{type:`date`,value:e.value,onChange:e=>u(t,{value:e.target.value})}),e.operator===`between`&&B(R,{children:[z(`span`,{className:`gp-grid-filter-to`,children:n.betweenSeparator}),z(`input`,{type:`date`,value:e.valueTo,onChange:e=>u(t,{valueTo:e.target.value})})]}),c.length>1&&z(`button`,{type:`button`,className:`gp-grid-filter-remove`,onClick:()=>f(t),children:n.removeCondition})]})]},t)),z(`button`,{type:`button`,className:`gp-grid-filter-add`,onClick:d,children:n.addCondition}),B(`div`,{className:`gp-grid-filter-buttons`,children:[z(`button`,{type:`button`,className:`gp-grid-filter-btn-clear`,onClick:m,children:n.clear}),z(`button`,{type:`button`,className:`gp-grid-filter-btn-apply`,onClick:p,children:n.apply})]})]})}function le({column:e,colIndex:i,containerRef:a,distinctValues:c,currentFilter:l,labels:u,onApply:d,onClose:f}){let p=o(null),[m,h]=s({position:`fixed`,zIndex:1e4,visibility:`hidden`}),g=t(()=>{let e=a.current,t=p.current;if(!e||!t)return;let n=e.querySelector(`[data-col-index="${i}"]`);if(!n)return;let r=v(n,t);h({position:`fixed`,top:r.top,left:r.left,minWidth:r.minWidth,zIndex:1e4,visibility:`visible`})},[a,i]);r(()=>{g()},[g]),n(()=>{let e=null,t=()=>{e===null&&(e=requestAnimationFrame(()=>{e=null,g()}))};return window.addEventListener(`scroll`,t,{passive:!0,capture:!0}),window.addEventListener(`resize`,t),()=>{window.removeEventListener(`scroll`,t,{capture:!0}),window.removeEventListener(`resize`,t),e!==null&&cancelAnimationFrame(e)}},[g]),n(()=>{let e=e=>{let t=e.target;t.closest(`.gp-grid-filter-icon`)||p.current&&!p.current.contains(t)&&f()},t=e=>{e.key===`Escape`&&f()};return requestAnimationFrame(()=>{document.addEventListener(`pointerdown`,e),document.addEventListener(`keydown`,t)}),()=>{document.removeEventListener(`pointerdown`,e),document.removeEventListener(`keydown`,t)}},[f]);let _=t(t=>{d(e.colId??e.field,t),f()},[e,d,f]),y=e.cellDataType,b=y===`text`||y===`object`,x=y===`number`,S=y===`date`||y===`dateString`||y===`dateTime`||y===`dateTimeString`;return B(`div`,{ref:p,className:`gp-grid-filter-popup`,style:m,children:[z(`div`,{className:`gp-grid-filter-header`,children:A(u.filterTitle,{column:e.headerName??e.field})}),b&&z(V,{distinctValues:c,valueFormatter:e.valueFormatter,currentFilter:l,labels:u,onApply:_,onClose:f}),x&&z(H,{currentFilter:l,labels:u,onApply:_,onClose:f}),S&&z(W,{currentFilter:l,labels:u,onApply:_,onClose:f}),!b&&!x&&!S&&z(V,{distinctValues:c,valueFormatter:e.valueFormatter,currentFilter:l,labels:u,onApply:_,onClose:f})]})}const ue=e=>{let t=e.cellDataType;return t===`text`||t===`boolean`||t===`object`};function de(e){let{column:t,colIndex:n,sortDirection:r,sortIndex:i,sortable:a,filterable:o,hasFilter:s,coreRef:c,containerRef:l,headerRenderers:u,globalHeaderRenderer:d}=e,f=c.current,p={column:t,colIndex:n,sortDirection:r,sortIndex:i,sortable:a,filterable:o,hasFilter:s,onSort:(e,n)=>{f&&a&&f.setSort(t.colId??t.field,e,n)},onFilterClick:()=>{if(f&&o){let e=l.current?.querySelector(`[data-col-index="${n}"]`);if(e){let r=e.getBoundingClientRect();f.openFilterPopup(n,{top:r.top,left:r.left,width:r.width,height:r.height},ue(t))}}}};if(t.headerRenderer){if(typeof t.headerRenderer==`function`)return t.headerRenderer(p);let e=u[t.headerRenderer];if(e)return e(p)}return d?d(p):B(R,{children:[z(`span`,{className:`gp-grid-header-text`,children:t.headerName??t.field}),B(`span`,{className:`gp-grid-header-icons`,children:[a&&B(`span`,{className:`gp-grid-sort-arrows`,children:[B(`span`,{className:`gp-grid-sort-arrows-stack`,children:[z(`svg`,{className:`gp-grid-sort-arrow-up${r===`asc`?` active`:``}`,width:`8`,height:`6`,viewBox:`0 0 8 6`,children:z(`path`,{d:`M4 0L8 6H0L4 0Z`,fill:`currentColor`})}),z(`svg`,{className:`gp-grid-sort-arrow-down${r===`desc`?` active`:``}`,width:`8`,height:`6`,viewBox:`0 0 8 6`,children:z(`path`,{d:`M4 6L0 0H8L4 6Z`,fill:`currentColor`})})]}),i!==void 0&&i>0&&z(`span`,{className:`gp-grid-sort-index`,children:i})]}),o&&z(`span`,{className:`gp-grid-filter-icon${s?` active`:``}`,onPointerDown:e=>{e.stopPropagation(),e.preventDefault(),p.onFilterClick()},onClick:e=>{e.stopPropagation()},children:z(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`currentColor`,children:z(`path`,{d:`M4 4h16l-6 8v5l-4 2v-7L4 4z`})})})]})]})}const fe=e=>{let{headerHeight:t,scrollLeft:n,contentWidth:r,totalWidth:i,isLoading:a,visibleColumnsWithIndices:o,columnPositions:s,columnWidths:c,headers:l,sortingEnabled:u,onHeaderMouseDown:d,onHeaderResizeMouseDown:f,coreRef:p,outerContainerRef:m,headerRenderers:h,globalHeaderRenderer:g}=e;return z(`div`,{className:`gp-grid-header${a?` gp-grid-header--loading`:``}`,style:{height:t},children:z(`div`,{style:{position:`absolute`,top:0,left:0,transform:`translateX(${-n}px)`,width:Math.max(r,i),height:t},children:o.map(({column:e,originalIndex:n},r)=>{let i=l.get(n),a=c[r]??0;return B(`div`,{className:`gp-grid-header-cell`,"data-col-index":n,style:{left:`${s[r]}px`,width:`${a}px`,height:`${t}px`},onPointerDown:e=>d(n,a,t,e),children:[de({column:e,colIndex:n,sortDirection:i?.sortDirection,sortIndex:i?.sortIndex,sortable:e.sortable!==!1&&u,filterable:e.filterable!==!1,hasFilter:i?.hasFilter??!1,coreRef:p,containerRef:m,headerRenderers:h,globalHeaderRenderer:g}),e.resizable!==!1&&z(`div`,{className:`gp-grid-header-resize-handle`,onPointerDown:e=>{e.stopPropagation(),f(n,a,e)}})]},e.colId??e.field)})})})};function G(e){let{column:t,rowData:n,rowIndex:r,colIndex:i,isActive:a,isSelected:o,isEditing:s,cellRenderers:c,globalCellRenderer:l}=e,u=M(n,t.field),d={value:t.valueFormatter?t.valueFormatter(u):u,rowData:n,column:t,rowIndex:r,colIndex:i,isActive:a,isSelected:o,isEditing:s};if(t.cellRenderer){if(typeof t.cellRenderer==`function`)return t.cellRenderer(d);let e=c[t.cellRenderer];if(e)return e(d)}return l?l(d):z(`span`,{className:`gp-grid-cell-content`,children:k(u,t.valueFormatter)})}function pe(e){let{column:t,rowData:n,rowIndex:r,colIndex:i,initialValue:a,coreRef:o,editRenderers:s,globalEditRenderer:c}=e,l=o.current;if(!l)return null;let u=N(n,t.field),d={value:t.valueFormatter?t.valueFormatter(u):u,rowData:n,column:t,rowIndex:r,colIndex:i,isActive:!0,isSelected:!0,isEditing:!0,initialValue:a,onValueChange:e=>l.updateEditValue(e),onCommit:()=>l.commitEdit(),onCancel:()=>l.cancelEdit()};if(t.editRenderer){if(typeof t.editRenderer==`function`)return t.editRenderer(d);let e=s[t.editRenderer];if(e)return e(d)}return c?c(d):z(`input`,{className:`gp-grid-edit-input`,type:`text`,defaultValue:a==null?``:String(a),autoFocus:!0,onFocus:e=>e.target.select(),onChange:e=>l.updateEditValue(e.target.value),onKeyDown:e=>{e.stopPropagation(),e.key===`Enter`?l.commitEdit():e.key===`Escape`?l.cancelEdit():e.key===`Tab`&&(e.preventDefault(),l.commitEdit(),l.selection.moveFocus(e.shiftKey?`left`:`right`,!1))},onBlur:()=>l.commitEdit()})}const me=e.forwardRef((e,t)=>{let{rowHeight:n,totalHeaderHeight:r,contentWidth:i,contentHeight:a,totalWidth:o,rowsWrapperOffset:s,activeCell:c,selectionRange:l,editingCell:u,error:d,isLoading:f,totalRows:p,labels:m,slotsArray:h,visibleColumnsWithIndices:_,columnPositions:v,columnWidths:y,fillHandlePosition:b,dragState:x,onScroll:S,onCellMouseDown:C,onCellDoubleClick:w,onCellMouseEnter:T,onCellMouseLeave:E,onFillHandleMouseDown:D,coreRef:O,cellRenderers:j,editRenderers:N,globalCellRenderer:P,globalEditRenderer:F}=e;return B(`div`,{ref:t,style:{flex:1,overflow:`auto`,position:`relative`},onScroll:S,children:[z(`div`,{style:{width:Math.max(i,o),height:Math.max(a-r,0),position:`relative`,minWidth:`100%`},children:B(`div`,{className:`gp-grid-rows-wrapper`,style:{width:`${Math.max(i,o)}px`,transform:`translateY(${s}px)`},children:[h.map(e=>e.rowIndex<0?null:z(`div`,{className:[`gp-grid-row`,...O.current?.highlight?.computeRowClasses(e.rowIndex,e.rowData)??[]].filter(Boolean).join(` `),style:{position:`absolute`,top:0,left:0,transform:`translateY(${e.translateY}px)`,width:`${Math.max(i,o)}px`,height:`${n}px`},children:_.map(({column:t,originalIndex:r},i)=>{let a=ne(e.rowIndex,r,u),o=te(e.rowIndex,r,c),s=ie(e.rowIndex,r,l),d=g(o,s,a,re(e.rowIndex,r,x.dragType===`fill`,x.fillSourceRange,x.fillTarget)),f=O.current?.highlight?.computeCombinedCellClasses(e.rowIndex,r,t,e.rowData)??[],p=t.rowDrag===!0,m=t.wrapText===!0&&!a,h=[d,...f,p?`gp-grid-cell--row-drag-handle`:``,m?`gp-grid-cell--wrap`:``].filter(Boolean).join(` `),_=t.tooltip===!1||a?``:k(M(e.rowData,t.field),t.valueFormatter);return z(`div`,{className:h,"data-cell-row":e.rowIndex,"data-cell-col":r,title:_||void 0,style:{position:`absolute`,left:`${v[i]}px`,top:0,width:`${y[i]}px`,height:`${n}px`},onPointerDown:t=>C(e.rowIndex,r,t),onDoubleClick:()=>w(e.rowIndex,r),onMouseEnter:()=>T(e.rowIndex,r),onMouseLeave:E,children:a&&u?pe({column:t,rowData:e.rowData,rowIndex:e.rowIndex,colIndex:r,initialValue:u.initialValue,coreRef:O,editRenderers:N,globalEditRenderer:F}):G({column:t,rowData:e.rowData,rowIndex:e.rowIndex,colIndex:r,isActive:o,isSelected:s,isEditing:a,cellRenderers:j,globalCellRenderer:P})},`${e.slotId}-${r}`)})},e.slotId)),b&&!u&&z(`div`,{className:`gp-grid-fill-handle`,style:{top:b.top,left:b.left},onPointerDown:D}),x.dragType===`row-drag`&&x.rowDrag?.dropTargetIndex!==null&&z(`div`,{className:`gp-grid-row-drop-indicator`,style:{transform:`translateY(${x.rowDrag.dropIndicatorY}px)`,width:`${Math.max(i,o)}px`}})]})}),d&&z(`div`,{className:`gp-grid-error`,children:A(m.errorPrefix,{message:d})}),!f&&!d&&p===0&&z(`div`,{className:`gp-grid-empty`,children:m.emptyState})]})}),K={top:0,left:0,width:0,visibility:`hidden`};function he({peekCell:e,column:i,rowData:a,containerRef:c,cellRenderers:l,globalCellRenderer:u,onClose:d}){let f=o(null),[p,m]=s(K),g=t(()=>{let t=c.current,n=f.current;if(!t||!n)return;let r=t.querySelector(`[data-cell-row="${e.row}"][data-cell-col="${e.col}"]`);if(!r){d();return}let i=r.getBoundingClientRect();m({top:i.top,left:i.left,width:i.width,visibility:`visible`})},[c,e.row,e.col,d]);r(()=>{g()},[g]),n(()=>{let e=null,t=()=>{e===null&&(e=requestAnimationFrame(()=>{e=null,g()}))};return window.addEventListener(`scroll`,t,{passive:!0,capture:!0}),window.addEventListener(`resize`,t),()=>{window.removeEventListener(`scroll`,t,{capture:!0}),window.removeEventListener(`resize`,t),e!==null&&cancelAnimationFrame(e)}},[g]),n(()=>{let e=e=>{let t=e.target;f.current?.contains(t)||d()},t=requestAnimationFrame(()=>{document.addEventListener(`pointerdown`,e)});return()=>{cancelAnimationFrame(t),document.removeEventListener(`pointerdown`,e)}},[d]),n(()=>{let e=f.current;if(e)return h(e)},[]);let _=G({column:i,rowData:a,rowIndex:e.row,colIndex:e.col,isActive:!0,isSelected:!1,isEditing:!1,cellRenderers:l,globalCellRenderer:u});return z(`div`,{ref:f,className:`gp-grid-cell-peek`,style:{position:`fixed`,top:p.top,left:p.left,width:p.width,visibility:p.visibility},children:_})}function ge(e,t){if(t.type===`RESET`)return w();let{instructions:n}=t;if(n.length===0)return e;let r=new Map(e.slots),i=new Map(e.headers),a={pendingScrollTop:null};for(let e of n){let t=m(e,r,i);t&&(a={...a,...t})}return{...e,...a,slots:r,headers:i}}function _e(e,r,i,a){let{activeCell:c,selectionRange:l,editingCell:p,filterPopupOpen:m,rowHeight:h,headerHeight:g,columnPositions:_,columnWidths:v,visibleColumnsWithIndices:y,slots:b,rowsWrapperOffset:x}=a,S=o(null),C=o(null),w=o(null),T=o(null),E=o(null),D=t(e=>{e.preventDefault()},[]),O=o(null),k=t(()=>(O.current??=new u({getCore:()=>e.current,isBrowser:!0,onTapConfirmed:()=>r.current?.focus()}),O.current),[e,r]),[A,j]=s({isDragging:!1,dragType:null,fillSourceRange:null,fillTarget:null,columnResize:null,columnMove:null,rowDrag:null});n(()=>{let t=e.current;t?.input&&t.input.updateDeps({getHeaderHeight:()=>g,getRowHeight:()=>h,getColumnPositions:()=>_,getColumnCount:()=>y.length,getOriginalColumnIndex:e=>{let t=y[e];return t?t.originalIndex:e}})},[e,g,h,_,y]);let M=t(()=>{let e=r.current;if(!e)return null;let t=e.getBoundingClientRect();return{top:t.top,left:t.left,width:t.width,height:t.height,scrollTop:e.scrollTop,scrollLeft:e.scrollLeft}},[r]),N=t((t,n)=>{S.current&&clearInterval(S.current),S.current=setInterval(()=>{let i=r.current,a=e.current;if(i){i.scrollTop+=n,i.scrollLeft+=t;let e=C.current;if(e&&a?.input){let t=M();t&&(a.input.handleDragMove(e,t),j(a.input.getDragState()))}}},16)},[r,e,M]),P=t(()=>{S.current&&=(clearInterval(S.current),null)},[]),F=e=>({clientX:e.clientX,clientY:e.clientY,button:e.button,shiftKey:e.shiftKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,pointerId:e.pointerId,pointerType:e.pointerType}),I=t(()=>{let t=t=>{t.preventDefault();let n=e.current,r=M();if(!n?.input||!r)return;let i=F(t);C.current=i;let a=n.input.handleDragMove(i,r);a&&(a.autoScroll?N(a.autoScroll.dx,a.autoScroll.dy):P(),j(n.input.getDragState()))},n=()=>{let i=e.current;i?.input&&(i.input.handleDragEnd(),j(i.input.getDragState())),C.current=null,P(),document.removeEventListener(`touchmove`,D),E.current!==null&&r.current&&(r.current.style.overflow=E.current,E.current=null),document.removeEventListener(`pointermove`,t),document.removeEventListener(`pointerup`,n),document.removeEventListener(`pointercancel`,n)};document.addEventListener(`pointermove`,t,{passive:!1}),document.addEventListener(`pointerup`,n),document.addEventListener(`pointercancel`,n)},[e,M,N,P]),L=t(()=>{w.current!==null&&(clearTimeout(w.current),w.current=null,e.current?.input?.cancelPendingRowDrag()),T.current=null},[e]),ee=t((t,n,i)=>{let a=e.current;if(!a?.input)return;let o=a.input.handleCellMouseDown(t,n,F(i));if(o.focusContainer&&r.current?.focus(),o.startTap&&k().start(i.nativeEvent),o.startDrag===`selection`)a.input.startSelectionDrag(),j(a.input.getDragState()),I();else if(o.startDrag===`row-drag`)j(a.input.getDragState()),I();else if(o.startDrag===`row-drag-pending`){L(),T.current={pointerId:i.pointerId,target:i.currentTarget};let e=i.clientX,t=i.clientY,n=n=>{let r=n.clientX-e,i=n.clientY-t;(Math.abs(r)>f||Math.abs(i)>f)&&(L(),s())},o=()=>{L(),s()},s=()=>{document.removeEventListener(`pointermove`,n),document.removeEventListener(`pointerup`,o),document.removeEventListener(`pointercancel`,o)};document.addEventListener(`pointermove`,n),document.addEventListener(`pointerup`,o,{once:!0}),document.addEventListener(`pointercancel`,o,{once:!0}),w.current=setTimeout(()=>{w.current=null,s();let e=T.current;if(T.current=null,a.input.confirmPendingRowDrag()){if(r.current&&(E.current=r.current.style.overflow,r.current.style.overflow=`hidden`),document.addEventListener(`touchmove`,D,{passive:!1}),e)try{e.target.setPointerCapture(e.pointerId)}catch{}j(a.input.getDragState()),I()}},d)}},[e,r,I,L,k]),te=t((t,n)=>{let r=e.current;r?.input&&r.input.handleCellDoubleClick(t,n)},[e]),ne=t(t=>{let n=e.current;if(!n?.input)return;let r=n.input.handleFillHandleMouseDown(c,l,F(t));if(r.preventDefault&&t.preventDefault(),r.stopPropagation&&t.stopPropagation(),r.startDrag===`fill`){try{t.target.setPointerCapture(t.pointerId)}catch{}j(n.input.getDragState()),I()}},[e,c,l,I]),re=t((t,n)=>{let r=e.current;if(!r?.input)return;let a=i[t];if(!a)return;let o=a.colId??a.field;r.input.handleHeaderClick(o,n.shiftKey)},[e,i]),ie=t((t,n,r,i)=>{let a=e.current;if(!a?.input)return;let o=a.input.handleHeaderMouseDown(t,n,r,F(i));if(o.preventDefault&&i.preventDefault(),o.stopPropagation&&i.stopPropagation(),o.startDrag===`column-move`){try{i.target.setPointerCapture(i.pointerId)}catch{}j(a.input.getDragState()),I()}},[e,I]),ae=t((t,n,r)=>{let i=e.current;if(!i?.input)return;let a=i.input.handleHeaderResizeMouseDown(t,n,F(r));a.preventDefault&&r.preventDefault(),a.stopPropagation&&r.stopPropagation(),a.startDrag===`column-resize`&&(j(i.input.getDragState()),I())},[e,I]),oe=t(t=>{let n=e.current,i=r.current;if(!n?.input)return;let a=n.input.handleKeyDown({key:t.key,shiftKey:t.shiftKey,ctrlKey:t.ctrlKey,metaKey:t.metaKey},c,p,m);a.preventDefault&&t.preventDefault(),a.scrollToCell&&i&&ce(n,i,a.scrollToCell.row,h,b,x,{colIndex:a.scrollToCell.col,visibleColumns:y,columnPositions:_,columnWidths:v})},[e,r,c,p,m,h,b,x,y,_,v]),se=t(t=>{let n=e.current;if(!n||p!==null||m)return;let r=t.clipboardData.getData(`text/plain`);n.pasteClipboardText(r)&&t.preventDefault()},[e,p,m]),R=t((t,n)=>{let i=e.current,a=r.current;if(!i?.input||!a)return;let o=i.input.handleWheel(t.deltaY,t.deltaX,n);o&&(t.preventDefault(),a.scrollTop+=o.dy,a.scrollLeft+=o.dx)},[e,r]);return n(()=>()=>{P(),L(),O.current?.cancel(),document.removeEventListener(`touchmove`,D),E.current!==null&&r.current&&(r.current.style.overflow=E.current,E.current=null)},[P,L,D,r]),{handleCellMouseDown:ee,handleCellDoubleClick:te,handleFillHandleMouseDown:ne,handleHeaderClick:re,handleHeaderMouseDown:ie,handleHeaderResizeMouseDown:ae,handleKeyDown:oe,handlePaste:se,handleWheel:R,dragState:A}}function q(s){let{columns:c,dataSource:u,rowData:d,rowHeight:f,headerHeight:m=f,overscan:h=3,rowLoading:g,sortingEnabled:v=!0,darkMode:b=!1,wheelDampening:S=.1,maxFlingVelocity:w,cellRenderers:E={},editRenderers:D={},headerRenderers:O={},cellRenderer:k,editRenderer:A,headerRenderer:j,initialWidth:M,initialHeight:N,gridRef:P,highlighting:F,getRowId:L,onCellValueChanged:ee,loadingComponent:te,rowDragEntireRow:ne=!1,onRowDragEnd:re,onColumnResized:ie,onColumnMoved:ae,labels:oe}=s,ce=i(()=>se(oe),[oe]),V=o(null),H=o(null),U=o(null),W=o(null),ue=o(null),de=o(!1),[G,pe]=a(ge,{initialWidth:M,initialHeight:N},T),K=m,q=o(null),J=q.current;(!J||J.providedDataSource!==u||J.rowData!==d)&&(J&&d&&d.length>1e4&&console.warn(`[gp-grid] rowData prop changed with ${d.length} rows — this triggers a full rebuild. Use useGridData() for efficient updates.`),J?.ownsDataSource&&J.dataSource.destroy?.(),u?q.current={dataSource:u,ownsDataSource:!1,providedDataSource:u,rowData:d}:d?q.current={dataSource:C(d),ownsDataSource:!0,providedDataSource:u,rowData:d}:q.current={dataSource:x([]),ownsDataSource:!0,providedDataSource:u,rowData:d});let{dataSource:Y}=q.current;n(()=>()=>{q.current?.ownsDataSource&&(q.current.dataSource.destroy?.(),q.current=null)},[]);let ve=o(L);ve.current=L;let ye=o(ee);ye.current=ee;let be=o(re);be.current=re;let xe=o(ie);xe.current=ie;let Se=o(ae);Se.current=ae;let Ce=o(F);Ce.current=F;let we=o(Y);we.current=Y;let X=G.columns??c,Z=i(()=>X.map((e,t)=>({column:e,originalIndex:t})).filter(({column:e})=>!e.hidden),[X]),{positions:Q,widths:Te}=i(()=>y(Z.map(e=>e.column),G.viewportWidth),[Z,G.viewportWidth]),Ee=I(Q),{handleCellMouseDown:De,handleCellDoubleClick:Oe,handleFillHandleMouseDown:ke,handleHeaderMouseDown:Ae,handleHeaderResizeMouseDown:je,handleKeyDown:Me,handlePaste:Ne,handleWheel:Pe,dragState:$}=_e(U,H,X,{activeCell:G.activeCell,selectionRange:G.selectionRange,editingCell:G.editingCell,filterPopupOpen:G.filterPopup?.isOpen??!1,rowHeight:f,headerHeight:K,columnPositions:Q,columnWidths:Te,visibleColumnsWithIndices:Z,slots:G.slots,rowsWrapperOffset:G.rowsWrapperOffset});n(()=>{de.current&&pe({type:`RESET`}),de.current=!0;let e=new l({columns:c,dataSource:we.current,rowHeight:f,headerHeight:K,overscan:h,maxFlingVelocity:w,rowLoading:g,sortingEnabled:v,highlighting:Ce.current,getRowId:ve.current,onCellValueChanged:ye.current?e=>ye.current?.(e):void 0,rowDragEntireRow:ne,onRowDragEnd:(e,t)=>be.current?.(e,t),onColumnResized:(e,t)=>xe.current?.(e,t),onColumnMoved:(e,t)=>Se.current?.(e,t)});U.current=e,W.current?.syncCore(),e.input.updateDeps({getHeaderHeight:()=>K,getRowHeight:()=>f,getColumnPositions:()=>Q,getColumnCount:()=>Z.length,getOriginalColumnIndex:e=>{let t=Z[e];return t?t.originalIndex:e}}),P&&(P.current={core:e});let t=e.onBatchInstruction(e=>{pe({type:`BATCH_INSTRUCTIONS`,instructions:e})});e.initialize();let n=H.current;return n&&e.setViewport(n.scrollTop,n.scrollLeft,n.clientWidth,n.clientHeight),()=>{t(),e.destroy(),U.current=null,P&&(P.current=null)}},[c,f,K,h,w,g,v,P,ne]),n(()=>{let e=U.current;if(!e)return;let t=ue.current;if(!t||t===Y){ue.current=Y;return}ue.current=Y,e.setDataSource(Y)},[Y]),n(()=>{let e=Y;if(e.subscribe)return e.subscribe(()=>{U.current?.refreshFromTransaction()})},[Y]),n(()=>{let e=U.current;!e?.highlight||!F||e.highlight.updateOptions(F)},[F]);let Fe=t(()=>{let e=H.current,t=U.current;!e||!t||t.setViewport(e.scrollTop,e.scrollLeft,e.clientWidth,e.clientHeight)},[]);n(()=>{let e=H.current,t=U.current;if(!e||!t)return;if(typeof ResizeObserver>`u`){Fe();return}let n=new ResizeObserver(()=>{t.setViewport(e.scrollTop,e.scrollLeft,e.clientWidth,e.clientHeight)});return n.observe(e),Fe(),()=>n.disconnect()},[Fe]),n(()=>{let e=H.current;if(!e)return;let t=e=>{Pe(e,S)};return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[Pe,S]),n(()=>{let e=new p({getCore:()=>U.current,getScrollEl:()=>H.current,isBrowser:typeof window<`u`});return W.current=e,e.attach(),()=>{e.detach(),W.current=null}},[]),r(()=>{if(G.pendingScrollTop!==null){let e=H.current;e&&(W.current?.stop(),e.scrollTop=G.pendingScrollTop)}},[G.pendingScrollTop]);let Ie=t((e,t)=>{let n=U.current;n&&n.setFilter(e,t)},[]),Le=t(()=>{let e=U.current;e&&e.closeFilterPopup()},[]),Re=t(()=>{U.current?.stopPeek()},[]),ze=t((e,t)=>{U.current?.input.handleCellMouseEnter(e,t)},[]),Be=t(()=>{U.current?.input.handleCellMouseLeave()},[]),Ve=i(()=>Array.from(G.slots.values()),[G.slots]),He=i(()=>_({activeCell:G.activeCell,selectionRange:G.selectionRange,slots:G.slots,columns:X,visibleColumnsWithIndices:Z,columnPositions:Q,columnWidths:Te,rowHeight:f}),[G.activeCell,G.selectionRange,G.slots,f,Q,Te,X,Z]),[Ue,We]=e.useState(0),Ge=t(()=>{let e=H.current;e&&(We(e.scrollLeft),Fe())},[Fe]);return B(`div`,{ref:V,className:`gp-grid-container${b?` gp-grid-container--dark`:``}`,style:{width:`100%`,height:`100%`,position:`relative`,display:`flex`,flexDirection:`column`},onKeyDown:Me,onPaste:Ne,tabIndex:0,children:[z(fe,{headerHeight:m,scrollLeft:Ue,contentWidth:G.contentWidth,totalWidth:Ee,isLoading:G.isLoading,visibleColumnsWithIndices:Z,columnPositions:Q,columnWidths:Te,headers:G.headers,sortingEnabled:v,onHeaderMouseDown:Ae,onHeaderResizeMouseDown:je,coreRef:U,outerContainerRef:V,headerRenderers:O,globalHeaderRenderer:j}),z(me,{ref:H,rowHeight:f,totalHeaderHeight:K,contentWidth:G.contentWidth,contentHeight:G.contentHeight,totalWidth:Ee,rowsWrapperOffset:G.rowsWrapperOffset,activeCell:G.activeCell,selectionRange:G.selectionRange,editingCell:G.editingCell,error:G.error,isLoading:G.isLoading,totalRows:G.totalRows,labels:ce,slotsArray:Ve,visibleColumnsWithIndices:Z,columnPositions:Q,columnWidths:Te,fillHandlePosition:He,dragState:$,onScroll:Ge,onCellMouseDown:De,onCellDoubleClick:Oe,onCellMouseEnter:ze,onCellMouseLeave:Be,onFillHandleMouseDown:ke,coreRef:U,cellRenderers:E,editRenderers:D,globalCellRenderer:k,globalEditRenderer:A}),G.isLoading&&B(`div`,{style:{position:`absolute`,top:m,left:0,right:0,bottom:0,zIndex:50,pointerEvents:`none`},children:[z(`div`,{className:`gp-grid-loading-overlay`}),te?e.createElement(te,{isLoading:!0}):z(`div`,{className:`gp-grid-loading`,children:z(`div`,{className:`gp-grid-loading-spinner`})})]}),G.filterPopup?.isOpen&&G.filterPopup.column&&z(le,{column:G.filterPopup.column,colIndex:G.filterPopup.colIndex,containerRef:V,distinctValues:G.filterPopup.distinctValues,currentFilter:G.filterPopup.currentFilter,labels:ce,onApply:Ie,onClose:Le}),G.peekCell&&(()=>{let e=X[G.peekCell.col],t=Ve.find(e=>e.rowIndex===G.peekCell.row);return!e||!t?null:z(he,{peekCell:G.peekCell,column:e,rowData:t.rowData,containerRef:V,cellRenderers:E,globalCellRenderer:k,onClose:Re})})(),$.dragType===`column-resize`&&$.columnResize&&(()=>{let e=Z.findIndex(e=>e.originalIndex===$.columnResize.colIndex);return e===-1?null:z(`div`,{className:`gp-grid-column-resize-line`,style:{left:(Q[e]??0)+$.columnResize.currentWidth-Ue}})})(),$.dragType===`column-move`&&$.columnMove&&(()=>{let e=$.columnMove,t=X[e.sourceColIndex],n=t?.headerName??t?.field??``;return B(R,{children:[z(`div`,{className:`gp-grid-column-move-ghost`,style:{left:e.currentX-e.ghostWidth/2,top:e.currentY-e.ghostHeight/2,width:e.ghostWidth,height:e.ghostHeight},children:n}),e.dropTargetIndex!==null&&z(`div`,{className:`gp-grid-column-drop-indicator`,style:{position:`absolute`,top:0,left:(Q[e.dropTargetIndex]??0)-Ue,height:m}})]})})(),$.dragType===`row-drag`&&$.rowDrag&&z(`div`,{className:`gp-grid-row-drag-ghost`,style:{left:$.rowDrag.currentX+12,top:$.rowDrag.currentY-f/2,width:Math.min(300,Ee),height:f}})]})}const J=(e,t)=>{let n=i(()=>D(e,{getRowId:t.getRowId,debounceMs:t.debounceMs??0,useWorker:t.useWorker,parallelSort:t.parallelSort}),[]);return{dataSource:n,updateRow:n.updateRow,addRows:n.addRows,removeRows:n.removeRows,updateCell:n.updateCell,clear:n.clear,getRowById:n.getRowById,getTotalRowCount:n.getTotalRowCount,flushTransactions:n.flushTransactions}};export{q as GpGrid,q as Grid,c as GridCore,b as createClientDataSource,S as createDataSourceFromArray,E as createMutableClientDataSource,O as createServerDataSource,J as useGridData};
package/dist/styles.css CHANGED
@@ -1,1115 +1 @@
1
-
2
- /* =============================================================================
3
- GP Grid - CSS Variables for Theming
4
- ============================================================================= */
5
-
6
- .gp-grid-container {
7
- /* Colors - Light Mode (default) */
8
- --gp-grid-bg: #ffffff;
9
- --gp-grid-bg-alt: #f8f9fa;
10
- --gp-grid-text: #212529;
11
- --gp-grid-text-secondary: #6c757d;
12
- --gp-grid-text-muted: #adb5bd;
13
- --gp-grid-border: #dee2e6;
14
- --gp-grid-border-light: #e9ecef;
15
-
16
- /* Header */
17
- --gp-grid-header-bg: #f1f3f5;
18
- --gp-grid-header-text: #212529;
19
- --gp-grid-header-z-index: 10;
20
-
21
- /* Selection */
22
- --gp-grid-primary: #228be6;
23
- --gp-grid-primary-light: #e7f5ff;
24
- --gp-grid-primary-border: #74c0fc;
25
- --gp-grid-hover: #f1f3f5;
26
-
27
- /* Filter */
28
- --gp-grid-filter-bg: #f8f9fa;
29
- --gp-grid-input-bg: #ffffff;
30
- --gp-grid-input-border: #ced4da;
31
-
32
- /* Error */
33
- --gp-grid-error-bg: #fff5f5;
34
- --gp-grid-error-text: #c92a2a;
35
-
36
- /* Loading */
37
- --gp-grid-loading-bg: rgba(255, 255, 255, 0.95);
38
- --gp-grid-loading-text: #495057;
39
-
40
- /* Scrollbar */
41
- --gp-grid-scrollbar-track: #f1f3f5;
42
- --gp-grid-scrollbar-thumb: #ced4da;
43
- --gp-grid-scrollbar-thumb-hover: #adb5bd;
44
- }
45
-
46
- /* Dark Mode */
47
- .gp-grid-container--dark {
48
- --gp-grid-bg: #1a1b1e;
49
- --gp-grid-bg-alt: #25262b;
50
- --gp-grid-text: #c1c2c5;
51
- --gp-grid-text-secondary: #909296;
52
- --gp-grid-text-muted: #5c5f66;
53
- --gp-grid-border: #373a40;
54
- --gp-grid-border-light: #2c2e33;
55
-
56
- /* Header */
57
- --gp-grid-header-bg: #25262b;
58
- --gp-grid-header-text: #c1c2c5;
59
- --gp-grid-header-z-index: 10;
60
-
61
- /* Selection */
62
- --gp-grid-primary: #339af0;
63
- --gp-grid-primary-light: #1c3d5a;
64
- --gp-grid-primary-border: #1c7ed6;
65
- --gp-grid-hover: #2c2e33;
66
-
67
- /* Filter */
68
- --gp-grid-filter-bg: #25262b;
69
- --gp-grid-input-bg: #1a1b1e;
70
- --gp-grid-input-border: #373a40;
71
-
72
- /* Error */
73
- --gp-grid-error-bg: #2c1a1a;
74
- --gp-grid-error-text: #ff6b6b;
75
-
76
- /* Loading */
77
- --gp-grid-loading-bg: rgba(26, 27, 30, 0.95);
78
- --gp-grid-loading-text: #c1c2c5;
79
-
80
- /* Scrollbar */
81
- --gp-grid-scrollbar-track: #25262b;
82
- --gp-grid-scrollbar-thumb: #373a40;
83
- --gp-grid-scrollbar-thumb-hover: #4a4d52;
84
- }
85
-
86
-
87
- /* =============================================================================
88
- GP Grid - Clean Flat Design
89
- ============================================================================= */
90
-
91
- /* Grid Container - structural */
92
- .gp-grid-container {
93
- outline: none;
94
- user-select: none;
95
- -webkit-user-select: none;
96
- }
97
-
98
- /* Visual properties - :where() for zero specificity, consumers can override with a single class */
99
- :where(.gp-grid-container) {
100
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
101
- font-size: 13px;
102
- line-height: 1.5;
103
- color: var(--gp-grid-text);
104
- background-color: var(--gp-grid-bg);
105
- border: 1px solid var(--gp-grid-border);
106
- border-radius: 6px;
107
- }
108
-
109
- .gp-grid-container:focus {
110
- outline: none;
111
- }
112
-
113
- :where(.gp-grid-container:focus) {
114
- border-color: var(--gp-grid-primary);
115
- }
116
-
117
-
118
- /* =============================================================================
119
- Header
120
- ============================================================================= */
121
-
122
- .gp-grid-header {
123
- position: sticky;
124
- top: 0;
125
- left: 0;
126
- flex-shrink: 0;
127
- z-index: 11;
128
- overflow: hidden;
129
- }
130
-
131
- :where(.gp-grid-header) {
132
- background-color: var(--gp-grid-header-bg);
133
- border-bottom: 1px solid var(--gp-grid-border);
134
- }
135
-
136
- .gp-grid-container .gp-grid-header-cell {
137
- position: absolute;
138
- box-sizing: border-box;
139
- user-select: none;
140
- display: flex;
141
- top: 0;
142
- touch-action: none;
143
- }
144
-
145
- :where(.gp-grid-header-cell) {
146
- align-items: center;
147
- padding: 0 12px;
148
- border-right: 1px solid var(--gp-grid-border);
149
- font-weight: 600;
150
- font-size: 12px;
151
- letter-spacing: 0.5px;
152
- color: var(--gp-grid-header-text);
153
- cursor: pointer;
154
- background-color: transparent;
155
- transition: background-color 0.1s ease;
156
- }
157
-
158
- :where(.gp-grid-header-cell:hover) {
159
- background-color: var(--gp-grid-hover);
160
- }
161
-
162
- :where(.gp-grid-header-cell:active) {
163
- background-color: var(--gp-grid-border-light);
164
- }
165
-
166
- .gp-grid-container .gp-grid-header-text {
167
- flex: 1;
168
- overflow: hidden;
169
- text-overflow: ellipsis;
170
- white-space: nowrap;
171
- }
172
-
173
- :where(.gp-grid-header-text) {
174
- color: var(--gp-grid-header-text);
175
- }
176
-
177
- /* Header icons container */
178
- .gp-grid-header-icons {
179
- display: flex;
180
- align-items: center;
181
- gap: 4px;
182
- margin-left: auto;
183
- }
184
-
185
- /* Stacked sort arrows */
186
- .gp-grid-sort-arrows {
187
- display: flex;
188
- flex-direction: row;
189
- align-items: center;
190
- gap: 2px;
191
- margin-left: 6px;
192
- }
193
-
194
- .gp-grid-sort-arrows-stack {
195
- display: flex;
196
- flex-direction: column;
197
- align-items: center;
198
- gap: 2px;
199
- }
200
-
201
- :where(.gp-grid-sort-arrow-up),
202
- :where(.gp-grid-sort-arrow-down) {
203
- opacity: 0.35;
204
- transition: opacity 0.15s ease, color 0.15s ease;
205
- color: var(--gp-grid-text);
206
- }
207
-
208
- :where(.gp-grid-sort-arrow-up.active),
209
- :where(.gp-grid-sort-arrow-down.active) {
210
- opacity: 1;
211
- color: var(--gp-grid-primary);
212
- }
213
-
214
- :where(.gp-grid-sort-index) {
215
- font-size: 9px;
216
- color: var(--gp-grid-primary);
217
- font-weight: 600;
218
- }
219
-
220
- /* Filter icon */
221
- .gp-grid-filter-icon {
222
- display: flex;
223
- align-items: center;
224
- justify-content: center;
225
- width: 20px;
226
- height: 20px;
227
- }
228
-
229
- :where(.gp-grid-filter-icon) {
230
- border-radius: 4px;
231
- cursor: pointer;
232
- color: var(--gp-grid-text-secondary);
233
- transition: background-color 0.15s ease, color 0.15s ease;
234
- margin-left: 2px;
235
- }
236
-
237
- :where(.gp-grid-filter-icon:hover) {
238
- background-color: var(--gp-grid-hover);
239
- color: var(--gp-grid-primary);
240
- }
241
-
242
- :where(.gp-grid-filter-icon.active) {
243
- color: var(--gp-grid-primary);
244
- background-color: var(--gp-grid-primary-light);
245
- }
246
-
247
- /* Touch device: larger tap target for filter icon */
248
- @media (pointer: coarse) and (hover: none) and (max-width: 768px) {
249
- .gp-grid-filter-icon {
250
- min-width: 44px;
251
- min-height: 44px;
252
- width: 44px;
253
- height: 44px;
254
- }
255
- :where(.gp-grid-filter-icon) {
256
- margin-left: 0;
257
- }
258
-
259
- .gp-grid-filter-icon svg {
260
- width: 20px;
261
- height: 20px;
262
- }
263
- }
264
-
265
- /* Disabled header state during data loading */
266
- .gp-grid-header--loading .gp-grid-header-cell {
267
- pointer-events: none;
268
- }
269
-
270
- :where(.gp-grid-header--loading .gp-grid-header-cell) {
271
- opacity: 0.6;
272
- cursor: default;
273
- }
274
-
275
- /* =============================================================================
276
- Column Resize
277
- ============================================================================= */
278
-
279
- .gp-grid-header-resize-handle {
280
- position: absolute;
281
- right: -3px;
282
- top: 0;
283
- width: 6px;
284
- height: 100%;
285
- cursor: col-resize;
286
- z-index: 10;
287
- touch-action: none;
288
- }
289
-
290
- :where(.gp-grid-header-resize-handle:hover),
291
- :where(.gp-grid-header-resize-handle--active) {
292
- background-color: var(--gp-grid-primary);
293
- opacity: 0.4;
294
- }
295
-
296
- /* Touch device: wider resize handle hit area */
297
- @media (pointer: coarse) and (hover: none) and (max-width: 768px) {
298
- .gp-grid-header-resize-handle {
299
- width: 24px;
300
- right: -12px;
301
- }
302
- }
303
-
304
- .gp-grid-column-resize-line {
305
- position: absolute;
306
- top: 0;
307
- width: 2px;
308
- height: 100%;
309
- z-index: 1000;
310
- pointer-events: none;
311
- }
312
-
313
- :where(.gp-grid-column-resize-line) {
314
- background-color: var(--gp-grid-primary);
315
- }
316
-
317
- /* =============================================================================
318
- Column Move
319
- ============================================================================= */
320
-
321
- .gp-grid-column-move-ghost {
322
- position: fixed;
323
- pointer-events: none;
324
- z-index: 2000;
325
- display: flex;
326
- align-items: center;
327
- box-sizing: border-box;
328
- overflow: hidden;
329
- white-space: nowrap;
330
- text-overflow: ellipsis;
331
- }
332
-
333
- :where(.gp-grid-column-move-ghost) {
334
- opacity: 0.7;
335
- background-color: var(--gp-grid-header-bg);
336
- border: 2px solid var(--gp-grid-primary);
337
- border-radius: 4px;
338
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
339
- padding: 0 12px;
340
- font-weight: 600;
341
- font-size: 12px;
342
- letter-spacing: 0.5px;
343
- color: var(--gp-grid-header-text);
344
- }
345
-
346
- .gp-grid-column-drop-indicator {
347
- position: absolute;
348
- top: 0;
349
- left: 0;
350
- width: 3px;
351
- height: 100%;
352
- z-index: 1000;
353
- pointer-events: none;
354
- }
355
-
356
- :where(.gp-grid-column-drop-indicator) {
357
- background-color: var(--gp-grid-primary);
358
- border-radius: 2px;
359
- }
360
-
361
-
362
- /* =============================================================================
363
- Data Cells
364
- ============================================================================= */
365
-
366
- /* Rows wrapper - positions rows with small translateY values for large datasets */
367
- .gp-grid-rows-wrapper {
368
- position: absolute;
369
- top: 0;
370
- left: 0;
371
- /* Keep wrapper below the sticky header (z-index: 10) */
372
- z-index: 1;
373
- will-change: transform;
374
- }
375
-
376
- .gp-grid-row {
377
- position: absolute;
378
- top: 0;
379
- left: 0;
380
- }
381
-
382
- /* Row background - :where() for zero specificity, so user highlight classes always win */
383
- :where(.gp-grid-row) {
384
- background-color: var(--gp-grid-bg);
385
- }
386
-
387
- /* Structural properties - required for grid layout */
388
- .gp-grid-cell {
389
- position: absolute;
390
- top: 0;
391
- box-sizing: border-box;
392
- display: flex;
393
- overflow: hidden;
394
- text-overflow: ellipsis;
395
- white-space: nowrap;
396
- user-select: none;
397
- -webkit-user-select: none;
398
- }
399
-
400
- /* Visual properties - :where() for zero specificity, so user highlight classes always win */
401
- :where(.gp-grid-cell) {
402
- align-items: center;
403
- padding: 0 12px;
404
- cursor: cell;
405
- color: var(--gp-grid-text);
406
- border-right: 1px solid var(--gp-grid-border-light);
407
- border-bottom: 1px solid var(--gp-grid-border-light);
408
- background-color: transparent;
409
- }
410
-
411
- /* Active cell (focused) - structural properties stay, visual use :where() */
412
- .gp-grid-cell--active {
413
- outline: none;
414
- z-index: 5;
415
- }
416
- :where(.gp-grid-cell--active) {
417
- background-color: var(--gp-grid-primary-light);
418
- border: 2px solid var(--gp-grid-primary);
419
- padding: 0 11px;
420
- }
421
-
422
- /* Selected cells (range selection) */
423
- :where(.gp-grid-cell--selected) {
424
- background-color: var(--gp-grid-primary-light);
425
- }
426
-
427
- /* Editing cell - structural properties stay, visual use :where() */
428
- .gp-grid-cell--editing {
429
- z-index: 10;
430
- }
431
- :where(.gp-grid-cell--editing) {
432
- background-color: var(--gp-grid-bg);
433
- border: 2px solid var(--gp-grid-primary);
434
- padding: 0;
435
- }
436
-
437
- /* =============================================================================
438
- Fill Handle (drag to fill)
439
- ============================================================================= */
440
-
441
- .gp-grid-fill-handle {
442
- position: absolute;
443
- width: 8px;
444
- height: 8px;
445
- z-index: 11;
446
- pointer-events: auto;
447
- box-sizing: border-box;
448
- touch-action: none;
449
- }
450
-
451
- :where(.gp-grid-fill-handle) {
452
- background-color: var(--gp-grid-primary);
453
- border: 2px solid var(--gp-grid-bg);
454
- cursor: crosshair;
455
- border-radius: 1px;
456
- }
457
-
458
- :where(.gp-grid-fill-handle:hover) {
459
- transform: scale(1.2);
460
- }
461
-
462
- @media (pointer: coarse) and (hover: none) and (max-width: 768px) {
463
- .gp-grid-fill-handle {
464
- width: 24px;
465
- height: 24px;
466
- }
467
- :where(.gp-grid-fill-handle) {
468
- border-width: 3px;
469
- border-radius: 3px;
470
- }
471
- }
472
-
473
- /* Fill preview (cells being filled) */
474
- :where(.gp-grid-cell.gp-grid-cell--fill-preview) {
475
- background-color: var(--gp-grid-primary-light);
476
- border: 1px dashed var(--gp-grid-primary);
477
- }
478
-
479
- /* =============================================================================
480
- Edit Input
481
- ============================================================================= */
482
-
483
- .gp-grid-edit-input {
484
- width: 100%;
485
- height: 100%;
486
- }
487
-
488
- :where(.gp-grid-edit-input) {
489
- padding: 0 11px;
490
- font-family: inherit;
491
- font-size: inherit;
492
- color: var(--gp-grid-text);
493
- border: none;
494
- background-color: transparent;
495
- }
496
-
497
- .gp-grid-edit-input:focus {
498
- outline: none;
499
- }
500
-
501
- /* =============================================================================
502
- Cell Peek (read-only multi-line overlay on dblclick of non-editable cell)
503
- ============================================================================= */
504
-
505
- /* Structural: positioned absolutely by the framework wrapper; must sit above
506
- selection (z:5), editing (z:10), fill handle (z:11). */
507
- .gp-grid-cell-peek {
508
- position: absolute;
509
- z-index: 20;
510
- box-sizing: border-box;
511
- overflow: auto;
512
- max-height: 320px;
513
- }
514
-
515
- :where(.gp-grid-cell-peek) {
516
- padding: 8px 11px;
517
- background-color: var(--gp-grid-bg);
518
- color: var(--gp-grid-text);
519
- border: 2px solid var(--gp-grid-primary);
520
- border-radius: 3px;
521
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
522
- font-family: inherit;
523
- font-size: inherit;
524
- line-height: 1.4;
525
- white-space: pre-wrap;
526
- overflow-wrap: anywhere;
527
- cursor: text;
528
- user-select: text;
529
- -webkit-user-select: text;
530
- }
531
-
532
-
533
-
534
- /* =============================================================================
535
- Loading & Error States
536
- ============================================================================= */
537
-
538
- /* Sticky wrapper: stays pinned at viewport top, takes no layout space */
539
- .gp-grid-loading-anchor {
540
- position: sticky;
541
- top: 0;
542
- left: 0;
543
- height: 0;
544
- z-index: 900;
545
- overflow: visible;
546
- pointer-events: none;
547
- }
548
-
549
- /* Semi-transparent overlay covering the visible viewport area */
550
- .gp-grid-loading-overlay {
551
- position: absolute;
552
- top: 0;
553
- left: 0;
554
- width: 100%;
555
- height: 100%;
556
- pointer-events: none;
557
- }
558
-
559
- :where(.gp-grid-loading-overlay) {
560
- background-color: var(--gp-grid-loading-overlay-bg, rgba(255, 255, 255, 0.4));
561
- }
562
-
563
- :where(.gp-grid-container--dark .gp-grid-loading-overlay) {
564
- background-color: var(--gp-grid-loading-overlay-bg, rgba(0, 0, 0, 0.3));
565
- }
566
-
567
- /* Loading indicator centered in the visible viewport */
568
- .gp-grid-loading {
569
- position: absolute;
570
- top: 50%;
571
- left: 50%;
572
- transform: translate(-50%, -50%);
573
- z-index: 1000;
574
- display: flex;
575
- pointer-events: auto;
576
- }
577
-
578
- :where(.gp-grid-loading) {
579
- align-items: center;
580
- padding: 12px 20px;
581
- background-color: var(--gp-grid-loading-bg);
582
- color: var(--gp-grid-loading-text);
583
- border-radius: 6px;
584
- border: 1px solid var(--gp-grid-border);
585
- font-weight: 500;
586
- font-size: 13px;
587
- gap: 10px;
588
- }
589
-
590
- .gp-grid-loading-spinner {
591
- width: 16px;
592
- height: 16px;
593
- animation: gp-grid-spin 0.7s linear infinite;
594
- }
595
-
596
- :where(.gp-grid-loading-spinner) {
597
- border: 2px solid var(--gp-grid-border);
598
- border-top-color: var(--gp-grid-primary);
599
- border-radius: 50%;
600
- }
601
-
602
- @keyframes gp-grid-spin {
603
- to {
604
- transform: rotate(360deg);
605
- }
606
- }
607
-
608
- .gp-grid-error {
609
- position: absolute;
610
- top: 50%;
611
- left: 50%;
612
- transform: translate(-50%, -50%);
613
- z-index: 1000;
614
- user-select: text;
615
- -webkit-user-select: text;
616
- }
617
-
618
- :where(.gp-grid-error) {
619
- padding: 12px 20px;
620
- background-color: var(--gp-grid-error-bg);
621
- color: var(--gp-grid-error-text);
622
- border-radius: 6px;
623
- border: 1px solid var(--gp-grid-error-text);
624
- font-weight: 500;
625
- font-size: 13px;
626
- max-width: 80%;
627
- text-align: center;
628
- cursor: text;
629
- }
630
-
631
- /* =============================================================================
632
- Empty State
633
- ============================================================================= */
634
-
635
- .gp-grid-empty {
636
- position: absolute;
637
- top: 50%;
638
- left: 50%;
639
- transform: translate(-50%, -50%);
640
- }
641
-
642
- :where(.gp-grid-empty) {
643
- color: var(--gp-grid-text-muted);
644
- font-size: 14px;
645
- text-align: center;
646
- }
647
-
648
-
649
- /* =============================================================================
650
- Scrollbar Styling
651
- ============================================================================= */
652
-
653
- .gp-grid-container::-webkit-scrollbar {
654
- width: 8px;
655
- height: 8px;
656
- }
657
-
658
- :where(.gp-grid-container)::-webkit-scrollbar-track {
659
- background-color: var(--gp-grid-scrollbar-track);
660
- }
661
-
662
- :where(.gp-grid-container)::-webkit-scrollbar-thumb {
663
- background-color: var(--gp-grid-scrollbar-thumb);
664
- border-radius: 4px;
665
- }
666
-
667
- :where(.gp-grid-container)::-webkit-scrollbar-thumb:hover {
668
- background-color: var(--gp-grid-scrollbar-thumb-hover);
669
- }
670
-
671
- :where(.gp-grid-container)::-webkit-scrollbar-corner {
672
- background-color: var(--gp-grid-scrollbar-track);
673
- }
674
-
675
-
676
- /* =============================================================================
677
- Filter Popup
678
- ============================================================================= */
679
-
680
- .gp-grid-filter-popup {
681
- max-height: 400px;
682
- max-width: min(360px, calc(100vw - 16px));
683
- display: flex;
684
- flex-direction: column;
685
- }
686
-
687
- :where(.gp-grid-filter-popup) {
688
- background-color: var(--gp-grid-bg);
689
- border: 1px solid var(--gp-grid-border);
690
- border-radius: 6px;
691
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
692
- font-size: 13px;
693
- }
694
-
695
- :where(.gp-grid-filter-header) {
696
- padding: 10px 12px;
697
- font-weight: 600;
698
- border-bottom: 1px solid var(--gp-grid-border-light);
699
- color: var(--gp-grid-header-text);
700
- }
701
-
702
- .gp-grid-filter-content {
703
- display: flex;
704
- flex-direction: column;
705
- overflow-y: auto;
706
- min-height: 0;
707
- }
708
-
709
- :where(.gp-grid-filter-content) {
710
- padding: 10px 12px;
711
- gap: 10px;
712
- }
713
-
714
- /* Mode toggle (Values / Condition) */
715
- .gp-grid-filter-mode-toggle {
716
- display: flex;
717
- }
718
-
719
- :where(.gp-grid-filter-mode-toggle) {
720
- gap: 4px;
721
- background-color: var(--gp-grid-bg-alt);
722
- border-radius: 4px;
723
- padding: 2px;
724
- }
725
-
726
- .gp-grid-filter-mode-toggle button {
727
- flex: 1;
728
- }
729
-
730
- :where(.gp-grid-filter-mode-toggle button) {
731
- padding: 6px 10px;
732
- font-size: 11px;
733
- font-family: inherit;
734
- border: none;
735
- border-radius: 3px;
736
- background-color: transparent;
737
- color: var(--gp-grid-text-secondary);
738
- cursor: pointer;
739
- transition: background-color 0.15s ease, color 0.15s ease;
740
- }
741
-
742
- :where(.gp-grid-filter-mode-toggle button:hover) {
743
- color: var(--gp-grid-text);
744
- }
745
-
746
- :where(.gp-grid-filter-mode-toggle button.active) {
747
- background-color: var(--gp-grid-bg);
748
- color: var(--gp-grid-text);
749
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
750
- }
751
-
752
- /* Info message for too many values */
753
- :where(.gp-grid-filter-info) {
754
- font-size: 11px;
755
- color: var(--gp-grid-text-secondary);
756
- padding: 6px 8px;
757
- background-color: var(--gp-grid-bg-alt);
758
- border-radius: 4px;
759
- }
760
-
761
- /* Search input in filter */
762
- .gp-grid-filter-search {
763
- width: 100%;
764
- height: 30px;
765
- box-sizing: border-box;
766
- }
767
-
768
- :where(.gp-grid-filter-search) {
769
- padding: 0 10px;
770
- font-family: inherit;
771
- font-size: 12px;
772
- border: 1px solid var(--gp-grid-input-border);
773
- border-radius: 4px;
774
- background-color: var(--gp-grid-input-bg);
775
- color: var(--gp-grid-text);
776
- }
777
-
778
- :where(.gp-grid-filter-search:focus) {
779
- outline: none;
780
- border-color: var(--gp-grid-primary);
781
- }
782
-
783
- /* Select All / Deselect All actions */
784
- .gp-grid-filter-actions {
785
- display: flex;
786
- }
787
-
788
- :where(.gp-grid-filter-actions) {
789
- gap: 8px;
790
- }
791
-
792
- .gp-grid-filter-actions button {
793
- flex: 1;
794
- }
795
-
796
- :where(.gp-grid-filter-actions button) {
797
- padding: 4px 8px;
798
- font-size: 11px;
799
- font-family: inherit;
800
- border: 1px solid var(--gp-grid-input-border);
801
- border-radius: 3px;
802
- background-color: var(--gp-grid-bg);
803
- color: var(--gp-grid-text);
804
- cursor: pointer;
805
- }
806
-
807
- :where(.gp-grid-filter-actions button:hover:not(:disabled)) {
808
- background-color: var(--gp-grid-hover);
809
- }
810
-
811
- :where(.gp-grid-filter-actions button:disabled) {
812
- opacity: 0.5;
813
- cursor: not-allowed;
814
- }
815
-
816
- /* Checkbox list */
817
- .gp-grid-filter-list {
818
- max-height: 200px;
819
- overflow-y: auto;
820
- display: flex;
821
- flex-direction: column;
822
- }
823
-
824
- :where(.gp-grid-filter-list) {
825
- gap: 4px;
826
- border: 1px solid var(--gp-grid-border-light);
827
- border-radius: 4px;
828
- padding: 6px;
829
- }
830
-
831
- .gp-grid-filter-option {
832
- display: flex;
833
- align-items: center;
834
- }
835
-
836
- :where(.gp-grid-filter-option) {
837
- gap: 8px;
838
- padding: 4px 6px;
839
- border-radius: 3px;
840
- cursor: pointer;
841
- }
842
-
843
- :where(.gp-grid-filter-option:hover) {
844
- background-color: var(--gp-grid-hover);
845
- }
846
-
847
- .gp-grid-filter-option input[type="checkbox"] {
848
- margin: 0;
849
- }
850
-
851
- :where(.gp-grid-filter-option input[type="checkbox"]) {
852
- cursor: pointer;
853
- }
854
-
855
- .gp-grid-filter-option span {
856
- flex: 1;
857
- overflow: hidden;
858
- text-overflow: ellipsis;
859
- white-space: nowrap;
860
- }
861
-
862
- :where(.gp-grid-filter-blank) {
863
- font-style: italic;
864
- color: var(--gp-grid-text-muted);
865
- }
866
-
867
- /* Filter condition row (for number/date filters) */
868
- .gp-grid-filter-condition {
869
- display: flex;
870
- flex-direction: column;
871
- }
872
-
873
- :where(.gp-grid-filter-condition) {
874
- gap: 6px;
875
- }
876
-
877
- .gp-grid-filter-row {
878
- display: flex;
879
- align-items: center;
880
- }
881
-
882
- :where(.gp-grid-filter-row) {
883
- gap: 6px;
884
- }
885
-
886
- .gp-grid-filter-row select {
887
- height: 30px;
888
- }
889
-
890
- :where(.gp-grid-filter-row select) {
891
- padding: 0 6px;
892
- font-family: inherit;
893
- font-size: 12px;
894
- border: 1px solid var(--gp-grid-input-border);
895
- border-radius: 4px;
896
- background-color: var(--gp-grid-input-bg);
897
- color: var(--gp-grid-text);
898
- cursor: pointer;
899
- }
900
-
901
- .gp-grid-filter-row input[type="number"],
902
- .gp-grid-filter-row input[type="date"],
903
- .gp-grid-filter-row input[type="text"],
904
- .gp-grid-filter-text-input {
905
- flex: 1;
906
- height: 30px;
907
- min-width: 0;
908
- box-sizing: border-box;
909
- }
910
-
911
- :where(.gp-grid-filter-row input[type="number"]),
912
- :where(.gp-grid-filter-row input[type="date"]),
913
- :where(.gp-grid-filter-row input[type="text"]),
914
- :where(.gp-grid-filter-text-input) {
915
- padding: 0 8px;
916
- font-family: inherit;
917
- font-size: 12px;
918
- border: 1px solid var(--gp-grid-input-border);
919
- border-radius: 4px;
920
- background-color: var(--gp-grid-input-bg);
921
- color: var(--gp-grid-text);
922
- }
923
-
924
- :where(.gp-grid-filter-row input:focus) {
925
- outline: none;
926
- border-color: var(--gp-grid-primary);
927
- }
928
-
929
- :where(.gp-grid-filter-to) {
930
- font-size: 11px;
931
- color: var(--gp-grid-text-secondary);
932
- }
933
-
934
- .gp-grid-filter-remove {
935
- width: 24px;
936
- height: 24px;
937
- }
938
-
939
- :where(.gp-grid-filter-remove) {
940
- padding: 0;
941
- font-size: 16px;
942
- line-height: 1;
943
- border: none;
944
- border-radius: 3px;
945
- background-color: transparent;
946
- color: var(--gp-grid-text-muted);
947
- cursor: pointer;
948
- }
949
-
950
- :where(.gp-grid-filter-remove:hover) {
951
- background-color: var(--gp-grid-error-bg);
952
- color: var(--gp-grid-error-text);
953
- }
954
-
955
- /* AND/OR combination toggle */
956
- .gp-grid-filter-combination {
957
- display: flex;
958
- }
959
-
960
- :where(.gp-grid-filter-combination) {
961
- gap: 4px;
962
- margin-bottom: 4px;
963
- }
964
-
965
- .gp-grid-filter-combination button {
966
- flex: 1;
967
- }
968
-
969
- :where(.gp-grid-filter-combination button) {
970
- padding: 4px 8px;
971
- font-size: 10px;
972
- font-family: inherit;
973
- border: 1px solid var(--gp-grid-input-border);
974
- border-radius: 3px;
975
- background-color: var(--gp-grid-bg);
976
- color: var(--gp-grid-text-secondary);
977
- cursor: pointer;
978
- }
979
-
980
- :where(.gp-grid-filter-combination button.active) {
981
- background-color: var(--gp-grid-primary);
982
- border-color: var(--gp-grid-primary);
983
- color: #fff;
984
- }
985
-
986
- /* Add condition button */
987
- .gp-grid-filter-add {
988
- width: 100%;
989
- }
990
-
991
- :where(.gp-grid-filter-add) {
992
- padding: 6px;
993
- font-size: 11px;
994
- font-family: inherit;
995
- border: 1px dashed var(--gp-grid-border);
996
- border-radius: 4px;
997
- background-color: transparent;
998
- color: var(--gp-grid-text-secondary);
999
- cursor: pointer;
1000
- }
1001
-
1002
- :where(.gp-grid-filter-add:hover) {
1003
- background-color: var(--gp-grid-hover);
1004
- border-color: var(--gp-grid-primary);
1005
- color: var(--gp-grid-primary);
1006
- }
1007
-
1008
- /* Apply / Clear buttons */
1009
- .gp-grid-filter-buttons {
1010
- display: flex;
1011
- }
1012
-
1013
- :where(.gp-grid-filter-buttons) {
1014
- gap: 8px;
1015
- padding-top: 8px;
1016
- border-top: 1px solid var(--gp-grid-border-light);
1017
- }
1018
-
1019
- .gp-grid-filter-btn-clear,
1020
- .gp-grid-filter-btn-apply {
1021
- flex: 1;
1022
- }
1023
-
1024
- :where(.gp-grid-filter-btn-clear),
1025
- :where(.gp-grid-filter-btn-apply) {
1026
- padding: 8px 12px;
1027
- font-size: 12px;
1028
- font-family: inherit;
1029
- border-radius: 4px;
1030
- cursor: pointer;
1031
- }
1032
-
1033
- :where(.gp-grid-filter-btn-clear) {
1034
- border: 1px solid var(--gp-grid-input-border);
1035
- background-color: var(--gp-grid-bg);
1036
- color: var(--gp-grid-text);
1037
- }
1038
-
1039
- :where(.gp-grid-filter-btn-clear:hover) {
1040
- background-color: var(--gp-grid-hover);
1041
- }
1042
-
1043
- :where(.gp-grid-filter-btn-apply) {
1044
- border: 1px solid var(--gp-grid-primary);
1045
- background-color: var(--gp-grid-primary);
1046
- color: #fff;
1047
- }
1048
-
1049
- :where(.gp-grid-filter-btn-apply:hover) {
1050
- opacity: 0.9;
1051
- }
1052
-
1053
-
1054
- /* =============================================================================
1055
- Row Drag
1056
- ============================================================================= */
1057
-
1058
- .gp-grid-cell--row-drag-handle {
1059
- touch-action: none;
1060
- }
1061
-
1062
- :where(.gp-grid-cell--row-drag-handle) {
1063
- cursor: grab;
1064
- }
1065
-
1066
- :where(.gp-grid-cell--row-drag-handle:active) {
1067
- cursor: grabbing;
1068
- }
1069
-
1070
- .gp-grid-row-drag-icon {
1071
- display: flex;
1072
- align-items: center;
1073
- justify-content: center;
1074
- width: 100%;
1075
- height: 100%;
1076
- }
1077
-
1078
- :where(.gp-grid-row-drag-icon) {
1079
- color: var(--gp-grid-text-secondary);
1080
- }
1081
-
1082
- .gp-grid-row-drag-icon svg {
1083
- width: 16px;
1084
- height: 16px;
1085
- }
1086
-
1087
- .gp-grid-row-drag-ghost {
1088
- position: fixed;
1089
- pointer-events: none;
1090
- z-index: 2000;
1091
- overflow: hidden;
1092
- box-sizing: border-box;
1093
- }
1094
-
1095
- :where(.gp-grid-row-drag-ghost) {
1096
- opacity: 0.8;
1097
- background-color: var(--gp-grid-bg, #fff);
1098
- border: 2px solid var(--gp-grid-primary);
1099
- border-radius: 4px;
1100
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
1101
- }
1102
-
1103
- .gp-grid-row-drop-indicator {
1104
- position: absolute;
1105
- left: 0;
1106
- width: 100%;
1107
- height: 3px;
1108
- z-index: 1000;
1109
- pointer-events: none;
1110
- }
1111
-
1112
- :where(.gp-grid-row-drop-indicator) {
1113
- background-color: var(--gp-grid-primary);
1114
- border-radius: 2px;
1115
- }
1
+ .gp-grid-container{--gp-grid-bg:#fff;--gp-grid-bg-alt:#f8f9fa;--gp-grid-text:#212529;--gp-grid-text-secondary:#6c757d;--gp-grid-text-muted:#adb5bd;--gp-grid-border:#dee2e6;--gp-grid-border-light:#e9ecef;--gp-grid-header-bg:#f1f3f5;--gp-grid-header-text:#212529;--gp-grid-header-z-index:10;--gp-grid-primary:#228be6;--gp-grid-primary-light:#e7f5ff;--gp-grid-primary-border:#74c0fc;--gp-grid-hover:#f1f3f5;--gp-grid-filter-bg:#f8f9fa;--gp-grid-input-bg:#fff;--gp-grid-input-border:#ced4da;--gp-grid-error-bg:#fff5f5;--gp-grid-error-text:#c92a2a;--gp-grid-loading-bg:#fffffff2;--gp-grid-loading-text:#495057;--gp-grid-scrollbar-track:#f1f3f5;--gp-grid-scrollbar-thumb:#ced4da;--gp-grid-scrollbar-thumb-hover:#adb5bd}.gp-grid-container--dark{--gp-grid-bg:#1a1b1e;--gp-grid-bg-alt:#25262b;--gp-grid-text:#c1c2c5;--gp-grid-text-secondary:#909296;--gp-grid-text-muted:#5c5f66;--gp-grid-border:#373a40;--gp-grid-border-light:#2c2e33;--gp-grid-header-bg:#25262b;--gp-grid-header-text:#c1c2c5;--gp-grid-header-z-index:10;--gp-grid-primary:#339af0;--gp-grid-primary-light:#1c3d5a;--gp-grid-primary-border:#1c7ed6;--gp-grid-hover:#2c2e33;--gp-grid-filter-bg:#25262b;--gp-grid-input-bg:#1a1b1e;--gp-grid-input-border:#373a40;--gp-grid-error-bg:#2c1a1a;--gp-grid-error-text:#ff6b6b;--gp-grid-loading-bg:#1a1b1ef2;--gp-grid-loading-text:#c1c2c5;--gp-grid-scrollbar-track:#25262b;--gp-grid-scrollbar-thumb:#373a40;--gp-grid-scrollbar-thumb-hover:#4a4d52}.gp-grid-container{-webkit-user-select:none;user-select:none;outline:none}:where(.gp-grid-container){color:var(--gp-grid-text);background-color:var(--gp-grid-bg);border:1px solid var(--gp-grid-border);border-radius:6px;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:13px;line-height:1.5}.gp-grid-container:focus{outline:none}:where(.gp-grid-container:focus){border-color:var(--gp-grid-primary)}.gp-grid-header{z-index:11;flex-shrink:0;position:sticky;top:0;left:0;overflow:hidden}:where(.gp-grid-header){background-color:var(--gp-grid-header-bg);border-bottom:1px solid var(--gp-grid-border)}.gp-grid-container .gp-grid-header-cell{box-sizing:border-box;user-select:none;touch-action:none;display:flex;position:absolute;top:0}:where(.gp-grid-header-cell){border-right:1px solid var(--gp-grid-border);letter-spacing:.5px;color:var(--gp-grid-header-text);cursor:pointer;background-color:#0000;align-items:center;padding:0 12px;font-size:12px;font-weight:600;transition:background-color .1s}:where(.gp-grid-header-cell:hover){background-color:var(--gp-grid-hover)}:where(.gp-grid-header-cell:active){background-color:var(--gp-grid-border-light)}.gp-grid-container .gp-grid-header-text{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}:where(.gp-grid-header-text){color:var(--gp-grid-header-text)}.gp-grid-header-icons{align-items:center;gap:4px;margin-left:auto;display:flex}.gp-grid-sort-arrows{flex-direction:row;align-items:center;gap:2px;margin-left:6px;display:flex}.gp-grid-sort-arrows-stack{flex-direction:column;align-items:center;gap:2px;display:flex}:where(.gp-grid-sort-arrow-up),:where(.gp-grid-sort-arrow-down){opacity:.35;color:var(--gp-grid-text);transition:opacity .15s,color .15s}:where(.gp-grid-sort-arrow-up.active),:where(.gp-grid-sort-arrow-down.active){opacity:1;color:var(--gp-grid-primary)}:where(.gp-grid-sort-index){color:var(--gp-grid-primary);font-size:9px;font-weight:600}.gp-grid-filter-icon{justify-content:center;align-items:center;width:20px;height:20px;display:flex}:where(.gp-grid-filter-icon){cursor:pointer;color:var(--gp-grid-text-secondary);border-radius:4px;margin-left:2px;transition:background-color .15s,color .15s}:where(.gp-grid-filter-icon:hover){background-color:var(--gp-grid-hover);color:var(--gp-grid-primary)}:where(.gp-grid-filter-icon.active){color:var(--gp-grid-primary);background-color:var(--gp-grid-primary-light)}@media (pointer:coarse) and (hover:none) and (width<=768px){.gp-grid-filter-icon{width:44px;min-width:44px;height:44px;min-height:44px}:where(.gp-grid-filter-icon){margin-left:0}.gp-grid-filter-icon svg{width:20px;height:20px}}.gp-grid-header--loading .gp-grid-header-cell{pointer-events:none}:where(.gp-grid-header--loading .gp-grid-header-cell){opacity:.6;cursor:default}.gp-grid-header-resize-handle{cursor:col-resize;z-index:10;touch-action:none;width:6px;height:100%;position:absolute;top:0;right:-3px}:where(.gp-grid-header-resize-handle:hover),:where(.gp-grid-header-resize-handle--active){background-color:var(--gp-grid-primary);opacity:.4}@media (pointer:coarse) and (hover:none) and (width<=768px){.gp-grid-header-resize-handle{width:24px;right:-12px}}.gp-grid-column-resize-line{z-index:1000;pointer-events:none;width:2px;height:100%;position:absolute;top:0}:where(.gp-grid-column-resize-line){background-color:var(--gp-grid-primary)}.gp-grid-column-move-ghost{pointer-events:none;z-index:2000;box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;align-items:center;display:flex;position:fixed;overflow:hidden}:where(.gp-grid-column-move-ghost){opacity:.7;background-color:var(--gp-grid-header-bg);border:2px solid var(--gp-grid-primary);letter-spacing:.5px;color:var(--gp-grid-header-text);border-radius:4px;padding:0 12px;font-size:12px;font-weight:600;box-shadow:0 4px 12px #00000026}.gp-grid-column-drop-indicator{z-index:1000;pointer-events:none;width:3px;height:100%;position:absolute;top:0;left:0}:where(.gp-grid-column-drop-indicator){background-color:var(--gp-grid-primary);border-radius:2px}.gp-grid-rows-wrapper{z-index:1;will-change:transform;position:absolute;top:0;left:0}.gp-grid-row{position:absolute;top:0;left:0}:where(.gp-grid-row){background-color:var(--gp-grid-bg)}.gp-grid-cell{box-sizing:border-box;white-space:nowrap;-webkit-user-select:none;user-select:none;display:flex;position:absolute;top:0;overflow:hidden}.gp-grid-cell-content{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;overflow:hidden}.gp-grid-cell--wrap{align-items:flex-start}.gp-grid-cell--wrap .gp-grid-cell-content{white-space:normal;overflow-wrap:anywhere;text-overflow:clip}:where(.gp-grid-cell){cursor:cell;color:var(--gp-grid-text);border-right:1px solid var(--gp-grid-border-light);border-bottom:1px solid var(--gp-grid-border-light);background-color:#0000;align-items:center;padding:0 12px}.gp-grid-cell--active{z-index:5;outline:none}:where(.gp-grid-cell--active){background-color:var(--gp-grid-primary-light);border:2px solid var(--gp-grid-primary);padding:0 11px}:where(.gp-grid-cell--selected){background-color:var(--gp-grid-primary-light)}.gp-grid-cell--editing{z-index:10}:where(.gp-grid-cell--editing){background-color:var(--gp-grid-bg);border:2px solid var(--gp-grid-primary);padding:0}.gp-grid-fill-handle{z-index:11;pointer-events:auto;box-sizing:border-box;touch-action:none;width:8px;height:8px;position:absolute}:where(.gp-grid-fill-handle){background-color:var(--gp-grid-primary);border:2px solid var(--gp-grid-bg);cursor:crosshair;border-radius:1px}:where(.gp-grid-fill-handle:hover){transform:scale(1.2)}@media (pointer:coarse) and (hover:none) and (width<=768px){.gp-grid-fill-handle{width:24px;height:24px}:where(.gp-grid-fill-handle){border-width:3px;border-radius:3px}}:where(.gp-grid-cell.gp-grid-cell--fill-preview){background-color:var(--gp-grid-primary-light);border:1px dashed var(--gp-grid-primary)}.gp-grid-edit-input{width:100%;height:100%}:where(.gp-grid-edit-input){font-family:inherit;font-size:inherit;color:var(--gp-grid-text);background-color:#0000;border:none;padding:0 11px}.gp-grid-edit-input:focus{outline:none}.gp-grid-cell-peek{z-index:20;box-sizing:border-box;max-height:320px;position:absolute;overflow:auto}:where(.gp-grid-cell-peek){background-color:var(--gp-grid-bg);color:var(--gp-grid-text);border:2px solid var(--gp-grid-primary);font-family:inherit;font-size:inherit;white-space:pre-wrap;overflow-wrap:anywhere;cursor:text;-webkit-user-select:text;user-select:text;border-radius:3px;padding:8px 11px;line-height:1.4;box-shadow:0 4px 12px #00000026}.gp-grid-cell-peek .gp-grid-cell-content{white-space:inherit;text-overflow:clip;overflow:visible}.gp-grid-loading-anchor{z-index:900;pointer-events:none;height:0;position:sticky;top:0;left:0;overflow:visible}.gp-grid-loading-overlay{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0}:where(.gp-grid-loading-overlay){background-color:var(--gp-grid-loading-overlay-bg,#fff6)}:where(.gp-grid-container--dark .gp-grid-loading-overlay){background-color:var(--gp-grid-loading-overlay-bg,#0000004d)}.gp-grid-loading{z-index:1000;pointer-events:auto;display:flex;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}:where(.gp-grid-loading){background-color:var(--gp-grid-loading-bg);color:var(--gp-grid-loading-text);border:1px solid var(--gp-grid-border);border-radius:6px;align-items:center;gap:10px;padding:12px 20px;font-size:13px;font-weight:500}.gp-grid-loading-spinner{width:16px;height:16px;animation:.7s linear infinite gp-grid-spin}:where(.gp-grid-loading-spinner){border:2px solid var(--gp-grid-border);border-top-color:var(--gp-grid-primary);border-radius:50%}@keyframes gp-grid-spin{to{transform:rotate(360deg)}}.gp-grid-error{z-index:1000;-webkit-user-select:text;user-select:text;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}:where(.gp-grid-error){background-color:var(--gp-grid-error-bg);color:var(--gp-grid-error-text);border:1px solid var(--gp-grid-error-text);text-align:center;cursor:text;border-radius:6px;max-width:80%;padding:12px 20px;font-size:13px;font-weight:500}.gp-grid-empty{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}:where(.gp-grid-empty){color:var(--gp-grid-text-muted);text-align:center;font-size:14px}.gp-grid-container::-webkit-scrollbar{width:8px;height:8px}:where(.gp-grid-container)::-webkit-scrollbar-track{background-color:var(--gp-grid-scrollbar-track)}:where(.gp-grid-container)::-webkit-scrollbar-thumb{background-color:var(--gp-grid-scrollbar-thumb);border-radius:4px}:where(.gp-grid-container)::-webkit-scrollbar-thumb:hover{background-color:var(--gp-grid-scrollbar-thumb-hover)}:where(.gp-grid-container)::-webkit-scrollbar-corner{background-color:var(--gp-grid-scrollbar-track)}.gp-grid-filter-popup{flex-direction:column;max-width:min(360px,100vw - 16px);max-height:400px;display:flex}:where(.gp-grid-filter-popup){background-color:var(--gp-grid-bg);border:1px solid var(--gp-grid-border);border-radius:6px;font-size:13px;box-shadow:0 4px 12px #00000026}:where(.gp-grid-filter-header){border-bottom:1px solid var(--gp-grid-border-light);color:var(--gp-grid-header-text);padding:10px 12px;font-weight:600}.gp-grid-filter-content{flex-direction:column;min-height:0;display:flex;overflow-y:auto}:where(.gp-grid-filter-content){gap:10px;padding:10px 12px}.gp-grid-filter-mode-toggle{display:flex}:where(.gp-grid-filter-mode-toggle){background-color:var(--gp-grid-bg-alt);border-radius:4px;gap:4px;padding:2px}.gp-grid-filter-mode-toggle button{flex:1}:where(.gp-grid-filter-mode-toggle button){color:var(--gp-grid-text-secondary);cursor:pointer;background-color:#0000;border:none;border-radius:3px;padding:6px 10px;font-family:inherit;font-size:11px;transition:background-color .15s,color .15s}:where(.gp-grid-filter-mode-toggle button:hover){color:var(--gp-grid-text)}:where(.gp-grid-filter-mode-toggle button.active){background-color:var(--gp-grid-bg);color:var(--gp-grid-text);box-shadow:0 1px 2px #0000001a}:where(.gp-grid-filter-info){color:var(--gp-grid-text-secondary);background-color:var(--gp-grid-bg-alt);border-radius:4px;padding:6px 8px;font-size:11px}.gp-grid-filter-search{box-sizing:border-box;width:100%;height:30px}:where(.gp-grid-filter-search){border:1px solid var(--gp-grid-input-border);background-color:var(--gp-grid-input-bg);color:var(--gp-grid-text);border-radius:4px;padding:0 10px;font-family:inherit;font-size:12px}:where(.gp-grid-filter-search:focus){border-color:var(--gp-grid-primary);outline:none}.gp-grid-filter-actions{display:flex}:where(.gp-grid-filter-actions){gap:8px}.gp-grid-filter-actions button{flex:1}:where(.gp-grid-filter-actions button){border:1px solid var(--gp-grid-input-border);background-color:var(--gp-grid-bg);color:var(--gp-grid-text);cursor:pointer;border-radius:3px;padding:4px 8px;font-family:inherit;font-size:11px}:where(.gp-grid-filter-actions button:hover:not(:disabled)){background-color:var(--gp-grid-hover)}:where(.gp-grid-filter-actions button:disabled){opacity:.5;cursor:not-allowed}.gp-grid-filter-list{flex-direction:column;max-height:200px;display:flex;overflow-y:auto}:where(.gp-grid-filter-list){border:1px solid var(--gp-grid-border-light);border-radius:4px;gap:4px;padding:6px}.gp-grid-filter-option{align-items:center;display:flex}:where(.gp-grid-filter-option){cursor:pointer;border-radius:3px;gap:8px;padding:4px 6px}:where(.gp-grid-filter-option:hover){background-color:var(--gp-grid-hover)}.gp-grid-filter-option input[type=checkbox]{margin:0}:where(.gp-grid-filter-option input[type=checkbox]){cursor:pointer}.gp-grid-filter-option span{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}:where(.gp-grid-filter-blank){color:var(--gp-grid-text-muted);font-style:italic}.gp-grid-filter-condition{flex-direction:column;display:flex}:where(.gp-grid-filter-condition){gap:6px}.gp-grid-filter-row{align-items:center;display:flex}:where(.gp-grid-filter-row){gap:6px}.gp-grid-filter-row select{height:30px}:where(.gp-grid-filter-row select){border:1px solid var(--gp-grid-input-border);background-color:var(--gp-grid-input-bg);color:var(--gp-grid-text);cursor:pointer;border-radius:4px;padding:0 6px;font-family:inherit;font-size:12px}.gp-grid-filter-row input[type=number],.gp-grid-filter-row input[type=date],.gp-grid-filter-row input[type=text],.gp-grid-filter-text-input{box-sizing:border-box;flex:1;min-width:0;height:30px}:where(.gp-grid-filter-row input[type=number]),:where(.gp-grid-filter-row input[type=date]),:where(.gp-grid-filter-row input[type=text]),:where(.gp-grid-filter-text-input){border:1px solid var(--gp-grid-input-border);background-color:var(--gp-grid-input-bg);color:var(--gp-grid-text);border-radius:4px;padding:0 8px;font-family:inherit;font-size:12px}:where(.gp-grid-filter-row input:focus){border-color:var(--gp-grid-primary);outline:none}:where(.gp-grid-filter-to){color:var(--gp-grid-text-secondary);font-size:11px}.gp-grid-filter-remove{width:24px;height:24px}:where(.gp-grid-filter-remove){color:var(--gp-grid-text-muted);cursor:pointer;background-color:#0000;border:none;border-radius:3px;padding:0;font-size:16px;line-height:1}:where(.gp-grid-filter-remove:hover){background-color:var(--gp-grid-error-bg);color:var(--gp-grid-error-text)}.gp-grid-filter-combination{display:flex}:where(.gp-grid-filter-combination){gap:4px;margin-bottom:4px}.gp-grid-filter-combination button{flex:1}:where(.gp-grid-filter-combination button){border:1px solid var(--gp-grid-input-border);background-color:var(--gp-grid-bg);color:var(--gp-grid-text-secondary);cursor:pointer;border-radius:3px;padding:4px 8px;font-family:inherit;font-size:10px}:where(.gp-grid-filter-combination button.active){background-color:var(--gp-grid-primary);border-color:var(--gp-grid-primary);color:#fff}.gp-grid-filter-add{width:100%}:where(.gp-grid-filter-add){border:1px dashed var(--gp-grid-border);color:var(--gp-grid-text-secondary);cursor:pointer;background-color:#0000;border-radius:4px;padding:6px;font-family:inherit;font-size:11px}:where(.gp-grid-filter-add:hover){background-color:var(--gp-grid-hover);border-color:var(--gp-grid-primary);color:var(--gp-grid-primary)}.gp-grid-filter-buttons{display:flex}:where(.gp-grid-filter-buttons){border-top:1px solid var(--gp-grid-border-light);gap:8px;padding-top:8px}.gp-grid-filter-btn-clear,.gp-grid-filter-btn-apply{flex:1}:where(.gp-grid-filter-btn-clear),:where(.gp-grid-filter-btn-apply){cursor:pointer;border-radius:4px;padding:8px 12px;font-family:inherit;font-size:12px}:where(.gp-grid-filter-btn-clear){border:1px solid var(--gp-grid-input-border);background-color:var(--gp-grid-bg);color:var(--gp-grid-text)}:where(.gp-grid-filter-btn-clear:hover){background-color:var(--gp-grid-hover)}:where(.gp-grid-filter-btn-apply){border:1px solid var(--gp-grid-primary);background-color:var(--gp-grid-primary);color:#fff}:where(.gp-grid-filter-btn-apply:hover){opacity:.9}.gp-grid-cell--row-drag-handle{touch-action:none}:where(.gp-grid-cell--row-drag-handle){cursor:grab}:where(.gp-grid-cell--row-drag-handle:active){cursor:grabbing}.gp-grid-row-drag-icon{justify-content:center;align-items:center;width:100%;height:100%;display:flex}:where(.gp-grid-row-drag-icon){color:var(--gp-grid-text-secondary)}.gp-grid-row-drag-icon svg{width:16px;height:16px}.gp-grid-row-drag-ghost{pointer-events:none;z-index:2000;box-sizing:border-box;position:fixed;overflow:hidden}:where(.gp-grid-row-drag-ghost){opacity:.8;background-color:var(--gp-grid-bg,#fff);border:2px solid var(--gp-grid-primary);border-radius:4px;box-shadow:0 4px 12px #00000026}.gp-grid-row-drop-indicator{z-index:1000;pointer-events:none;width:100%;height:3px;position:absolute;left:0}:where(.gp-grid-row-drop-indicator){background-color:var(--gp-grid-primary);border-radius:2px}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@gp-grid/react",
3
3
  "description": "A high-performance React data grid component with virtual scrolling, cell selection, sorting, filtering, and Excel-like editing",
4
- "version": "0.20.0",
4
+ "version": "0.22.0",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
@@ -52,7 +52,7 @@
52
52
  "link-workspace-packages": false
53
53
  },
54
54
  "dependencies": {
55
- "@gp-grid/core": "0.20.0"
55
+ "@gp-grid/core": "0.22.0"
56
56
  },
57
57
  "peerDependencies": {
58
58
  "react": "^18.0.0 || ^19.0.0",