@svgrid/grid 1.0.2 → 1.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 (143) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +137 -39
  3. package/dist/GridFooter.svelte +164 -0
  4. package/dist/GridFooter.svelte.d.ts +29 -0
  5. package/dist/GridMenus.svelte +570 -0
  6. package/dist/GridMenus.svelte.d.ts +31 -0
  7. package/dist/SvGrid.controller.svelte.d.ts +429 -0
  8. package/dist/SvGrid.controller.svelte.js +1732 -0
  9. package/dist/SvGrid.css +1709 -0
  10. package/dist/SvGrid.helpers.d.ts +35 -0
  11. package/dist/SvGrid.helpers.js +160 -0
  12. package/dist/SvGrid.svelte +344 -7043
  13. package/dist/SvGrid.svelte.d.ts +4 -357
  14. package/dist/SvGrid.types.d.ts +436 -0
  15. package/dist/SvGrid.types.js +1 -0
  16. package/dist/SvGridChart.svelte +1060 -23
  17. package/dist/SvGridChart.svelte.d.ts +17 -0
  18. package/dist/build-api.d.ts +5 -0
  19. package/dist/build-api.js +527 -0
  20. package/dist/cell-render.d.ts +15 -0
  21. package/dist/cell-render.js +246 -0
  22. package/dist/cell-values.d.ts +28 -0
  23. package/dist/cell-values.js +89 -0
  24. package/dist/chart.d.ts +370 -3
  25. package/dist/chart.js +1135 -42
  26. package/dist/clipboard.d.ts +15 -0
  27. package/dist/clipboard.js +356 -0
  28. package/dist/columns.d.ts +30 -0
  29. package/dist/columns.js +277 -0
  30. package/dist/core.d.ts +1 -1
  31. package/dist/css.d.ts +3 -0
  32. package/dist/editing.d.ts +24 -0
  33. package/dist/editing.js +343 -0
  34. package/dist/editors/cell-editors.d.ts +1 -1
  35. package/dist/facet-buckets.d.ts +13 -0
  36. package/dist/facet-buckets.js +54 -0
  37. package/dist/features.d.ts +5 -0
  38. package/dist/features.js +30 -0
  39. package/dist/filter-operators.d.ts +16 -0
  40. package/dist/filter-operators.js +69 -0
  41. package/dist/hyperformula-adapter.d.ts +82 -0
  42. package/dist/hyperformula-adapter.js +73 -0
  43. package/dist/index.d.ts +5 -2
  44. package/dist/index.js +5 -2
  45. package/dist/keyboard-handlers.d.ts +7 -0
  46. package/dist/keyboard-handlers.js +197 -0
  47. package/dist/menus.d.ts +40 -0
  48. package/dist/menus.js +389 -0
  49. package/dist/named-views.d.ts +27 -0
  50. package/dist/named-views.js +39 -0
  51. package/dist/row-resize.d.ts +43 -0
  52. package/dist/row-resize.js +158 -0
  53. package/dist/scroll-sync.d.ts +9 -0
  54. package/dist/scroll-sync.js +86 -0
  55. package/dist/selection.d.ts +26 -0
  56. package/dist/selection.js +387 -0
  57. package/dist/spreadsheet.d.ts +80 -0
  58. package/dist/spreadsheet.js +194 -0
  59. package/dist/summaries.d.ts +12 -0
  60. package/dist/summaries.js +65 -0
  61. package/dist/svgrid-wrapper.types.d.ts +12 -1
  62. package/dist/svgrid.comments-autocomplete.test.d.ts +1 -0
  63. package/dist/svgrid.comments-autocomplete.test.js +96 -0
  64. package/dist/svgrid.context-menu.test.d.ts +1 -0
  65. package/dist/svgrid.context-menu.test.js +102 -0
  66. package/dist/svgrid.new-features.wrapper.test.js +30 -4
  67. package/dist/svgrid.wrapper.test.js +27 -1
  68. package/dist/virtualization/column-virtualizer.d.ts +2 -0
  69. package/dist/virtualization/scroll-scaling.d.ts +28 -0
  70. package/dist/virtualization/scroll-scaling.js +64 -0
  71. package/dist/virtualization/scroll-scaling.test.d.ts +1 -0
  72. package/dist/virtualization/scroll-scaling.test.js +86 -0
  73. package/dist/virtualization/svelte-virtualizer.svelte.d.ts +2 -0
  74. package/dist/virtualization/svelte-virtualizer.svelte.js +2 -0
  75. package/dist/virtualization/virtualizer.d.ts +7 -0
  76. package/dist/virtualization/virtualizer.js +30 -0
  77. package/package.json +1 -1
  78. package/src/GridFooter.svelte +164 -0
  79. package/src/GridMenus.svelte +570 -0
  80. package/src/SvGrid.controller.svelte.ts +2195 -0
  81. package/src/SvGrid.css +1747 -0
  82. package/src/SvGrid.helpers.test.ts +415 -0
  83. package/src/SvGrid.helpers.ts +185 -0
  84. package/src/SvGrid.svelte +348 -7043
  85. package/src/SvGrid.types.ts +456 -0
  86. package/src/SvGridChart.svelte +1060 -23
  87. package/src/build-api.coverage.test.ts +532 -0
  88. package/src/build-api.ts +663 -0
  89. package/src/cell-render.test.ts +451 -0
  90. package/src/cell-render.ts +426 -0
  91. package/src/cell-values.ts +114 -0
  92. package/src/chart-export.test.ts +370 -0
  93. package/src/chart.coverage.test.ts +814 -0
  94. package/src/chart.ts +1352 -47
  95. package/src/clipboard.test.ts +731 -0
  96. package/src/clipboard.ts +524 -0
  97. package/src/collaboration.coverage.test.ts +220 -0
  98. package/src/columns.test.ts +702 -0
  99. package/src/columns.ts +419 -0
  100. package/src/core.ts +8 -0
  101. package/src/css.d.ts +3 -0
  102. package/src/editing.test.ts +837 -0
  103. package/src/editing.ts +513 -0
  104. package/src/editors/cell-editors.coverage.test.ts +156 -0
  105. package/src/editors/cell-editors.ts +1 -0
  106. package/src/facet-buckets.test.ts +353 -0
  107. package/src/facet-buckets.ts +67 -0
  108. package/src/features.ts +128 -0
  109. package/src/filter-operators.test.ts +174 -0
  110. package/src/filter-operators.ts +87 -0
  111. package/src/hyperformula-adapter.test.ts +256 -0
  112. package/src/hyperformula-adapter.ts +124 -0
  113. package/src/index.ts +37 -0
  114. package/src/keyboard-handlers.coverage.test.ts +560 -0
  115. package/src/keyboard-handlers.ts +353 -0
  116. package/src/keyboard.ts +97 -97
  117. package/src/menus.test.ts +620 -0
  118. package/src/menus.ts +554 -0
  119. package/src/named-views.coverage.test.ts +210 -0
  120. package/src/named-views.ts +48 -0
  121. package/src/row-resize.test.ts +369 -0
  122. package/src/row-resize.ts +171 -0
  123. package/src/scroll-sync.test.ts +330 -0
  124. package/src/scroll-sync.ts +216 -0
  125. package/src/selection.test.ts +722 -0
  126. package/src/selection.ts +545 -0
  127. package/src/server-data-source.coverage.test.ts +180 -0
  128. package/src/spreadsheet.test.ts +445 -0
  129. package/src/spreadsheet.ts +246 -0
  130. package/src/summaries.ts +204 -0
  131. package/src/sv-grid-scrollbar.ts +13 -1
  132. package/src/svgrid-wrapper.types.ts +12 -1
  133. package/src/svgrid.behavior.test.ts +22 -0
  134. package/src/svgrid.comments-autocomplete.test.ts +112 -0
  135. package/src/svgrid.context-menu.test.ts +126 -0
  136. package/src/svgrid.interaction.test.ts +30 -0
  137. package/src/svgrid.new-features.wrapper.test.ts +65 -4
  138. package/src/svgrid.wrapper.test.ts +27 -1
  139. package/src/test-setup.ts +9 -6
  140. package/src/virtualization/scroll-scaling.test.ts +148 -0
  141. package/src/virtualization/scroll-scaling.ts +121 -0
  142. package/src/virtualization/svelte-virtualizer.svelte.ts +2 -0
  143. package/src/virtualization/virtualizer.ts +26 -0
