@svgrid/grid 2.2.31 → 2.2.32

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 (145) hide show
  1. package/README.md +1 -1
  2. package/dist/SvAvatar.svelte +1 -1
  3. package/dist/SvCheckBox.svelte +2 -1
  4. package/dist/SvCircularProgress.svelte +1 -1
  5. package/dist/SvGrid.controller.svelte.d.ts +20 -0
  6. package/dist/SvGrid.controller.svelte.js +358 -18
  7. package/dist/SvGrid.css +103 -3
  8. package/dist/SvGrid.svelte +162 -10
  9. package/dist/SvGrid.types.d.ts +81 -0
  10. package/dist/SvGridDropdown.svelte +38 -6
  11. package/dist/SvGridDropdown.svelte.d.ts +4 -0
  12. package/dist/SvGridSelect.svelte +12 -3
  13. package/dist/SvGridSelect.svelte.d.ts +6 -0
  14. package/dist/SvGroupCell.svelte +9 -2
  15. package/dist/SvMultiSelect.svelte +12 -3
  16. package/dist/SvMultiSelect.svelte.d.ts +6 -0
  17. package/dist/SvPasswordInput.svelte +1 -1
  18. package/dist/SvProgress.svelte +1 -1
  19. package/dist/SvRating.svelte +1 -1
  20. package/dist/SvResult.svelte +1 -1
  21. package/dist/SvRichText.svelte +31 -16
  22. package/dist/SvRichText.svelte.d.ts +9 -0
  23. package/dist/SvSwitchButton.svelte +2 -1
  24. package/dist/SvToaster.svelte +1 -1
  25. package/dist/SvTree.svelte +9 -2
  26. package/dist/SvTree.svelte.d.ts +5 -0
  27. package/dist/SvTreeSelect.svelte +6 -2
  28. package/dist/build-api.js +16 -0
  29. package/dist/cdn/{GridMenus-Ds3OpzZT.js → GridMenus-C6ixSGWW.js} +33 -33
  30. package/dist/cdn/{GridMenus-Da_p7SKS.js → GridMenus-Cyk3qpJ7.js} +33 -33
  31. package/dist/cdn/{SvDateTimePicker-B8GopjhC.js → SvDateTimePicker-CdqaP61H.js} +2 -1
  32. package/dist/cdn/{SvDateTimePicker-DB0aIEk8.js → SvDateTimePicker-ClqtVIj3.js} +2 -1
  33. package/dist/cdn/{SvGridDropdown-DjALc_4f.js → SvGridDropdown-D0VdjeR8.js} +129 -123
  34. package/dist/cdn/{SvGridDropdown-hpnHvOGt.js → SvGridDropdown-Dh-2ej8j.js} +92 -87
  35. package/dist/cdn/{src-BLJfdyL0.js → src-BgHjWF0Q.js} +4193 -3837
  36. package/dist/cdn/{src-DYDCiC0D.js → src-CgD-wiuS.js} +5956 -5602
  37. package/dist/cdn/svgrid.js +8 -8
  38. package/dist/cdn/svgrid.svelte-external.js +8 -8
  39. package/dist/cell-render.d.ts +1 -0
  40. package/dist/cell-render.js +115 -1
  41. package/dist/cell-values.js +5 -0
  42. package/dist/core.d.ts +80 -9
  43. package/dist/core.js +89 -0
  44. package/dist/editor-contract.d.ts +12 -5
  45. package/dist/editor-registry.d.ts +18 -7
  46. package/dist/editor-registry.js +10 -1
  47. package/dist/group-display.d.ts +39 -0
  48. package/dist/group-display.js +52 -0
  49. package/dist/index.d.ts +2 -2
  50. package/dist/index.js +2 -2
  51. package/dist/keyboard-handlers.js +16 -0
  52. package/dist/recurrence.js +3 -2
  53. package/dist/svgrid-wrapper.types.d.ts +8 -2
  54. package/dist/themes/index.d.ts +10 -0
  55. package/dist/themes/index.js +26 -0
  56. package/package.json +1 -1
  57. package/src/SvAccordion.test.ts +5 -5
  58. package/src/SvAvatar.svelte +1 -1
  59. package/src/SvButtonGroup.test.ts +6 -6
  60. package/src/SvCheckBox.svelte +2 -1
  61. package/src/SvCircularProgress.svelte +1 -1
  62. package/src/SvFileUpload.test.ts +1 -1
  63. package/src/SvGrid.controller.svelte.ts +367 -17
  64. package/src/SvGrid.css +103 -3
  65. package/src/SvGrid.svelte +162 -10
  66. package/src/SvGrid.types.ts +81 -0
  67. package/src/SvGridDropdown.svelte +38 -6
  68. package/src/SvGridSelect.svelte +12 -3
  69. package/src/SvGroupCell.svelte +9 -2
  70. package/src/SvMultiSelect.svelte +12 -3
  71. package/src/SvPasswordInput.svelte +1 -1
  72. package/src/SvProgress.svelte +1 -1
  73. package/src/SvRating.svelte +1 -1
  74. package/src/SvResult.svelte +1 -1
  75. package/src/SvRichText.svelte +31 -16
  76. package/src/SvSwitchButton.svelte +2 -1
  77. package/src/SvToaster.svelte +1 -1
  78. package/src/SvTree.svelte +9 -2
  79. package/src/SvTreeSelect.svelte +6 -2
  80. package/src/build-api.ts +15 -0
  81. package/src/builtin-editors.test.ts +3 -1
  82. package/src/cell-render.test.ts +27 -3
  83. package/src/cell-render.ts +122 -1
  84. package/src/cell-values.ts +4 -0
  85. package/src/chart-export.test.ts +2 -2
  86. package/src/clipboard.test.ts +0 -2
  87. package/src/core.ts +157 -8
  88. package/src/editing.test.ts +1 -1
  89. package/src/editor-contract.ts +12 -5
  90. package/src/editor-registry.grid.test.ts +48 -0
  91. package/src/editor-registry.test.ts +3 -1
  92. package/src/editor-registry.ts +23 -7
  93. package/src/facet-buckets.test.ts +33 -33
  94. package/src/group-display.test.ts +91 -1
  95. package/src/group-display.ts +83 -0
  96. package/src/index.ts +9 -0
  97. package/src/keyboard-handlers.ts +17 -0
  98. package/src/list-power.test.ts +2 -2
  99. package/src/menus.test.ts +4 -4
  100. package/src/named-views.coverage.test.ts +3 -3
  101. package/src/recurrence.ts +3 -2
  102. package/src/row-resize.test.ts +40 -40
  103. package/src/scheduler-model.ts +1 -1
  104. package/src/server-data-source.coverage.test.ts +1 -1
  105. package/src/server-group-model.test.ts +6 -6
  106. package/src/spreadsheet.test.ts +0 -1
  107. package/src/svgrid-wrapper.types.ts +11 -9
  108. package/src/svgrid.async-editor-options.test.ts +271 -0
  109. package/src/svgrid.auto-row-height.test.ts +204 -0
  110. package/src/svgrid.charting.test.ts +4 -4
  111. package/src/svgrid.comments-autocomplete.test.ts +8 -2
  112. package/src/svgrid.context-menu.test.ts +25 -9
  113. package/src/svgrid.filter-depth.test.ts +163 -0
  114. package/src/svgrid.filter-menu-listbox.svelte.test.ts +16 -2
  115. package/src/svgrid.filter-menu-scroll.test.ts +10 -2
  116. package/src/svgrid.grand-total.test.ts +188 -0
  117. package/src/svgrid.group-display-mode.test.ts +171 -0
  118. package/src/svgrid.group-footers.test.ts +121 -0
  119. package/src/svgrid.group-pagination.test.ts +153 -0
  120. package/src/svgrid.tree-data.test.ts +186 -0
  121. package/src/svgriddropdown.async-panel.svelte.test.ts +195 -0
  122. package/src/themes/index.ts +42 -0
  123. package/src/tree-edit.test.ts +4 -4
  124. package/src/tree-row-model.test.ts +169 -0
  125. package/src/ui-localization.test.ts +113 -0
  126. package/themes/ag-alpine.css +22 -0
  127. package/themes/antd.css +22 -0
  128. package/themes/atlassian.css +22 -0
  129. package/themes/bootstrap.css +22 -0
  130. package/themes/carbon.css +22 -0
  131. package/themes/catppuccin.css +22 -0
  132. package/themes/dracula.css +22 -0
  133. package/themes/ember.css +22 -0
  134. package/themes/excel.css +22 -0
  135. package/themes/fluent.css +22 -0
  136. package/themes/github.css +22 -0
  137. package/themes/linear.css +22 -0
  138. package/themes/material.css +22 -0
  139. package/themes/nord.css +22 -0
  140. package/themes/notion.css +22 -0
  141. package/themes/salesforce.css +22 -0
  142. package/themes/sap.css +22 -0
  143. package/themes/shadcn.css +22 -0
  144. package/themes/tailwind.css +22 -0
  145. package/themes/vercel.css +22 -0
