@dxos/lit-grid 0.6.13 → 0.6.14-main.1366248

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.
Files changed (70) hide show
  1. package/dist/src/dx-grid-axis-resize-handle.d.ts +16 -0
  2. package/dist/src/dx-grid-axis-resize-handle.d.ts.map +1 -0
  3. package/dist/src/dx-grid-axis-resize-handle.js +96 -0
  4. package/dist/src/dx-grid-axis-resize-handle.js.map +1 -0
  5. package/dist/src/dx-grid-multiselect-cell.d.ts +13 -0
  6. package/dist/src/dx-grid-multiselect-cell.d.ts.map +1 -0
  7. package/dist/src/dx-grid-multiselect-cell.js +56 -0
  8. package/dist/src/dx-grid-multiselect-cell.js.map +1 -0
  9. package/dist/src/dx-grid.d.ts +147 -0
  10. package/dist/src/dx-grid.d.ts.map +1 -0
  11. package/dist/src/dx-grid.js +1375 -0
  12. package/dist/src/dx-grid.js.map +1 -0
  13. package/dist/src/dx-grid.lit-stories.d.ts +43 -0
  14. package/dist/src/dx-grid.lit-stories.d.ts.map +1 -0
  15. package/dist/src/dx-grid.lit-stories.js +176 -0
  16. package/dist/src/dx-grid.lit-stories.js.map +1 -0
  17. package/dist/src/index.d.ts +4 -0
  18. package/dist/src/index.d.ts.map +1 -0
  19. package/dist/src/index.js +7 -0
  20. package/dist/src/index.js.map +1 -0
  21. package/dist/src/types.d.ts +123 -0
  22. package/dist/src/types.d.ts.map +1 -0
  23. package/dist/src/types.js +44 -0
  24. package/dist/src/types.js.map +1 -0
  25. package/dist/src/util.d.ts +9 -0
  26. package/dist/src/util.d.ts.map +1 -0
  27. package/dist/src/util.js +19 -0
  28. package/dist/src/util.js.map +1 -0
  29. package/dist/types/src/dx-grid-axis-resize-handle.d.ts +16 -0
  30. package/dist/types/src/dx-grid-axis-resize-handle.d.ts.map +1 -0
  31. package/dist/types/src/dx-grid-axis-resize-handle.js +96 -0
  32. package/dist/types/src/dx-grid-axis-resize-handle.js.map +1 -0
  33. package/dist/types/src/dx-grid-multiselect-cell.d.ts +13 -0
  34. package/dist/types/src/dx-grid-multiselect-cell.d.ts.map +1 -0
  35. package/dist/types/src/dx-grid-multiselect-cell.js +56 -0
  36. package/dist/types/src/dx-grid-multiselect-cell.js.map +1 -0
  37. package/dist/types/src/dx-grid.d.ts +121 -57
  38. package/dist/types/src/dx-grid.d.ts.map +1 -1
  39. package/dist/types/src/dx-grid.js +1375 -0
  40. package/dist/types/src/dx-grid.js.map +1 -0
  41. package/dist/types/src/dx-grid.lit-stories.d.ts +28 -2
  42. package/dist/types/src/dx-grid.lit-stories.d.ts.map +1 -1
  43. package/dist/types/src/dx-grid.lit-stories.js +176 -0
  44. package/dist/types/src/dx-grid.lit-stories.js.map +1 -0
  45. package/dist/types/src/index.d.ts +1 -0
  46. package/dist/types/src/index.d.ts.map +1 -1
  47. package/dist/types/src/index.js +7 -0
  48. package/dist/types/src/index.js.map +1 -0
  49. package/dist/types/src/types.d.ts +115 -1
  50. package/dist/types/src/types.d.ts.map +1 -1
  51. package/dist/types/src/types.js +44 -0
  52. package/dist/types/src/types.js.map +1 -0
  53. package/dist/types/src/util.d.ts +9 -0
  54. package/dist/types/src/util.d.ts.map +1 -0
  55. package/dist/types/src/util.js +19 -0
  56. package/dist/types/src/util.js.map +1 -0
  57. package/package.json +7 -7
  58. package/src/dx-grid-axis-resize-handle.pcss +23 -0
  59. package/src/dx-grid-axis-resize-handle.ts +87 -0
  60. package/src/dx-grid-multiselect-cell.pcss +32 -0
  61. package/src/dx-grid-multiselect-cell.ts +46 -0
  62. package/src/dx-grid.lit-stories.ts +159 -21
  63. package/src/dx-grid.pcss +70 -71
  64. package/src/dx-grid.ts +1307 -363
  65. package/src/index.ts +1 -0
  66. package/src/types.ts +165 -1
  67. package/src/util.ts +28 -0
  68. package/dist/lib/browser/index.mjs +0 -578
  69. package/dist/lib/browser/index.mjs.map +0 -7
  70. package/dist/lib/browser/meta.json +0 -1