@@ -0,0 +1,35 @@
1
+ import type { CellEditorType, CellEditorOption } from "./index";
2
+ import type { ResolvedCellFormat } from "./conditional-formatting";
3
+ export declare function cfTextStyle(cf: ResolvedCellFormat): string;
4
+ export declare function fmtStat(n: number): string;
5
+ export declare function getCellKey(rowId: string, columnId: string): string;
6
+ /**
7
+ * Normalise the return value of a `cellClass` / `rowClass` callback
8
+ * (or a static `cellClass` field) into a single space-separated
9
+ * class string. Accepts: string, string[], Record<string, boolean>,
10
+ * null/undefined. Anything else returns ''.
11
+ */
12
+ export declare function resolveClassList(value: string | ReadonlyArray<string> | Record<string, boolean> | undefined | null): string;
13
+ export declare function toDateInputValue(value: unknown): string;
14
+ export declare function toDateTimeLocalInputValue(value: unknown): string;
15
+ export declare function getEditableInputValue(editorType: CellEditorType, value: unknown): string;
16
+ export declare function getEditorInputType(editorType: CellEditorType): "number" | "date" | "text" | "time" | "password" | "color" | "datetime-local";
17
+ /** Resolve a stored value to an array form (for list/chips multi-select). */
18
+ export declare function toValueArray(value: unknown): Array<string | number>;
19
+ /** Look up the display label for a given option value. */
20
+ export declare function getOptionLabel(options: CellEditorOption[], value: unknown): string;
21
+ /** Look up the configured `color` for a value (for colorful chips). */
22
+ export declare function getOptionColor(options: CellEditorOption[], value: unknown): string | undefined;
23
+ /** Build a theme-aware inline `style` string for a colorful chip. The
24
+ * color value can be any CSS color (hex, rgb, hsl, oklch, named).
25
+ * We tint the background and border via `color-mix` so the chip stays
26
+ * readable on light AND dark themes, and use the color itself as the
27
+ * text color for a soft-pill look (à la GitHub labels). */
28
+ export declare function colorfulChipStyle(color: string | undefined): string;
29
+ export declare function getEditorClass(editorType: CellEditorType): "sv-grid-cell-editor sv-grid-cell-editor-number" | "sv-grid-cell-editor sv-grid-cell-editor-date" | "sv-grid-cell-editor sv-grid-cell-editor-datetime" | "sv-grid-cell-editor sv-grid-cell-editor-color" | "sv-grid-cell-editor";
30
+ export declare function asDate(value: unknown): Date | null;
31
+ export declare function clampMenuX(x: number, width: number): number;
32
+ export declare function cssEscape(s: string): string;
33
+ export declare function rawToNumber(raw: unknown, isDate: boolean): number;
34
+ export declare function formatFacetNumber(n: number): string;
35
+ export declare function formatFacetDate(timestamp: number): string;
@@ -0,0 +1,160 @@
1
+ export function cfTextStyle(cf) {
2
+ let s = "";
3
+ if (cf.color)
4
+ s += `color:${cf.color};`;
5
+ if (cf.fontWeight != null)
6
+ s += `font-weight:${cf.fontWeight};`;
7
+ return s;
8
+ }
9
+ export function fmtStat(n) {
10
+ return Number.isInteger(n)
11
+ ? n.toLocaleString()
12
+ : n.toLocaleString(undefined, { maximumFractionDigits: 2 });
13
+ }
14
+ export function getCellKey(rowId, columnId) {
15
+ return `${rowId}:${columnId}`;
16
+ }
17
+ /**
18
+ * Normalise the return value of a `cellClass` / `rowClass` callback
19
+ * (or a static `cellClass` field) into a single space-separated
20
+ * class string. Accepts: string, string[], Record<string, boolean>,
21
+ * null/undefined. Anything else returns ''.
22
+ */
23
+ export function resolveClassList(value) {
24
+ if (!value)
25
+ return "";
26
+ if (typeof value === "string")
27
+ return value;
28
+ if (Array.isArray(value))
29
+ return value.filter(Boolean).join(" ");
30
+ if (typeof value === "object") {
31
+ const parts = [];
32
+ for (const [k, v] of Object.entries(value))
33
+ if (v)
34
+ parts.push(k);
35
+ return parts.join(" ");
36
+ }
37
+ return "";
38
+ }
39
+ export function toDateInputValue(value) {
40
+ if (value == null || value === "")
41
+ return "";
42
+ if (typeof value === "string" && /^\d{4}-\d{2}-\d{2}$/.test(value))
43
+ return value;
44
+ const parsed = value instanceof Date ? value : new Date(value);
45
+ if (Number.isNaN(parsed.getTime()))
46
+ return "";
47
+ return parsed.toISOString().slice(0, 10);
48
+ }
49
+ export function toDateTimeLocalInputValue(value) {
50
+ if (value == null || value === "")
51
+ return "";
52
+ if (typeof value === "string" &&
53
+ /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}$/.test(value))
54
+ return value;
55
+ const parsed = value instanceof Date ? value : new Date(value);
56
+ if (Number.isNaN(parsed.getTime()))
57
+ return "";
58
+ return parsed.toISOString().slice(0, 16);
59
+ }
60
+ export function getEditableInputValue(editorType, value) {
61
+ if (editorType === "date")
62
+ return toDateInputValue(value);
63
+ if (editorType === "datetime")
64
+ return toDateTimeLocalInputValue(value);
65
+ return String(value ?? "");
66
+ }
67
+ export function getEditorInputType(editorType) {
68
+ if (editorType === "number")
69
+ return "number";
70
+ if (editorType === "date")
71
+ return "date";
72
+ if (editorType === "datetime")
73
+ return "datetime-local";
74
+ if (editorType === "time")
75
+ return "time";
76
+ if (editorType === "password")
77
+ return "password";
78
+ if (editorType === "color")
79
+ return "color";
80
+ return "text";
81
+ }
82
+ /** Resolve a stored value to an array form (for list/chips multi-select). */
83
+ export function toValueArray(value) {
84
+ if (value == null || value === "")
85
+ return [];
86
+ if (Array.isArray(value)) {
87
+ return value.filter((v) => v != null && v !== "");
88
+ }
89
+ return [value];
90
+ }
91
+ /** Look up the display label for a given option value. */
92
+ export function getOptionLabel(options, value) {
93
+ const match = options.find((o) => o.value === value || String(o.value) === String(value));
94
+ return match ? match.label : String(value ?? "");
95
+ }
96
+ /** Look up the configured `color` for a value (for colorful chips). */
97
+ export function getOptionColor(options, value) {
98
+ const match = options.find((o) => o.value === value || String(o.value) === String(value));
99
+ return match?.color;
100
+ }
101
+ /** Build a theme-aware inline `style` string for a colorful chip. The
102
+ * color value can be any CSS color (hex, rgb, hsl, oklch, named).
103
+ * We tint the background and border via `color-mix` so the chip stays
104
+ * readable on light AND dark themes, and use the color itself as the
105
+ * text color for a soft-pill look (à la GitHub labels). */
106
+ export function colorfulChipStyle(color) {
107
+ if (!color)
108
+ return "";
109
+ return (`background: color-mix(in srgb, ${color} 22%, transparent);` +
110
+ `border-color: color-mix(in srgb, ${color} 45%, transparent);` +
111
+ `color: color-mix(in srgb, ${color} 80%, var(--sg-fg, #0f172a));`);
112
+ }
113
+ export function getEditorClass(editorType) {
114
+ if (editorType === "number")
115
+ return "sv-grid-cell-editor sv-grid-cell-editor-number";
116
+ if (editorType === "date")
117
+ return "sv-grid-cell-editor sv-grid-cell-editor-date";
118
+ if (editorType === "datetime")
119
+ return "sv-grid-cell-editor sv-grid-cell-editor-datetime";
120
+ if (editorType === "color")
121
+ return "sv-grid-cell-editor sv-grid-cell-editor-color";
122
+ return "sv-grid-cell-editor";
123
+ }
124
+ export function asDate(value) {
125
+ if (value == null || value === "")
126
+ return null;
127
+ const parsed = value instanceof Date ? value : new Date(value);
128
+ return Number.isNaN(parsed.getTime()) ? null : parsed;
129
+ }
130
+ export function clampMenuX(x, width) {
131
+ return Math.max(8, Math.min(x, window.innerWidth - width - 8));
132
+ }
133
+ export function cssEscape(s) {
134
+ return typeof CSS !== "undefined" && CSS.escape ? CSS.escape(s) : s.replace(/"/g, '\\"');
135
+ }
136
+ export function rawToNumber(raw, isDate) {
137
+ if (raw == null || raw === "")
138
+ return Number.NaN;
139
+ if (isDate) {
140
+ const d = raw instanceof Date ? raw : new Date(String(raw));
141
+ const t = d.getTime();
142
+ return Number.isFinite(t) ? t : Number.NaN;
143
+ }
144
+ const n = typeof raw === "number" ? raw : Number(raw);
145
+ return Number.isFinite(n) ? n : Number.NaN;
146
+ }
147
+ export function formatFacetNumber(n) {
148
+ const abs = Math.abs(n);
149
+ const maxFractionDigits = abs >= 1000 ? 0 : abs >= 100 ? 1 : abs >= 1 ? 2 : 4;
150
+ return n.toLocaleString(undefined, {
151
+ maximumFractionDigits: maxFractionDigits,
152
+ });
153
+ }
154
+ export function formatFacetDate(timestamp) {
155
+ return new Date(timestamp).toLocaleDateString(undefined, {
156
+ year: "numeric",
157
+ month: "short",
158
+ day: "numeric",
159
+ });
160
+ }