@ibobbyts/svelte-ui-utils 0.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 (82) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +379 -0
  3. package/dist/data-table/BaseDataTable.svelte +322 -0
  4. package/dist/data-table/BaseDataTable.svelte.d.ts +49 -0
  5. package/dist/data-table/BaseDataTable.svelte.d.ts.map +1 -0
  6. package/dist/data-table/DataTable.svelte +104 -0
  7. package/dist/data-table/DataTable.svelte.d.ts +59 -0
  8. package/dist/data-table/DataTable.svelte.d.ts.map +1 -0
  9. package/dist/data-table/DateRangeFilter.svelte +174 -0
  10. package/dist/data-table/DateRangeFilter.svelte.d.ts +30 -0
  11. package/dist/data-table/DateRangeFilter.svelte.d.ts.map +1 -0
  12. package/dist/data-table/FilterControl.svelte +184 -0
  13. package/dist/data-table/FilterControl.svelte.d.ts +5 -0
  14. package/dist/data-table/FilterControl.svelte.d.ts.map +1 -0
  15. package/dist/data-table/FilterTable.svelte +25 -0
  16. package/dist/data-table/FilterTable.svelte.d.ts +24 -0
  17. package/dist/data-table/FilterTable.svelte.d.ts.map +1 -0
  18. package/dist/data-table/NumberRangeFilter.svelte +80 -0
  19. package/dist/data-table/NumberRangeFilter.svelte.d.ts +32 -0
  20. package/dist/data-table/NumberRangeFilter.svelte.d.ts.map +1 -0
  21. package/dist/data-table/filter.d.ts +23 -0
  22. package/dist/data-table/filter.d.ts.map +1 -0
  23. package/dist/data-table/filter.js +38 -0
  24. package/dist/data-table/index.d.ts +11 -0
  25. package/dist/data-table/index.d.ts.map +1 -0
  26. package/dist/data-table/index.js +8 -0
  27. package/dist/data-table/state.d.ts +11 -0
  28. package/dist/data-table/state.d.ts.map +1 -0
  29. package/dist/data-table/state.js +58 -0
  30. package/dist/data-table/types.d.ts +167 -0
  31. package/dist/data-table/types.d.ts.map +1 -0
  32. package/dist/data-table/types.js +1 -0
  33. package/dist/dropdown/Dropdown.svelte +159 -0
  34. package/dist/dropdown/Dropdown.svelte.d.ts +28 -0
  35. package/dist/dropdown/Dropdown.svelte.d.ts.map +1 -0
  36. package/dist/dropdown/index.d.ts +3 -0
  37. package/dist/dropdown/index.d.ts.map +1 -0
  38. package/dist/dropdown/index.js +1 -0
  39. package/dist/dropdown/types.d.ts +9 -0
  40. package/dist/dropdown/types.d.ts.map +1 -0
  41. package/dist/dropdown/types.js +1 -0
  42. package/dist/dropdown-search/DropdownSearch.svelte +312 -0
  43. package/dist/dropdown-search/DropdownSearch.svelte.d.ts +51 -0
  44. package/dist/dropdown-search/DropdownSearch.svelte.d.ts.map +1 -0
  45. package/dist/dropdown-search/index.d.ts +6 -0
  46. package/dist/dropdown-search/index.d.ts.map +1 -0
  47. package/dist/dropdown-search/index.js +3 -0
  48. package/dist/dropdown-search/state.d.ts +15 -0
  49. package/dist/dropdown-search/state.d.ts.map +1 -0
  50. package/dist/dropdown-search/state.js +44 -0
  51. package/dist/dropdown-search/types.d.ts +24 -0
  52. package/dist/dropdown-search/types.d.ts.map +1 -0
  53. package/dist/dropdown-search/types.js +1 -0
  54. package/dist/i18n.d.ts +31 -0
  55. package/dist/i18n.d.ts.map +1 -0
  56. package/dist/i18n.js +118 -0
  57. package/dist/index.d.ts +7 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +5 -0
  60. package/dist/pagination/Pagination.svelte +112 -0
  61. package/dist/pagination/Pagination.svelte.d.ts +30 -0
  62. package/dist/pagination/Pagination.svelte.d.ts.map +1 -0
  63. package/dist/pagination/index.d.ts +6 -0
  64. package/dist/pagination/index.d.ts.map +1 -0
  65. package/dist/pagination/index.js +3 -0
  66. package/dist/style.css +1110 -0
  67. package/dist/toast/Toast.svelte +37 -0
  68. package/dist/toast/Toast.svelte.d.ts +26 -0
  69. package/dist/toast/Toast.svelte.d.ts.map +1 -0
  70. package/dist/toast/ToastManager.svelte +29 -0
  71. package/dist/toast/ToastManager.svelte.d.ts +26 -0
  72. package/dist/toast/ToastManager.svelte.d.ts.map +1 -0
  73. package/dist/toast/index.d.ts +7 -0
  74. package/dist/toast/index.d.ts.map +1 -0
  75. package/dist/toast/index.js +4 -0
  76. package/dist/toast/store.d.ts +7 -0
  77. package/dist/toast/store.d.ts.map +1 -0
  78. package/dist/toast/store.js +114 -0
  79. package/dist/toast/types.d.ts +36 -0
  80. package/dist/toast/types.d.ts.map +1 -0
  81. package/dist/toast/types.js +1 -0
  82. package/package.json +83 -0
