@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
@@ -1,347 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.DropdownFilter = void 0;
8
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
- var _jsxRuntime = require("react/jsx-runtime");
10
- var _react = require("react");
11
- var _Button = require("../../../components/Button");
12
- var _Checkbox = require("../../../components/Checkbox");
13
- var _Empty = require("../../../components/Empty");
14
- var _Flex = require("../../../components/Flex");
15
- var _Select = require("../../../components/Select");
16
- var _Tag = require("../../../components/Tag");
17
- var _Typography = require("../../../components/Typography");
18
- var _classnames = require("../../../utils/classnames");
19
- var __rest = void 0 && (void 0).__rest || function (s, e) {
20
- var t = {};
21
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
22
- if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
23
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
24
- }
25
- return t;
26
- };
27
- var WRAP_CLS = 'om-dropdown-filter';
28
- // The panel is portaled to <body>, so panel-scoped overrides are keyed off this
29
- // class (passed as `panelClassName`) rather than the trigger root.
30
- var PANEL_CLS = "".concat(WRAP_CLS, "-panel");
31
- var GROUP_LABEL_CLS = "".concat(WRAP_CLS, "__group-label");
32
- var ICON_CLS = "".concat(WRAP_CLS, "-icon");
33
- var ICON_SIZE = 24;
34
- var RESET_LABEL = 'Reset';
35
- var APPLY_LABEL = 'Apply';
36
- var DEFAULT_PLACEHOLDER = 'Select';
37
- var DEFAULT_SEARCH_PLACEHOLDER = 'Search';
38
- var DEFAULT_SEARCH_KEYS = ['label', 'description'];
39
- var DEFAULT_EMPTY = (0, _jsxRuntime.jsx)(_Empty.Empty, {
40
- icon: 'search',
41
- title: 'No results'
42
- });
43
- var MORE_SUFFIX = function MORE_SUFFIX(count) {
44
- return " + ".concat(count, " more");
45
- };
46
- var FULL_WIDTH_STYLE = {
47
- flex: 1
48
- };
49
- var toOption = function toOption(raw) {
50
- return {
51
- label: raw.label,
52
- value: raw.value,
53
- description: raw.description,
54
- iconUrl: raw.iconUrl,
55
- tag: raw.tag,
56
- // Restrict matching to the configured keys via `searchText`; see makeFilter.
57
- searchText: [raw.label, raw.description].filter(Boolean).join(' ')
58
- };
59
- };
60
- // Bucket consecutive options by `group`, preserving input order. Ungrouped runs
61
- // stay flat (no heading); grouped runs become a SelectOptionGroup with a label.
62
- var toGroupedData = function toGroupedData(options) {
63
- var data = [];
64
- var bucket = null;
65
- var flush = function flush() {
66
- if (!bucket) return;
67
- if (bucket.group) {
68
- data.push({
69
- key: bucket.group,
70
- label: bucket.group,
71
- options: bucket.options
72
- });
73
- } else {
74
- bucket.options.forEach(function (option) {
75
- return data.push(option);
76
- });
77
- }
78
- bucket = null;
79
- };
80
- options.forEach(function (raw) {
81
- var group = raw.group;
82
- if (!bucket || bucket.group !== group) {
83
- flush();
84
- bucket = {
85
- group: group,
86
- options: []
87
- };
88
- }
89
- bucket.options.push(toOption(raw));
90
- });
91
- flush();
92
- return data;
93
- };
94
- var getInitialValue = function getInitialValue(options, allLabel, defaultSelectAll) {
95
- // With an "All" row, "all selected" is represented by an empty array.
96
- if (allLabel && defaultSelectAll) return [];
97
- return options.filter(function (option) {
98
- return option.defaultValue;
99
- }).map(function (option) {
100
- return option.value;
101
- });
102
- };
103
- var DropdownFilterBase = function DropdownFilterBase(_a) {
104
- var ref = _a.ref,
105
- className = _a.className,
106
- _a$size = _a.size,
107
- size = _a$size === void 0 ? 'small' : _a$size,
108
- label = _a.label,
109
- _a$placeholder = _a.placeholder,
110
- placeholder = _a$placeholder === void 0 ? DEFAULT_PLACEHOLDER : _a$placeholder,
111
- options = _a.options,
112
- allLabel = _a.allLabel,
113
- _a$defaultSelectAll = _a.defaultSelectAll,
114
- defaultSelectAll = _a$defaultSelectAll === void 0 ? false : _a$defaultSelectAll,
115
- _a$search = _a.search,
116
- search = _a$search === void 0 ? false : _a$search,
117
- _a$searchPlaceholder = _a.searchPlaceholder,
118
- searchPlaceholder = _a$searchPlaceholder === void 0 ? DEFAULT_SEARCH_PLACEHOLDER : _a$searchPlaceholder,
119
- _a$searchKeys = _a.searchKeys,
120
- searchKeys = _a$searchKeys === void 0 ? DEFAULT_SEARCH_KEYS : _a$searchKeys,
121
- _a$searchEmpty = _a.searchEmpty,
122
- searchEmpty = _a$searchEmpty === void 0 ? DEFAULT_EMPTY : _a$searchEmpty,
123
- onApply = _a.onApply,
124
- onReset = _a.onReset,
125
- rest = __rest(_a, ["ref", "className", "size", "label", "placeholder", "options", "allLabel", "defaultSelectAll", "search", "searchPlaceholder", "searchKeys", "searchEmpty", "onApply", "onReset"]);
126
- var initialValue = (0, _react.useMemo)(function () {
127
- return getInitialValue(options, allLabel, defaultSelectAll);
128
- }, [options, allLabel, defaultSelectAll]);
129
- var _useState = (0, _react.useState)(false),
130
- _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
131
- open = _useState2[0],
132
- setOpen = _useState2[1];
133
- var _useState3 = (0, _react.useState)(''),
134
- _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
135
- keyword = _useState4[0],
136
- setKeyword = _useState4[1];
137
- // `temp` is the in-panel draft; `committed` is the last Applied selection.
138
- // Only Apply promotes `temp` → `committed` and notifies the parent.
139
- var _useState5 = (0, _react.useState)(initialValue),
140
- _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
141
- temp = _useState6[0],
142
- setTemp = _useState6[1];
143
- var _useState7 = (0, _react.useState)(initialValue),
144
- _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
145
- committed = _useState8[0],
146
- setCommitted = _useState8[1];
147
- var groupedData = (0, _react.useMemo)(function () {
148
- return toGroupedData(options);
149
- }, [options]);
150
- var allValues = (0, _react.useMemo)(function () {
151
- return options.map(function (option) {
152
- return option.value;
153
- });
154
- }, [options]);
155
- var optionByValue = (0, _react.useMemo)(function () {
156
- var map = new Map();
157
- options.forEach(function (option) {
158
- return map.set(option.value, option);
159
- });
160
- return map;
161
- }, [options]);
162
- // The "All" row is checked exactly when nothing specific is selected.
163
- var allChecked = temp.length === 0;
164
- var filterOption = (0, _react.useCallback)(function (searchValue, option) {
165
- var term = searchValue.trim().toLowerCase();
166
- if (!term) return true;
167
- var mapped = option;
168
- return searchKeys.some(function (key) {
169
- var field = key === 'label' ? mapped.label : mapped.description;
170
- return typeof field === 'string' && field.toLowerCase().includes(term);
171
- });
172
- }, [searchKeys]);
173
- (0, _react.useImperativeHandle)(ref, function () {
174
- return {
175
- clear: function clear() {
176
- setTemp([]);
177
- setCommitted([]);
178
- },
179
- reset: function reset() {
180
- setTemp(initialValue);
181
- setCommitted(initialValue);
182
- onReset === null || onReset === void 0 ? void 0 : onReset(initialValue);
183
- }
184
- };
185
- }, [initialValue, onReset]);
186
- var handleSelectChange = (0, _react.useCallback)(function (next) {
187
- var nextValues = (Array.isArray(next) ? next : []).map(String);
188
- // With an "All" row, selecting every concrete option collapses to "all"
189
- // ([]), matching the backend convention that empty == no filter. Without
190
- // an "All" row (e.g. recipients), a full selection stays explicit so the
191
- // trigger still summarizes it ("Name + N more").
192
- var collapse = !!allLabel && nextValues.length === allValues.length;
193
- setTemp(collapse ? [] : nextValues);
194
- }, [allLabel, allValues]);
195
- var handleAllClick = (0, _react.useCallback)(function () {
196
- // The "All" row is exclusive: turning it on clears specific picks.
197
- setTemp([]);
198
- }, []);
199
- var handleApply = (0, _react.useCallback)(function () {
200
- setCommitted(temp);
201
- onApply(temp);
202
- setOpen(false);
203
- }, [temp, onApply]);
204
- var handleReset = (0, _react.useCallback)(function () {
205
- setTemp(initialValue);
206
- setCommitted(initialValue);
207
- onReset === null || onReset === void 0 ? void 0 : onReset(initialValue);
208
- }, [initialValue, onReset]);
209
- var handleOpenChange = (0, _react.useCallback)(function (nextOpen) {
210
- setOpen(nextOpen);
211
- if (nextOpen) return;
212
- // Closing without Apply discards the draft.
213
- setTemp(committed);
214
- if (search) setKeyword('');
215
- }, [committed, search]);
216
- var renderRow = (0, _react.useCallback)(function (option, checked) {
217
- var text = typeof option.label === 'string' ? option.label : '';
218
- return (0, _jsxRuntime.jsxs)(_Flex.Flex, {
219
- align: 'center',
220
- justify: 'space-between',
221
- gap: 8,
222
- className: "".concat(WRAP_CLS, "__row"),
223
- children: [(0, _jsxRuntime.jsxs)(_Flex.Flex, {
224
- align: 'center',
225
- gap: 8,
226
- className: "".concat(WRAP_CLS, "__row-main"),
227
- children: [option.iconUrl && (0, _jsxRuntime.jsx)("img", {
228
- src: option.iconUrl,
229
- alt: text,
230
- width: ICON_SIZE,
231
- height: ICON_SIZE,
232
- className: ICON_CLS
233
- }), (0, _jsxRuntime.jsxs)(_Flex.Flex, {
234
- vertical: true,
235
- gap: 0,
236
- align: 'start',
237
- className: "".concat(WRAP_CLS, "__row-text"),
238
- children: [(0, _jsxRuntime.jsxs)(_Flex.Flex, {
239
- align: 'center',
240
- gap: 8,
241
- className: "".concat(WRAP_CLS, "__row-label"),
242
- children: [(0, _jsxRuntime.jsx)(_Typography.TypographyLabel, {
243
- size: 'md',
244
- children: option.label
245
- }), option.tag && (0, _jsxRuntime.jsx)(_Tag.Tag, {
246
- label: option.tag,
247
- size: 'small',
248
- color: 'recommended'
249
- })]
250
- }), option.description && (0, _jsxRuntime.jsx)(_Typography.TypographyBody, {
251
- size: 'sm',
252
- color: 'default-tertiary',
253
- children: option.description
254
- })]
255
- })]
256
- }), (0, _jsxRuntime.jsx)(_Checkbox.Checkbox, {
257
- checked: checked,
258
- readOnly: true,
259
- className: "".concat(WRAP_CLS, "__row-check")
260
- })]
261
- });
262
- }, []);
263
- // The trigger reflects the COMMITTED selection (not the in-panel draft).
264
- // `renderValue` short-circuits Select's own placeholder handling, so the
265
- // empty state must return the placeholder explicitly.
266
- var renderValue = (0, _react.useCallback)(function () {
267
- if (allChecked) {
268
- var text = allLabel !== null && allLabel !== void 0 ? allLabel : placeholder;
269
- return (0, _jsxRuntime.jsx)(_Typography.TypographyBody, {
270
- size: 'md',
271
- color: allLabel ? 'default' : 'default-tertiary',
272
- className: "".concat(WRAP_CLS, "__value"),
273
- children: text
274
- });
275
- }
276
- var first = optionByValue.get(committed[0]);
277
- var firstLabel = first ? first.label : committed[0];
278
- var extra = committed.length - 1;
279
- return (0, _jsxRuntime.jsxs)(_Typography.TypographyBody, {
280
- size: 'md',
281
- className: "".concat(WRAP_CLS, "__value"),
282
- children: [firstLabel, extra > 0 && (0, _jsxRuntime.jsx)("span", {
283
- className: "".concat(WRAP_CLS, "__value-more"),
284
- children: MORE_SUFFIX(extra)
285
- })]
286
- });
287
- }, [allChecked, allLabel, placeholder, committed, optionByValue]);
288
- return (0, _jsxRuntime.jsx)(_Select.Select, Object.assign({}, rest, {
289
- multiple: true,
290
- size: size,
291
- label: label,
292
- placeholder: placeholder,
293
- className: (0, _classnames.joinCls)(WRAP_CLS, className),
294
- panelClassName: PANEL_CLS,
295
- groupLabelClassName: GROUP_LABEL_CLS,
296
- value: temp,
297
- open: open,
298
- onOpenChange: handleOpenChange,
299
- onChange: handleSelectChange,
300
- searchable: search,
301
- searchPlaceholder: searchPlaceholder,
302
- searchValue: keyword,
303
- onSearchChange: setKeyword,
304
- filterOption: filterOption,
305
- options: groupedData,
306
- panelHeader: allLabel ? (0, _jsxRuntime.jsxs)("button", {
307
- type: 'button',
308
- className: (0, _classnames.joinCls)("".concat(WRAP_CLS, "__all"), allChecked && "".concat(WRAP_CLS, "__all--checked")),
309
- onClick: handleAllClick,
310
- children: [(0, _jsxRuntime.jsx)(_Typography.TypographyLabel, {
311
- size: 'md',
312
- children: allLabel
313
- }), (0, _jsxRuntime.jsx)(_Checkbox.Checkbox, {
314
- checked: allChecked,
315
- readOnly: true,
316
- className: "".concat(WRAP_CLS, "__row-check")
317
- })]
318
- }) : undefined,
319
- emptyContent: searchEmpty,
320
- renderValue: renderValue,
321
- renderOption: function renderOption(option, meta) {
322
- return renderRow(option, meta.selected);
323
- },
324
- panelFooter: (0, _jsxRuntime.jsxs)(_Flex.Flex, {
325
- gap: 8,
326
- className: "".concat(WRAP_CLS, "__footer"),
327
- children: [(0, _jsxRuntime.jsx)(_Button.Button, {
328
- color: 'grey',
329
- size: 'small',
330
- style: FULL_WIDTH_STYLE,
331
- onClick: handleReset,
332
- children: RESET_LABEL
333
- }), (0, _jsxRuntime.jsx)(_Button.Button, {
334
- color: 'primary',
335
- size: 'small',
336
- style: FULL_WIDTH_STYLE,
337
- // With an "All" row, an empty draft means "all" (valid). Without
338
- // one, an empty draft means "nothing picked" — block Apply.
339
- disabled: !allLabel && temp.length === 0,
340
- onClick: handleApply,
341
- children: APPLY_LABEL
342
- })]
343
- })
344
- }));
345
- };
346
- var DropdownFilter = exports.DropdownFilter = /*#__PURE__*/(0, _react.memo)(DropdownFilterBase);
347
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJ1c2luZXNzL0ZpbHRlci9Ecm9wZG93bi9Ecm9wZG93bi5qcyIsImJ1c2luZXNzL0ZpbHRlci9zcmMvYnVzaW5lc3MvRmlsdGVyL0Ryb3Bkb3duL0Ryb3Bkb3duLnRzeCJdLCJuYW1lcyI6WyJfanN4UnVudGltZSIsInJlcXVpcmUiLCJfcmVhY3QiLCJfQnV0dG9uIiwiX0NoZWNrYm94IiwiX0VtcHR5IiwiX0ZsZXgiLCJfU2VsZWN0IiwiX1RhZyIsIl9UeXBvZ3JhcGh5IiwiX2NsYXNzbmFtZXMiLCJfX3Jlc3QiLCJzIiwiZSIsInQiLCJwIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaW5kZXhPZiIsImdldE93blByb3BlcnR5U3ltYm9scyIsImkiLCJsZW5ndGgiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsIldSQVBfQ0xTIiwiUEFORUxfQ0xTIiwiY29uY2F0IiwiR1JPVVBfTEFCRUxfQ0xTIiwiSUNPTl9DTFMiLCJJQ09OX1NJWkUiLCJSRVNFVF9MQUJFTCIsIkFQUExZX0xBQkVMIiwiREVGQVVMVF9QTEFDRUhPTERFUiIsIkRFRkFVTFRfU0VBUkNIX1BMQUNFSE9MREVSIiwiREVGQVVMVF9TRUFSQ0hfS0VZUyIsIkRFRkFVTFRfRU1QVFkiLCJfanN4IiwiRW1wdHkiLCJpY29uIiwidGl0bGUiLCJNT1JFX1NVRkZJWCIsImNvdW50IiwiRlVMTF9XSURUSF9TVFlMRSIsImZsZXgiLCJ0b09wdGlvbiIsInJhdyIsImxhYmVsIiwidmFsdWUiLCJkZXNjcmlwdGlvbiIsImljb25VcmwiLCJ0YWciLCJzZWFyY2hUZXh0IiwiZmlsdGVyIiwiQm9vbGVhbiIsImpvaW4iLCJ0b0dyb3VwZWREYXRhIiwib3B0aW9ucyIsImRhdGEiLCJidWNrZXQiLCJmbHVzaCIsImdyb3VwIiwicHVzaCIsImtleSIsImZvckVhY2giLCJvcHRpb24iLCJnZXRJbml0aWFsVmFsdWUiLCJhbGxMYWJlbCIsImRlZmF1bHRTZWxlY3RBbGwiLCJkZWZhdWx0VmFsdWUiLCJtYXAiLCJEcm9wZG93bkZpbHRlckJhc2UiLCJfYSIsInJlZiIsImNsYXNzTmFtZSIsIl9hJHNpemUiLCJzaXplIiwiX2EkcGxhY2Vob2xkZXIiLCJwbGFjZWhvbGRlciIsIl9hJGRlZmF1bHRTZWxlY3RBbGwiLCJfYSRzZWFyY2giLCJzZWFyY2giLCJfYSRzZWFyY2hQbGFjZWhvbGRlciIsInNlYXJjaFBsYWNlaG9sZGVyIiwiX2Ekc2VhcmNoS2V5cyIsInNlYXJjaEtleXMiLCJfYSRzZWFyY2hFbXB0eSIsInNlYXJjaEVtcHR5Iiwib25BcHBseSIsIm9uUmVzZXQiLCJyZXN0IiwiaW5pdGlhbFZhbHVlIiwidXNlTWVtbyIsIl91c2VTdGF0ZSIsInVzZVN0YXRlIiwiX3VzZVN0YXRlMiIsIl9zbGljZWRUb0FycmF5MiIsIm9wZW4iLCJzZXRPcGVuIiwiX3VzZVN0YXRlMyIsIl91c2VTdGF0ZTQiLCJrZXl3b3JkIiwic2V0S2V5d29yZCIsIl91c2VTdGF0ZTUiLCJfdXNlU3RhdGU2IiwidGVtcCIsInNldFRlbXAiLCJfdXNlU3RhdGU3IiwiX3VzZVN0YXRlOCIsImNvbW1pdHRlZCIsInNldENvbW1pdHRlZCIsImdyb3VwZWREYXRhIiwiYWxsVmFsdWVzIiwib3B0aW9uQnlWYWx1ZSIsIk1hcCIsInNldCIsImFsbENoZWNrZWQiLCJmaWx0ZXJPcHRpb24iLCJ1c2VDYWxsYmFjayIsInNlYXJjaFZhbHVlIiwidGVybSIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsIm1hcHBlZCIsInNvbWUiLCJmaWVsZCIsImluY2x1ZGVzIiwidXNlSW1wZXJhdGl2ZUhhbmRsZSIsImNsZWFyIiwicmVzZXQiLCJoYW5kbGVTZWxlY3RDaGFuZ2UiLCJuZXh0IiwibmV4dFZhbHVlcyIsIkFycmF5IiwiaXNBcnJheSIsIlN0cmluZyIsImNvbGxhcHNlIiwiaGFuZGxlQWxsQ2xpY2siLCJoYW5kbGVBcHBseSIsImhhbmRsZVJlc2V0IiwiaGFuZGxlT3BlbkNoYW5nZSIsIm5leHRPcGVuIiwicmVuZGVyUm93IiwiY2hlY2tlZCIsInRleHQiLCJfanN4cyIsIkZsZXgiLCJhbGlnbiIsImp1c3RpZnkiLCJnYXAiLCJjaGlsZHJlbiIsInNyYyIsImFsdCIsIndpZHRoIiwiaGVpZ2h0IiwidmVydGljYWwiLCJUeXBvZ3JhcGh5TGFiZWwiLCJUYWciLCJjb2xvciIsIlR5cG9ncmFwaHlCb2R5IiwiQ2hlY2tib3giLCJyZWFkT25seSIsInJlbmRlclZhbHVlIiwiZmlyc3QiLCJnZXQiLCJmaXJzdExhYmVsIiwiZXh0cmEiLCJTZWxlY3QiLCJhc3NpZ24iLCJtdWx0aXBsZSIsImpvaW5DbHMiLCJwYW5lbENsYXNzTmFtZSIsImdyb3VwTGFiZWxDbGFzc05hbWUiLCJvbk9wZW5DaGFuZ2UiLCJvbkNoYW5nZSIsInNlYXJjaGFibGUiLCJvblNlYXJjaENoYW5nZSIsInBhbmVsSGVhZGVyIiwidHlwZSIsIm9uQ2xpY2siLCJ1bmRlZmluZWQiLCJlbXB0eUNvbnRlbnQiLCJyZW5kZXJPcHRpb24iLCJtZXRhIiwic2VsZWN0ZWQiLCJwYW5lbEZvb3RlciIsIkJ1dHRvbiIsInN0eWxlIiwiZGlzYWJsZWQiLCJEcm9wZG93bkZpbHRlciIsImV4cG9ydHMiLCJtZW1vIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVdBLElBQUFBLFdBQUEsR0FBQUMsT0FBQTtBQ1hBLElBQUFDLE1BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE9BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFNBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE1BQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLEtBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLE9BQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLElBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLFdBQUEsR0FBQVIsT0FBQTtBQUNBLElBQUFTLFdBQUEsR0FBQVQsT0FBQTtBRFJBLElBQUlVLE1BQU0sR0FBSSxVQUFRLFNBQUtBLE1BQU0sSUFBSyxVQUFVQyxDQUFDLEVBQUVDLENBQUMsRUFBRTtFQUNsRCxJQUFJ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c0gsSUFBSTtNQUFBLE9BQ3pCekMsU0FBUyxDQUFDN0UsTUFBc0IsRUFBRXNILElBQUksQ0FBQ0MsUUFBUSxDQUFDO0lBQUE7SUFFbERDLFdBQVcsRUFDVCxJQUFBeEMsZ0JBQUEsRUFBQ0MsVUFBSSxFQUFBO01BQUNHLEdBQUcsRUFBRSxDQUFDO01BQUUzRSxTQUFTLEtBQUEvQyxNQUFBLENBQUtGLFFBQVEsYUFBVTtNQUFBNkgsUUFBQSxFQUFBLENBQzVDLElBQUFqSCxlQUFBLEVBQUNxSixjQUFNLEVBQUE7UUFBQzVCLEtBQUssRUFBQyxNQUFNO1FBQUNsRixJQUFJLEVBQUMsT0FBTztRQUFDK0csS0FBSyxFQUFFaEosZ0JBQWdCO1FBQUV3SSxPQUFPLEVBQUV4QyxXQUFXO1FBQUFXLFFBQUEsRUFDNUV2SDtNQUFXLENBQUEsQ0FDTCxFQUNULElBQUFNLGVBQUEsRUFBQ3FKLGNBQU0sRUFBQTtRQUNMNUIsS0FBSyxFQUFDLFNBQVM7UUFDZmxGLElBQUksRUFBQyxPQUFPO1FBQ1orRyxLQUFLLEVBQUVoSixnQkFBZ0I7UUFDdkI7UUFDQTtRQUNBaUosUUFBUSxFQUFFLENBQUN6SCxRQUFRLElBQUlzQyxJQUFJLENBQUNsRixNQUFNLEtBQUssQ0FBQztRQUN4QzRKLE9BQU8sRUFBRXpDLFdBQVc7UUFBQVksUUFBQSxFQUVuQnRIO01BQVcsQ0FBQSxDQUNMO0lBQUEsQ0FBQTtFQUNKLENBQUEsQ0FBQSxDQUVUO0FBRU4sQ0FBQztBQUVNLElBQU02SixjQUFjLEdBQUFDLE9BQUEsQ0FBQUQsY0FBQSxnQkFBRyxJQUFBRSxXQUFJLEVBQUN4SCxrQkFBa0IsQ0FBQyIsImZpbGUiOiJidXNpbmVzcy9GaWx0ZXIvRHJvcGRvd24vRHJvcGRvd24uanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19yZXN0ID0gKHRoaXMgJiYgdGhpcy5fX3Jlc3QpIHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gICAgdmFyIHQgPSB7fTtcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcbiAgICAgICAgdFtwXSA9IHNbcF07XG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XG4gICAgICAgIH1cbiAgICByZXR1cm4gdDtcbn07XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCwganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsgbWVtbywgdXNlQ2FsbGJhY2ssIHVzZUltcGVyYXRpdmVIYW5kbGUsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQnV0dG9uIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9CdXR0b24nO1xuaW1wb3J0IHsgQ2hlY2tib3ggfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL0NoZWNrYm94JztcbmltcG9ydCB7IEVtcHR5IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9FbXB0eSc7XG5pbXBvcnQgeyBGbGV4IH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9GbGV4JztcbmltcG9ydCB7IFNlbGVjdCB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvU2VsZWN0JztcbmltcG9ydCB7IFRhZyB9IGZyb20gJy4uLy4uLy4uL2NvbXBvbmVudHMvVGFnJztcbmltcG9ydCB7IFR5cG9ncmFwaHlCb2R5LCBUeXBvZ3JhcGh5TGFiZWwgfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnRzL1R5cG9ncmFwaHknO1xuaW1wb3J0IHsgam9pbkNscyB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2NsYXNzbmFtZXMnO1xuY29uc3QgV1JBUF9DTFMgPSAnb20tZHJvcGRvd24tZmlsdGVyJztcbi8vIFRoZSBwYW5lbCBpcyBwb3J0YWxlZCB0byA8Ym9keT4sIHNvIHBhbmVsLXNjb3BlZCBvdmVycmlkZXMgYXJlIGtleWVkIG9mZiB0aGlzXG4vLyBjbGFzcyAocGFzc2VkIGFzIGBwYW5lbENsYXNzTmFtZWApIHJhdGhlciB0aGFuIHRoZSB0cmlnZ2VyIHJvb3QuXG5jb25zdCBQQU5FTF9DTFMgPSBgJHtXUkFQX0NMU30tcGFuZWxgO1xuY29uc3QgR1JPVVBfTEFCRUxfQ0xTID0gYCR7V1JBUF9DTFN9X19ncm91cC1sYWJlbGA7XG5jb25zdCBJQ09OX0NMUyA9IGAke1dSQVBfQ0xTfS1pY29uYDtcbmNvbnN0IElDT05fU0laRSA9IDI0O1xuY29uc3QgUkVTRVRfTEFCRUwgPSAnUmVzZXQnO1xuY29uc3QgQVBQTFlfTEFCRUwgPSAnQXBwbHknO1xuY29uc3QgREVGQVVMVF9QTEFDRUhPTERFUiA9ICdTZWxlY3QnO1xuY29uc3QgREVGQVVMVF9TRUFSQ0hfUExBQ0VIT0xERVIgPSAnU2VhcmNoJztcbmNvbnN0IERFRkFVTFRfU0VBUkNIX0tFWVMgPSBbJ2xhYmVsJywgJ2Rlc2NyaXB0aW9uJ107XG5jb25zdCBERUZBVUxUX0VNUFRZID0gX2pzeChFbXB0eSwgeyBpY29uOiAnc2VhcmNoJywgdGl0bGU6ICdObyByZXN1bHRzJyB9KTtcbmNvbnN0IE1PUkVfU1VGRklYID0gKGNvdW50KSA9PiBgICsgJHtjb3VudH0gbW9yZWA7XG5jb25zdCBGVUxMX1dJRFRIX1NUWUxFID0geyBmbGV4OiAxIH07XG5jb25zdCB0b09wdGlvbiA9IChyYXcpID0+ICh7XG4gICAgbGFiZWw6IHJhdy5sYWJlbCxcbiAgICB2YWx1ZTogcmF3LnZhbHVlLFxuICAgIGRlc2NyaXB0aW9uOiByYXcuZGVzY3JpcHRpb24sXG4gICAgaWNvblVybDogcmF3Lmljb25VcmwsXG4gICAgdGFnOiByYXcudGFnLFxuICAgIC8vIFJlc3RyaWN0IG1hdGNoaW5nIHRvIHRoZSBjb25maWd1cmVkIGtleXMgdmlhIGBzZWFyY2hUZXh0YDsgc2VlIG1ha2VGaWx0ZXIuXG4gICAgc2VhcmNoVGV4dDogW3Jhdy5sYWJlbCwgcmF3LmRlc2NyaXB0aW9uXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpLFxufSk7XG4vLyBCdWNrZXQgY29uc2VjdXRpdmUgb3B0aW9ucyBieSBgZ3JvdXBgLCBwcmVzZXJ2aW5nIGlucHV0IG9yZGVyLiBVbmdyb3VwZWQgcnVuc1xuLy8gc3RheSBmbGF0IChubyBoZWFkaW5nKTsgZ3JvdXBlZCBydW5zIGJlY29tZSBhIFNlbGVjdE9wdGlvbkdyb3VwIHdpdGggYSBsYWJlbC5cbmNvbnN0IHRvR3JvdXBlZERhdGEgPSAob3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBbXTtcbiAgICBsZXQgYnVja2V0ID0gbnVsbDtcbiAgICBjb25zdCBmbHVzaCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFidWNrZXQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmIChidWNrZXQuZ3JvdXApIHtcbiAgICAgICAgICAgIGRhdGEucHVzaCh7IGtleTogYnVja2V0Lmdyb3VwLCBsYWJlbDogYnVja2V0Lmdyb3VwLCBvcHRpb25zOiBidWNrZXQub3B0aW9ucyB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJ1Y2tldC5vcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4gZGF0YS5wdXNoKG9wdGlvbikpO1xuICAgICAgICB9XG4gICAgICAgIGJ1Y2tldCA9IG51bGw7XG4gICAgfTtcbiAgICBvcHRpb25zLmZvckVhY2goKHJhdykgPT4ge1xuICAgICAgICBjb25zdCBncm91cCA9IHJhdy5ncm91cDtcbiAgICAgICAgaWYgKCFidWNrZXQgfHwgYnVja2V0Lmdyb3VwICE9PSBncm91cCkge1xuICAgICAgICAgICAgZmx1c2goKTtcbiAgICAgICAgICAgIGJ1Y2tldCA9IHsgZ3JvdXAsIG9wdGlvbnM6IFtdIH07XG4gICAgICAgIH1cbiAgICAgICAgYnVja2V0Lm9wdGlvbnMucHVzaCh0b09wdGlvbihyYXcpKTtcbiAgICB9KTtcbiAgICBmbHVzaCgpO1xuICAgIHJldHVybiBkYXRhO1xufTtcbmNvbnN0IGdldEluaXRpYWxWYWx1ZSA9IChvcHRpb25zLCBhbGxMYWJlbCwgZGVmYXVsdFNlbGVjdEFsbCkgPT4ge1xuICAgIC8vIFdpdGggYW4gXCJBbGxcIiByb3csIFwiYWxsIHNlbGVjdGVkXCIgaXMgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkgYXJyYXkuXG4gICAgaWYgKGFsbExhYmVsICYmIGRlZmF1bHRTZWxlY3RBbGwpXG4gICAgICAgIHJldHVybiBbXTtcbiAgICByZXR1cm4gb3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLmRlZmF1bHRWYWx1ZSkubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSk7XG59O1xuY29uc3QgRHJvcGRvd25GaWx0ZXJCYXNlID0gKF9hKSA9PiB7XG4gICAgdmFyIHsgcmVmLCBjbGFzc05hbWUsIHNpemUgPSAnc21hbGwnLCBsYWJlbCwgcGxhY2Vob2xkZXIgPSBERUZBVUxUX1BMQUNFSE9MREVSLCBvcHRpb25zLCBhbGxMYWJlbCwgZGVmYXVsdFNlbGVjdEFsbCA9IGZhbHNlLCBzZWFyY2ggPSBmYWxzZSwgc2VhcmNoUGxhY2Vob2xkZXIgPSBERUZBVUxUX1NFQVJDSF9QTEFDRUhPTERFUiwgc2VhcmNoS2V5cyA9IERFRkFVTFRfU0VBUkNIX0tFWVMsIHNlYXJjaEVtcHR5ID0gREVGQVVMVF9FTVBUWSwgb25BcHBseSwgb25SZXNldCB9ID0gX2EsIHJlc3QgPSBfX3Jlc3QoX2EsIFtcInJlZlwiLCBcImNsYXNzTmFtZVwiLCBcInNpemVcIiwgXCJsYWJlbFwiLCBcInBsYWNlaG9sZGVyXCIsIFwib3B0aW9uc1wiLCBcImFsbExhYmVsXCIsIFwiZGVmYXVsdFNlbGVjdEFsbFwiLCBcInNlYXJjaFwiLCBcInNlYXJjaFBsYWNlaG9sZGVyXCIsIFwic2VhcmNoS2V5c1wiLCBcInNlYXJjaEVtcHR5XCIsIFwib25BcHBseVwiLCBcIm9uUmVzZXRcIl0pO1xuICAgIGNvbnN0IGluaXRpYWxWYWx1ZSA9IHVzZU1lbW8oKCkgPT4gZ2V0SW5pdGlhbFZhbHVlKG9wdGlvbnMsIGFsbExhYmVsLCBkZWZhdWx0U2VsZWN0QWxsKSwgW29wdGlvbnMsIGFsbExhYmVsLCBkZWZhdWx0U2VsZWN0QWxsXSk7XG4gICAgY29uc3QgW29wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IFtrZXl3b3JkLCBzZXRLZXl3b3JkXSA9IHVzZVN0YXRlKCcnKTtcbiAgICAvLyBgdGVtcGAgaXMgdGhlIGluLXBhbmVsIGRyYWZ0OyBgY29tbWl0dGVkYCBpcyB0aGUgbGFzdCBBcHBsaWVkIHNlbGVjdGlvbi5cbiAgICAvLyBPbmx5IEFwcGx5IHByb21vdGVzIGB0ZW1wYCDihpIgYGNvbW1pdHRlZGAgYW5kIG5vdGlmaWVzIHRoZSBwYXJlbnQuXG4gICAgY29uc3QgW3RlbXAsIHNldFRlbXBdID0gdXNlU3RhdGUoaW5pdGlhbFZhbHVlKTtcbiAgICBjb25zdCBbY29tbWl0dGVkLCBzZXRDb21taXR0ZWRdID0gdXNlU3RhdGUoaW5pdGlhbFZhbHVlKTtcbiAgICBjb25zdCBncm91cGVkRGF0YSA9IHVzZU1lbW8oKCkgPT4gdG9Hcm91cGVkRGF0YShvcHRpb25zKSwgW29wdGlvbnNdKTtcbiAgICBjb25zdCBhbGxWYWx1ZXMgPSB1c2VNZW1vKCgpID0+IG9wdGlvbnMubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSksIFtvcHRpb25zXSk7XG4gICAgY29uc3Qgb3B0aW9uQnlWYWx1ZSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiBtYXAuc2V0KG9wdGlvbi52YWx1ZSwgb3B0aW9uKSk7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgfSwgW29wdGlvbnNdKTtcbiAgICAvLyBUaGUgXCJBbGxcIiByb3cgaXMgY2hlY2tlZCBleGFjdGx5IHdoZW4gbm90aGluZyBzcGVjaWZpYyBpcyBzZWxlY3RlZC5cbiAgICBjb25zdCBhbGxDaGVja2VkID0gdGVtcC5sZW5ndGggPT09IDA7XG4gICAgY29uc3QgZmlsdGVyT3B0aW9uID0gdXNlQ2FsbGJhY2soKHNlYXJjaFZhbHVlLCBvcHRpb24pID0+IHtcbiAgICAgICAgY29uc3QgdGVybSA9IHNlYXJjaFZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXRlcm0pXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgbWFwcGVkID0gb3B0aW9uO1xuICAgICAgICByZXR1cm4gc2VhcmNoS2V5cy5zb21lKChrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0ga2V5ID09PSAnbGFiZWwnID8gbWFwcGVkLmxhYmVsIDogbWFwcGVkLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBmaWVsZCA9PT0gJ3N0cmluZycgJiYgZmllbGQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKTtcbiAgICAgICAgfSk7XG4gICAgfSwgW3NlYXJjaEtleXNdKTtcbiAgICB1c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgKCkgPT4gKHtcbiAgICAgICAgY2xlYXI6ICgpID0+IHtcbiAgICAgICAgICAgIHNldFRlbXAoW10pO1xuICAgICAgICAgICAgc2V0Q29tbWl0dGVkKFtdKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIHNldFRlbXAoaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgICAgIHNldENvbW1pdHRlZChpbml0aWFsVmFsdWUpO1xuICAgICAgICAgICAgb25SZXNldCA9PT0gbnVsbCB8fCBvblJlc2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblJlc2V0KGluaXRpYWxWYWx1ZSk7XG4gICAgICAgIH0sXG4gICAgfSksIFtpbml0aWFsVmFsdWUsIG9uUmVzZXRdKTtcbiAgICBjb25zdCBoYW5kbGVTZWxlY3RDaGFuZ2UgPSB1c2VDYWxsYmFjaygobmV4dCkgPT4ge1xuICAgICAgICBjb25zdCBuZXh0VmFsdWVzID0gKEFycmF5LmlzQXJyYXkobmV4dCkgPyBuZXh0IDogW10pLm1hcChTdHJpbmcpO1xuICAgICAgICAvLyBXaXRoIGFuIFwiQWxsXCIgcm93LCBzZWxlY3RpbmcgZXZlcnkgY29uY3JldGUgb3B0aW9uIGNvbGxhcHNlcyB0byBcImFsbFwiXG4gICAgICAgIC8vIChbXSksIG1hdGNoaW5nIHRoZSBiYWNrZW5kIGNvbnZlbnRpb24gdGhhdCBlbXB0eSA9PSBubyBmaWx0ZXIuIFdpdGhvdXRcbiAgICAgICAgLy8gYW4gXCJBbGxcIiByb3cgKGUuZy4gcmVjaXBpZW50cyksIGEgZnVsbCBzZWxlY3Rpb24gc3RheXMgZXhwbGljaXQgc28gdGhlXG4gICAgICAgIC8vIHRyaWdnZXIgc3RpbGwgc3VtbWFyaXplcyBpdCAoXCJOYW1lICsgTiBtb3JlXCIpLlxuICAgICAgICBjb25zdCBjb2xsYXBzZSA9ICEhYWxsTGFiZWwgJiYgbmV4dFZhbHVlcy5sZW5ndGggPT09IGFsbFZhbHVlcy5sZW5ndGg7XG4gICAgICAgIHNldFRlbXAoY29sbGFwc2UgPyBbXSA6IG5leHRWYWx1ZXMpO1xuICAgIH0sIFthbGxMYWJlbCwgYWxsVmFsdWVzXSk7XG4gICAgY29uc3QgaGFuZGxlQWxsQ2xpY2sgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIC8vIFRoZSBcIkFsbFwiIHJvdyBpcyBleGNsdXNpdmU6IHR1cm5pbmcgaXQgb24gY2xlYXJzIHNwZWNpZmljIHBpY2tzLlxuICAgICAgICBzZXRUZW1wKFtdKTtcbiAgICB9LCBbXSk7XG4gICAgY29uc3QgaGFuZGxlQXBwbHkgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIHNldENvbW1pdHRlZCh0ZW1wKTtcbiAgICAgICAgb25BcHBseSh0ZW1wKTtcbiAgICAgICAgc2V0T3BlbihmYWxzZSk7XG4gICAgfSwgW3RlbXAsIG9uQXBwbHldKTtcbiAgICBjb25zdCBoYW5kbGVSZXNldCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgc2V0VGVtcChpbml0aWFsVmFsdWUpO1xuICAgICAgICBzZXRDb21taXR0ZWQoaW5pdGlhbFZhbHVlKTtcbiAgICAgICAgb25SZXNldCA9PT0gbnVsbCB8fCBvblJlc2V0ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblJlc2V0KGluaXRpYWxWYWx1ZSk7XG4gICAgfSwgW2luaXRpYWxWYWx1ZSwgb25SZXNldF0pO1xuICAgIGNvbnN0IGhhbmRsZU9wZW5DaGFuZ2UgPSB1c2VDYWxsYmFjaygobmV4dE9wZW4pID0+IHtcbiAgICAgICAgc2V0T3BlbihuZXh0T3Blbik7XG4gICAgICAgIGlmIChuZXh0T3BlbilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gQ2xvc2luZyB3aXRob3V0IEFwcGx5IGRpc2NhcmRzIHRoZSBkcmFmdC5cbiAgICAgICAgc2V0VGVtcChjb21taXR0ZWQpO1xuICAgICAgICBpZiAoc2VhcmNoKVxuICAgICAgICAgICAgc2V0S2V5d29yZCgnJyk7XG4gICAgfSwgW2NvbW1pdHRlZCwgc2VhcmNoXSk7XG4gICAgY29uc3QgcmVuZGVyUm93ID0gdXNlQ2FsbGJhY2soKG9wdGlvbiwgY2hlY2tlZCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXh0ID0gdHlwZW9mIG9wdGlvbi5sYWJlbCA9PT0gJ3N0cmluZycgPyBvcHRpb24ubGFiZWwgOiAnJztcbiAgICAgICAgcmV0dXJuIChfanN4cyhGbGV4LCB7IGFsaWduOiAnY2VudGVyJywganVzdGlmeTogJ3NwYWNlLWJldHdlZW4nLCBnYXA6IDgsIGNsYXNzTmFtZTogYCR7V1JBUF9DTFN9X19yb3dgLCBjaGlsZHJlbjogW19qc3hzKEZsZXgsIHsgYWxpZ246ICdjZW50ZXInLCBnYXA6IDgsIGNsYXNzTmFtZTogYCR7V1JBUF9DTFN9X19yb3ctbWFpbmAsIGNoaWxkcmVuOiBbb3B0aW9uLmljb25VcmwgJiYgKF9qc3goXCJpbWdcIiwgeyBzcmM6IG9wdGlvbi5pY29uVXJsLCBhbHQ6IHRleHQsIHdpZHRoOiBJQ09OX1NJWkUsIGhlaWdodDogSUNPTl9TSVpFLCBjbGFzc05hbWU6IElDT05fQ0xTIH0pKSwgX2pzeHMoRmxleCwgeyB2ZXJ0aWNhbDogdHJ1ZSwgZ2FwOiAwLCBhbGlnbjogJ3N0YXJ0JywgY2xhc3NOYW1lOiBgJHtXUkFQX0NMU31fX3Jvdy10ZXh0YCwgY2hpbGRyZW46IFtfanN4cyhGbGV4LCB7IGFsaWduOiAnY2VudGVyJywgZ2FwOiA4LCBjbGFzc05hbWU6IGAke1dSQVBfQ0xTfV9fcm93LWxhYmVsYCwgY2hpbGRyZW46IFtfanN4KFR5cG9ncmFwaHlMYWJlbCwgeyBzaXplOiAnbWQnLCBjaGlsZHJlbjogb3B0aW9uLmxhYmVsIH0pLCBvcHRpb24udGFnICYmIF9qc3goVGFnLCB7IGxhYmVsOiBvcHRpb24udGFnLCBzaXplOiAnc21hbGwnLCBjb2xvcjogJ3JlY29tbWVuZGVkJyB9KV0gfSksIG9wdGlvbi5kZXNjcmlwdGlvbiAmJiAoX2pzeChUeXBvZ3JhcGh5Qm9keSwgeyBzaXplOiAnc20nLCBjb2xvcjogJ2RlZmF1bHQtdGVydGlhcnknLCBjaGlsZHJlbjogb3B0aW9uLmRlc2NyaXB0aW9uIH0pKV0gfSldIH0pLCBfanN4KENoZWNrYm94LCB7IGNoZWNrZWQ6IGNoZWNrZWQsIHJlYWRPbmx5OiB0cnVlLCBjbGFzc05hbWU6IGAke1dSQVBfQ0xTfV9fcm93LWNoZWNrYCB9KV0gfSkpO1xuICAgIH0sIFtdKTtcbiAgICAvLyBUaGUgdHJpZ2dlciByZWZsZWN0cyB0aGUgQ09NTUlUVEVEIHNlbGVjdGlvbiAobm90IHRoZSBpbi1wYW5lbCBkcmFmdCkuXG4gICAgLy8gYHJlbmRlclZhbHVlYCBzaG9ydC1jaXJjdWl0cyBTZWxlY3QncyBvd24gcGxhY2Vob2xkZXIgaGFuZGxpbmcsIHNvIHRoZVxuICAgIC8vIGVtcHR5IHN0YXRlIG11c3QgcmV0dXJuIHRoZSBwbGFjZWhvbGRlciBleHBsaWNpdGx5LlxuICAgIGNvbnN0IHJlbmRlclZhbHVlID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgICAgICBpZiAoYWxsQ2hlY2tlZCkge1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IGFsbExhYmVsICE9PSBudWxsICYmIGFsbExhYmVsICE9PSB2b2lkIDAgPyBhbGxMYWJlbCA6IHBsYWNlaG9sZGVyO1xuICAgICAgICAgICAgcmV0dXJuIChfanN4KFR5cG9ncmFwaHlCb2R5LCB7IHNpemU6ICdtZCcsIGNvbG9yOiBhbGxMYWJlbCA/ICdkZWZhdWx0JyA6ICdkZWZhdWx0LXRlcnRpYXJ5JywgY2xhc3NOYW1lOiBgJHtXUkFQX0NMU31fX3ZhbHVlYCwgY2hpbGRyZW46IHRleHQgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpcnN0ID0gb3B0aW9uQnlWYWx1ZS5nZXQoY29tbWl0dGVkWzBdKTtcbiAgICAgICAgY29uc3QgZmlyc3RMYWJlbCA9IGZpcnN0ID8gZmlyc3QubGFiZWwgOiBjb21taXR0ZWRbMF07XG4gICAgICAgIGNvbnN0IGV4dHJhID0gY29tbWl0dGVkLmxlbmd0aCAtIDE7XG4gICAgICAgIHJldHVybiAoX2pzeHMoVHlwb2dyYXBoeUJvZHksIHsgc2l6ZTogJ21kJywgY2xhc3NOYW1lOiBgJHtXUkFQX0NMU31fX3ZhbHVlYCwgY2hpbGRyZW46IFtmaXJzdExhYmVsLCBleHRyYSA+IDAgJiYgKF9qc3goXCJzcGFuXCIsIHsgY2xhc3NOYW1lOiBgJHtXUkFQX0NMU31fX3ZhbHVlLW1vcmVgLCBjaGlsZHJlbjogTU9SRV9TVUZGSVgoZXh0cmEpIH0pKV0gfSkpO1xuICAgIH0sIFthbGxDaGVja2VkLCBhbGxMYWJlbCwgcGxhY2Vob2xkZXIsIGNvbW1pdHRlZCwgb3B0aW9uQnlWYWx1ZV0pO1xuICAgIHJldHVybiAoX2pzeChTZWxlY3QsIE9iamVjdC5hc3NpZ24oe30sIHJlc3QsIHsgbXVsdGlwbGU6IHRydWUsIHNpemU6IHNpemUsIGxhYmVsOiBsYWJlbCwgcGxhY2Vob2xkZXI6IHBsYWNlaG9sZGVyLCBjbGFzc05hbWU6IGpvaW5DbHMoV1JBUF9DTFMsIGNsYXNzTmFtZSksIHBhbmVsQ2xhc3NOYW1lOiBQQU5FTF9DTFMsIGdyb3VwTGFiZWxDbGFzc05hbWU6IEdST1VQX0xBQkVMX0NMUywgdmFsdWU6IHRlbXAsIG9wZW46IG9wZW4sIG9uT3BlbkNoYW5nZTogaGFuZGxlT3BlbkNoYW5nZSwgb25DaGFuZ2U6IGhhbmRsZVNlbGVjdENoYW5nZSwgc2VhcmNoYWJsZTogc2VhcmNoLCBzZWFyY2hQbGFjZWhvbGRlcjogc2VhcmNoUGxhY2Vob2xkZXIsIHNlYXJjaFZhbHVlOiBrZXl3b3JkLCBvblNlYXJjaENoYW5nZTogc2V0S2V5d29yZCwgZmlsdGVyT3B0aW9uOiBmaWx0ZXJPcHRpb24sIG9wdGlvbnM6IGdyb3VwZWREYXRhLCBwYW5lbEhlYWRlcjogYWxsTGFiZWwgPyAoX2pzeHMoXCJidXR0b25cIiwgeyB0eXBlOiAnYnV0dG9uJywgY2xhc3NOYW1lOiBqb2luQ2xzKGAke1dSQVBfQ0xTfV9fYWxsYCwgYWxsQ2hlY2tlZCAmJiBgJHtXUkFQX0NMU31fX2FsbC0tY2hlY2tlZGApLCBvbkNsaWNrOiBoYW5kbGVBbGxDbGljaywgY2hpbGRyZW46IFtfanN4KFR5cG9ncmFwaHlMYWJlbCwgeyBzaXplOiAnbWQnLCBjaGlsZHJlbjogYWxsTGFiZWwgfSksIF9qc3goQ2hlY2tib3gsIHsgY2hlY2tlZDogYWxsQ2hlY2tlZCwgcmVhZE9ubHk6IHRydWUsIGNsYXNzTmFtZTogYCR7V1JBUF9DTFN9X19yb3ctY2hlY2tgIH0pXSB9KSkgOiB1bmRlZmluZWQsIGVtcHR5Q29udGVudDogc2VhcmNoRW1wdHksIHJlbmRlclZhbHVlOiByZW5kZXJWYWx1ZSwgcmVuZGVyT3B0aW9uOiAob3B0aW9uLCBtZXRhKSA9PiByZW5kZXJSb3cob3B0aW9uLCBtZXRhLnNlbGVjdGVkKSwgcGFuZWxGb290ZXI6IF9qc3hzKEZsZXgsIHsgZ2FwOiA4LCBjbGFzc05hbWU6IGAke1dSQVBfQ0xTfV9fZm9vdGVyYCwgY2hpbGRyZW46IFtfanN4KEJ1dHRvbiwgeyBjb2xvcjogJ2dyZXknLCBzaXplOiAnc21hbGwnLCBzdHlsZTogRlVMTF9XSURUSF9TVFlMRSwgb25DbGljazogaGFuZGxlUmVzZXQsIGNoaWxkcmVuOiBSRVNFVF9MQUJFTCB9KSwgX2pzeChCdXR0b24sIHsgY29sb3I6ICdwcmltYXJ5Jywgc2l6ZTogJ3NtYWxsJywgc3R5bGU6IEZVTExfV0lEVEhfU1RZTEUsIFxuICAgICAgICAgICAgICAgICAgICAvLyBXaXRoIGFuIFwiQWxsXCIgcm93LCBhbiBlbXB0eSBkcmFmdCBtZWFucyBcImFsbFwiICh2YWxpZCkuIFdpdGhvdXRcbiAgICAgICAgICAgICAgICAgICAgLy8gb25lLCBhbiBlbXB0eSBkcmFmdCBtZWFucyBcIm5vdGhpbmcgcGlja2VkXCIg4oCUIGJsb2NrIEFwcGx5LlxuICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogIWFsbExhYmVsICYmIHRlbXAubGVuZ3RoID09PSAwLCBvbkNsaWNrOiBoYW5kbGVBcHBseSwgY2hpbGRyZW46IEFQUExZX0xBQkVMIH0pXSB9KSB9KSkpO1xufTtcbmV4cG9ydCBjb25zdCBEcm9wZG93bkZpbHRlciA9IG1lbW8oRHJvcGRvd25GaWx0ZXJCYXNlKTsiLG51bGxdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjIn0=
@@ -1,2 +0,0 @@
1
- export { DropdownFilter } from './Dropdown';
2
- export * from './interface';
@@ -1,28 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- var _exportNames = {
7
- DropdownFilter: true
8
- };
9
- Object.defineProperty(exports, "DropdownFilter", {
10
- enumerable: true,
11
- get: function get() {
12
- return _Dropdown.DropdownFilter;
13
- }
14
- });
15
- var _Dropdown = require("./Dropdown");
16
- var _interface = require("./interface");
17
- Object.keys(_interface).forEach(function (key) {
18
- if (key === "default" || key === "__esModule") return;
19
- if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
20
- if (key in exports && exports[key] === _interface[key]) return;
21
- Object.defineProperty(exports, key, {
22
- enumerable: true,
23
- get: function get() {
24
- return _interface[key];
25
- }
26
- });
27
- });
28
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJ1c2luZXNzL0ZpbHRlci9zcmMvYnVzaW5lc3MvRmlsdGVyL0Ryb3Bkb3duL2luZGV4LnRzIl0sIm5hbWVzIjpbIl9Ecm9wZG93biIsInJlcXVpcmUiLCJfaW50ZXJmYWNlIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJrZXkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJfZXhwb3J0TmFtZXMiLCJleHBvcnRzIiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUFBLElBQUFBLFNBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFVBQUEsR0FBQUQsT0FBQTtBQUFBRSxNQUFBLENBQUFDLElBQUEsQ0FBQUYsVUFBQSxFQUFBRyxPQUFBLFdBQUFDLEdBQUE7RUFBQSxJQUFBQSxHQUFBLGtCQUFBQSxHQUFBO0VBQUEsSUFBQUgsTUFBQSxDQUFBSSxTQUFBLENBQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBQyxZQUFBLEVBQUFKLEdBQUE7RUFBQSxJQUFBQSxHQUFBLElBQUFLLE9BQUEsSUFBQUEsT0FBQSxDQUFBTCxHQUFBLE1BQUFKLFVBQUEsQ0FBQUksR0FBQTtFQUFBSCxNQUFBLENBQUFTLGNBQUEsQ0FBQUQsT0FBQSxFQUFBTCxHQUFBO0lBQUFPLFVBQUE7SUFBQUMsR0FBQSxXQUFBQSxJQUFBO01BQUEsT0FBQVosVUFBQSxDQUFBSSxHQUFBO0lBQUE7RUFBQTtBQUFBIiwiZmlsZSI6ImJ1c2luZXNzL0ZpbHRlci9Ecm9wZG93bi9pbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbbnVsbF0sInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMifQ==
@@ -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,6 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVzaW5lc3MvRmlsdGVyL0Ryb3Bkb3duL2ludGVyZmFjZS5qcyIsIm5hbWVzIjpbXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYyIsInNvdXJjZXMiOlsiYnVzaW5lc3MvRmlsdGVyL0Ryb3Bkb3duL2ludGVyZmFjZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge307Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119
@@ -1,4 +0,0 @@
1
- "use strict";
2
-
3
- require("./Dropdown.css");
4
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJ1c2luZXNzL0ZpbHRlci9Ecm9wZG93bi9zcmMvYnVzaW5lc3MvRmlsdGVyL0Ryb3Bkb3duL3N0eWxlL2luZGV4LnRzIl0sIm5hbWVzIjpbInJlcXVpcmUiXSwibWFwcGluZ3MiOiI7O0FBQUFBLE9BQUEiLCJmaWxlIjoiYnVzaW5lc3MvRmlsdGVyL0Ryb3Bkb3duL3N0eWxlL2Nzcy5qcyIsInNvdXJjZXNDb250ZW50IjpbbnVsbF0sInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMifQ==
@@ -1 +0,0 @@
1
- import './Dropdown.css';
@@ -1,4 +0,0 @@
1
- "use strict";
2
-
3
- require("./Dropdown.css");
4
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJ1c2luZXNzL0ZpbHRlci9Ecm9wZG93bi9zcmMvYnVzaW5lc3MvRmlsdGVyL0Ryb3Bkb3duL3N0eWxlL2luZGV4LnRzIl0sIm5hbWVzIjpbInJlcXVpcmUiXSwibWFwcGluZ3MiOiI7O0FBQUFBLE9BQUEiLCJmaWxlIjoiYnVzaW5lc3MvRmlsdGVyL0Ryb3Bkb3duL3N0eWxlL2luZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOltudWxsXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYyJ9