@1money/component-ui 0.0.67-alpha.1 → 0.0.67-alpha.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 (85) hide show
  1. package/es/business/Filter/Account/Account.d.ts +2 -0
  2. package/es/business/Filter/Account/Account.js +285 -0
  3. package/es/business/Filter/Account/index.d.ts +2 -0
  4. package/es/business/Filter/Account/index.js +3 -0
  5. package/es/business/Filter/Account/interface.d.ts +83 -0
  6. package/es/business/Filter/Account/interface.js +2 -0
  7. package/es/business/Filter/Account/style/Account.css +84 -0
  8. package/es/business/Filter/Account/style/css.js +2 -0
  9. package/es/business/Filter/Account/style/index.d.ts +1 -0
  10. package/es/business/Filter/Account/style/index.js +2 -0
  11. package/es/business/Filter/Asset/Asset.d.ts +2 -0
  12. package/es/business/Filter/Asset/Asset.js +302 -0
  13. package/es/business/Filter/Asset/index.d.ts +2 -0
  14. package/es/business/Filter/Asset/index.js +3 -0
  15. package/es/business/Filter/Asset/interface.d.ts +90 -0
  16. package/es/business/Filter/Asset/interface.js +2 -0
  17. package/es/business/Filter/{Dropdown/style/Dropdown.css → Asset/style/Asset.css} +20 -18
  18. package/es/business/Filter/Asset/style/css.js +2 -0
  19. package/es/business/Filter/Asset/style/index.d.ts +1 -0
  20. package/es/business/Filter/Asset/style/index.js +2 -0
  21. package/es/business/Filter/Option/Option.d.ts +2 -0
  22. package/es/business/Filter/Option/Option.js +260 -0
  23. package/es/business/Filter/Option/index.d.ts +2 -0
  24. package/es/business/Filter/Option/index.js +3 -0
  25. package/es/business/Filter/Option/interface.d.ts +81 -0
  26. package/es/business/Filter/Option/interface.js +2 -0
  27. package/es/business/Filter/Option/style/Option.css +72 -0
  28. package/es/business/Filter/Option/style/css.js +2 -0
  29. package/es/business/Filter/Option/style/index.d.ts +1 -0
  30. package/es/business/Filter/Option/style/index.js +2 -0
  31. package/es/business/Filter/index.d.ts +3 -1
  32. package/es/business/Filter/index.js +4 -2
  33. package/es/index.css +1 -1
  34. package/lib/business/Filter/Account/Account.d.ts +2 -0
  35. package/lib/business/Filter/Account/Account.js +292 -0
  36. package/lib/business/Filter/Account/index.d.ts +2 -0
  37. package/lib/business/Filter/Account/index.js +28 -0
  38. package/lib/business/Filter/Account/interface.d.ts +83 -0
  39. package/lib/business/Filter/Account/interface.js +6 -0
  40. package/lib/business/Filter/Account/style/Account.css +84 -0
  41. package/lib/business/Filter/Account/style/css.js +4 -0
  42. package/lib/business/Filter/Account/style/index.d.ts +1 -0
  43. package/lib/business/Filter/Account/style/index.js +4 -0
  44. package/lib/business/Filter/Asset/Asset.d.ts +2 -0
  45. package/lib/business/Filter/Asset/Asset.js +309 -0
  46. package/lib/business/Filter/Asset/index.d.ts +2 -0
  47. package/lib/business/Filter/Asset/index.js +28 -0
  48. package/lib/business/Filter/Asset/interface.d.ts +90 -0
  49. package/lib/business/Filter/Asset/interface.js +6 -0
  50. package/lib/business/Filter/{Dropdown/style/Dropdown.css → Asset/style/Asset.css} +20 -18
  51. package/lib/business/Filter/Asset/style/css.js +4 -0
  52. package/lib/business/Filter/Asset/style/index.d.ts +1 -0
  53. package/lib/business/Filter/Asset/style/index.js +4 -0
  54. package/lib/business/Filter/Option/Option.d.ts +2 -0
  55. package/lib/business/Filter/Option/Option.js +267 -0
  56. package/lib/business/Filter/Option/index.d.ts +2 -0
  57. package/lib/business/Filter/Option/index.js +28 -0
  58. package/lib/business/Filter/Option/interface.d.ts +81 -0
  59. package/lib/business/Filter/Option/interface.js +6 -0
  60. package/lib/business/Filter/Option/style/Option.css +72 -0
  61. package/lib/business/Filter/Option/style/css.js +4 -0
  62. package/lib/business/Filter/Option/style/index.d.ts +1 -0
  63. package/lib/business/Filter/Option/style/index.js +4 -0
  64. package/lib/business/Filter/index.d.ts +3 -1
  65. package/lib/business/Filter/index.js +27 -5
  66. package/lib/index.css +1 -1
  67. package/package.json +15 -5
  68. package/es/business/Filter/Dropdown/Dropdown.d.ts +0 -2
  69. package/es/business/Filter/Dropdown/Dropdown.js +0 -340
  70. package/es/business/Filter/Dropdown/index.d.ts +0 -2
  71. package/es/business/Filter/Dropdown/index.js +0 -3
  72. package/es/business/Filter/Dropdown/interface.d.ts +0 -136
  73. package/es/business/Filter/Dropdown/interface.js +0 -2
  74. package/es/business/Filter/Dropdown/style/css.js +0 -2
  75. package/es/business/Filter/Dropdown/style/index.d.ts +0 -1
  76. package/es/business/Filter/Dropdown/style/index.js +0 -2
  77. package/lib/business/Filter/Dropdown/Dropdown.d.ts +0 -2
  78. package/lib/business/Filter/Dropdown/Dropdown.js +0 -347
  79. package/lib/business/Filter/Dropdown/index.d.ts +0 -2
  80. package/lib/business/Filter/Dropdown/index.js +0 -28
  81. package/lib/business/Filter/Dropdown/interface.d.ts +0 -136
  82. package/lib/business/Filter/Dropdown/interface.js +0 -6
  83. package/lib/business/Filter/Dropdown/style/css.js +0 -4
  84. package/lib/business/Filter/Dropdown/style/index.d.ts +0 -1
  85. package/lib/business/Filter/Dropdown/style/index.js +0 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1money/component-ui",
3
- "version": "0.0.67-alpha.1",
3
+ "version": "0.0.67-alpha.2",
4
4
  "description": "React Components based on primereact for 1money front-end projects",
5
5
  "main": "lib/index.js",
6
6
  "module": "es/index.js",
@@ -275,15 +275,25 @@
275
275
  "import": "./es/business/Filter/index.js",
276
276
  "require": "./lib/business/Filter/index.js"
277
277
  },
278
+ "./business/Filter/Account": {
279
+ "types": "./es/business/Filter/Account/index.d.ts",
280
+ "import": "./es/business/Filter/Account/index.js",
281
+ "require": "./lib/business/Filter/Account/index.js"
282
+ },
283
+ "./business/Filter/Asset": {
284
+ "types": "./es/business/Filter/Asset/index.d.ts",
285
+ "import": "./es/business/Filter/Asset/index.js",
286
+ "require": "./lib/business/Filter/Asset/index.js"
287
+ },
278
288
  "./business/Filter/DateRange": {
279
289
  "types": "./es/business/Filter/DateRange/index.d.ts",
280
290
  "import": "./es/business/Filter/DateRange/index.js",
281
291
  "require": "./lib/business/Filter/DateRange/index.js"
282
292
  },
283
- "./business/Filter/Dropdown": {
284
- "types": "./es/business/Filter/Dropdown/index.d.ts",
285
- "import": "./es/business/Filter/Dropdown/index.js",
286
- "require": "./lib/business/Filter/Dropdown/index.js"
293
+ "./business/Filter/Option": {
294
+ "types": "./es/business/Filter/Option/index.d.ts",
295
+ "import": "./es/business/Filter/Option/index.js",
296
+ "require": "./lib/business/Filter/Option/index.js"
287
297
  },
288
298
  "./business/Select": {
289
299
  "types": "./es/business/Select/index.d.ts",
@@ -1,2 +0,0 @@
1
- import type { DropdownFilterProps } from './interface';
2
- export declare const DropdownFilter: import("react").NamedExoticComponent<DropdownFilterProps>;
@@ -1,340 +0,0 @@
1
- import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
2
- var __rest = this && this.__rest || function (s, e) {
3
- var t = {};
4
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
5
- if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
6
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
7
- }
8
- return t;
9
- };
10
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
- import { memo, useCallback, useImperativeHandle, useMemo, useState } from 'react';
12
- import { Button } from '../../../components/Button';
13
- import { Checkbox } from '../../../components/Checkbox';
14
- import { Empty } from '../../../components/Empty';
15
- import { Flex } from '../../../components/Flex';
16
- import { Select } from '../../../components/Select';
17
- import { Tag } from '../../../components/Tag';
18
- import { TypographyBody, TypographyLabel } from '../../../components/Typography';
19
- import { joinCls } from '../../../utils/classnames';
20
- var WRAP_CLS = 'om-dropdown-filter';
21
- // The panel is portaled to <body>, so panel-scoped overrides are keyed off this
22
- // class (passed as `panelClassName`) rather than the trigger root.
23
- var PANEL_CLS = "".concat(WRAP_CLS, "-panel");
24
- var GROUP_LABEL_CLS = "".concat(WRAP_CLS, "__group-label");
25
- var ICON_CLS = "".concat(WRAP_CLS, "-icon");
26
- var ICON_SIZE = 24;
27
- var RESET_LABEL = 'Reset';
28
- var APPLY_LABEL = 'Apply';
29
- var DEFAULT_PLACEHOLDER = 'Select';
30
- var DEFAULT_SEARCH_PLACEHOLDER = 'Search';
31
- var DEFAULT_SEARCH_KEYS = ['label', 'description'];
32
- var DEFAULT_EMPTY = _jsx(Empty, {
33
- icon: 'search',
34
- title: 'No results'
35
- });
36
- var MORE_SUFFIX = function MORE_SUFFIX(count) {
37
- return " + ".concat(count, " more");
38
- };
39
- var FULL_WIDTH_STYLE = {
40
- flex: 1
41
- };
42
- var toOption = function toOption(raw) {
43
- return {
44
- label: raw.label,
45
- value: raw.value,
46
- description: raw.description,
47
- iconUrl: raw.iconUrl,
48
- tag: raw.tag,
49
- // Restrict matching to the configured keys via `searchText`; see makeFilter.
50
- searchText: [raw.label, raw.description].filter(Boolean).join(' ')
51
- };
52
- };
53
- // Bucket consecutive options by `group`, preserving input order. Ungrouped runs
54
- // stay flat (no heading); grouped runs become a SelectOptionGroup with a label.
55
- var toGroupedData = function toGroupedData(options) {
56
- var data = [];
57
- var bucket = null;
58
- var flush = function flush() {
59
- if (!bucket) return;
60
- if (bucket.group) {
61
- data.push({
62
- key: bucket.group,
63
- label: bucket.group,
64
- options: bucket.options
65
- });
66
- } else {
67
- bucket.options.forEach(function (option) {
68
- return data.push(option);
69
- });
70
- }
71
- bucket = null;
72
- };
73
- options.forEach(function (raw) {
74
- var group = raw.group;
75
- if (!bucket || bucket.group !== group) {
76
- flush();
77
- bucket = {
78
- group: group,
79
- options: []
80
- };
81
- }
82
- bucket.options.push(toOption(raw));
83
- });
84
- flush();
85
- return data;
86
- };
87
- var getInitialValue = function getInitialValue(options, allLabel, defaultSelectAll) {
88
- // With an "All" row, "all selected" is represented by an empty array.
89
- if (allLabel && defaultSelectAll) return [];
90
- return options.filter(function (option) {
91
- return option.defaultValue;
92
- }).map(function (option) {
93
- return option.value;
94
- });
95
- };
96
- var DropdownFilterBase = function DropdownFilterBase(_a) {
97
- var ref = _a.ref,
98
- className = _a.className,
99
- _a$size = _a.size,
100
- size = _a$size === void 0 ? 'small' : _a$size,
101
- label = _a.label,
102
- _a$placeholder = _a.placeholder,
103
- placeholder = _a$placeholder === void 0 ? DEFAULT_PLACEHOLDER : _a$placeholder,
104
- options = _a.options,
105
- allLabel = _a.allLabel,
106
- _a$defaultSelectAll = _a.defaultSelectAll,
107
- defaultSelectAll = _a$defaultSelectAll === void 0 ? false : _a$defaultSelectAll,
108
- _a$search = _a.search,
109
- search = _a$search === void 0 ? false : _a$search,
110
- _a$searchPlaceholder = _a.searchPlaceholder,
111
- searchPlaceholder = _a$searchPlaceholder === void 0 ? DEFAULT_SEARCH_PLACEHOLDER : _a$searchPlaceholder,
112
- _a$searchKeys = _a.searchKeys,
113
- searchKeys = _a$searchKeys === void 0 ? DEFAULT_SEARCH_KEYS : _a$searchKeys,
114
- _a$searchEmpty = _a.searchEmpty,
115
- searchEmpty = _a$searchEmpty === void 0 ? DEFAULT_EMPTY : _a$searchEmpty,
116
- onApply = _a.onApply,
117
- onReset = _a.onReset,
118
- rest = __rest(_a, ["ref", "className", "size", "label", "placeholder", "options", "allLabel", "defaultSelectAll", "search", "searchPlaceholder", "searchKeys", "searchEmpty", "onApply", "onReset"]);
119
- var initialValue = useMemo(function () {
120
- return getInitialValue(options, allLabel, defaultSelectAll);
121
- }, [options, allLabel, defaultSelectAll]);
122
- var _useState = useState(false),
123
- _useState2 = _slicedToArray(_useState, 2),
124
- open = _useState2[0],
125
- setOpen = _useState2[1];
126
- var _useState3 = useState(''),
127
- _useState4 = _slicedToArray(_useState3, 2),
128
- keyword = _useState4[0],
129
- setKeyword = _useState4[1];
130
- // `temp` is the in-panel draft; `committed` is the last Applied selection.
131
- // Only Apply promotes `temp` → `committed` and notifies the parent.
132
- var _useState5 = useState(initialValue),
133
- _useState6 = _slicedToArray(_useState5, 2),
134
- temp = _useState6[0],
135
- setTemp = _useState6[1];
136
- var _useState7 = useState(initialValue),
137
- _useState8 = _slicedToArray(_useState7, 2),
138
- committed = _useState8[0],
139
- setCommitted = _useState8[1];
140
- var groupedData = useMemo(function () {
141
- return toGroupedData(options);
142
- }, [options]);
143
- var allValues = useMemo(function () {
144
- return options.map(function (option) {
145
- return option.value;
146
- });
147
- }, [options]);
148
- var optionByValue = useMemo(function () {
149
- var map = new Map();
150
- options.forEach(function (option) {
151
- return map.set(option.value, option);
152
- });
153
- return map;
154
- }, [options]);
155
- // The "All" row is checked exactly when nothing specific is selected.
156
- var allChecked = temp.length === 0;
157
- var filterOption = useCallback(function (searchValue, option) {
158
- var term = searchValue.trim().toLowerCase();
159
- if (!term) return true;
160
- var mapped = option;
161
- return searchKeys.some(function (key) {
162
- var field = key === 'label' ? mapped.label : mapped.description;
163
- return typeof field === 'string' && field.toLowerCase().includes(term);
164
- });
165
- }, [searchKeys]);
166
- useImperativeHandle(ref, function () {
167
- return {
168
- clear: function clear() {
169
- setTemp([]);
170
- setCommitted([]);
171
- },
172
- reset: function reset() {
173
- setTemp(initialValue);
174
- setCommitted(initialValue);
175
- onReset === null || onReset === void 0 ? void 0 : onReset(initialValue);
176
- }
177
- };
178
- }, [initialValue, onReset]);
179
- var handleSelectChange = useCallback(function (next) {
180
- var nextValues = (Array.isArray(next) ? next : []).map(String);
181
- // With an "All" row, selecting every concrete option collapses to "all"
182
- // ([]), matching the backend convention that empty == no filter. Without
183
- // an "All" row (e.g. recipients), a full selection stays explicit so the
184
- // trigger still summarizes it ("Name + N more").
185
- var collapse = !!allLabel && nextValues.length === allValues.length;
186
- setTemp(collapse ? [] : nextValues);
187
- }, [allLabel, allValues]);
188
- var handleAllClick = useCallback(function () {
189
- // The "All" row is exclusive: turning it on clears specific picks.
190
- setTemp([]);
191
- }, []);
192
- var handleApply = useCallback(function () {
193
- setCommitted(temp);
194
- onApply(temp);
195
- setOpen(false);
196
- }, [temp, onApply]);
197
- var handleReset = useCallback(function () {
198
- setTemp(initialValue);
199
- setCommitted(initialValue);
200
- onReset === null || onReset === void 0 ? void 0 : onReset(initialValue);
201
- }, [initialValue, onReset]);
202
- var handleOpenChange = useCallback(function (nextOpen) {
203
- setOpen(nextOpen);
204
- if (nextOpen) return;
205
- // Closing without Apply discards the draft.
206
- setTemp(committed);
207
- if (search) setKeyword('');
208
- }, [committed, search]);
209
- var renderRow = useCallback(function (option, checked) {
210
- var text = typeof option.label === 'string' ? option.label : '';
211
- return _jsxs(Flex, {
212
- align: 'center',
213
- justify: 'space-between',
214
- gap: 8,
215
- className: "".concat(WRAP_CLS, "__row"),
216
- children: [_jsxs(Flex, {
217
- align: 'center',
218
- gap: 8,
219
- className: "".concat(WRAP_CLS, "__row-main"),
220
- children: [option.iconUrl && _jsx("img", {
221
- src: option.iconUrl,
222
- alt: text,
223
- width: ICON_SIZE,
224
- height: ICON_SIZE,
225
- className: ICON_CLS
226
- }), _jsxs(Flex, {
227
- vertical: true,
228
- gap: 0,
229
- align: 'start',
230
- className: "".concat(WRAP_CLS, "__row-text"),
231
- children: [_jsxs(Flex, {
232
- align: 'center',
233
- gap: 8,
234
- className: "".concat(WRAP_CLS, "__row-label"),
235
- children: [_jsx(TypographyLabel, {
236
- size: 'md',
237
- children: option.label
238
- }), option.tag && _jsx(Tag, {
239
- label: option.tag,
240
- size: 'small',
241
- color: 'recommended'
242
- })]
243
- }), option.description && _jsx(TypographyBody, {
244
- size: 'sm',
245
- color: 'default-tertiary',
246
- children: option.description
247
- })]
248
- })]
249
- }), _jsx(Checkbox, {
250
- checked: checked,
251
- readOnly: true,
252
- className: "".concat(WRAP_CLS, "__row-check")
253
- })]
254
- });
255
- }, []);
256
- // The trigger reflects the COMMITTED selection (not the in-panel draft).
257
- // `renderValue` short-circuits Select's own placeholder handling, so the
258
- // empty state must return the placeholder explicitly.
259
- var renderValue = useCallback(function () {
260
- if (allChecked) {
261
- var text = allLabel !== null && allLabel !== void 0 ? allLabel : placeholder;
262
- return _jsx(TypographyBody, {
263
- size: 'md',
264
- color: allLabel ? 'default' : 'default-tertiary',
265
- className: "".concat(WRAP_CLS, "__value"),
266
- children: text
267
- });
268
- }
269
- var first = optionByValue.get(committed[0]);
270
- var firstLabel = first ? first.label : committed[0];
271
- var extra = committed.length - 1;
272
- return _jsxs(TypographyBody, {
273
- size: 'md',
274
- className: "".concat(WRAP_CLS, "__value"),
275
- children: [firstLabel, extra > 0 && _jsx("span", {
276
- className: "".concat(WRAP_CLS, "__value-more"),
277
- children: MORE_SUFFIX(extra)
278
- })]
279
- });
280
- }, [allChecked, allLabel, placeholder, committed, optionByValue]);
281
- return _jsx(Select, Object.assign({}, rest, {
282
- multiple: true,
283
- size: size,
284
- label: label,
285
- placeholder: placeholder,
286
- className: joinCls(WRAP_CLS, className),
287
- panelClassName: PANEL_CLS,
288
- groupLabelClassName: GROUP_LABEL_CLS,
289
- value: temp,
290
- open: open,
291
- onOpenChange: handleOpenChange,
292
- onChange: handleSelectChange,
293
- searchable: search,
294
- searchPlaceholder: searchPlaceholder,
295
- searchValue: keyword,
296
- onSearchChange: setKeyword,
297
- filterOption: filterOption,
298
- options: groupedData,
299
- panelHeader: allLabel ? _jsxs("button", {
300
- type: 'button',
301
- className: joinCls("".concat(WRAP_CLS, "__all"), allChecked && "".concat(WRAP_CLS, "__all--checked")),
302
- onClick: handleAllClick,
303
- children: [_jsx(TypographyLabel, {
304
- size: 'md',
305
- children: allLabel
306
- }), _jsx(Checkbox, {
307
- checked: allChecked,
308
- readOnly: true,
309
- className: "".concat(WRAP_CLS, "__row-check")
310
- })]
311
- }) : undefined,
312
- emptyContent: searchEmpty,
313
- renderValue: renderValue,
314
- renderOption: function renderOption(option, meta) {
315
- return renderRow(option, meta.selected);
316
- },
317
- panelFooter: _jsxs(Flex, {
318
- gap: 8,
319
- className: "".concat(WRAP_CLS, "__footer"),
320
- children: [_jsx(Button, {
321
- color: 'grey',
322
- size: 'small',
323
- style: FULL_WIDTH_STYLE,
324
- onClick: handleReset,
325
- children: RESET_LABEL
326
- }), _jsx(Button, {
327
- color: 'primary',
328
- size: 'small',
329
- style: FULL_WIDTH_STYLE,
330
- // With an "All" row, an empty draft means "all" (valid). Without
331
- // one, an empty draft means "nothing picked" — block Apply.
332
- disabled: !allLabel && temp.length === 0,
333
- onClick: handleApply,
334
- children: APPLY_LABEL
335
- })]
336
- })
337
- }));
338
- };
339
- export var DropdownFilter = /*#__PURE__*/memo(DropdownFilterBase);
340
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJ1c2luZXNzL0ZpbHRlci9Ecm9wZG93bi9Ecm9wZG93bi5qcyIsImJ1c2luZXNzL0ZpbHRlci9zcmMvYnVzaW5lc3MvRmlsdGVyL0Ryb3Bkb3duL0Ryb3Bkb3duLnRzeCJdLCJuYW1lcyI6WyJfX3Jlc3QiLCJzIiwiZSIsInQiLCJwIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaW5kZXhPZiIsImdldE93blByb3BlcnR5U3ltYm9scyIsImkiLCJsZW5ndGgiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsImpzeCIsIl9qc3giLCJqc3hzIiwiX2pzeHMiLCJtZW1vIiwidXNlQ2FsbGJhY2siLCJ1c2VJbXBlcmF0aXZlSGFuZGxlIiwidXNlTWVtbyIsInVzZVN0YXRlIiwiQnV0dG9uIiwiQ2hlY2tib3giLCJFbXB0eSIsIkZsZXgiLCJTZWxlY3QiLCJUYWciLCJUeXBvZ3JhcGh5Qm9keSIsIlR5cG9ncmFwaHlMYWJlbCIsImpvaW5DbHMiLCJXUkFQX0NMUyIsIlBBTkVMX0NMUyIsImNvbmNhdCIsIkdST1VQX0xBQkVMX0NMUyIsIklDT05fQ0xTIiwiSUNPTl9TSVpFIiwiUkVTRVRfTEFCRUwiLCJBUFBMWV9MQUJFTCIsIkRFRkFVTFRfUExBQ0VIT0xERVIiLCJERUZBVUxUX1NFQVJDSF9QTEFDRUhPTERFUiIsIkRFRkFVTFRfU0VBUkNIX0tFWVMiLCJERUZBVUxUX0VNUFRZIiwiaWNvbiIsInRpdGxlIiwiTU9SRV9TVUZGSVgiLCJjb3VudCIsIkZVTExfV0lEVEhfU1RZTEUiLCJmbGV4IiwidG9PcHRpb24iLCJyYXciLCJsYWJlbCIsInZhbHVlIiwiZGVzY3JpcHRpb24iLCJpY29uVXJsIiwidGFnIiwic2VhcmNoVGV4dCIsImZpbHRlciIsIkJvb2xlYW4iLCJqb2luIiwidG9Hcm91cGVkRGF0YSIsIm9wdGlvbnMiLCJkYXRhIiwiYnVja2V0IiwiZmx1c2giLCJncm91cCIsInB1c2giLCJrZXkiLCJmb3JFYWNoIiwib3B0aW9uIiwiZ2V0SW5pdGlhbFZhbHVlIiwiYWxsTGFiZWwiLCJkZWZhdWx0U2VsZWN0QWxsIiwiZGVmYXVsdFZhbHVlIiwibWFwIiwiRHJvcGRvd25GaWx0ZXJCYXNlIiwiX2EiLCJyZWYiLCJjbGFzc05hbWUiLCJfYSRzaXplIiwic2l6ZSIsIl9hJHBsYWNlaG9sZGVyIiwicGxhY2Vob2xkZXIiLCJfYSRkZWZhdWx0U2VsZWN0QWxsIiwiX2Ekc2VhcmNoIiwic2VhcmNoIiwiX2Ekc2VhcmNoUGxhY2Vob2xkZXIiLCJzZWFyY2hQbGFjZWhvbGRlciIsIl9hJHNlYXJjaEtleXMiLCJzZWFyY2hLZXlzIiwiX2Ekc2VhcmNoRW1wdHkiLCJzZWFyY2hFbXB0eSIsIm9uQXBwbHkiLCJvblJlc2V0IiwicmVzdCIsImluaXRpYWxWYWx1ZSIsIl91c2VTdGF0ZSIsIl91c2VTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheSIsIm9wZW4iLCJzZXRPcGVuIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJrZXl3b3JkIiwic2V0S2V5d29yZCIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2IiwidGVtcCIsInNldFRlbXAiLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsImNvbW1pdHRlZCIsInNldENvbW1pdHRlZCIsImdyb3VwZWREYXRhIiwiYWxsVmFsdWVzIiwib3B0aW9uQnlWYWx1ZSIsIk1hcCIsInNldCIsImFsbENoZWNrZWQiLCJmaWx0ZXJPcHRpb24iLCJzZWFyY2hWYWx1ZSIsInRlcm0iLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJtYXBwZWQiLCJzb21lIiwiZmllbGQiLCJpbmNsdWRlcyIsImNsZWFyIiwicmVzZXQiLCJoYW5kbGVTZWxlY3RDaGFuZ2UiLCJuZXh0IiwibmV4dFZhbHVlcyIsIkFycmF5IiwiaXNBcnJheSIsIlN0cmluZyIsImNvbGxhcHNlIiwiaGFuZGxlQWxsQ2xpY2siLCJoYW5kbGVBcHBseSIsImhhbmRsZVJlc2V0IiwiaGFuZGxlT3BlbkNoYW5nZSIsIm5leHRPcGVuIiwicmVuZGVyUm93IiwiY2hlY2tlZCIsInRleHQiLCJhbGlnbiIsImp1c3RpZnkiLCJnYXAiLCJjaGlsZHJlbiIsInNyYyIsImFsdCIsIndpZHRoIiwiaGVpZ2h0IiwidmVydGljYWwiLCJjb2xvciIsInJlYWRPbmx5IiwicmVuZGVyVmFsdWUiLCJmaXJzdCIsImdldCIsImZpcnN0TGFiZWwiLCJleHRyYSIsImFzc2lnbiIsIm11bHRpcGxlIiwicGFuZWxDbGFzc05hbWUiLCJncm91cExhYmVsQ2xhc3NOYW1lIiwib25PcGVuQ2hhbmdlIiwib25DaGFuZ2UiLCJzZWFyY2hhYmxlIiwib25TZWFyY2hDaGFuZ2UiLCJwYW5lbEhlYWRlciIsInR5cGUiLCJvbkNsaWNrIiwidW5kZWZpbmVkIiwiZW1wdHlDb250ZW50IiwicmVuZGVyT3B0aW9uIiwibWV0YSIsInNlbGVjdGVkIiwicGFuZWxGb290ZXIiLCJzdHlsZSIsImRpc2FibGVkIiwiRHJvcGRvd25GaWx0ZXIiXSwibWFwcGluZ3MiOiI7QUFBQSxJQUFJQSxNQUFNLEdBQUksSUFBSSxJQUFJLElBQUksQ0FBQ0EsTUFBTSxJQUFLLFVBQVVDLENBQUMsRUFBRUMsQ0FBQyxFQUFFO0VBQ2xELElBQUlDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDVixLQUFLLElBQUlDLENBQUMsSUFBSUgsQ0FBQyxFQUFFLElBQUlJLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDQyxjQUFjLENBQUNDLElBQUksQ0FBQ1AsQ0FBQyxFQUFFRyxDQUFDLENBQUMsSUFBSUYsQ0FBQyxDQUFDTyxPQUFPLENBQUNMLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFDL0VELENBQUMsQ0FBQ0MsQ0FBQyxDQUFDLEdBQUdILENBQUMsQ0FBQ0csQ0FBQyxDQUFDO0VBQ2YsSUFBSUgsQ0FBQyxJQUFJLElBQUksSUFBSSxPQUFPSSxNQUFNLENBQUNLLHFCQUFxQixLQUFLLFVBQVUsRUFDL0QsS0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBQyxFQUFFUCxDQUFDLEdBQUdDLE1BQU0sQ0FBQ0sscUJBQXFCLENBQUNULENBQUMsQ0FBQyxF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Q3RJLElBQUEsQ0FBQ1EsTUFBTSxFQUFBO1FBQUNvSSxLQUFLLEVBQUMsTUFBTTtRQUFDMUUsSUFBSSxFQUFDLE9BQU87UUFBQ2tHLEtBQUssRUFBRW5JLGdCQUFnQjtRQUFFNEgsT0FBTyxFQUFFaEMsV0FBVztRQUFBUyxRQUFBLEVBQzVFL0c7TUFBVyxDQUFBLENBQ0wsRUFDVHZCLElBQUEsQ0FBQ1EsTUFBTSxFQUFBO1FBQ0xvSSxLQUFLLEVBQUMsU0FBUztRQUNmMUUsSUFBSSxFQUFDLE9BQU87UUFDWmtHLEtBQUssRUFBRW5JLGdCQUFnQjtRQUN2QjtRQUNBO1FBQ0FvSSxRQUFRLEVBQUUsQ0FBQzVHLFFBQVEsSUFBSW9DLElBQUksQ0FBQ2hHLE1BQU0sS0FBSyxDQUFDO1FBQ3hDZ0ssT0FBTyxFQUFFakMsV0FBVztRQUFBVSxRQUFBLEVBRW5COUc7TUFBVyxDQUFBLENBQ0w7SUFBQSxDQUFBO0VBQ0osQ0FBQSxDQUFBLENBRVQ7QUFFTixDQUFDO0FBRUQsT0FBTyxJQUFNOEksY0FBYyxnQkFBR25LLElBQUksQ0FBQzBELGtCQUFrQixDQUFDIiwiZmlsZSI6ImJ1c2luZXNzL0ZpbHRlci9Ecm9wZG93bi9Ecm9wZG93bi5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBfX3Jlc3QgPSAodGhpcyAmJiB0aGlzLl9fcmVzdCkgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgICB2YXIgdCA9IHt9O1xuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgICB0W3BdID0gc1twXTtcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcbiAgICAgICAgfVxuICAgIHJldHVybiB0O1xufTtcbmltcG9ydCB7IGpzeCBhcyBfanN4LCBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBtZW1vLCB1c2VDYWxsYmFjaywgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL0J1dHRvbic7XG5pbXBvcnQgeyBDaGVja2JveCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvQ2hlY2tib3gnO1xuaW1wb3J0IHsgRW1wdHkgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL0VtcHR5JztcbmltcG9ydCB7IEZsZXggfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL0ZsZXgnO1xuaW1wb3J0IHsgU2VsZWN0IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9TZWxlY3QnO1xuaW1wb3J0IHsgVGFnIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9UYWcnO1xuaW1wb3J0IHsgVHlwb2dyYXBoeUJvZHksIFR5cG9ncmFwaHlMYWJlbCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvVHlwb2dyYXBoeSc7XG5pbXBvcnQgeyBqb2luQ2xzIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvY2xhc3NuYW1lcyc7XG5jb25zdCBXUkFQX0NMUyA9ICdvbS1kcm9wZG93bi1maWx0ZXInO1xuLy8gVGhlIHBhbmVsIGlzIHBvcnRhbGVkIHRvIDxib2R5Piwgc28gcGFuZWwtc2NvcGVkIG92ZXJyaWRlcyBhcmUga2V5ZWQgb2ZmIHRoaXNcbi8vIGNsYXNzIChwYXNzZWQgYXMgYHBhbmVsQ2xhc3NOYW1lYCkgcmF0aGVyIHRoYW4gdGhlIHRyaWdnZXIgcm9vdC5cbmNvbnN0IFBBTkVMX0NMUyA9IGAke1dSQVBfQ0xTfS1wYW5lbGA7XG5jb25zdCBHUk9VUF9MQUJFTF9DTFMgPSBgJHtXUkFQX0NMU31fX2dyb3VwLWxhYmVsYDtcbmNvbnN0IElDT05fQ0xTID0gYCR7V1JBUF9DTFN9LWljb25gO1xuY29uc3QgSUNPTl9TSVpFID0gMjQ7XG5jb25zdCBSRVNFVF9MQUJFTCA9ICdSZXNldCc7XG5jb25zdCBBUFBMWV9MQUJFTCA9ICdBcHBseSc7XG5jb25zdCBERUZBVUxUX1BMQUNFSE9MREVSID0gJ1NlbGVjdCc7XG5jb25zdCBERUZBVUxUX1NFQVJDSF9QTEFDRUhPTERFUiA9ICdTZWFyY2gnO1xuY29uc3QgREVGQVVMVF9TRUFSQ0hfS0VZUyA9IFsnbGFiZWwnLCAnZGVzY3JpcHRpb24nXTtcbmNvbnN0IERFRkFVTFRfRU1QVFkgPSBfanN4KEVtcHR5LCB7IGljb246ICdzZWFyY2gnLCB0aXRsZTogJ05vIHJlc3VsdHMnIH0pO1xuY29uc3QgTU9SRV9TVUZGSVggPSAoY291bnQpID0+IGAgKyAke2NvdW50fSBtb3JlYDtcbmNvbnN0IEZVTExfV0lEVEhfU1RZTEUgPSB7IGZsZXg6IDEgfTtcbmNvbnN0IHRvT3B0aW9uID0gKHJhdykgPT4gKHtcbiAgICBsYWJlbDogcmF3LmxhYmVsLFxuICAgIHZhbHVlOiByYXcudmFsdWUsXG4gICAgZGVzY3JpcHRpb246IHJhdy5kZXNjcmlwdGlvbixcbiAgICBpY29uVXJsOiByYXcuaWNvblVybCxcbiAgICB0YWc6IHJhdy50YWcsXG4gICAgLy8gUmVzdHJpY3QgbWF0Y2hpbmcgdG8gdGhlIGNvbmZpZ3VyZWQga2V5cyB2aWEgYHNlYXJjaFRleHRgOyBzZWUgbWFrZUZpbHRlci5cbiAgICBzZWFyY2hUZXh0OiBbcmF3LmxhYmVsLCByYXcuZGVzY3JpcHRpb25dLmZpbHRlcihCb29sZWFuKS5qb2luKCcgJyksXG59KTtcbi8vIEJ1Y2tldCBjb25zZWN1dGl2ZSBvcHRpb25zIGJ5IGBncm91cGAsIHByZXNlcnZpbmcgaW5wdXQgb3JkZXIuIFVuZ3JvdXBlZCBydW5zXG4vLyBzdGF5IGZsYXQgKG5vIGhlYWRpbmcpOyBncm91cGVkIHJ1bnMgYmVjb21lIGEgU2VsZWN0T3B0aW9uR3JvdXAgd2l0aCBhIGxhYmVsLlxuY29uc3QgdG9Hcm91cGVkRGF0YSA9IChvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IFtdO1xuICAgIGxldCBidWNrZXQgPSBudWxsO1xuICAgIGNvbnN0IGZsdXNoID0gKCkgPT4ge1xuICAgICAgICBpZiAoIWJ1Y2tldClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKGJ1Y2tldC5ncm91cCkge1xuICAgICAgICAgICAgZGF0YS5wdXNoKHsga2V5OiBidWNrZXQuZ3JvdXAsIGxhYmVsOiBidWNrZXQuZ3JvdXAsIG9wdGlvbnM6IGJ1Y2tldC5vcHRpb25zIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYnVja2V0Lm9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiBkYXRhLnB1c2gob3B0aW9uKSk7XG4gICAgICAgIH1cbiAgICAgICAgYnVja2V0ID0gbnVsbDtcbiAgICB9O1xuICAgIG9wdGlvbnMuZm9yRWFjaCgocmF3KSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gcmF3Lmdyb3VwO1xuICAgICAgICBpZiAoIWJ1Y2tldCB8fCBidWNrZXQuZ3JvdXAgIT09IGdyb3VwKSB7XG4gICAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICAgICAgYnVja2V0ID0geyBncm91cCwgb3B0aW9uczogW10gfTtcbiAgICAgICAgfVxuICAgICAgICBidWNrZXQub3B0aW9ucy5wdXNoKHRvT3B0aW9uKHJhdykpO1xuICAgIH0pO1xuICAgIGZsdXNoKCk7XG4gICAgcmV0dXJuIGRhdGE7XG59O1xuY29uc3QgZ2V0SW5pdGlhbFZhbHVlID0gKG9wdGlvbnMsIGFsbExhYmVsLCBkZWZhdWx0U2VsZWN0QWxsKSA9PiB7XG4gICAgLy8gV2l0aCBhbiBcIkFsbFwiIHJvdywgXCJhbGwgc2VsZWN0ZWRcIiBpcyByZXByZXNlbnRlZCBieSBhbiBlbXB0eSBhcnJheS5cbiAgICBpZiAoYWxsTGFiZWwgJiYgZGVmYXVsdFNlbGVjdEFsbClcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIHJldHVybiBvcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24uZGVmYXVsdFZhbHVlKS5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlKTtcbn07XG5jb25zdCBEcm9wZG93bkZpbHRlckJhc2UgPSAoX2EpID0+IHtcbiAgICB2YXIgeyByZWYsIGNsYXNzTmFtZSwgc2l6ZSA9ICdzbWFsbCcsIGxhYmVsLCBwbGFjZWhvbGRlciA9IERFRkFVTFRfUExBQ0VIT0xERVIsIG9wdGlvbnMsIGFsbExhYmVsLCBkZWZhdWx0U2VsZWN0QWxsID0gZmFsc2UsIHNlYXJjaCA9IGZhbHNlLCBzZWFyY2hQbGFjZWhvbGRlciA9IERFRkFVTFRfU0VBUkNIX1BMQUNFSE9MREVSLCBzZWFyY2hLZXlzID0gREVGQVVMVF9TRUFSQ0hfS0VZUywgc2VhcmNoRW1wdHkgPSBERUZBVUxUX0VNUFRZLCBvbkFwcGx5LCBvblJlc2V0IH0gPSBfYSwgcmVzdCA9IF9fcmVzdChfYSwgW1wicmVmXCIsIFwiY2xhc3NOYW1lXCIsIFwic2l6ZVwiLCBcImxhYmVsXCIsIFwicGxhY2Vob2xkZXJcIiwgXCJvcHRpb25zXCIsIFwiYWxsTGFiZWxcIiwgXCJkZWZhdWx0U2VsZWN0QWxsXCIsIFwic2VhcmNoXCIsIFwic2VhcmNoUGxhY2Vob2xkZXJcIiwgXCJzZWFyY2hLZXlzXCIsIFwic2VhcmNoRW1wdHlcIiwgXCJvbkFwcGx5XCIsIFwib25SZXNldFwiXSk7XG4gICAgY29uc3QgaW5pdGlhbFZhbHVlID0gdXNlTWVtbygoKSA9PiBnZXRJbml0aWFsVmFsdWUob3B0aW9ucywgYWxsTGFiZWwsIGRlZmF1bHRTZWxlY3RBbGwpLCBbb3B0aW9ucywgYWxsTGFiZWwsIGRlZmF1bHRTZWxlY3RBbGxdKTtcbiAgICBjb25zdCBbb3Blbiwgc2V0T3Blbl0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW2tleXdvcmQsIHNldEtleXdvcmRdID0gdXNlU3RhdGUoJycpO1xuICAgIC8vIGB0ZW1wYCBpcyB0aGUgaW4tcGFuZWwgZHJhZnQ7IGBjb21taXR0ZWRgIGlzIHRoZSBsYXN0IEFwcGxpZWQgc2VsZWN0aW9uLlxuICAgIC8vIE9ubHkgQXBwbHkgcHJvbW90ZXMgYHRlbXBgIOKGkiBgY29tbWl0dGVkYCBhbmQgbm90aWZpZXMgdGhlIHBhcmVudC5cbiAgICBjb25zdCBbdGVtcCwgc2V0VGVtcF0gPSB1c2VTdGF0ZShpbml0aWFsVmFsdWUpO1xuICAgIGNvbnN0IFtjb21taXR0ZWQsIHNldENvbW1pdHRlZF0gPSB1c2VTdGF0ZShpbml0aWFsVmFsdWUpO1xuICAgIGNvbnN0IGdyb3VwZWREYXRhID0gdXNlTWVtbygoKSA9PiB0b0dyb3VwZWREYXRhKG9wdGlvbnMpLCBbb3B0aW9uc10pO1xuICAgIGNvbnN0IGFsbFZhbHVlcyA9IHVzZU1lbW8oKCkgPT4gb3B0aW9ucy5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlKSwgW29wdGlvbnNdKTtcbiAgICBjb25zdCBvcHRpb25CeVZhbHVlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKChvcHRpb24pID0+IG1hcC5zZXQob3B0aW9uLnZhbHVlLCBvcHRpb24pKTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LCBbb3B0aW9uc10pO1xuICAgIC8vIFRoZSBcIkFsbFwiIHJvdyBpcyBjaGVja2VkIGV4YWN0bHkgd2hlbiBub3RoaW5nIHNwZWNpZmljIGlzIHNlbGVjdGVkLlxuICAgIGNvbnN0IGFsbENoZWNrZWQgPSB0ZW1wLmxlbmd0aCA9PT0gMDtcbiAgICBjb25zdCBmaWx0ZXJPcHRpb24gPSB1c2VDYWxsYmFjaygoc2VhcmNoVmFsdWUsIG9wdGlvbikgPT4ge1xuICAgICAgICBjb25zdCB0ZXJtID0gc2VhcmNoVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGVybSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjb25zdCBtYXBwZWQgPSBvcHRpb247XG4gICAgICAgIHJldHVybiBzZWFyY2hLZXlzLnNvbWUoKGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBrZXkgPT09ICdsYWJlbCcgPyBtYXBwZWQubGFiZWwgOiBtYXBwZWQuZGVzY3JpcHRpb247XG4gICAgICAgICAgICByZXR1cm4gdHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJyAmJiBmaWVsZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pO1xuICAgICAgICB9KTtcbiAgICB9LCBbc2VhcmNoS2V5c10pO1xuICAgIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiAoe1xuICAgICAgICBjbGVhcjogKCkgPT4ge1xuICAgICAgICAgICAgc2V0VGVtcChbXSk7XG4gICAgICAgICAgICBzZXRDb21taXR0ZWQoW10pO1xuICAgICAgICB9LFxuICAgICAgICByZXNldDogKCkgPT4ge1xuICAgICAgICAgICAgc2V0VGVtcChpbml0aWFsVmFsdWUpO1xuICAgICAgICAgICAgc2V0Q29tbWl0dGVkKGluaXRpYWxWYWx1ZSk7XG4gICAgICAgICAgICBvblJlc2V0ID09PSBudWxsIHx8IG9uUmVzZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uUmVzZXQoaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgfSxcbiAgICB9KSwgW2luaXRpYWxWYWx1ZSwgb25SZXNldF0pO1xuICAgIGNvbnN0IGhhbmRsZVNlbGVjdENoYW5nZSA9IHVzZUNhbGxiYWNrKChuZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHRWYWx1ZXMgPSAoQXJyYXkuaXNBcnJheShuZXh0KSA/IG5leHQgOiBbXSkubWFwKFN0cmluZyk7XG4gICAgICAgIC8vIFdpdGggYW4gXCJBbGxcIiByb3csIHNlbGVjdGluZyBldmVyeSBjb25jcmV0ZSBvcHRpb24gY29sbGFwc2VzIHRvIFwiYWxsXCJcbiAgICAgICAgLy8gKFtdKSwgbWF0Y2hpbmcgdGhlIGJhY2tlbmQgY29udmVudGlvbiB0aGF0IGVtcHR5ID09IG5vIGZpbHRlci4gV2l0aG91dFxuICAgICAgICAvLyBhbiBcIkFsbFwiIHJvdyAoZS5nLiByZWNpcGllbnRzKSwgYSBmdWxsIHNlbGVjdGlvbiBzdGF5cyBleHBsaWNpdCBzbyB0aGVcbiAgICAgICAgLy8gdHJpZ2dlciBzdGlsbCBzdW1tYXJpemVzIGl0IChcIk5hbWUgKyBOIG1vcmVcIikuXG4gICAgICAgIGNvbnN0IGNvbGxhcHNlID0gISFhbGxMYWJlbCAmJiBuZXh0VmFsdWVzLmxlbmd0aCA9PT0gYWxsVmFsdWVzLmxlbmd0aDtcbiAgICAgICAgc2V0VGVtcChjb2xsYXBzZSA/IFtdIDogbmV4dFZhbHVlcyk7XG4gICAgfSwgW2FsbExhYmVsLCBhbGxWYWx1ZXNdKTtcbiAgICBjb25zdCBoYW5kbGVBbGxDbGljayA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgLy8gVGhlIFwiQWxsXCIgcm93IGlzIGV4Y2x1c2l2ZTogdHVybmluZyBpdCBvbiBjbGVhcnMgc3BlY2lmaWMgcGlja3MuXG4gICAgICAgIHNldFRlbXAoW10pO1xuICAgIH0sIFtdKTtcbiAgICBjb25zdCBoYW5kbGVBcHBseSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgc2V0Q29tbWl0dGVkKHRlbXApO1xuICAgICAgICBvbkFwcGx5KHRlbXApO1xuICAgICAgICBzZXRPcGVuKGZhbHNlKTtcbiAgICB9LCBbdGVtcCwgb25BcHBseV0pO1xuICAgIGNvbnN0IGhhbmRsZVJlc2V0ID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICBzZXRUZW1wKGluaXRpYWxWYWx1ZSk7XG4gICAgICAgIHNldENvbW1pdHRlZChpbml0aWFsVmFsdWUpO1xuICAgICAgICBvblJlc2V0ID09PSBudWxsIHx8IG9uUmVzZXQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uUmVzZXQoaW5pdGlhbFZhbHVlKTtcbiAgICB9LCBbaW5pdGlhbFZhbHVlLCBvblJlc2V0XSk7XG4gICAgY29uc3QgaGFuZGxlT3BlbkNoYW5nZSA9IHVzZUNhbGxiYWNrKChuZXh0T3BlbikgPT4ge1xuICAgICAgICBzZXRPcGVuKG5leHRPcGVuKTtcbiAgICAgICAgaWYgKG5leHRPcGVuKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAvLyBDbG9zaW5nIHdpdGhvdXQgQXBwbHkgZGlzY2FyZHMgdGhlIGRyYWZ0LlxuICAgICAgICBzZXRUZW1wKGNvbW1pdHRlZCk7XG4gICAgICAgIGlmIChzZWFyY2gpXG4gICAgICAgICAgICBzZXRLZXl3b3JkKCcnKTtcbiAgICB9LCBbY29tbWl0dGVkLCBzZWFyY2hdKTtcbiAgICBjb25zdCByZW5kZXJSb3cgPSB1c2VDYWxsYmFjaygob3B0aW9uLCBjaGVja2VkKSA9PiB7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0eXBlb2Ygb3B0aW9uLmxhYmVsID09PSAnc3RyaW5nJyA/IG9wdGlvbi5sYWJlbCA6ICcnO1xuICAgICAgICByZXR1cm4gKF9qc3hzKEZsZXgsIHsgYWxpZ246ICdjZW50ZXInLCBqdXN0aWZ5OiAnc3BhY2UtYmV0d2VlbicsIGdhcDogOCwgY2xhc3NOYW1lOiBgJHtXUkFQX0NMU31fX3Jvd2AsIGNoaWxkcmVuOiBbX2pzeHMoRmxleCwgeyBhbGlnbjogJ2NlbnRlcicsIGdhcDogOCwgY2xhc3NOYW1lOiBgJHtXUkFQX0NMU31fX3Jvdy1tYWluYCwgY2hpbGRyZW46IFtvcHRpb24uaWNvblVybCAmJiAoX2pzeChcImltZ1wiLCB7IHNyYzogb3B0aW9uLmljb25VcmwsIGFsdDogdGV4dCwgd2lkdGg6IElDT05fU0laRSwgaGVpZ2h0OiBJQ09OX1NJWkUsIGNsYXNzTmFtZTogSUNPTl9DTFMgfSkpLCBfanN4cyhGbGV4LCB7IHZlcnRpY2FsOiB0cnVlLCBnYXA6IDAsIGFsaWduOiAnc3RhcnQnLCBjbGFzc05hbWU6IGAke1dSQVBfQ0xTfV9fcm93LXRleHRgLCBjaGlsZHJlbjogW19qc3hzKEZsZXgsIHsgYWxpZ246ICdjZW50ZXInLCBnYXA6IDgsIGNsYXNzTmFtZTogYCR7V1JBUF9DTFN9X19yb3ctbGFiZWxgLCBjaGlsZHJlbjogW19qc3goVHlwb2dyYXBoeUxhYmVsLCB7IHNpemU6ICdtZCcsIGNoaWxkcmVuOiBvcHRpb24ubGFiZWwgfSksIG9wdGlvbi50YWcgJiYgX2pzeChUYWcsIHsgbGFiZWw6IG9wdGlvbi50YWcsIHNpemU6ICdzbWFsbCcsIGNvbG9yOiAncmVjb21tZW5kZWQnIH0pXSB9KSwgb3B0aW9uLmRlc2NyaXB0aW9uICYmIChfanN4KFR5cG9ncmFwaHlCb2R5LCB7IHNpemU6ICdzbScsIGNvbG9yOiAnZGVmYXVsdC10ZXJ0aWFyeScsIGNoaWxkcmVuOiBvcHRpb24uZGVzY3JpcHRpb24gfSkpXSB9KV0gfSksIF9qc3goQ2hlY2tib3gsIHsgY2hlY2tlZDogY2hlY2tlZCwgcmVhZE9ubHk6IHRydWUsIGNsYXNzTmFtZTogYCR7V1JBUF9DTFN9X19yb3ctY2hlY2tgIH0pXSB9KSk7XG4gICAgfSwgW10pO1xuICAgIC8vIFRoZSB0cmlnZ2VyIHJlZmxlY3RzIHRoZSBDT01NSVRURUQgc2VsZWN0aW9uIChub3QgdGhlIGluLXBhbmVsIGRyYWZ0KS5cbiAgICAvLyBgcmVuZGVyVmFsdWVgIHNob3J0LWNpcmN1aXRzIFNlbGVjdCdzIG93biBwbGFjZWhvbGRlciBoYW5kbGluZywgc28gdGhlXG4gICAgLy8gZW1wdHkgc3RhdGUgbXVzdCByZXR1cm4gdGhlIHBsYWNlaG9sZGVyIGV4cGxpY2l0bHkuXG4gICAgY29uc3QgcmVuZGVyVmFsdWUgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIGlmIChhbGxDaGVja2VkKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gYWxsTGFiZWwgIT09IG51bGwgJiYgYWxsTGFiZWwgIT09IHZvaWQgMCA/IGFsbExhYmVsIDogcGxhY2Vob2xkZXI7XG4gICAgICAgICAgICByZXR1cm4gKF9qc3goVHlwb2dyYXBoeUJvZHksIHsgc2l6ZTogJ21kJywgY29sb3I6IGFsbExhYmVsID8gJ2RlZmF1bHQnIDogJ2RlZmF1bHQtdGVydGlhcnknLCBjbGFzc05hbWU6IGAke1dSQVBfQ0xTfV9fdmFsdWVgLCBjaGlsZHJlbjogdGV4dCB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3QgPSBvcHRpb25CeVZhbHVlLmdldChjb21taXR0ZWRbMF0pO1xuICAgICAgICBjb25zdCBmaXJzdExhYmVsID0gZmlyc3QgPyBmaXJzdC5sYWJlbCA6IGNvbW1pdHRlZFswXTtcbiAgICAgICAgY29uc3QgZXh0cmEgPSBjb21taXR0ZWQubGVuZ3RoIC0gMTtcbiAgICAgICAgcmV0dXJuIChfanN4cyhUeXBvZ3JhcGh5Qm9keSwgeyBzaXplOiAnbWQnLCBjbGFzc05hbWU6IGAke1dSQVBfQ0xTfV9fdmFsdWVgLCBjaGlsZHJlbjogW2ZpcnN0TGFiZWwsIGV4dHJhID4gMCAmJiAoX2pzeChcInNwYW5cIiwgeyBjbGFzc05hbWU6IGAke1dSQVBfQ0xTfV9fdmFsdWUtbW9yZWAsIGNoaWxkcmVuOiBNT1JFX1NVRkZJWChleHRyYSkgfSkpXSB9KSk7XG4gICAgfSwgW2FsbENoZWNrZWQsIGFsbExhYmVsLCBwbGFjZWhvbGRlciwgY29tbWl0dGVkLCBvcHRpb25CeVZhbHVlXSk7XG4gICAgcmV0dXJuIChfanN4KFNlbGVjdCwgT2JqZWN0LmFzc2lnbih7fSwgcmVzdCwgeyBtdWx0aXBsZTogdHJ1ZSwgc2l6ZTogc2l6ZSwgbGFiZWw6IGxhYmVsLCBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXIsIGNsYXNzTmFtZTogam9pbkNscyhXUkFQX0NMUywgY2xhc3NOYW1lKSwgcGFuZWxDbGFzc05hbWU6IFBBTkVMX0NMUywgZ3JvdXBMYWJlbENsYXNzTmFtZTogR1JPVVBfTEFCRUxfQ0xTLCB2YWx1ZTogdGVtcCwgb3Blbjogb3Blbiwgb25PcGVuQ2hhbmdlOiBoYW5kbGVPcGVuQ2hhbmdlLCBvbkNoYW5nZTogaGFuZGxlU2VsZWN0Q2hhbmdlLCBzZWFyY2hhYmxlOiBzZWFyY2gsIHNlYXJjaFBsYWNlaG9sZGVyOiBzZWFyY2hQbGFjZWhvbGRlciwgc2VhcmNoVmFsdWU6IGtleXdvcmQsIG9uU2VhcmNoQ2hhbmdlOiBzZXRLZXl3b3JkLCBmaWx0ZXJPcHRpb246IGZpbHRlck9wdGlvbiwgb3B0aW9uczogZ3JvdXBlZERhdGEsIHBhbmVsSGVhZGVyOiBhbGxMYWJlbCA/IChfanN4cyhcImJ1dHRvblwiLCB7IHR5cGU6ICdidXR0b24nLCBjbGFzc05hbWU6IGpvaW5DbHMoYCR7V1JBUF9DTFN9X19hbGxgLCBhbGxDaGVja2VkICYmIGAke1dSQVBfQ0xTfV9fYWxsLS1jaGVja2VkYCksIG9uQ2xpY2s6IGhhbmRsZUFsbENsaWNrLCBjaGlsZHJlbjogW19qc3goVHlwb2dyYXBoeUxhYmVsLCB7IHNpemU6ICdtZCcsIGNoaWxkcmVuOiBhbGxMYWJlbCB9KSwgX2pzeChDaGVja2JveCwgeyBjaGVja2VkOiBhbGxDaGVja2VkLCByZWFkT25seTogdHJ1ZSwgY2xhc3NOYW1lOiBgJHtXUkFQX0NMU31fX3Jvdy1jaGVja2AgfSldIH0pKSA6IHVuZGVmaW5lZCwgZW1wdHlDb250ZW50OiBzZWFyY2hFbXB0eSwgcmVuZGVyVmFsdWU6IHJlbmRlclZhbHVlLCByZW5kZXJPcHRpb246IChvcHRpb24sIG1ldGEpID0+IHJlbmRlclJvdyhvcHRpb24sIG1ldGEuc2VsZWN0ZWQpLCBwYW5lbEZvb3RlcjogX2pzeHMoRmxleCwgeyBnYXA6IDgsIGNsYXNzTmFtZTogYCR7V1JBUF9DTFN9X19mb290ZXJgLCBjaGlsZHJlbjogW19qc3goQnV0dG9uLCB7IGNvbG9yOiAnZ3JleScsIHNpemU6ICdzbWFsbCcsIHN0eWxlOiBGVUxMX1dJRFRIX1NUWUxFLCBvbkNsaWNrOiBoYW5kbGVSZXNldCwgY2hpbGRyZW46IFJFU0VUX0xBQkVMIH0pLCBfanN4KEJ1dHRvbiwgeyBjb2xvcjogJ3ByaW1hcnknLCBzaXplOiAnc21hbGwnLCBzdHlsZTogRlVMTF9XSURUSF9TVFlMRSwgXG4gICAgICAgICAgICAgICAgICAgIC8vIFdpdGggYW4gXCJBbGxcIiByb3csIGFuIGVtcHR5IGRyYWZ0IG1lYW5zIFwiYWxsXCIgKHZhbGlkKS4gV2l0aG91dFxuICAgICAgICAgICAgICAgICAgICAvLyBvbmUsIGFuIGVtcHR5IGRyYWZ0IG1lYW5zIFwibm90aGluZyBwaWNrZWRcIiDigJQgYmxvY2sgQXBwbHkuXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhYWxsTGFiZWwgJiYgdGVtcC5sZW5ndGggPT09IDAsIG9uQ2xpY2s6IGhhbmRsZUFwcGx5LCBjaGlsZHJlbjogQVBQTFlfTEFCRUwgfSldIH0pIH0pKSk7XG59O1xuZXhwb3J0IGNvbnN0IERyb3Bkb3duRmlsdGVyID0gbWVtbyhEcm9wZG93bkZpbHRlckJhc2UpOyIsbnVsbF0sInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMifQ==
@@ -1,2 +0,0 @@
1
- export { DropdownFilter } from './Dropdown';
2
- export * from './interface';
@@ -1,3 +0,0 @@
1
- export { DropdownFilter } from './Dropdown';
2
- export * from './interface';
3
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJ1c2luZXNzL0ZpbHRlci9zcmMvYnVzaW5lc3MvRmlsdGVyL0Ryb3Bkb3duL2luZGV4LnRzIl0sIm5hbWVzIjpbIkRyb3Bkb3duRmlsdGVyIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxjQUFjLFFBQVEsWUFBWTtBQUMzQyxjQUFjLGFBQWEiLCJmaWxlIjoiYnVzaW5lc3MvRmlsdGVyL0Ryb3Bkb3duL2luZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOltudWxsXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYyJ9
@@ -1,136 +0,0 @@
1
- import type { ReactNode, RefObject } from 'react';
2
- import type { SelectProps, SelectSize } from "../../../components/Select";
3
- /**
4
- * A single selectable row in the dropdown filter. Consumers map their raw
5
- * backend list into this shape — the component renders a fixed row layout from
6
- * these fields (icon + label + optional second line + optional tag + trailing
7
- * checkbox) and never exposes a render slot.
8
- *
9
- * Which optional fields you provide drives the row's appearance:
10
- * - `iconUrl` present → a leading round icon is shown.
11
- * - `description` present → a muted second line is shown under `label`.
12
- * - `group` present → rows are bucketed under a group heading.
13
- * - `tag` present → a small badge is shown after `label`.
14
- */
15
- export interface DropdownFilterOption {
16
- /** Primary row text, e.g. `"Bitcoin"` / `"Sent"` / `"Yvonne Ni"`. */
17
- label: string;
18
- /**
19
- * Stable identifier echoed back through `onApply`, e.g. the asset symbol
20
- * `"USDC"`, the direction `"SENT"`, or a counterparty id.
21
- */
22
- value: string;
23
- /**
24
- * Muted second line under `label`, e.g. a network `"Solana"`, an account
25
- * number, or an email. Omit for a single-line row.
26
- */
27
- description?: string;
28
- /**
29
- * Public URL of a leading round icon (rendered with `<img>`), e.g. an asset
30
- * icon. Omit for a row with no icon.
31
- */
32
- iconUrl?: string;
33
- /**
34
- * Group heading this row belongs to, e.g. `"Cash"` / `"Stablecoins"`.
35
- * Consecutive rows sharing a `group` render under one heading. Omit to keep
36
- * the row ungrouped (no heading).
37
- */
38
- group?: string;
39
- /** Small trailing badge after `label`, e.g. `"Main"`. Omit for no badge. */
40
- tag?: string;
41
- /** Pre-select this row on mount (and on `reset`). */
42
- defaultValue?: boolean;
43
- }
44
- /** Keys of {@link DropdownFilterOption} that the search box matches against. */
45
- export type DropdownFilterSearchKey = 'label' | 'description';
46
- /** Imperative handle exposed via `ref` for parent-driven reset/clear. */
47
- export interface DropdownFilterHandler {
48
- /** Wipe the selection to empty (no rows checked) without firing callbacks. */
49
- clear: () => void;
50
- /** Restore the initial state (respecting `defaultSelectAll`) and fire `onReset`. */
51
- reset: () => void;
52
- }
53
- export interface DropdownFilterProps extends Omit<SelectProps, 'ref' | 'options' | 'multiple' | 'value' | 'defaultValue' | 'onChange' | 'searchable' | 'searchValue' | 'defaultSearchValue' | 'onSearchChange' | 'filterOption' | 'renderOption' | 'renderOptionContent' | 'renderValue' | 'panelHeader' | 'panelFooter' | 'emptyContent' | 'open' | 'defaultOpen' | 'onOpenChange' | 'allowDeselect' | 'maxVisibleValues' | 'size' | 'onReset'> {
54
- ref?: RefObject<DropdownFilterHandler | null>;
55
- /**
56
- * Trigger size. Mirrors the host filter row sizing.
57
- * @default 'small'
58
- */
59
- size?: SelectSize;
60
- /** Optional field label rendered above the trigger. */
61
- label?: ReactNode;
62
- /**
63
- * Trigger placeholder shown before any selection.
64
- * @default 'Select'
65
- */
66
- placeholder?: string;
67
- /**
68
- * The selectable rows. Map your backend list into {@link DropdownFilterOption}.
69
- *
70
- * @example
71
- * ```ts
72
- * const options: DropdownFilterOption[] = [
73
- * { label: 'Bitcoin', value: 'BTC', iconUrl: 'https://…/btc.png', group: 'Stablecoins' },
74
- * ];
75
- * <DropdownFilter options={options} search allLabel='All assets' />
76
- * ```
77
- */
78
- options: DropdownFilterOption[];
79
- /**
80
- * Text for the leading "select all" row, e.g. `"All assets"`. When provided,
81
- * an exclusive "All" row is rendered above the options; selecting it clears
82
- * every specific selection (`onApply` receives `[]`). Omit to render no
83
- * "All" row (e.g. the recipient filter).
84
- */
85
- allLabel?: string;
86
- /**
87
- * Start with everything selected (the "All" row checked, `value = []`). Also
88
- * the state `reset` returns to. Only meaningful together with `allLabel`.
89
- * @default false
90
- */
91
- defaultSelectAll?: boolean;
92
- /**
93
- * Show a search box above the list.
94
- * @default false
95
- */
96
- search?: boolean;
97
- /**
98
- * Placeholder for the search box.
99
- * @default 'Search'
100
- */
101
- searchPlaceholder?: string;
102
- /**
103
- * Which option fields the search box matches against.
104
- * @default ['label', 'description']
105
- */
106
- searchKeys?: DropdownFilterSearchKey[];
107
- /**
108
- * Content shown when the list is empty (no options, or a search with no
109
- * matches). Pass a node to fully customize it — e.g. a different icon and
110
- * copy. Defaults to an `<Empty icon='search' title='No results' />`.
111
- * @example
112
- * ```tsx
113
- * searchEmpty={
114
- * <Empty icon='id' title='No recipients found'
115
- * description='Try a different name or adjust your search filters.' />
116
- * }
117
- * ```
118
- */
119
- searchEmpty?: ReactNode;
120
- /**
121
- * Fired when the user commits the selection via the panel's Apply button.
122
- * Receives the selected `value`s, or `[]` for "all / nothing" — the component
123
- * never injects an `'all'` sentinel, so translate `[]` to whatever your API
124
- * expects (omit the field, `['ALL']`, etc.) at the call site.
125
- * @example
126
- * ```ts
127
- * <DropdownFilter
128
- * options={assets}
129
- * onApply={(values) => setAssetName(values.length ? values : undefined)}
130
- * />
131
- * ```
132
- */
133
- onApply: (values: string[]) => void;
134
- /** Fired when the user clears the selection via the panel's Reset button. */
135
- onReset?: (values: string[]) => void;
136
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVzaW5lc3MvRmlsdGVyL0Ryb3Bkb3duL2ludGVyZmFjZS5qcyIsIm5hbWVzIjpbXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYyIsInNvdXJjZXMiOlsiYnVzaW5lc3MvRmlsdGVyL0Ryb3Bkb3duL2ludGVyZmFjZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge307Il0sIm1hcHBpbmdzIjoiQUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
@@ -1,2 +0,0 @@
1
- import './Dropdown.css';
2
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJ1c2luZXNzL0ZpbHRlci9Ecm9wZG93bi9zcmMvYnVzaW5lc3MvRmlsdGVyL0Ryb3Bkb3duL3N0eWxlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8saUJBQWlCIiwiZmlsZSI6ImJ1c2luZXNzL0ZpbHRlci9Ecm9wZG93bi9zdHlsZS9jc3MuanMiLCJzb3VyY2VzQ29udGVudCI6W251bGxdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjIn0=
@@ -1 +0,0 @@
1
- import './Dropdown.css';
@@ -1,2 +0,0 @@
1
- import './Dropdown.css';
2
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJ1c2luZXNzL0ZpbHRlci9Ecm9wZG93bi9zcmMvYnVzaW5lc3MvRmlsdGVyL0Ryb3Bkb3duL3N0eWxlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8saUJBQWlCIiwiZmlsZSI6ImJ1c2luZXNzL0ZpbHRlci9Ecm9wZG93bi9zdHlsZS9pbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbbnVsbF0sInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMifQ==
@@ -1,2 +0,0 @@
1
- import type { DropdownFilterProps } from './interface';
2
- export declare const DropdownFilter: import("react").NamedExoticComponent<DropdownFilterProps>;