@svgrid/grid 2.1.0 → 2.1.2

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 (64) hide show
  1. package/dist/FlexRender.svelte +96 -96
  2. package/dist/GridFooter.svelte +178 -178
  3. package/dist/SvGrid.css +2377 -2377
  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 +2 -2
  8. package/dist/cdn/svgrid.svelte-external.js +2 -2
  9. package/package.json +92 -92
  10. package/src/FlexRender.svelte +96 -96
  11. package/src/GridFooter.svelte +178 -178
  12. package/src/SvGrid.controller.svelte.ts +2553 -2553
  13. package/src/SvGrid.css +2377 -2377
  14. package/src/SvGrid.svelte +2764 -2764
  15. package/src/SvGrid.types.ts +944 -944
  16. package/src/SvGridBoard.svelte +2281 -2281
  17. package/src/SvGridDropdown.svelte +666 -666
  18. package/src/a11y.contract.test.ts +49 -49
  19. package/src/a11y.test.ts +59 -59
  20. package/src/a11y.ts +61 -61
  21. package/src/build-api.ts +798 -798
  22. package/src/cell-formatting.ts +169 -169
  23. package/src/cell-render.ts +469 -469
  24. package/src/collaboration.test.ts +104 -104
  25. package/src/collaboration.ts +167 -167
  26. package/src/core.performance.test.ts +30 -30
  27. package/src/core.ts +1111 -1111
  28. package/src/createGrid.svelte.ts +42 -42
  29. package/src/createGrid.test.ts +10 -10
  30. package/src/createGridState.svelte.ts +17 -17
  31. package/src/editing.test.ts +859 -859
  32. package/src/editing.ts +675 -675
  33. package/src/export-data-api.test.ts +126 -126
  34. package/src/export-format.test.ts +107 -107
  35. package/src/export-format.ts +598 -598
  36. package/src/flex-render.ts +3 -3
  37. package/src/index.ts +463 -463
  38. package/src/keyboard.test.ts +59 -59
  39. package/src/keyboard.ts +97 -97
  40. package/src/menus.ts +582 -582
  41. package/src/merge-objects.ts +48 -48
  42. package/src/render-component.ts +28 -28
  43. package/src/selection.test.ts +754 -754
  44. package/src/selection.ts +600 -600
  45. package/src/server-data-source.test.ts +289 -289
  46. package/src/server-data-source.ts +413 -413
  47. package/src/sparkline.test.ts +68 -68
  48. package/src/sparkline.ts +169 -169
  49. package/src/spreadsheet.test.ts +489 -489
  50. package/src/spreadsheet.ts +304 -304
  51. package/src/static-functions.ts +11 -11
  52. package/src/subscribe.ts +38 -38
  53. package/src/svgrid-wrapper.types.ts +439 -439
  54. package/src/svgrid.behavior.test.ts +706 -706
  55. package/src/svgrid.features.test.ts +157 -157
  56. package/src/svgrid.new-features.wrapper.test.ts +251 -251
  57. package/src/svgrid.wrapper.test.ts +40 -40
  58. package/src/themes/index.ts +159 -159
  59. package/src/virtualization/column-virtualizer.test.ts +27 -27
  60. package/src/virtualization/column-virtualizer.ts +30 -30
  61. package/src/virtualization/svelte-virtualizer.svelte.ts +26 -26
  62. package/src/virtualization/types.ts +30 -30
  63. package/src/virtualization/virtualizer.test.ts +47 -47
  64. package/src/virtualization/virtualizer.ts +296 -296
