@svgrid/grid 2.0.2 → 2.1.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.
Files changed (85) hide show
  1. package/dist/FlexRender.svelte +96 -96
  2. package/dist/GridFooter.svelte +178 -178
  3. package/dist/SvGrid.css +2377 -2376
  4. package/dist/SvGrid.svelte +2764 -2764
  5. package/dist/SvGridBoard.svelte +2281 -2281
  6. package/dist/SvGridDropdown.svelte +666 -666
  7. package/dist/cdn/svgrid.js +3 -3
  8. package/dist/cdn/svgrid.svelte-external.js +3 -3
  9. package/dist/themes/index.d.ts +45 -0
  10. package/dist/themes/index.js +132 -0
  11. package/package.json +92 -85
  12. package/src/FlexRender.svelte +96 -96
  13. package/src/GridFooter.svelte +178 -178
  14. package/src/SvGrid.controller.svelte.ts +2553 -2553
  15. package/src/SvGrid.css +2377 -2376
  16. package/src/SvGrid.svelte +2764 -2764
  17. package/src/SvGrid.types.ts +944 -944
  18. package/src/SvGridBoard.svelte +2281 -2281
  19. package/src/SvGridDropdown.svelte +666 -666
  20. package/src/a11y.contract.test.ts +49 -49
  21. package/src/a11y.test.ts +59 -59
  22. package/src/a11y.ts +61 -61
  23. package/src/build-api.ts +798 -798
  24. package/src/cell-formatting.ts +169 -169
  25. package/src/cell-render.ts +469 -469
  26. package/src/collaboration.test.ts +104 -104
  27. package/src/collaboration.ts +167 -167
  28. package/src/core.performance.test.ts +30 -30
  29. package/src/core.ts +1111 -1111
  30. package/src/createGrid.svelte.ts +42 -42
  31. package/src/createGrid.test.ts +10 -10
  32. package/src/createGridState.svelte.ts +17 -17
  33. package/src/editing.test.ts +859 -859
  34. package/src/editing.ts +675 -675
  35. package/src/export-data-api.test.ts +126 -126
  36. package/src/export-format.test.ts +107 -107
  37. package/src/export-format.ts +598 -598
  38. package/src/flex-render.ts +3 -3
  39. package/src/index.ts +463 -463
  40. package/src/keyboard.test.ts +59 -59
  41. package/src/keyboard.ts +97 -97
  42. package/src/menus.ts +582 -582
  43. package/src/merge-objects.ts +48 -48
  44. package/src/render-component.ts +28 -28
  45. package/src/selection.test.ts +754 -754
  46. package/src/selection.ts +600 -600
  47. package/src/server-data-source.test.ts +289 -289
  48. package/src/server-data-source.ts +413 -413
  49. package/src/sparkline.test.ts +68 -68
  50. package/src/sparkline.ts +169 -169
  51. package/src/spreadsheet.test.ts +489 -489
  52. package/src/spreadsheet.ts +304 -304
  53. package/src/static-functions.ts +11 -11
  54. package/src/subscribe.ts +38 -38
  55. package/src/svgrid-wrapper.types.ts +439 -439
  56. package/src/svgrid.behavior.test.ts +706 -706
  57. package/src/svgrid.features.test.ts +157 -157
  58. package/src/svgrid.new-features.wrapper.test.ts +251 -251
  59. package/src/svgrid.wrapper.test.ts +40 -40
  60. package/src/themes/index.ts +159 -0
  61. package/src/virtualization/column-virtualizer.test.ts +27 -27
  62. package/src/virtualization/column-virtualizer.ts +30 -30
  63. package/src/virtualization/svelte-virtualizer.svelte.ts +26 -26
  64. package/src/virtualization/types.ts +30 -30
  65. package/src/virtualization/virtualizer.test.ts +47 -47
  66. package/src/virtualization/virtualizer.ts +296 -296
  67. package/themes/ag-alpine.css +59 -0
  68. package/themes/antd.css +59 -0
  69. package/themes/atlassian.css +59 -0
  70. package/themes/bootstrap.css +59 -0
  71. package/themes/carbon.css +59 -0
  72. package/themes/catppuccin.css +59 -0
  73. package/themes/dracula.css +59 -0
  74. package/themes/excel.css +59 -0
  75. package/themes/fluent.css +59 -0
  76. package/themes/github.css +59 -0
  77. package/themes/linear.css +59 -0
  78. package/themes/material.css +59 -0
  79. package/themes/nord.css +59 -0
  80. package/themes/notion.css +59 -0
  81. package/themes/salesforce.css +59 -0
  82. package/themes/sap.css +59 -0
  83. package/themes/shadcn.css +59 -0
  84. package/themes/tailwind.css +59 -0
  85. package/themes/vercel.css +59 -0