@@ -38,6 +38,10 @@ type Props = {
38
38
  onCommit?: () => void;
39
39
  /** Called when the user dismisses (Escape, blur with no change). */
40
40
  onCancel?: () => void;
41
+ /** The option list is still being fetched (async `editorOptions`). Shows a
42
+ * loading line instead of "No options", which would read as "nothing to
43
+ * pick" when the truth is "not here yet". */
44
+ loading?: boolean;
41
45
  };
42
46
  declare const SvGridDropdown: import("svelte").Component<Props, {}, "">;
43
47
  type SvGridDropdown = ReturnType<typeof SvGridDropdown>;
@@ -38,6 +38,12 @@
38
38
  loadOptions?: (query: string) => Promise<Row[]>
39
39
  debounceMs?: number
40
40
  loadingText?: string
41
+ /** Shown when the list is empty / a search matches nothing (localization). */
42
+ emptyText?: string
43
+ /** Placeholder in the panel's search box (localization). */
44
+ searchPlaceholder?: string
45
+ /** Accessible name for the panel's search box (localization). */
46
+ searchLabel?: string
41
47
  }
42
48
 
43
49
  let {
@@ -54,6 +60,9 @@
54
60
  loadOptions,
55
61
  debounceMs = 250,
56
62
  loadingText = 'Loading…',
63
+ emptyText = 'No matches',
64
+ searchPlaceholder = 'Search…',
65
+ searchLabel = 'Search options',
57
66
  disabled = false,
58
67
  readonly = false,
59
68
  label,
@@ -168,8 +177,8 @@
168
177
  aria-expanded="true"
169
178
  aria-controls={gs.panelId}
170
179
  aria-activedescendant={gs.activeDescendant()}
171
- aria-label="Search options"
172
- placeholder="Search…"
180
+ aria-label={searchLabel}
181
+ placeholder={searchPlaceholder}
173
182
  value={search}
174
183
  oninput={(e) => { search = e.currentTarget.value; gs.active = 0; if (loadOptions) runLoad(search) }}
175
184
  />
@@ -205,7 +214,7 @@
205
214
  {/each}
206
215
  </div>
207
216
  {:else}
208
- <div class="sv-gs__empty" role="row">{loading ? loadingText : 'No matches'}</div>
217
+ <div class="sv-gs__empty" role="row">{loading ? loadingText : emptyText}</div>
209
218
  {/each}
210
219
  {#if loading && filtered.length}
211
220
  <div class="sv-gs__empty" role="row" aria-live="polite">{loadingText}</div>
@@ -26,6 +26,12 @@ type Props = Pick<SvEditorProps, 'disabled' | 'readonly' | 'label' | 'hint' | 'e
26
26
  loadOptions?: (query: string) => Promise<Row[]>;
27
27
  debounceMs?: number;
28
28
  loadingText?: string;
29
+ /** Shown when the list is empty / a search matches nothing (localization). */
30
+ emptyText?: string;
31
+ /** Placeholder in the panel's search box (localization). */
32
+ searchPlaceholder?: string;
33
+ /** Accessible name for the panel's search box (localization). */
34
+ searchLabel?: string;
29
35
  };
30
36
  declare const SvGridSelect: import("svelte").Component<Props, {}, "value">;
31
37
  type SvGridSelect = ReturnType<typeof SvGridSelect>;
@@ -39,7 +39,12 @@
39
39
  aria-label={meta.expanded ? 'Collapse group' : 'Expand group'}
40
40
  onclick={() => onToggle(row)}
41
41
  >
42
- <span class="sv-group-chev" class:open={meta.expanded} aria-hidden="true">▸</span>
42
+ <!-- Same chevron the grid's own expanders and SvTree draw, so every
43
+ expander in the library looks identical. -->
44
+ <span class="sv-group-chev" class:open={meta.expanded} aria-hidden="true">
45
+ <svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor"
46
+ stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="m9 18 6-6-6-6" /></svg>
47
+ </span>
43
48
  <span class="sv-group-key">{meta.key}</span>
44
49
  {#if meta.loading}<span class="sv-group-load" aria-hidden="true">…</span>{/if}
45
50
  </button>
@@ -76,7 +81,9 @@
76
81
  cursor: pointer;
77
82
  }
78
83
  .sv-group-chev {
79
- display: inline-block;
84
+ display: inline-flex;
85
+ align-items: center;
86
+ justify-content: center;
80
87
  transition: transform 0.15s;
81
88
  color: var(--sg-muted, #64748b);
82
89
  }
@@ -37,6 +37,12 @@
37
37
  /** Debounce for remote search. Default 250ms. */
38
38
  debounceMs?: number
39
39
  loadingText?: string
40
+ /** Shown when the list is empty / a search matches nothing (localization). */
41
+ emptyText?: string
42
+ /** Placeholder in the panel's search box (localization). */
43
+ searchPlaceholder?: string
44
+ /** Accessible name for the panel's search box (localization). */
45
+ searchLabel?: string
40
46
  }
41
47
 
42
48
  let {
@@ -52,6 +58,9 @@
52
58
  loadOptions,
53
59
  debounceMs = 250,
54
60
  loadingText = 'Loading…',
61
+ emptyText = 'No matches',
62
+ searchPlaceholder = 'Search…',
63
+ searchLabel = 'Search options',
55
64
  disabled = false,
56
65
  readonly = false,
57
66
  label,
@@ -193,8 +202,8 @@
193
202
  aria-expanded="true"
194
203
  aria-controls={ms.panelId}
195
204
  aria-activedescendant={ms.activeDescendant()}
196
- aria-label="Search options"
197
- placeholder="Search…"
205
+ aria-label={searchLabel}
206
+ placeholder={searchPlaceholder}
198
207
  value={search}
199
208
  oninput={(e) => { search = e.currentTarget.value; ms.active = 0; if (loadOptions) runLoad(search) }}
200
209
  />
@@ -224,7 +233,7 @@
224
233
  <span class="sv-ms__label">{opt.label}</span>
225
234
  </li>
226
235
  {:else}
227
- <li class="sv-ms__empty" aria-disabled="true">{loading ? loadingText : 'No matches'}</li>
236
+ <li class="sv-ms__empty" aria-disabled="true">{loading ? loadingText : emptyText}</li>
228
237
  {/each}
229
238
  {#if loading && filtered.length}
230
239
  <li class="sv-ms__loading" aria-live="polite">{loadingText}</li>
@@ -25,6 +25,12 @@ type Props = Pick<SvEditorProps, 'disabled' | 'readonly' | 'label' | 'hint' | 'e
25
25
  /** Debounce for remote search. Default 250ms. */
26
26
  debounceMs?: number;
27
27
  loadingText?: string;
28
+ /** Shown when the list is empty / a search matches nothing (localization). */
29
+ emptyText?: string;
30
+ /** Placeholder in the panel's search box (localization). */
31
+ searchPlaceholder?: string;
32
+ /** Accessible name for the panel's search box (localization). */
33
+ searchLabel?: string;
28
34
  };
29
35
  declare const SvMultiSelect: import("svelte").Component<Props, {}, "value">;
30
36
  type SvMultiSelect = ReturnType<typeof SvMultiSelect>;
@@ -142,7 +142,7 @@
142
142
  .sv-pw__meter { display: flex; gap: 4px; }
143
143
  .sv-pw__bar { flex: 1; height: 4px; border-radius: 2px; background: var(--sg-border, #e2e8f0); transition: background 0.15s; }
144
144
  .sv-pw__bar.on.is-lvl1 { background: var(--sg-danger, #dc2626); }
145
- .sv-pw__bar.on.is-lvl2 { background: var(--sg-warning, #f59e0b); }
145
+ .sv-pw__bar.on.is-lvl2 { background: var(--sg-warning, #d97706); }
146
146
  .sv-pw__bar.on.is-lvl3 { background: #eab308; }
147
147
  .sv-pw__bar.on.is-lvl4 { background: var(--sg-success, #16a34a); }
148
148
  .sv-pw__strength { font-size: 11px; font-weight: 600; color: var(--sg-muted, #64748b); }
@@ -75,7 +75,7 @@
75
75
  display: flex; align-items: center; gap: 10px; width: 100%;
76
76
  }
77
77
  .sv-prog--success { --_c: var(--sg-success, #16a34a); }
78
- .sv-prog--warning { --_c: var(--sg-warning, #f59e0b); }
78
+ .sv-prog--warning { --_c: var(--sg-warning, #d97706); }
79
79
  .sv-prog--danger { --_c: var(--sg-danger, #dc2626); }
80
80
  .sv-prog__track {
81
81
  position: relative; flex: 1; overflow: hidden;
@@ -96,7 +96,7 @@
96
96
  <style>
97
97
  .sv-rating {
98
98
  --_on: var(--sg-rating-on, #f59e0b);
99
- --_off: var(--sg-rating-empty, #d1d5db);
99
+ --_off: var(--sg-rating-empty, #cbd5e1);
100
100
  --_sz: 22px;
101
101
  display: inline-flex; gap: 2px; align-items: center;
102
102
  }
@@ -59,7 +59,7 @@
59
59
  }
60
60
  .sv-result--success { --_c: var(--sg-success, #16a34a); }
61
61
  .sv-result--error { --_c: var(--sg-danger, #dc2626); }
62
- .sv-result--warning { --_c: var(--sg-warning, #f59e0b); }
62
+ .sv-result--warning { --_c: var(--sg-warning, #d97706); }
63
63
  .sv-result--notfound { --_c: var(--sg-muted, #64748b); }
64
64
  .sv-result__icon {
65
65
  display: grid; place-items: center; width: 60px; height: 60px; border-radius: 50%; margin-bottom: 4px;
@@ -19,7 +19,7 @@
19
19
  * <SvRichText bind:value={html} placeholder="Write something…" />
20
20
  * ```
21
21
  */
22
- import { nextEditorId } from './editor-contract'
22
+ import { nextEditorId, resolveMessages } from './editor-contract'
23
23
 
24
24
  const DEFAULT_TOOLS: RichTextTool[] = [
25
25
  'bold', 'italic', 'underline', 'strike', '|',
@@ -29,16 +29,27 @@
29
29
  'link', 'clear', '|', 'undo', 'redo',
30
30
  ]
31
31
 
32
- const META: Record<Exclude<RichTextTool, '|'>, { label: string; glyph: string }> = {
33
- bold: { label: 'Bold', glyph: 'B' }, italic: { label: 'Italic', glyph: 'I' },
34
- underline: { label: 'Underline', glyph: 'U' }, strike: { label: 'Strikethrough', glyph: 'S' },
35
- h1: { label: 'Heading 1', glyph: 'H1' }, h2: { label: 'Heading 2', glyph: 'H2' },
36
- h3: { label: 'Heading 3', glyph: 'H3' }, p: { label: 'Paragraph', glyph: '¶' },
37
- ul: { label: 'Bullet list', glyph: '' }, ol: { label: 'Numbered list', glyph: '1.' },
38
- quote: { label: 'Quote', glyph: '' }, code: { label: 'Code block', glyph: '</>' },
39
- alignLeft: { label: 'Align left', glyph: '' }, alignCenter: { label: 'Align center', glyph: '≣' },
40
- alignRight: { label: 'Align right', glyph: '≡' }, link: { label: 'Link', glyph: '🔗' },
41
- clear: { label: 'Clear formatting', glyph: '⌫' }, undo: { label: 'Undo', glyph: '↶' }, redo: { label: 'Redo', glyph: '↷' },
32
+ /** Toolbar glyphs. Mode-independent and not language-dependent, so they stay
33
+ * fixed; the LABELS beside them are localizable via `messages`. */
34
+ const GLYPH: Record<Exclude<RichTextTool, '|'>, string> = {
35
+ bold: 'B', italic: 'I', underline: 'U', strike: 'S',
36
+ h1: 'H1', h2: 'H2', h3: 'H3', p: '¶',
37
+ ul: '', ol: '1.', quote: '', code: '</>',
38
+ alignLeft: '', alignCenter: '', alignRight: '', link: '🔗',
39
+ clear: '', undo: '', redo: '',
40
+ }
41
+
42
+ /** User-facing strings (localizable via `messages`). Every one is a tooltip +
43
+ * accessible name on a toolbar button, so leaving them hard-coded made the
44
+ * whole toolbar English-only for screen-reader users. */
45
+ type RichTextMessages = Record<Exclude<RichTextTool, '|'>, string> & { linkPrompt: string; toolbar: string }
46
+ const DEFAULT_MESSAGES: RichTextMessages = {
47
+ bold: 'Bold', italic: 'Italic', underline: 'Underline', strike: 'Strikethrough',
48
+ h1: 'Heading 1', h2: 'Heading 2', h3: 'Heading 3', p: 'Paragraph',
49
+ ul: 'Bullet list', ol: 'Numbered list', quote: 'Quote', code: 'Code block',
50
+ alignLeft: 'Align left', alignCenter: 'Align center', alignRight: 'Align right',
51
+ link: 'Link', clear: 'Clear formatting', undo: 'Undo', redo: 'Redo',
52
+ linkPrompt: 'Link URL', toolbar: 'Formatting',
42
53
  }
43
54
 
44
55
  type Props = {
@@ -52,6 +63,8 @@
52
63
  /** Toolbar tools + order; use '|' for a separator. */
53
64
  tools?: RichTextTool[]
54
65
  ariaLabel?: string
66
+ /** Override any toolbar label / prompt (localization). */
67
+ messages?: Partial<RichTextMessages>
55
68
  }
56
69
 
57
70
  let {
@@ -63,8 +76,10 @@
63
76
  minHeight = '160px',
64
77
  tools = DEFAULT_TOOLS,
65
78
  ariaLabel = 'Rich text editor',
79
+ messages,
66
80
  }: Props = $props()
67
81
 
82
+ const M = $derived(resolveMessages(DEFAULT_MESSAGES, messages))
68
83
  const uid = nextEditorId('sv-rt')
69
84
  let editorEl = $state<HTMLDivElement | null>(null)
70
85
  let focused = $state(false)
@@ -109,14 +124,14 @@
109
124
  ul: () => exec('insertUnorderedList'), ol: () => exec('insertOrderedList'),
110
125
  quote: () => exec('formatBlock', 'BLOCKQUOTE'), code: () => exec('formatBlock', 'PRE'),
111
126
  alignLeft: () => exec('justifyLeft'), alignCenter: () => exec('justifyCenter'), alignRight: () => exec('justifyRight'),
112
- link: () => { const url = typeof prompt === 'function' ? prompt('Link URL', 'https://') : null; if (url) exec('createLink', url) },
127
+ link: () => { const url = typeof prompt === 'function' ? prompt(M.linkPrompt, 'https://') : null; if (url) exec('createLink', url) },
113
128
  clear: () => exec('removeFormat'), undo: () => exec('undo'), redo: () => exec('redo'),
114
129
  }
115
130
  </script>
116
131
 
117
132
  <div class="sv-rt" class:is-disabled={disabled} class:is-readonly={readonly}>
118
133
  {#if !readonly}
119
- <div class="sv-rt__toolbar" role="toolbar" aria-label="Formatting" aria-controls={uid}>
134
+ <div class="sv-rt__toolbar" role="toolbar" aria-label={M.toolbar} aria-controls={uid}>
120
135
  {#each tools as t, i (i)}
121
136
  {#if t === '|'}
122
137
  <span class="sv-rt__sep" aria-hidden="true"></span>
@@ -126,13 +141,13 @@
126
141
  class="sv-rt__btn"
127
142
  class:is-on={activeState[t]}
128
143
  data-tool={t}
129
- title={META[t].label}
130
- aria-label={META[t].label}
144
+ title={M[t]}
145
+ aria-label={M[t]}
131
146
  aria-pressed={activeState[t] ? true : undefined}
132
147
  {disabled}
133
148
  onmousedown={(e) => e.preventDefault()}
134
149
  onclick={run[t]}
135
- >{META[t].glyph}</button>
150
+ >{GLYPH[t]}</button>
136
151
  {/if}
137
152
  {/each}
138
153
  </div>
@@ -1,4 +1,11 @@
1
1
  export type RichTextTool = 'bold' | 'italic' | 'underline' | 'strike' | 'h1' | 'h2' | 'h3' | 'p' | 'ul' | 'ol' | 'quote' | 'code' | 'alignLeft' | 'alignCenter' | 'alignRight' | 'link' | 'clear' | 'undo' | 'redo' | '|';
2
+ /** User-facing strings (localizable via `messages`). Every one is a tooltip +
3
+ * accessible name on a toolbar button, so leaving them hard-coded made the
4
+ * whole toolbar English-only for screen-reader users. */
5
+ type RichTextMessages = Record<Exclude<RichTextTool, '|'>, string> & {
6
+ linkPrompt: string;
7
+ toolbar: string;
8
+ };
2
9
  type Props = {
3
10
  /** HTML string (bindable). */
4
11
  value?: string;
@@ -10,6 +17,8 @@ type Props = {
10
17
  /** Toolbar tools + order; use '|' for a separator. */
11
18
  tools?: RichTextTool[];
12
19
  ariaLabel?: string;
20
+ /** Override any toolbar label / prompt (localization). */
21
+ messages?: Partial<RichTextMessages>;
13
22
  };
14
23
  declare const SvRichText: import("svelte").Component<Props, {}, "value">;
15
24
  type SvRichText = ReturnType<typeof SvRichText>;
@@ -53,8 +53,9 @@
53
53
  </script>
54
54
 
55
55
  <SvField id={uid} {label} {hint} {error} {required} {dir}>
56
+ <!-- role="switch" arrives via switchProps(), which the a11y pass cannot see through -->
57
+ <!-- svelte-ignore a11y_role_supports_aria_props_implicit -->
56
58
  <button
57
- role="switch"
58
59
  class="sv-switch sv-switch--{size}"
59
60
  class:is-on={checked}
60
61
  class:is-readonly={readonly}
@@ -135,7 +135,7 @@
135
135
 
136
136
  :global(.sv-toast--success) { --_accent: var(--sg-success, #16a34a); }
137
137
  :global(.sv-toast--error) { --_accent: var(--sg-danger, #dc2626); }
138
- :global(.sv-toast--warning) { --_accent: var(--sg-warning, #f59e0b); }
138
+ :global(.sv-toast--warning) { --_accent: var(--sg-warning, #d97706); }
139
139
  :global(.sv-toast--info) { --_accent: var(--sg-accent, #2563eb); }
140
140
 
141
141
  :global(.sv-toast__icon) { flex: none; width: 18px; height: 18px; display: grid; place-items: center; color: var(--_accent); font-weight: 700; }
@@ -48,6 +48,11 @@
48
48
  /** Render a built-in search box that drives the filter. */
49
49
  searchable?: boolean
50
50
  searchPlaceholder?: string
51
+ /** Placeholder row shown under a lazy node while its children load
52
+ * (localization). */
53
+ loadingText?: string
54
+ /** Accessible name for the search box's clear button (localization). */
55
+ clearSearchLabel?: string
51
56
  /** Sort siblings by label ('asc'/'desc') or a custom comparator. */
52
57
  sort?: 'asc' | 'desc' | ((a: TreeNode, b: TreeNode) => number)
53
58
  /** Allow inline rename (double-click or F2). Fires onRename. */
@@ -77,6 +82,8 @@
77
82
  filter,
78
83
  searchable = false,
79
84
  searchPlaceholder = 'Search...',
85
+ loadingText = 'Loading...',
86
+ clearSearchLabel = 'Clear search',
80
87
  sort,
81
88
  editable = false,
82
89
  onRename,
@@ -173,7 +180,7 @@
173
180
  if (!node?.lazy || loaded.has(id) || loadingIds.has(id)) return
174
181
  loadingIds = new Set(loadingIds).add(id)
175
182
  // A placeholder row shows immediately while the promise resolves.
176
- loaded = new Map(loaded).set(id, [{ id: `${id}__loading`, label: 'Loading...', disabled: true }])
183
+ loaded = new Map(loaded).set(id, [{ id: `${id}__loading`, label: loadingText, disabled: true }])
177
184
  try {
178
185
  const kids = await loadChildren(node)
179
186
  loaded = new Map(loaded).set(id, kids)
@@ -268,7 +275,7 @@
268
275
  <div class="sv-tree__search">
269
276
  <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true"><circle cx="11" cy="11" r="7" /><path d="m21 21-4.3-4.3" /></svg>
270
277
  <input class="sv-tree__search-input" type="text" placeholder={searchPlaceholder} bind:value={query} aria-label={searchPlaceholder} />
271
- {#if query}<button type="button" class="sv-tree__search-clear" aria-label="Clear search" onclick={() => (query = '')}>&times;</button>{/if}
278
+ {#if query}<button type="button" class="sv-tree__search-clear" aria-label={clearSearchLabel} onclick={() => (query = '')}>&times;</button>{/if}
272
279
  </div>
273
280
  {/if}
274
281
  <!-- svelte-ignore a11y_no_static_element_interactions -->
@@ -30,6 +30,11 @@ type Props = {
30
30
  /** Render a built-in search box that drives the filter. */
31
31
  searchable?: boolean;
32
32
  searchPlaceholder?: string;
33
+ /** Placeholder row shown under a lazy node while its children load
34
+ * (localization). */
35
+ loadingText?: string;
36
+ /** Accessible name for the search box's clear button (localization). */
37
+ clearSearchLabel?: string;
33
38
  /** Sort siblings by label ('asc'/'desc') or a custom comparator. */
34
39
  sort?: 'asc' | 'desc' | ((a: TreeNode, b: TreeNode) => number);
35
40
  /** Allow inline rename (double-click or F2). Fires onRename. */
@@ -186,7 +186,11 @@
186
186
  {...ts.itemProps(i)}
187
187
  >
188
188
  {#if row.hasChildren}
189
- <span class="sv-ts__chev" class:is-open={row.expanded} aria-hidden="true">▸</span>
189
+ <!-- Same chevron as SvTree and the grid's expanders. -->
190
+ <span class="sv-ts__chev" class:is-open={row.expanded} aria-hidden="true">
191
+ <svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor"
192
+ stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="m9 18 6-6-6-6" /></svg>
193
+ </span>
190
194
  {:else}
191
195
  <span class="sv-ts__chev sv-ts__chev--leaf" aria-hidden="true"></span>
192
196
  {/if}
@@ -226,7 +230,7 @@
226
230
  :global(.sv-ts__row.is-active) { background: var(--sg-row-hover-bg, #f1f5f9); }
227
231
  :global(.sv-ts__row.is-selected) { color: var(--sg-accent, #2563eb); font-weight: 600; }
228
232
  :global(.sv-ts__row.is-disabled) { opacity: 0.5; cursor: not-allowed; }
229
- :global(.sv-ts__chev) { width: 14px; flex: none; color: var(--sg-muted, #64748b); transition: transform 0.12s; font-size: 10px; }
233
+ :global(.sv-ts__chev) { width: 14px; flex: none; display: inline-flex; align-items: center; justify-content: center; color: var(--sg-muted, #64748b); transition: transform 0.12s; }
230
234
  :global(.sv-ts__chev.is-open) { transform: rotate(90deg); }
231
235
  :global(.sv-ts__chev--leaf) { visibility: hidden; }
232
236
  :global(.sv-ts__label) { flex: 1; white-space: nowrap; }
package/dist/build-api.js CHANGED
@@ -315,6 +315,22 @@ export function createGridApi(ctx) {
315
315
  clearFilter(columnId) {
316
316
  ctx.clearColumnFilter(columnId);
317
317
  },
318
+ refreshEditorOptions(columnId) {
319
+ // Async `editorOptions` are cached per column (or per column+row for a
320
+ // per-row source) so opening an editor twice does not refetch. This
321
+ // drops those entries, so the next render re-runs the source - use it
322
+ // when the underlying list changed server-side.
323
+ if (columnId == null) {
324
+ ctx.asyncEditorOptions = {};
325
+ return;
326
+ }
327
+ const next = { ...ctx.asyncEditorOptions };
328
+ for (const key of Object.keys(next)) {
329
+ if (key === columnId || key.startsWith(`${columnId}::`))
330
+ delete next[key];
331
+ }
332
+ ctx.asyncEditorOptions = next;
333
+ },
318
334
  clearAllFilters() {
319
335
  // See `setFilter` for why the read-modify-write is untracked.
320
336
  untrack(() => {
@@ -1,13 +1,13 @@
1
- import { no as e, qn as t, ro as n, to as r } from "./src-BLJfdyL0.js";
2
- import { l as i } from "./SvDateTimePicker-DB0aIEk8.js";
1
+ import { Gn as e, io as t, no as n, ro as r } from "./src-BgHjWF0Q.js";
2
+ import { l as i } from "./SvDateTimePicker-ClqtVIj3.js";
3
3
  import * as a from "svelte/internal/client";
4
4
  import "svelte/internal/disclose-version";
5
5
  //#region src/GridMenus.svelte
6
6
  var o = a.from_html("<option> </option>"), s = a.from_html("<input class=\"sv-grid-menu-condition-value\" placeholder=\"To\"/>"), c = a.from_html("<option> </option>"), l = a.from_html("<input class=\"sv-grid-menu-condition-value\" placeholder=\"To\"/>"), u = a.from_html("<input class=\"sv-grid-menu-condition-value\"/> <!>", 1), d = a.from_html("<div class=\"sv-grid-menu-join\" role=\"radiogroup\" aria-label=\"Combine conditions\"><button type=\"button\">AND</button> <button type=\"button\">OR</button> <button type=\"button\" class=\"sv-grid-menu-join-x\" title=\"Remove second condition\" aria-label=\"Remove second condition\">×</button></div> <select class=\"sv-grid-menu-operator-select\" aria-label=\"Second filter condition\"></select> <!>", 1), f = a.from_html("<button type=\"button\" class=\"sv-grid-menu-add-cond\">+ Add condition</button>"), p = a.from_html("<input class=\"sv-grid-menu-condition-value\"/> <!> <!>", 1), m = a.from_html("<div class=\"sv-grid-facet-empty\">No values</div>"), h = a.from_html("<div class=\"sv-grid-facet-note\"> </div>"), g = a.from_html("<div class=\"sv-grid-menu-filter\"><div class=\"sv-grid-menu-filter-head\"><span class=\"sv-grid-header-icon\"><!></span> Filter\n condition</div> <select class=\"sv-grid-menu-operator-select\" aria-label=\"Filter condition\"></select> <!> <div class=\"sv-grid-menu-sep\"></div> <div class=\"sv-grid-menu-filter-head\">Values</div> <input class=\"sv-grid-menu-search\" placeholder=\"Search values...\"/> <label class=\"sv-grid-facet sv-grid-facet-all\"><input type=\"checkbox\"/> <span class=\"sv-grid-facet-label\">(Select all)</span></label> <!> <!> <div class=\"sv-grid-menu-actions\"><button type=\"button\" class=\"sv-grid-menu-btn\">Clear filter</button> <button type=\"button\" class=\"sv-grid-menu-btn sv-grid-menu-btn-primary\">Done</button></div></div>"), _ = a.from_html("<div role=\"tooltip\"> </div>"), v = a.from_html("<div class=\"sv-grid-menu-backdrop\" role=\"presentation\"></div>"), y = a.from_html("<button type=\"button\" role=\"tab\">Filter</button>"), b = a.from_html("<div class=\"sv-grid-menu-tabs\" role=\"tablist\"><button type=\"button\" role=\"tab\">General</button> <!> <button type=\"button\" role=\"tab\">Columns</button></div>"), x = a.from_html("<div class=\"sv-grid-menu-filter-head\">Visible columns</div> <!>", 1), S = a.from_html("<button type=\"button\" class=\"sv-grid-menu-item\" role=\"menuitem\"><span class=\"sv-grid-header-icon\"><!></span> Sort\n ascending</button> <button type=\"button\" class=\"sv-grid-menu-item\" role=\"menuitem\"><span class=\"sv-grid-header-icon\"><!></span> Sort\n descending</button> <button type=\"button\" class=\"sv-grid-menu-item\" role=\"menuitem\"><span class=\"sv-grid-header-icon\"><!></span> Remove sort</button>", 1), ee = a.from_html("<div class=\"sv-grid-menu-sep\"></div> <button type=\"button\" class=\"sv-grid-menu-item\" role=\"menuitem\"><span class=\"sv-grid-header-icon\"><!></span> Pin to left</button> <button type=\"button\" class=\"sv-grid-menu-item\" role=\"menuitem\"><span class=\"sv-grid-header-icon\"><!></span> Pin to right</button> <button type=\"button\" class=\"sv-grid-menu-item\" role=\"menuitem\"><span class=\"sv-grid-header-icon\"><!></span> Unpin column</button>", 1), C = a.from_html("<div class=\"sv-grid-menu-sep\"></div> <button type=\"button\" class=\"sv-grid-menu-item\" role=\"menuitem\"><span class=\"sv-grid-header-icon\"><!></span> Group\n by this column</button> <button type=\"button\" class=\"sv-grid-menu-item\" role=\"menuitem\"><span class=\"sv-grid-header-icon\"><!></span> Remove grouping</button>", 1), w = a.from_html("<button type=\"button\" role=\"menuitem\" aria-haspopup=\"menu\"><span class=\"sv-grid-header-icon\"><!></span> Choose columns <span class=\"sv-grid-header-icon sv-grid-menu-item-chevron\"><!></span></button>"), T = a.from_html("<!> <!> <div class=\"sv-grid-menu-sep\"></div> <button type=\"button\" class=\"sv-grid-menu-item\" role=\"menuitem\"><span class=\"sv-grid-header-icon\"><!></span> Autosize\n this column</button> <button type=\"button\" class=\"sv-grid-menu-item\" role=\"menuitem\"><span class=\"sv-grid-header-icon\"><!></span> Autosize\n all columns</button> <!> <div class=\"sv-grid-menu-sep\"></div> <!> <button type=\"button\" class=\"sv-grid-menu-item\" role=\"menuitem\"><span class=\"sv-grid-header-icon\"><!></span> Reset columns</button>", 1), te = a.from_html("<div class=\"sv-grid-menu sv-grid-column-menu\" role=\"menu\"><!> <!></div>"), E = a.from_html("<div class=\"sv-grid-menu sv-grid-filter-menu\" role=\"menu\"><!></div>"), D = a.from_html("<div class=\"sv-grid-menu sv-grid-choose-columns-menu\" role=\"menu\"><div class=\"sv-grid-menu-filter-head\">Visible columns</div> <!></div>"), O = a.from_html("<button type=\"button\" class=\"sv-grid-menu-item\" role=\"menuitemradio\"><span class=\"sv-grid-header-icon\"><!></span> </button>"), k = a.from_html("<div class=\"sv-grid-menu sv-grid-operator-menu\" role=\"menu\"></div>"), ne = a.from_html("<div class=\"sv-grid-facet-empty\">No values</div>"), re = a.from_html("<div class=\"sv-grid-menu sv-grid-in-suggest\"><!></div>"), A = a.from_html("<div class=\"sv-grid-menu-sep\"></div>"), ie = a.from_html("<button type=\"button\" class=\"sv-grid-menu-item\" role=\"menuitem\"> </button>"), j = a.from_html("<div class=\"sv-grid-menu-backdrop\" role=\"presentation\"></div> <div class=\"sv-grid-menu sv-grid-context-menu\" role=\"menu\"></div>", 1), M = a.from_html("<div class=\"sv-grid-menu-backdrop\" role=\"presentation\"></div> <div class=\"sv-grid-menu sv-grid-comment-editor\" role=\"dialog\" aria-label=\"Edit comment\"><textarea class=\"sv-grid-comment-textarea\" rows=\"3\" placeholder=\"Add a comment…\"></textarea> <div class=\"sv-grid-comment-actions\"><button type=\"button\" class=\"sv-grid-comment-remove\">Remove</button> <span class=\"sv-grid-comment-spacer\"></span> <button type=\"button\" class=\"sv-grid-comment-cancel\">Cancel</button> <button type=\"button\" class=\"sv-grid-comment-save\">Save</button></div></div>", 1), ae = a.from_html("<!> <!> <!> <!> <!> <!> <!> <!> <!>", 1);
7
7
  function oe(oe, N) {
8
8
  a.push(N, !0);
9
- let se = (e, r = a.noop) => {
10
- let i = a.derived(() => a.get(G).find((e) => e.id === r())), _ = a.derived(() => a.get(xe)(a.get(i))), v = a.derived(() => a.get(F)[r()]?.operator ?? a.get(K)(a.get(i))), y = a.derived(() => n(a.get(i)?.columnDef.editorType ?? "text"));
9
+ let se = (n, r = a.noop) => {
10
+ let i = a.derived(() => a.get(G).find((e) => e.id === r())), _ = a.derived(() => a.get(xe)(a.get(i))), v = a.derived(() => a.get(F)[r()]?.operator ?? a.get(K)(a.get(i))), y = a.derived(() => t(a.get(i)?.columnDef.editorType ?? "text"));
11
11
  var b = g(), x = a.child(b), S = a.child(x), ee = a.child(S);
12
12
  a.snippet(ee, () => N.icon, () => "filter"), a.reset(S), a.next(), a.reset(x);
13
13
  var C = a.sibling(x, 2);
@@ -106,10 +106,10 @@ function oe(oe, N) {
106
106
  a.remove_input_defaults(E);
107
107
  var D = a.sibling(E, 2), O = a.child(D);
108
108
  a.remove_input_defaults(O), a.next(2), a.reset(D);
109
- var k = a.sibling(D, 2), ne = (e) => {
109
+ var k = a.sibling(D, 2), ne = (t) => {
110
110
  {
111
111
  let n = a.derived(() => a.get(X).length > Ue);
112
- t(e, {
112
+ e(t, {
113
113
  block: !0,
114
114
  checkbox: !0,
115
115
  multiple: !0,
@@ -148,7 +148,7 @@ function oe(oe, N) {
148
148
  w !== (w = a.get(v)) && (C.value = (C.__value = a.get(v)) ?? "", a.select_option(C, a.get(v))), a.set_checked(O, e), M.disabled = t;
149
149
  }, [() => a.get(Ve)(r()), () => !a.get(Te)(r())]), a.delegated("change", C, (e) => a.get(ve)(r(), e.currentTarget.value)), a.bind_value(E, () => P().columnMenuSearch, (e) => P().columnMenuSearch = e), a.delegated("change", O, () => a.get(He)(r())), a.delegated("click", M, () => a.get(Ye)(r())), a.delegated("click", ae, function(...e) {
150
150
  a.get(Y)?.apply(this, e);
151
- }), a.append(e, b);
151
+ }), a.append(n, b);
152
152
  }, P = a.prop(N, "ctrl", 7), ce = a.derived(() => P().groupingControlsEnabled), F = a.derived(() => P().filterMenuValues), I = a.derived(() => P().tooltip);
153
153
  a.derived(() => P().showTooltipFor);
154
154
  let L = a.derived(() => P().columnMenuFor), R = a.derived(() => P().columnMenuPos), z = a.derived(() => P().filterMenuFor), B = a.derived(() => P().filterMenuPos), V = a.derived(() => P().operatorMenuFor), le = a.derived(() => P().operatorMenuPos), H = a.derived(() => P().chooseColumnsPos), U = a.derived(() => P().showColumnFiltersEffective), W = a.derived(() => P().props.columnMenuTabs === !0), ue = a.derived(() => P().grid), G = a.derived(() => P().allColumns), de = a.derived(() => P().isColumnPinned), fe = a.derived(() => P().pinColumnLeft), pe = a.derived(() => P().pinColumnRight), me = a.derived(() => P().unpinColumn), he = a.derived(() => P().sortDirectionByColumn), ge = a.derived(() => P().groupingColumns), _e = a.derived(() => P().columnVirtualizationEnabled), ve = a.derived(() => P().updateFilterOperator), ye = a.derived(() => P().updateFilterMenuValue), be = a.derived(() => P().updateFilterMenuValueTo), xe = a.derived(() => P().operatorsForColumn), K = a.derived(() => P().defaultOperatorFor), q = a.derived(() => P().operatorLabelFor), Se = a.derived(() => P().filterRowValues), Ce = a.derived(() => P().inSuggestFor), we = a.derived(() => P().inSuggestPos);
@@ -174,11 +174,11 @@ function oe(oe, N) {
174
174
  };
175
175
  });
176
176
  let Ee = a.derived(() => P().autosizeColumn), De = a.derived(() => P().autosizeAllColumns), Oe = a.derived(() => P().resetColumns), ke = a.derived(() => P().openChooseColumns), Ae = a.derived(() => P().sortColumnFromMenu), je = a.derived(() => P().clearColumnSort), Me = a.derived(() => P().groupByColumnFromMenu), Ne = a.derived(() => P().clearGroupingFromMenu), Pe = a.derived(() => P().columnMenuFacetValues), Fe = a.derived(() => P().columnMenuVisibleFacets), X = a.derived(() => P().columnMenuFacetOptions), Ie = a.derived(() => P().columnMenuSelectedFacets), Le = a.derived(() => P().setFacetSelection), Re = a.derived(() => P().setFilterTokens), Z = a.derived(() => P().inSuggestOptions), ze = a.derived(() => P().openInSuggest), Be = a.derived(() => P().closeInSuggest), Ve = a.derived(() => P().isAllFacetsChecked), He = a.derived(() => P().toggleAllFacets), Ue = 40;
177
- function We(t, n) {
178
- a.get(ze)(t, n), P().inSuggestQuery = e(t.value);
177
+ function We(e, t) {
178
+ a.get(ze)(e, t), P().inSuggestQuery = r(e.value);
179
179
  }
180
- function Ge(t, n) {
181
- P().inSuggestQuery = e(t.value), P().inSuggestFor !== n && a.get(ze)(t, n);
180
+ function Ge(e, t) {
181
+ P().inSuggestQuery = r(e.value), P().inSuggestFor !== t && a.get(ze)(e, t);
182
182
  }
183
183
  function Ke(e) {
184
184
  return e.map((e) => ({
@@ -217,7 +217,7 @@ function oe(oe, N) {
217
217
  a.if(at, (e) => {
218
218
  (a.get(L) || a.get(z) || a.get(V) || a.get(H)) && e(ot);
219
219
  });
220
- var st = a.sibling(at, 2), ct = (e) => {
220
+ var st = a.sibling(at, 2), ct = (t) => {
221
221
  let n = a.derived(() => a.get(L)), r = a.derived(() => a.get(G).find((e) => e.id === a.get(n))), i = a.derived(() => a.get(r)?.getCanSort?.() ?? !1), o = a.derived(() => a.get(r)?.columnDef.field != null && a.get(r)?.columnDef.filterable !== !1), s = a.derived(() => P().columnMenuTab);
222
222
  var c = te(), l = a.child(c), u = (e) => {
223
223
  var t = b(), n = a.child(t);
@@ -243,17 +243,17 @@ function oe(oe, N) {
243
243
  });
244
244
  var d = a.sibling(l, 2), f = (e) => {
245
245
  se(e, () => a.get(n));
246
- }, p = (e) => {
246
+ }, p = (t) => {
247
247
  let n = a.derived(() => a.get(ue).getAllColumns());
248
248
  var r = x(), i = a.sibling(a.first_child(r), 2);
249
249
  {
250
- let e = a.derived(() => a.get(n).length > 40), r = a.derived(() => Ke(a.get(n))), o = a.derived(() => qe(a.get(n)));
251
- t(i, {
250
+ let t = a.derived(() => a.get(n).length > 40), r = a.derived(() => Ke(a.get(n))), o = a.derived(() => qe(a.get(n)));
251
+ e(i, {
252
252
  block: !0,
253
253
  checkbox: !0,
254
254
  multiple: !0,
255
255
  get virtual() {
256
- return a.get(e);
256
+ return a.get(t);
257
257
  },
258
258
  rows: 9,
259
259
  rowHeight: 24,
@@ -268,7 +268,7 @@ function oe(oe, N) {
268
268
  onChange: (e) => Je(a.get(n), e)
269
269
  });
270
270
  }
271
- a.append(e, r);
271
+ a.append(t, r);
272
272
  }, m = (e) => {
273
273
  var t = T(), r = a.first_child(t), o = (e) => {
274
274
  var t = S(), r = a.first_child(t), i = a.child(r), o = a.child(i);
@@ -334,7 +334,7 @@ function oe(oe, N) {
334
334
  };
335
335
  a.if(d, (e) => {
336
336
  a.get(W) && a.get(s) === "filter" && a.get(o) && a.get(U) ? e(f) : a.get(W) && a.get(s) === "columns" ? e(p, 1) : e(m, -1);
337
- }), a.reset(c), a.template_effect(() => a.set_style(c, `left: ${a.get(R).x}px; top: ${a.get(R).y}px; max-height: calc(100vh - ${a.get(R).y}px - 12px);`)), a.append(e, c);
337
+ }), a.reset(c), a.template_effect(() => a.set_style(c, `left: ${a.get(R).x}px; top: ${a.get(R).y}px; max-height: calc(100vh - ${a.get(R).y}px - 12px);`)), a.append(t, c);
338
338
  };
339
339
  a.if(st, (e) => {
340
340
  a.get(L) && e(ct);
@@ -346,17 +346,17 @@ function oe(oe, N) {
346
346
  a.if(lt, (e) => {
347
347
  a.get(z) && a.get(U) && e(ut);
348
348
  });
349
- var dt = a.sibling(lt, 2), ft = (e) => {
349
+ var dt = a.sibling(lt, 2), ft = (t) => {
350
350
  let n = a.derived(() => a.get(ue).getAllColumns());
351
351
  var r = D(), i = a.sibling(a.child(r), 2);
352
352
  {
353
- let e = a.derived(() => a.get(n).length > 40), r = a.derived(() => Ke(a.get(n))), o = a.derived(() => qe(a.get(n)));
354
- t(i, {
353
+ let t = a.derived(() => a.get(n).length > 40), r = a.derived(() => Ke(a.get(n))), o = a.derived(() => qe(a.get(n)));
354
+ e(i, {
355
355
  block: !0,
356
356
  checkbox: !0,
357
357
  multiple: !0,
358
358
  get virtual() {
359
- return a.get(e);
359
+ return a.get(t);
360
360
  },
361
361
  rows: 11,
362
362
  rowHeight: 24,
@@ -371,7 +371,7 @@ function oe(oe, N) {
371
371
  onChange: (e) => Je(a.get(n), e)
372
372
  });
373
373
  }
374
- a.reset(r), a.template_effect(() => a.set_style(r, `left: ${a.get(H).x}px; top: ${a.get(H).y}px;`)), a.append(e, r);
374
+ a.reset(r), a.template_effect(() => a.set_style(r, `left: ${a.get(H).x}px; top: ${a.get(H).y}px;`)), a.append(t, r);
375
375
  };
376
376
  a.if(dt, (e) => {
377
377
  a.get(H) && e(ft);
@@ -393,17 +393,17 @@ function oe(oe, N) {
393
393
  a.if(pt, (e) => {
394
394
  a.get(V) && e(mt);
395
395
  });
396
- var ht = a.sibling(pt, 2), gt = (n) => {
397
- let i = a.derived(() => a.get(Ce)), o = a.derived(() => new Set(r(a.get(Se)[a.get(i)] ?? "")));
398
- var s = re(), c = a.child(s), l = (n) => {
396
+ var ht = a.sibling(pt, 2), gt = (t) => {
397
+ let i = a.derived(() => a.get(Ce)), o = a.derived(() => new Set(n(a.get(Se)[a.get(i)] ?? "")));
398
+ var s = re(), c = a.child(s), l = (t) => {
399
399
  {
400
- let r = a.derived(() => a.get(Z).length > 40);
401
- t(n, {
400
+ let n = a.derived(() => a.get(Z).length > 40);
401
+ e(t, {
402
402
  block: !0,
403
403
  checkbox: !0,
404
404
  multiple: !0,
405
405
  get virtual() {
406
- return a.get(r);
406
+ return a.get(n);
407
407
  },
408
408
  rows: 8,
409
409
  rowHeight: 26,
@@ -415,9 +415,9 @@ function oe(oe, N) {
415
415
  get value() {
416
416
  return a.get(o);
417
417
  },
418
- onChange: (t) => {
419
- let n = new Set(t), r = e(a.get(Se)[a.get(i)] ?? "");
420
- r && n.delete(r), a.get(Re)(a.get(i), [...n]), P().inSuggestQuery = "";
418
+ onChange: (e) => {
419
+ let t = new Set(e), n = r(a.get(Se)[a.get(i)] ?? "");
420
+ n && t.delete(n), a.get(Re)(a.get(i), [...t]), P().inSuggestQuery = "";
421
421
  }
422
422
  });
423
423
  }
@@ -427,7 +427,7 @@ function oe(oe, N) {
427
427
  };
428
428
  a.if(c, (e) => {
429
429
  a.get(Z).length ? e(l) : e(u, -1);
430
- }), a.reset(s), a.template_effect(() => a.set_style(s, `left: ${a.get(we).x}px; top: ${a.get(we).y}px;`)), a.delegated("mousedown", s, (e) => e.preventDefault()), a.append(n, s);
430
+ }), a.reset(s), a.template_effect(() => a.set_style(s, `left: ${a.get(we).x}px; top: ${a.get(we).y}px;`)), a.delegated("mousedown", s, (e) => e.preventDefault()), a.append(t, s);
431
431
  };
432
432
  a.if(ht, (e) => {
433
433
  a.get(Ce) && e(gt);