@dxos/lit-grid 0.8.3 → 0.8.4-main.05e74ebcff

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 (108) hide show
  1. package/LICENSE +102 -5
  2. package/dist/src/defs.d.ts +1 -0
  3. package/dist/src/defs.d.ts.map +1 -1
  4. package/dist/src/defs.js +1 -0
  5. package/dist/src/defs.js.map +1 -1
  6. package/dist/src/dx-grid-axis-resize-handle.d.ts.map +1 -1
  7. package/dist/src/dx-grid-axis-resize-handle.js +3 -5
  8. package/dist/src/dx-grid-axis-resize-handle.js.map +1 -1
  9. package/dist/src/dx-grid-multiselect-cell.d.ts.map +1 -1
  10. package/dist/src/dx-grid-multiselect-cell.js +2 -1
  11. package/dist/src/dx-grid-multiselect-cell.js.map +1 -1
  12. package/dist/src/dx-grid.d.ts +15 -9
  13. package/dist/src/dx-grid.d.ts.map +1 -1
  14. package/dist/src/dx-grid.js +253 -172
  15. package/dist/src/dx-grid.js.map +1 -1
  16. package/dist/src/dx-grid.lit-stories.d.ts +13 -15
  17. package/dist/src/dx-grid.lit-stories.d.ts.map +1 -1
  18. package/dist/src/dx-grid.lit-stories.js +22 -23
  19. package/dist/src/dx-grid.lit-stories.js.map +1 -1
  20. package/dist/src/playwright/dx-grid.spec.d.ts.map +1 -0
  21. package/dist/src/{testing/playwright → playwright}/dx-grid.spec.js +10 -9
  22. package/dist/src/playwright/dx-grid.spec.js.map +1 -0
  23. package/dist/src/playwright/playwright.config.d.ts +3 -0
  24. package/dist/src/playwright/playwright.config.d.ts.map +1 -0
  25. package/dist/src/playwright/playwright.config.js +15 -0
  26. package/dist/src/playwright/playwright.config.js.map +1 -0
  27. package/dist/src/testing/{playwright/dx-grid-manager.d.ts → dx-grid-manager.d.ts} +1 -1
  28. package/dist/src/testing/dx-grid-manager.d.ts.map +1 -0
  29. package/dist/src/testing/dx-grid-manager.js.map +1 -0
  30. package/dist/src/testing/index.d.ts +1 -1
  31. package/dist/src/testing/index.d.ts.map +1 -1
  32. package/dist/src/testing/index.js +1 -1
  33. package/dist/src/testing/index.js.map +1 -1
  34. package/dist/src/types.d.ts +10 -1
  35. package/dist/src/types.d.ts.map +1 -1
  36. package/dist/src/types.js.map +1 -1
  37. package/dist/src/util.d.ts +12 -7
  38. package/dist/src/util.d.ts.map +1 -1
  39. package/dist/src/util.js +15 -13
  40. package/dist/src/util.js.map +1 -1
  41. package/dist/tsconfig.tsbuildinfo +1 -1
  42. package/package.json +16 -15
  43. package/src/defs.ts +1 -0
  44. package/src/dx-grid-axis-resize-handle.pcss +10 -3
  45. package/src/dx-grid-axis-resize-handle.ts +1 -1
  46. package/src/dx-grid-multiselect-cell.pcss +8 -6
  47. package/src/dx-grid-multiselect-cell.ts +2 -1
  48. package/src/dx-grid.lit-stories.ts +6 -4
  49. package/src/dx-grid.pcss +166 -22
  50. package/src/dx-grid.ts +268 -123
  51. package/src/{testing/playwright → playwright}/dx-grid.spec.ts +12 -11
  52. package/src/playwright/playwright.config.ts +17 -0
  53. package/src/testing/{playwright/dx-grid-manager.ts → dx-grid-manager.ts} +2 -2
  54. package/src/testing/index.ts +1 -1
  55. package/src/types.ts +11 -0
  56. package/src/util.ts +17 -11
  57. package/dist/src/testing/playwright/dx-grid-manager.d.ts.map +0 -1
  58. package/dist/src/testing/playwright/dx-grid-manager.js.map +0 -1
  59. package/dist/src/testing/playwright/dx-grid.spec.d.ts.map +0 -1
  60. package/dist/src/testing/playwright/dx-grid.spec.js.map +0 -1
  61. package/dist/types/src/defs.d.ts +0 -3
  62. package/dist/types/src/defs.d.ts.map +0 -1
  63. package/dist/types/src/defs.js +0 -6
  64. package/dist/types/src/defs.js.map +0 -1
  65. package/dist/types/src/dx-grid-axis-resize-handle.d.ts +0 -16
  66. package/dist/types/src/dx-grid-axis-resize-handle.d.ts.map +0 -1
  67. package/dist/types/src/dx-grid-axis-resize-handle.js +0 -100
  68. package/dist/types/src/dx-grid-axis-resize-handle.js.map +0 -1
  69. package/dist/types/src/dx-grid-multiselect-cell.d.ts +0 -13
  70. package/dist/types/src/dx-grid-multiselect-cell.d.ts.map +0 -1
  71. package/dist/types/src/dx-grid-multiselect-cell.js +0 -56
  72. package/dist/types/src/dx-grid-multiselect-cell.js.map +0 -1
  73. package/dist/types/src/dx-grid.d.ts +0 -170
  74. package/dist/types/src/dx-grid.d.ts.map +0 -1
  75. package/dist/types/src/dx-grid.js +0 -1347
  76. package/dist/types/src/dx-grid.js.map +0 -1
  77. package/dist/types/src/dx-grid.lit-stories.d.ts +0 -46
  78. package/dist/types/src/dx-grid.lit-stories.d.ts.map +0 -1
  79. package/dist/types/src/dx-grid.lit-stories.js +0 -179
  80. package/dist/types/src/dx-grid.lit-stories.js.map +0 -1
  81. package/dist/types/src/index.d.ts +0 -5
  82. package/dist/types/src/index.d.ts.map +0 -1
  83. package/dist/types/src/index.js +0 -8
  84. package/dist/types/src/index.js.map +0 -1
  85. package/dist/types/src/testing/index.d.ts +0 -2
  86. package/dist/types/src/testing/index.d.ts.map +0 -1
  87. package/dist/types/src/testing/index.js +0 -5
  88. package/dist/types/src/testing/index.js.map +0 -1
  89. package/dist/types/src/testing/playwright/dx-grid-manager.d.ts +0 -24
  90. package/dist/types/src/testing/playwright/dx-grid-manager.d.ts.map +0 -1
  91. package/dist/types/src/testing/playwright/dx-grid-manager.js +0 -79
  92. package/dist/types/src/testing/playwright/dx-grid-manager.js.map +0 -1
  93. package/dist/types/src/testing/playwright/dx-grid.spec.d.ts +0 -2
  94. package/dist/types/src/testing/playwright/dx-grid.spec.d.ts.map +0 -1
  95. package/dist/types/src/testing/playwright/dx-grid.spec.js +0 -92
  96. package/dist/types/src/testing/playwright/dx-grid.spec.js.map +0 -1
  97. package/dist/types/src/types.d.ts +0 -137
  98. package/dist/types/src/types.d.ts.map +0 -1
  99. package/dist/types/src/types.js +0 -46
  100. package/dist/types/src/types.js.map +0 -1
  101. package/dist/types/src/util.d.ts +0 -39
  102. package/dist/types/src/util.d.ts.map +0 -1
  103. package/dist/types/src/util.js +0 -165
  104. package/dist/types/src/util.js.map +0 -1
  105. package/dist/types/tsconfig.tsbuildinfo +0 -1
  106. package/src/testing/playwright/playwright.config.cts +0 -18
  107. /package/dist/src/{testing/playwright → playwright}/dx-grid.spec.d.ts +0 -0
  108. /package/dist/src/testing/{playwright/dx-grid-manager.js → dx-grid-manager.js} +0 -0
