@likable-hair/svelte 3.0.19 → 3.0.21

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 (53) hide show
  1. package/dist/components/composed/common/MenuOrDrawer.svelte +3 -2
  2. package/dist/components/composed/common/MenuOrDrawer.svelte.d.ts +2 -1
  3. package/dist/components/composed/common/MenuOrDrawerOptions.svelte +2 -2
  4. package/dist/components/composed/common/MenuOrDrawerOptions.svelte.d.ts +1 -1
  5. package/dist/components/composed/forms/Dropdown.svelte +19 -8
  6. package/dist/components/composed/forms/Dropdown.svelte.d.ts +7 -0
  7. package/dist/components/composed/list/PaginatedTable.svelte +179 -129
  8. package/dist/components/composed/list/PaginatedTable.svelte.d.ts +71 -2
  9. package/dist/components/composed/list/Paginator.svelte +12 -6
  10. package/dist/components/composed/search/FilterEditor.svelte +260 -0
  11. package/dist/components/composed/search/FilterEditor.svelte.d.ts +29 -0
  12. package/dist/components/composed/search/Filters.css +0 -0
  13. package/dist/components/composed/search/Filters.svelte +500 -0
  14. package/dist/components/composed/search/Filters.svelte.d.ts +46 -0
  15. package/dist/components/composed/search/MobileFilterEditor.svelte +342 -0
  16. package/dist/components/composed/search/MobileFilterEditor.svelte.d.ts +34 -0
  17. package/dist/components/composed/search/SearchBar.svelte +12 -11
  18. package/dist/components/composed/search/SearchBar.svelte.d.ts +1 -0
  19. package/dist/components/simple/buttons/Button.css +1 -0
  20. package/dist/components/simple/buttons/Button.svelte +8 -0
  21. package/dist/components/simple/common/Menu.svelte +29 -10
  22. package/dist/components/simple/common/Menu.svelte.d.ts +2 -0
  23. package/dist/components/simple/dates/DatePickerTextField.svelte +91 -61
  24. package/dist/components/simple/dates/DatePickerTextField.svelte.d.ts +2 -0
  25. package/dist/components/simple/dialogs/Dialog.svelte.d.ts +1 -1
  26. package/dist/components/simple/forms/Autocomplete.css +1 -0
  27. package/dist/components/simple/forms/Autocomplete.svelte +100 -46
  28. package/dist/components/simple/forms/Autocomplete.svelte.d.ts +4 -0
  29. package/dist/components/simple/lists/SelectableVerticalList.svelte +52 -9
  30. package/dist/components/simple/lists/SelectableVerticalList.svelte.d.ts +9 -0
  31. package/dist/components/simple/lists/SimpleTable.svelte +25 -23
  32. package/dist/components/simple/lists/SimpleTable.svelte.d.ts +3 -1
  33. package/dist/components/simple/lists/columnTypes.d.ts +35 -0
  34. package/dist/components/simple/lists/columnTypes.js +1 -0
  35. package/dist/components/simple/media/DescriptiveAvatar.svelte.d.ts +1 -1
  36. package/dist/components/simple/navigation/Chip.css +2 -1
  37. package/dist/components/simple/navigation/Chip.svelte +16 -5
  38. package/dist/components/simple/navigation/Chip.svelte.d.ts +1 -0
  39. package/dist/components/simple/navigation/Drawer.svelte +10 -0
  40. package/dist/components/simple/navigation/Drawer.svelte.d.ts +1 -0
  41. package/dist/index.d.ts +1 -0
  42. package/dist/index.js +1 -0
  43. package/dist/utils/filters/builder.d.ts +43 -0
  44. package/dist/utils/filters/builder.js +137 -0
  45. package/dist/utils/filters/filters.d.ts +89 -0
  46. package/dist/utils/filters/filters.js +102 -0
  47. package/dist/utils/filters/modifiers/join.d.ts +26 -0
  48. package/dist/utils/filters/modifiers/join.js +1 -0
  49. package/dist/utils/filters/modifiers/where.d.ts +29 -0
  50. package/dist/utils/filters/modifiers/where.js +1 -0
  51. package/dist/utils/filters/validator.d.ts +4 -0
  52. package/dist/utils/filters/validator.js +30 -0
  53. package/package.json +2 -1
