@ethisyscore/plugin-ui 1.71.4 → 1.71.6
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.
- package/README.md +1 -0
- package/dist/components/connectors/index.cjs +314 -0
- package/dist/components/connectors/index.cjs.map +1 -0
- package/dist/components/connectors/index.d.cts +177 -0
- package/dist/components/connectors/index.d.ts +177 -0
- package/dist/components/connectors/index.js +306 -0
- package/dist/components/connectors/index.js.map +1 -0
- package/package.json +7 -2
package/README.md
CHANGED
|
@@ -23,6 +23,7 @@ and the shared MUI component surface externalised to the host's instances.
|
|
|
23
23
|
| `./components/shared` | `ConfirmActionDialog`, `ConfirmDeleteDialog`, `useToast`, `showSuccessToast` / `showErrorToast` / `showWarningToast` | Composite confirmation dialogs and toast notifications |
|
|
24
24
|
| `./components/data-grid` | `PersistentDataGrid`, `setGridUserId` / `getGridUserId`, `buildDataGridPaginationProps`, `PAGE_SIZE_OPTIONS` / `DEFAULT_PAGE_SIZE`, grid-state persistence helpers | The shared list-page grid with per-user state persistence. Needs the **optional peer** `@mui/x-data-grid` |
|
|
25
25
|
| `./components/date` | `DateInput` / `DateInputProps`, `toIsoString` / `parseIsoValue`, `DATE_INPUT_MIN` / `DATE_INPUT_MAX`, `DateInputType` | The shared date / datetime field over MUI X pickers, speaking ISO strings. Needs the **optional peers** `@mui/x-date-pickers` and `dayjs` |
|
|
26
|
+
| `./components/connectors` | `MappingCompletenessBanner`, `selectRequiredIncompleteOperations` / `selectOptionalIncompleteOperations` / `selectIncompleteOperations` / `selectMappingReadiness`, `connectorMappingsQueryKey` / `connectorMappingCompletenessQueryKey`, `MappingCompletenessItem` / `MappingCompletenessResult` | The shared Tool Mappings completeness surface for any module that reaches an external system through a connector. Needs the **optional peer** `@mui/material`. Carries two fixes a copy loses: the banner says FIELDS rather than tools, and the completeness query key is nested under the mappings key so one invalidation covers both |
|
|
26
27
|
| `./a11y` | `useA11yAnnounce` | Accessible live-region announcement hook |
|
|
27
28
|
| `./l10n` | `usePluginLocale` / `PluginLocale` | Locale + direction/RTL helper |
|
|
28
29
|
| `./token` | `useFrontendSessionToken`, `useAuth`, `decodeJwtPayload` | Frontend session token + JWT auth utilities |
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var material = require('@mui/material');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
|
|
7
|
+
// src/components/ui/index.ts
|
|
8
|
+
function NiCross({ className, variant = "outlined", size = "medium" }) {
|
|
9
|
+
const iconSize = sizeHelper(size);
|
|
10
|
+
const iconStrokeWidth = strokeSizeHelper(iconSize);
|
|
11
|
+
if (variant === "outlined") {
|
|
12
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
13
|
+
"svg",
|
|
14
|
+
{
|
|
15
|
+
width: iconSize,
|
|
16
|
+
height: iconSize,
|
|
17
|
+
className,
|
|
18
|
+
viewBox: "0 0 24 24",
|
|
19
|
+
fill: "none",
|
|
20
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
21
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
22
|
+
"path",
|
|
23
|
+
{
|
|
24
|
+
d: "M8.00016 8L12.0001 12M12.0001 12L16 16.0002M12.0001 12L16 8.00015M12.0001 12L8 16.0002",
|
|
25
|
+
stroke: "currentColor",
|
|
26
|
+
strokeWidth: iconStrokeWidth,
|
|
27
|
+
strokeLinecap: "round"
|
|
28
|
+
}
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
} else {
|
|
33
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
34
|
+
"svg",
|
|
35
|
+
{
|
|
36
|
+
width: iconSize,
|
|
37
|
+
height: iconSize,
|
|
38
|
+
className,
|
|
39
|
+
viewBox: "0 0 24 24",
|
|
40
|
+
fill: "none",
|
|
41
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
42
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
43
|
+
"path",
|
|
44
|
+
{
|
|
45
|
+
d: "M15.4698 7.46963C15.7626 7.17684 16.2374 7.17684 16.5303 7.46963C16.8232 7.7625 16.8231 8.23728 16.5303 8.53018L13.0606 11.9999L16.5303 15.4696C16.8232 15.7625 16.8231 16.2373 16.5303 16.5302C16.2557 16.8048 15.821 16.8223 15.5264 16.5819L15.4698 16.5302L12 13.0604L8.53032 16.5302C8.23743 16.8231 7.76267 16.8231 7.46977 16.5302C7.17697 16.2373 7.17691 15.7625 7.46977 15.4696L10.9395 11.9999L7.46977 8.53018L7.41801 8.47354C7.1778 8.17898 7.19527 7.74421 7.46977 7.46963C7.76264 7.17676 8.23742 7.17682 8.53032 7.46963L12 10.9394L15.4698 7.46963Z",
|
|
46
|
+
fill: "currentColor"
|
|
47
|
+
}
|
|
48
|
+
)
|
|
49
|
+
}
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function NiSearch({
|
|
54
|
+
className,
|
|
55
|
+
variant = "outlined",
|
|
56
|
+
size = "medium",
|
|
57
|
+
oneTone = false
|
|
58
|
+
}) {
|
|
59
|
+
const iconSize = sizeHelper(size);
|
|
60
|
+
const iconStrokeWidth = strokeSizeHelper(iconSize);
|
|
61
|
+
if (variant === "outlined") {
|
|
62
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
63
|
+
"svg",
|
|
64
|
+
{
|
|
65
|
+
width: iconSize,
|
|
66
|
+
height: iconSize,
|
|
67
|
+
className,
|
|
68
|
+
viewBox: "0 0 24 24",
|
|
69
|
+
fill: "none",
|
|
70
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
71
|
+
children: [
|
|
72
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
73
|
+
"path",
|
|
74
|
+
{
|
|
75
|
+
opacity: oneTone ? 1 : 0.6,
|
|
76
|
+
d: "M22 22L18.5 18.5",
|
|
77
|
+
stroke: "currentColor",
|
|
78
|
+
strokeWidth: iconStrokeWidth,
|
|
79
|
+
strokeLinecap: "round"
|
|
80
|
+
}
|
|
81
|
+
),
|
|
82
|
+
/* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "11.5", cy: "11.5", r: "9.5", stroke: "currentColor", strokeWidth: iconStrokeWidth })
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
} else {
|
|
87
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
88
|
+
"svg",
|
|
89
|
+
{
|
|
90
|
+
width: iconSize,
|
|
91
|
+
height: iconSize,
|
|
92
|
+
className,
|
|
93
|
+
viewBox: "0 0 24 24",
|
|
94
|
+
fill: "none",
|
|
95
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
96
|
+
children: [
|
|
97
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
98
|
+
"path",
|
|
99
|
+
{
|
|
100
|
+
opacity: oneTone ? 1 : 0.4,
|
|
101
|
+
d: "M19.0303 17.9697C18.7374 17.6768 18.2627 17.6768 17.9698 17.9697C17.6769 18.2626 17.6769 18.7373 17.9698 19.0302L21.4698 22.5302C21.7627 22.8231 22.2374 22.8231 22.5303 22.5302C22.8232 22.2373 22.8232 21.7626 22.5303 21.4697L19.0303 17.9697Z",
|
|
102
|
+
fill: "currentColor"
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
106
|
+
"path",
|
|
107
|
+
{
|
|
108
|
+
d: "M11.5 1.25C17.1609 1.25 21.75 5.83908 21.75 11.5C21.75 17.1609 17.1609 21.75 11.5 21.75C5.83908 21.75 1.25 17.1609 1.25 11.5C1.25 5.83908 5.83908 1.25 11.5 1.25Z",
|
|
109
|
+
fill: "currentColor"
|
|
110
|
+
}
|
|
111
|
+
)
|
|
112
|
+
]
|
|
113
|
+
}
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
var sizeHelper = (size) => {
|
|
118
|
+
if (typeof size === "number") {
|
|
119
|
+
return size;
|
|
120
|
+
} else if (size === "large") {
|
|
121
|
+
return 24;
|
|
122
|
+
} else if (size === "small" || size === "tiny") {
|
|
123
|
+
return 16;
|
|
124
|
+
} else {
|
|
125
|
+
return 20;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
var strokeSizeHelper = (size) => {
|
|
129
|
+
if (size === 32) {
|
|
130
|
+
return 1.15;
|
|
131
|
+
} else if (size >= 20) {
|
|
132
|
+
return 1.5;
|
|
133
|
+
} else {
|
|
134
|
+
return 1.75;
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
react.memo(function DebouncedSearchInput2({
|
|
138
|
+
value = "",
|
|
139
|
+
onChange,
|
|
140
|
+
label = "Search",
|
|
141
|
+
delay = 400,
|
|
142
|
+
className
|
|
143
|
+
}) {
|
|
144
|
+
const [localValue, setLocalValue] = react.useState(value);
|
|
145
|
+
const inputId = react.useId();
|
|
146
|
+
const onChangeRef = react.useRef(onChange);
|
|
147
|
+
onChangeRef.current = onChange;
|
|
148
|
+
const lastReportedRef = react.useRef(value);
|
|
149
|
+
const isFirstRender = react.useRef(true);
|
|
150
|
+
react.useEffect(() => {
|
|
151
|
+
setLocalValue(value);
|
|
152
|
+
lastReportedRef.current = value;
|
|
153
|
+
}, [value]);
|
|
154
|
+
react.useEffect(() => {
|
|
155
|
+
if (isFirstRender.current) {
|
|
156
|
+
isFirstRender.current = false;
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (localValue === lastReportedRef.current) return;
|
|
160
|
+
const timer = setTimeout(() => {
|
|
161
|
+
lastReportedRef.current = localValue;
|
|
162
|
+
onChangeRef.current(localValue);
|
|
163
|
+
}, delay);
|
|
164
|
+
return () => clearTimeout(timer);
|
|
165
|
+
}, [localValue, delay]);
|
|
166
|
+
const handleClear = react.useCallback(() => {
|
|
167
|
+
setLocalValue("");
|
|
168
|
+
lastReportedRef.current = "";
|
|
169
|
+
onChangeRef.current("");
|
|
170
|
+
}, []);
|
|
171
|
+
const classes = (...parts) => parts.filter(Boolean).join(" ");
|
|
172
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(material.FormControl, { variant: "filled", size: "medium", className: classes("surface mb-0 w-full", className), children: [
|
|
173
|
+
/* @__PURE__ */ jsxRuntime.jsx(material.InputLabel, { htmlFor: inputId, children: label }),
|
|
174
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
175
|
+
material.FilledInput,
|
|
176
|
+
{
|
|
177
|
+
id: inputId,
|
|
178
|
+
value: localValue,
|
|
179
|
+
onChange: (e) => setLocalValue(e.target.value),
|
|
180
|
+
endAdornment: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
181
|
+
/* @__PURE__ */ jsxRuntime.jsx(material.InputAdornment, { position: "end", className: classes(localValue === "" && "hidden"), children: /* @__PURE__ */ jsxRuntime.jsx(material.IconButton, { edge: "end", onClick: handleClear, "aria-label": "Clear search", children: /* @__PURE__ */ jsxRuntime.jsx(NiCross, { size: "medium", className: "text-text-disabled" }) }) }),
|
|
182
|
+
/* @__PURE__ */ jsxRuntime.jsx(material.InputAdornment, { position: "end", className: classes(localValue !== "" && "hidden"), "aria-hidden": true, children: /* @__PURE__ */ jsxRuntime.jsx(material.IconButton, { edge: "end", disabled: true, tabIndex: -1, children: /* @__PURE__ */ jsxRuntime.jsx(NiSearch, { size: "medium", className: "text-text-disabled" }) }) })
|
|
183
|
+
] })
|
|
184
|
+
}
|
|
185
|
+
)
|
|
186
|
+
] });
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// src/components/connectors/mappingCompleteness.ts
|
|
190
|
+
function hasUnmappedRequiredField(op) {
|
|
191
|
+
return op.unmappedRequiredCanonicalFields.length > 0;
|
|
192
|
+
}
|
|
193
|
+
function selectIncompleteOperations(operations) {
|
|
194
|
+
return operations.filter(hasUnmappedRequiredField);
|
|
195
|
+
}
|
|
196
|
+
function selectRequiredIncompleteOperations(operations) {
|
|
197
|
+
return operations.filter((op) => op.isRequired && hasUnmappedRequiredField(op));
|
|
198
|
+
}
|
|
199
|
+
function selectOptionalIncompleteOperations(operations) {
|
|
200
|
+
return operations.filter((op) => !op.isRequired && hasUnmappedRequiredField(op));
|
|
201
|
+
}
|
|
202
|
+
function selectMappingReadiness(operations) {
|
|
203
|
+
const required = operations.filter((op) => op.isRequired);
|
|
204
|
+
const complete = required.filter(
|
|
205
|
+
(op) => op.isToolMapped && op.unmappedRequiredCanonicalFields.length === 0
|
|
206
|
+
).length;
|
|
207
|
+
return {
|
|
208
|
+
complete,
|
|
209
|
+
total: required.length,
|
|
210
|
+
isReady: required.length > 0 && complete === required.length
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
function MappingCompletenessBanner({
|
|
214
|
+
operations,
|
|
215
|
+
onSuggestWithAi,
|
|
216
|
+
onOpenMappingEditor,
|
|
217
|
+
suggestingOperationKey = null,
|
|
218
|
+
disableSuggest = false
|
|
219
|
+
}) {
|
|
220
|
+
const required = selectRequiredIncompleteOperations(operations);
|
|
221
|
+
const optional = selectOptionalIncompleteOperations(operations);
|
|
222
|
+
if (required.length === 0 && optional.length === 0) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
const renderRow = (op) => {
|
|
226
|
+
const isSuggesting = suggestingOperationKey === op.operationKey;
|
|
227
|
+
return /* @__PURE__ */ jsxRuntime.jsx(material.Box, { children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
228
|
+
material.Stack,
|
|
229
|
+
{
|
|
230
|
+
direction: { xs: "column", sm: "row" },
|
|
231
|
+
spacing: 1,
|
|
232
|
+
alignItems: { xs: "flex-start", sm: "center" },
|
|
233
|
+
justifyContent: "space-between",
|
|
234
|
+
children: [
|
|
235
|
+
/* @__PURE__ */ jsxRuntime.jsxs(material.Box, { children: [
|
|
236
|
+
/* @__PURE__ */ jsxRuntime.jsxs(material.Stack, { direction: "row", spacing: 1, alignItems: "center", sx: { flexWrap: "wrap" }, children: [
|
|
237
|
+
/* @__PURE__ */ jsxRuntime.jsx(material.Typography, { variant: "subtitle2", children: op.label }),
|
|
238
|
+
op.isRequired && /* @__PURE__ */ jsxRuntime.jsx(material.Chip, { label: "Required", size: "small", color: "error", variant: "outlined" }),
|
|
239
|
+
!op.isToolMapped && /* @__PURE__ */ jsxRuntime.jsx(material.Chip, { label: "No tool mapped", size: "small", color: "warning", variant: "outlined" })
|
|
240
|
+
] }),
|
|
241
|
+
/* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "caption", color: "text.secondary", children: [
|
|
242
|
+
"Unmapped required fields: ",
|
|
243
|
+
op.unmappedRequiredCanonicalFields.join(", ")
|
|
244
|
+
] })
|
|
245
|
+
] }),
|
|
246
|
+
/* @__PURE__ */ jsxRuntime.jsxs(material.Stack, { direction: "row", spacing: 1, sx: { flexShrink: 0 }, children: [
|
|
247
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
248
|
+
material.Button,
|
|
249
|
+
{
|
|
250
|
+
size: "small",
|
|
251
|
+
variant: "outlined",
|
|
252
|
+
color: "primary",
|
|
253
|
+
disabled: disableSuggest || isSuggesting || !op.isToolMapped,
|
|
254
|
+
title: !op.isToolMapped ? "Map a tool to this operation before suggesting a field translation" : void 0,
|
|
255
|
+
startIcon: isSuggesting ? /* @__PURE__ */ jsxRuntime.jsx(material.CircularProgress, { size: 14, color: "inherit" }) : void 0,
|
|
256
|
+
onClick: () => onSuggestWithAi(op),
|
|
257
|
+
children: isSuggesting ? "Suggesting\u2026" : "Suggest with AI"
|
|
258
|
+
}
|
|
259
|
+
),
|
|
260
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
261
|
+
material.Button,
|
|
262
|
+
{
|
|
263
|
+
size: "small",
|
|
264
|
+
variant: "text",
|
|
265
|
+
color: "primary",
|
|
266
|
+
onClick: () => onOpenMappingEditor(op),
|
|
267
|
+
children: "Open mapping editor"
|
|
268
|
+
}
|
|
269
|
+
)
|
|
270
|
+
] })
|
|
271
|
+
]
|
|
272
|
+
}
|
|
273
|
+
) }, op.operationKey);
|
|
274
|
+
};
|
|
275
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(material.Box, { sx: { mb: 2 }, children: [
|
|
276
|
+
required.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(material.Alert, { severity: "warning", sx: { mb: optional.length > 0 ? 2 : 0 }, children: [
|
|
277
|
+
/* @__PURE__ */ jsxRuntime.jsx(material.AlertTitle, { children: "Required operations aren't fully mapped" }),
|
|
278
|
+
/* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "body2", sx: { mb: 1.5 }, children: [
|
|
279
|
+
required.length === 1 ? "1 required operation has" : `${required.length} required operations have`,
|
|
280
|
+
" ",
|
|
281
|
+
`fields that aren't mapped to this connector's tools yet. Ethisys Core can't run these reliably until every required field is mapped. Auto-match picks the TOOL, not its fields, so it won't clear these on its own: use "Suggest with AI" or the mapping editor per operation.`
|
|
282
|
+
] }),
|
|
283
|
+
/* @__PURE__ */ jsxRuntime.jsx(material.Stack, { spacing: 1.5, children: required.map(renderRow) })
|
|
284
|
+
] }),
|
|
285
|
+
optional.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(material.Alert, { severity: "info", children: [
|
|
286
|
+
/* @__PURE__ */ jsxRuntime.jsx(material.AlertTitle, { children: "Optional operations aren't fully mapped" }),
|
|
287
|
+
/* @__PURE__ */ jsxRuntime.jsxs(material.Typography, { variant: "body2", sx: { mb: 1.5 }, children: [
|
|
288
|
+
optional.length === 1 ? "1 optional operation has fields that aren't" : `${optional.length} optional operations have fields that aren't`,
|
|
289
|
+
" ",
|
|
290
|
+
`mapped to this connector's tools. These power extra capabilities (e.g. pull-request quality and check-run insights) and stay off until their fields are mapped \u2014 safe to leave if you don't need them, or if this connector doesn't provide a matching tool. Each row below lists exactly which fields are missing; a row without a "No tool mapped" chip already HAS a tool and needs its fields mapped, which auto-match does not do.`
|
|
291
|
+
] }),
|
|
292
|
+
/* @__PURE__ */ jsxRuntime.jsx(material.Stack, { spacing: 1.5, children: optional.map(renderRow) })
|
|
293
|
+
] })
|
|
294
|
+
] });
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// src/components/connectors/mappingQueryKeys.ts
|
|
298
|
+
var CONNECTOR_MAPPINGS_ROOT = "connector-mappings";
|
|
299
|
+
function connectorMappingsQueryKey(connectorId, moduleKey) {
|
|
300
|
+
return [CONNECTOR_MAPPINGS_ROOT, connectorId, moduleKey];
|
|
301
|
+
}
|
|
302
|
+
function connectorMappingCompletenessQueryKey(connectorId, moduleKey) {
|
|
303
|
+
return [...connectorMappingsQueryKey(connectorId, moduleKey), "completeness"];
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
exports.MappingCompletenessBanner = MappingCompletenessBanner;
|
|
307
|
+
exports.connectorMappingCompletenessQueryKey = connectorMappingCompletenessQueryKey;
|
|
308
|
+
exports.connectorMappingsQueryKey = connectorMappingsQueryKey;
|
|
309
|
+
exports.selectIncompleteOperations = selectIncompleteOperations;
|
|
310
|
+
exports.selectMappingReadiness = selectMappingReadiness;
|
|
311
|
+
exports.selectOptionalIncompleteOperations = selectOptionalIncompleteOperations;
|
|
312
|
+
exports.selectRequiredIncompleteOperations = selectRequiredIncompleteOperations;
|
|
313
|
+
//# sourceMappingURL=index.cjs.map
|
|
314
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/icons/nexture/ni-cross.tsx","../../../src/icons/nexture/ni-search.tsx","../../../src/icons/nexture-icons.tsx","../../../src/components/ui/DebouncedSearchInput.tsx","../../../src/components/connectors/mappingCompleteness.ts","../../../src/components/connectors/MappingCompletenessBanner.tsx","../../../src/components/connectors/mappingQueryKeys.ts"],"names":["jsx","jsxs","memo","DebouncedSearchInput","useState","useId","useRef","useEffect","useCallback","FormControl","InputLabel","FilledInput","Fragment","InputAdornment","IconButton","Box","Stack","Typography","Chip","Button","CircularProgress","Alert","AlertTitle"],"mappings":"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","file":"index.cjs","sourcesContent":["import { NextureIconsProps, sizeHelper, strokeSizeHelper } from \"../nexture-icons\";\n\nexport default function NiCross({ className, variant = \"outlined\", size = \"medium\" }: NextureIconsProps) {\n const iconSize = sizeHelper(size);\n const iconStrokeWidth = strokeSizeHelper(iconSize);\n\n if (variant === \"outlined\") {\n return (\n <svg\n width={iconSize}\n height={iconSize}\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.00016 8L12.0001 12M12.0001 12L16 16.0002M12.0001 12L16 8.00015M12.0001 12L8 16.0002\"\n stroke=\"currentColor\"\n strokeWidth={iconStrokeWidth}\n strokeLinecap=\"round\"\n />\n </svg>\n );\n } else {\n return (\n <svg\n width={iconSize}\n height={iconSize}\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M15.4698 7.46963C15.7626 7.17684 16.2374 7.17684 16.5303 7.46963C16.8232 7.7625 16.8231 8.23728 16.5303 8.53018L13.0606 11.9999L16.5303 15.4696C16.8232 15.7625 16.8231 16.2373 16.5303 16.5302C16.2557 16.8048 15.821 16.8223 15.5264 16.5819L15.4698 16.5302L12 13.0604L8.53032 16.5302C8.23743 16.8231 7.76267 16.8231 7.46977 16.5302C7.17697 16.2373 7.17691 15.7625 7.46977 15.4696L10.9395 11.9999L7.46977 8.53018L7.41801 8.47354C7.1778 8.17898 7.19527 7.74421 7.46977 7.46963C7.76264 7.17676 8.23742 7.17682 8.53032 7.46963L12 10.9394L15.4698 7.46963Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n","import { NextureIconsProps, sizeHelper, strokeSizeHelper } from \"../nexture-icons\";\n\nexport default function NiSearch({\n className,\n variant = \"outlined\",\n size = \"medium\",\n oneTone = false,\n}: NextureIconsProps) {\n const iconSize = sizeHelper(size);\n const iconStrokeWidth = strokeSizeHelper(iconSize);\n if (variant === \"outlined\") {\n return (\n <svg\n width={iconSize}\n height={iconSize}\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n opacity={oneTone ? 1 : 0.6}\n d=\"M22 22L18.5 18.5\"\n stroke=\"currentColor\"\n strokeWidth={iconStrokeWidth}\n strokeLinecap=\"round\"\n />\n <circle cx=\"11.5\" cy=\"11.5\" r=\"9.5\" stroke=\"currentColor\" strokeWidth={iconStrokeWidth} />\n </svg>\n );\n } else {\n return (\n <svg\n width={iconSize}\n height={iconSize}\n className={className}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n opacity={oneTone ? 1 : 0.4}\n d=\"M19.0303 17.9697C18.7374 17.6768 18.2627 17.6768 17.9698 17.9697C17.6769 18.2626 17.6769 18.7373 17.9698 19.0302L21.4698 22.5302C21.7627 22.8231 22.2374 22.8231 22.5303 22.5302C22.8232 22.2373 22.8232 21.7626 22.5303 21.4697L19.0303 17.9697Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M11.5 1.25C17.1609 1.25 21.75 5.83908 21.75 11.5C21.75 17.1609 17.1609 21.75 11.5 21.75C5.83908 21.75 1.25 17.1609 1.25 11.5C1.25 5.83908 5.83908 1.25 11.5 1.25Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n }\n}\n","import NiAI from \"./nexture/ni-ai\";\nimport NiAirBalloon from \"./nexture/ni-air-balloon\";\nimport NiAnchor from \"./nexture/ni-anchor\";\nimport NiAnnouncement from \"./nexture/ni-announcement\";\nimport NiAntenna from \"./nexture/ni-antenna\";\nimport NiArchive from \"./nexture/ni-archive\";\nimport NiArchiveCheck from \"./nexture/ni-archive-check\";\nimport NiArrowCircleLeft from \"./nexture/ni-arrow-circle-left\";\nimport NiArrowCircleRight from \"./nexture/ni-arrow-circle-right\";\nimport NiArrowDown from \"./nexture/ni-arrow-down\";\nimport NiArrowDownLeft from \"./nexture/ni-arrow-down-left\";\nimport NiArrowDownLeftSquare from \"./nexture/ni-arrow-down-left-square\";\nimport NiArrowDownRight from \"./nexture/ni-arrow-down-right\";\nimport NiArrowDownRightSquare from \"./nexture/ni-arrow-down-right-square\";\nimport NiArrowDownSquare from \"./nexture/ni-arrow-down-square\";\nimport NiArrowHistory from \"./nexture/ni-arrow-history\";\nimport NiArrowInDown from \"./nexture/ni-arrow-in-down\";\nimport NiArrowInLeft from \"./nexture/ni-arrow-in-left\";\nimport NiArrowInRight from \"./nexture/ni-arrow-in-right\";\nimport NiArrowInUp from \"./nexture/ni-arrow-in-up\";\nimport NiArrowLeft from \"./nexture/ni-arrow-left\";\nimport NiArrowLeftRight from \"./nexture/ni-arrow-left-right\";\nimport NiArrowLeftSquare from \"./nexture/ni-arrow-left-square\";\nimport NiArrowOutDown from \"./nexture/ni-arrow-out-down\";\nimport NiArrowOutLeft from \"./nexture/ni-arrow-out-left\";\nimport NiArrowOutRight from \"./nexture/ni-arrow-out-right\";\nimport NiArrowOutUp from \"./nexture/ni-arrow-out-up\";\nimport NiArrowRight from \"./nexture/ni-arrow-right\";\nimport NiArrowRightSquare from \"./nexture/ni-arrow-right-square\";\nimport NiArrowUp from \"./nexture/ni-arrow-up\";\nimport NiArrowUpDown from \"./nexture/ni-arrow-up-down\";\nimport NiArrowUpLeft from \"./nexture/ni-arrow-up-left\";\nimport NiArrowUpLeftSquare from \"./nexture/ni-arrow-up-left-square\";\nimport NiArrowUpRight from \"./nexture/ni-arrow-up-right\";\nimport NiArrowUpRightSquare from \"./nexture/ni-arrow-up-right-square\";\nimport NiArrowUpSquare from \"./nexture/ni-arrow-up-square\";\nimport NiAt from \"./nexture/ni-at\";\nimport NiBadge from \"./nexture/ni-badge\";\nimport NiBadgeCheck from \"./nexture/ni-badge-check\";\nimport NiBag from \"./nexture/ni-bag\";\nimport NiBandAid from \"./nexture/ni-band-aid\";\nimport NiBarcode from \"./nexture/ni-barcode\";\nimport NiBasket from \"./nexture/ni-basket\";\nimport NiBatteryCharging from \"./nexture/ni-battery-charging\";\nimport NiBatteryEmpty from \"./nexture/ni-battery-empty\";\nimport NiBatteryFull from \"./nexture/ni-battery-full\";\nimport NiBell from \"./nexture/ni-bell\";\nimport NiBellInactive from \"./nexture/ni-bell-inactive\";\nimport NiBinEmpty from \"./nexture/ni-bin-empty\";\nimport NiBinFull from \"./nexture/ni-bin-full\";\nimport NiBloodCells from \"./nexture/ni-blood-cells\";\nimport NiBluetooth from \"./nexture/ni-bluetooth\";\nimport NiBook from \"./nexture/ni-book\";\nimport NiBookmark from \"./nexture/ni-bookmark\";\nimport NiBookmarkSingle from \"./nexture/ni-bookmark-single\";\nimport NiBraces from \"./nexture/ni-braces\";\nimport NiBrackets from \"./nexture/ni-brackets\";\nimport NiBrain from \"./nexture/ni-brain\";\nimport NiBrainCircuit from \"./nexture/ni-brain-circuit\";\nimport NiBriefcase from \"./nexture/ni-briefcase\";\nimport NiBrush from \"./nexture/ni-brush\";\nimport NiBrushArt from \"./nexture/ni-brush-art\";\nimport NiBrushArtSquare from \"./nexture/ni-brush-art-square\";\nimport NiBug from \"./nexture/ni-bug\";\nimport NiBuilding from \"./nexture/ni-building\";\nimport NiBulbOff from \"./nexture/ni-bulb-off\";\nimport NiBulbOn from \"./nexture/ni-bulb-on\";\nimport NiButton from \"./nexture/ni-button\";\nimport NiButtonGroup from \"./nexture/ni-button-group\";\nimport NiButtonLarge from \"./nexture/ni-button-large\";\nimport NiCake from \"./nexture/ni-cake\";\nimport NiCalendar from \"./nexture/ni-calendar\";\nimport NiCalendarClock from \"./nexture/ni-calendar-clock\";\nimport NiCamera from \"./nexture/ni-camera\";\nimport NiCar from \"./nexture/ni-car\";\nimport NiCartArrow from \"./nexture/ni-cart-arrow\";\nimport NiCartCross from \"./nexture/ni-cart-cross\";\nimport NiCartEmpty from \"./nexture/ni-cart-empty\";\nimport NiCartMinus from \"./nexture/ni-cart-minus\";\nimport NiCartPlus from \"./nexture/ni-cart-plus\";\nimport NiCatalog from \"./nexture/ni-catalog\";\nimport NiCells from \"./nexture/ni-cells\";\nimport NiCellsPlus from \"./nexture/ni-cells-plus\";\nimport NiChange from \"./nexture/ni-change\";\nimport NiChartBar from \"./nexture/ni-chart-bar\";\nimport NiChartCandleSticks from \"./nexture/ni-chart-candle-sticks\";\nimport NiChartFunnel from \"./nexture/ni-chart-funnel\";\nimport NiChartHeatmap from \"./nexture/ni-chart-heatmap\";\nimport NiChartLine from \"./nexture/ni-chart-line\";\nimport NiChartLineBar from \"./nexture/ni-chart-line-bar\";\nimport NiChartPie from \"./nexture/ni-chart-pie\";\nimport NiChartPolar from \"./nexture/ni-chart-polar\";\nimport NiChartRadar from \"./nexture/ni-chart-radar\";\nimport NiChartScatter from \"./nexture/ni-chart-scatter\";\nimport NiCheck from \"./nexture/ni-check\";\nimport NiCheckFull from \"./nexture/ni-check-full\";\nimport NiCheckSquare from \"./nexture/ni-check-square\";\nimport NiChef from \"./nexture/ni-chef\";\nimport NiChevronDown from \"./nexture/ni-chevron-down\";\nimport NiChevronDownSmall from \"./nexture/ni-chevron-down-small\";\nimport NiChevronLeft from \"./nexture/ni-chevron-left\";\nimport NiChevronLeftRightReverseSmall from \"./nexture/ni-chevron-left-right-reverse-small\";\nimport NiChevronLeftRightSmall from \"./nexture/ni-chevron-left-right-small\";\nimport NiChevronLeftSmall from \"./nexture/ni-chevron-left-small\";\nimport NiChevronRight from \"./nexture/ni-chevron-right\";\nimport NiChevronRightSmall from \"./nexture/ni-chevron-right-small\";\nimport NiChevronUp from \"./nexture/ni-chevron-up\";\nimport NiChevronUpDownReverseSmall from \"./nexture/ni-chevron-up-down-reverse-small\";\nimport NiChevronUpDownSmall from \"./nexture/ni-chevron-up-down-small\";\nimport NiChevronUpSmall from \"./nexture/ni-chevron-up-small\";\nimport NiCholesterol from \"./nexture/ni-cholesterol\";\nimport NiCircle from \"./nexture/ni-circle\";\nimport NiClipboard from \"./nexture/ni-clipboard\";\nimport NiClock from \"./nexture/ni-clock\";\nimport NiCloud from \"./nexture/ni-cloud\";\nimport NiCloudPartly from \"./nexture/ni-cloud-partly\";\nimport NiCloudRain from \"./nexture/ni-cloud-rain\";\nimport NiCloudSnow from \"./nexture/ni-cloud-snow\";\nimport NiCloudThunder from \"./nexture/ni-cloud-thunder\";\nimport NiCode from \"./nexture/ni-code\";\nimport NiCoffee from \"./nexture/ni-coffee\";\nimport NiCoin from \"./nexture/ni-coin\";\nimport NiCollapse from \"./nexture/ni-collapse\";\nimport NiCollapseIn from \"./nexture/ni-collapse-in\";\nimport NiCols from \"./nexture/ni-cols\";\nimport NiCompass from \"./nexture/ni-compass\";\nimport NiController from \"./nexture/ni-controller\";\nimport NiCopyright from \"./nexture/ni-copyright\";\nimport NiCpu from \"./nexture/ni-cpu\";\nimport NiCreditCard from \"./nexture/ni-credit-card\";\nimport NiCrop from \"./nexture/ni-crop\";\nimport NiCross from \"./nexture/ni-cross\";\nimport NiCrossFull from \"./nexture/ni-cross-full\";\nimport NiCrossHexagon from \"./nexture/ni-cross-hexagon\";\nimport NiCrossSquare from \"./nexture/ni-cross-square\";\nimport NiCrosshair from \"./nexture/ni-crosshair\";\nimport NiCrown from \"./nexture/ni-crown\";\nimport NiCursor from \"./nexture/ni-cursor\";\nimport NiDashboard from \"./nexture/ni-dashboard\";\nimport NiDatabase from \"./nexture/ni-database\";\nimport NiDevops from \"./nexture/ni-devops\";\nimport NiDiagram from \"./nexture/ni-diagram\";\nimport NiDice from \"./nexture/ni-dice\";\nimport NiDirectory from \"./nexture/ni-directory\";\nimport NiDocumentArchive from \"./nexture/ni-document-archive\";\nimport NiDocumentChart from \"./nexture/ni-document-chart\";\nimport NiDocumentCheck from \"./nexture/ni-document-check\";\nimport NiDocumentCode from \"./nexture/ni-document-code\";\nimport NiDocumentCross from \"./nexture/ni-document-cross\";\nimport NiDocumentFull from \"./nexture/ni-document-full\";\nimport NiDocumentImage from \"./nexture/ni-document-image\";\nimport NiDocumentMinus from \"./nexture/ni-document-minus\";\nimport NiDocumentNumber from \"./nexture/ni-document-number\";\nimport NiDocumentPlus from \"./nexture/ni-document-plus\";\nimport NiDocumentVideo from \"./nexture/ni-document-video\";\nimport NiDollar from \"./nexture/ni-dollar\";\nimport NiDollarSquare from \"./nexture/ni-dollar-square\";\nimport NiDotsSquare from \"./nexture/ni-dots-square\";\nimport NiDownloadCloud from \"./nexture/ni-download-cloud\";\nimport NiDragHorizontal from \"./nexture/ni-drag-horizontal\";\nimport NiDragVertical from \"./nexture/ni-drag-vertical\";\nimport NiDrink from \"./nexture/ni-drink\";\nimport NiDrop from \"./nexture/ni-drop\";\nimport NiDuplicate from \"./nexture/ni-duplicate\";\nimport NiEllipsisHorizontal from \"./nexture/ni-ellipsis-horizontal\";\nimport NiEllipsisVertical from \"./nexture/ni-ellipsis-vertical\";\nimport NiEmail from \"./nexture/ni-email\";\nimport NiEmailOpen from \"./nexture/ni-email-open\";\nimport NiEndDownSmall from \"./nexture/ni-end-down-small\";\nimport NiEndLeftSmall from \"./nexture/ni-end-left-small\";\nimport NiEndRightSmall from \"./nexture/ni-end-right-small\";\nimport NiEndUpSmall from \"./nexture/ni-end-up-small\";\nimport NiEnterDown from \"./nexture/ni-enter-down\";\nimport NiEnterLeft from \"./nexture/ni-enter-left\";\nimport NiEnterReverseDown from \"./nexture/ni-enter-reverse-down\";\nimport NiEnterReverseLeft from \"./nexture/ni-enter-reverse-left\";\nimport NiEnterReverseRight from \"./nexture/ni-enter-reverse-right\";\nimport NiEnterReverseUp from \"./nexture/ni-enter-reverse-up\";\nimport NiEnterRight from \"./nexture/ni-enter-right\";\nimport NiEnterUp from \"./nexture/ni-enter-up\";\nimport NiEquals from \"./nexture/ni-equals\";\nimport NiEqualsFull from \"./nexture/ni-equals-full\";\nimport NiEraser from \"./nexture/ni-eraser\";\nimport NiEuro from \"./nexture/ni-euro\";\nimport NiEuroSquare from \"./nexture/ni-euro-square\";\nimport NiExclamationHexagon from \"./nexture/ni-exclamation-hexagon\";\nimport NiExclamationSquare from \"./nexture/ni-exclamation-square\";\nimport NiExpand from \"./nexture/ni-expand\";\nimport NiExpandFull from \"./nexture/ni-expand-full\";\nimport NiExpandOut from \"./nexture/ni-expand-out\";\nimport NiExpandSquare from \"./nexture/ni-expand-square\";\nimport NiExternal from \"./nexture/ni-external\";\nimport NiEyeClose from \"./nexture/ni-eye-close\";\nimport NiEyeInactive from \"./nexture/ni-eye-inactive\";\nimport NiEyeOpen from \"./nexture/ni-eye-open\";\nimport NiFaceFrown from \"./nexture/ni-face-frown\";\nimport NiFaceFrownMore from \"./nexture/ni-face-frown-more\";\nimport NiFaceNeutral from \"./nexture/ni-face-neutral\";\nimport NiFaceSmile from \"./nexture/ni-face-smile\";\nimport NiFaceSmileMore from \"./nexture/ni-face-smile-more\";\nimport NiFemale from \"./nexture/ni-female\";\nimport NiFilter from \"./nexture/ni-filter\";\nimport NiFilterCross from \"./nexture/ni-filter-cross\";\nimport NiFilterMinus from \"./nexture/ni-filter-minus\";\nimport NiFilterPlus from \"./nexture/ni-filter-plus\";\nimport NiFingerprint from \"./nexture/ni-fingerprint\";\nimport NiFire from \"./nexture/ni-fire\";\nimport NiFirstAid from \"./nexture/ni-first-aid\";\nimport NiFitness from \"./nexture/ni-fitness\";\nimport NiFlag from \"./nexture/ni-flag\";\nimport NiFlash from \"./nexture/ni-flash\";\nimport NiFlask from \"./nexture/ni-flask\";\nimport NiFloppyDisk from \"./nexture/ni-floppy-disk\";\nimport NiFolder from \"./nexture/ni-folder\";\nimport NiFolderCheck from \"./nexture/ni-folder-check\";\nimport NiFolderCross from \"./nexture/ni-folder-cross\";\nimport NiFolderMinus from \"./nexture/ni-folder-minus\";\nimport NiFolderPlus from \"./nexture/ni-folder-plus\";\nimport NiForwardDownSmall from \"./nexture/ni-forward-down-small\";\nimport NiForwardLeftSmall from \"./nexture/ni-forward-left-small\";\nimport NiForwardRightSmall from \"./nexture/ni-forward-right-small\";\nimport NiForwardUpSmall from \"./nexture/ni-forward-up-small\";\nimport NiGay from \"./nexture/ni-gay\";\nimport NiGerm from \"./nexture/ni-germ\";\nimport NiGogo from \"./nexture/ni-gogo\";\nimport NiGold from \"./nexture/ni-gold\";\nimport NiGpu from \"./nexture/ni-gpu\";\nimport NiGraduation from \"./nexture/ni-graduation\";\nimport NiGroup from \"./nexture/ni-group\";\nimport NiHeadphones from \"./nexture/ni-headphones\";\nimport NiHeadset from \"./nexture/ni-headset\";\nimport NiHeadsetMic from \"./nexture/ni-headset-mic\";\nimport NiHealth from \"./nexture/ni-health\";\nimport NiHeart from \"./nexture/ni-heart\";\nimport NiHeartRate from \"./nexture/ni-heart-rate\";\nimport NiHearts from \"./nexture/ni-hearts\";\nimport NiHome from \"./nexture/ni-home\";\nimport NiInbox from \"./nexture/ni-inbox\";\nimport NiInfoSquare from \"./nexture/ni-info-square\";\nimport NiInjection from \"./nexture/ni-injection\";\nimport NiInput from \"./nexture/ni-input\";\nimport NiIntegration from \"./nexture/ni-integration\";\nimport NiInternal from \"./nexture/ni-internal\";\nimport NiIv from \"./nexture/ni-iv\";\nimport NiJoin from \"./nexture/ni-join\";\nimport NiKey from \"./nexture/ni-key\";\nimport NiKeyboard from \"./nexture/ni-keyboard\";\nimport NiKnobs from \"./nexture/ni-knobs\";\nimport NiLaptop from \"./nexture/ni-laptop\";\nimport NiLaw from \"./nexture/ni-law\";\nimport NiLayout from \"./nexture/ni-layout\";\nimport NiLike from \"./nexture/ni-like\";\nimport NiLink from \"./nexture/ni-link\";\nimport NiLinkBroken from \"./nexture/ni-link-broken\";\nimport NiList from \"./nexture/ni-list\";\nimport NiListCheck from \"./nexture/ni-list-check\";\nimport NiListChevronDown from \"./nexture/ni-list-chevron-down\";\nimport NiListCircle from \"./nexture/ni-list-circle\";\nimport NiListCross from \"./nexture/ni-list-cross\";\nimport NiListNumber from \"./nexture/ni-list-number\";\nimport NiListSquare from \"./nexture/ni-list-square\";\nimport NiLoader from \"./nexture/ni-loader\";\nimport NiLock from \"./nexture/ni-lock\";\nimport NiLuggage from \"./nexture/ni-luggage\";\nimport NiLungs from \"./nexture/ni-lungs\";\nimport NiMagicWand from \"./nexture/ni-magic-wand\";\nimport NiMale from \"./nexture/ni-male\";\nimport NiMap from \"./nexture/ni-map\";\nimport NiMasonary from \"./nexture/ni-masonary\";\nimport NiMedal from \"./nexture/ni-medal\";\nimport NiMenu from \"./nexture/ni-menu\";\nimport NiMenuLeft from \"./nexture/ni-menu-left\";\nimport NiMenuRight from \"./nexture/ni-menu-right\";\nimport NiMenuSplit from \"./nexture/ni-menu-split\";\nimport NiMenuSplitDot from \"./nexture/ni-menu-split-dot\";\nimport NiMenuSplitDotReverse from \"./nexture/ni-menu-split-dot-reverse\";\nimport NiMenuSplitReverse from \"./nexture/ni-menu-split-reverse\";\nimport NiMessage from \"./nexture/ni-message\";\nimport NiMessageCheck from \"./nexture/ni-message-check\";\nimport NiMessageCross from \"./nexture/ni-message-cross\";\nimport NiMessageDots from \"./nexture/ni-message-dots\";\nimport NiMessageFilled from \"./nexture/ni-message-filled\";\nimport NiMessageGrammar from \"./nexture/ni-message-grammar\";\nimport NiMessagePlus from \"./nexture/ni-message-plus\";\nimport NiMessages from \"./nexture/ni-messages\";\nimport NiMicrophone from \"./nexture/ni-microphone\";\nimport NiMinus from \"./nexture/ni-minus\";\nimport NiMinusFull from \"./nexture/ni-minus-full\";\nimport NiMinusSquare from \"./nexture/ni-minus-square\";\nimport NiMoney from \"./nexture/ni-money\";\nimport NiMoneyBag from \"./nexture/ni-money-bag\";\nimport NiMoon from \"./nexture/ni-moon\";\nimport NiMountain from \"./nexture/ni-mountain\";\nimport NiMouse from \"./nexture/ni-mouse\";\nimport NiMove from \"./nexture/ni-move\";\nimport NiMusic from \"./nexture/ni-music\";\nimport NiNetwork from \"./nexture/ni-network\";\nimport NiNext from \"./nexture/ni-next\";\nimport NiOxygen from \"./nexture/ni-oxygen\";\nimport NiPaintBucket from \"./nexture/ni-paint-bucket\";\nimport NiPaintRoller from \"./nexture/ni-paint-roller\";\nimport NiPalette from \"./nexture/ni-palette\";\nimport NiPaperclip from \"./nexture/ni-paperclip\";\nimport NiParentheses from \"./nexture/ni-parentheses\";\nimport NiPath from \"./nexture/ni-path\";\nimport NiPause from \"./nexture/ni-pause\";\nimport NiPen from \"./nexture/ni-pen\";\nimport NiPenSquare from \"./nexture/ni-pen-square\";\nimport NiPercent from \"./nexture/ni-percent\";\nimport NiPhone from \"./nexture/ni-phone\";\nimport NiPhoneHandset from \"./nexture/ni-phone-handset\";\nimport NiPhoneHandsetCheck from \"./nexture/ni-phone-handset-check\";\nimport NiPhoneHandsetOff from \"./nexture/ni-phone-handset-off\";\nimport NiPhoneHandsetOn from \"./nexture/ni-phone-handset-on\";\nimport NiPin from \"./nexture/ni-pin\";\nimport NiPinCheck from \"./nexture/ni-pin-check\";\nimport NiPinCross from \"./nexture/ni-pin-cross\";\nimport NiPinPlus from \"./nexture/ni-pin-plus\";\nimport NiPine from \"./nexture/ni-pine\";\nimport NiPivot from \"./nexture/ni-pivot\";\nimport NiPlane from \"./nexture/ni-plane\";\nimport NiPlay from \"./nexture/ni-play\";\nimport NiPlug from \"./nexture/ni-plug\";\nimport NiPlus from \"./nexture/ni-plus\";\nimport NiPlusFull from \"./nexture/ni-plus-full\";\nimport NiPlusSquare from \"./nexture/ni-plus-square\";\nimport NiPolitics from \"./nexture/ni-politics\";\nimport NiPound from \"./nexture/ni-pound\";\nimport NiPoundSquare from \"./nexture/ni-pound-square\";\nimport NiPower from \"./nexture/ni-power\";\nimport NiPresentation from \"./nexture/ni-presentation\";\nimport NiPrevious from \"./nexture/ni-previous\";\nimport NiPrinter from \"./nexture/ni-printer\";\nimport NiProgress from \"./nexture/ni-progress\";\nimport NiPullRequestClosed from \"./nexture/ni-pull-request-closed\";\nimport NiPullRequestDraft from \"./nexture/ni-pull-request-draft\";\nimport NiPullRequestMerged from \"./nexture/ni-pull-request-merged\";\nimport NiPullRequestOpen from \"./nexture/ni-pull-request-open\";\nimport NiPulse from \"./nexture/ni-pulse\";\nimport NiPushPin from \"./nexture/ni-push-pin\";\nimport NiPushPinLeft from \"./nexture/ni-push-pin-left\";\nimport NiPushPinRight from \"./nexture/ni-push-pin-right\";\nimport NiPuzzle from \"./nexture/ni-puzzle\";\nimport NiQuestionHexagon from \"./nexture/ni-question-hexagon\";\nimport NiRadio from \"./nexture/ni-radio\";\nimport NiRankFour from \"./nexture/ni-rank-four\";\nimport NiRankOne from \"./nexture/ni-rank-one\";\nimport NiRankThree from \"./nexture/ni-rank-three\";\nimport NiRankTwo from \"./nexture/ni-rank-two\";\nimport NiReceipt from \"./nexture/ni-receipt\";\nimport NiRecord from \"./nexture/ni-record\";\nimport NiRefresh from \"./nexture/ni-refresh\";\nimport NiReligion from \"./nexture/ni-religion\";\nimport NiResearch from \"./nexture/ni-research\";\nimport NiRevenue from \"./nexture/ni-revenue\";\nimport NiReverseLeft from \"./nexture/ni-reverse-left\";\nimport NiReverseRight from \"./nexture/ni-reverse-right\";\nimport NiRobot from \"./nexture/ni-robot\";\nimport NiRocket from \"./nexture/ni-rocket\";\nimport NiRouter from \"./nexture/ni-router\";\nimport NiRows from \"./nexture/ni-rows\";\nimport NiSafe from \"./nexture/ni-safe\";\nimport NiScale from \"./nexture/ni-scale\";\nimport NiScalpel from \"./nexture/ni-scalpel\";\nimport NiScissors from \"./nexture/ni-scissors\";\nimport NiScreen from \"./nexture/ni-screen\";\nimport NiScriptSub from \"./nexture/ni-script-sub\";\nimport NiScriptSuper from \"./nexture/ni-script-super\";\nimport NiSdCard from \"./nexture/ni-sd-card\";\nimport NiSearch from \"./nexture/ni-search\";\nimport NiSelect from \"./nexture/ni-select\";\nimport NiSendDown from \"./nexture/ni-send-down\";\nimport NiSendDownLeft from \"./nexture/ni-send-down-left\";\nimport NiSendDownRight from \"./nexture/ni-send-down-right\";\nimport NiSendLeft from \"./nexture/ni-send-left\";\nimport NiSendRight from \"./nexture/ni-send-right\";\nimport NiSendUp from \"./nexture/ni-send-up\";\nimport NiSendUpLeft from \"./nexture/ni-send-up-left\";\nimport NiSendUpRight from \"./nexture/ni-send-up-right\";\nimport NiServer from \"./nexture/ni-server\";\nimport NiSettings from \"./nexture/ni-settings\";\nimport NiShare from \"./nexture/ni-share\";\nimport NiShield from \"./nexture/ni-shield\";\nimport NiShieldCheck from \"./nexture/ni-shield-check\";\nimport NiShieldCross from \"./nexture/ni-shield-cross\";\nimport NiShrinkFull from \"./nexture/ni-shrink-full\";\nimport NiShrinkSquare from \"./nexture/ni-shrink-square\";\nimport NiShuffle from \"./nexture/ni-shuffle\";\nimport NiSign from \"./nexture/ni-sign\";\nimport NiSignalLeftRight from \"./nexture/ni-signal-left-right\";\nimport NiSignalRight from \"./nexture/ni-signal-right\";\nimport NiSignalUp from \"./nexture/ni-signal-up\";\nimport NiSigns from \"./nexture/ni-signs\";\nimport NiSlashHexagon from \"./nexture/ni-slash-hexagon\";\nimport NiSlider from \"./nexture/ni-slider\";\nimport NiSnow from \"./nexture/ni-snow\";\nimport NiSoundCross from \"./nexture/ni-sound-cross\";\nimport NiSoundOff from \"./nexture/ni-sound-off\";\nimport NiSoundOn from \"./nexture/ni-sound-on\";\nimport NiSoundPlus from \"./nexture/ni-sound-plus\";\nimport NiSparkle from \"./nexture/ni-sparkle\";\nimport NiSpinner from \"./nexture/ni-spinner\";\nimport NiSquare from \"./nexture/ni-square\";\nimport NiSquircle from \"./nexture/ni-squircle\";\nimport NiStar from \"./nexture/ni-star\";\nimport NiStars from \"./nexture/ni-stars\";\nimport NiStomach from \"./nexture/ni-stomach\";\nimport NiStopwatch from \"./nexture/ni-stopwatch\";\nimport NiStore from \"./nexture/ni-store\";\nimport NiStructure from \"./nexture/ni-structure\";\nimport NiSum from \"./nexture/ni-sum\";\nimport NiSun from \"./nexture/ni-sun\";\nimport NiSwap from \"./nexture/ni-swap\";\nimport NiSwitch from \"./nexture/ni-switch\";\nimport NiTablet from \"./nexture/ni-tablet\";\nimport NiTag from \"./nexture/ni-tag\";\nimport NiTelescope from \"./nexture/ni-telescope\";\nimport NiTemperature from \"./nexture/ni-temperature\";\nimport NiTent from \"./nexture/ni-tent\";\nimport NiTerminal from \"./nexture/ni-terminal\";\nimport NiTextBold from \"./nexture/ni-text-bold\";\nimport NiTextCenter from \"./nexture/ni-text-center\";\nimport NiTextFont from \"./nexture/ni-text-font\";\nimport NiTextItalic from \"./nexture/ni-text-italic\";\nimport NiTextJustify from \"./nexture/ni-text-justify\";\nimport NiTextLeft from \"./nexture/ni-text-left\";\nimport NiTextQuote from \"./nexture/ni-text-quote\";\nimport NiTextRight from \"./nexture/ni-text-right\";\nimport NiTextStrikethrough from \"./nexture/ni-text-strikethrough\";\nimport NiTextUnderline from \"./nexture/ni-text-underline\";\nimport NiTextarea from \"./nexture/ni-textarea\";\nimport NiTicket from \"./nexture/ni-ticket\";\nimport NiTimeline from \"./nexture/ni-timeline\";\nimport NiTooth from \"./nexture/ni-tooth\";\nimport NiToyBoat from \"./nexture/ni-toy-boat\";\nimport NiToySky from \"./nexture/ni-toy-sky\";\nimport NiToyStacking from \"./nexture/ni-toy-stacking\";\nimport NiTrade from \"./nexture/ni-trade\";\nimport NiTree from \"./nexture/ni-tree\";\nimport NiTrendDown from \"./nexture/ni-trend-down\";\nimport NiTrendUp from \"./nexture/ni-trend-up\";\nimport NiTriangleDown from \"./nexture/ni-triangle-down\";\nimport NiTriangleLeft from \"./nexture/ni-triangle-left\";\nimport NiTriangleRight from \"./nexture/ni-triangle-right\";\nimport NiTriangleUp from \"./nexture/ni-triangle-up\";\nimport NiTrophy from \"./nexture/ni-trophy\";\nimport NiTruck from \"./nexture/ni-truck\";\nimport NiTubes from \"./nexture/ni-tubes\";\nimport NiUngroup from \"./nexture/ni-ungroup\";\nimport NiUnlike from \"./nexture/ni-unlike\";\nimport NiUnlock from \"./nexture/ni-unlock\";\nimport NiUploadCloud from \"./nexture/ni-upload-cloud\";\nimport NiUser from \"./nexture/ni-user\";\nimport NiUserCheck from \"./nexture/ni-user-check\";\nimport NiUserCross from \"./nexture/ni-user-cross\";\nimport NiUserMinus from \"./nexture/ni-user-minus\";\nimport NiUserPlus from \"./nexture/ni-user-plus\";\nimport NiUsers from \"./nexture/ni-users\";\nimport NiVerified from \"./nexture/ni-verified\";\nimport NiWallet from \"./nexture/ni-wallet\";\nimport NiWalletCrypto from \"./nexture/ni-wallet-crypto\";\nimport NiWatch from \"./nexture/ni-watch\";\nimport NiWeightScale from \"./nexture/ni-weight-scale\";\nimport NiWind from \"./nexture/ni-wind\";\nimport NiWorld from \"./nexture/ni-world\";\nimport NiZoomIn from \"./nexture/ni-zoom-in\";\nimport NiZoomOut from \"./nexture/ni-zoom-out\";\n\nexport const IconMap = {\n NiAI,\n NiAirBalloon,\n NiAnchor,\n NiAnnouncement,\n NiAntenna,\n NiArchiveCheck,\n NiArchive,\n NiArrowCircleLeft,\n NiArrowCircleRight,\n NiArrowDownLeftSquare,\n NiArrowDownLeft,\n NiArrowDownRightSquare,\n NiArrowDownRight,\n NiArrowDownSquare,\n NiArrowDown,\n NiArrowHistory,\n NiArrowInDown,\n NiArrowInLeft,\n NiArrowInRight,\n NiArrowInUp,\n NiArrowLeftRight,\n NiArrowLeftSquare,\n NiArrowLeft,\n NiArrowOutDown,\n NiArrowOutLeft,\n NiArrowOutRight,\n NiArrowOutUp,\n NiArrowRightSquare,\n NiArrowRight,\n NiArrowUpDown,\n NiArrowUpLeftSquare,\n NiArrowUpLeft,\n NiArrowUpRightSquare,\n NiArrowUpRight,\n NiArrowUpSquare,\n NiArrowUp,\n NiAt,\n NiBadgeCheck,\n NiBadge,\n NiBag,\n NiBandAid,\n NiBarcode,\n NiBasket,\n NiBatteryCharging,\n NiBatteryEmpty,\n NiBatteryFull,\n NiBellInactive,\n NiBell,\n NiBinEmpty,\n NiBinFull,\n NiBloodCells,\n NiBluetooth,\n NiBook,\n NiBookmarkSingle,\n NiBookmark,\n NiBraces,\n NiBrackets,\n NiBrain,\n NiBrainCircuit,\n NiBriefcase,\n NiBrushArtSquare,\n NiBrushArt,\n NiBrush,\n NiBug,\n NiBuilding,\n NiBulbOff,\n NiBulbOn,\n NiButton,\n NiButtonGroup,\n NiButtonLarge,\n NiCake,\n NiCalendar,\n NiCalendarClock,\n NiCamera,\n NiCar,\n NiCartArrow,\n NiCartCross,\n NiCartEmpty,\n NiCartMinus,\n NiCartPlus,\n NiCatalog,\n NiCellsPlus,\n NiCells,\n NiChange,\n NiChartBar,\n NiChartCandleSticks,\n NiChartFunnel,\n NiChartHeatmap,\n NiChartLineBar,\n NiChartLine,\n NiChartPie,\n NiChartPolar,\n NiChartRadar,\n NiChartScatter,\n NiCheckSquare,\n NiCheck,\n NiCheckFull,\n NiChef,\n NiChevronDownSmall,\n NiChevronDown,\n NiChevronLeftRightReverseSmall,\n NiChevronLeftRightSmall,\n NiChevronLeftSmall,\n NiChevronLeft,\n NiChevronRightSmall,\n NiChevronRight,\n NiChevronUpDownReverseSmall,\n NiChevronUpDownSmall,\n NiChevronUpSmall,\n NiChevronUp,\n NiCholesterol,\n NiCircle,\n NiClipboard,\n NiClock,\n NiCloudPartly,\n NiCloudRain,\n NiCloudSnow,\n NiCloudThunder,\n NiCloud,\n NiCode,\n NiCoffee,\n NiCoin,\n NiCollapse,\n NiCollapseIn,\n NiCols,\n NiCompass,\n NiController,\n NiCopyright,\n NiCpu,\n NiCreditCard,\n NiCrop,\n NiCrossHexagon,\n NiCrossSquare,\n NiCross,\n NiCrossFull,\n NiCrosshair,\n NiCrown,\n NiCursor,\n NiDashboard,\n NiDatabase,\n NiDevops,\n NiDiagram,\n NiDice,\n NiDirectory,\n NiDocumentArchive,\n NiDocumentChart,\n NiDocumentCheck,\n NiDocumentCode,\n NiDocumentCross,\n NiDocumentFull,\n NiDocumentImage,\n NiDocumentMinus,\n NiDocumentNumber,\n NiDocumentPlus,\n NiDocumentVideo,\n NiDollarSquare,\n NiDollar,\n NiDotsSquare,\n NiDownloadCloud,\n NiDragHorizontal,\n NiDragVertical,\n NiDrink,\n NiDrop,\n NiDuplicate,\n NiEllipsisHorizontal,\n NiEllipsisVertical,\n NiEmailOpen,\n NiEmail,\n NiEndDownSmall,\n NiEndLeftSmall,\n NiEndRightSmall,\n NiEndUpSmall,\n NiEnterDown,\n NiEnterLeft,\n NiEnterReverseDown,\n NiEnterReverseLeft,\n NiEnterReverseRight,\n NiEnterReverseUp,\n NiEnterRight,\n NiEnterUp,\n NiEquals,\n NiEqualsFull,\n NiEraser,\n NiEuroSquare,\n NiEuro,\n NiExclamationHexagon,\n NiExclamationSquare,\n NiExpandOut,\n NiExpandSquare,\n NiExpandFull,\n NiExpand,\n NiExternal,\n NiEyeClose,\n NiEyeInactive,\n NiEyeOpen,\n NiFaceFrownMore,\n NiFaceFrown,\n NiFaceNeutral,\n NiFaceSmileMore,\n NiFaceSmile,\n NiFemale,\n NiFilterCross,\n NiFilterMinus,\n NiFilterPlus,\n NiFilter,\n NiFingerprint,\n NiFire,\n NiFirstAid,\n NiFitness,\n NiFlag,\n NiFlash,\n NiFlask,\n NiFloppyDisk,\n NiFolderCheck,\n NiFolderCross,\n NiFolderMinus,\n NiFolderPlus,\n NiFolder,\n NiForwardDownSmall,\n NiForwardLeftSmall,\n NiForwardRightSmall,\n NiForwardUpSmall,\n NiGay,\n NiGerm,\n NiGogo,\n NiGold,\n NiGpu,\n NiGroup,\n NiGraduation,\n NiHeadphones,\n NiHeadset,\n NiHeadsetMic,\n NiHealth,\n NiHeart,\n NiHeartRate,\n NiHearts,\n NiHome,\n NiInbox,\n NiInfoSquare,\n NiInjection,\n NiInput,\n NiIntegration,\n NiInternal,\n NiIv,\n NiJoin,\n NiKey,\n NiKeyboard,\n NiKnobs,\n NiLaptop,\n NiLayout,\n NiLaw,\n NiLike,\n NiLinkBroken,\n NiLink,\n NiListCheck,\n NiListChevronDown,\n NiListCircle,\n NiListCross,\n NiListNumber,\n NiListSquare,\n NiList,\n NiLungs,\n NiLoader,\n NiLock,\n NiLuggage,\n NiMagicWand,\n NiMale,\n NiMap,\n NiMasonary,\n NiMedal,\n NiMenu,\n NiMenuLeft,\n NiMenuRight,\n NiMenuSplitDotReverse,\n NiMenuSplitDot,\n NiMenuSplitReverse,\n NiMenuSplit,\n NiMessageCheck,\n NiMessageCross,\n NiMessageDots,\n NiMessageFilled,\n NiMessageGrammar,\n NiMessagePlus,\n NiMessage,\n NiMessages,\n NiMicrophone,\n NiMinus,\n NiMinusFull,\n NiMinusSquare,\n NiMoneyBag,\n NiMoney,\n NiMoon,\n NiMountain,\n NiMouse,\n NiMove,\n NiMusic,\n NiNetwork,\n NiNext,\n NiOxygen,\n NiPaintBucket,\n NiPaintRoller,\n NiPalette,\n NiPaperclip,\n NiParentheses,\n NiPath,\n NiPause,\n NiPenSquare,\n NiPen,\n NiPercent,\n NiPhoneHandsetCheck,\n NiPhoneHandsetOff,\n NiPhoneHandsetOn,\n NiPhoneHandset,\n NiPhone,\n NiPinCheck,\n NiPinCross,\n NiPinPlus,\n NiPin,\n NiPine,\n NiPivot,\n NiPlane,\n NiPlay,\n NiPlug,\n NiPlusSquare,\n NiPlus,\n NiPlusFull,\n NiPolitics,\n NiPoundSquare,\n NiPound,\n NiPower,\n NiPresentation,\n NiPrevious,\n NiPrinter,\n NiProgress,\n NiPullRequestClosed,\n NiPullRequestDraft,\n NiPullRequestMerged,\n NiPullRequestOpen,\n NiPulse,\n NiPushPin,\n NiPushPinLeft,\n NiPushPinRight,\n NiPuzzle,\n NiQuestionHexagon,\n NiRankOne,\n NiRankTwo,\n NiRankThree,\n NiRankFour,\n NiRadio,\n NiReceipt,\n NiRecord,\n NiRefresh,\n NiReligion,\n NiResearch,\n NiRevenue,\n NiReverseLeft,\n NiReverseRight,\n NiRobot,\n NiRocket,\n NiRouter,\n NiRows,\n NiSafe,\n NiScale,\n NiScalpel,\n NiScissors,\n NiScreen,\n NiScriptSub,\n NiScriptSuper,\n NiSdCard,\n NiSearch,\n NiSelect,\n NiSendDownLeft,\n NiSendDownRight,\n NiSendDown,\n NiSendLeft,\n NiSendRight,\n NiSendUpLeft,\n NiSendUpRight,\n NiSendUp,\n NiServer,\n NiSettings,\n NiShare,\n NiShieldCheck,\n NiShieldCross,\n NiShield,\n NiShrinkSquare,\n NiShrinkFull,\n NiShuffle,\n NiSign,\n NiSignalLeftRight,\n NiSignalRight,\n NiSignalUp,\n NiSigns,\n NiSlashHexagon,\n NiSlider,\n NiSnow,\n NiSoundCross,\n NiSoundOff,\n NiSoundOn,\n NiSoundPlus,\n NiSparkle,\n NiSpinner,\n NiSquare,\n NiSquircle,\n NiStar,\n NiStars,\n NiStopwatch,\n NiStore,\n NiStomach,\n NiStructure,\n NiSum,\n NiSun,\n NiSwap,\n NiSwitch,\n NiTablet,\n NiTag,\n NiTelescope,\n NiTemperature,\n NiTent,\n NiTerminal,\n NiTextBold,\n NiTextCenter,\n NiTextFont,\n NiTextItalic,\n NiTextJustify,\n NiTextLeft,\n NiTextQuote,\n NiTextRight,\n NiTextStrikethrough,\n NiTextUnderline,\n NiTextarea,\n NiTicket,\n NiTimeline,\n NiTooth,\n NiToyBoat,\n NiToySky,\n NiToyStacking,\n NiTrade,\n NiTree,\n NiTrendDown,\n NiTrendUp,\n NiTriangleDown,\n NiTriangleLeft,\n NiTriangleRight,\n NiTriangleUp,\n NiTrophy,\n NiTruck,\n NiTubes,\n NiUngroup,\n NiUnlike,\n NiUnlock,\n NiUploadCloud,\n NiUserCheck,\n NiUserCross,\n NiUserMinus,\n NiUserPlus,\n NiUser,\n NiUsers,\n NiVerified,\n NiWalletCrypto,\n NiWallet,\n NiWatch,\n NiWeightScale,\n NiWind,\n NiWorld,\n NiZoomIn,\n NiZoomOut,\n};\n\nexport type IconName = keyof typeof IconMap;\nexport type IconSize = \"large\" | \"medium\" | \"small\" | \"tiny\" | number;\nexport type IconVariant = \"outlined\" | \"contained\";\n\nexport type NextureIconsProps = {\n variant?: IconVariant;\n className?: string;\n size?: IconSize;\n strokeWidth?: number;\n oneTone?: boolean;\n};\n\nexport type NextureIconsPropsComponent = NextureIconsProps & {\n icon: IconName;\n};\n\nconst NextureIcons: React.FC<NextureIconsPropsComponent> = ({\n icon,\n size = 20,\n variant = \"outlined\",\n className,\n strokeWidth = 1.5,\n oneTone = false,\n}) => {\n const IconComponent = IconMap[icon];\n if (!IconComponent) {\n console.warn(`Icon \"${icon}\" not found in IconMap.`);\n return null;\n }\n return (\n <IconComponent variant={variant} size={size} className={className} strokeWidth={strokeWidth} oneTone={oneTone} />\n );\n};\n\nexport const sizeHelper = (size: NextureIconsProps[\"size\"]) => {\n if (typeof size === \"number\") {\n return size;\n } else if (size === \"large\") {\n return 24;\n } else if (size === \"small\" || size === \"tiny\") {\n return 16;\n } else {\n return 20;\n }\n};\n\nexport const strokeSizeHelper = (size: number) => {\n if (size === 32) {\n return 1.15;\n } else if (size >= 20) {\n return 1.5;\n } else {\n return 1.75;\n }\n};\n\nexport default NextureIcons;\n","import { memo, useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport { FilledInput, FormControl, IconButton, InputAdornment, InputLabel } from \"@mui/material\";\n\nimport { NiCross, NiSearch } from \"../../icons/nexture\";\n\ninterface DebouncedSearchInputProps {\n value?: string;\n onChange: (value: string) => void;\n label?: string;\n delay?: number;\n className?: string;\n}\n\n/**\n * Self-contained search input that manages its own typing state.\n * Only calls `onChange` after a debounce, preventing expensive parent re-renders\n * (e.g. DataGrid) on every keystroke.\n *\n * Promoted here from `sales` and `timesheets`, where the file was byte-identical in both and a\n * third search field had been hand-mirrored from it in a shared toolbar. \"Search bars don't look\n * the same\" is not a problem a lint rule can fix - only one implementation can - so this is the\n * implementation, and `coreconnect/no-local-search-input` is the backstop that stops the next\n * plugin writing a fourth.\n *\n * Class composition uses the package's existing join idiom rather than a `cn`/tailwind-merge\n * helper, which keeps `plugin-ui` free of new runtime dependencies. No caller passes a conflicting\n * utility class today, so tailwind-merge's conflict resolution is unexercised; a caller that needs\n * it should override via `sx` instead of racing class order.\n */\nexport const DebouncedSearchInput = memo(function DebouncedSearchInput({\n value = \"\",\n onChange,\n label = \"Search\",\n delay = 400,\n className,\n}: DebouncedSearchInputProps) {\n const [localValue, setLocalValue] = useState(value);\n // Associate the InputLabel with the FilledInput — a bare FormControl+InputLabel+Input\n // doesn't auto-link them (unlike TextField), leaving the label without a `for` target.\n const inputId = useId();\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n const lastReportedRef = useRef(value);\n const isFirstRender = useRef(true);\n\n // Sync external value changes (e.g. clear from parent)\n useEffect(() => {\n setLocalValue(value);\n lastReportedRef.current = value;\n }, [value]);\n\n // Debounce: notify parent only after typing pauses (skip initial mount)\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n return;\n }\n if (localValue === lastReportedRef.current) return;\n const timer = setTimeout(() => {\n lastReportedRef.current = localValue;\n onChangeRef.current(localValue);\n }, delay);\n return () => clearTimeout(timer);\n }, [localValue, delay]);\n\n const handleClear = useCallback(() => {\n setLocalValue(\"\");\n lastReportedRef.current = \"\";\n onChangeRef.current(\"\");\n }, []);\n\n const classes = (...parts: (string | false | undefined)[]) => parts.filter(Boolean).join(\" \");\n\n return (\n <FormControl variant=\"filled\" size=\"medium\" className={classes(\"surface mb-0 w-full\", className)}>\n <InputLabel htmlFor={inputId}>{label}</InputLabel>\n <FilledInput\n id={inputId}\n value={localValue}\n onChange={(e) => setLocalValue(e.target.value)}\n endAdornment={\n <>\n <InputAdornment position=\"end\" className={classes(localValue === \"\" && \"hidden\")}>\n <IconButton edge=\"end\" onClick={handleClear} aria-label=\"Clear search\">\n <NiCross size=\"medium\" className=\"text-text-disabled\" />\n </IconButton>\n </InputAdornment>\n <InputAdornment position=\"end\" className={classes(localValue !== \"\" && \"hidden\")} aria-hidden>\n <IconButton edge=\"end\" disabled tabIndex={-1}>\n <NiSearch size=\"medium\" className=\"text-text-disabled\" />\n </IconButton>\n </InputAdornment>\n </>\n }\n />\n </FormControl>\n );\n});\n","import type { MappingCompletenessItem } from \"./types\";\n\n/**\n * An operation is INCOMPLETE when it has at least one required canonical field that does not map\n * onto the live tool's schema. Deliberately not \"has no tool\": see {@link MappingCompletenessItem}.\n */\nfunction hasUnmappedRequiredField(op: MappingCompletenessItem): boolean {\n return op.unmappedRequiredCanonicalFields.length > 0;\n}\n\n/**\n * Every operation with a gap, required or optional. Use it to decide whether to mount a banner at\n * all, without duplicating the predicate.\n */\nexport function selectIncompleteOperations(\n operations: MappingCompletenessItem[],\n): MappingCompletenessItem[] {\n return operations.filter(hasUnmappedRequiredField);\n}\n\n/**\n * REQUIRED operations with a gap. These genuinely block the module: the connector cannot run them.\n */\nexport function selectRequiredIncompleteOperations(\n operations: MappingCompletenessItem[],\n): MappingCompletenessItem[] {\n return operations.filter((op) => op.isRequired && hasUnmappedRequiredField(op));\n}\n\n/**\n * OPTIONAL operations with a gap. Informational only: the operation powers an extra capability that\n * stays off until its fields are mapped, and the connector may legitimately expose no suitable tool.\n *\n * @remarks\n * Treat these as a note, never a warning. A connector need not expose every operation a module can\n * use, so a correctly configured connector can sit here indefinitely — and a banner that never\n * clears is a banner operators learn to ignore, which costs you the required warnings too.\n */\nexport function selectOptionalIncompleteOperations(\n operations: MappingCompletenessItem[],\n): MappingCompletenessItem[] {\n return operations.filter((op) => !op.isRequired && hasUnmappedRequiredField(op));\n}\n\n/** A module's readiness, counted over REQUIRED operations only. */\nexport interface MappingReadiness {\n /** Required operations that are mapped AND have no field gaps. */\n complete: number;\n /** Total required operations declared by the module's catalogue. */\n total: number;\n /** True when every required operation is mapped and complete. */\n isReady: boolean;\n}\n\n/**\n * Readiness over REQUIRED operations only, for a progress indicator or a \"ready\" badge.\n *\n * @remarks\n * Optional operations are excluded on purpose. Counting them would leave a properly configured\n * connector permanently short of 100%, for operations the operator was never expected to map. This\n * rule came from `ethisyscore-plugin-timesheets`, which had it right while another plugin was\n * reporting optional field gaps in a standing banner.\n */\nexport function selectMappingReadiness(\n operations: MappingCompletenessItem[],\n): MappingReadiness {\n const required = operations.filter((op) => op.isRequired);\n const complete = required.filter(\n (op) => op.isToolMapped && op.unmappedRequiredCanonicalFields.length === 0,\n ).length;\n\n return {\n complete,\n total: required.length,\n isReady: required.length > 0 && complete === required.length,\n };\n}\n","import {\n Alert,\n AlertTitle,\n Box,\n Button,\n Chip,\n CircularProgress,\n Stack,\n Typography,\n} from \"../ui\";\nimport {\n selectOptionalIncompleteOperations,\n selectRequiredIncompleteOperations,\n} from \"./mappingCompleteness\";\nimport type { MappingCompletenessItem } from \"./types\";\n\nexport interface MappingCompletenessBannerProps {\n /**\n * Per-operation completeness for the selected connector + module. The banner splits these into\n * REQUIRED operations with gaps (a blocking warning) and OPTIONAL ones (an informational note);\n * it renders nothing when neither group has gaps.\n */\n operations: MappingCompletenessItem[];\n\n /**\n * Opt-in AI assist. Invoked with the operation the operator chose to fix. The consumer wires this\n * to the suggest-translation mutation and decides what to do with the result (open the editor\n * seeded with the suggestion, apply it, and so on).\n */\n onSuggestWithAi: (operation: MappingCompletenessItem) => void;\n\n /**\n * Opens the manual mapping editor for an operation. The consumer owns the editor surface and\n * routing; the banner only raises intent.\n */\n onOpenMappingEditor: (operation: MappingCompletenessItem) => void;\n\n /**\n * Operation key currently awaiting an AI suggestion, or `null`. Drives the per-row spinner and\n * disabled state so a slow suggestion does not lock the whole banner.\n */\n suggestingOperationKey?: string | null;\n\n /** Disables the AI assist affordance entirely, e.g. AI not configured for the organisation. */\n disableSuggest?: boolean;\n}\n\n/**\n * Connector-setup \"mapping completeness\" banner, shared by every plugin with a Tool Mappings page.\n *\n * Presentational and props-driven: the consumer fetches completeness and owns the editor, so the\n * same banner serves Repo Monitoring, Timesheets, Error Monitoring and anything added later.\n *\n * It separates two cases:\n *\n * - **Required** operations with unmapped required fields, a warning the operator must act on\n * because the module cannot run them.\n * - **Optional** operations with unmapped required fields, a calm note. These power extra\n * capabilities that stay off until their fields are mapped, and the connector may legitimately\n * expose no suitable tool, so they must never read as a blocking error.\n *\n * Renders nothing when neither group has gaps.\n *\n * @remarks\n * **The wording is load-bearing, and was wrong in the copy this was promoted from.** Both groups are\n * selected on `unmappedRequiredCanonicalFields`, which is about FIELD mapping. The original optional\n * alert was titled \"Optional operations not mapped\" and said they \"stay off until mapped\", which\n * describes TOOL mapping. Auto-match maps tools and cannot close a field gap, so an operator who\n * pressed auto-match saw the count refuse to move and reported the banner as broken. It was\n * accurate; the text was not. Every string here therefore says \"fields\", and both alerts say plainly\n * that auto-match will not clear them.\n *\n * A row without the \"No tool mapped\" chip already HAS a tool and needs its fields mapped. That chip\n * is the only thing distinguishing the two states, which is why the prose points at it.\n */\nexport function MappingCompletenessBanner({\n operations,\n onSuggestWithAi,\n onOpenMappingEditor,\n suggestingOperationKey = null,\n disableSuggest = false,\n}: MappingCompletenessBannerProps) {\n const required = selectRequiredIncompleteOperations(operations);\n const optional = selectOptionalIncompleteOperations(operations);\n\n if (required.length === 0 && optional.length === 0) {\n return null;\n }\n\n const renderRow = (op: MappingCompletenessItem) => {\n const isSuggesting = suggestingOperationKey === op.operationKey;\n\n return (\n <Box key={op.operationKey}>\n <Stack\n direction={{ xs: \"column\", sm: \"row\" }}\n spacing={1}\n alignItems={{ xs: \"flex-start\", sm: \"center\" }}\n justifyContent=\"space-between\"\n >\n <Box>\n <Stack direction=\"row\" spacing={1} alignItems=\"center\" sx={{ flexWrap: \"wrap\" }}>\n <Typography variant=\"subtitle2\">{op.label}</Typography>\n {op.isRequired && (\n <Chip label=\"Required\" size=\"small\" color=\"error\" variant=\"outlined\" />\n )}\n {!op.isToolMapped && (\n <Chip label=\"No tool mapped\" size=\"small\" color=\"warning\" variant=\"outlined\" />\n )}\n </Stack>\n <Typography variant=\"caption\" color=\"text.secondary\">\n Unmapped required fields: {op.unmappedRequiredCanonicalFields.join(\", \")}\n </Typography>\n </Box>\n\n <Stack direction=\"row\" spacing={1} sx={{ flexShrink: 0 }}>\n <Button\n size=\"small\"\n variant=\"outlined\"\n color=\"primary\"\n // AI suggests a field TRANSLATION for the mapped tool. There is nothing to suggest\n // when no tool is mapped yet, and calling the endpoint with an empty toolName errors,\n // so this stays disabled until a tool is chosen.\n disabled={disableSuggest || isSuggesting || !op.isToolMapped}\n title={\n !op.isToolMapped\n ? \"Map a tool to this operation before suggesting a field translation\"\n : undefined\n }\n startIcon={isSuggesting ? <CircularProgress size={14} color=\"inherit\" /> : undefined}\n onClick={() => onSuggestWithAi(op)}\n >\n {isSuggesting ? \"Suggesting…\" : \"Suggest with AI\"}\n </Button>\n <Button\n size=\"small\"\n variant=\"text\"\n color=\"primary\"\n onClick={() => onOpenMappingEditor(op)}\n >\n Open mapping editor\n </Button>\n </Stack>\n </Stack>\n </Box>\n );\n };\n\n return (\n <Box sx={{ mb: 2 }}>\n {required.length > 0 && (\n <Alert severity=\"warning\" sx={{ mb: optional.length > 0 ? 2 : 0 }}>\n <AlertTitle>Required operations aren't fully mapped</AlertTitle>\n <Typography variant=\"body2\" sx={{ mb: 1.5 }}>\n {required.length === 1\n ? \"1 required operation has\"\n : `${required.length} required operations have`}{\" \"}\n fields that aren't mapped to this connector's tools yet. Ethisys Core\n can't run these reliably until every required field is mapped. Auto-match picks the\n TOOL, not its fields, so it won't clear these on its own: use "Suggest with\n AI" or the mapping editor per operation.\n </Typography>\n <Stack spacing={1.5}>{required.map(renderRow)}</Stack>\n </Alert>\n )}\n\n {optional.length > 0 && (\n <Alert severity=\"info\">\n <AlertTitle>Optional operations aren't fully mapped</AlertTitle>\n <Typography variant=\"body2\" sx={{ mb: 1.5 }}>\n {optional.length === 1\n ? \"1 optional operation has fields that aren't\"\n : `${optional.length} optional operations have fields that aren't`}{\" \"}\n mapped to this connector's tools. These power extra capabilities (e.g.\n pull-request quality and check-run insights) and stay off until their fields are mapped\n — safe to leave if you don't need them, or if this connector doesn't provide a\n matching tool. Each row below lists exactly which fields are missing; a row without a\n "No tool mapped" chip already HAS a tool and needs its fields mapped, which\n auto-match does not do.\n </Typography>\n <Stack spacing={1.5}>{optional.map(renderRow)}</Stack>\n </Alert>\n )}\n </Box>\n );\n}\n","/**\n * React-query keys for a connector's tool mappings and the completeness read derived from them.\n *\n * @remarks\n * The completeness key is built as a CHILD of the mappings key, and that nesting is the whole point\n * of shipping these from the SDK rather than letting each plugin declare its own.\n *\n * Completeness is derived state: it is the mappings joined against the live tool schemas. Every write\n * that changes a mapping can change it. When the two keys are siblings, a mutation has to remember to\n * invalidate both, and one plugin duly invalidated only the mappings key — so its \"operations aren't\n * fully mapped\" banner went stale after every save, clear and auto-match, and stayed stale until the\n * operator navigated away. Nesting means a single `invalidateQueries({ queryKey: mappings })` takes\n * the completeness read with it, and there is nothing left to forget.\n *\n * @example\n * ```ts\n * const mappings = connectorMappingsQueryKey(connectorId, moduleKey);\n *\n * useQuery({ queryKey: mappings, queryFn: ... });\n * useQuery({ queryKey: connectorMappingCompletenessQueryKey(connectorId, moduleKey), queryFn: ... });\n *\n * // One call. Covers both, and any future query keyed beneath the mappings key.\n * queryClient.invalidateQueries({ queryKey: mappings });\n * ```\n */\n\n/** Root segment for every connector-mapping query, so one prefix can invalidate the family. */\nconst CONNECTOR_MAPPINGS_ROOT = \"connector-mappings\" as const;\n\n/**\n * Key for the mappings list of one connector + module.\n *\n * `connectorId` is accepted as possibly-undefined because the page renders before a connector is\n * chosen; pair it with `enabled: !!connectorId` rather than branching on the key.\n */\nexport function connectorMappingsQueryKey(\n connectorId: string | undefined,\n moduleKey: string,\n) {\n return [CONNECTOR_MAPPINGS_ROOT, connectorId, moduleKey] as const;\n}\n\n/**\n * Key for the completeness read, nested UNDER {@link connectorMappingsQueryKey} so invalidating the\n * mappings prefix always covers it. Do not flatten this into a sibling key.\n */\nexport function connectorMappingCompletenessQueryKey(\n connectorId: string | undefined,\n moduleKey: string,\n) {\n return [...connectorMappingsQueryKey(connectorId, moduleKey), \"completeness\"] as const;\n}\n"]}
|