@@ -0,0 +1,23 @@
1
+ dx-grid-axis-resize-handle {
2
+ display: contents;
3
+ }
4
+
5
+ .dx-grid__resize-handle {
6
+ position: absolute;
7
+ background: transparent;
8
+ &:hover {
9
+ background: var(--dx-grid-resizeHandleHover, var(--dx-hoverSurface));
10
+ }
11
+ &[data-dx-grid-axis='col'] {
12
+ inset-block: 0;
13
+ inset-inline-end: 0;
14
+ inline-size: .5rem;
15
+ cursor: col-resize;
16
+ }
17
+ &[data-dx-grid-axis='row'] {
18
+ inset-inline: 0;
19
+ inset-block-end: 0;
20
+ block-size: .5rem;
21
+ cursor: row-resize;
22
+ }
23
+ }
@@ -0,0 +1,87 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { draggable } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
6
+ import { disableNativeDragPreview } from '@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview';
7
+ import { preventUnhandled } from '@atlaskit/pragmatic-drag-and-drop/prevent-unhandled';
8
+ import { type CleanupFn, type DragLocationHistory } from '@atlaskit/pragmatic-drag-and-drop/types';
9
+ import { html, LitElement } from 'lit';
10
+ import { customElement, property } from 'lit/decorators.js';
11
+ import { ref } from 'lit/directives/ref.js';
12
+
13
+ import { DxAxisResizeInternal, type DxGridAxis, type DxGridFrozenPlane } from './types';
14
+
15
+ @customElement('dx-grid-axis-resize-handle')
16
+ export class DxGridAxisResizeHandle extends LitElement {
17
+ @property({ type: String })
18
+ axis: DxGridAxis = 'row';
19
+
20
+ @property({ type: String })
21
+ plane: 'grid' | DxGridFrozenPlane = 'grid';
22
+
23
+ @property({ type: String })
24
+ index: string = '-1';
25
+
26
+ @property({ type: Number })
27
+ size: number = 128;
28
+
29
+ private dragStartSize: number = 128;
30
+
31
+ override render() {
32
+ return html`<button class="dx-grid__resize-handle" data-dx-grid-axis=${this.axis} ${ref(this.mount)}>
33
+ <span class="sr-only">Resize</span>
34
+ </button>`;
35
+ }
36
+
37
+ private cleanup: CleanupFn | null = null;
38
+
39
+ private dispatchResize(location: DragLocationHistory, state: 'dragging' | 'dropped') {
40
+ const client = this.axis === 'row' ? 'clientY' : 'clientX';
41
+ const event = new DxAxisResizeInternal({
42
+ axis: this.axis,
43
+ plane: this.plane,
44
+ size: this.dragStartSize,
45
+ index: this.index,
46
+ delta: location.current.input[client] - location.initial.input[client],
47
+ state,
48
+ });
49
+ this.dispatchEvent(event);
50
+ }
51
+
52
+ private mount(element?: Element) {
53
+ this.cleanup?.();
54
+ const host = this;
55
+ if (element) {
56
+ this.cleanup = draggable({
57
+ element: element as HTMLButtonElement,
58
+ onGenerateDragPreview: ({ nativeSetDragImage }) => {
59
+ // we will be moving the line to indicate a drag
60
+ // we can disable the native drag preview
61
+ disableNativeDragPreview({ nativeSetDragImage });
62
+ // we don't want any native drop animation for when the user
63
+ // does not drop on a drop target. we want the drag to finish immediately
64
+ preventUnhandled.start();
65
+ },
66
+ onDragStart() {
67
+ host.dragStartSize = host.size;
68
+ },
69
+ onDrag({ location }) {
70
+ host.dispatchResize(location, 'dragging');
71
+ },
72
+ onDrop({ location }) {
73
+ host.dispatchResize(location, 'dropped');
74
+ },
75
+ });
76
+ }
77
+ }
78
+
79
+ override disconnectedCallback() {
80
+ super.disconnectedCallback();
81
+ this.cleanup?.();
82
+ }
83
+
84
+ override createRenderRoot() {
85
+ return this;
86
+ }
87
+ }
@@ -0,0 +1,32 @@
1
+ dx-grid-multiselect-cell {
2
+ display: contents;
3
+ }
4
+
5
+ .dx-grid__cell__multiselect{
6
+ display: flex;
7
+ flex-flow: row nowrap;
8
+ gap: 2px;
9
+ inline-size: 100%;
10
+ block-size: 100%;
11
+ & > span {
12
+ flex: 0 1 auto;
13
+ overflow: hidden;
14
+ white-space: nowrap;
15
+ text-overflow: ellipsis;
16
+ &.dx-grid__cell__multiselect__value {
17
+ @apply border border-separator text-xs font-semibold pli-2 plb-1 rounded cursor-default text-neutral-800 dark:text-neutral-150
18
+ }
19
+ &.dx-grid__cell__multiselect__placeholder {
20
+ @apply text-description;
21
+ }
22
+ }
23
+ & > .dx-grid__cell__multiselect__separator{
24
+ flex: 1 0 0;
25
+ }
26
+ & > svg {
27
+ flex: 0 0 auto;
28
+ margin-block: .25em;
29
+ inline-size: 1em;
30
+ block-size: 1em;
31
+ }
32
+ }
@@ -0,0 +1,46 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { html, LitElement } from 'lit';
6
+ import { customElement, property } from 'lit/decorators.js';
7
+
8
+ export type DxGridSelectValue = {
9
+ label: string;
10
+ };
11
+
12
+ @customElement('dx-grid-multiselect-cell')
13
+ export class DxGridMultiselectCell extends LitElement {
14
+ @property({ type: Array })
15
+ values: DxGridSelectValue[] = [];
16
+
17
+ @property({ type: Boolean })
18
+ expanded: boolean = false;
19
+
20
+ @property({ type: String })
21
+ controls: string = '';
22
+
23
+ @property({ type: String })
24
+ placeholder: string = '';
25
+
26
+ override render() {
27
+ return html`<button
28
+ role="combobox"
29
+ aria-expanded=${this.expanded}
30
+ ?aria-controls=${this.controls}
31
+ aria-haspopup="dialog"
32
+ class="dx-grid__cell__multiselect"
33
+ data-dx-grid-accessory="invoke-multiselect"
34
+ >
35
+ ${this.values.length > 0
36
+ ? this.values.map(({ label }) => html`<span class="dx-grid__cell__multiselect__value">${label}</span>`)
37
+ : html`<span class="dx-grid__cell__multiselect__placeholder">${this.placeholder}</span>`}
38
+ <span role="none" class="dx-grid__cell__multiselect__separator"></span>
39
+ <svg><use href="/icons.svg#ph--caret-down--regular" /></svg>
40
+ </button>`;
41
+ }
42
+
43
+ override createRenderRoot() {
44
+ return this;
45
+ }
46
+ }
@@ -5,43 +5,181 @@
5
5
  import './dx-grid.ts';