@@ -0,0 +1,500 @@
1
+ <script context="module"></script>
2
+
3
+ <script>import "./Filters.css";
4
+ import "../../../css/main.css";
5
+ import Drawer from "../../simple/navigation/Drawer.svelte";
6
+ import Menu from "../../simple/common/Menu.svelte";
7
+ import MediaQuery from "../../simple/common/MediaQuery.svelte";
8
+ import Button from "../../simple/buttons/Button.svelte";
9
+ import Icon from "../../simple/media/Icon.svelte";
10
+ import { createEventDispatcher } from "svelte";
11
+ import SelectableVerticalList from "../../simple/lists/SelectableVerticalList.svelte";
12
+ import Chip from "../../simple/navigation/Chip.svelte";
13
+ import FilterEditor from "./FilterEditor.svelte";
14
+ import MobileFilterEditor from "./MobileFilterEditor.svelte";
15
+ import { fly } from "svelte/transition";
16
+ export let filters = [], lang = "en", addFilterLabel = lang == "en" ? "Filters" : "Filtri", cancelFilterLabel = lang == "en" ? "Cancel" : "Annulla", applyFilterLabel = lang == "en" ? "Apply filter" : "Applica filtro", showActiveFilters = true, filterTitleLabel = lang == "en" ? "Filter by" : "Filtra per", dateLocale = "en", betweenSeparator = lang == "en" ? "and" : "e", trueString = lang == "en" ? "true" : "vero", falseString = lang == "en" ? "false" : "falso", labelsMapper = lang == "en" ? {
17
+ "equal": {
18
+ extended: "equal to",
19
+ short: "equal"
20
+ },
21
+ "like": {
22
+ short: "includes"
23
+ },
24
+ "ilike": {
25
+ short: "includes"
26
+ },
27
+ "greater": {
28
+ short: "greater",
29
+ extended: "greater than"
30
+ },
31
+ "lower": {
32
+ short: "lower",
33
+ extended: "lower than"
34
+ },
35
+ "between": {
36
+ short: "between",
37
+ extended: "is between"
38
+ },
39
+ "different": {
40
+ short: "different",
41
+ extended: "different from"
42
+ }
43
+ } : {
44
+ "equal": {
45
+ extended: "uguale a",
46
+ short: "uguale"
47
+ },
48
+ "like": {
49
+ short: "include"
50
+ },
51
+ "ilike": {
52
+ short: "include"
53
+ },
54
+ "greater": {
55
+ short: "maggiore",
56
+ extended: "maggiore di"
57
+ },
58
+ "lower": {
59
+ short: "minore",
60
+ extended: "minore di"
61
+ },
62
+ "between": {
63
+ short: "compreso",
64
+ extended: "\xE8 compreso"
65
+ },
66
+ "different": {
67
+ short: "diverso",
68
+ extended: "diverso da"
69
+ }
70
+ };
71
+ let dispatch = createEventDispatcher();
72
+ let open = false, mobileOpen = false, activator;
73
+ function handleAddFilterClick() {
74
+ dispatch("addFilterClick");
75
+ open = true;
76
+ mobileOpen = true;
77
+ }
78
+ $:
79
+ filterOptions = filters.map((f) => {
80
+ return {
81
+ title: f.label,
82
+ name: f.name
83
+ };
84
+ });
85
+ $:
86
+ deletableFilterOptions = filters.map((f) => {
87
+ return {
88
+ title: f.label,
89
+ name: f.name,
90
+ appendIcon: f.active ? "mdi-delete" : void 0
91
+ };
92
+ });
93
+ let selected;
94
+ let focused;
95
+ $:
96
+ if (!!focused && !open)
97
+ focused = void 0;
98
+ let filterOpened = "new";
99
+ let filterOptionsListActivator;
100
+ let singleFilterActivator;
101
+ let singleFilterMenuAnchor = "right-center";
102
+ let singleFilterMenuOpened = false;
103
+ let selectedFilter = void 0;
104
+ $:
105
+ selectedFilterIndex = filters.findIndex((f) => {
106
+ return f.name === selected;
107
+ });
108
+ $:
109
+ selectedFilter = selected === void 0 ? void 0 : filters[selectedFilterIndex];
110
+ function handleFilterSelection(e, mobile = false) {
111
+ if (mobile) {
112
+ selected = e.detail.element.name;
113
+ singleFilterMenuOpened = true;
114
+ } else {
115
+ singleFilterActivator = filterOptionsListActivator;
116
+ singleFilterMenuAnchor = "right-center";
117
+ singleFilterMenuOpened = true;
118
+ selected = e.detail.element.name;
119
+ filterOpened = "new";
120
+ }
121
+ }
122
+ function handleCancelFilterClick() {
123
+ open = false;
124
+ mobileOpen = false;
125
+ singleFilterMenuOpened = false;
126
+ }
127
+ function handleApplyFilterClick() {
128
+ if (!!selectedFilter) {
129
+ filters[selectedFilterIndex] = selectedFilter;
130
+ open = false;
131
+ mobileOpen = false;
132
+ singleFilterMenuOpened = false;
133
+ dispatch("applyFilter");
134
+ }
135
+ }
136
+ $:
137
+ activeFilters = filters.filter((f) => f.active);
138
+ function handleRemoveFilter(filter) {
139
+ let filterIndex = filters.findIndex((f) => f.name === filter.name);
140
+ filters[filterIndex].active = false;
141
+ if (Object.keys(filters[filterIndex]).includes("value")) {
142
+ filters[filterIndex].value = void 0;
143
+ }
144
+ if (Object.keys(filters[filterIndex]).includes("from")) {
145
+ filters[filterIndex].from = void 0;
146
+ }
147
+ if (Object.keys(filters[filterIndex]).includes("to")) {
148
+ filters[filterIndex].to = void 0;
149
+ }
150
+ singleFilterMenuOpened = false;
151
+ dispatch("removeFilter", { filter: filters[filterIndex] });
152
+ }
153
+ let activeFiltersActivators = {};
154
+ function handleActiveFilterClick(filter) {
155
+ singleFilterActivator = activeFiltersActivators[filter.name];
156
+ singleFilterMenuAnchor = "bottom-center";
157
+ singleFilterMenuOpened = true;
158
+ mobileOpen = true;
159
+ selected = filter.name;
160
+ filterOpened = "edit";
161
+ }
162
+ function handleMobileBackTap() {
163
+ closeFilterMenu(0);
164
+ }
165
+ function closeFilterMenu(delay) {
166
+ setTimeout(() => {
167
+ singleFilterMenuOpened = false;
168
+ }, delay);
169
+ }
170
+ function handleDeleteIconClick(e) {
171
+ let filterIndex = e.detail.index;
172
+ let name = filters[filterIndex].name;
173
+ handleRemoveFilter({ name });
174
+ }
175
+ </script>
176
+
177
+ <MediaQuery let:mAndDown>
178
+ <div class="filters-wrapper" class:mobile={mAndDown}>
179
+ <div class="filters-container" class:mobile={mAndDown}>
180
+ {#if showActiveFilters}
181
+ {#each activeFilters as filter}
182
+ <div
183
+ class="filter-slot"
184
+ bind:this={activeFiltersActivators[filter.name]}
185
+ >
186
+ <Chip
187
+ label
188
+ close
189
+ on:close={() => handleRemoveFilter(filter)}
190
+ on:click={() => handleActiveFilterClick(filter)}
191
+ >
192
+ <span class="truncate-text inline-truncated" style:max-width="160px">
193
+ <b>{filter.label}</b>
194
+ </span>
195
+ {#if filter.type === "string" && filter.value != undefined}
196
+ {labelsMapper[filter.mode || ""].extended || labelsMapper[filter.mode || ""].short || filter.mode}
197
+ <span class="truncate-text inline-truncated">
198
+ <b>{filter.value}</b>
199
+ </span>
200
+ {:else if filter.type === "date"}
201
+ {#if filter.mode == 'between' && filter.from != undefined && filter.to != undefined}
202
+ {labelsMapper[filter.mode || ""].extended || labelsMapper[filter.mode || ""].short || filter.mode}
203
+ <span class="truncate-text inline-truncated"><b>{filter.from?.toLocaleDateString(dateLocale)}</b></span>
204
+ {betweenSeparator}
205
+ <span class="truncate-text inline-truncated"><b>{filter.to?.toLocaleDateString(dateLocale)}</b></span>
206
+ {:else if filter.mode != 'between' && filter.value != undefined}
207
+ {labelsMapper[filter.mode || ""].extended || labelsMapper[filter.mode || ""].short || filter.mode}
208
+ <span class="truncate-text inline-truncated"><b>{filter.value?.toLocaleDateString(dateLocale)}</b></span>
209
+ {/if}
210
+ {:else if filter.type == "number"}
211
+ {#if filter.mode == 'between' && filter.from != undefined && filter.to != undefined}
212
+ {labelsMapper[filter.mode || ""].extended || labelsMapper[filter.mode || ""].short || filter.mode}
213
+ <span class="truncate-text inline-truncated"><b>{filter.from}</b></span>
214
+ {betweenSeparator}
215
+ <span class="truncate-text inline-truncated"><b>{filter.to}</b></span>
216
+ {:else if filter.mode != 'between' && filter.value != undefined}
217
+ {labelsMapper[filter.mode || ""].extended || labelsMapper[filter.mode || ""].short || filter.mode}
218
+ <span class="truncate-text inline-truncated"><b>{filter.value}</b></span>
219
+ {/if}
220
+ {:else if filter.type == 'select' && !!filter.values && filter.values.length > 0}
221
+ {labelsMapper[filter.mode || ""].extended || labelsMapper[filter.mode || ""].short || filter.mode}
222
+ <span class="truncate-text inline-truncated"><b>{filter.values[0].label}</b></span>
223
+ {#if filter.values.length >= 2}
224
+ <span class="more-items">+{filter.values.length - 1}
225
+ <!--TODO create tooltip component-->
226
+ <span class="more-tooltip">
227
+ <ul>
228
+ {#each filter.values as value}
229
+ <li><div class="truncate-text">{value.label}</div></li>
230
+ {/each}
231
+ </ul>
232
+ </span>
233
+ </span>
234
+ {/if}
235
+ {:else if filter.type == 'bool' && filter.value !== undefined}
236
+ <b>{filter.value ? trueString : falseString}</b>
237
+ {/if}
238
+ </Chip>
239
+ </div>
240
+ {/each}
241
+ {/if}
242
+ {#if !mAndDown}
243
+ <div
244
+ class="filter-button"
245
+ bind:this={activator}
246
+ >
247
+ <Button
248
+ --button-color="var(--chip-color, var(--chip-default-color))"
249
+ on:click={handleAddFilterClick}
250
+ >
251
+ <Icon name="mdi-filter"></Icon>
252
+ {addFilterLabel}
253
+ {#if activeFilters.length > 0 }
254
+ ({activeFilters.length})
255
+ {/if}
256
+ </Button>
257
+
258
+ </div>
259
+ {/if}
260
+ </div>
261
+ {#if mAndDown}
262
+ <div
263
+ class="filter-button"
264
+ bind:this={activator}
265
+ >
266
+ <Button
267
+ --button-color="var(--chip-color, var(--chip-default-color))"
268
+ on:click={handleAddFilterClick}
269
+ >
270
+ <Icon name="mdi-filter"></Icon>
271
+ {addFilterLabel}
272
+ {#if activeFilters.length > 0 }
273
+ ({activeFilters.length})
274
+ {/if}
275
+ </Button>
276
+
277
+ </div>
278
+ {/if}
279
+ </div>
280
+ {#if mAndDown}
281
+ <Drawer
282
+ bind:open={mobileOpen}
283
+ position="bottom"
284
+ on:close={() => {closeFilterMenu(200)}}
285
+ --drawer-border-radius="20px 20px 0px 0px"
286
+ --drawer-margin="5px 5px 0px 5px"
287
+ >
288
+ <div class="drawer-content">
289
+ {#if !!selectedFilter && singleFilterMenuOpened}
290
+ <div class="drawer-filter-detail" style:height="100%" in:fly={{delay: 100, duration: 100, x: 200}} out:fly={{duration: 100, x: -200}}>
291
+ <MobileFilterEditor
292
+ bind:filter={selectedFilter}
293
+ bind:applyFilterLabel
294
+ bind:cancelFilterLabel
295
+ on:apply={handleApplyFilterClick}
296
+ on:backClick={handleMobileBackTap}
297
+ on:cancelClick={() => {mobileOpen = false; closeFilterMenu(200)}}
298
+ {lang}
299
+ {labelsMapper}
300
+ >
301
+ <div slot="title">
302
+ <div class="mobile-title">
303
+ {selectedFilter?.label}
304
+ </div>
305
+ </div>
306
+ </MobileFilterEditor>
307
+ </div>
308
+ {:else}
309
+ <div class="drawer-filter-list" style:margin-top="20px" style:height="100%" out:fly={{duration: 100, x: -200}} in:fly={{duration: 100, x: 200, delay: 100}}>
310
+ <SelectableVerticalList
311
+ bind:selected
312
+ bind:focused
313
+ bind:elements={deletableFilterOptions}
314
+ --selectable-vertical-list-default-width="100%"
315
+ --selectable-vertical-list-default-element-height="56px"
316
+ --selectable-vertical-list-default-title-font-size="null"
317
+ on:select={(e) => {handleFilterSelection(e, true)}}
318
+ centered
319
+ bicolor
320
+ appendIconSize="18pt"
321
+ on:iconClick={handleDeleteIconClick}
322
+ --icon-color="rgb(var(--global-color-error-400))"
323
+ ></SelectableVerticalList>
324
+ </div>
325
+ {/if}
326
+ </div>
327
+ </Drawer>
328
+ {:else}
329
+ <Menu
330
+ bind:activator={activator}
331
+ bind:open={open}
332
+ closeOnClickOutside
333
+ _boxShadow="rgb(var(--global-color-grey-900), .5) 0px 2px 4px"
334
+ _height="fit-content"
335
+ _minWidth="10vw"
336
+ _borderRadius="5px"
337
+ anchor="bottom"
338
+ openingId="select-filter"
339
+ >
340
+ <div
341
+ style:background-color="rgb(var(--global-color-background-200))"
342
+ bind:this={filterOptionsListActivator}
343
+ on:click|stopPropagation
344
+ on:keydown
345
+ >
346
+ <SelectableVerticalList
347
+ bind:selected
348
+ bind:focused
349
+ bind:elements={filterOptions}
350
+ --selectable-vertical-list-default-width="100%"
351
+ --selectable-vertical-list-default-element-height="56px"
352
+ --selectable-vertical-list-default-title-font-size="null"
353
+ on:select={handleFilterSelection}
354
+ ></SelectableVerticalList>
355
+ </div>
356
+ </Menu>
357
+
358
+ <Menu
359
+ _width="350px"
360
+ _borderRadius="10px"
361
+ _boxShadow="rgb(var(--global-color-grey-900), .5) 0px 2px 4px"
362
+ _overflow="unset"
363
+ activator={singleFilterActivator}
364
+ bind:open={singleFilterMenuOpened}
365
+ anchor={singleFilterMenuAnchor}
366
+ closeOnClickOutside
367
+ flipOnOverflow
368
+ openingId={ filterOpened == 'edit' ? "select-filter" : ""}
369
+ >
370
+ <div
371
+ style:min-height="160px"
372
+ on:click
373
+ on:keydown
374
+ style:border-radius="10px"
375
+ style:overflow="auto"
376
+ style:height="100%"
377
+ style:background-color="rgb(var(--global-color-background-200))"
378
+ >
379
+ <div class="filter-title">
380
+ {filterTitleLabel} {selectedFilter?.label}
381
+ </div>
382
+
383
+ {#if !!selectedFilter}
384
+ <FilterEditor
385
+ bind:filter={selectedFilter}
386
+ bind:applyFilterLabel
387
+ bind:cancelFilterLabel
388
+ on:cancel={handleCancelFilterClick}
389
+ on:apply={handleApplyFilterClick}
390
+ {lang}
391
+ {labelsMapper}
392
+ ></FilterEditor>
393
+ {/if}
394
+ </div>
395
+ </Menu>
396
+ {/if}
397
+ </MediaQuery>
398
+
399
+
400
+
401
+ <style>
402
+
403
+ .filter-title{
404
+ display: flex;
405
+ justify-content: center;
406
+ margin-top: 10px;
407
+ margin-left: 10px;
408
+ }
409
+
410
+ .filter-slot {
411
+ flex-shrink: 0;
412
+ flex-grow: 0;
413
+ }
414
+
415
+ .filters-container {
416
+ display: flex;
417
+ flex-wrap: wrap;
418
+ gap: 5px;
419
+ align-items: center;
420
+ }
421
+
422
+ .filters-container.mobile {
423
+ flex-wrap: nowrap;
424
+ overflow: scroll;
425
+ }
426
+
427
+ .filters-wrapper {
428
+ display: flex;
429
+ align-items: center;
430
+ gap: 20px;
431
+ max-width: 100%;
432
+ }
433
+
434
+ .filter-button {
435
+ flex-shrink: 0;
436
+ flex-grow: 0;
437
+ height: fit-content;
438
+ }
439
+
440
+ .drawer-content{
441
+ height: 100%;
442
+ }
443
+
444
+ .more-items {
445
+ position: relative;
446
+ padding: 2px 8px 2px 8px;
447
+ border-radius: 20px;
448
+ margin-left: 5px;
449
+ background-color: rgb(var(--global-color-grey-50));
450
+ color: rgb(var(--global-color-primary-500));
451
+ font-weight: 800;
452
+ font-size: .7rem;
453
+ }
454
+
455
+ .more-tooltip {
456
+ visibility: hidden;
457
+ min-width: 120px;
458
+ max-width: 300px;
459
+ width: fit-content;
460
+ border-radius: 6px;
461
+ padding: 5px 0;
462
+ position: absolute;
463
+ text-align: left;
464
+ bottom: 125%;
465
+ left: 50%;
466
+ margin-left: -60px;
467
+ opacity: 0;
468
+ transition: opacity 0.3s;
469
+ position: absolute;
470
+ background-color: rgb(var(--global-color-background-200));
471
+ color: rgb(var(--global-color-background-950));
472
+ z-index: 100;
473
+ }
474
+
475
+ .more-tooltip ul {
476
+ list-style-type: none;
477
+ padding-left: 0px;
478
+ margin-left: 20px;
479
+ margin-right: 20px
480
+ }
481
+
482
+
483
+ .more-items:hover .more-tooltip {
484
+ visibility: visible;
485
+ opacity: 1;
486
+ }
487
+
488
+ .truncate-text {
489
+ text-overflow: ellipsis;
490
+ overflow: hidden;
491
+ white-space: nowrap;
492
+ }
493
+
494
+ .inline-truncated {
495
+ display: inline-block;
496
+ vertical-align: middle;
497
+ max-width: 240px;
498
+ }
499
+
500
+ </style>
@@ -0,0 +1,46 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ export type ArrayElement<ArrayType extends readonly unknown[]> = ArrayType extends readonly (infer ElementType)[] ? ElementType : never;
3
+ export type LabelMapper = {
4
+ [label: string]: {
5
+ extended?: string;
6
+ short: string;
7
+ };
8
+ };
9
+ import './Filters.css';
10
+ import '../../../css/main.css';
11
+ import type { Filter } from '../../../utils/filters/filters';
12
+ import type { Locale } from '../../simple/dates/utils';
13
+ declare const __propDef: {
14
+ props: {
15
+ filters?: Filter[] | undefined;
16
+ lang?: "it" | "en" | undefined;
17
+ addFilterLabel?: string | undefined;
18
+ cancelFilterLabel?: string | undefined;
19
+ applyFilterLabel?: string | undefined;
20
+ showActiveFilters?: boolean | undefined;
21
+ filterTitleLabel?: string | undefined;
22
+ dateLocale?: Locale | undefined;
23
+ betweenSeparator?: string | undefined;
24
+ trueString?: string | undefined;
25
+ falseString?: string | undefined;
26
+ labelsMapper?: LabelMapper | undefined;
27
+ };
28
+ events: {
29
+ click: MouseEvent;
30
+ keydown: KeyboardEvent;
31
+ addFilterClick: CustomEvent<undefined>;
32
+ applyFilter: CustomEvent<undefined>;
33
+ removeFilter: CustomEvent<{
34
+ filter: Filter;
35
+ }>;
36
+ } & {
37
+ [evt: string]: CustomEvent<any>;
38
+ };
39
+ slots: {};
40
+ };
41
+ export type FiltersProps = typeof __propDef.props;
42
+ export type FiltersEvents = typeof __propDef.events;
43
+ export type FiltersSlots = typeof __propDef.slots;
44
+ export default class Filters extends SvelteComponentTyped<FiltersProps, FiltersEvents, FiltersSlots> {
45
+ }
46
+ export {};