@@ -0,0 +1,174 @@
1
+ <script lang="ts">
2
+ import { getUiMessages, type UiLanguage } from '../i18n.js';
3
+ import type { DateRangeFilterValue, DateRangePreset } from './types.js';
4
+
5
+ export let value: DateRangeFilterValue = {
6
+ startDate: '',
7
+ endDate: '',
8
+ preset: null
9
+ };
10
+ export let language: UiLanguage = 'en_us';
11
+ export let startLabel: string | undefined = undefined;
12
+ export let endLabel: string | undefined = undefined;
13
+ export let presetLabels: Partial<Record<DateRangePreset, string>> = {};
14
+ export let now: () => Date = () => new Date();
15
+ export let weekStartsOn: 0 | 1 = 1;
16
+ export let onChange: ((value: DateRangeFilterValue) => void) | undefined = undefined;
17
+
18
+ const presets: DateRangePreset[] = [
19
+ 'last24Hours',
20
+ 'last7Days',
21
+ 'last30Days',
22
+ 'today',
23
+ 'thisWeek',
24
+ 'thisMonth',
25
+ 'thisYear'
26
+ ];
27
+
28
+ $: messages = getUiMessages(language);
29
+ $: resolvedStartLabel = startLabel ?? messages.dateRange.startLabel;
30
+ $: resolvedEndLabel = endLabel ?? messages.dateRange.endLabel;
31
+
32
+ function pad(value: number) {
33
+ return String(value).padStart(2, '0');
34
+ }
35
+
36
+ function formatDate(date: Date) {
37
+ return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
38
+ }
39
+
40
+ function formatDateTime(date: Date) {
41
+ return `${formatDate(date)}T${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;
42
+ }
43
+
44
+ function startOfDay(date: Date) {
45
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate());
46
+ }
47
+
48
+ function addDays(date: Date, days: number) {
49
+ const next = new Date(date);
50
+ next.setDate(next.getDate() + days);
51
+ return next;
52
+ }
53
+
54
+ function startOfWeek(date: Date) {
55
+ const start = startOfDay(date);
56
+ const day = start.getDay();
57
+ const offset = weekStartsOn === 1 ? (day + 6) % 7 : day;
58
+ return addDays(start, -offset);
59
+ }
60
+
61
+ function resolvePreset(preset: DateRangePreset): DateRangeFilterValue {
62
+ const current = now();
63
+ const today = startOfDay(current);
64
+
65
+ if (preset === 'last24Hours') {
66
+ const start = new Date(current.getTime() - 24 * 60 * 60 * 1000);
67
+ return {
68
+ startDate: formatDate(start),
69
+ endDate: formatDate(current),
70
+ preset,
71
+ startDateTime: formatDateTime(start),
72
+ endDateTime: formatDateTime(current)
73
+ };
74
+ }
75
+
76
+ if (preset === 'last7Days') {
77
+ return {
78
+ startDate: formatDate(addDays(today, -6)),
79
+ endDate: formatDate(today),
80
+ preset
81
+ };
82
+ }
83
+
84
+ if (preset === 'last30Days') {
85
+ return {
86
+ startDate: formatDate(addDays(today, -29)),
87
+ endDate: formatDate(today),
88
+ preset
89
+ };
90
+ }
91
+
92
+ if (preset === 'thisWeek') {
93
+ return {
94
+ startDate: formatDate(startOfWeek(today)),
95
+ endDate: formatDate(today),
96
+ preset
97
+ };
98
+ }
99
+
100
+ if (preset === 'thisMonth') {
101
+ return {
102
+ startDate: formatDate(new Date(today.getFullYear(), today.getMonth(), 1)),
103
+ endDate: formatDate(today),
104
+ preset
105
+ };
106
+ }
107
+
108
+ if (preset === 'thisYear') {
109
+ return {
110
+ startDate: formatDate(new Date(today.getFullYear(), 0, 1)),
111
+ endDate: formatDate(today),
112
+ preset
113
+ };
114
+ }
115
+
116
+ return {
117
+ startDate: formatDate(today),
118
+ endDate: formatDate(today),
119
+ preset
120
+ };
121
+ }
122
+
123
+ function emit(next: DateRangeFilterValue) {
124
+ value = next;
125
+ onChange?.(next);
126
+ }
127
+
128
+ function updateDate(part: 'startDate' | 'endDate', nextValue: string) {
129
+ emit({
130
+ startDate: part === 'startDate' ? nextValue : value.startDate,
131
+ endDate: part === 'endDate' ? nextValue : value.endDate,
132
+ preset: null
133
+ });
134
+ }
135
+
136
+ function applyPreset(preset: DateRangePreset) {
137
+ emit(resolvePreset(preset));
138
+ }
139
+
140
+ function labelFor(preset: DateRangePreset) {
141
+ return presetLabels[preset] ?? messages.dateRange.presetLabels[preset];
142
+ }
143
+ </script>
144
+
145
+ <div class="suu-date-range-filter">
146
+ <label class="suu-range-field">
147
+ <span>{resolvedStartLabel}</span>
148
+ <input
149
+ type="date"
150
+ value={value.startDate}
151
+ on:change={(event) => updateDate('startDate', (event.currentTarget as HTMLInputElement).value)}
152
+ />
153
+ </label>
154
+ <label class="suu-range-field">
155
+ <span>{resolvedEndLabel}</span>
156
+ <input
157
+ type="date"
158
+ value={value.endDate}
159
+ on:change={(event) => updateDate('endDate', (event.currentTarget as HTMLInputElement).value)}
160
+ />
161
+ </label>
162
+ <div class="suu-filter-preset-row">
163
+ {#each presets as preset}
164
+ <button
165
+ type="button"
166
+ class="suu-filter-preset"
167
+ class:suu-filter-preset--active={value.preset === preset}
168
+ on:click={() => applyPreset(preset)}
169
+ >
170
+ {labelFor(preset)}
171
+ </button>
172
+ {/each}
173
+ </div>
174
+ </div>
@@ -0,0 +1,30 @@
1
+ import { type UiLanguage } from '../i18n.js';
2
+ import type { DateRangeFilterValue, DateRangePreset } from './types.js';
3
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
4
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
5
+ $$bindings?: Bindings;
6
+ } & Exports;
7
+ (internal: unknown, props: Props & {
8
+ $$events?: Events;
9
+ $$slots?: Slots;
10
+ }): Exports & {
11
+ $set?: any;
12
+ $on?: any;
13
+ };
14
+ z_$$bindings?: Bindings;
15
+ }
16
+ declare const DateRangeFilter: $$__sveltets_2_IsomorphicComponent<{
17
+ value?: DateRangeFilterValue;
18
+ language?: UiLanguage;
19
+ startLabel?: string | undefined;
20
+ endLabel?: string | undefined;
21
+ presetLabels?: Partial<Record<DateRangePreset, string>>;
22
+ now?: () => Date;
23
+ weekStartsOn?: 0 | 1;
24
+ onChange?: ((value: DateRangeFilterValue) => void) | undefined;
25
+ }, {
26
+ [evt: string]: CustomEvent<any>;
27
+ }, {}, {}, string>;
28
+ type DateRangeFilter = InstanceType<typeof DateRangeFilter>;
29
+ export default DateRangeFilter;
30
+ //# sourceMappingURL=DateRangeFilter.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateRangeFilter.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/data-table/DateRangeFilter.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAsKxE,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,eAAe;YAVmL,oBAAoB;eAAa,UAAU;iBAAe,MAAM,GAAG,SAAS;eAAa,MAAM,GAAG,SAAS;mBAAiB,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;UAAQ,MAAM,IAAI;mBAAiB,CAAC,GAAG,CAAC;eAAa,CAAC,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC,GAAG,SAAS;;;kBAUhX,CAAC;AACnF,KAAK,eAAe,GAAG,YAAY,CAAC,OAAO,eAAe,CAAC,CAAC;AAC9D,eAAe,eAAe,CAAC"}
@@ -0,0 +1,184 @@
1
+ <script lang="ts">
2
+ import DropdownSearch from '../dropdown-search/DropdownSearch.svelte';
3
+ import type { UiLanguage } from '../i18n.js';
4
+ import DateRangeFilter from './DateRangeFilter.svelte';
5
+ import NumberRangeFilter from './NumberRangeFilter.svelte';
6
+ import type { FilterControl } from './types.js';
7
+
8
+ export let control: FilterControl;
9
+ export let language: UiLanguage = 'en_us';
10
+
11
+ function actionClass(variant: string | undefined): string {
12
+ return `suu-filter-table__action suu-filter-table__action--${variant ?? 'outline'}`;
13
+ }
14
+
15
+ function toggleCheckbox(value: string | number, checked: boolean) {
16
+ if (control.type !== 'checkbox') {
17
+ return;
18
+ }
19
+
20
+ const current = [...control.value];
21
+ const next = checked ? [...new Set([...current, value])] : current.filter((item) => item !== value);
22
+ void control.onChange(next);
23
+ }
24
+
25
+ function runButton() {
26
+ if (control.type === 'button') {
27
+ void control.onClick();
28
+ }
29
+ }
30
+
31
+ function runSelect(event: Event) {
32
+ if (control.type === 'select') {
33
+ void control.onChange((event.currentTarget as HTMLSelectElement).value);
34
+ }
35
+ }
36
+ </script>
37
+
38
+ {#if control.type === 'container'}
39
+ <div class="suu-filter-table__control-row">
40
+ {#each control.controls as child}
41
+ <svelte:self control={child} {language} />
42
+ {/each}
43
+ </div>
44
+ {:else if control.type === 'checkbox'}
45
+ <div class="suu-filter-table__options">
46
+ {#each control.options as option}
47
+ <label class="suu-filter-table__option" class:suu-filter-table__option--checked={control.value.includes(option.value)}>
48
+ <input
49
+ class="suu-filter-table__option-input"
50
+ type="checkbox"
51
+ value={option.value}
52
+ disabled={option.disabled}
53
+ checked={control.value.includes(option.value)}
54
+ on:change={(event) => toggleCheckbox(option.value, (event.currentTarget as HTMLInputElement).checked)}
55
+ />
56
+ <span class="suu-filter-table__option-label">{option.label}</span>
57
+ <span class="suu-filter-table__option-check" aria-hidden="true">
58
+ <svg viewBox="0 0 20 20">
59
+ <path d="m5 10 3 3 7-7"></path>
60
+ </svg>
61
+ </span>
62
+ </label>
63
+ {/each}
64
+ </div>
65
+ {:else if control.type === 'radio'}
66
+ <div class="suu-filter-table__options">
67
+ {#each control.options as option}
68
+ <label class="suu-filter-table__option" class:suu-filter-table__option--checked={control.value === option.value}>
69
+ <input
70
+ class="suu-filter-table__option-input"
71
+ type="radio"
72
+ value={option.value}
73
+ disabled={option.disabled}
74
+ checked={control.value === option.value}
75
+ on:change={() => control.type === 'radio' && void control.onChange(option.value)}
76
+ />
77
+ <span class="suu-filter-table__option-label">{option.label}</span>
78
+ <span class="suu-filter-table__option-check" aria-hidden="true">
79
+ <svg viewBox="0 0 20 20">
80
+ <path d="m5 10 3 3 7-7"></path>
81
+ </svg>
82
+ </span>
83
+ </label>
84
+ {/each}
85
+ </div>
86
+ {:else if control.type === 'dropdownSearch'}
87
+ <DropdownSearch
88
+ value={control.value}
89
+ selectedItem={control.selectedItem}
90
+ status={control.status}
91
+ placeholder={control.placeholder ?? ''}
92
+ ariaLabel={control.ariaLabel}
93
+ debounceMs={control.debounceMs ?? 500}
94
+ limit={control.limit ?? 10}
95
+ minLength={control.minLength ?? 1}
96
+ {language}
97
+ noResultsText={control.noResultsText}
98
+ loadingText={control.loadingText}
99
+ clearLabel={control.clearLabel}
100
+ searchOnExternalValueChange={control.searchOnExternalValueChange ?? false}
101
+ width={control.width}
102
+ minWidth={control.minWidth}
103
+ maxWidth={control.maxWidth}
104
+ getItemValue={control.getItemValue ?? ((item) => item.title)}
105
+ loadOptions={control.loadOptions}
106
+ onChange={(detail) => control.type === 'dropdownSearch' && void control.onChange(detail)}
107
+ />
108
+ {:else if control.type === 'dateRange'}
109
+ <DateRangeFilter
110
+ value={control.value}
111
+ {language}
112
+ startLabel={control.startLabel}
113
+ endLabel={control.endLabel}
114
+ presetLabels={control.presetLabels ?? {}}
115
+ now={control.now ?? (() => new Date())}
116
+ weekStartsOn={control.weekStartsOn ?? 1}
117
+ onChange={(detail) => control.type === 'dateRange' && void control.onChange(detail)}
118
+ />
119
+ {:else if control.type === 'numberRange'}
120
+ <NumberRangeFilter
121
+ value={control.value}
122
+ {language}
123
+ minLabel={control.minLabel}
124
+ maxLabel={control.maxLabel}
125
+ prefixLabel={control.prefixLabel ?? ''}
126
+ min={control.min}
127
+ max={control.max}
128
+ step={control.step ?? 'any'}
129
+ width={control.width}
130
+ onChange={(detail) => control.type === 'numberRange' && void control.onChange(detail)}
131
+ />
132
+ {:else if control.type === 'button'}
133
+ <button
134
+ type="button"
135
+ class={actionClass(control.variant)}
136
+ aria-label={control.ariaLabel}
137
+ disabled={control.disabled}
138
+ on:click={runButton}
139
+ >
140
+ {#if control.icon === 'search'}
141
+ <svg class="suu-filter-table__action-icon" viewBox="0 0 24 24" aria-hidden="true">
142
+ <circle cx="11" cy="11" r="7"></circle>
143
+ <path d="m16 16 4 4"></path>
144
+ </svg>
145
+ {:else if control.icon === 'qr'}
146
+ <svg class="suu-filter-table__action-icon" viewBox="0 0 24 24" aria-hidden="true">
147
+ <path d="M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4z"></path>
148
+ <path d="M14 14h2v2h-2zM18 14h2v2h-2zM14 18h2v2h-2zM18 18h2v2h-2z"></path>
149
+ </svg>
150
+ {:else if control.icon === 'x'}
151
+ <svg class="suu-filter-table__action-icon" viewBox="0 0 24 24" aria-hidden="true">
152
+ <path d="m6 6 12 12M18 6 6 18"></path>
153
+ </svg>
154
+ {/if}
155
+ {#if control.label}
156
+ <span>{control.label}</span>
157
+ {/if}
158
+ </button>
159
+ {:else if control.type === 'link'}
160
+ <a class={actionClass(control.variant ?? 'ghost')} href={control.href} aria-label={control.ariaLabel}>
161
+ {#if control.icon === 'search'}
162
+ <svg class="suu-filter-table__action-icon" viewBox="0 0 24 24" aria-hidden="true">
163
+ <circle cx="11" cy="11" r="7"></circle>
164
+ <path d="m16 16 4 4"></path>
165
+ </svg>
166
+ {:else if control.icon === 'qr'}
167
+ <svg class="suu-filter-table__action-icon" viewBox="0 0 24 24" aria-hidden="true">
168
+ <path d="M4 4h6v6H4zM14 4h6v6h-6zM4 14h6v6H4z"></path>
169
+ <path d="M14 14h2v2h-2zM18 14h2v2h-2zM14 18h2v2h-2zM18 18h2v2h-2z"></path>
170
+ </svg>
171
+ {:else if control.icon === 'x'}
172
+ <svg class="suu-filter-table__action-icon" viewBox="0 0 24 24" aria-hidden="true">
173
+ <path d="m6 6 12 12M18 6 6 18"></path>
174
+ </svg>
175
+ {/if}
176
+ <span>{control.label}</span>
177
+ </a>
178
+ {:else if control.type === 'select'}
179
+ <select class="suu-filter-table__select" aria-label={control.ariaLabel} value={control.value} on:change={runSelect}>
180
+ {#each control.options as option}
181
+ <option value={option.value} disabled={option.disabled}>{option.label}</option>
182
+ {/each}
183
+ </select>
184
+ {/if}
@@ -0,0 +1,5 @@
1
+ import type { FilterControl } from './types.js';
2
+ declare const FilterControl: any;
3
+ type FilterControl = InstanceType<typeof FilterControl>;
4
+ export default FilterControl;
5
+ //# sourceMappingURL=FilterControl.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterControl.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/data-table/FilterControl.svelte.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA0IhD,QAAA,MAAM,aAAa,KAA+E,CAAC;AACjF,KAAK,aAAa,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC;AAC1D,eAAe,aAAa,CAAC"}
@@ -0,0 +1,25 @@
1
+ <script lang="ts">
2
+ import FilterControl from './FilterControl.svelte';
3
+ import type { UiLanguage } from '../i18n.js';
4
+ import type { FilterTableRow } from './types.js';
5
+
6
+ export let rows: FilterTableRow[] = [];
7
+ export let language: UiLanguage = 'en_us';
8
+ </script>
9
+
10
+ <div class="suu-filter-table">
11
+ <div class="suu-filter-table__filters-wrap">
12
+ <table class="suu-filter-table__filters">
13
+ <tbody>
14
+ {#each rows as row (row.key)}
15
+ <tr>
16
+ <th scope="row">{row.title}</th>
17
+ <td>
18
+ <FilterControl control={row.filter} {language} />
19
+ </td>
20
+ </tr>
21
+ {/each}
22
+ </tbody>
23
+ </table>
24
+ </div>
25
+ </div>
@@ -0,0 +1,24 @@
1
+ import type { UiLanguage } from '../i18n.js';
2
+ import type { FilterTableRow } from './types.js';
3
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
4
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
5
+ $$bindings?: Bindings;
6
+ } & Exports;
7
+ (internal: unknown, props: Props & {
8
+ $$events?: Events;
9
+ $$slots?: Slots;
10
+ }): Exports & {
11
+ $set?: any;
12
+ $on?: any;
13
+ };
14
+ z_$$bindings?: Bindings;
15
+ }
16
+ declare const FilterTable: $$__sveltets_2_IsomorphicComponent<{
17
+ rows?: FilterTableRow[];
18
+ language?: UiLanguage;
19
+ }, {
20
+ [evt: string]: CustomEvent<any>;
21
+ }, {}, {}, string>;
22
+ type FilterTable = InstanceType<typeof FilterTable>;
23
+ export default FilterTable;
24
+ //# sourceMappingURL=FilterTable.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterTable.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/data-table/FilterTable.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA8BjD,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,WAAW;WAV4C,cAAc,EAAE;eAAa,UAAU;;;kBAUJ,CAAC;AAC/E,KAAK,WAAW,GAAG,YAAY,CAAC,OAAO,WAAW,CAAC,CAAC;AACtD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,80 @@
1
+ <script lang="ts">
2
+ import { getUiMessages, type UiLanguage } from '../i18n.js';
3
+ import type { NumberRangeFilterValue } from './types.js';
4
+
5
+ export let value: NumberRangeFilterValue = {
6
+ min: null,
7
+ max: null
8
+ };
9
+ export let language: UiLanguage = 'en_us';
10
+ export let minLabel: string | undefined = undefined;
11
+ export let maxLabel: string | undefined = undefined;
12
+ export let prefixLabel = '';
13
+ export let min: number | undefined = undefined;
14
+ export let max: number | undefined = undefined;
15
+ export let step: number | string = 'any';
16
+ export let width: string | undefined = undefined;
17
+ export let onChange: ((value: NumberRangeFilterValue) => void) | undefined = undefined;
18
+
19
+ $: messages = getUiMessages(language);
20
+ $: resolvedMinLabel = minLabel ?? messages.numberRange.minLabel;
21
+ $: resolvedMaxLabel = maxLabel ?? messages.numberRange.maxLabel;
22
+
23
+ function parseNumber(input: string): number | null {
24
+ if (input.trim() === '') {
25
+ return null;
26
+ }
27
+
28
+ const parsed = Number(input);
29
+ return Number.isFinite(parsed) ? parsed : null;
30
+ }
31
+
32
+ function emit(next: NumberRangeFilterValue) {
33
+ value = next;
34
+ onChange?.(next);
35
+ }
36
+
37
+ function update(part: 'min' | 'max', input: string) {
38
+ emit({
39
+ min: part === 'min' ? parseNumber(input) : value.min,
40
+ max: part === 'max' ? parseNumber(input) : value.max
41
+ });
42
+ }
43
+ </script>
44
+
45
+ <div class="suu-number-range-filter" style:--suu-number-range-field-width={width}>
46
+ <label class="suu-range-field">
47
+ <span>{resolvedMinLabel}</span>
48
+ <div class="suu-input-affix">
49
+ {#if prefixLabel}
50
+ <span class="suu-input-affix__label">{prefixLabel}</span>
51
+ {/if}
52
+ <input
53
+ type="number"
54
+ aria-label={resolvedMinLabel}
55
+ {min}
56
+ {max}
57
+ {step}
58
+ value={value.min ?? ''}
59
+ on:input={(event) => update('min', (event.currentTarget as HTMLInputElement).value)}
60
+ />
61
+ </div>
62
+ </label>
63
+ <label class="suu-range-field">
64
+ <span>{resolvedMaxLabel}</span>
65
+ <div class="suu-input-affix">
66
+ {#if prefixLabel}
67
+ <span class="suu-input-affix__label">{prefixLabel}</span>
68
+ {/if}
69
+ <input
70
+ type="number"
71
+ aria-label={resolvedMaxLabel}
72
+ {min}
73
+ {max}
74
+ {step}
75
+ value={value.max ?? ''}
76
+ on:input={(event) => update('max', (event.currentTarget as HTMLInputElement).value)}
77
+ />
78
+ </div>
79
+ </label>
80
+ </div>
@@ -0,0 +1,32 @@
1
+ import { type UiLanguage } from '../i18n.js';
2
+ import type { NumberRangeFilterValue } from './types.js';
3
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
4
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
5
+ $$bindings?: Bindings;
6
+ } & Exports;
7
+ (internal: unknown, props: Props & {
8
+ $$events?: Events;
9
+ $$slots?: Slots;
10
+ }): Exports & {
11
+ $set?: any;
12
+ $on?: any;
13
+ };
14
+ z_$$bindings?: Bindings;
15
+ }
16
+ declare const NumberRangeFilter: $$__sveltets_2_IsomorphicComponent<{
17
+ value?: NumberRangeFilterValue;
18
+ language?: UiLanguage;
19
+ minLabel?: string | undefined;
20
+ maxLabel?: string | undefined;
21
+ prefixLabel?: string;
22
+ min?: number | undefined;
23
+ max?: number | undefined;
24
+ step?: number | string;
25
+ width?: string | undefined;
26
+ onChange?: ((value: NumberRangeFilterValue) => void) | undefined;
27
+ }, {
28
+ [evt: string]: CustomEvent<any>;
29
+ }, {}, {}, string>;
30
+ type NumberRangeFilter = InstanceType<typeof NumberRangeFilter>;
31
+ export default NumberRangeFilter;
32
+ //# sourceMappingURL=NumberRangeFilter.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NumberRangeFilter.svelte.d.ts","sourceRoot":"","sources":["../../src/lib/data-table/NumberRangeFilter.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAqEzD,UAAU,kCAAkC,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACpM,KAAK,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAG;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC9G,YAAY,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAKD,QAAA,MAAM,iBAAiB;YAVqL,sBAAsB;eAAa,UAAU;eAAa,MAAM,GAAG,SAAS;eAAa,MAAM,GAAG,SAAS;;UAA0C,MAAM,GAAG,SAAS;UAAQ,MAAM,GAAG,SAAS;WAAS,MAAM,GAAG,MAAM;YAAU,MAAM,GAAG,SAAS;eAAa,CAAC,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,CAAC,GAAG,SAAS;;;kBAU7Z,CAAC;AACrF,KAAK,iBAAiB,GAAG,YAAY,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAClE,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { CheckboxFilterControl, DateRangeFilterControl, DropdownSearchFilterControl, FilterButtonControl, FilterContainerControl, FilterControl, FilterLinkControl, FilterSelectControl, NumberRangeFilterControl, RadioFilterControl } from './types.js';
2
+ declare function checkbox(options: Omit<CheckboxFilterControl, 'type'>): CheckboxFilterControl;
3
+ declare function radio(options: Omit<RadioFilterControl, 'type'>): RadioFilterControl;
4
+ declare function dropdownSearch(options: Omit<DropdownSearchFilterControl, 'type'>): DropdownSearchFilterControl;
5
+ declare function dateRange(options: Omit<DateRangeFilterControl, 'type'>): DateRangeFilterControl;
6
+ declare function numberRange(options: Omit<NumberRangeFilterControl, 'type'>): NumberRangeFilterControl;
7
+ declare function button(options: Omit<FilterButtonControl, 'type'>): FilterButtonControl;
8
+ declare function link(options: Omit<FilterLinkControl, 'type'>): FilterLinkControl;
9
+ declare function select(options: Omit<FilterSelectControl, 'type'>): FilterSelectControl;
10
+ declare function container(controls: FilterControl[]): FilterContainerControl;
11
+ export declare const filter: {
12
+ checkbox: typeof checkbox;
13
+ radio: typeof radio;
14
+ dropdownSearch: typeof dropdownSearch;
15
+ dateRange: typeof dateRange;
16
+ numberRange: typeof numberRange;
17
+ button: typeof button;
18
+ link: typeof link;
19
+ select: typeof select;
20
+ container: typeof container;
21
+ };
22
+ export {};
23
+ //# sourceMappingURL=filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/lib/data-table/filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,2BAA2B,EAC3B,mBAAmB,EACnB,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,iBAAS,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,GAAG,qBAAqB,CAErF;AAED,iBAAS,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,GAAG,kBAAkB,CAE5E;AAED,iBAAS,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,2BAA2B,EAAE,MAAM,CAAC,GAAG,2BAA2B,CAEvG;AAED,iBAAS,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,sBAAsB,EAAE,MAAM,CAAC,GAAG,sBAAsB,CAExF;AAED,iBAAS,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,MAAM,CAAC,GAAG,wBAAwB,CAE9F;AAED,iBAAS,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAE/E;AAED,iBAAS,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG,iBAAiB,CAEzE;AAED,iBAAS,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,CAAC,GAAG,mBAAmB,CAE/E;AAED,iBAAS,SAAS,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,sBAAsB,CAEpE;AAED,eAAO,MAAM,MAAM;;;;;;;;;;CAUlB,CAAC"}
@@ -0,0 +1,38 @@
1
+ function checkbox(options) {
2
+ return { type: 'checkbox', ...options };
3
+ }
4
+ function radio(options) {
5
+ return { type: 'radio', ...options };
6
+ }
7
+ function dropdownSearch(options) {
8
+ return { type: 'dropdownSearch', ...options };
9
+ }
10
+ function dateRange(options) {
11
+ return { type: 'dateRange', ...options };
12
+ }
13
+ function numberRange(options) {
14
+ return { type: 'numberRange', ...options };
15
+ }
16
+ function button(options) {
17
+ return { type: 'button', ...options };
18
+ }
19
+ function link(options) {
20
+ return { type: 'link', ...options };
21
+ }
22
+ function select(options) {
23
+ return { type: 'select', ...options };
24
+ }
25
+ function container(controls) {
26
+ return { type: 'container', controls };
27
+ }
28
+ export const filter = {
29
+ checkbox,
30
+ radio,
31
+ dropdownSearch,
32
+ dateRange,
33
+ numberRange,
34
+ button,
35
+ link,
36
+ select,
37
+ container
38
+ };
@@ -0,0 +1,11 @@
1
+ export { default as DataTable } from './DataTable.svelte';
2
+ export { default as DateRangeFilter } from './DateRangeFilter.svelte';
3
+ export { default as FilterTable } from './FilterTable.svelte';
4
+ export { default as NumberRangeFilter } from './NumberRangeFilter.svelte';
5
+ export { default as Pagination } from '../pagination/Pagination.svelte';
6
+ export { filter } from './filter.js';
7
+ export { getUiMessages, resolveUiLanguage, uiLanguages } from '../i18n.js';
8
+ export { getAriaSort, getCellValue, getPageCount, normalizePagination, setDataTableFilters, setDataTablePageSize, setDataTablePagination, setDataTableSort, toggleSort } from './state.js';
9
+ export type { UiLanguage, UiMessages } from '../i18n.js';
10
+ export type { CheckboxFilterDefinition, CheckboxFilterControl, DataTableColumn, DataTableCellValue, DataTableClassValue, DataTableLayout, DateRangeFilterDefinition, DateRangeFilterControl, DateRangeFilterValue, DateRangePreset, DataTableRowAttributes, DataTableRowKey, DataTableSortChangeHandler, DataTableState, DataTableStateChangeHandler, DropdownSearchFilterDefinition, DropdownSearchFilterControl, FilterDefinition, FilterButtonControl, FilterContainerControl, FilterControl, FilterLinkControl, FilterOption, FilterSelectControl, FilterState, FilterTableRow, FilterValue, NumberRangeFilterDefinition, NumberRangeFilterControl, NumberRangeFilterValue, PaginationState, PaginationChangeHandler, PaginationDropdownPlacement, RadioFilterDefinition, RadioFilterControl, SortDirection, SortState } from './types.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/data-table/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC3E,OAAO,EACL,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACzD,YAAY,EACV,wBAAwB,EACxB,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,yBAAyB,EACzB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,0BAA0B,EAC1B,cAAc,EACd,2BAA2B,EAC3B,8BAA8B,EAC9B,2BAA2B,EAC3B,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,WAAW,EACX,2BAA2B,EAC3B,wBAAwB,EACxB,sBAAsB,EACtB,eAAe,EACf,uBAAuB,EACvB,2BAA2B,EAC3B,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,SAAS,EACV,MAAM,YAAY,CAAC"}