6
6
  import './dx-grid.pcss';
7
7
 
8
+ import './dx-grid-multiselect-cell.ts';
9
+
8
10
  import { html, nothing } from 'lit';
9
11
 
10
- import { type DxGridProps } from './dx-grid';
12
+ import { type DxGridFrozenPlane, type DxGridPlaneCells, type DxGridProps } from './types';
13
+ import { colToA1Notation, rowToA1Notation } from './util';
11
14
 
12
15
  export default {
13
16
  title: 'dx-grid',
17
+ parameters: { layout: 'fullscreen' },
14
18
  };
15
19
 
16
20
  export const Basic = (props: DxGridProps) => {
17
- return html`<dx-grid
18
- cells=${props.cells ?? nothing}
19
- columnDefault=${props.columnDefault ?? nothing}
20
- rowDefault=${props.rowDefault ?? nothing}
21
- columns=${props.columns ?? nothing}
22
- ></dx-grid>`;
21
+ return html`<div class="dark" style="position:fixed;inset:0;">
22
+ <dx-grid
23
+ initialCells=${props.initialCells ?? nothing}
24
+ columnDefault=${props.columnDefault ?? nothing}
25
+ rowDefault=${props.rowDefault ?? nothing}
26
+ columns=${props.columns ?? nothing}
27
+ frozen=${props.frozen ?? nothing}
28
+ ></dx-grid>
29
+ </div>`;
23
30
  };
24
31
 