@@ -1,49 +1,49 @@
1
- import { describe, expect, it } from 'vitest'
2
- import {
3
- getGridCellA11yProps,
4
- getGridHeaderA11yProps,
5
- getGridRootA11yProps,
6
- getGridRowA11yProps,
7
- } from './a11y'
8
-
9
- function attrsToHtml(attrs: Record<string, string | number | boolean>) {
10
- return Object.entries(attrs)
11
- .map(([key, value]) => `${key}="${String(value)}"`)
12
- .join(' ')
13
- }
14
-
15
- describe('a11y contract rendering', () => {
16
- it('builds expected headless markup attributes', () => {
17
- const root = getGridRootA11yProps()
18
- const header = getGridHeaderA11yProps({
19
- sortable: true,
20
- sortDirection: 'descending',
21
- })
22
- const row = getGridRowA11yProps(1)
23
- const cell = getGridCellA11yProps({
24
- rowIndex: 1,
25
- colIndex: 2,
26
- selected: true,
27
- })
28
-
29
- const html = [
30
- `<table ${attrsToHtml(root)}><thead>`,
31
- `<tr ${attrsToHtml(row)}>`,
32
- `<th ${attrsToHtml(header)}>Age</th>`,
33
- `</tr></thead><tbody>`,
34
- `<tr ${attrsToHtml(row)}><td ${attrsToHtml(cell)}>42</td></tr>`,
35
- `</tbody></table>`,
36
- ].join('')
37
-
38
- expect(html).toContain('role="grid"')
39
- expect(html).toContain('role="columnheader"')
40
- expect(html).toContain('aria-sort="descending"')
41
- expect(html).toContain('aria-selected="true"')
42
- expect(html).toContain('aria-colindex="2"')
43
- })
44
-
45
- it('creates stable active descendant ids', async () => {
46
- const { getGridCellDomId } = await import('./a11y')
47
- expect(getGridCellDomId('svgrid', 3, 4)).toBe('svgrid_cell_3_4')
48
- })
49
- })
1
+ import { describe, expect, it } from 'vitest'
2
+ import {
3
+ getGridCellA11yProps,
4
+ getGridHeaderA11yProps,
5
+ getGridRootA11yProps,
6
+ getGridRowA11yProps,
7
+ } from './a11y'
8
+
9
+ function attrsToHtml(attrs: Record<string, string | number | boolean>) {
10
+ return Object.entries(attrs)
11
+ .map(([key, value]) => `${key}="${String(value)}"`)
12
+ .join(' ')
13
+ }
14
+
15
+ describe('a11y contract rendering', () => {
16
+ it('builds expected headless markup attributes', () => {
17
+ const root = getGridRootA11yProps()
18
+ const header = getGridHeaderA11yProps({
19
+ sortable: true,
20
+ sortDirection: 'descending',
21
+ })
22
+ const row = getGridRowA11yProps(1)
23
+ const cell = getGridCellA11yProps({
24
+ rowIndex: 1,
25
+ colIndex: 2,
26
+ selected: true,
27
+ })
28
+
29
+ const html = [
30
+ `<table ${attrsToHtml(root)}><thead>`,
31
+ `<tr ${attrsToHtml(row)}>`,
32
+ `<th ${attrsToHtml(header)}>Age</th>`,
33
+ `</tr></thead><tbody>`,
34
+ `<tr ${attrsToHtml(row)}><td ${attrsToHtml(cell)}>42</td></tr>`,
35
+ `</tbody></table>`,
36
+ ].join('')
37
+
38
+ expect(html).toContain('role="grid"')
39
+ expect(html).toContain('role="columnheader"')
40
+ expect(html).toContain('aria-sort="descending"')
41
+ expect(html).toContain('aria-selected="true"')
42
+ expect(html).toContain('aria-colindex="2"')
43
+ })
44
+
45
+ it('creates stable active descendant ids', async () => {
46
+ const { getGridCellDomId } = await import('./a11y')
47
+ expect(getGridCellDomId('svgrid', 3, 4)).toBe('svgrid_cell_3_4')
48
+ })
49
+ })
package/src/a11y.test.ts CHANGED
@@ -1,59 +1,59 @@
1
- import { describe, expect, it } from 'vitest'
2
- import {
3
- getGridCellA11yProps,
4
- getGridHeaderA11yProps,
5
- getGridRootA11yProps,
6
- getGridRowA11yProps,
7
- } from './a11y'
8
-
9
- describe('a11y helpers', () => {
10
- it('returns grid role props', () => {
11
- expect(
12
- getGridRootA11yProps({
13
- activeDescendantId: 'svgrid_cell_0_0',
14
- rowCount: 10,
15
- colCount: 5,
16
- }),
17
- ).toEqual({
18
- role: 'grid',
19
- tabindex: 0,
20
- 'aria-activedescendant': 'svgrid_cell_0_0',
21
- 'aria-rowcount': 10,
22
- 'aria-colcount': 5,
23
- })
24
- })
25
-
26
- it('returns header sort semantics', () => {
27
- expect(
28
- getGridHeaderA11yProps({
29
- sortable: true,
30
- sortDirection: 'ascending',
31
- }),
32
- ).toEqual({
33
- role: 'columnheader',
34
- 'aria-sort': 'ascending',
35
- })
36
- })
37
-
38
- it('returns row and cell indices for accessibility metadata', () => {
39
- expect(getGridRowA11yProps(2)).toEqual({
40
- role: 'row',
41
- 'aria-rowindex': 2,
42
- })
43
-
44
- expect(
45
- getGridCellA11yProps({
46
- id: 'svgrid_cell_2_3',
47
- rowIndex: 2,
48
- colIndex: 3,
49
- selected: true,
50
- }),
51
- ).toEqual({
52
- role: 'gridcell',
53
- id: 'svgrid_cell_2_3',
54
- 'aria-colindex': 3,
55
- 'aria-rowindex': 2,
56
- 'aria-selected': true,
57
- })
58
- })
59
- })
1
+ import { describe, expect, it } from 'vitest'
2
+ import {
3
+ getGridCellA11yProps,
4
+ getGridHeaderA11yProps,
5
+ getGridRootA11yProps,
6
+ getGridRowA11yProps,
7
+ } from './a11y'
8
+
9
+ describe('a11y helpers', () => {
10
+ it('returns grid role props', () => {
11
+ expect(
12
+ getGridRootA11yProps({
13
+ activeDescendantId: 'svgrid_cell_0_0',
14
+ rowCount: 10,
15
+ colCount: 5,
16
+ }),
17
+ ).toEqual({
18
+ role: 'grid',
19
+ tabindex: 0,
20
+ 'aria-activedescendant': 'svgrid_cell_0_0',
21
+ 'aria-rowcount': 10,
22
+ 'aria-colcount': 5,
23
+ })
24
+ })
25
+
26
+ it('returns header sort semantics', () => {
27
+ expect(
28
+ getGridHeaderA11yProps({
29
+ sortable: true,
30
+ sortDirection: 'ascending',
31
+ }),
32
+ ).toEqual({
33
+ role: 'columnheader',
34
+ 'aria-sort': 'ascending',
35
+ })
36
+ })
37
+
38
+ it('returns row and cell indices for accessibility metadata', () => {
39
+ expect(getGridRowA11yProps(2)).toEqual({
40
+ role: 'row',
41
+ 'aria-rowindex': 2,
42
+ })
43
+
44
+ expect(
45
+ getGridCellA11yProps({
46
+ id: 'svgrid_cell_2_3',
47
+ rowIndex: 2,
48
+ colIndex: 3,
49
+ selected: true,
50
+ }),
51
+ ).toEqual({
52
+ role: 'gridcell',
53
+ id: 'svgrid_cell_2_3',
54
+ 'aria-colindex': 3,
55
+ 'aria-rowindex': 2,
56
+ 'aria-selected': true,
57
+ })
58
+ })
59
+ })
package/src/a11y.ts CHANGED
@@ -1,61 +1,61 @@
1
- export type GridSortDirection = 'ascending' | 'descending' | 'none' | 'other'
2
-
3
- export type GridColumnA11yInput = {
4
- sortable?: boolean
5
- sortDirection?: GridSortDirection
6
- }
7
-
8
- export type GridCellA11yInput = {
9
- colIndex?: number
10
- rowIndex?: number
11
- selected?: boolean
12
- id?: string
13
- }
14
-
15
- export function getGridRootA11yProps(input: {
16
- activeDescendantId?: string | null
17
- rowCount?: number
18
- colCount?: number
19
- /** Use the treegrid role (expandable server group / tree rows are present). */
20
- treegrid?: boolean
21
- } = {}) {
22
- return {
23
- role: input.treegrid ? 'treegrid' : 'grid',
24
- tabindex: 0,
25
- ...(input.activeDescendantId
26
- ? { 'aria-activedescendant': input.activeDescendantId }
27
- : {}),
28
- ...(input.rowCount !== undefined ? { 'aria-rowcount': input.rowCount } : {}),
29
- ...(input.colCount !== undefined ? { 'aria-colcount': input.colCount } : {}),
30
- } as const
31
- }
32
-
33
- export function getGridHeaderA11yProps(input: GridColumnA11yInput = {}) {
34
- const { sortable = false, sortDirection = 'none' } = input
35
- return {
36
- role: 'columnheader',
37
- ...(sortable ? { 'aria-sort': sortDirection } : {}),
38
- } as const
39
- }
40
-
41
- export function getGridRowA11yProps(rowIndex?: number) {
42
- return {
43
- role: 'row',
44
- ...(rowIndex !== undefined ? { 'aria-rowindex': rowIndex } : {}),
45
- } as const
46
- }
47
-
48
- export function getGridCellA11yProps(input: GridCellA11yInput = {}) {
49
- const { colIndex, rowIndex, selected = false, id } = input
50
- return {
51
- role: 'gridcell',
52
- ...(id ? { id } : {}),
53
- ...(colIndex !== undefined ? { 'aria-colindex': colIndex } : {}),
54
- ...(rowIndex !== undefined ? { 'aria-rowindex': rowIndex } : {}),
55
- 'aria-selected': selected,
56
- } as const
57
- }
58
-
59
- export function getGridCellDomId(baseId: string, rowIndex: number, colIndex: number) {
60
- return `${baseId}_cell_${rowIndex}_${colIndex}`
61
- }
1
+ export type GridSortDirection = 'ascending' | 'descending' | 'none' | 'other'
2
+
3
+ export type GridColumnA11yInput = {
4
+ sortable?: boolean
5
+ sortDirection?: GridSortDirection
6
+ }
7
+
8
+ export type GridCellA11yInput = {
9
+ colIndex?: number
10
+ rowIndex?: number
11
+ selected?: boolean
12
+ id?: string
13
+ }
14
+
15
+ export function getGridRootA11yProps(input: {
16
+ activeDescendantId?: string | null
17
+ rowCount?: number
18
+ colCount?: number
19
+ /** Use the treegrid role (expandable server group / tree rows are present). */
20
+ treegrid?: boolean
21
+ } = {}) {
22
+ return {
23
+ role: input.treegrid ? 'treegrid' : 'grid',
24
+ tabindex: 0,
25
+ ...(input.activeDescendantId
26
+ ? { 'aria-activedescendant': input.activeDescendantId }
27
+ : {}),
28
+ ...(input.rowCount !== undefined ? { 'aria-rowcount': input.rowCount } : {}),
29
+ ...(input.colCount !== undefined ? { 'aria-colcount': input.colCount } : {}),
30
+ } as const
31
+ }
32
+
33
+ export function getGridHeaderA11yProps(input: GridColumnA11yInput = {}) {
34
+ const { sortable = false, sortDirection = 'none' } = input
35
+ return {
36
+ role: 'columnheader',
37
+ ...(sortable ? { 'aria-sort': sortDirection } : {}),
38
+ } as const
39
+ }
40
+
41
+ export function getGridRowA11yProps(rowIndex?: number) {
42
+ return {
43
+ role: 'row',
44
+ ...(rowIndex !== undefined ? { 'aria-rowindex': rowIndex } : {}),
45
+ } as const
46
+ }
47
+
48
+ export function getGridCellA11yProps(input: GridCellA11yInput = {}) {
49
+ const { colIndex, rowIndex, selected = false, id } = input
50
+ return {
51
+ role: 'gridcell',
52
+ ...(id ? { id } : {}),
53
+ ...(colIndex !== undefined ? { 'aria-colindex': colIndex } : {}),
54
+ ...(rowIndex !== undefined ? { 'aria-rowindex': rowIndex } : {}),
55
+ 'aria-selected': selected,
56
+ } as const
57
+ }
58
+
59
+ export function getGridCellDomId(baseId: string, rowIndex: number, colIndex: number) {
60
+ return `${baseId}_cell_${rowIndex}_${colIndex}`
61
+ }