@@ -1,169 +1,169 @@
1
- /**
2
- * Helpers for SvGrid column `format` presets (numbers, currency, percent, date patterns).
3
- */
4
-
5
- /** Map shortcut date patterns to Intl options (merged with caller `options`). */
6
- export function resolveDatePattern(
7
- pattern: string | undefined,
8
- kind: 'date' | 'datetime',
9
- ): Intl.DateTimeFormatOptions | undefined {
10
- if (!pattern) return undefined
11
-
12
- const p = pattern.trim()
13
-
14
- switch (p) {
15
- /** Short numeric local date (no weekday). */
16
- case 'd':
17
- return kind === 'datetime'
18
- ? {
19
- year: 'numeric',
20
- month: 'numeric',
21
- day: 'numeric',
22
- hour: 'numeric',
23
- minute: 'numeric',
24
- }
25
- : { year: 'numeric', month: 'numeric', day: 'numeric' }
26
- /** Long spelled-out date (+ time if datetime). */
27
- case 'D':
28
- return kind === 'datetime'
29
- ? {
30
- weekday: 'long',
31
- year: 'numeric',
32
- month: 'long',
33
- day: 'numeric',
34
- hour: 'numeric',
35
- minute: 'numeric',
36
- }
37
- : { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }
38
- /** ISO-friendly yyyy-mm-dd (with time when datetime). */
39
- case 'y-m-d':
40
- return kind === 'datetime'
41
- ? {
42
- year: 'numeric',
43
- month: '2-digit',
44
- day: '2-digit',
45
- hour: '2-digit',
46
- minute: '2-digit',
47
- hour12: false,
48
- }
49
- : { year: 'numeric', month: '2-digit', day: '2-digit' }
50
- case 'medium':
51
- return { dateStyle: 'medium', timeStyle: kind === 'datetime' ? 'short' : undefined }
52
- case 'short':
53
- return { dateStyle: 'short', timeStyle: kind === 'datetime' ? 'short' : undefined }
54
- case 'long':
55
- return { dateStyle: 'long', timeStyle: kind === 'datetime' ? 'short' : undefined }
56
- default:
57
- return undefined
58
- }
59
- }
60
-
61
- type NumericFormatInput = {
62
- type: 'number' | 'currency' | 'percent'
63
- locales?: string | string[]
64
- currency?: string
65
- /** When type is percent: treat value as 0–100 instead of Intl’s 0–1 fraction */
66
- valueIsPercentPoints?: boolean
67
- options?: Intl.NumberFormatOptions
68
- }
69
-
70
- /**
71
- * `Intl.NumberFormat` is one of the most expensive constructors in the
72
- * platform - building one per cell on every scroll makes large grids
73
- * noticeably stutter. Cache instances by config signature (locale + style
74
- * + currency + options).
75
- */
76
- const numberFormatterCache = new Map<string, Intl.NumberFormat>()
77
- function getNumberFormatter(
78
- locales: string | string[] | undefined,
79
- options: Intl.NumberFormatOptions,
80
- ): Intl.NumberFormat {
81
- // Stable key - for normal column configs the options object is reused
82
- // (declared in module scope), so this stringifies a small static shape.
83
- const key =
84
- (Array.isArray(locales) ? locales.join(',') : locales ?? '') +
85
- '|' +
86
- (options.style ?? '') +
87
- '|' +
88
- (options.currency ?? '') +
89
- '|' +
90
- (options.minimumFractionDigits ?? '') +
91
- '|' +
92
- (options.maximumFractionDigits ?? '') +
93
- '|' +
94
- (options.useGrouping ?? '') +
95
- '|' +
96
- (options.currencyDisplay ?? '') +
97
- '|' +
98
- (options.notation ?? '')
99
- let fmt = numberFormatterCache.get(key)
100
- if (!fmt) {
101
- fmt = new Intl.NumberFormat(locales, options)
102
- numberFormatterCache.set(key, fmt)
103
- }
104
- return fmt
105
- }
106
-
107
- /** Cache of `Intl.DateTimeFormat` by `(locale, options)` signature. */
108
- const dateFormatterCache = new Map<string, Intl.DateTimeFormat>()
109
- export function getDateFormatter(
110
- locales: string | string[] | undefined,
111
- options: Intl.DateTimeFormatOptions,
112
- ): Intl.DateTimeFormat {
113
- const key =
114
- (Array.isArray(locales) ? locales.join(',') : locales ?? '') +
115
- '|' +
116
- (options.dateStyle ?? '') +
117
- '|' +
118
- (options.timeStyle ?? '') +
119
- '|' +
120
- (options.year ?? '') +
121
- '|' +
122
- (options.month ?? '') +
123
- '|' +
124
- (options.day ?? '') +
125
- '|' +
126
- (options.hour ?? '') +
127
- '|' +
128
- (options.minute ?? '') +
129
- '|' +
130
- (options.second ?? '') +
131
- '|' +
132
- (options.weekday ?? '') +
133
- '|' +
134
- (options.hour12 ?? '')
135
- let fmt = dateFormatterCache.get(key)
136
- if (!fmt) {
137
- fmt = new Intl.DateTimeFormat(locales, options)
138
- dateFormatterCache.set(key, fmt)
139
- }
140
- return fmt
141
- }
142
-
143
- /** Format a numeric value for number / currency / percent column formats. */
144
- export function formatNumericWithConfig(value: unknown, config: NumericFormatInput): string {
145
- const n = typeof value === 'number' ? value : Number(value)
146
- if (!Number.isFinite(n)) return String(value ?? '')
147
-
148
- const locales = config.locales
149
-
150
- if (config.type === 'currency') {
151
- return getNumberFormatter(locales, {
152
- style: 'currency',
153
- currency: config.currency ?? 'USD',
154
- ...config.options,
155
- }).format(n)
156
- }
157
-
158
- if (config.type === 'percent') {
159
- const frac = config.valueIsPercentPoints === true ? n / 100 : n
160
- return getNumberFormatter(locales, {
161
- style: 'percent',
162
- minimumFractionDigits: 0,
163
- maximumFractionDigits: 2,
164
- ...config.options,
165
- }).format(frac)
166
- }
167
-
168
- return getNumberFormatter(locales, config.options ?? {}).format(n)
169
- }
1
+ /**
2
+ * Helpers for SvGrid column `format` presets (numbers, currency, percent, date patterns).
3
+ */
4
+
5
+ /** Map shortcut date patterns to Intl options (merged with caller `options`). */
6
+ export function resolveDatePattern(
7
+ pattern: string | undefined,
8
+ kind: 'date' | 'datetime',
9
+ ): Intl.DateTimeFormatOptions | undefined {
10
+ if (!pattern) return undefined
11
+
12
+ const p = pattern.trim()
13
+
14
+ switch (p) {
15
+ /** Short numeric local date (no weekday). */
16
+ case 'd':
17
+ return kind === 'datetime'
18
+ ? {
19
+ year: 'numeric',
20
+ month: 'numeric',
21
+ day: 'numeric',
22
+ hour: 'numeric',
23
+ minute: 'numeric',
24
+ }
25
+ : { year: 'numeric', month: 'numeric', day: 'numeric' }
26
+ /** Long spelled-out date (+ time if datetime). */
27
+ case 'D':
28
+ return kind === 'datetime'
29
+ ? {
30
+ weekday: 'long',
31
+ year: 'numeric',
32
+ month: 'long',
33
+ day: 'numeric',
34
+ hour: 'numeric',
35
+ minute: 'numeric',
36
+ }
37
+ : { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' }
38
+ /** ISO-friendly yyyy-mm-dd (with time when datetime). */
39
+ case 'y-m-d':
40
+ return kind === 'datetime'
41
+ ? {
42
+ year: 'numeric',
43
+ month: '2-digit',
44
+ day: '2-digit',
45
+ hour: '2-digit',
46
+ minute: '2-digit',
47
+ hour12: false,
48
+ }
49
+ : { year: 'numeric', month: '2-digit', day: '2-digit' }
50
+ case 'medium':
51
+ return { dateStyle: 'medium', timeStyle: kind === 'datetime' ? 'short' : undefined }
52
+ case 'short':
53
+ return { dateStyle: 'short', timeStyle: kind === 'datetime' ? 'short' : undefined }
54
+ case 'long':
55
+ return { dateStyle: 'long', timeStyle: kind === 'datetime' ? 'short' : undefined }
56
+ default:
57
+ return undefined
58
+ }
59
+ }
60
+
61
+ type NumericFormatInput = {
62
+ type: 'number' | 'currency' | 'percent'
63
+ locales?: string | string[]
64
+ currency?: string
65
+ /** When type is percent: treat value as 0–100 instead of Intl’s 0–1 fraction */
66
+ valueIsPercentPoints?: boolean
67
+ options?: Intl.NumberFormatOptions
68
+ }
69
+
70
+ /**
71
+ * `Intl.NumberFormat` is one of the most expensive constructors in the
72
+ * platform - building one per cell on every scroll makes large grids
73
+ * noticeably stutter. Cache instances by config signature (locale + style
74
+ * + currency + options).
75
+ */
76
+ const numberFormatterCache = new Map<string, Intl.NumberFormat>()
77
+ function getNumberFormatter(
78
+ locales: string | string[] | undefined,
79
+ options: Intl.NumberFormatOptions,
80
+ ): Intl.NumberFormat {
81
+ // Stable key - for normal column configs the options object is reused
82
+ // (declared in module scope), so this stringifies a small static shape.
83
+ const key =
84
+ (Array.isArray(locales) ? locales.join(',') : locales ?? '') +
85
+ '|' +
86
+ (options.style ?? '') +
87
+ '|' +
88
+ (options.currency ?? '') +
89
+ '|' +
90
+ (options.minimumFractionDigits ?? '') +
91
+ '|' +
92
+ (options.maximumFractionDigits ?? '') +
93
+ '|' +
94
+ (options.useGrouping ?? '') +
95
+ '|' +
96
+ (options.currencyDisplay ?? '') +
97
+ '|' +
98
+ (options.notation ?? '')
99
+ let fmt = numberFormatterCache.get(key)
100
+ if (!fmt) {
101
+ fmt = new Intl.NumberFormat(locales, options)
102
+ numberFormatterCache.set(key, fmt)
103
+ }
104
+ return fmt
105
+ }
106
+
107
+ /** Cache of `Intl.DateTimeFormat` by `(locale, options)` signature. */
108
+ const dateFormatterCache = new Map<string, Intl.DateTimeFormat>()
109
+ export function getDateFormatter(
110
+ locales: string | string[] | undefined,
111
+ options: Intl.DateTimeFormatOptions,
112
+ ): Intl.DateTimeFormat {
113
+ const key =
114
+ (Array.isArray(locales) ? locales.join(',') : locales ?? '') +
115
+ '|' +
116
+ (options.dateStyle ?? '') +
117
+ '|' +
118
+ (options.timeStyle ?? '') +
119
+ '|' +
120
+ (options.year ?? '') +
121
+ '|' +
122
+ (options.month ?? '') +
123
+ '|' +
124
+ (options.day ?? '') +
125
+ '|' +
126
+ (options.hour ?? '') +
127
+ '|' +
128
+ (options.minute ?? '') +
129
+ '|' +
130
+ (options.second ?? '') +
131
+ '|' +
132
+ (options.weekday ?? '') +
133
+ '|' +
134
+ (options.hour12 ?? '')
135
+ let fmt = dateFormatterCache.get(key)
136
+ if (!fmt) {
137
+ fmt = new Intl.DateTimeFormat(locales, options)
138
+ dateFormatterCache.set(key, fmt)
139
+ }
140
+ return fmt
141
+ }
142
+
143
+ /** Format a numeric value for number / currency / percent column formats. */
144
+ export function formatNumericWithConfig(value: unknown, config: NumericFormatInput): string {
145
+ const n = typeof value === 'number' ? value : Number(value)
146
+ if (!Number.isFinite(n)) return String(value ?? '')
147
+
148
+ const locales = config.locales
149
+
150
+ if (config.type === 'currency') {
151
+ return getNumberFormatter(locales, {
152
+ style: 'currency',
153
+ currency: config.currency ?? 'USD',
154
+ ...config.options,
155
+ }).format(n)
156
+ }
157
+
158
+ if (config.type === 'percent') {
159
+ const frac = config.valueIsPercentPoints === true ? n / 100 : n
160
+ return getNumberFormatter(locales, {
161
+ style: 'percent',
162
+ minimumFractionDigits: 0,
163
+ maximumFractionDigits: 2,
164
+ ...config.options,
165
+ }).format(frac)
166
+ }
167
+
168
+ return getNumberFormatter(locales, config.options ?? {}).format(n)
169
+ }