32
+ const initialLabels = {
33
+ fixedStartStart: {
34
+ '0,0': { value: '', resizeHandle: 'col' },
35
+ },
36
+ frozenColsStart: [...Array(64)].reduce((acc, _, i) => {
37
+ acc[`0,${i}`] = { value: rowToA1Notation(i), className: 'text-end !pie-1', resizeHandle: 'row' };
38
+ return acc;
39
+ }, {}),
40
+ frozenRowsStart: [...Array(12)].reduce((acc, _, i) => {
41
+ acc[`${i},0`] = { value: colToA1Notation(i), resizeHandle: 'col' };
42
+ return acc;
43
+ }, {}),
44
+ } satisfies Partial<Record<DxGridFrozenPlane | 'fixedStartStart', DxGridPlaneCells>>;
45
+
25
46
  Basic.args = {
26
- cells: JSON.stringify({
27
- '1,1': {
28
- // end: '8,1',
29
- value: 'Weekly sales report',
47
+ initialCells: JSON.stringify({
48
+ grid: {
49
+ '1,1': {
50
+ // end: '8,1',
51
+ value: 'Waffle production',
52
+ },
53
+ '2,2': {
54
+ value: '',
55
+ accessoryHtml: '<dx-grid-multiselect-cell values=\'[{"label": "Peaches"}]\'></dx-grid-multiselect-cell>',
56
+ },
57
+ },
58
+ ...initialLabels,
59
+ } satisfies DxGridProps['initialCells']),
60
+ columnDefault: JSON.stringify({
61
+ grid: {
62
+ size: 180,
63
+ resizeable: true,
64
+ },
65
+ frozenColsStart: {
66
+ size: 64,
67
+ resizeable: true,
68
+ },
69
+ } satisfies DxGridProps['columnDefault']),
70
+ rowDefault: JSON.stringify({
71
+ grid: {
72
+ size: 32,
73
+ resizeable: true,
74
+ },
75
+ frozenRowsStart: {
76
+ size: 32,
77
+ resizeable: true,
78
+ },
79
+ } satisfies DxGridProps['rowDefault']),
80
+ columns: JSON.stringify({
81
+ grid: {
82
+ 0: { size: 64 },
83
+ 1: { size: 512 },
84
+ 2: { size: 64 },
85
+ 3: { size: 512 },
86
+ 4: { size: 64 },
87
+ 5: { size: 512 },
88
+ 6: { size: 64 },
89
+ 7: { size: 512 },
90
+ 8: { size: 64 },
91
+ 9: { size: 512 },
92
+ },
93
+ } satisfies DxGridProps['columns']),
94
+ frozen: JSON.stringify({
95
+ frozenColsStart: 1,
96
+ frozenRowsStart: 1,
97
+ } satisfies DxGridProps['frozen']),
98
+ };
99
+
100
+ export const Frozen = (props: DxGridProps) => {
101
+ return html`<div class="dark" style="position:fixed;inset:0;">
102
+ <dx-grid
103
+ initialCells=${props.initialCells ?? nothing}
104
+ columnDefault=${props.columnDefault ?? nothing}
105
+ rowDefault=${props.rowDefault ?? nothing}
106
+ columns=${props.columns ?? nothing}
107
+ frozen=${props.frozen ?? nothing}
108
+ ></dx-grid>
109
+ </div>`;
110
+ };
111
+
112
+ Frozen.args = {
113
+ initialCells: JSON.stringify({
114
+ grid: {},
115
+ ...initialLabels,
116
+ } satisfies DxGridProps['initialCells']),
117
+ columnDefault: JSON.stringify({
118
+ grid: {
119
+ size: 32,
120
+ },
121
+ frozenColsStart: {
122
+ size: 32,
123
+ },
124
+ frozenColsEnd: {
125
+ size: 32,
126
+ },
127
+ } satisfies DxGridProps['columnDefault']),
128
+ rowDefault: JSON.stringify({
129
+ grid: {
130
+ size: 32,
131
+ },
132
+ frozenRowsStart: {
133
+ size: 32,
134
+ },
135
+ frozenRowsEnd: {
136
+ size: 32,
30
137
  },
31
- } satisfies DxGridProps['cells']),
138
+ } satisfies DxGridProps['rowDefault']),
139
+ columns: JSON.stringify({ grid: {} } satisfies DxGridProps['columns']),
140
+ rows: JSON.stringify({ grid: {} } satisfies DxGridProps['rows']),
141
+ frozen: JSON.stringify({
142
+ frozenColsStart: 2,
143
+ frozenRowsStart: 2,
144
+ frozenColsEnd: 2,
145
+ frozenRowsEnd: 2,
146
+ } satisfies DxGridProps['frozen']),
147
+ };
148
+
149
+ export const Limits = (props: DxGridProps) => {
150
+ return html`<div style="position:fixed;inset:0;">
151
+ <dx-grid
152
+ limitRows=${props.limitRows ?? nothing}
153
+ limitColumns=${props.limitColumns ?? nothing}
154
+ columnDefault=${props.columnDefault ?? nothing}
155
+ rowDefault=${props.rowDefault ?? nothing}
156
+ columns=${props.columns ?? nothing}
157
+ ></dx-grid>
158
+ </div>`;
159
+ };
160
+
161
+ Limits.args = {
162
+ limitRows: JSON.stringify(10 satisfies DxGridProps['limitRows']),
163
+ limitColumns: JSON.stringify(3 satisfies DxGridProps['limitColumns']),
32
164
  columnDefault: JSON.stringify({
33
- size: 180,
34
- resizeable: true,
165
+ grid: {
166
+ size: 180,
167
+ resizeable: true,
168
+ },
35
169
  } satisfies DxGridProps['columnDefault']),
36
170
  rowDefault: JSON.stringify({
37
- size: 32,
38
- resizeable: true,
171
+ grid: {
172
+ size: 32,
173
+ resizeable: true,
174
+ },
39
175
  } satisfies DxGridProps['rowDefault']),
40
176
  columns: JSON.stringify({
41
- 0: { size: 200 },
42
- 1: { size: 210 },
43
- 2: { size: 230 },
44
- 3: { size: 250 },
45
- 4: { size: 270 },
177
+ grid: {
178
+ 0: { size: 200 },
179
+ 1: { size: 210 },
180
+ 2: { size: 230 },
181
+ 3: { size: 250 },
182
+ 4: { size: 270 },
183
+ },
46
184
  } satisfies DxGridProps['columns']),
47
185
  };
package/src/dx-grid.pcss CHANGED
@@ -1,55 +1,38 @@
1
+ @import './dx-grid-axis-resize-handle.pcss';
2
+ @import './dx-grid-multiselect-cell.pcss';
3
+
1
4
  dx-grid {
2
5
  display: contents;
3
- }
4
-
5
- .sr-only {
6
- position: absolute;
7
- width: 1px;
8
- height: 1px;
9
- padding: 0;
10
- margin: -1px;
11
- overflow: hidden;
12
- clip: rect(0, 0, 0, 0);
13
- white-space: nowrap;
14
- border-width: 0;
6
+ --dx-grid-gap: 1px;
7
+ --dx-plane-gap: 1px;
15
8
  }
16
9
 
17
10
  .dx-grid {
18
- position: fixed;
19
- inset: 0;
20
11
  display: grid;
12
+ gap: var(--dx-plane-gap);
21
13
  grid-template-columns: min-content 1fr min-content;
22
14
  grid-template-rows: min-content 1fr min-content;
23
15
  font-variant-numeric: tabular-nums;
24
- --dx-grid-gap: 1px;
25
- }
26
16
 
27
- .dx-grid__scrollbar__thumb {
28
- height: 1rem;
29
- width: 1rem;
30
- background: var(--dx-grid-thumb, var(--dx-separator));
31
- }
17
+ min-inline-size: 4rem;
18
+ min-block-size: 4rem;
19
+ inline-size: 100%;
20
+ block-size: 100%;
21
+ max-inline-size: 100dvw;
22
+ max-block-size: 100dvh;
32
23
 
33
- .dx-grid__corner,
34
- .dx-grid__scrollbar {
35
- background: var(--dx-grid-corner, var(--dx-hoverSurface));
36
- }
24
+ user-select: none;
37
25
 
38
- .dx-grid__columnheader__content,
39
- .dx-grid__rowheader__content,
40
- .dx-grid__content {
41
- display: grid;
42
- gap: var(--dx-grid-gap);
43
26
  background: var(--dx-grid-lines, var(--dx-separator));
44
- inline-size: min-content;
45
- block-size: min-content;
46
27
  }
47
28
 
48
- .dx-grid__columnheader,
49
- .dx-grid__rowheader,
50
- .dx-grid__viewport {
29
+ .dx-grid__plane--frozen-row,
30
+ .dx-grid__plane--frozen-col,
31
+ .dx-grid__plane--fixed,
32
+ .dx-grid__plane--grid {
51
33
  overflow: hidden;
52
34
  position: relative;
35
+ display: grid;
53
36
  &:focus-visible {
54
37
  outline: none;
55
38
  }
@@ -62,60 +45,76 @@ dx-grid {
62
45
  }
63
46
  }
64
47
 
65
- .dx-grid__columnheader__content {
66
- border-block-end: 2px solid var(--dx-grid-lines, var(--dx-separator));
67
- }
68
-
69
- .dx-grid__rowheader__content {
70
- border-inline-end: 2px solid var(--dx-grid-lines, var(--dx-separator));
71
- grid-template-columns: min-content;
72
- text-align: end;
48
+ .dx-grid__plane--fixed,
49
+ .dx-grid__plane--frozen-row__content,
50
+ .dx-grid__plane--frozen-col__content,
51
+ .dx-grid__plane--grid__content {
52
+ display: grid;
53
+ gap: var(--dx-grid-gap);
73
54
  }
74
55
 
75
56
  .dx-grid {
76
57
  [role='gridcell'], [role='columnheader'], [role='rowheader'] {
58
+ position: relative;
77
59
  background: var(--dx-grid-base, var(--dx-base));
78
- padding: 2px;
60
+ padding: 2px 3px;
79
61
  box-sizing: border-box;
80
62
  cursor: pointer;
81
63
  border: 1px solid transparent;
82
- &[inert] {
83
- visibility: hidden;
84
- }
85
- &:focus, &:focus-visible {
86
- cursor: text;
87
- position: relative;
64
+ overflow: hidden;
65
+ text-overflow: ellipsis;
66
+ white-space: nowrap;
67
+ &:focus:not([aria-readonly='true']), &:focus-visible {
88
68
  z-index: 2;
89
69
  border-color: var(--dx-accentSurface);
90
70
  outline: none;
71
+ &:not([aria-readonly='true']) {
72
+ cursor: text;
73
+ }
74
+ }
75
+ &.dx-grid__cell--commented {
76
+ background: var(--dx-grid-commented, var(--dx-gridCommented));
77
+ }
78
+ }
79
+ &[data-grid-select] {
80
+ [role='gridcell'], [role='columnheader'], [role='rowheader'] {
81
+ &[aria-selected] {
82
+ background: var(--dx-gridSelectionOverlay);
83
+ }
91
84
  }
92
85
  }
93
86
  }
94
87
 
95
- .dx-grid__columnheader__content,
96
- .dx-grid__rowheader__content {
97
- & > [role='columnheader'], &> [role='rowheader'] {
98
- position: relative;
99
- & > button.dx-grid__resize-handle {
100
- position: absolute;
101
- background: transparent;
102
- &:hover {
103
- background: var(--dx-grid-resizeHandleHover, var(--dx-hoverSurface));
104
- }
88
+ .dx-grid-host:focus-within .dx-grid:not(:focus-within) {
89
+ [role='gridcell'], [role='columnheader'], [role='rowheader'] {
90
+ &[data-dx-active]:not([aria-readonly='true']) {
91
+ border-color: var(--dx-accentSurface);
105
92
  }
106
93
  }
107
94
  }
108
95
 
109
- .dx-grid__columnheader__content > [role='columnheader'] > button.dx-grid__resize-handle {
110
- inset-block: 0;
111
- inset-inline-end: 0;
112
- inline-size: .5rem;
113
- cursor: col-resize;
96
+ /* TODO(thure): Finish implementation. */
97
+ .dx-grid-layer--presentation {
98
+ pointer-events: none;
99
+ position: absolute;
100
+ inset: 0;
101
+ display: grid;
102
+ gap: var(--dx-grid-gap);
103
+ background: rgba(255, 0, 0, .1);
104
+ & .dx-grid-layer--presentation__cell {
105
+ background: rgba(0, 255, 0, .1);
106
+ }
114
107
  }
115
108
 
116
- .dx-grid__rowheader__content > [role='rowheader'] > button.dx-grid__resize-handle {
117
- inset-inline: 0;
118
- inset-block-end: 0;
119
- block-size: .5rem;
120
- cursor: row-resize;
121
- }
109
+ /* TODO(thure): Move this somewhere better. */
110
+ .sr-only {
111
+ position: absolute;
112
+ width: 1px;
113
+ height: 1px;
114
+ padding: 0;
115
+ margin: -1px;
116
+ overflow: hidden;
117
+ clip: rect(0, 0, 0, 0);
118
+ white-space: nowrap;
119
+ border-width: 0;
120
+ }