myoperator-mcp 0.2.113 → 0.2.115
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/dist/index.js +25 -659
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1136,590 +1136,6 @@ const ConfirmationModal = React.forwardRef<
|
|
|
1136
1136
|
ConfirmationModal.displayName = "ConfirmationModal";
|
|
1137
1137
|
|
|
1138
1138
|
export { ConfirmationModal };
|
|
1139
|
-
`,
|
|
1140
|
-
"creatable-multi-select": `import * as React from "react"
|
|
1141
|
-
import { cva } from "class-variance-authority"
|
|
1142
|
-
import { ChevronDown, ChevronRight, Plus, X, Info } from "lucide-react"
|
|
1143
|
-
|
|
1144
|
-
import { cn } from "@/lib/utils"
|
|
1145
|
-
|
|
1146
|
-
const creatableMultiSelectTriggerVariants = cva(
|
|
1147
|
-
"flex items-center gap-2 flex-wrap min-h-[42px] w-full px-4 py-2 rounded bg-semantic-bg-primary cursor-text transition-shadow",
|
|
1148
|
-
{
|
|
1149
|
-
variants: {
|
|
1150
|
-
state: {
|
|
1151
|
-
default:
|
|
1152
|
-
"border border-semantic-border-input hover:border-semantic-border-input-focus",
|
|
1153
|
-
error:
|
|
1154
|
-
"border border-semantic-error-primary/40 hover:border-semantic-error-primary",
|
|
1155
|
-
focused:
|
|
1156
|
-
"border border-semantic-border-focus shadow-[0_0_0_1px_rgba(43,188,202,0.15)]",
|
|
1157
|
-
"focused-error":
|
|
1158
|
-
"border border-semantic-error-primary/60 shadow-[0_0_0_1px_rgba(240,68,56,0.1)]",
|
|
1159
|
-
},
|
|
1160
|
-
},
|
|
1161
|
-
defaultVariants: {
|
|
1162
|
-
state: "default",
|
|
1163
|
-
},
|
|
1164
|
-
}
|
|
1165
|
-
)
|
|
1166
|
-
|
|
1167
|
-
export interface CreatableMultiSelectOption {
|
|
1168
|
-
value: string
|
|
1169
|
-
label: string
|
|
1170
|
-
disabled?: boolean
|
|
1171
|
-
}
|
|
1172
|
-
|
|
1173
|
-
export interface CreatableMultiSelectProps
|
|
1174
|
-
extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange"> {
|
|
1175
|
-
/** Currently selected values */
|
|
1176
|
-
value?: string[]
|
|
1177
|
-
/** Callback when values change */
|
|
1178
|
-
onValueChange?: (values: string[]) => void
|
|
1179
|
-
/** Available preset options */
|
|
1180
|
-
options?: CreatableMultiSelectOption[]
|
|
1181
|
-
/** Placeholder when no values selected */
|
|
1182
|
-
placeholder?: string
|
|
1183
|
-
/** Whether the component is disabled */
|
|
1184
|
-
disabled?: boolean
|
|
1185
|
-
/** Error state */
|
|
1186
|
-
state?: "default" | "error"
|
|
1187
|
-
/** Hint text shown at top of dropdown when open */
|
|
1188
|
-
creatableHint?: string
|
|
1189
|
-
/** Helper text shown below the trigger */
|
|
1190
|
-
helperText?: string
|
|
1191
|
-
}
|
|
1192
|
-
|
|
1193
|
-
const CreatableMultiSelect = React.forwardRef<
|
|
1194
|
-
HTMLDivElement,
|
|
1195
|
-
CreatableMultiSelectProps
|
|
1196
|
-
>(
|
|
1197
|
-
(
|
|
1198
|
-
{
|
|
1199
|
-
className,
|
|
1200
|
-
value = [],
|
|
1201
|
-
onValueChange,
|
|
1202
|
-
options = [],
|
|
1203
|
-
placeholder = "Enter or select",
|
|
1204
|
-
disabled = false,
|
|
1205
|
-
state = "default",
|
|
1206
|
-
creatableHint = "Type to create a custom option",
|
|
1207
|
-
helperText,
|
|
1208
|
-
...props
|
|
1209
|
-
},
|
|
1210
|
-
ref
|
|
1211
|
-
) => {
|
|
1212
|
-
const [isOpen, setIsOpen] = React.useState(false)
|
|
1213
|
-
const [inputValue, setInputValue] = React.useState("")
|
|
1214
|
-
const containerRef = React.useRef<HTMLDivElement>(null)
|
|
1215
|
-
const inputRef = React.useRef<HTMLInputElement>(null)
|
|
1216
|
-
|
|
1217
|
-
React.useImperativeHandle(ref, () => containerRef.current!)
|
|
1218
|
-
|
|
1219
|
-
const addValue = React.useCallback(
|
|
1220
|
-
(val: string) => {
|
|
1221
|
-
const trimmed = val.trim()
|
|
1222
|
-
if (trimmed && !value.includes(trimmed)) {
|
|
1223
|
-
onValueChange?.([...value, trimmed])
|
|
1224
|
-
setInputValue("")
|
|
1225
|
-
}
|
|
1226
|
-
},
|
|
1227
|
-
[value, onValueChange]
|
|
1228
|
-
)
|
|
1229
|
-
|
|
1230
|
-
const removeValue = React.useCallback(
|
|
1231
|
-
(val: string) => {
|
|
1232
|
-
onValueChange?.(value.filter((v) => v !== val))
|
|
1233
|
-
},
|
|
1234
|
-
[value, onValueChange]
|
|
1235
|
-
)
|
|
1236
|
-
|
|
1237
|
-
const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
|
|
1238
|
-
if (e.key === "Enter") {
|
|
1239
|
-
e.preventDefault()
|
|
1240
|
-
if (inputValue.trim()) addValue(inputValue)
|
|
1241
|
-
} else if (e.key === "Backspace" && !inputValue && value.length > 0) {
|
|
1242
|
-
removeValue(value[value.length - 1])
|
|
1243
|
-
} else if (e.key === "Escape") {
|
|
1244
|
-
setIsOpen(false)
|
|
1245
|
-
setInputValue("")
|
|
1246
|
-
}
|
|
1247
|
-
}
|
|
1248
|
-
|
|
1249
|
-
// Close on outside click
|
|
1250
|
-
React.useEffect(() => {
|
|
1251
|
-
const handler = (e: MouseEvent) => {
|
|
1252
|
-
if (
|
|
1253
|
-
containerRef.current &&
|
|
1254
|
-
!containerRef.current.contains(e.target as Node)
|
|
1255
|
-
) {
|
|
1256
|
-
setIsOpen(false)
|
|
1257
|
-
setInputValue("")
|
|
1258
|
-
}
|
|
1259
|
-
}
|
|
1260
|
-
document.addEventListener("mousedown", handler)
|
|
1261
|
-
return () => document.removeEventListener("mousedown", handler)
|
|
1262
|
-
}, [])
|
|
1263
|
-
|
|
1264
|
-
const availablePresets = options.filter(
|
|
1265
|
-
(o) => !value.includes(o.value) && !o.disabled
|
|
1266
|
-
)
|
|
1267
|
-
const filteredPresets = inputValue.trim()
|
|
1268
|
-
? availablePresets.filter((o) =>
|
|
1269
|
-
o.label.toLowerCase().includes(inputValue.trim().toLowerCase())
|
|
1270
|
-
)
|
|
1271
|
-
: availablePresets
|
|
1272
|
-
const canAddCustom =
|
|
1273
|
-
Boolean(inputValue.trim()) && !value.includes(inputValue.trim())
|
|
1274
|
-
|
|
1275
|
-
const triggerState = isOpen
|
|
1276
|
-
? state === "error"
|
|
1277
|
-
? "focused-error"
|
|
1278
|
-
: "focused"
|
|
1279
|
-
: state
|
|
1280
|
-
|
|
1281
|
-
return (
|
|
1282
|
-
<div
|
|
1283
|
-
ref={containerRef}
|
|
1284
|
-
className={cn("relative w-full", className)}
|
|
1285
|
-
{...props}
|
|
1286
|
-
>
|
|
1287
|
-
{/* Trigger */}
|
|
1288
|
-
<div
|
|
1289
|
-
className={cn(
|
|
1290
|
-
creatableMultiSelectTriggerVariants({ state: triggerState }),
|
|
1291
|
-
disabled && "cursor-not-allowed opacity-50"
|
|
1292
|
-
)}
|
|
1293
|
-
onClick={() => {
|
|
1294
|
-
if (disabled) return
|
|
1295
|
-
setIsOpen(true)
|
|
1296
|
-
inputRef.current?.focus()
|
|
1297
|
-
}}
|
|
1298
|
-
>
|
|
1299
|
-
{/* Selected chips */}
|
|
1300
|
-
{value.map((val) => {
|
|
1301
|
-
const optLabel =
|
|
1302
|
-
options.find((o) => o.value === val)?.label || val
|
|
1303
|
-
return (
|
|
1304
|
-
<span
|
|
1305
|
-
key={val}
|
|
1306
|
-
className="inline-flex items-center gap-2 bg-semantic-info-surface px-2 py-1 rounded text-sm text-semantic-text-primary whitespace-nowrap"
|
|
1307
|
-
>
|
|
1308
|
-
{optLabel}
|
|
1309
|
-
<button
|
|
1310
|
-
type="button"
|
|
1311
|
-
onMouseDown={(e) => {
|
|
1312
|
-
e.stopPropagation()
|
|
1313
|
-
e.preventDefault()
|
|
1314
|
-
removeValue(val)
|
|
1315
|
-
}}
|
|
1316
|
-
className="shrink-0 flex items-center justify-center text-semantic-text-muted hover:text-semantic-text-primary transition-colors"
|
|
1317
|
-
aria-label={\`Remove \${optLabel}\`}
|
|
1318
|
-
>
|
|
1319
|
-
<X className="size-2.5" />
|
|
1320
|
-
</button>
|
|
1321
|
-
</span>
|
|
1322
|
-
)
|
|
1323
|
-
})}
|
|
1324
|
-
|
|
1325
|
-
{/* Text input */}
|
|
1326
|
-
<input
|
|
1327
|
-
ref={inputRef}
|
|
1328
|
-
type="text"
|
|
1329
|
-
value={inputValue}
|
|
1330
|
-
onChange={(e) => {
|
|
1331
|
-
setInputValue(e.target.value)
|
|
1332
|
-
if (!isOpen) setIsOpen(true)
|
|
1333
|
-
}}
|
|
1334
|
-
onFocus={() => {
|
|
1335
|
-
if (!disabled) setIsOpen(true)
|
|
1336
|
-
}}
|
|
1337
|
-
onKeyDown={handleKeyDown}
|
|
1338
|
-
disabled={disabled}
|
|
1339
|
-
placeholder={value.length === 0 ? placeholder : ""}
|
|
1340
|
-
className="flex-1 min-w-[100px] text-base bg-transparent outline-none text-semantic-text-primary placeholder:text-semantic-text-muted"
|
|
1341
|
-
role="combobox"
|
|
1342
|
-
aria-expanded={isOpen}
|
|
1343
|
-
aria-haspopup="listbox"
|
|
1344
|
-
/>
|
|
1345
|
-
|
|
1346
|
-
{/* Chevron */}
|
|
1347
|
-
{isOpen ? (
|
|
1348
|
-
<ChevronRight className="size-5 text-semantic-text-muted shrink-0 ml-auto" />
|
|
1349
|
-
) : (
|
|
1350
|
-
<ChevronDown className="size-5 text-semantic-text-muted shrink-0 ml-auto" />
|
|
1351
|
-
)}
|
|
1352
|
-
</div>
|
|
1353
|
-
|
|
1354
|
-
{/* Dropdown panel */}
|
|
1355
|
-
{isOpen && (
|
|
1356
|
-
<div className="absolute z-[9999] top-full mt-1 w-full bg-semantic-bg-primary border border-semantic-border-layout rounded shadow-md animate-in fade-in-0 zoom-in-95 slide-in-from-top-2 duration-200">
|
|
1357
|
-
{/* Creatable hint \u2014 contextual */}
|
|
1358
|
-
<div className="flex items-center justify-between px-4 py-2 border-b border-semantic-border-layout">
|
|
1359
|
-
{canAddCustom ? (
|
|
1360
|
-
<span className="text-sm font-medium text-semantic-text-primary">
|
|
1361
|
-
Press enter to add “{inputValue.trim()}”
|
|
1362
|
-
</span>
|
|
1363
|
-
) : (
|
|
1364
|
-
<span className="text-sm text-semantic-text-muted">
|
|
1365
|
-
{creatableHint}
|
|
1366
|
-
</span>
|
|
1367
|
-
)}
|
|
1368
|
-
<kbd className="inline-flex items-center gap-0.5 rounded border border-semantic-border-layout bg-semantic-bg-ui px-1.5 py-0.5 text-[10px] text-semantic-text-muted font-medium">
|
|
1369
|
-
Enter \u21B5
|
|
1370
|
-
</kbd>
|
|
1371
|
-
</div>
|
|
1372
|
-
|
|
1373
|
-
{/* Preset option chips */}
|
|
1374
|
-
{filteredPresets.length > 0 && (
|
|
1375
|
-
<div className="px-2.5 py-2 flex flex-wrap gap-1.5">
|
|
1376
|
-
{filteredPresets.map((option) => (
|
|
1377
|
-
<button
|
|
1378
|
-
key={option.value}
|
|
1379
|
-
type="button"
|
|
1380
|
-
onMouseDown={(e) => {
|
|
1381
|
-
e.preventDefault()
|
|
1382
|
-
addValue(option.value)
|
|
1383
|
-
}}
|
|
1384
|
-
className="inline-flex items-center gap-1.5 bg-semantic-bg-ui px-2.5 py-1.5 rounded text-sm text-semantic-text-primary hover:bg-semantic-bg-hover transition-colors whitespace-nowrap"
|
|
1385
|
-
>
|
|
1386
|
-
<Plus className="size-3 shrink-0 text-semantic-text-muted" />
|
|
1387
|
-
{option.label}
|
|
1388
|
-
</button>
|
|
1389
|
-
))}
|
|
1390
|
-
</div>
|
|
1391
|
-
)}
|
|
1392
|
-
|
|
1393
|
-
</div>
|
|
1394
|
-
)}
|
|
1395
|
-
|
|
1396
|
-
{/* Helper text below trigger */}
|
|
1397
|
-
{helperText && !isOpen && (
|
|
1398
|
-
<div className="flex items-center gap-1.5 mt-1.5">
|
|
1399
|
-
<Info className="size-[18px] shrink-0 text-semantic-text-muted" />
|
|
1400
|
-
<p className="m-0 text-sm text-semantic-text-muted">
|
|
1401
|
-
{helperText}
|
|
1402
|
-
</p>
|
|
1403
|
-
</div>
|
|
1404
|
-
)}
|
|
1405
|
-
</div>
|
|
1406
|
-
)
|
|
1407
|
-
}
|
|
1408
|
-
)
|
|
1409
|
-
CreatableMultiSelect.displayName = "CreatableMultiSelect"
|
|
1410
|
-
|
|
1411
|
-
export { CreatableMultiSelect, creatableMultiSelectTriggerVariants }
|
|
1412
|
-
`,
|
|
1413
|
-
"creatable-select": `import * as React from "react"
|
|
1414
|
-
import { cva, type VariantProps } from "class-variance-authority"
|
|
1415
|
-
import { ChevronDown, Check } from "lucide-react"
|
|
1416
|
-
|
|
1417
|
-
import { cn } from "@/lib/utils"
|
|
1418
|
-
|
|
1419
|
-
const creatableSelectTriggerVariants = cva(
|
|
1420
|
-
"flex h-[42px] w-full items-center justify-between rounded bg-semantic-bg-primary px-4 py-2 text-base text-semantic-text-primary outline-none transition-all disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-[var(--color-neutral-50)]",
|
|
1421
|
-
{
|
|
1422
|
-
variants: {
|
|
1423
|
-
state: {
|
|
1424
|
-
default:
|
|
1425
|
-
"border border-semantic-border-input focus-within:border-semantic-border-input-focus/50 focus-within:shadow-[0_0_0_1px_rgba(43,188,202,0.15)]",
|
|
1426
|
-
error:
|
|
1427
|
-
"border border-semantic-error-primary/40 focus-within:border-semantic-error-primary/60 focus-within:shadow-[0_0_0_1px_rgba(240,68,56,0.1)]",
|
|
1428
|
-
},
|
|
1429
|
-
},
|
|
1430
|
-
defaultVariants: {
|
|
1431
|
-
state: "default",
|
|
1432
|
-
},
|
|
1433
|
-
}
|
|
1434
|
-
)
|
|
1435
|
-
|
|
1436
|
-
export interface CreatableSelectOption {
|
|
1437
|
-
value: string
|
|
1438
|
-
label: string
|
|
1439
|
-
disabled?: boolean
|
|
1440
|
-
}
|
|
1441
|
-
|
|
1442
|
-
export interface CreatableSelectProps
|
|
1443
|
-
extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange">,
|
|
1444
|
-
VariantProps<typeof creatableSelectTriggerVariants> {
|
|
1445
|
-
/** Currently selected value */
|
|
1446
|
-
value?: string
|
|
1447
|
-
/** Callback when value changes (selection or creation) */
|
|
1448
|
-
onValueChange?: (value: string) => void
|
|
1449
|
-
/** Available options */
|
|
1450
|
-
options?: CreatableSelectOption[]
|
|
1451
|
-
/** Placeholder when no value selected */
|
|
1452
|
-
placeholder?: string
|
|
1453
|
-
/** Hint text shown above options when dropdown is open */
|
|
1454
|
-
creatableHint?: string
|
|
1455
|
-
/** Whether the select is disabled */
|
|
1456
|
-
disabled?: boolean
|
|
1457
|
-
}
|
|
1458
|
-
|
|
1459
|
-
const CreatableSelect = React.forwardRef<HTMLDivElement, CreatableSelectProps>(
|
|
1460
|
-
(
|
|
1461
|
-
{
|
|
1462
|
-
className,
|
|
1463
|
-
state,
|
|
1464
|
-
value,
|
|
1465
|
-
onValueChange,
|
|
1466
|
-
options = [],
|
|
1467
|
-
placeholder = "Select an option",
|
|
1468
|
-
creatableHint = "Type to create a custom option",
|
|
1469
|
-
disabled = false,
|
|
1470
|
-
...props
|
|
1471
|
-
},
|
|
1472
|
-
ref
|
|
1473
|
-
) => {
|
|
1474
|
-
const [open, setOpen] = React.useState(false)
|
|
1475
|
-
const [search, setSearch] = React.useState("")
|
|
1476
|
-
const [highlightIndex, setHighlightIndex] = React.useState(-1)
|
|
1477
|
-
const containerRef = React.useRef<HTMLDivElement>(null)
|
|
1478
|
-
const inputRef = React.useRef<HTMLInputElement>(null)
|
|
1479
|
-
const listRef = React.useRef<HTMLDivElement>(null)
|
|
1480
|
-
|
|
1481
|
-
// Merge forwarded ref with internal ref
|
|
1482
|
-
React.useImperativeHandle(ref, () => containerRef.current!)
|
|
1483
|
-
|
|
1484
|
-
const selectedLabel = React.useMemo(() => {
|
|
1485
|
-
const found = options.find((o) => o.value === value)
|
|
1486
|
-
return found ? found.label : value || ""
|
|
1487
|
-
}, [options, value])
|
|
1488
|
-
|
|
1489
|
-
const filtered = React.useMemo(() => {
|
|
1490
|
-
if (!search.trim()) return options
|
|
1491
|
-
const q = search.toLowerCase()
|
|
1492
|
-
return options.filter((o) => o.label.toLowerCase().includes(q))
|
|
1493
|
-
}, [options, search])
|
|
1494
|
-
|
|
1495
|
-
const isCustom =
|
|
1496
|
-
search.trim().length > 0 &&
|
|
1497
|
-
!options.some((o) => o.label.toLowerCase() === search.trim().toLowerCase())
|
|
1498
|
-
|
|
1499
|
-
const handleOpen = () => {
|
|
1500
|
-
if (disabled) return
|
|
1501
|
-
setOpen(true)
|
|
1502
|
-
setSearch("")
|
|
1503
|
-
setHighlightIndex(-1)
|
|
1504
|
-
requestAnimationFrame(() => inputRef.current?.focus())
|
|
1505
|
-
}
|
|
1506
|
-
|
|
1507
|
-
const handleSelect = React.useCallback(
|
|
1508
|
-
(val: string) => {
|
|
1509
|
-
onValueChange?.(val)
|
|
1510
|
-
setOpen(false)
|
|
1511
|
-
setSearch("")
|
|
1512
|
-
},
|
|
1513
|
-
[onValueChange]
|
|
1514
|
-
)
|
|
1515
|
-
|
|
1516
|
-
const handleCreate = React.useCallback(() => {
|
|
1517
|
-
const trimmed = search.trim()
|
|
1518
|
-
if (trimmed) {
|
|
1519
|
-
onValueChange?.(trimmed)
|
|
1520
|
-
setOpen(false)
|
|
1521
|
-
setSearch("")
|
|
1522
|
-
}
|
|
1523
|
-
}, [search, onValueChange])
|
|
1524
|
-
|
|
1525
|
-
const handleKeyDown = (e: React.KeyboardEvent) => {
|
|
1526
|
-
if (e.key === "Escape") {
|
|
1527
|
-
e.preventDefault()
|
|
1528
|
-
setOpen(false)
|
|
1529
|
-
return
|
|
1530
|
-
}
|
|
1531
|
-
|
|
1532
|
-
if (e.key === "Enter") {
|
|
1533
|
-
e.preventDefault()
|
|
1534
|
-
if (highlightIndex >= 0 && highlightIndex < filtered.length) {
|
|
1535
|
-
const opt = filtered[highlightIndex]
|
|
1536
|
-
if (!opt.disabled) handleSelect(opt.value)
|
|
1537
|
-
} else if (isCustom) {
|
|
1538
|
-
handleCreate()
|
|
1539
|
-
} else if (filtered.length === 1 && !filtered[0].disabled) {
|
|
1540
|
-
handleSelect(filtered[0].value)
|
|
1541
|
-
}
|
|
1542
|
-
return
|
|
1543
|
-
}
|
|
1544
|
-
|
|
1545
|
-
if (e.key === "ArrowDown") {
|
|
1546
|
-
e.preventDefault()
|
|
1547
|
-
setHighlightIndex((prev) => {
|
|
1548
|
-
const next = prev + 1
|
|
1549
|
-
return next >= filtered.length ? 0 : next
|
|
1550
|
-
})
|
|
1551
|
-
return
|
|
1552
|
-
}
|
|
1553
|
-
|
|
1554
|
-
if (e.key === "ArrowUp") {
|
|
1555
|
-
e.preventDefault()
|
|
1556
|
-
setHighlightIndex((prev) => {
|
|
1557
|
-
const next = prev - 1
|
|
1558
|
-
return next < 0 ? filtered.length - 1 : next
|
|
1559
|
-
})
|
|
1560
|
-
return
|
|
1561
|
-
}
|
|
1562
|
-
}
|
|
1563
|
-
|
|
1564
|
-
// Scroll highlighted item into view
|
|
1565
|
-
React.useEffect(() => {
|
|
1566
|
-
if (highlightIndex >= 0 && listRef.current) {
|
|
1567
|
-
const item = listRef.current.children[highlightIndex] as HTMLElement
|
|
1568
|
-
item?.scrollIntoView({ block: "nearest" })
|
|
1569
|
-
}
|
|
1570
|
-
}, [highlightIndex])
|
|
1571
|
-
|
|
1572
|
-
// Close on outside click
|
|
1573
|
-
React.useEffect(() => {
|
|
1574
|
-
if (!open) return
|
|
1575
|
-
const handler = (e: MouseEvent) => {
|
|
1576
|
-
if (
|
|
1577
|
-
containerRef.current &&
|
|
1578
|
-
!containerRef.current.contains(e.target as Node)
|
|
1579
|
-
) {
|
|
1580
|
-
setOpen(false)
|
|
1581
|
-
}
|
|
1582
|
-
}
|
|
1583
|
-
document.addEventListener("mousedown", handler)
|
|
1584
|
-
return () => document.removeEventListener("mousedown", handler)
|
|
1585
|
-
}, [open])
|
|
1586
|
-
|
|
1587
|
-
// Reset highlight when filter changes
|
|
1588
|
-
React.useEffect(() => {
|
|
1589
|
-
setHighlightIndex(-1)
|
|
1590
|
-
}, [search])
|
|
1591
|
-
|
|
1592
|
-
return (
|
|
1593
|
-
<div
|
|
1594
|
-
ref={containerRef}
|
|
1595
|
-
className={cn("relative w-full", className)}
|
|
1596
|
-
{...props}
|
|
1597
|
-
>
|
|
1598
|
-
{/* Trigger / Input */}
|
|
1599
|
-
{open ? (
|
|
1600
|
-
<div
|
|
1601
|
-
className={cn(
|
|
1602
|
-
creatableSelectTriggerVariants({ state }),
|
|
1603
|
-
"cursor-text"
|
|
1604
|
-
)}
|
|
1605
|
-
onClick={() => inputRef.current?.focus()}
|
|
1606
|
-
>
|
|
1607
|
-
<input
|
|
1608
|
-
ref={inputRef}
|
|
1609
|
-
type="text"
|
|
1610
|
-
value={search}
|
|
1611
|
-
onChange={(e) => setSearch(e.target.value)}
|
|
1612
|
-
onKeyDown={handleKeyDown}
|
|
1613
|
-
className="flex-1 min-w-0 bg-transparent outline-none text-base text-semantic-text-primary placeholder:text-semantic-text-muted"
|
|
1614
|
-
placeholder={selectedLabel || placeholder}
|
|
1615
|
-
aria-expanded="true"
|
|
1616
|
-
aria-haspopup="listbox"
|
|
1617
|
-
role="combobox"
|
|
1618
|
-
aria-autocomplete="list"
|
|
1619
|
-
/>
|
|
1620
|
-
<ChevronDown className="size-4 text-semantic-text-muted opacity-70 shrink-0 rotate-180 transition-transform" />
|
|
1621
|
-
</div>
|
|
1622
|
-
) : (
|
|
1623
|
-
<button
|
|
1624
|
-
type="button"
|
|
1625
|
-
onClick={handleOpen}
|
|
1626
|
-
disabled={disabled}
|
|
1627
|
-
className={cn(
|
|
1628
|
-
creatableSelectTriggerVariants({ state }),
|
|
1629
|
-
"cursor-pointer text-left"
|
|
1630
|
-
)}
|
|
1631
|
-
aria-haspopup="listbox"
|
|
1632
|
-
aria-expanded="false"
|
|
1633
|
-
>
|
|
1634
|
-
<span
|
|
1635
|
-
className={cn(
|
|
1636
|
-
"line-clamp-1",
|
|
1637
|
-
!selectedLabel && "text-semantic-text-muted"
|
|
1638
|
-
)}
|
|
1639
|
-
>
|
|
1640
|
-
{selectedLabel || placeholder}
|
|
1641
|
-
</span>
|
|
1642
|
-
<ChevronDown className="size-4 text-semantic-text-muted opacity-70 shrink-0" />
|
|
1643
|
-
</button>
|
|
1644
|
-
)}
|
|
1645
|
-
|
|
1646
|
-
{/* Dropdown */}
|
|
1647
|
-
{open && (
|
|
1648
|
-
<div className="absolute left-0 top-full z-[9999] mt-1 w-full rounded border border-semantic-border-layout bg-semantic-bg-primary shadow-md animate-in fade-in-0 zoom-in-95 slide-in-from-top-2 duration-200">
|
|
1649
|
-
{/* Creatable hint */}
|
|
1650
|
-
<div className="flex items-center justify-between px-4 py-2 border-b border-semantic-border-layout">
|
|
1651
|
-
<span className="text-sm text-semantic-text-muted">
|
|
1652
|
-
{creatableHint}
|
|
1653
|
-
</span>
|
|
1654
|
-
<kbd className="inline-flex items-center gap-0.5 rounded border border-semantic-border-layout bg-semantic-bg-ui px-1.5 py-0.5 text-[10px] text-semantic-text-muted font-medium">
|
|
1655
|
-
Enter \u21B5
|
|
1656
|
-
</kbd>
|
|
1657
|
-
</div>
|
|
1658
|
-
|
|
1659
|
-
{/* Options list */}
|
|
1660
|
-
<div
|
|
1661
|
-
ref={listRef}
|
|
1662
|
-
role="listbox"
|
|
1663
|
-
className="max-h-60 overflow-y-auto p-1"
|
|
1664
|
-
>
|
|
1665
|
-
{filtered.length === 0 && !isCustom && (
|
|
1666
|
-
<div className="px-4 py-2 text-sm text-semantic-text-muted">
|
|
1667
|
-
No options found
|
|
1668
|
-
</div>
|
|
1669
|
-
)}
|
|
1670
|
-
{filtered.map((opt, i) => (
|
|
1671
|
-
<button
|
|
1672
|
-
key={opt.value}
|
|
1673
|
-
type="button"
|
|
1674
|
-
role="option"
|
|
1675
|
-
aria-selected={opt.value === value}
|
|
1676
|
-
disabled={opt.disabled}
|
|
1677
|
-
onClick={() => !opt.disabled && handleSelect(opt.value)}
|
|
1678
|
-
onMouseEnter={() => setHighlightIndex(i)}
|
|
1679
|
-
className={cn(
|
|
1680
|
-
"relative flex w-full items-center rounded-sm py-2 pl-4 pr-8 text-base text-semantic-text-primary outline-none cursor-pointer select-none",
|
|
1681
|
-
"hover:bg-semantic-bg-ui",
|
|
1682
|
-
highlightIndex === i && "bg-semantic-bg-ui",
|
|
1683
|
-
opt.disabled &&
|
|
1684
|
-
"pointer-events-none opacity-50 cursor-not-allowed"
|
|
1685
|
-
)}
|
|
1686
|
-
>
|
|
1687
|
-
{opt.label}
|
|
1688
|
-
{opt.value === value && (
|
|
1689
|
-
<span className="absolute right-2 flex size-4 items-center justify-center">
|
|
1690
|
-
<Check className="size-4 text-semantic-brand" />
|
|
1691
|
-
</span>
|
|
1692
|
-
)}
|
|
1693
|
-
</button>
|
|
1694
|
-
))}
|
|
1695
|
-
|
|
1696
|
-
{/* Show custom creation option */}
|
|
1697
|
-
{isCustom && (
|
|
1698
|
-
<button
|
|
1699
|
-
type="button"
|
|
1700
|
-
role="option"
|
|
1701
|
-
aria-selected={false}
|
|
1702
|
-
onClick={handleCreate}
|
|
1703
|
-
onMouseEnter={() => setHighlightIndex(filtered.length)}
|
|
1704
|
-
className={cn(
|
|
1705
|
-
"flex w-full items-center gap-2 rounded-sm py-2 pl-4 pr-8 text-base outline-none cursor-pointer select-none",
|
|
1706
|
-
"text-semantic-text-link hover:bg-semantic-bg-ui",
|
|
1707
|
-
highlightIndex === filtered.length && "bg-semantic-bg-ui"
|
|
1708
|
-
)}
|
|
1709
|
-
>
|
|
1710
|
-
Create “{search.trim()}”
|
|
1711
|
-
</button>
|
|
1712
|
-
)}
|
|
1713
|
-
</div>
|
|
1714
|
-
</div>
|
|
1715
|
-
)}
|
|
1716
|
-
</div>
|
|
1717
|
-
)
|
|
1718
|
-
}
|
|
1719
|
-
)
|
|
1720
|
-
CreatableSelect.displayName = "CreatableSelect"
|
|
1721
|
-
|
|
1722
|
-
export { CreatableSelect, creatableSelectTriggerVariants }
|
|
1723
1139
|
`,
|
|
1724
1140
|
"delete-confirmation-modal": `import * as React from "react";
|
|
1725
1141
|
|
|
@@ -2472,7 +1888,7 @@ import { cn } from "@/lib/utils";
|
|
|
2472
1888
|
* Input variants for different visual states
|
|
2473
1889
|
*/
|
|
2474
1890
|
const inputVariants = cva(
|
|
2475
|
-
"h-
|
|
1891
|
+
"h-10 w-full rounded bg-semantic-bg-primary px-4 py-2.5 text-sm text-semantic-text-primary outline-none transition-all file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-semantic-text-primary placeholder:text-semantic-text-placeholder disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-[var(--color-neutral-50)]",
|
|
2476
1892
|
{
|
|
2477
1893
|
variants: {
|
|
2478
1894
|
state: {
|
|
@@ -2566,7 +1982,7 @@ import { cn } from "@/lib/utils";
|
|
|
2566
1982
|
* MultiSelect trigger variants matching TextField styling
|
|
2567
1983
|
*/
|
|
2568
1984
|
const multiSelectTriggerVariants = cva(
|
|
2569
|
-
"flex min-h-
|
|
1985
|
+
"flex min-h-10 w-full items-center justify-between rounded bg-semantic-bg-primary px-4 py-2 text-sm text-semantic-text-primary transition-all disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-[var(--color-neutral-50)]",
|
|
2570
1986
|
{
|
|
2571
1987
|
variants: {
|
|
2572
1988
|
state: {
|
|
@@ -2936,7 +2352,7 @@ const MultiSelect = React.forwardRef<HTMLButtonElement, MultiSelectProps>(
|
|
|
2936
2352
|
disabled={isDisabled}
|
|
2937
2353
|
onClick={() => !isDisabled && toggleOption(option.value)}
|
|
2938
2354
|
className={cn(
|
|
2939
|
-
"relative flex w-full cursor-pointer select-none items-center rounded-sm py-2 pl-4 pr-8 text-
|
|
2355
|
+
"relative flex w-full cursor-pointer select-none items-center rounded-sm py-2 pl-4 pr-8 text-sm text-semantic-text-primary outline-none",
|
|
2940
2356
|
"hover:bg-semantic-bg-ui focus:bg-semantic-bg-ui",
|
|
2941
2357
|
isSelected && "bg-semantic-bg-ui",
|
|
2942
2358
|
isDisabled && "pointer-events-none opacity-50"
|
|
@@ -3056,8 +2472,6 @@ export interface PageHeaderProps
|
|
|
3056
2472
|
showBackButton?: boolean;
|
|
3057
2473
|
/** Callback when back button is clicked */
|
|
3058
2474
|
onBackClick?: () => void;
|
|
3059
|
-
/** Optional badge/tag displayed next to the title (e.g., status or type indicator) */
|
|
3060
|
-
badge?: React.ReactNode;
|
|
3061
2475
|
/** Optional info icon displayed next to the title (e.g., tooltip trigger) */
|
|
3062
2476
|
infoIcon?: React.ReactNode;
|
|
3063
2477
|
/** Action buttons/elements rendered on the right side */
|
|
@@ -3079,7 +2493,6 @@ const PageHeader = React.forwardRef<HTMLDivElement, PageHeaderProps>(
|
|
|
3079
2493
|
icon,
|
|
3080
2494
|
showBackButton = false,
|
|
3081
2495
|
onBackClick,
|
|
3082
|
-
badge,
|
|
3083
2496
|
infoIcon,
|
|
3084
2497
|
actions,
|
|
3085
2498
|
showBorder = true,
|
|
@@ -3269,9 +2682,6 @@ const PageHeader = React.forwardRef<HTMLDivElement, PageHeaderProps>(
|
|
|
3269
2682
|
<h1 className="m-0 text-lg font-semibold text-semantic-text-primary truncate">
|
|
3270
2683
|
{title}
|
|
3271
2684
|
</h1>
|
|
3272
|
-
{badge && (
|
|
3273
|
-
<span className="flex-shrink-0">{badge}</span>
|
|
3274
|
-
)}
|
|
3275
2685
|
{infoIcon && (
|
|
3276
2686
|
<span className="flex-shrink-0 [&_svg]:w-4 [&_svg]:h-4 text-semantic-text-muted">
|
|
3277
2687
|
{infoIcon}
|
|
@@ -4149,7 +3559,7 @@ import { cn } from "@/lib/utils";
|
|
|
4149
3559
|
* SelectTrigger variants matching TextField styling
|
|
4150
3560
|
*/
|
|
4151
3561
|
const selectTriggerVariants = cva(
|
|
4152
|
-
"flex h-
|
|
3562
|
+
"flex h-10 w-full items-center justify-between rounded bg-semantic-bg-primary px-4 py-2.5 text-sm text-semantic-text-primary outline-none transition-all disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-[var(--color-neutral-50)] [&>span]:line-clamp-1",
|
|
4153
3563
|
{
|
|
4154
3564
|
variants: {
|
|
4155
3565
|
state: {
|
|
@@ -4169,17 +3579,7 @@ const Select = SelectPrimitive.Root;
|
|
|
4169
3579
|
|
|
4170
3580
|
const SelectGroup = SelectPrimitive.Group;
|
|
4171
3581
|
|
|
4172
|
-
const SelectValue =
|
|
4173
|
-
React.ElementRef<typeof SelectPrimitive.Value>,
|
|
4174
|
-
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Value>
|
|
4175
|
-
>(({ className, ...props }, ref) => (
|
|
4176
|
-
<SelectPrimitive.Value
|
|
4177
|
-
ref={ref}
|
|
4178
|
-
className={cn("[&[data-placeholder]]:text-semantic-text-muted", className)}
|
|
4179
|
-
{...props}
|
|
4180
|
-
/>
|
|
4181
|
-
));
|
|
4182
|
-
SelectValue.displayName = SelectPrimitive.Value.displayName;
|
|
3582
|
+
const SelectValue = SelectPrimitive.Value;
|
|
4183
3583
|
|
|
4184
3584
|
export interface SelectTriggerProps
|
|
4185
3585
|
extends
|
|
@@ -4297,7 +3697,7 @@ const SelectItem = React.forwardRef<
|
|
|
4297
3697
|
<SelectPrimitive.Item
|
|
4298
3698
|
ref={ref}
|
|
4299
3699
|
className={cn(
|
|
4300
|
-
"relative flex w-full cursor-pointer select-none items-center rounded-sm py-2 pl-4 pr-8 text-
|
|
3700
|
+
"relative flex w-full cursor-pointer select-none items-center rounded-sm py-2 pl-4 pr-8 text-sm text-semantic-text-primary outline-none",
|
|
4301
3701
|
"hover:bg-semantic-bg-ui focus:bg-semantic-bg-ui",
|
|
4302
3702
|
"data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
4303
3703
|
className
|
|
@@ -5188,7 +4588,7 @@ const textFieldContainerVariants = cva(
|
|
|
5188
4588
|
* TextField input variants (standalone without container)
|
|
5189
4589
|
*/
|
|
5190
4590
|
const textFieldInputVariants = cva(
|
|
5191
|
-
"h-
|
|
4591
|
+
"h-10 w-full rounded bg-semantic-bg-primary px-4 py-2.5 text-sm text-semantic-text-primary outline-none transition-all file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-semantic-text-primary placeholder:text-semantic-text-placeholder disabled:cursor-not-allowed disabled:opacity-50 disabled:bg-[var(--color-neutral-50)]",
|
|
5192
4592
|
{
|
|
5193
4593
|
variants: {
|
|
5194
4594
|
state: {
|
|
@@ -5319,7 +4719,7 @@ const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(
|
|
|
5319
4719
|
type={type}
|
|
5320
4720
|
className={cn(
|
|
5321
4721
|
hasAddons
|
|
5322
|
-
? "flex-1 bg-transparent border-0 outline-none focus:ring-0 px-0 h-full text-
|
|
4722
|
+
? "flex-1 bg-transparent border-0 outline-none focus:ring-0 px-0 h-full text-sm text-semantic-text-primary placeholder:text-semantic-text-placeholder disabled:cursor-not-allowed"
|
|
5323
4723
|
: textFieldInputVariants({ state: derivedState, className }),
|
|
5324
4724
|
type === "number" &&
|
|
5325
4725
|
"[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none"
|
|
@@ -5369,7 +4769,7 @@ const TextField = React.forwardRef<HTMLInputElement, TextFieldProps>(
|
|
|
5369
4769
|
state: derivedState,
|
|
5370
4770
|
disabled: disabled || loading,
|
|
5371
4771
|
}),
|
|
5372
|
-
"h-
|
|
4772
|
+
"h-10 px-4",
|
|
5373
4773
|
inputContainerClassName
|
|
5374
4774
|
)}
|
|
5375
4775
|
>
|
|
@@ -5466,19 +4866,19 @@ const ToastViewport = React.forwardRef<
|
|
|
5466
4866
|
ToastViewport.displayName = ToastPrimitives.Viewport.displayName;
|
|
5467
4867
|
|
|
5468
4868
|
const toastVariants = cva(
|
|
5469
|
-
"group pointer-events-auto relative flex w-full items-center justify-between
|
|
4869
|
+
"group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-lg border p-4 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full",
|
|
5470
4870
|
{
|
|
5471
4871
|
variants: {
|
|
5472
4872
|
variant: {
|
|
5473
4873
|
default:
|
|
5474
4874
|
"border-semantic-border-layout bg-semantic-bg-primary text-semantic-text-primary",
|
|
5475
4875
|
success:
|
|
5476
|
-
"border-
|
|
4876
|
+
"border-semantic-success-border bg-semantic-success-surface text-semantic-success-hover",
|
|
5477
4877
|
error:
|
|
5478
|
-
"border-
|
|
4878
|
+
"border-semantic-error-border bg-semantic-error-surface text-semantic-error-hover",
|
|
5479
4879
|
warning:
|
|
5480
|
-
"border-
|
|
5481
|
-
info: "border-
|
|
4880
|
+
"border-semantic-warning-border bg-semantic-warning-surface text-semantic-warning-hover",
|
|
4881
|
+
info: "border-semantic-info-border bg-semantic-info-surface text-semantic-info-hover",
|
|
5482
4882
|
},
|
|
5483
4883
|
},
|
|
5484
4884
|
defaultVariants: {
|
|
@@ -5528,13 +4928,17 @@ const ToastClose = React.forwardRef<
|
|
|
5528
4928
|
<ToastPrimitives.Close
|
|
5529
4929
|
ref={ref}
|
|
5530
4930
|
className={cn(
|
|
5531
|
-
"
|
|
4931
|
+
"absolute right-2 top-2 rounded-md p-1 text-semantic-text-muted opacity-0 transition-opacity hover:text-semantic-text-primary focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100",
|
|
4932
|
+
"group-[.success]:text-semantic-success-hover group-[.success]:hover:text-semantic-success-hover",
|
|
4933
|
+
"group-[.error]:text-semantic-error-hover group-[.error]:hover:text-semantic-error-hover",
|
|
4934
|
+
"group-[.warning]:text-semantic-warning-hover group-[.warning]:hover:text-semantic-warning-hover",
|
|
4935
|
+
"group-[.info]:text-semantic-info-hover group-[.info]:hover:text-semantic-info-hover",
|
|
5532
4936
|
className
|
|
5533
4937
|
)}
|
|
5534
4938
|
toast-close=""
|
|
5535
4939
|
{...props}
|
|
5536
4940
|
>
|
|
5537
|
-
<X className="h-
|
|
4941
|
+
<X className="h-4 w-4" />
|
|
5538
4942
|
</ToastPrimitives.Close>
|
|
5539
4943
|
));
|
|
5540
4944
|
ToastClose.displayName = ToastPrimitives.Close.displayName;
|
|
@@ -5545,7 +4949,7 @@ const ToastTitle = React.forwardRef<
|
|
|
5545
4949
|
>(({ className, ...props }, ref) => (
|
|
5546
4950
|
<ToastPrimitives.Title
|
|
5547
4951
|
ref={ref}
|
|
5548
|
-
className={cn("text-sm font-semibold
|
|
4952
|
+
className={cn("text-sm font-semibold", className)}
|
|
5549
4953
|
{...props}
|
|
5550
4954
|
/>
|
|
5551
4955
|
));
|
|
@@ -5557,7 +4961,7 @@ const ToastDescription = React.forwardRef<
|
|
|
5557
4961
|
>(({ className, ...props }, ref) => (
|
|
5558
4962
|
<ToastPrimitives.Description
|
|
5559
4963
|
ref={ref}
|
|
5560
|
-
className={cn("text-
|
|
4964
|
+
className={cn("text-sm opacity-90", className)}
|
|
5561
4965
|
{...props}
|
|
5562
4966
|
/>
|
|
5563
4967
|
));
|
|
@@ -5836,11 +5240,11 @@ function Toaster() {
|
|
|
5836
5240
|
className={variant ?? undefined}
|
|
5837
5241
|
{...props}
|
|
5838
5242
|
>
|
|
5839
|
-
<div className="flex
|
|
5243
|
+
<div className="flex gap-3">
|
|
5840
5244
|
{Icon && (
|
|
5841
5245
|
<Icon
|
|
5842
5246
|
className={cn(
|
|
5843
|
-
"
|
|
5247
|
+
"h-5 w-5 shrink-0",
|
|
5844
5248
|
variant === "success" && "text-semantic-success-primary",
|
|
5845
5249
|
variant === "error" && "text-semantic-error-primary",
|
|
5846
5250
|
variant === "warning" && "text-semantic-warning-primary",
|
|
@@ -5848,7 +5252,7 @@ function Toaster() {
|
|
|
5848
5252
|
)}
|
|
5849
5253
|
/>
|
|
5850
5254
|
)}
|
|
5851
|
-
<div className="
|
|
5255
|
+
<div className="grid gap-1">
|
|
5852
5256
|
{title && <ToastTitle>{title}</ToastTitle>}
|
|
5853
5257
|
{description && (
|
|
5854
5258
|
<ToastDescription>{description}</ToastDescription>
|
|
@@ -6561,44 +5965,6 @@ var componentMetadata = {
|
|
|
6561
5965
|
}
|
|
6562
5966
|
]
|
|
6563
5967
|
},
|
|
6564
|
-
"creatable-multi-select": {
|
|
6565
|
-
"name": "CreatableMultiSelect",
|
|
6566
|
-
"description": "A creatable multi select component.",
|
|
6567
|
-
"dependencies": [
|
|
6568
|
-
"class-variance-authority",
|
|
6569
|
-
"clsx",
|
|
6570
|
-
"tailwind-merge",
|
|
6571
|
-
"lucide-react"
|
|
6572
|
-
],
|
|
6573
|
-
"props": [],
|
|
6574
|
-
"variants": [],
|
|
6575
|
-
"examples": [
|
|
6576
|
-
{
|
|
6577
|
-
"title": "Basic CreatableMultiSelect",
|
|
6578
|
-
"code": "<CreatableMultiSelect>Content</CreatableMultiSelect>",
|
|
6579
|
-
"description": "Simple creatable multi select usage"
|
|
6580
|
-
}
|
|
6581
|
-
]
|
|
6582
|
-
},
|
|
6583
|
-
"creatable-select": {
|
|
6584
|
-
"name": "CreatableSelect",
|
|
6585
|
-
"description": "A creatable select component.",
|
|
6586
|
-
"dependencies": [
|
|
6587
|
-
"class-variance-authority",
|
|
6588
|
-
"clsx",
|
|
6589
|
-
"tailwind-merge",
|
|
6590
|
-
"lucide-react"
|
|
6591
|
-
],
|
|
6592
|
-
"props": [],
|
|
6593
|
-
"variants": [],
|
|
6594
|
-
"examples": [
|
|
6595
|
-
{
|
|
6596
|
-
"title": "Basic CreatableSelect",
|
|
6597
|
-
"code": "<CreatableSelect>Content</CreatableSelect>",
|
|
6598
|
-
"description": "Simple creatable select usage"
|
|
6599
|
-
}
|
|
6600
|
-
]
|
|
6601
|
-
},
|
|
6602
5968
|
"delete-confirmation-modal": {
|
|
6603
5969
|
"name": "DeleteConfirmationModal",
|
|
6604
5970
|
"description": "A delete confirmation modal component.",
|
package/package.json
CHANGED