@@ -5,19 +5,26 @@ dx-grid-axis-resize-handle {
5
5
  .dx-grid__resize-handle {
6
6
  position: absolute;
7
7
  background: transparent;
8
+ z-index: 2;
8
9
  &:hover {
9
- background: var(--dx-grid-resizeHandleHover, var(--dx-hoverSurface));
10
+ background: var(--color-hover-surface);
10
11
  }
11
12
  &[data-dx-grid-axis='col'] {
12
13
  inset-block: 0;
13
14
  inset-inline-end: 0;
14
- inline-size: .5rem;
15
+ inline-size: 0.5rem;
15
16
  cursor: col-resize;
16
17
  }
17
18
  &[data-dx-grid-axis='row'] {
18
19
  inset-inline: 0;
19
20
  inset-block-end: 0;
20
- block-size: .5rem;
21
+ block-size: 0.5rem;
21
22
  cursor: row-resize;
22
23
  }
24
+ &:focus {
25
+ outline: none;
26
+ }
27
+ &:focus-visible {
28
+ background: var(--color-accent-surface);
29
+ }
23
30
  }
@@ -6,7 +6,7 @@ import { draggable } from '@atlaskit/pragmatic-drag-and-drop/element/adapter';
6
6
  import { disableNativeDragPreview } from '@atlaskit/pragmatic-drag-and-drop/element/disable-native-drag-preview';
7
7
  import { preventUnhandled } from '@atlaskit/pragmatic-drag-and-drop/prevent-unhandled';
8
8
  import { type CleanupFn, type DragLocationHistory } from '@atlaskit/pragmatic-drag-and-drop/types';
9
- import { html, LitElement } from 'lit';
9
+ import { LitElement, html } from 'lit';
10
10
  import { customElement, property } from 'lit/decorators.js';
11
11
  import { ref } from 'lit/directives/ref.js';
12
12
 
@@ -1,32 +1,34 @@
1
+ @reference "../../ui-theme/src/main.css";
2
+
1
3
  dx-grid-multiselect-cell {
2
4
  display: contents;
3
5
  }
4
6
 
5
- .dx-grid__cell__multiselect{
7
+ .dx-grid__cell__multiselect {
6
8
  display: flex;
7
9
  flex-flow: row nowrap;
8
10
  gap: 2px;
9
11
  inline-size: 100%;
10
- block-size: 100%;
12
+ block-size: 24px;
11
13
  & > span {
12
14
  flex: 0 1 auto;
13
15
  overflow: hidden;
14
16
  white-space: nowrap;
15
17
  text-overflow: ellipsis;
16
18
  &.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
19
+ @apply h-full border border-separator text-xs font-semibold px-2 py-0.5 rounded cursor-default text-neutral-800 dark:text-neutral-200;
18
20
  }
19
21
  &.dx-grid__cell__multiselect__placeholder {
20
22
  @apply text-description;
21
23
  }
22
24
  }
23
- & > .dx-grid__cell__multiselect__separator{
25
+ & > .dx-grid__cell__multiselect__separator {
24
26
  flex: 1 0 0;
25
27
  }
26
28
  & > svg {
27
29
  flex: 0 0 auto;
28
- margin-block: .25em;
30
+ margin-block: 0.25em;
29
31
  inline-size: 1em;
30
32
  block-size: 1em;
31
33
  }
32
- }
34
+ }
@@ -2,7 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { html, LitElement } from 'lit';
5
+ import { LitElement, html } from 'lit';
6
6
  import { customElement, property } from 'lit/decorators.js';
7
7
 
8
8
  export type DxGridSelectValue = {
@@ -31,6 +31,7 @@ export class DxGridMultiselectCell extends LitElement {
31
31
  aria-haspopup="dialog"
32
32
  class="dx-grid__cell__multiselect"
33
33
  data-dx-grid-accessory="invoke-multiselect"
34
+ data-dx-grid-action="accessory"
34
35
  >
35
36
  ${this.values.length > 0
36
37
  ? this.values.map(({ label }) => html`<span class="dx-grid__cell__multiselect__value">${label}</span>`)
@@ -2,13 +2,15 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
+ import '@dxos-theme';
5
6
  import './dx-grid.ts';
6
7
  import './dx-grid.pcss';
7
-
8
8
  import './dx-grid-multiselect-cell.ts';
9
9
 
10
10
  import { html, nothing } from 'lit';
11
11
 
12
+ import { random } from '@dxos/random';
13
+
12
14
  import { defaultRowSize } from './defs.js';
13
15
  import { type DxGridFrozenPlane, type DxGridPlaneCells, type DxGridProps } from './types';
14
16
  import { colToA1Notation, rowToA1Notation } from './util';
@@ -35,7 +37,7 @@ const initialLabels = {
35
37
  '0,0': { value: '', resizeHandle: 'col' },
36
38
  },
37
39
  frozenColsStart: [...Array(64)].reduce((acc, _, i) => {
38
- acc[`0,${i}`] = { value: rowToA1Notation(i), className: 'text-end pie-1', resizeHandle: 'row' };
40
+ acc[`0,${i}`] = { value: rowToA1Notation(i), className: 'text-end pe-1', resizeHandle: 'row' };
39
41
  return acc;
40
42
  }, {}),
41
43
  frozenRowsStart: [...Array(12)].reduce((acc, _, i) => {
@@ -49,7 +51,7 @@ Basic.args = {
49
51
  grid: {
50
52
  '1,1': {
51
53
  // end: '8,1',
52
- value: 'Waffle production',
54
+ value: random.lorem.paragraphs(5),
53
55
  },
54
56
  '2,2': {
55
57
  value: '',
@@ -81,7 +83,7 @@ Basic.args = {
81
83
  columns: JSON.stringify({
82
84
  grid: {
83
85
  0: { size: 64 },
84
- 1: { size: 512 },
86
+ 1: { size: 128 },
85
87
  2: { size: 64 },
86
88
  3: { size: 512 },
87
89
  4: { size: 64 },
package/src/dx-grid.pcss CHANGED
@@ -4,15 +4,28 @@
4
4
  @layer dx-tokens {
5
5
  :root {
6
6
  --dx-grid-cell-padding-block: 0.2rem;
7
+ --dx-grid-cell-content-padding-block: calc(
8
+ var(--dx-grid-cell-padding-block) - var(--dx-grid-focus-indicator-width)
9
+ );
10
+ --dx-grid-cell-editor-padding-block: var(--dx-grid-cell-content-padding-block);
7
11
  --dx-grid-cell-padding-inline: 0.25rem;
12
+ --dx-grid-cell-content-padding-inline: calc(
13
+ var(--dx-grid-cell-padding-inline) - var(--dx-grid-focus-indicator-width)
14
+ );
15
+ --dx-grid-cell-editor-padding-inline: var(--dx-grid-cell-content-padding-inline);
8
16
  }
9
17
  }
10
18
 
11
19
  @layer dx-components {
12
20
  dx-grid {
13
21
  display: contents;
14
- --dx-grid-gap: 1px;
15
- --dx-plane-gap: 1px;
22
+ /*
23
+ * Cells touch edge-to-edge; lines come from each cell's border-right /
24
+ * border-bottom. Setting either gap to a non-zero value re-introduces the
25
+ * doubled-line artifact at plane seams.
26
+ */
27
+ --dx-grid-gap: 0;
28
+ --dx-plane-gap: 0;
16
29
  }
17
30
 
18
31
  .dx-grid {
@@ -29,8 +42,6 @@
29
42
 
30
43
  touch-action: none;
31
44
  user-select: none;
32
-
33
- background: var(--dx-grid-lines, var(--dx-gridLine));
34
45
  }
35
46
 
36
47
  .dx-grid__plane--frozen-row,
@@ -50,7 +61,7 @@
50
61
  position: absolute;
51
62
  inset: 0;
52
63
  pointer-events: none;
53
- border: 1px solid var(--dx-accentSurface);
64
+ border: var(--dx-grid-focus-indicator-width) solid var(--color-focus-ring);
54
65
  }
55
66
  }
56
67
 
@@ -63,19 +74,27 @@
63
74
  }
64
75
 
65
76
  .dx-grid {
77
+ --grid-cell-surface: var(--color-grid-surface);
78
+ --grid-cell-foreground: var(--color-grid-foreground);
79
+
66
80
  [role='gridcell'],
67
81
  [role='columnheader'],
68
82
  [role='rowheader'] {
69
- position: relative;
70
- background: var(--dx-grid-base, var(--dx-baseSurface));
71
- /** This must match CellEditor styling in `CellEditor.tsx`. */
72
- padding: var(--dx-grid-cell-padding-block) var(--dx-grid-cell-padding-inline);
73
- box-sizing: border-box;
74
- border: 1px solid transparent;
75
- overflow: hidden;
76
- text-overflow: ellipsis;
77
- white-space: nowrap;
83
+ background: var(--grid-cell-surface);
84
+ color: var(--grid-cell-foreground);
78
85
  cursor: pointer;
86
+ position: relative;
87
+
88
+ /*
89
+ * Paint grid lines via inset box-shadow rather than border so the cell's
90
+ * content-box equals its border-box. This lets `.dx-grid__cell__content`
91
+ * (with block-size/inline-size: 100%) fill the cell exactly — including
92
+ * the right/bottom edges. When focused, the cell-content's own border
93
+ * (focus ring) then aligns with the grid lines pixel-for-pixel.
94
+ */
95
+ box-shadow:
96
+ inset calc(-1 * var(--dx-grid-focus-indicator-width)) 0 0 var(--color-grid-line),
97
+ inset 0 calc(-1 * var(--dx-grid-focus-indicator-width)) 0 var(--color-grid-line);
79
98
 
80
99
  &[aria-readonly='true'] {
81
100
  cursor: default;
@@ -86,15 +105,33 @@
86
105
  user-select: text;
87
106
  }
88
107
 
89
- &:focus:not([aria-readonly='true']),
90
- &:focus-visible {
91
- z-index: 2;
92
- border-color: var(--dx-accentSurface);
108
+ &:focus {
93
109
  outline: none;
94
110
  }
95
111
 
112
+ & > .dx-grid__cell__content {
113
+ padding-inline: var(--dx-grid-cell-content-padding-inline);
114
+ padding-block: var(--dx-grid-cell-content-padding-block);
115
+ box-sizing: border-box;
116
+ overflow: hidden;
117
+ text-overflow: ellipsis;
118
+ white-space: nowrap;
119
+ block-size: 100%;
120
+ position: relative;
121
+ border: var(--dx-grid-focus-indicator-width) solid transparent;
122
+ border-radius: 2px;
123
+
124
+ &:has(.dx-tag),
125
+ &:has(dx-tag-picker-item) {
126
+ text-overflow: clip;
127
+ line-height: 0;
128
+ --dx-grid-cell-content-padding-inline: 1px;
129
+ --dx-grid-cell-content-padding-block: 1px;
130
+ }
131
+ }
132
+
96
133
  &.dx-grid__cell--commented {
97
- background: var(--dx-grid-commented, var(--dx-gridCommented));
134
+ background: var(--color-grid-comment);
98
135
  }
99
136
  }
100
137
 
@@ -103,18 +140,111 @@
103
140
  [role='columnheader'],
104
141
  [role='rowheader'] {
105
142
  &[aria-selected] {
106
- background: var(--dx-gridSelectionOverlay);
143
+ --grid-cell-surface: var(--color-grid-selection-surface);
144
+ --grid-cell-foreground: var(--color-grid-selection-foreground);
145
+
146
+ &:focus:not([aria-readonly='true']),
147
+ &:focus-visible,
148
+ &:focus-within {
149
+ & > .dx-grid__cell__content {
150
+ background: transparent;
151
+ }
152
+ }
107
153
  }
108
154
  }
109
155
  }
156
+
157
+ .dx-grid__row--cta__cell {
158
+ transition: background-color 100ms linear;
159
+ & > .dx-grid__cell__content {
160
+ cursor: pointer;
161
+ background: transparent !important;
162
+ }
163
+ }
164
+
165
+ &:has(.dx-grid__row--cta__cell:hover) .dx-grid__row--cta__cell {
166
+ background: var(--color-grid-highlight);
167
+ }
110
168
  }
111
169
 
170
+ /* Editor and focused cell styles; be sure to keep these two blocks in-sync. */
171
+ .dx-grid {
172
+ [role='gridcell'],
173
+ [role='columnheader'],
174
+ [role='rowheader'] {
175
+ &:not([data-focus-unfurl='false']):not(.dx-grid__cell--no-focus-unfurl) {
176
+ &:focus,
177
+ &:focus-within {
178
+ & > .dx-grid__cell__content {
179
+ /*
180
+ * Inline (horizontal) unfurl: cell-content can grow horizontally
181
+ * to show wider content. Block-size stays clamped to the cell
182
+ * height so the focus ring aligns with the bottom grid line —
183
+ * `block-size: min-content` would let cell-content overshoot the
184
+ * cell when the content's natural height (line-height + padding +
185
+ * border) exceeds the cell track size by even a fraction of a
186
+ * pixel, pushing the focus ring's bottom edge below the grid line.
187
+ */
188
+ min-inline-size: 100%;
189
+ inline-size: min-content;
190
+ max-inline-size: min(60ch, 90vw);
191
+
192
+ overflow: auto;
193
+ scrollbar-width: thin;
194
+ overscroll-behavior: contain;
195
+
196
+ z-index: 1;
197
+
198
+ background: var(--grid-cell-surface);
199
+ color: var(--grid-cell-foreground);
200
+ }
201
+
202
+ &:not([aria-readonly='true']) > .dx-grid__cell__content {
203
+ border-color: var(--color-focus-ring);
204
+ }
205
+ }
206
+ }
207
+
208
+ &:focus-visible > .dx-grid__cell__content {
209
+ border-color: var(--color-focus-ring);
210
+ }
211
+ }
212
+ }
213
+
214
+ .dx-grid__cell-editor {
215
+ font-variant-numeric: tabular-nums;
216
+ white-space: normal;
217
+ hyphens: auto;
218
+ overflow-wrap: break-word;
219
+
220
+ background: var(--dx-grid-base, var(--color-base-surface));
221
+ border: var(--dx-grid-focus-indicator-width) solid var(--color-focus-ring);
222
+ border-radius: 2px;
223
+
224
+ --dx-grid-cell-editor-max-block-size: min(12em, 50vh);
225
+ --dx-grid-cell-editor-max-inline-size: min(60ch, 90vw);
226
+
227
+ block-size: min-content;
228
+ max-block-size: var(--dx-grid-cell-editor-max-block-size);
229
+ inline-size: min-content;
230
+ max-inline-size: var(--dx-grid-cell-editor-max-inline-size);
231
+
232
+ &:has(.dx-tag),
233
+ &:has(dx-tag-picker-item) {
234
+ text-overflow: clip;
235
+ line-height: 0;
236
+ --dx-grid-cell-editor-padding-inline: 1px;
237
+ --dx-grid-cell-editor-padding-block: 1px;
238
+ }
239
+ }
240
+
241
+ /* /// */
112
242
  .dx-grid-host:focus-within .dx-grid:not(:focus-within) {
113
243
  [role='gridcell'],
114
244
  [role='columnheader'],
115
245
  [role='rowheader'] {
116
- &[data-dx-active]:not([aria-readonly='true']) {
117
- border-color: var(--dx-accentSurface);
246
+ &[data-dx-active]:not([aria-readonly='true']) > .dx-grid__cell__content {
247
+ border-color: var(--color-focus-ring);
118
248
  }
119
249
  }
120
250
  }
@@ -132,6 +262,20 @@
132
262
  background: rgba(0, 255, 0, 0.1);
133
263
  }
134
264
  }
265
+
266
+ .dx-grid__cell--flagged {
267
+ &::after {
268
+ content: '';
269
+ position: absolute;
270
+ inset-block-start: 0;
271
+ inset-inline-end: 0;
272
+ inline-size: 0;
273
+ block-size: 0;
274
+ border-inline-start: 0.5em solid transparent;
275
+ border-block-start: 0.5em solid var(--color-warning-text);
276
+ z-index: 1;
277
+ }
278
+ }
135
279
  }
136
280
 
137
281
  /* TODO(thure): Move this somewhere better. */