@discuss-ds/ui 0.1.0 → 0.2.0
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/CHANGELOG.md +8 -0
- package/dist/index.cjs +520 -407
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +29 -5
- package/dist/index.d.ts +29 -5
- package/dist/index.js +495 -383
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1362,18 +1362,126 @@ var FormMessage = React23.forwardRef(
|
|
|
1362
1362
|
);
|
|
1363
1363
|
FormMessage.displayName = "FormMessage";
|
|
1364
1364
|
|
|
1365
|
-
// src/components/Forms & Data Entry/
|
|
1365
|
+
// src/components/Forms & Data Entry/InlineEdit.tsx
|
|
1366
1366
|
import * as React24 from "react";
|
|
1367
|
-
import {
|
|
1367
|
+
import { PencilSimple } from "@phosphor-icons/react";
|
|
1368
|
+
import { jsx as jsx25, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
1369
|
+
var InlineEdit = React24.forwardRef(
|
|
1370
|
+
({
|
|
1371
|
+
className,
|
|
1372
|
+
textClassName,
|
|
1373
|
+
value: valueProp,
|
|
1374
|
+
defaultValue = "",
|
|
1375
|
+
onValueChange,
|
|
1376
|
+
placeholder = "Click to edit",
|
|
1377
|
+
multiline,
|
|
1378
|
+
maxLength,
|
|
1379
|
+
disabled,
|
|
1380
|
+
onEditingChange,
|
|
1381
|
+
"aria-label": ariaLabel,
|
|
1382
|
+
...props
|
|
1383
|
+
}, ref) => {
|
|
1384
|
+
const [internal, setInternal] = React24.useState(defaultValue);
|
|
1385
|
+
const value = valueProp ?? internal;
|
|
1386
|
+
const [editing, setEditing] = React24.useState(false);
|
|
1387
|
+
const [draft, setDraft] = React24.useState(value);
|
|
1388
|
+
const fieldRef = React24.useRef(null);
|
|
1389
|
+
const readRef = React24.useRef(null);
|
|
1390
|
+
const cancelled = React24.useRef(false);
|
|
1391
|
+
const restoreFocus = React24.useRef(false);
|
|
1392
|
+
React24.useEffect(() => {
|
|
1393
|
+
if (editing) {
|
|
1394
|
+
fieldRef.current?.focus();
|
|
1395
|
+
fieldRef.current?.select();
|
|
1396
|
+
} else if (restoreFocus.current) {
|
|
1397
|
+
restoreFocus.current = false;
|
|
1398
|
+
readRef.current?.focus();
|
|
1399
|
+
}
|
|
1400
|
+
}, [editing]);
|
|
1401
|
+
const start = () => {
|
|
1402
|
+
if (disabled) return;
|
|
1403
|
+
setDraft(value);
|
|
1404
|
+
cancelled.current = false;
|
|
1405
|
+
setEditing(true);
|
|
1406
|
+
onEditingChange?.(true);
|
|
1407
|
+
};
|
|
1408
|
+
const finish = (commit, refocus) => {
|
|
1409
|
+
restoreFocus.current = refocus;
|
|
1410
|
+
if (commit && draft !== value) {
|
|
1411
|
+
if (valueProp === void 0) setInternal(draft);
|
|
1412
|
+
onValueChange?.(draft);
|
|
1413
|
+
}
|
|
1414
|
+
setEditing(false);
|
|
1415
|
+
onEditingChange?.(false);
|
|
1416
|
+
};
|
|
1417
|
+
const textClasses = cn("text-ui-input-value text-surface-foreground", textClassName);
|
|
1418
|
+
return /* @__PURE__ */ jsx25("div", { ref, className: cn("inline-flex min-w-0 max-w-full", className), ...props, children: editing ? React24.createElement(multiline ? "textarea" : "input", {
|
|
1419
|
+
ref: fieldRef,
|
|
1420
|
+
value: draft,
|
|
1421
|
+
maxLength,
|
|
1422
|
+
"aria-label": ariaLabel,
|
|
1423
|
+
...multiline ? { rows: 1 } : { type: "text" },
|
|
1424
|
+
className: cn(
|
|
1425
|
+
"w-full rounded-md px-3 py-1 outline-none focus-visible:border-input-accent",
|
|
1426
|
+
multiline && "field-sizing-content resize-none",
|
|
1427
|
+
fieldSurfaceClasses("default"),
|
|
1428
|
+
textClasses
|
|
1429
|
+
),
|
|
1430
|
+
onChange: (event) => setDraft(event.target.value),
|
|
1431
|
+
onKeyDown: (event) => {
|
|
1432
|
+
if (event.key === "Escape") {
|
|
1433
|
+
cancelled.current = true;
|
|
1434
|
+
finish(false, true);
|
|
1435
|
+
} else if (event.key === "Enter" && (!multiline || event.metaKey || event.ctrlKey)) {
|
|
1436
|
+
event.preventDefault();
|
|
1437
|
+
finish(true, true);
|
|
1438
|
+
}
|
|
1439
|
+
},
|
|
1440
|
+
onBlur: () => {
|
|
1441
|
+
if (!cancelled.current) finish(true, false);
|
|
1442
|
+
}
|
|
1443
|
+
}) : /* @__PURE__ */ jsxs16(
|
|
1444
|
+
"button",
|
|
1445
|
+
{
|
|
1446
|
+
ref: readRef,
|
|
1447
|
+
type: "button",
|
|
1448
|
+
disabled,
|
|
1449
|
+
"aria-label": `${ariaLabel}: ${value || placeholder}. Edit`,
|
|
1450
|
+
onClick: start,
|
|
1451
|
+
className: cn(
|
|
1452
|
+
"group inline-flex min-w-0 max-w-full items-center gap-2 rounded-md border border-transparent px-3 py-1 text-left outline-none",
|
|
1453
|
+
"enabled:hover:bg-secondary enabled:focus-visible:border-input-accent disabled:cursor-not-allowed disabled:opacity-50",
|
|
1454
|
+
textClasses
|
|
1455
|
+
),
|
|
1456
|
+
children: [
|
|
1457
|
+
/* @__PURE__ */ jsx25("span", { className: cn("min-w-0 truncate", multiline && "whitespace-pre-wrap", !value && "text-muted-foreground"), children: value || placeholder }),
|
|
1458
|
+
/* @__PURE__ */ jsx25(
|
|
1459
|
+
PencilSimple,
|
|
1460
|
+
{
|
|
1461
|
+
size: 16,
|
|
1462
|
+
"aria-hidden": true,
|
|
1463
|
+
className: "shrink-0 text-secondary-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 group-focus-visible:opacity-100"
|
|
1464
|
+
}
|
|
1465
|
+
)
|
|
1466
|
+
]
|
|
1467
|
+
}
|
|
1468
|
+
) });
|
|
1469
|
+
}
|
|
1470
|
+
);
|
|
1471
|
+
InlineEdit.displayName = "InlineEdit";
|
|
1472
|
+
|
|
1473
|
+
// src/components/Forms & Data Entry/Input.tsx
|
|
1474
|
+
import * as React25 from "react";
|
|
1475
|
+
import { jsx as jsx26 } from "react/jsx-runtime";
|
|
1368
1476
|
var inputClasses = (status, className) => cn(
|
|
1369
1477
|
"flex h-10 w-full rounded-md px-3 py-2 text-ui-input-value placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
|
|
1370
1478
|
fieldSurfaceClasses(status),
|
|
1371
1479
|
className
|
|
1372
1480
|
);
|
|
1373
|
-
var Input =
|
|
1481
|
+
var Input = React25.forwardRef(
|
|
1374
1482
|
({ className, status = "default", label, description, message, id, ...props }, ref) => {
|
|
1375
1483
|
if (label == null && description == null && message == null) {
|
|
1376
|
-
return /* @__PURE__ */
|
|
1484
|
+
return /* @__PURE__ */ jsx26(
|
|
1377
1485
|
"input",
|
|
1378
1486
|
{
|
|
1379
1487
|
ref,
|
|
@@ -1384,16 +1492,16 @@ var Input = React24.forwardRef(
|
|
|
1384
1492
|
}
|
|
1385
1493
|
);
|
|
1386
1494
|
}
|
|
1387
|
-
return /* @__PURE__ */
|
|
1495
|
+
return /* @__PURE__ */ jsx26(Field, { label, description, message, status, id, children: (control) => /* @__PURE__ */ jsx26("input", { ref, className: inputClasses(status, className), ...control, ...props }) });
|
|
1388
1496
|
}
|
|
1389
1497
|
);
|
|
1390
1498
|
Input.displayName = "Input";
|
|
1391
1499
|
|
|
1392
1500
|
// src/components/Forms & Data Entry/InputWithAction.tsx
|
|
1393
|
-
import * as
|
|
1394
|
-
import { jsx as
|
|
1395
|
-
var InputWithAction =
|
|
1396
|
-
({ className, actionLabel, onAction, tags, status = "default", label, description, message, id, disabled, placeholder, ...props }, ref) => /* @__PURE__ */
|
|
1501
|
+
import * as React26 from "react";
|
|
1502
|
+
import { jsx as jsx27, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
1503
|
+
var InputWithAction = React26.forwardRef(
|
|
1504
|
+
({ className, actionLabel, onAction, tags, status = "default", label, description, message, id, disabled, placeholder, ...props }, ref) => /* @__PURE__ */ jsx27(Field, { label, description, message, status, id, children: (control) => /* @__PURE__ */ jsxs17(
|
|
1397
1505
|
"div",
|
|
1398
1506
|
{
|
|
1399
1507
|
className: cn(
|
|
@@ -1405,8 +1513,8 @@ var InputWithAction = React25.forwardRef(
|
|
|
1405
1513
|
className
|
|
1406
1514
|
),
|
|
1407
1515
|
children: [
|
|
1408
|
-
tags && /* @__PURE__ */
|
|
1409
|
-
/* @__PURE__ */
|
|
1516
|
+
tags && /* @__PURE__ */ jsx27("div", { className: "flex shrink-0 items-center gap-1", children: tags }),
|
|
1517
|
+
/* @__PURE__ */ jsx27(
|
|
1410
1518
|
"input",
|
|
1411
1519
|
{
|
|
1412
1520
|
ref,
|
|
@@ -1417,7 +1525,7 @@ var InputWithAction = React25.forwardRef(
|
|
|
1417
1525
|
...props
|
|
1418
1526
|
}
|
|
1419
1527
|
),
|
|
1420
|
-
/* @__PURE__ */
|
|
1528
|
+
/* @__PURE__ */ jsx27(Button, { type: "button", variant: "subtle", size: "sm", disabled, onClick: onAction, children: actionLabel })
|
|
1421
1529
|
]
|
|
1422
1530
|
}
|
|
1423
1531
|
) })
|
|
@@ -1425,10 +1533,10 @@ var InputWithAction = React25.forwardRef(
|
|
|
1425
1533
|
InputWithAction.displayName = "InputWithAction";
|
|
1426
1534
|
|
|
1427
1535
|
// src/components/Forms & Data Entry/NumberInput.tsx
|
|
1428
|
-
import * as
|
|
1536
|
+
import * as React27 from "react";
|
|
1429
1537
|
import { Minus as Minus2, Plus as Plus2 } from "@phosphor-icons/react";
|
|
1430
|
-
import { jsx as
|
|
1431
|
-
var NumberInput =
|
|
1538
|
+
import { jsx as jsx28, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
1539
|
+
var NumberInput = React27.forwardRef(
|
|
1432
1540
|
({
|
|
1433
1541
|
className,
|
|
1434
1542
|
value,
|
|
@@ -1446,7 +1554,7 @@ var NumberInput = React26.forwardRef(
|
|
|
1446
1554
|
disabled,
|
|
1447
1555
|
...props
|
|
1448
1556
|
}, ref) => {
|
|
1449
|
-
const [internal, setInternal] =
|
|
1557
|
+
const [internal, setInternal] = React27.useState(defaultValue);
|
|
1450
1558
|
const current = value ?? internal;
|
|
1451
1559
|
const clamp = (next) => Math.min(max, Math.max(min, next));
|
|
1452
1560
|
const commit = (next) => {
|
|
@@ -1454,7 +1562,7 @@ var NumberInput = React26.forwardRef(
|
|
|
1454
1562
|
setInternal(clamped);
|
|
1455
1563
|
onValueChange?.(clamped);
|
|
1456
1564
|
};
|
|
1457
|
-
return /* @__PURE__ */
|
|
1565
|
+
return /* @__PURE__ */ jsx28(Field, { label, description, message, status, id, className: "w-50", children: (control) => /* @__PURE__ */ jsxs18(
|
|
1458
1566
|
"div",
|
|
1459
1567
|
{
|
|
1460
1568
|
className: cn(
|
|
@@ -1465,7 +1573,7 @@ var NumberInput = React26.forwardRef(
|
|
|
1465
1573
|
className
|
|
1466
1574
|
),
|
|
1467
1575
|
children: [
|
|
1468
|
-
/* @__PURE__ */
|
|
1576
|
+
/* @__PURE__ */ jsx28(
|
|
1469
1577
|
Button,
|
|
1470
1578
|
{
|
|
1471
1579
|
type: "button",
|
|
@@ -1474,11 +1582,11 @@ var NumberInput = React26.forwardRef(
|
|
|
1474
1582
|
"aria-label": "Decrease",
|
|
1475
1583
|
disabled: disabled || current <= min,
|
|
1476
1584
|
onClick: () => commit(current - step),
|
|
1477
|
-
children: /* @__PURE__ */
|
|
1585
|
+
children: /* @__PURE__ */ jsx28(Minus2, { size: 16, "aria-hidden": true })
|
|
1478
1586
|
}
|
|
1479
1587
|
),
|
|
1480
|
-
/* @__PURE__ */
|
|
1481
|
-
/* @__PURE__ */
|
|
1588
|
+
/* @__PURE__ */ jsxs18("div", { className: "flex items-center justify-center gap-1 text-center", children: [
|
|
1589
|
+
/* @__PURE__ */ jsx28(
|
|
1482
1590
|
"input",
|
|
1483
1591
|
{
|
|
1484
1592
|
ref,
|
|
@@ -1508,9 +1616,9 @@ var NumberInput = React26.forwardRef(
|
|
|
1508
1616
|
...props
|
|
1509
1617
|
}
|
|
1510
1618
|
),
|
|
1511
|
-
unit && /* @__PURE__ */
|
|
1619
|
+
unit && /* @__PURE__ */ jsx28("span", { className: "text-body-small text-secondary-muted-foreground", children: unit })
|
|
1512
1620
|
] }),
|
|
1513
|
-
/* @__PURE__ */
|
|
1621
|
+
/* @__PURE__ */ jsx28(
|
|
1514
1622
|
Button,
|
|
1515
1623
|
{
|
|
1516
1624
|
type: "button",
|
|
@@ -1519,7 +1627,7 @@ var NumberInput = React26.forwardRef(
|
|
|
1519
1627
|
"aria-label": "Increase",
|
|
1520
1628
|
disabled: disabled || current >= max,
|
|
1521
1629
|
onClick: () => commit(current + step),
|
|
1522
|
-
children: /* @__PURE__ */
|
|
1630
|
+
children: /* @__PURE__ */ jsx28(Plus2, { size: 16, "aria-hidden": true })
|
|
1523
1631
|
}
|
|
1524
1632
|
)
|
|
1525
1633
|
]
|
|
@@ -1530,14 +1638,14 @@ var NumberInput = React26.forwardRef(
|
|
|
1530
1638
|
NumberInput.displayName = "NumberInput";
|
|
1531
1639
|
|
|
1532
1640
|
// src/components/Forms & Data Entry/SearchBar.tsx
|
|
1533
|
-
import * as
|
|
1641
|
+
import * as React28 from "react";
|
|
1534
1642
|
import { MagnifyingGlass, X as X2 } from "@phosphor-icons/react";
|
|
1535
|
-
import { jsx as
|
|
1536
|
-
var SearchBar =
|
|
1643
|
+
import { jsx as jsx29, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
1644
|
+
var SearchBar = React28.forwardRef(
|
|
1537
1645
|
({ className, value, defaultValue, onChange, onClear, clearLabel = "Clear search", disabled, ...props }, ref) => {
|
|
1538
|
-
const innerRef =
|
|
1539
|
-
|
|
1540
|
-
const [uncontrolled, setUncontrolled] =
|
|
1646
|
+
const innerRef = React28.useRef(null);
|
|
1647
|
+
React28.useImperativeHandle(ref, () => innerRef.current);
|
|
1648
|
+
const [uncontrolled, setUncontrolled] = React28.useState(String(defaultValue ?? ""));
|
|
1541
1649
|
const current = value !== void 0 ? String(value) : uncontrolled;
|
|
1542
1650
|
const clear = () => {
|
|
1543
1651
|
const input = innerRef.current;
|
|
@@ -1549,7 +1657,7 @@ var SearchBar = React27.forwardRef(
|
|
|
1549
1657
|
}
|
|
1550
1658
|
onClear?.();
|
|
1551
1659
|
};
|
|
1552
|
-
return /* @__PURE__ */
|
|
1660
|
+
return /* @__PURE__ */ jsxs19(
|
|
1553
1661
|
"div",
|
|
1554
1662
|
{
|
|
1555
1663
|
className: cn(
|
|
@@ -1560,8 +1668,8 @@ var SearchBar = React27.forwardRef(
|
|
|
1560
1668
|
className
|
|
1561
1669
|
),
|
|
1562
1670
|
children: [
|
|
1563
|
-
/* @__PURE__ */
|
|
1564
|
-
/* @__PURE__ */
|
|
1671
|
+
/* @__PURE__ */ jsx29(MagnifyingGlass, { size: 16, "aria-hidden": true, className: "shrink-0 text-surface-foreground" }),
|
|
1672
|
+
/* @__PURE__ */ jsx29(
|
|
1565
1673
|
"input",
|
|
1566
1674
|
{
|
|
1567
1675
|
ref: innerRef,
|
|
@@ -1578,14 +1686,14 @@ var SearchBar = React27.forwardRef(
|
|
|
1578
1686
|
...props
|
|
1579
1687
|
}
|
|
1580
1688
|
),
|
|
1581
|
-
current !== "" && !disabled && /* @__PURE__ */
|
|
1689
|
+
current !== "" && !disabled && /* @__PURE__ */ jsx29(
|
|
1582
1690
|
"button",
|
|
1583
1691
|
{
|
|
1584
1692
|
type: "button",
|
|
1585
1693
|
"aria-label": clearLabel,
|
|
1586
1694
|
onClick: clear,
|
|
1587
1695
|
className: "inline-flex size-4 shrink-0 items-center justify-center rounded-xs text-surface-foreground",
|
|
1588
|
-
children: /* @__PURE__ */
|
|
1696
|
+
children: /* @__PURE__ */ jsx29(X2, { size: 16, "aria-hidden": true })
|
|
1589
1697
|
}
|
|
1590
1698
|
)
|
|
1591
1699
|
]
|
|
@@ -1596,16 +1704,16 @@ var SearchBar = React27.forwardRef(
|
|
|
1596
1704
|
SearchBar.displayName = "SearchBar";
|
|
1597
1705
|
|
|
1598
1706
|
// src/components/Forms & Data Entry/Select.tsx
|
|
1599
|
-
import * as
|
|
1707
|
+
import * as React29 from "react";
|
|
1600
1708
|
import { CaretDown as CaretDown3 } from "@phosphor-icons/react";
|
|
1601
1709
|
import { Select as SelectPrimitive } from "radix-ui";
|
|
1602
|
-
import { jsx as
|
|
1710
|
+
import { jsx as jsx30, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
1603
1711
|
var Select = SelectPrimitive.Root;
|
|
1604
1712
|
var SelectValue = SelectPrimitive.Value;
|
|
1605
1713
|
var SelectGroup = SelectPrimitive.Group;
|
|
1606
|
-
var CheckIcon = () => /* @__PURE__ */
|
|
1607
|
-
var SelectTrigger =
|
|
1608
|
-
({ className, children, icon, ...props }, ref) => /* @__PURE__ */
|
|
1714
|
+
var CheckIcon = () => /* @__PURE__ */ jsx30("svg", { width: "10", height: "8", viewBox: "0 0 10 8", fill: "none", "aria-hidden": "true", children: /* @__PURE__ */ jsx30("path", { d: "M1 4L3.5 6.5L9 1", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) });
|
|
1715
|
+
var SelectTrigger = React29.forwardRef(
|
|
1716
|
+
({ className, children, icon, ...props }, ref) => /* @__PURE__ */ jsxs20(
|
|
1609
1717
|
SelectPrimitive.Trigger,
|
|
1610
1718
|
{
|
|
1611
1719
|
ref,
|
|
@@ -1618,16 +1726,16 @@ var SelectTrigger = React28.forwardRef(
|
|
|
1618
1726
|
),
|
|
1619
1727
|
...props,
|
|
1620
1728
|
children: [
|
|
1621
|
-
icon && /* @__PURE__ */
|
|
1622
|
-
/* @__PURE__ */
|
|
1623
|
-
/* @__PURE__ */
|
|
1729
|
+
icon && /* @__PURE__ */ jsx30("span", { className: "flex shrink-0 text-surface-foreground", children: icon }),
|
|
1730
|
+
/* @__PURE__ */ jsx30("span", { className: "min-w-0 flex-1 truncate", children }),
|
|
1731
|
+
/* @__PURE__ */ jsx30(SelectPrimitive.Icon, { className: "shrink-0 text-surface-foreground", children: /* @__PURE__ */ jsx30(CaretDown3, { size: 16, "aria-hidden": true }) })
|
|
1624
1732
|
]
|
|
1625
1733
|
}
|
|
1626
1734
|
)
|
|
1627
1735
|
);
|
|
1628
1736
|
SelectTrigger.displayName = "SelectTrigger";
|
|
1629
|
-
var SelectContent =
|
|
1630
|
-
({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */
|
|
1737
|
+
var SelectContent = React29.forwardRef(
|
|
1738
|
+
({ className, children, position = "popper", ...props }, ref) => /* @__PURE__ */ jsx30(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsx30(
|
|
1631
1739
|
SelectPrimitive.Content,
|
|
1632
1740
|
{
|
|
1633
1741
|
ref,
|
|
@@ -1641,13 +1749,13 @@ var SelectContent = React28.forwardRef(
|
|
|
1641
1749
|
className
|
|
1642
1750
|
),
|
|
1643
1751
|
...props,
|
|
1644
|
-
children: /* @__PURE__ */
|
|
1752
|
+
children: /* @__PURE__ */ jsx30(SelectPrimitive.Viewport, { className: "p-1", children })
|
|
1645
1753
|
}
|
|
1646
1754
|
) })
|
|
1647
1755
|
);
|
|
1648
1756
|
SelectContent.displayName = "SelectContent";
|
|
1649
|
-
var SelectItem =
|
|
1650
|
-
({ className, children, ...props }, ref) => /* @__PURE__ */
|
|
1757
|
+
var SelectItem = React29.forwardRef(
|
|
1758
|
+
({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs20(
|
|
1651
1759
|
SelectPrimitive.Item,
|
|
1652
1760
|
{
|
|
1653
1761
|
ref,
|
|
@@ -1658,8 +1766,8 @@ var SelectItem = React28.forwardRef(
|
|
|
1658
1766
|
),
|
|
1659
1767
|
...props,
|
|
1660
1768
|
children: [
|
|
1661
|
-
/* @__PURE__ */
|
|
1662
|
-
/* @__PURE__ */
|
|
1769
|
+
/* @__PURE__ */ jsx30("span", { className: "absolute left-2 flex h-4 w-4 items-center justify-center", children: /* @__PURE__ */ jsx30(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx30(CheckIcon, {}) }) }),
|
|
1770
|
+
/* @__PURE__ */ jsx30(SelectPrimitive.ItemText, { children })
|
|
1663
1771
|
]
|
|
1664
1772
|
}
|
|
1665
1773
|
)
|
|
@@ -1667,10 +1775,10 @@ var SelectItem = React28.forwardRef(
|
|
|
1667
1775
|
SelectItem.displayName = "SelectItem";
|
|
1668
1776
|
|
|
1669
1777
|
// src/components/Forms & Data Entry/Slider.tsx
|
|
1670
|
-
import * as
|
|
1778
|
+
import * as React30 from "react";
|
|
1671
1779
|
import { Slider as SliderPrimitive } from "radix-ui";
|
|
1672
|
-
import { jsx as
|
|
1673
|
-
var Slider =
|
|
1780
|
+
import { jsx as jsx31, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
1781
|
+
var Slider = React30.forwardRef(
|
|
1674
1782
|
({
|
|
1675
1783
|
className,
|
|
1676
1784
|
value,
|
|
@@ -1685,15 +1793,15 @@ var Slider = React29.forwardRef(
|
|
|
1685
1793
|
"aria-labelledby": ariaLabelledBy,
|
|
1686
1794
|
...props
|
|
1687
1795
|
}, ref) => {
|
|
1688
|
-
const [internal, setInternal] =
|
|
1796
|
+
const [internal, setInternal] = React30.useState(defaultValue ?? [min]);
|
|
1689
1797
|
const thumbValues = value ?? internal;
|
|
1690
1798
|
const hasHeader = label != null || showRange;
|
|
1691
|
-
return /* @__PURE__ */
|
|
1692
|
-
hasHeader && /* @__PURE__ */
|
|
1693
|
-
label != null ? /* @__PURE__ */
|
|
1694
|
-
/* @__PURE__ */
|
|
1799
|
+
return /* @__PURE__ */ jsxs21("div", { className: cn("flex w-full flex-col gap-2", className), children: [
|
|
1800
|
+
hasHeader && /* @__PURE__ */ jsxs21("div", { className: "flex items-center justify-between text-secondary-muted-foreground", children: [
|
|
1801
|
+
label != null ? /* @__PURE__ */ jsx31("span", { className: "text-ui-label text-surface-foreground", children: label }) : /* @__PURE__ */ jsx31("span", { className: "text-ui-caption", children: min }),
|
|
1802
|
+
/* @__PURE__ */ jsx31("span", { className: "text-body-small", children: max })
|
|
1695
1803
|
] }),
|
|
1696
|
-
/* @__PURE__ */
|
|
1804
|
+
/* @__PURE__ */ jsxs21(
|
|
1697
1805
|
SliderPrimitive.Root,
|
|
1698
1806
|
{
|
|
1699
1807
|
ref,
|
|
@@ -1708,19 +1816,19 @@ var Slider = React29.forwardRef(
|
|
|
1708
1816
|
className: "relative flex h-4 w-full touch-none items-center select-none",
|
|
1709
1817
|
...props,
|
|
1710
1818
|
children: [
|
|
1711
|
-
/* @__PURE__ */
|
|
1819
|
+
/* @__PURE__ */ jsx31(SliderPrimitive.Track, { className: "relative h-1 w-full grow overflow-hidden rounded-xxs bg-muted", children: /* @__PURE__ */ jsx31(SliderPrimitive.Range, { className: "absolute h-full bg-input-accent" }) }),
|
|
1712
1820
|
thumbValues.map((thumbValue, index) => (
|
|
1713
1821
|
// The accessible name belongs on each individual thumb (the actual
|
|
1714
1822
|
// role="slider" element) — Root is just a group container. With
|
|
1715
1823
|
// more than one thumb this applies the same label to each; give a
|
|
1716
1824
|
// range slider distinct per-thumb labels via aria-labelledby instead.
|
|
1717
|
-
/* @__PURE__ */
|
|
1825
|
+
/* @__PURE__ */ jsx31(
|
|
1718
1826
|
SliderPrimitive.Thumb,
|
|
1719
1827
|
{
|
|
1720
1828
|
"aria-label": ariaLabel,
|
|
1721
1829
|
"aria-labelledby": ariaLabelledBy,
|
|
1722
1830
|
className: "group relative block size-4 rounded-full border-2 border-surface bg-input-accent shadow-sm transition-colors disabled:pointer-events-none disabled:opacity-50",
|
|
1723
|
-
children: showValue && /* @__PURE__ */
|
|
1831
|
+
children: showValue && /* @__PURE__ */ jsx31(
|
|
1724
1832
|
"span",
|
|
1725
1833
|
{
|
|
1726
1834
|
"aria-hidden": "true",
|
|
@@ -1744,17 +1852,17 @@ var Slider = React29.forwardRef(
|
|
|
1744
1852
|
Slider.displayName = "Slider";
|
|
1745
1853
|
|
|
1746
1854
|
// src/components/Forms & Data Entry/Textarea.tsx
|
|
1747
|
-
import * as
|
|
1748
|
-
import { jsx as
|
|
1855
|
+
import * as React31 from "react";
|
|
1856
|
+
import { jsx as jsx32 } from "react/jsx-runtime";
|
|
1749
1857
|
var textareaClasses = (status, className) => cn(
|
|
1750
1858
|
"flex field-sizing-content min-h-25 w-full rounded-md px-3 py-2.5 text-body-base placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
|
|
1751
1859
|
fieldSurfaceClasses(status),
|
|
1752
1860
|
className
|
|
1753
1861
|
);
|
|
1754
|
-
var Textarea =
|
|
1862
|
+
var Textarea = React31.forwardRef(
|
|
1755
1863
|
({ className, status = "default", label, description, message, id, ...props }, ref) => {
|
|
1756
1864
|
if (label == null && description == null && message == null) {
|
|
1757
|
-
return /* @__PURE__ */
|
|
1865
|
+
return /* @__PURE__ */ jsx32(
|
|
1758
1866
|
"textarea",
|
|
1759
1867
|
{
|
|
1760
1868
|
ref,
|
|
@@ -1765,29 +1873,29 @@ var Textarea = React30.forwardRef(
|
|
|
1765
1873
|
}
|
|
1766
1874
|
);
|
|
1767
1875
|
}
|
|
1768
|
-
return /* @__PURE__ */
|
|
1876
|
+
return /* @__PURE__ */ jsx32(Field, { label, description, message, status, id, children: (control) => /* @__PURE__ */ jsx32("textarea", { ref, className: textareaClasses(status, className), ...control, ...props }) });
|
|
1769
1877
|
}
|
|
1770
1878
|
);
|
|
1771
1879
|
Textarea.displayName = "Textarea";
|
|
1772
1880
|
|
|
1773
1881
|
// src/components/Overlays & Feedback/Dialog.tsx
|
|
1774
|
-
import * as
|
|
1882
|
+
import * as React32 from "react";
|
|
1775
1883
|
import { X as X3 } from "@phosphor-icons/react";
|
|
1776
1884
|
import { Dialog as DialogPrimitive } from "radix-ui";
|
|
1777
|
-
import { jsx as
|
|
1885
|
+
import { jsx as jsx33, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
1778
1886
|
var Dialog = DialogPrimitive.Root;
|
|
1779
1887
|
var DialogTrigger = DialogPrimitive.Trigger;
|
|
1780
1888
|
var DialogClose = DialogPrimitive.Close;
|
|
1781
|
-
var DialogContent =
|
|
1782
|
-
({ className, children, closeLabel = "Close", hideClose, ...props }, ref) => /* @__PURE__ */
|
|
1783
|
-
/* @__PURE__ */
|
|
1889
|
+
var DialogContent = React32.forwardRef(
|
|
1890
|
+
({ className, children, closeLabel = "Close", hideClose, ...props }, ref) => /* @__PURE__ */ jsxs22(DialogPrimitive.Portal, { children: [
|
|
1891
|
+
/* @__PURE__ */ jsx33(
|
|
1784
1892
|
DialogPrimitive.Overlay,
|
|
1785
1893
|
{
|
|
1786
1894
|
style: { zIndex: "var(--sys-z-30)" },
|
|
1787
1895
|
className: "fixed inset-0 bg-primary/30"
|
|
1788
1896
|
}
|
|
1789
1897
|
),
|
|
1790
|
-
/* @__PURE__ */
|
|
1898
|
+
/* @__PURE__ */ jsxs22(
|
|
1791
1899
|
DialogPrimitive.Content,
|
|
1792
1900
|
{
|
|
1793
1901
|
ref,
|
|
@@ -1799,15 +1907,15 @@ var DialogContent = React31.forwardRef(
|
|
|
1799
1907
|
...props,
|
|
1800
1908
|
children: [
|
|
1801
1909
|
children,
|
|
1802
|
-
!hideClose && /* @__PURE__ */
|
|
1910
|
+
!hideClose && /* @__PURE__ */ jsx33(DialogPrimitive.Close, { asChild: true, children: /* @__PURE__ */ jsx33(Button, { variant: "ghost", size: "icon-sm", "aria-label": closeLabel, className: "absolute top-4 right-6", children: /* @__PURE__ */ jsx33(X3, { size: 16, "aria-hidden": true }) }) })
|
|
1803
1911
|
]
|
|
1804
1912
|
}
|
|
1805
1913
|
)
|
|
1806
1914
|
] })
|
|
1807
1915
|
);
|
|
1808
1916
|
DialogContent.displayName = "DialogContent";
|
|
1809
|
-
var DialogHeader = ({ className, ...props }) => /* @__PURE__ */
|
|
1810
|
-
var DialogTitle =
|
|
1917
|
+
var DialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx33("div", { className: cn("flex flex-col gap-1.5 border-b border-border px-6 py-4 pr-16", className), ...props });
|
|
1918
|
+
var DialogTitle = React32.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx33(
|
|
1811
1919
|
DialogPrimitive.Title,
|
|
1812
1920
|
{
|
|
1813
1921
|
ref,
|
|
@@ -1816,7 +1924,7 @@ var DialogTitle = React31.forwardRef(({ className, ...props }, ref) => /* @__PUR
|
|
|
1816
1924
|
}
|
|
1817
1925
|
));
|
|
1818
1926
|
DialogTitle.displayName = "DialogTitle";
|
|
1819
|
-
var DialogDescription =
|
|
1927
|
+
var DialogDescription = React32.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx33(
|
|
1820
1928
|
DialogPrimitive.Description,
|
|
1821
1929
|
{
|
|
1822
1930
|
ref,
|
|
@@ -1825,15 +1933,15 @@ var DialogDescription = React31.forwardRef(({ className, ...props }, ref) => /*
|
|
|
1825
1933
|
}
|
|
1826
1934
|
));
|
|
1827
1935
|
DialogDescription.displayName = "DialogDescription";
|
|
1828
|
-
var DialogBody = ({ className, ...props }) => /* @__PURE__ */
|
|
1829
|
-
var DialogFooter = ({ className, ...props }) => /* @__PURE__ */
|
|
1936
|
+
var DialogBody = ({ className, ...props }) => /* @__PURE__ */ jsx33("div", { className: cn("flex flex-col gap-4 p-6", className), ...props });
|
|
1937
|
+
var DialogFooter = ({ className, ...props }) => /* @__PURE__ */ jsx33("div", { className: cn("flex items-center justify-end gap-3 border-t border-border px-6 py-4", className), ...props });
|
|
1830
1938
|
|
|
1831
1939
|
// src/components/Overlays & Feedback/Toast.tsx
|
|
1832
|
-
import * as
|
|
1940
|
+
import * as React33 from "react";
|
|
1833
1941
|
import { CheckCircle as CheckCircle2, Info, Warning, WarningCircle as WarningCircle2, X as X4 } from "@phosphor-icons/react";
|
|
1834
1942
|
import { cva as cva4 } from "class-variance-authority";
|
|
1835
1943
|
import { Toast as ToastPrimitive } from "radix-ui";
|
|
1836
|
-
import { jsx as
|
|
1944
|
+
import { jsx as jsx34, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
1837
1945
|
var toastVariants = cva4("border", {
|
|
1838
1946
|
variants: {
|
|
1839
1947
|
variant: {
|
|
@@ -1859,13 +1967,13 @@ var titleColour = {
|
|
|
1859
1967
|
};
|
|
1860
1968
|
function VariantIcon({ variant, size }) {
|
|
1861
1969
|
const props = { size, "aria-hidden": true, className: cn("shrink-0", iconColour[variant]) };
|
|
1862
|
-
if (variant === "success") return /* @__PURE__ */
|
|
1863
|
-
if (variant === "warning") return /* @__PURE__ */
|
|
1864
|
-
if (variant === "destructive") return /* @__PURE__ */
|
|
1865
|
-
return /* @__PURE__ */
|
|
1970
|
+
if (variant === "success") return /* @__PURE__ */ jsx34(CheckCircle2, { ...props });
|
|
1971
|
+
if (variant === "warning") return /* @__PURE__ */ jsx34(Warning, { ...props });
|
|
1972
|
+
if (variant === "destructive") return /* @__PURE__ */ jsx34(WarningCircle2, { ...props });
|
|
1973
|
+
return /* @__PURE__ */ jsx34(Info, { ...props });
|
|
1866
1974
|
}
|
|
1867
1975
|
var ToastProvider = ToastPrimitive.Provider;
|
|
1868
|
-
var ToastViewport =
|
|
1976
|
+
var ToastViewport = React33.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx34(
|
|
1869
1977
|
ToastPrimitive.Viewport,
|
|
1870
1978
|
{
|
|
1871
1979
|
ref,
|
|
@@ -1875,10 +1983,10 @@ var ToastViewport = React32.forwardRef(({ className, ...props }, ref) => /* @__P
|
|
|
1875
1983
|
}
|
|
1876
1984
|
));
|
|
1877
1985
|
ToastViewport.displayName = "ToastViewport";
|
|
1878
|
-
var Toast =
|
|
1986
|
+
var Toast = React33.forwardRef(
|
|
1879
1987
|
({ className, variant = "info", title, description, action, closeLabel = "Close", children, ...props }, ref) => {
|
|
1880
1988
|
const v = variant ?? "info";
|
|
1881
|
-
return /* @__PURE__ */
|
|
1989
|
+
return /* @__PURE__ */ jsxs23(
|
|
1882
1990
|
ToastPrimitive.Root,
|
|
1883
1991
|
{
|
|
1884
1992
|
ref,
|
|
@@ -1886,19 +1994,19 @@ var Toast = React32.forwardRef(
|
|
|
1886
1994
|
className: cn("flex items-start gap-3 rounded-lg p-4 shadow-lg", toastVariants({ variant: v }), className),
|
|
1887
1995
|
...props,
|
|
1888
1996
|
children: [
|
|
1889
|
-
/* @__PURE__ */
|
|
1890
|
-
/* @__PURE__ */
|
|
1891
|
-
title != null && /* @__PURE__ */
|
|
1892
|
-
description != null && /* @__PURE__ */
|
|
1997
|
+
/* @__PURE__ */ jsx34(VariantIcon, { variant: v, size: 20 }),
|
|
1998
|
+
/* @__PURE__ */ jsxs23("div", { className: "flex min-w-0 flex-1 flex-col gap-1 text-body-small", children: [
|
|
1999
|
+
title != null && /* @__PURE__ */ jsx34(ToastPrimitive.Title, { className: cn("font-semibold", titleColour[v]), children: title }),
|
|
2000
|
+
description != null && /* @__PURE__ */ jsx34(ToastPrimitive.Description, { className: "text-secondary-muted-foreground", children: description }),
|
|
1893
2001
|
children,
|
|
1894
2002
|
action
|
|
1895
2003
|
] }),
|
|
1896
|
-
/* @__PURE__ */
|
|
2004
|
+
/* @__PURE__ */ jsx34(
|
|
1897
2005
|
ToastPrimitive.Close,
|
|
1898
2006
|
{
|
|
1899
2007
|
"aria-label": closeLabel,
|
|
1900
2008
|
className: "inline-flex size-4 shrink-0 items-center justify-center rounded-xs text-surface-foreground",
|
|
1901
|
-
children: /* @__PURE__ */
|
|
2009
|
+
children: /* @__PURE__ */ jsx34(X4, { size: 16, "aria-hidden": true })
|
|
1902
2010
|
}
|
|
1903
2011
|
)
|
|
1904
2012
|
]
|
|
@@ -1908,10 +2016,10 @@ var Toast = React32.forwardRef(
|
|
|
1908
2016
|
);
|
|
1909
2017
|
Toast.displayName = "Toast";
|
|
1910
2018
|
var ToastAction = ToastPrimitive.Action;
|
|
1911
|
-
var ToastInline =
|
|
2019
|
+
var ToastInline = React33.forwardRef(
|
|
1912
2020
|
({ className, variant = "info", onClose, closeLabel = "Close", children, ...props }, ref) => {
|
|
1913
2021
|
const v = variant ?? "info";
|
|
1914
|
-
return /* @__PURE__ */
|
|
2022
|
+
return /* @__PURE__ */ jsxs23(
|
|
1915
2023
|
"div",
|
|
1916
2024
|
{
|
|
1917
2025
|
ref,
|
|
@@ -1919,9 +2027,9 @@ var ToastInline = React32.forwardRef(
|
|
|
1919
2027
|
className: cn("flex items-center gap-2 rounded-sm px-2 py-1.5", toastVariants({ variant: v }), className),
|
|
1920
2028
|
...props,
|
|
1921
2029
|
children: [
|
|
1922
|
-
/* @__PURE__ */
|
|
1923
|
-
/* @__PURE__ */
|
|
1924
|
-
onClose && /* @__PURE__ */
|
|
2030
|
+
/* @__PURE__ */ jsx34(VariantIcon, { variant: v, size: 16 }),
|
|
2031
|
+
/* @__PURE__ */ jsx34("p", { className: "min-w-0 flex-1 text-body-small text-secondary-muted-foreground", children }),
|
|
2032
|
+
onClose && /* @__PURE__ */ jsx34(Button, { type: "button", variant: "ghost", size: "icon-sm", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ jsx34(X4, { size: 16, "aria-hidden": true }) })
|
|
1925
2033
|
]
|
|
1926
2034
|
}
|
|
1927
2035
|
);
|
|
@@ -1930,16 +2038,16 @@ var ToastInline = React32.forwardRef(
|
|
|
1930
2038
|
ToastInline.displayName = "ToastInline";
|
|
1931
2039
|
|
|
1932
2040
|
// src/components/Overlays & Feedback/Tooltip.tsx
|
|
1933
|
-
import * as
|
|
2041
|
+
import * as React34 from "react";
|
|
1934
2042
|
import { Tooltip as TooltipPrimitive } from "radix-ui";
|
|
1935
|
-
import { Fragment as Fragment4, jsx as
|
|
2043
|
+
import { Fragment as Fragment4, jsx as jsx35, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
1936
2044
|
var TooltipProvider = TooltipPrimitive.Provider;
|
|
1937
2045
|
var Tooltip = TooltipPrimitive.Root;
|
|
1938
2046
|
var TooltipTrigger = TooltipPrimitive.Trigger;
|
|
1939
|
-
var TooltipContent =
|
|
2047
|
+
var TooltipContent = React34.forwardRef(
|
|
1940
2048
|
({ className, sideOffset = 4, title, description, action, arrow = true, children, ...props }, ref) => {
|
|
1941
2049
|
const detailed = title != null || description != null;
|
|
1942
|
-
return /* @__PURE__ */
|
|
2050
|
+
return /* @__PURE__ */ jsx35(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsxs24(
|
|
1943
2051
|
TooltipPrimitive.Content,
|
|
1944
2052
|
{
|
|
1945
2053
|
ref,
|
|
@@ -1953,12 +2061,12 @@ var TooltipContent = React33.forwardRef(
|
|
|
1953
2061
|
),
|
|
1954
2062
|
...props,
|
|
1955
2063
|
children: [
|
|
1956
|
-
detailed ? /* @__PURE__ */
|
|
1957
|
-
title != null && /* @__PURE__ */
|
|
1958
|
-
description != null && /* @__PURE__ */
|
|
1959
|
-
action != null && /* @__PURE__ */
|
|
2064
|
+
detailed ? /* @__PURE__ */ jsxs24(Fragment4, { children: [
|
|
2065
|
+
title != null && /* @__PURE__ */ jsx35("p", { className: "text-xs leading-4 font-semibold text-label", children: title }),
|
|
2066
|
+
description != null && /* @__PURE__ */ jsx35("p", { className: "text-xs leading-4.5 text-plum-200", children: description }),
|
|
2067
|
+
action != null && /* @__PURE__ */ jsx35("div", { className: "mt-1 text-ui-caption text-plum-300 underline *:underline", children: action })
|
|
1960
2068
|
] }) : children,
|
|
1961
|
-
arrow && /* @__PURE__ */
|
|
2069
|
+
arrow && /* @__PURE__ */ jsx35(TooltipPrimitive.Arrow, { width: 12, height: 8, className: "fill-primary-soft-foreground" })
|
|
1962
2070
|
]
|
|
1963
2071
|
}
|
|
1964
2072
|
) });
|
|
@@ -1967,14 +2075,14 @@ var TooltipContent = React33.forwardRef(
|
|
|
1967
2075
|
TooltipContent.displayName = "TooltipContent";
|
|
1968
2076
|
|
|
1969
2077
|
// src/components/Question Types/FileUpload.tsx
|
|
1970
|
-
import * as
|
|
2078
|
+
import * as React36 from "react";
|
|
1971
2079
|
import { FileText, X as X5 } from "@phosphor-icons/react";
|
|
1972
2080
|
import { Progress as ProgressPrimitive } from "radix-ui";
|
|
1973
2081
|
|
|
1974
2082
|
// src/components/Tags & Badges/Tag.tsx
|
|
1975
|
-
import * as
|
|
2083
|
+
import * as React35 from "react";
|
|
1976
2084
|
import { cva as cva5 } from "class-variance-authority";
|
|
1977
|
-
import { jsx as
|
|
2085
|
+
import { jsx as jsx36, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
1978
2086
|
var tagVariants = cva5(
|
|
1979
2087
|
"inline-flex items-center gap-1.5 whitespace-nowrap rounded-sm border px-2.5 py-1 text-ui-caption",
|
|
1980
2088
|
{
|
|
@@ -1990,7 +2098,7 @@ var tagVariants = cva5(
|
|
|
1990
2098
|
defaultVariants: { variant: "neutral" }
|
|
1991
2099
|
}
|
|
1992
2100
|
);
|
|
1993
|
-
var Tag =
|
|
2101
|
+
var Tag = React35.forwardRef(({ className, variant, ...props }, ref) => /* @__PURE__ */ jsx36("span", { ref, className: cn(tagVariants({ variant }), className), ...props }));
|
|
1994
2102
|
Tag.displayName = "Tag";
|
|
1995
2103
|
var statusDotVariants = cva5("size-1.5 shrink-0 rounded-full", {
|
|
1996
2104
|
variants: {
|
|
@@ -2003,20 +2111,20 @@ var statusDotVariants = cva5("size-1.5 shrink-0 rounded-full", {
|
|
|
2003
2111
|
},
|
|
2004
2112
|
defaultVariants: { status: "active" }
|
|
2005
2113
|
});
|
|
2006
|
-
var StatusTag =
|
|
2007
|
-
({ className, status, children, ...props }, ref) => /* @__PURE__ */
|
|
2008
|
-
/* @__PURE__ */
|
|
2114
|
+
var StatusTag = React35.forwardRef(
|
|
2115
|
+
({ className, status, children, ...props }, ref) => /* @__PURE__ */ jsxs25("span", { ref, className: cn(tagVariants({ variant: "default" }), className), ...props, children: [
|
|
2116
|
+
/* @__PURE__ */ jsx36("span", { className: statusDotVariants({ status }), "aria-hidden": "true" }),
|
|
2009
2117
|
children
|
|
2010
2118
|
] })
|
|
2011
2119
|
);
|
|
2012
2120
|
StatusTag.displayName = "StatusTag";
|
|
2013
2121
|
|
|
2014
2122
|
// src/components/Question Types/FileUpload.tsx
|
|
2015
|
-
import { Fragment as Fragment5, jsx as
|
|
2016
|
-
var FileUploadZone =
|
|
2123
|
+
import { Fragment as Fragment5, jsx as jsx37, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
2124
|
+
var FileUploadZone = React36.forwardRef(
|
|
2017
2125
|
({ className, title = "Upload document", hint, icon, onFiles, ...props }, ref) => {
|
|
2018
|
-
const [over, setOver] =
|
|
2019
|
-
return /* @__PURE__ */
|
|
2126
|
+
const [over, setOver] = React36.useState(false);
|
|
2127
|
+
return /* @__PURE__ */ jsxs26(
|
|
2020
2128
|
"label",
|
|
2021
2129
|
{
|
|
2022
2130
|
className: cn(
|
|
@@ -2036,12 +2144,12 @@ var FileUploadZone = React35.forwardRef(
|
|
|
2036
2144
|
onFiles?.(Array.from(event.dataTransfer.files));
|
|
2037
2145
|
},
|
|
2038
2146
|
children: [
|
|
2039
|
-
/* @__PURE__ */
|
|
2040
|
-
/* @__PURE__ */
|
|
2041
|
-
/* @__PURE__ */
|
|
2042
|
-
hint && /* @__PURE__ */
|
|
2147
|
+
/* @__PURE__ */ jsx37("span", { className: "flex size-10 items-center justify-center rounded-full bg-background bg-linear-to-r from-overlay-dark-5 to-overlay-dark-5 text-surface-foreground", children: icon ?? /* @__PURE__ */ jsx37(FileText, { size: 24, "aria-hidden": true }) }),
|
|
2148
|
+
/* @__PURE__ */ jsxs26("span", { className: "flex flex-col gap-1", children: [
|
|
2149
|
+
/* @__PURE__ */ jsx37("span", { className: "text-body-small text-surface-foreground", children: title }),
|
|
2150
|
+
hint && /* @__PURE__ */ jsx37("span", { className: "text-ui-caption text-secondary-muted-foreground", children: hint })
|
|
2043
2151
|
] }),
|
|
2044
|
-
/* @__PURE__ */
|
|
2152
|
+
/* @__PURE__ */ jsx37(
|
|
2045
2153
|
"input",
|
|
2046
2154
|
{
|
|
2047
2155
|
ref,
|
|
@@ -2057,49 +2165,49 @@ var FileUploadZone = React35.forwardRef(
|
|
|
2057
2165
|
}
|
|
2058
2166
|
);
|
|
2059
2167
|
FileUploadZone.displayName = "FileUploadZone";
|
|
2060
|
-
var FileUploadItem =
|
|
2168
|
+
var FileUploadItem = React36.forwardRef(
|
|
2061
2169
|
({ className, name, size, status = "uploading", progress = 0, timeLeft, icon, onRemove, removeLabel, ...props }, ref) => {
|
|
2062
2170
|
const uploading = status === "uploading";
|
|
2063
|
-
return /* @__PURE__ */
|
|
2171
|
+
return /* @__PURE__ */ jsxs26(
|
|
2064
2172
|
"div",
|
|
2065
2173
|
{
|
|
2066
2174
|
ref,
|
|
2067
2175
|
className: cn("flex w-full flex-col justify-center gap-2 overflow-hidden rounded-sm border border-border p-2", className),
|
|
2068
2176
|
...props,
|
|
2069
2177
|
children: [
|
|
2070
|
-
/* @__PURE__ */
|
|
2071
|
-
/* @__PURE__ */
|
|
2072
|
-
/* @__PURE__ */
|
|
2073
|
-
/* @__PURE__ */
|
|
2074
|
-
/* @__PURE__ */
|
|
2075
|
-
/* @__PURE__ */
|
|
2076
|
-
status === "complete" && /* @__PURE__ */
|
|
2077
|
-
status === "error" && /* @__PURE__ */
|
|
2178
|
+
/* @__PURE__ */ jsxs26("div", { className: "flex items-center gap-2", children: [
|
|
2179
|
+
/* @__PURE__ */ jsx37("span", { className: "flex size-10 shrink-0 items-center justify-center rounded-full bg-background bg-linear-to-r from-overlay-dark-5 to-overlay-dark-5 text-surface-foreground", children: icon ?? /* @__PURE__ */ jsx37(FileText, { size: 24, "aria-hidden": true }) }),
|
|
2180
|
+
/* @__PURE__ */ jsxs26("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [
|
|
2181
|
+
/* @__PURE__ */ jsxs26("div", { className: "flex items-center justify-between gap-2", children: [
|
|
2182
|
+
/* @__PURE__ */ jsxs26("div", { className: "flex min-w-0 items-center gap-2", children: [
|
|
2183
|
+
/* @__PURE__ */ jsx37("p", { className: "truncate text-ui-label text-surface-foreground", children: name }),
|
|
2184
|
+
status === "complete" && /* @__PURE__ */ jsx37(Tag, { variant: "success", children: "Complete" }),
|
|
2185
|
+
status === "error" && /* @__PURE__ */ jsx37(Tag, { variant: "destructive", children: "Error" })
|
|
2078
2186
|
] }),
|
|
2079
|
-
onRemove && /* @__PURE__ */
|
|
2187
|
+
onRemove && /* @__PURE__ */ jsx37(Button, { type: "button", variant: "ghost", size: "icon-sm", "aria-label": removeLabel ?? `Remove ${name}`, onClick: onRemove, children: /* @__PURE__ */ jsx37(X5, { size: 16, "aria-hidden": true }) })
|
|
2080
2188
|
] }),
|
|
2081
|
-
/* @__PURE__ */
|
|
2082
|
-
/* @__PURE__ */
|
|
2189
|
+
/* @__PURE__ */ jsxs26("div", { className: "flex items-center justify-between text-ui-caption text-secondary-muted-foreground", children: [
|
|
2190
|
+
/* @__PURE__ */ jsxs26("span", { className: "flex items-center gap-2", children: [
|
|
2083
2191
|
size,
|
|
2084
|
-
uploading && timeLeft && /* @__PURE__ */
|
|
2085
|
-
/* @__PURE__ */
|
|
2192
|
+
uploading && timeLeft && /* @__PURE__ */ jsxs26(Fragment5, { children: [
|
|
2193
|
+
/* @__PURE__ */ jsx37("span", { "aria-hidden": "true", className: "size-0.5 rounded-full bg-secondary-muted-foreground" }),
|
|
2086
2194
|
timeLeft
|
|
2087
2195
|
] })
|
|
2088
2196
|
] }),
|
|
2089
|
-
uploading && /* @__PURE__ */
|
|
2197
|
+
uploading && /* @__PURE__ */ jsxs26("span", { className: "text-body-xxs font-normal", children: [
|
|
2090
2198
|
Math.round(progress),
|
|
2091
2199
|
"%"
|
|
2092
2200
|
] })
|
|
2093
2201
|
] })
|
|
2094
2202
|
] })
|
|
2095
2203
|
] }),
|
|
2096
|
-
uploading && /* @__PURE__ */
|
|
2204
|
+
uploading && /* @__PURE__ */ jsx37(
|
|
2097
2205
|
ProgressPrimitive.Root,
|
|
2098
2206
|
{
|
|
2099
2207
|
value: progress,
|
|
2100
2208
|
"aria-label": `Uploading ${name}`,
|
|
2101
2209
|
className: "h-0.75 w-full overflow-hidden rounded-sm bg-background bg-linear-to-r from-overlay-dark-5 to-overlay-dark-5",
|
|
2102
|
-
children: /* @__PURE__ */
|
|
2210
|
+
children: /* @__PURE__ */ jsx37(ProgressPrimitive.Indicator, { className: "h-full bg-accent transition-[width]", style: { width: `${progress}%` } })
|
|
2103
2211
|
}
|
|
2104
2212
|
)
|
|
2105
2213
|
]
|
|
@@ -2110,31 +2218,31 @@ var FileUploadItem = React35.forwardRef(
|
|
|
2110
2218
|
FileUploadItem.displayName = "FileUploadItem";
|
|
2111
2219
|
|
|
2112
2220
|
// src/components/Question Types/Media.tsx
|
|
2113
|
-
import * as
|
|
2221
|
+
import * as React37 from "react";
|
|
2114
2222
|
import { CornersOut, DotsThree, Image as ImageIcon, Pause, Play, SpeakerSimpleHigh, SpeakerSimpleX, Trash as Trash2 } from "@phosphor-icons/react";
|
|
2115
2223
|
import { Slider as SliderPrimitive2, ToggleGroup as ToggleGroupPrimitive2 } from "radix-ui";
|
|
2116
|
-
import { jsx as
|
|
2224
|
+
import { jsx as jsx38, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
2117
2225
|
function MediaInfo({ name, details, onRemove, removeLabel, large, className, ...props }) {
|
|
2118
|
-
return /* @__PURE__ */
|
|
2119
|
-
/* @__PURE__ */
|
|
2120
|
-
/* @__PURE__ */
|
|
2121
|
-
details && /* @__PURE__ */
|
|
2122
|
-
index > 0 && /* @__PURE__ */
|
|
2226
|
+
return /* @__PURE__ */ jsxs27("div", { className: cn("flex items-center justify-between border-t border-border bg-surface px-6 py-4", className), ...props, children: [
|
|
2227
|
+
/* @__PURE__ */ jsxs27("div", { className: "flex min-w-0 flex-1 flex-col gap-2", children: [
|
|
2228
|
+
/* @__PURE__ */ jsx38("p", { className: cn("truncate text-surface-foreground", large ? "text-body-section" : "text-ui-label"), children: name }),
|
|
2229
|
+
details && /* @__PURE__ */ jsx38("p", { className: cn("flex items-center gap-2 text-secondary-muted-foreground", large ? "text-body-small" : "text-ui-caption"), children: details.map((part, index) => /* @__PURE__ */ jsxs27(React37.Fragment, { children: [
|
|
2230
|
+
index > 0 && /* @__PURE__ */ jsx38("span", { "aria-hidden": "true", className: "size-0.5 rounded-full bg-secondary-muted-foreground" }),
|
|
2123
2231
|
part
|
|
2124
2232
|
] }, part)) })
|
|
2125
2233
|
] }),
|
|
2126
|
-
onRemove && /* @__PURE__ */
|
|
2234
|
+
onRemove && /* @__PURE__ */ jsx38(Button, { type: "button", variant: "destructive", size: "icon", "aria-label": removeLabel ?? `Remove ${name}`, onClick: onRemove, children: /* @__PURE__ */ jsx38(Trash2, { size: 16, "aria-hidden": true }) })
|
|
2127
2235
|
] });
|
|
2128
2236
|
}
|
|
2129
|
-
var ImagePreview =
|
|
2130
|
-
({ className, children, name, details, onRemove, ...props }, ref) => /* @__PURE__ */
|
|
2131
|
-
/* @__PURE__ */
|
|
2132
|
-
/* @__PURE__ */
|
|
2237
|
+
var ImagePreview = React37.forwardRef(
|
|
2238
|
+
({ className, children, name, details, onRemove, ...props }, ref) => /* @__PURE__ */ jsxs27("div", { ref, className: cn("flex w-full flex-col overflow-hidden rounded-lg border border-border", className), ...props, children: [
|
|
2239
|
+
/* @__PURE__ */ jsx38("div", { className: "flex h-84 w-full items-center justify-center bg-accent-soft [&>img]:size-full [&>img]:object-contain", children }),
|
|
2240
|
+
/* @__PURE__ */ jsx38(MediaInfo, { name, details, onRemove, large: true })
|
|
2133
2241
|
] })
|
|
2134
2242
|
);
|
|
2135
2243
|
ImagePreview.displayName = "ImagePreview";
|
|
2136
|
-
var ImageThumbnails =
|
|
2137
|
-
({ className, max, images, value, onValueChange, ...props }, ref) => /* @__PURE__ */
|
|
2244
|
+
var ImageThumbnails = React37.forwardRef(
|
|
2245
|
+
({ className, max, images, value, onValueChange, ...props }, ref) => /* @__PURE__ */ jsx38(
|
|
2138
2246
|
ToggleGroupPrimitive2.Root,
|
|
2139
2247
|
{
|
|
2140
2248
|
ref,
|
|
@@ -2146,17 +2254,17 @@ var ImageThumbnails = React36.forwardRef(
|
|
|
2146
2254
|
children: Array.from({ length: max }, (_, index) => {
|
|
2147
2255
|
const image = images[index];
|
|
2148
2256
|
if (!image) {
|
|
2149
|
-
return /* @__PURE__ */
|
|
2257
|
+
return /* @__PURE__ */ jsx38(
|
|
2150
2258
|
"span",
|
|
2151
2259
|
{
|
|
2152
2260
|
"aria-hidden": "true",
|
|
2153
2261
|
className: "flex h-20 min-w-0 flex-1 items-center justify-center rounded-sm border border-dashed border-border text-accent-foreground",
|
|
2154
|
-
children: /* @__PURE__ */
|
|
2262
|
+
children: /* @__PURE__ */ jsx38(ImageIcon, { size: 24 })
|
|
2155
2263
|
},
|
|
2156
2264
|
`empty-${index}`
|
|
2157
2265
|
);
|
|
2158
2266
|
}
|
|
2159
|
-
return /* @__PURE__ */
|
|
2267
|
+
return /* @__PURE__ */ jsx38(
|
|
2160
2268
|
ToggleGroupPrimitive2.Item,
|
|
2161
2269
|
{
|
|
2162
2270
|
value: image.id,
|
|
@@ -2166,7 +2274,7 @@ var ImageThumbnails = React36.forwardRef(
|
|
|
2166
2274
|
"hover:bg-accent-soft hover:bg-none",
|
|
2167
2275
|
"data-[state=on]:border-accent-foreground data-[state=on]:bg-accent-soft data-[state=on]:bg-none data-[state=on]:text-accent-foreground"
|
|
2168
2276
|
),
|
|
2169
|
-
children: image.src ? /* @__PURE__ */
|
|
2277
|
+
children: image.src ? /* @__PURE__ */ jsx38("img", { src: image.src, alt: "", className: "size-full object-cover" }) : /* @__PURE__ */ jsx38(ImageIcon, { size: 24, "aria-hidden": true })
|
|
2170
2278
|
},
|
|
2171
2279
|
image.id
|
|
2172
2280
|
);
|
|
@@ -2179,13 +2287,13 @@ var formatTime = (seconds) => {
|
|
|
2179
2287
|
const total = Math.max(0, Math.floor(Number.isFinite(seconds) ? seconds : 0));
|
|
2180
2288
|
return `${Math.floor(total / 60)}:${String(total % 60).padStart(2, "0")}`;
|
|
2181
2289
|
};
|
|
2182
|
-
var VideoPlayer =
|
|
2290
|
+
var VideoPlayer = React37.forwardRef(
|
|
2183
2291
|
({ className, src, name, details, onRemove, onMore, initialTime = 0, initialDuration = 0, ...props }, ref) => {
|
|
2184
|
-
const video =
|
|
2185
|
-
const [playing, setPlaying] =
|
|
2186
|
-
const [time, setTime] =
|
|
2187
|
-
const [duration, setDuration] =
|
|
2188
|
-
const [volume, setVolume] =
|
|
2292
|
+
const video = React37.useRef(null);
|
|
2293
|
+
const [playing, setPlaying] = React37.useState(false);
|
|
2294
|
+
const [time, setTime] = React37.useState(initialTime);
|
|
2295
|
+
const [duration, setDuration] = React37.useState(initialDuration);
|
|
2296
|
+
const [volume, setVolume] = React37.useState(1);
|
|
2189
2297
|
const muted = volume === 0;
|
|
2190
2298
|
const toggle2 = () => {
|
|
2191
2299
|
const el = video.current;
|
|
@@ -2193,9 +2301,9 @@ var VideoPlayer = React36.forwardRef(
|
|
|
2193
2301
|
if (el.paused) void el.play();
|
|
2194
2302
|
else el.pause();
|
|
2195
2303
|
};
|
|
2196
|
-
return /* @__PURE__ */
|
|
2197
|
-
/* @__PURE__ */
|
|
2198
|
-
src && /* @__PURE__ */
|
|
2304
|
+
return /* @__PURE__ */ jsxs27("div", { ref, className: cn("flex w-full flex-col overflow-hidden rounded-lg border border-border bg-surface", className), ...props, children: [
|
|
2305
|
+
/* @__PURE__ */ jsxs27("div", { className: "relative flex h-60.5 w-full items-end bg-accent-soft", children: [
|
|
2306
|
+
src && /* @__PURE__ */ jsx38(
|
|
2199
2307
|
"video",
|
|
2200
2308
|
{
|
|
2201
2309
|
ref: video,
|
|
@@ -2208,8 +2316,8 @@ var VideoPlayer = React36.forwardRef(
|
|
|
2208
2316
|
onVolumeChange: (event) => setVolume(event.currentTarget.muted ? 0 : event.currentTarget.volume)
|
|
2209
2317
|
}
|
|
2210
2318
|
),
|
|
2211
|
-
/* @__PURE__ */
|
|
2212
|
-
/* @__PURE__ */
|
|
2319
|
+
/* @__PURE__ */ jsxs27("div", { className: "relative flex w-full flex-col gap-2 bg-surface-foreground bg-linear-to-r from-primary/30 to-primary/30 px-4 pt-3 pb-4 text-surface", children: [
|
|
2320
|
+
/* @__PURE__ */ jsxs27(
|
|
2213
2321
|
SliderPrimitive2.Root,
|
|
2214
2322
|
{
|
|
2215
2323
|
min: 0,
|
|
@@ -2223,31 +2331,31 @@ var VideoPlayer = React36.forwardRef(
|
|
|
2223
2331
|
},
|
|
2224
2332
|
className: "relative flex h-4 w-full touch-none items-center select-none",
|
|
2225
2333
|
children: [
|
|
2226
|
-
/* @__PURE__ */
|
|
2227
|
-
/* @__PURE__ */
|
|
2334
|
+
/* @__PURE__ */ jsx38(SliderPrimitive2.Track, { className: "relative h-1 w-full grow overflow-hidden rounded-xxs bg-surface/20", children: /* @__PURE__ */ jsx38(SliderPrimitive2.Range, { className: "absolute h-full bg-accent-foreground" }) }),
|
|
2335
|
+
/* @__PURE__ */ jsx38(SliderPrimitive2.Thumb, { "aria-label": "Seek", className: "block size-3 rounded-full border-2 border-surface bg-surface shadow-sm" })
|
|
2228
2336
|
]
|
|
2229
2337
|
}
|
|
2230
2338
|
),
|
|
2231
|
-
/* @__PURE__ */
|
|
2232
|
-
/* @__PURE__ */
|
|
2233
|
-
/* @__PURE__ */
|
|
2339
|
+
/* @__PURE__ */ jsxs27("div", { className: "flex items-center justify-between", children: [
|
|
2340
|
+
/* @__PURE__ */ jsxs27("div", { className: "flex items-center gap-4", children: [
|
|
2341
|
+
/* @__PURE__ */ jsx38(
|
|
2234
2342
|
"button",
|
|
2235
2343
|
{
|
|
2236
2344
|
type: "button",
|
|
2237
2345
|
"aria-label": playing ? "Pause" : "Play",
|
|
2238
2346
|
onClick: toggle2,
|
|
2239
2347
|
className: "inline-flex size-10 items-center justify-center rounded-full bg-surface/12 text-surface transition-colors hover:bg-surface/20",
|
|
2240
|
-
children: playing ? /* @__PURE__ */
|
|
2348
|
+
children: playing ? /* @__PURE__ */ jsx38(Pause, { size: 16, weight: "fill", "aria-hidden": true }) : /* @__PURE__ */ jsx38(Play, { size: 16, weight: "fill", "aria-hidden": true })
|
|
2241
2349
|
}
|
|
2242
2350
|
),
|
|
2243
|
-
/* @__PURE__ */
|
|
2351
|
+
/* @__PURE__ */ jsxs27("span", { className: "text-ui-label whitespace-nowrap text-surface/80", children: [
|
|
2244
2352
|
formatTime(time),
|
|
2245
2353
|
" / ",
|
|
2246
2354
|
formatTime(duration)
|
|
2247
2355
|
] })
|
|
2248
2356
|
] }),
|
|
2249
|
-
/* @__PURE__ */
|
|
2250
|
-
/* @__PURE__ */
|
|
2357
|
+
/* @__PURE__ */ jsxs27("div", { className: "flex items-center gap-2", children: [
|
|
2358
|
+
/* @__PURE__ */ jsx38(
|
|
2251
2359
|
VolumeControl,
|
|
2252
2360
|
{
|
|
2253
2361
|
volume,
|
|
@@ -2260,41 +2368,41 @@ var VideoPlayer = React36.forwardRef(
|
|
|
2260
2368
|
}
|
|
2261
2369
|
}
|
|
2262
2370
|
),
|
|
2263
|
-
/* @__PURE__ */
|
|
2371
|
+
/* @__PURE__ */ jsx38(
|
|
2264
2372
|
"button",
|
|
2265
2373
|
{
|
|
2266
2374
|
type: "button",
|
|
2267
2375
|
"aria-label": "Full screen",
|
|
2268
2376
|
onClick: () => void video.current?.requestFullscreen?.(),
|
|
2269
2377
|
className: "inline-flex size-10 items-center justify-center rounded-md text-surface transition-colors hover:bg-surface/12",
|
|
2270
|
-
children: /* @__PURE__ */
|
|
2378
|
+
children: /* @__PURE__ */ jsx38(CornersOut, { size: 16, "aria-hidden": true })
|
|
2271
2379
|
}
|
|
2272
2380
|
),
|
|
2273
|
-
/* @__PURE__ */
|
|
2381
|
+
/* @__PURE__ */ jsx38(
|
|
2274
2382
|
"button",
|
|
2275
2383
|
{
|
|
2276
2384
|
type: "button",
|
|
2277
2385
|
"aria-label": "More",
|
|
2278
2386
|
onClick: onMore,
|
|
2279
2387
|
className: "inline-flex size-10 items-center justify-center rounded-md text-surface transition-colors hover:bg-surface/12",
|
|
2280
|
-
children: /* @__PURE__ */
|
|
2388
|
+
children: /* @__PURE__ */ jsx38(DotsThree, { size: 16, "aria-hidden": true })
|
|
2281
2389
|
}
|
|
2282
2390
|
)
|
|
2283
2391
|
] })
|
|
2284
2392
|
] })
|
|
2285
2393
|
] })
|
|
2286
2394
|
] }),
|
|
2287
|
-
name && /* @__PURE__ */
|
|
2288
|
-
/* @__PURE__ */
|
|
2395
|
+
name && /* @__PURE__ */ jsx38(MediaInfo, { name, details, onRemove }),
|
|
2396
|
+
/* @__PURE__ */ jsx38("span", { className: "sr-only", "aria-live": "polite", children: muted ? "Muted" : "" })
|
|
2289
2397
|
] });
|
|
2290
2398
|
}
|
|
2291
2399
|
);
|
|
2292
2400
|
VideoPlayer.displayName = "VideoPlayer";
|
|
2293
2401
|
function VolumeControl({ volume, onVolumeChange, className }) {
|
|
2294
|
-
const last =
|
|
2402
|
+
const last = React37.useRef(volume || 1);
|
|
2295
2403
|
if (volume > 0) last.current = volume;
|
|
2296
|
-
return /* @__PURE__ */
|
|
2297
|
-
/* @__PURE__ */
|
|
2404
|
+
return /* @__PURE__ */ jsxs27("div", { className: cn("group/volume flex items-center", className), children: [
|
|
2405
|
+
/* @__PURE__ */ jsx38("div", { className: "w-0 overflow-hidden opacity-0 transition-all group-focus-within/volume:w-16 group-focus-within/volume:opacity-100 group-hover/volume:w-16 group-hover/volume:opacity-100", children: /* @__PURE__ */ jsxs27(
|
|
2298
2406
|
SliderPrimitive2.Root,
|
|
2299
2407
|
{
|
|
2300
2408
|
min: 0,
|
|
@@ -2304,32 +2412,32 @@ function VolumeControl({ volume, onVolumeChange, className }) {
|
|
|
2304
2412
|
onValueChange: ([next]) => next !== void 0 && onVolumeChange(next),
|
|
2305
2413
|
className: "relative flex h-4 w-14 touch-none items-center select-none",
|
|
2306
2414
|
children: [
|
|
2307
|
-
/* @__PURE__ */
|
|
2308
|
-
/* @__PURE__ */
|
|
2415
|
+
/* @__PURE__ */ jsx38(SliderPrimitive2.Track, { className: "relative h-1 w-full grow overflow-hidden rounded-xxs bg-surface/20", children: /* @__PURE__ */ jsx38(SliderPrimitive2.Range, { className: "absolute h-full bg-surface" }) }),
|
|
2416
|
+
/* @__PURE__ */ jsx38(SliderPrimitive2.Thumb, { "aria-label": "Volume", className: "block size-3 rounded-full bg-surface shadow-sm" })
|
|
2309
2417
|
]
|
|
2310
2418
|
}
|
|
2311
2419
|
) }),
|
|
2312
|
-
/* @__PURE__ */
|
|
2420
|
+
/* @__PURE__ */ jsx38(
|
|
2313
2421
|
"button",
|
|
2314
2422
|
{
|
|
2315
2423
|
type: "button",
|
|
2316
2424
|
"aria-label": volume === 0 ? "Unmute" : "Mute",
|
|
2317
2425
|
onClick: () => onVolumeChange(volume === 0 ? last.current : 0),
|
|
2318
2426
|
className: "inline-flex size-10 items-center justify-center rounded-md text-surface transition-colors hover:bg-surface/12",
|
|
2319
|
-
children: volume === 0 ? /* @__PURE__ */
|
|
2427
|
+
children: volume === 0 ? /* @__PURE__ */ jsx38(SpeakerSimpleX, { size: 16, "aria-hidden": true }) : /* @__PURE__ */ jsx38(SpeakerSimpleHigh, { size: 16, "aria-hidden": true })
|
|
2320
2428
|
}
|
|
2321
2429
|
)
|
|
2322
2430
|
] });
|
|
2323
2431
|
}
|
|
2324
2432
|
|
|
2325
2433
|
// src/components/Question Types/OpenEndAnswer.tsx
|
|
2326
|
-
import * as
|
|
2327
|
-
import { jsx as
|
|
2328
|
-
var OpenEndAnswer =
|
|
2434
|
+
import * as React38 from "react";
|
|
2435
|
+
import { jsx as jsx39 } from "react/jsx-runtime";
|
|
2436
|
+
var OpenEndAnswer = React38.forwardRef(
|
|
2329
2437
|
({ value, defaultValue, onChange, maxLength = 1e3, placeholder = "Write your answer", ...props }, ref) => {
|
|
2330
|
-
const [internal, setInternal] =
|
|
2438
|
+
const [internal, setInternal] = React38.useState(String(defaultValue ?? ""));
|
|
2331
2439
|
const text = value !== void 0 ? String(value) : internal;
|
|
2332
|
-
return /* @__PURE__ */
|
|
2440
|
+
return /* @__PURE__ */ jsx39(
|
|
2333
2441
|
Textarea,
|
|
2334
2442
|
{
|
|
2335
2443
|
ref,
|
|
@@ -2349,10 +2457,10 @@ var OpenEndAnswer = React37.forwardRef(
|
|
|
2349
2457
|
OpenEndAnswer.displayName = "OpenEndAnswer";
|
|
2350
2458
|
|
|
2351
2459
|
// src/components/Question Types/QuestionCard.tsx
|
|
2352
|
-
import * as
|
|
2353
|
-
import { jsx as
|
|
2354
|
-
var QuestionCard =
|
|
2355
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
2460
|
+
import * as React39 from "react";
|
|
2461
|
+
import { jsx as jsx40 } from "react/jsx-runtime";
|
|
2462
|
+
var QuestionCard = React39.forwardRef(
|
|
2463
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx40(
|
|
2356
2464
|
"div",
|
|
2357
2465
|
{
|
|
2358
2466
|
ref,
|
|
@@ -2364,7 +2472,7 @@ var QuestionCard = React38.forwardRef(
|
|
|
2364
2472
|
QuestionCard.displayName = "QuestionCard";
|
|
2365
2473
|
|
|
2366
2474
|
// src/components/Question Types/QuestionEditorCard.tsx
|
|
2367
|
-
import * as
|
|
2475
|
+
import * as React41 from "react";
|
|
2368
2476
|
import {
|
|
2369
2477
|
Clipboard,
|
|
2370
2478
|
Copy,
|
|
@@ -2375,19 +2483,19 @@ import {
|
|
|
2375
2483
|
} from "@phosphor-icons/react";
|
|
2376
2484
|
|
|
2377
2485
|
// src/components/Question Types/QuestionHeader.tsx
|
|
2378
|
-
import * as
|
|
2486
|
+
import * as React40 from "react";
|
|
2379
2487
|
import { DotsSixVertical } from "@phosphor-icons/react";
|
|
2380
|
-
import { jsx as
|
|
2488
|
+
import { jsx as jsx41, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
2381
2489
|
var eyebrow = "text-ui-caption uppercase text-secondary-muted-foreground";
|
|
2382
|
-
var QuestionHeader =
|
|
2490
|
+
var QuestionHeader = React40.forwardRef(
|
|
2383
2491
|
({ className, number, title, required, error, onDismissError, editor, onTitleChange, actions, maxLength = 2e3, active, showCounter = true, ...props }, ref) => {
|
|
2384
2492
|
const label = String(number).padStart(2, "0");
|
|
2385
2493
|
const showError = error !== void 0 && error !== false;
|
|
2386
2494
|
if (editor) {
|
|
2387
2495
|
const text = typeof title === "string" ? title : "";
|
|
2388
|
-
return /* @__PURE__ */
|
|
2389
|
-
/* @__PURE__ */
|
|
2390
|
-
/* @__PURE__ */
|
|
2496
|
+
return /* @__PURE__ */ jsxs28("div", { ref, className: cn("group/header flex w-full flex-col gap-2", className), ...props, children: [
|
|
2497
|
+
/* @__PURE__ */ jsxs28("div", { className: "flex items-center justify-between", children: [
|
|
2498
|
+
/* @__PURE__ */ jsxs28(
|
|
2391
2499
|
"span",
|
|
2392
2500
|
{
|
|
2393
2501
|
className: cn(
|
|
@@ -2395,15 +2503,15 @@ var QuestionHeader = React39.forwardRef(
|
|
|
2395
2503
|
active ? "bg-accent-soft text-accent-soft-foreground" : "bg-secondary bg-linear-to-r from-overlay-dark-5 to-overlay-dark-5 text-surface-foreground"
|
|
2396
2504
|
),
|
|
2397
2505
|
children: [
|
|
2398
|
-
/* @__PURE__ */
|
|
2506
|
+
/* @__PURE__ */ jsx41(DotsSixVertical, { size: 16, "aria-hidden": true, className: "hidden shrink-0 group-hover/handle:block" }),
|
|
2399
2507
|
"Question ",
|
|
2400
2508
|
number
|
|
2401
2509
|
]
|
|
2402
2510
|
}
|
|
2403
2511
|
),
|
|
2404
|
-
actions && /* @__PURE__ */
|
|
2512
|
+
actions && /* @__PURE__ */ jsx41("div", { className: "flex items-center gap-2 opacity-0 transition-opacity group-focus-within/header:opacity-100 group-hover/header:opacity-100", children: actions })
|
|
2405
2513
|
] }),
|
|
2406
|
-
/* @__PURE__ */
|
|
2514
|
+
/* @__PURE__ */ jsx41(
|
|
2407
2515
|
"textarea",
|
|
2408
2516
|
{
|
|
2409
2517
|
rows: 1,
|
|
@@ -2414,7 +2522,7 @@ var QuestionHeader = React39.forwardRef(
|
|
|
2414
2522
|
className: "field-sizing-content w-full resize-none bg-transparent text-heading-h4 text-surface-foreground outline-none"
|
|
2415
2523
|
}
|
|
2416
2524
|
),
|
|
2417
|
-
showCounter && /* @__PURE__ */
|
|
2525
|
+
showCounter && /* @__PURE__ */ jsxs28("p", { className: "text-ui-caption text-secondary-muted-foreground", children: [
|
|
2418
2526
|
text.length,
|
|
2419
2527
|
"/",
|
|
2420
2528
|
maxLength,
|
|
@@ -2422,16 +2530,16 @@ var QuestionHeader = React39.forwardRef(
|
|
|
2422
2530
|
] })
|
|
2423
2531
|
] });
|
|
2424
2532
|
}
|
|
2425
|
-
return /* @__PURE__ */
|
|
2426
|
-
showError && /* @__PURE__ */
|
|
2427
|
-
/* @__PURE__ */
|
|
2533
|
+
return /* @__PURE__ */ jsxs28("div", { ref, className: cn("flex w-full flex-col gap-2", className), ...props, children: [
|
|
2534
|
+
showError && /* @__PURE__ */ jsx41(ToastInline, { variant: "destructive", onClose: onDismissError, className: "min-h-10", children: /* @__PURE__ */ jsx41("span", { className: "text-ui-label text-destructive", children: error === true ? "This question is mandatory." : error }) }),
|
|
2535
|
+
/* @__PURE__ */ jsxs28("p", { className: eyebrow, children: [
|
|
2428
2536
|
"Question ",
|
|
2429
2537
|
label
|
|
2430
2538
|
] }),
|
|
2431
|
-
/* @__PURE__ */
|
|
2539
|
+
/* @__PURE__ */ jsxs28("h3", { className: "text-heading-h4 text-surface-foreground", children: [
|
|
2432
2540
|
title,
|
|
2433
|
-
required && /* @__PURE__ */
|
|
2434
|
-
required && /* @__PURE__ */
|
|
2541
|
+
required && /* @__PURE__ */ jsx41("span", { "aria-hidden": "true", className: "text-destructive", children: "*" }),
|
|
2542
|
+
required && /* @__PURE__ */ jsx41("span", { className: "sr-only", children: " (required)" })
|
|
2435
2543
|
] })
|
|
2436
2544
|
] });
|
|
2437
2545
|
}
|
|
@@ -2439,8 +2547,8 @@ var QuestionHeader = React39.forwardRef(
|
|
|
2439
2547
|
QuestionHeader.displayName = "QuestionHeader";
|
|
2440
2548
|
|
|
2441
2549
|
// src/components/Question Types/QuestionEditorCard.tsx
|
|
2442
|
-
import { Fragment as Fragment7, jsx as
|
|
2443
|
-
var QuestionEditorCard =
|
|
2550
|
+
import { Fragment as Fragment7, jsx as jsx42, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
2551
|
+
var QuestionEditorCard = React41.forwardRef(
|
|
2444
2552
|
({
|
|
2445
2553
|
className,
|
|
2446
2554
|
number,
|
|
@@ -2461,14 +2569,14 @@ var QuestionEditorCard = React40.forwardRef(
|
|
|
2461
2569
|
...props
|
|
2462
2570
|
}, ref) => {
|
|
2463
2571
|
const footer = active && (countLabel != null || onAdd || onPaste);
|
|
2464
|
-
return /* @__PURE__ */
|
|
2572
|
+
return /* @__PURE__ */ jsxs29(
|
|
2465
2573
|
"div",
|
|
2466
2574
|
{
|
|
2467
2575
|
ref,
|
|
2468
2576
|
className: cn("group/editor flex w-full items-start gap-2", className),
|
|
2469
2577
|
...props,
|
|
2470
2578
|
children: [
|
|
2471
|
-
/* @__PURE__ */
|
|
2579
|
+
/* @__PURE__ */ jsxs29(
|
|
2472
2580
|
"div",
|
|
2473
2581
|
{
|
|
2474
2582
|
className: cn(
|
|
@@ -2476,9 +2584,9 @@ var QuestionEditorCard = React40.forwardRef(
|
|
|
2476
2584
|
active ? "border-accent" : "border-border"
|
|
2477
2585
|
),
|
|
2478
2586
|
children: [
|
|
2479
|
-
/* @__PURE__ */
|
|
2480
|
-
/* @__PURE__ */
|
|
2481
|
-
/* @__PURE__ */
|
|
2587
|
+
/* @__PURE__ */ jsxs29("div", { className: cn("flex flex-col p-6", footer ? "gap-5" : "gap-4"), children: [
|
|
2588
|
+
/* @__PURE__ */ jsxs29("div", { className: "flex flex-col gap-4", children: [
|
|
2589
|
+
/* @__PURE__ */ jsx42(
|
|
2482
2590
|
QuestionHeader,
|
|
2483
2591
|
{
|
|
2484
2592
|
editor: true,
|
|
@@ -2488,8 +2596,8 @@ var QuestionEditorCard = React40.forwardRef(
|
|
|
2488
2596
|
active,
|
|
2489
2597
|
showCounter: !!active,
|
|
2490
2598
|
maxLength,
|
|
2491
|
-
actions: actions ?? /* @__PURE__ */
|
|
2492
|
-
/* @__PURE__ */
|
|
2599
|
+
actions: actions ?? /* @__PURE__ */ jsxs29(Fragment7, { children: [
|
|
2600
|
+
/* @__PURE__ */ jsx42(
|
|
2493
2601
|
Button,
|
|
2494
2602
|
{
|
|
2495
2603
|
type: "button",
|
|
@@ -2497,10 +2605,10 @@ var QuestionEditorCard = React40.forwardRef(
|
|
|
2497
2605
|
size: "icon-sm",
|
|
2498
2606
|
"aria-label": "Duplicate question",
|
|
2499
2607
|
onClick: onDuplicate,
|
|
2500
|
-
children: /* @__PURE__ */
|
|
2608
|
+
children: /* @__PURE__ */ jsx42(Copy, { size: 16, "aria-hidden": true })
|
|
2501
2609
|
}
|
|
2502
2610
|
),
|
|
2503
|
-
/* @__PURE__ */
|
|
2611
|
+
/* @__PURE__ */ jsx42(
|
|
2504
2612
|
Button,
|
|
2505
2613
|
{
|
|
2506
2614
|
type: "button",
|
|
@@ -2508,10 +2616,10 @@ var QuestionEditorCard = React40.forwardRef(
|
|
|
2508
2616
|
size: "icon-sm",
|
|
2509
2617
|
"aria-label": "Delete question",
|
|
2510
2618
|
onClick: onDelete,
|
|
2511
|
-
children: /* @__PURE__ */
|
|
2619
|
+
children: /* @__PURE__ */ jsx42(Trash3, { size: 16, "aria-hidden": true })
|
|
2512
2620
|
}
|
|
2513
2621
|
),
|
|
2514
|
-
/* @__PURE__ */
|
|
2622
|
+
/* @__PURE__ */ jsx42(
|
|
2515
2623
|
Button,
|
|
2516
2624
|
{
|
|
2517
2625
|
type: "button",
|
|
@@ -2519,7 +2627,7 @@ var QuestionEditorCard = React40.forwardRef(
|
|
|
2519
2627
|
size: "icon-sm",
|
|
2520
2628
|
"aria-label": "Preview question",
|
|
2521
2629
|
onClick: onPreview,
|
|
2522
|
-
children: /* @__PURE__ */
|
|
2630
|
+
children: /* @__PURE__ */ jsx42(Eye, { size: 16, "aria-hidden": true })
|
|
2523
2631
|
}
|
|
2524
2632
|
)
|
|
2525
2633
|
] })
|
|
@@ -2527,10 +2635,10 @@ var QuestionEditorCard = React40.forwardRef(
|
|
|
2527
2635
|
),
|
|
2528
2636
|
children
|
|
2529
2637
|
] }),
|
|
2530
|
-
footer && /* @__PURE__ */
|
|
2531
|
-
/* @__PURE__ */
|
|
2532
|
-
/* @__PURE__ */
|
|
2533
|
-
onAdd && /* @__PURE__ */
|
|
2638
|
+
footer && /* @__PURE__ */ jsxs29("div", { className: "flex items-center justify-between", children: [
|
|
2639
|
+
/* @__PURE__ */ jsx42("p", { className: "text-ui-caption text-secondary-muted-foreground", children: countLabel }),
|
|
2640
|
+
/* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-2", children: [
|
|
2641
|
+
onAdd && /* @__PURE__ */ jsx42(
|
|
2534
2642
|
Button,
|
|
2535
2643
|
{
|
|
2536
2644
|
type: "button",
|
|
@@ -2538,10 +2646,10 @@ var QuestionEditorCard = React40.forwardRef(
|
|
|
2538
2646
|
size: "icon",
|
|
2539
2647
|
"aria-label": "Add choice",
|
|
2540
2648
|
onClick: onAdd,
|
|
2541
|
-
children: /* @__PURE__ */
|
|
2649
|
+
children: /* @__PURE__ */ jsx42(Plus3, { size: 16, "aria-hidden": true })
|
|
2542
2650
|
}
|
|
2543
2651
|
),
|
|
2544
|
-
onPaste && /* @__PURE__ */
|
|
2652
|
+
onPaste && /* @__PURE__ */ jsx42(
|
|
2545
2653
|
Button,
|
|
2546
2654
|
{
|
|
2547
2655
|
type: "button",
|
|
@@ -2549,17 +2657,17 @@ var QuestionEditorCard = React40.forwardRef(
|
|
|
2549
2657
|
size: "icon",
|
|
2550
2658
|
"aria-label": "Paste choices",
|
|
2551
2659
|
onClick: onPaste,
|
|
2552
|
-
children: /* @__PURE__ */
|
|
2660
|
+
children: /* @__PURE__ */ jsx42(Clipboard, { size: 16, "aria-hidden": true })
|
|
2553
2661
|
}
|
|
2554
2662
|
)
|
|
2555
2663
|
] })
|
|
2556
2664
|
] })
|
|
2557
2665
|
] }),
|
|
2558
|
-
note && /* @__PURE__ */
|
|
2666
|
+
note && /* @__PURE__ */ jsx42("div", { className: "border-t border-border px-2 py-2 text-body-small text-surface-foreground", children: note })
|
|
2559
2667
|
]
|
|
2560
2668
|
}
|
|
2561
2669
|
),
|
|
2562
|
-
onAskAi && /* @__PURE__ */
|
|
2670
|
+
onAskAi && /* @__PURE__ */ jsx42(
|
|
2563
2671
|
Button,
|
|
2564
2672
|
{
|
|
2565
2673
|
type: "button",
|
|
@@ -2568,7 +2676,7 @@ var QuestionEditorCard = React40.forwardRef(
|
|
|
2568
2676
|
"aria-label": "Ask AI",
|
|
2569
2677
|
onClick: onAskAi,
|
|
2570
2678
|
className: "shrink-0 opacity-0 transition-opacity group-hover/editor:opacity-100 group-focus-within/editor:opacity-100 focus-visible:opacity-100",
|
|
2571
|
-
children: /* @__PURE__ */
|
|
2679
|
+
children: /* @__PURE__ */ jsx42(Sparkle2, { size: 16, "aria-hidden": true })
|
|
2572
2680
|
}
|
|
2573
2681
|
)
|
|
2574
2682
|
]
|
|
@@ -2579,14 +2687,14 @@ var QuestionEditorCard = React40.forwardRef(
|
|
|
2579
2687
|
QuestionEditorCard.displayName = "QuestionEditorCard";
|
|
2580
2688
|
|
|
2581
2689
|
// src/components/Question Types/QuestionNavItem.tsx
|
|
2582
|
-
import * as
|
|
2690
|
+
import * as React43 from "react";
|
|
2583
2691
|
import { DotsSixVertical as DotsSixVertical2, Warning as Warning2 } from "@phosphor-icons/react";
|
|
2584
2692
|
import { Slot as Slot3 } from "radix-ui";
|
|
2585
2693
|
|
|
2586
2694
|
// src/components/Question Types/QuestionTypeIcon.tsx
|
|
2587
2695
|
import "react";
|
|
2588
2696
|
import { ChatsCircle, CheckSquare, FileArrowUp, ListNumbers, RadioButton, StarHalf } from "@phosphor-icons/react";
|
|
2589
|
-
import { jsx as
|
|
2697
|
+
import { jsx as jsx43 } from "react/jsx-runtime";
|
|
2590
2698
|
var icons = {
|
|
2591
2699
|
"select-one": RadioButton,
|
|
2592
2700
|
"select-multiple": CheckSquare,
|
|
@@ -2597,15 +2705,15 @@ var icons = {
|
|
|
2597
2705
|
};
|
|
2598
2706
|
function QuestionTypeIcon({ type, size = 22.5, className, ...props }) {
|
|
2599
2707
|
const Icon = icons[type];
|
|
2600
|
-
return /* @__PURE__ */
|
|
2708
|
+
return /* @__PURE__ */ jsx43(Icon, { size, weight: "duotone", "aria-hidden": true, className: className ?? "text-accent-foreground", ...props });
|
|
2601
2709
|
}
|
|
2602
2710
|
|
|
2603
2711
|
// src/components/Question Types/QuestionNavItem.tsx
|
|
2604
|
-
import { jsx as
|
|
2605
|
-
var QuestionNavItem =
|
|
2712
|
+
import { jsx as jsx44, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
2713
|
+
var QuestionNavItem = React43.forwardRef(
|
|
2606
2714
|
({ className, questionType = "select-one", selected, error, asChild, children, ...props }, ref) => {
|
|
2607
2715
|
const Comp = asChild ? Slot3.Root : "button";
|
|
2608
|
-
return /* @__PURE__ */
|
|
2716
|
+
return /* @__PURE__ */ jsxs30(
|
|
2609
2717
|
Comp,
|
|
2610
2718
|
{
|
|
2611
2719
|
ref,
|
|
@@ -2621,12 +2729,12 @@ var QuestionNavItem = React42.forwardRef(
|
|
|
2621
2729
|
),
|
|
2622
2730
|
...props,
|
|
2623
2731
|
children: [
|
|
2624
|
-
/* @__PURE__ */
|
|
2625
|
-
/* @__PURE__ */
|
|
2626
|
-
/* @__PURE__ */
|
|
2732
|
+
/* @__PURE__ */ jsxs30("span", { "aria-hidden": "true", className: "relative flex size-4 shrink-0 items-center justify-center", children: [
|
|
2733
|
+
/* @__PURE__ */ jsx44(DotsSixVertical2, { size: 16, className: "hidden group-hover/nav:block" }),
|
|
2734
|
+
/* @__PURE__ */ jsx44("span", { className: "group-hover/nav:hidden", children: error ? /* @__PURE__ */ jsx44(Warning2, { size: 16, className: "text-destructive" }) : /* @__PURE__ */ jsx44(QuestionTypeIcon, { type: questionType, size: 16 }) })
|
|
2627
2735
|
] }),
|
|
2628
|
-
/* @__PURE__ */
|
|
2629
|
-
error && /* @__PURE__ */
|
|
2736
|
+
/* @__PURE__ */ jsx44("span", { className: "min-w-0 flex-1 truncate", children }),
|
|
2737
|
+
error && /* @__PURE__ */ jsx44("span", { className: "sr-only", children: ", has errors" })
|
|
2630
2738
|
]
|
|
2631
2739
|
}
|
|
2632
2740
|
);
|
|
@@ -2635,14 +2743,14 @@ var QuestionNavItem = React42.forwardRef(
|
|
|
2635
2743
|
QuestionNavItem.displayName = "QuestionNavItem";
|
|
2636
2744
|
|
|
2637
2745
|
// src/components/Question Types/QuestionOption.tsx
|
|
2638
|
-
import * as
|
|
2746
|
+
import * as React44 from "react";
|
|
2639
2747
|
import { Check as Check4, DotsSixVertical as DotsSixVertical3, Plus as Plus4, Trash as Trash4 } from "@phosphor-icons/react";
|
|
2640
|
-
import { jsx as
|
|
2748
|
+
import { jsx as jsx45, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
2641
2749
|
var optionClasses = "flex w-full max-w-150 cursor-pointer items-center gap-2 rounded-md border border-border bg-surface px-4 py-2 text-body-base text-surface-foreground transition-colors hover:border-input hover:bg-accent-soft hover:shadow-md has-[[data-state=checked]]:border-accent-foreground has-[[data-state=checked]]:hover:border-accent-foreground has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-50";
|
|
2642
2750
|
function QuestionOption(props) {
|
|
2643
|
-
const id =
|
|
2644
|
-
return /* @__PURE__ */
|
|
2645
|
-
props.kind === "checkbox" ? /* @__PURE__ */
|
|
2751
|
+
const id = React44.useId();
|
|
2752
|
+
return /* @__PURE__ */ jsxs31("label", { htmlFor: id, className: cn(optionClasses, props.className), children: [
|
|
2753
|
+
props.kind === "checkbox" ? /* @__PURE__ */ jsx45(
|
|
2646
2754
|
Checkbox,
|
|
2647
2755
|
{
|
|
2648
2756
|
id,
|
|
@@ -2651,16 +2759,16 @@ function QuestionOption(props) {
|
|
|
2651
2759
|
onCheckedChange: (next) => props.onCheckedChange?.(next === true),
|
|
2652
2760
|
disabled: props.disabled
|
|
2653
2761
|
}
|
|
2654
|
-
) : /* @__PURE__ */
|
|
2655
|
-
/* @__PURE__ */
|
|
2762
|
+
) : /* @__PURE__ */ jsx45(RadioGroupItem, { id, value: props.value, disabled: props.disabled }),
|
|
2763
|
+
/* @__PURE__ */ jsx45("span", { className: "min-w-0 flex-1", children: props.label })
|
|
2656
2764
|
] });
|
|
2657
2765
|
}
|
|
2658
|
-
var QuestionOtherOption =
|
|
2766
|
+
var QuestionOtherOption = React44.forwardRef(
|
|
2659
2767
|
({ className, onSubmit, confirmLabel = "Confirm answer", placeholder = "Type your answer", ...props }, ref) => {
|
|
2660
|
-
const inner =
|
|
2661
|
-
|
|
2768
|
+
const inner = React44.useRef(null);
|
|
2769
|
+
React44.useImperativeHandle(ref, () => inner.current);
|
|
2662
2770
|
const submit = () => onSubmit?.(inner.current?.value ?? "");
|
|
2663
|
-
return /* @__PURE__ */
|
|
2771
|
+
return /* @__PURE__ */ jsxs31(
|
|
2664
2772
|
"div",
|
|
2665
2773
|
{
|
|
2666
2774
|
className: cn(
|
|
@@ -2668,7 +2776,7 @@ var QuestionOtherOption = React43.forwardRef(
|
|
|
2668
2776
|
className
|
|
2669
2777
|
),
|
|
2670
2778
|
children: [
|
|
2671
|
-
/* @__PURE__ */
|
|
2779
|
+
/* @__PURE__ */ jsx45(
|
|
2672
2780
|
"input",
|
|
2673
2781
|
{
|
|
2674
2782
|
ref: inner,
|
|
@@ -2684,7 +2792,7 @@ var QuestionOtherOption = React43.forwardRef(
|
|
|
2684
2792
|
...props
|
|
2685
2793
|
}
|
|
2686
2794
|
),
|
|
2687
|
-
/* @__PURE__ */
|
|
2795
|
+
/* @__PURE__ */ jsx45(Button, { type: "button", variant: "subtle", size: "icon-sm", "aria-label": confirmLabel, onClick: submit, children: /* @__PURE__ */ jsx45(Check4, { size: 16, "aria-hidden": true }) })
|
|
2688
2796
|
]
|
|
2689
2797
|
}
|
|
2690
2798
|
);
|
|
@@ -2692,10 +2800,10 @@ var QuestionOtherOption = React43.forwardRef(
|
|
|
2692
2800
|
);
|
|
2693
2801
|
QuestionOtherOption.displayName = "QuestionOtherOption";
|
|
2694
2802
|
function QuestionOptionEditor({ label, onLabelChange, onRemove, onAdd, className }) {
|
|
2695
|
-
return /* @__PURE__ */
|
|
2696
|
-
/* @__PURE__ */
|
|
2697
|
-
/* @__PURE__ */
|
|
2698
|
-
/* @__PURE__ */
|
|
2803
|
+
return /* @__PURE__ */ jsxs31("div", { className: cn("flex w-full items-center gap-2", className), children: [
|
|
2804
|
+
/* @__PURE__ */ jsxs31("div", { className: "flex h-11.5 min-w-0 flex-1 items-center gap-2 rounded-md border border-border bg-surface px-4 py-2 focus-within:border-input-accent hover:border-input hover:shadow-md", children: [
|
|
2805
|
+
/* @__PURE__ */ jsx45(DotsSixVertical3, { size: 20, "aria-hidden": true, className: "shrink-0 text-surface-foreground" }),
|
|
2806
|
+
/* @__PURE__ */ jsx45(
|
|
2699
2807
|
"input",
|
|
2700
2808
|
{
|
|
2701
2809
|
"aria-label": "Option label",
|
|
@@ -2705,15 +2813,15 @@ function QuestionOptionEditor({ label, onLabelChange, onRemove, onAdd, className
|
|
|
2705
2813
|
}
|
|
2706
2814
|
)
|
|
2707
2815
|
] }),
|
|
2708
|
-
/* @__PURE__ */
|
|
2709
|
-
/* @__PURE__ */
|
|
2816
|
+
/* @__PURE__ */ jsx45(Button, { type: "button", variant: "destructive", size: "icon-sm", "aria-label": "Remove option", onClick: onRemove, children: /* @__PURE__ */ jsx45(Trash4, { size: 16, "aria-hidden": true }) }),
|
|
2817
|
+
/* @__PURE__ */ jsx45(Button, { type: "button", variant: "ghost", size: "icon-sm", "aria-label": "Add option", onClick: onAdd, children: /* @__PURE__ */ jsx45(Plus4, { size: 16, "aria-hidden": true }) })
|
|
2710
2818
|
] });
|
|
2711
2819
|
}
|
|
2712
2820
|
|
|
2713
2821
|
// src/components/Question Types/RankList.tsx
|
|
2714
|
-
import * as
|
|
2822
|
+
import * as React45 from "react";
|
|
2715
2823
|
import { DotsSixVertical as DotsSixVertical4 } from "@phosphor-icons/react";
|
|
2716
|
-
import { Fragment as Fragment8, jsx as
|
|
2824
|
+
import { Fragment as Fragment8, jsx as jsx46, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
2717
2825
|
function move(list, from, to) {
|
|
2718
2826
|
if (from === to || to < 0 || to >= list.length) return list;
|
|
2719
2827
|
const next = list.slice();
|
|
@@ -2721,13 +2829,13 @@ function move(list, from, to) {
|
|
|
2721
2829
|
next.splice(to, 0, item);
|
|
2722
2830
|
return next;
|
|
2723
2831
|
}
|
|
2724
|
-
var RankList =
|
|
2832
|
+
var RankList = React45.forwardRef(
|
|
2725
2833
|
({ className, items, onItemsChange, ...props }, ref) => {
|
|
2726
|
-
const [dragIndex, setDragIndex] =
|
|
2727
|
-
const [announcement, setAnnouncement] =
|
|
2728
|
-
const handles =
|
|
2729
|
-
const refocus =
|
|
2730
|
-
|
|
2834
|
+
const [dragIndex, setDragIndex] = React45.useState(null);
|
|
2835
|
+
const [announcement, setAnnouncement] = React45.useState("");
|
|
2836
|
+
const handles = React45.useRef(/* @__PURE__ */ new Map());
|
|
2837
|
+
const refocus = React45.useRef(null);
|
|
2838
|
+
React45.useEffect(() => {
|
|
2731
2839
|
if (refocus.current) {
|
|
2732
2840
|
handles.current.get(refocus.current)?.focus();
|
|
2733
2841
|
refocus.current = null;
|
|
@@ -2740,8 +2848,8 @@ var RankList = React44.forwardRef(
|
|
|
2740
2848
|
setAnnouncement(`Moved to position ${to + 1} of ${items.length}`);
|
|
2741
2849
|
onItemsChange(next);
|
|
2742
2850
|
};
|
|
2743
|
-
return /* @__PURE__ */
|
|
2744
|
-
/* @__PURE__ */
|
|
2851
|
+
return /* @__PURE__ */ jsxs32(Fragment8, { children: [
|
|
2852
|
+
/* @__PURE__ */ jsx46("ol", { ref, className: cn("flex w-full max-w-150 flex-col gap-4", className), ...props, children: items.map((item, index) => /* @__PURE__ */ jsxs32(
|
|
2745
2853
|
"li",
|
|
2746
2854
|
{
|
|
2747
2855
|
draggable: true,
|
|
@@ -2758,7 +2866,7 @@ var RankList = React44.forwardRef(
|
|
|
2758
2866
|
dragIndex === index && "opacity-50"
|
|
2759
2867
|
),
|
|
2760
2868
|
children: [
|
|
2761
|
-
/* @__PURE__ */
|
|
2869
|
+
/* @__PURE__ */ jsx46(
|
|
2762
2870
|
"button",
|
|
2763
2871
|
{
|
|
2764
2872
|
type: "button",
|
|
@@ -2777,10 +2885,10 @@ var RankList = React44.forwardRef(
|
|
|
2777
2885
|
}
|
|
2778
2886
|
},
|
|
2779
2887
|
className: "inline-flex shrink-0 cursor-grab rounded-xs text-surface-foreground",
|
|
2780
|
-
children: /* @__PURE__ */
|
|
2888
|
+
children: /* @__PURE__ */ jsx46(DotsSixVertical4, { size: 16, "aria-hidden": true })
|
|
2781
2889
|
}
|
|
2782
2890
|
),
|
|
2783
|
-
/* @__PURE__ */
|
|
2891
|
+
/* @__PURE__ */ jsx46(
|
|
2784
2892
|
"span",
|
|
2785
2893
|
{
|
|
2786
2894
|
"aria-hidden": "true",
|
|
@@ -2788,27 +2896,27 @@ var RankList = React44.forwardRef(
|
|
|
2788
2896
|
children: index + 1
|
|
2789
2897
|
}
|
|
2790
2898
|
),
|
|
2791
|
-
/* @__PURE__ */
|
|
2899
|
+
/* @__PURE__ */ jsx46("span", { className: "min-w-0 flex-1", children: item.label })
|
|
2792
2900
|
]
|
|
2793
2901
|
},
|
|
2794
2902
|
item.id
|
|
2795
2903
|
)) }),
|
|
2796
|
-
/* @__PURE__ */
|
|
2904
|
+
/* @__PURE__ */ jsx46("span", { role: "status", "aria-live": "polite", className: "sr-only", children: announcement })
|
|
2797
2905
|
] });
|
|
2798
2906
|
}
|
|
2799
2907
|
);
|
|
2800
2908
|
RankList.displayName = "RankList";
|
|
2801
2909
|
|
|
2802
2910
|
// src/components/Question Types/RatingScale.tsx
|
|
2803
|
-
import * as
|
|
2911
|
+
import * as React46 from "react";
|
|
2804
2912
|
import { ToggleGroup as ToggleGroupPrimitive3 } from "radix-ui";
|
|
2805
|
-
import { jsx as
|
|
2806
|
-
var RatingScale =
|
|
2913
|
+
import { jsx as jsx47, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
2914
|
+
var RatingScale = React46.forwardRef(
|
|
2807
2915
|
({ className, max = 5, value, defaultValue, onValueChange, lowLabel, highLabel, ...props }, ref) => {
|
|
2808
|
-
const [internal, setInternal] =
|
|
2916
|
+
const [internal, setInternal] = React46.useState(defaultValue);
|
|
2809
2917
|
const current = value !== void 0 ? value : internal;
|
|
2810
|
-
return /* @__PURE__ */
|
|
2811
|
-
/* @__PURE__ */
|
|
2918
|
+
return /* @__PURE__ */ jsxs33("div", { className: cn("flex w-full max-w-150 flex-col gap-2", className), children: [
|
|
2919
|
+
/* @__PURE__ */ jsx47(
|
|
2812
2920
|
ToggleGroupPrimitive3.Root,
|
|
2813
2921
|
{
|
|
2814
2922
|
ref,
|
|
@@ -2821,7 +2929,7 @@ var RatingScale = React45.forwardRef(
|
|
|
2821
2929
|
},
|
|
2822
2930
|
className: "flex gap-2",
|
|
2823
2931
|
...props,
|
|
2824
|
-
children: Array.from({ length: max }, (_, i) => i + 1).map((n) => /* @__PURE__ */
|
|
2932
|
+
children: Array.from({ length: max }, (_, i) => i + 1).map((n) => /* @__PURE__ */ jsx47(
|
|
2825
2933
|
ToggleGroupPrimitive3.Item,
|
|
2826
2934
|
{
|
|
2827
2935
|
value: String(n),
|
|
@@ -2837,9 +2945,9 @@ var RatingScale = React45.forwardRef(
|
|
|
2837
2945
|
))
|
|
2838
2946
|
}
|
|
2839
2947
|
),
|
|
2840
|
-
(lowLabel != null || highLabel != null) && /* @__PURE__ */
|
|
2841
|
-
/* @__PURE__ */
|
|
2842
|
-
/* @__PURE__ */
|
|
2948
|
+
(lowLabel != null || highLabel != null) && /* @__PURE__ */ jsxs33("div", { className: "flex justify-between text-ui-caption text-secondary-muted-foreground", "aria-hidden": "true", children: [
|
|
2949
|
+
/* @__PURE__ */ jsx47("span", { children: lowLabel }),
|
|
2950
|
+
/* @__PURE__ */ jsx47("span", { children: highLabel })
|
|
2843
2951
|
] })
|
|
2844
2952
|
] });
|
|
2845
2953
|
}
|
|
@@ -2847,27 +2955,27 @@ var RatingScale = React45.forwardRef(
|
|
|
2847
2955
|
RatingScale.displayName = "RatingScale";
|
|
2848
2956
|
|
|
2849
2957
|
// src/components/Data Display/Progress.tsx
|
|
2850
|
-
import * as
|
|
2958
|
+
import * as React47 from "react";
|
|
2851
2959
|
import { Progress as ProgressPrimitive2 } from "radix-ui";
|
|
2852
|
-
import { jsx as
|
|
2853
|
-
var Progress =
|
|
2960
|
+
import { jsx as jsx48, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
2961
|
+
var Progress = React47.forwardRef(
|
|
2854
2962
|
({ className, value = 0, label, valueLabel, detailsStart, detailsEnd, ...props }, ref) => {
|
|
2855
2963
|
const hasHeader = label != null || valueLabel != null;
|
|
2856
2964
|
const hasDetails = detailsStart != null || detailsEnd != null;
|
|
2857
2965
|
const clamped = Math.min(100, Math.max(0, value ?? 0));
|
|
2858
|
-
return /* @__PURE__ */
|
|
2859
|
-
hasHeader && /* @__PURE__ */
|
|
2860
|
-
/* @__PURE__ */
|
|
2861
|
-
/* @__PURE__ */
|
|
2966
|
+
return /* @__PURE__ */ jsxs34("div", { className: cn("flex w-full flex-col gap-2", className), children: [
|
|
2967
|
+
hasHeader && /* @__PURE__ */ jsxs34("div", { className: "flex items-center justify-between text-ui-label text-surface-foreground", children: [
|
|
2968
|
+
/* @__PURE__ */ jsx48("span", { children: label }),
|
|
2969
|
+
/* @__PURE__ */ jsx48("span", { children: valueLabel === true ? `${Math.round(clamped)}%` : valueLabel })
|
|
2862
2970
|
] }),
|
|
2863
|
-
/* @__PURE__ */
|
|
2971
|
+
/* @__PURE__ */ jsx48(
|
|
2864
2972
|
ProgressPrimitive2.Root,
|
|
2865
2973
|
{
|
|
2866
2974
|
ref,
|
|
2867
2975
|
value: clamped,
|
|
2868
2976
|
className: "relative h-2 w-full overflow-hidden rounded-full bg-secondary",
|
|
2869
2977
|
...props,
|
|
2870
|
-
children: /* @__PURE__ */
|
|
2978
|
+
children: /* @__PURE__ */ jsx48(
|
|
2871
2979
|
ProgressPrimitive2.Indicator,
|
|
2872
2980
|
{
|
|
2873
2981
|
className: "h-full rounded-full bg-accent transition-[width]",
|
|
@@ -2876,9 +2984,9 @@ var Progress = React46.forwardRef(
|
|
|
2876
2984
|
)
|
|
2877
2985
|
}
|
|
2878
2986
|
),
|
|
2879
|
-
hasDetails && /* @__PURE__ */
|
|
2880
|
-
/* @__PURE__ */
|
|
2881
|
-
/* @__PURE__ */
|
|
2987
|
+
hasDetails && /* @__PURE__ */ jsxs34("div", { className: "flex items-start justify-between text-ui-label leading-5 text-secondary-muted-foreground", children: [
|
|
2988
|
+
/* @__PURE__ */ jsx48("span", { children: detailsStart }),
|
|
2989
|
+
/* @__PURE__ */ jsx48("span", { children: detailsEnd })
|
|
2882
2990
|
] })
|
|
2883
2991
|
] });
|
|
2884
2992
|
}
|
|
@@ -2886,11 +2994,11 @@ var Progress = React46.forwardRef(
|
|
|
2886
2994
|
Progress.displayName = "Progress";
|
|
2887
2995
|
|
|
2888
2996
|
// src/components/Data Display/Table.tsx
|
|
2889
|
-
import * as
|
|
2997
|
+
import * as React48 from "react";
|
|
2890
2998
|
import { CaretDown as CaretDown4, CaretUp } from "@phosphor-icons/react";
|
|
2891
|
-
import { jsx as
|
|
2892
|
-
var Table =
|
|
2893
|
-
({ className, containerClassName, striped, ...props }, ref) => /* @__PURE__ */
|
|
2999
|
+
import { jsx as jsx49, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
3000
|
+
var Table = React48.forwardRef(
|
|
3001
|
+
({ className, containerClassName, striped, ...props }, ref) => /* @__PURE__ */ jsx49("div", { className: cn("relative w-full overflow-auto rounded-lg border border-border bg-surface", containerClassName), children: /* @__PURE__ */ jsx49(
|
|
2894
3002
|
"table",
|
|
2895
3003
|
{
|
|
2896
3004
|
ref,
|
|
@@ -2901,16 +3009,16 @@ var Table = React47.forwardRef(
|
|
|
2901
3009
|
) })
|
|
2902
3010
|
);
|
|
2903
3011
|
Table.displayName = "Table";
|
|
2904
|
-
var TableHeader =
|
|
2905
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
3012
|
+
var TableHeader = React48.forwardRef(
|
|
3013
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx49("thead", { ref, className, ...props })
|
|
2906
3014
|
);
|
|
2907
3015
|
TableHeader.displayName = "TableHeader";
|
|
2908
|
-
var TableBody =
|
|
2909
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
3016
|
+
var TableBody = React48.forwardRef(
|
|
3017
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx49("tbody", { ref, className, ...props })
|
|
2910
3018
|
);
|
|
2911
3019
|
TableBody.displayName = "TableBody";
|
|
2912
|
-
var TableRow =
|
|
2913
|
-
({ className, selected, ...props }, ref) => /* @__PURE__ */
|
|
3020
|
+
var TableRow = React48.forwardRef(
|
|
3021
|
+
({ className, selected, ...props }, ref) => /* @__PURE__ */ jsx49(
|
|
2914
3022
|
"tr",
|
|
2915
3023
|
{
|
|
2916
3024
|
ref,
|
|
@@ -2927,10 +3035,10 @@ var TableRow = React47.forwardRef(
|
|
|
2927
3035
|
);
|
|
2928
3036
|
TableRow.displayName = "TableRow";
|
|
2929
3037
|
var ariaSort = { none: "none", asc: "ascending", desc: "descending" };
|
|
2930
|
-
var TableHead =
|
|
3038
|
+
var TableHead = React48.forwardRef(
|
|
2931
3039
|
({ className, align = "left", sortable, sort = "none", onSort, checkbox, children, ...props }, ref) => {
|
|
2932
|
-
const caret = sort === "asc" ? /* @__PURE__ */
|
|
2933
|
-
return /* @__PURE__ */
|
|
3040
|
+
const caret = sort === "asc" ? /* @__PURE__ */ jsx49(CaretUp, { size: 16, "aria-hidden": true, className: "shrink-0" }) : /* @__PURE__ */ jsx49(CaretDown4, { size: 16, "aria-hidden": true, className: "shrink-0" });
|
|
3041
|
+
return /* @__PURE__ */ jsx49(
|
|
2934
3042
|
"th",
|
|
2935
3043
|
{
|
|
2936
3044
|
ref,
|
|
@@ -2943,7 +3051,7 @@ var TableHead = React47.forwardRef(
|
|
|
2943
3051
|
className
|
|
2944
3052
|
),
|
|
2945
3053
|
...props,
|
|
2946
|
-
children: sortable ? /* @__PURE__ */
|
|
3054
|
+
children: sortable ? /* @__PURE__ */ jsxs35(
|
|
2947
3055
|
"button",
|
|
2948
3056
|
{
|
|
2949
3057
|
type: "button",
|
|
@@ -2954,14 +3062,14 @@ var TableHead = React47.forwardRef(
|
|
|
2954
3062
|
caret
|
|
2955
3063
|
]
|
|
2956
3064
|
}
|
|
2957
|
-
) : checkbox ? /* @__PURE__ */
|
|
3065
|
+
) : checkbox ? /* @__PURE__ */ jsx49("div", { className: "flex items-center justify-center", children }) : children
|
|
2958
3066
|
}
|
|
2959
3067
|
);
|
|
2960
3068
|
}
|
|
2961
3069
|
);
|
|
2962
3070
|
TableHead.displayName = "TableHead";
|
|
2963
|
-
var TableCell =
|
|
2964
|
-
({ className, align = "left", muted, checkbox, actions, children, ...props }, ref) => /* @__PURE__ */
|
|
3071
|
+
var TableCell = React48.forwardRef(
|
|
3072
|
+
({ className, align = "left", muted, checkbox, actions, children, ...props }, ref) => /* @__PURE__ */ jsx49(
|
|
2965
3073
|
"td",
|
|
2966
3074
|
{
|
|
2967
3075
|
ref,
|
|
@@ -2974,25 +3082,25 @@ var TableCell = React47.forwardRef(
|
|
|
2974
3082
|
className
|
|
2975
3083
|
),
|
|
2976
3084
|
...props,
|
|
2977
|
-
children: checkbox ? /* @__PURE__ */
|
|
3085
|
+
children: checkbox ? /* @__PURE__ */ jsx49("div", { className: "flex items-center justify-center", children }) : actions ? /* @__PURE__ */ jsx49("div", { className: "flex items-start justify-end gap-1", children }) : children
|
|
2978
3086
|
}
|
|
2979
3087
|
)
|
|
2980
3088
|
);
|
|
2981
3089
|
TableCell.displayName = "TableCell";
|
|
2982
3090
|
function TableCellTwoLines({ primary, secondary, avatar, className, ...props }) {
|
|
2983
|
-
return /* @__PURE__ */
|
|
3091
|
+
return /* @__PURE__ */ jsxs35("div", { className: cn("flex items-center gap-2", className), ...props, children: [
|
|
2984
3092
|
avatar,
|
|
2985
|
-
/* @__PURE__ */
|
|
2986
|
-
/* @__PURE__ */
|
|
2987
|
-
secondary && /* @__PURE__ */
|
|
3093
|
+
/* @__PURE__ */ jsxs35("div", { className: "flex flex-col gap-0.5 whitespace-nowrap", children: [
|
|
3094
|
+
/* @__PURE__ */ jsx49("span", { className: "text-ui-label text-surface-foreground", children: primary }),
|
|
3095
|
+
secondary && /* @__PURE__ */ jsx49("span", { className: "text-ui-caption text-secondary-muted-foreground", children: secondary })
|
|
2988
3096
|
] })
|
|
2989
3097
|
] });
|
|
2990
3098
|
}
|
|
2991
3099
|
|
|
2992
3100
|
// src/components/Data Display/StatCard.tsx
|
|
2993
|
-
import * as
|
|
3101
|
+
import * as React49 from "react";
|
|
2994
3102
|
import { cva as cva6 } from "class-variance-authority";
|
|
2995
|
-
import { jsx as
|
|
3103
|
+
import { jsx as jsx50, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
2996
3104
|
var statCardVariants = cva6("flex min-w-0 flex-col gap-2 rounded-md border p-3", {
|
|
2997
3105
|
variants: {
|
|
2998
3106
|
variant: {
|
|
@@ -3002,11 +3110,11 @@ var statCardVariants = cva6("flex min-w-0 flex-col gap-2 rounded-md border p-3",
|
|
|
3002
3110
|
},
|
|
3003
3111
|
defaultVariants: { variant: "default" }
|
|
3004
3112
|
});
|
|
3005
|
-
var StatCard =
|
|
3006
|
-
({ className, variant, label, value, icon, ...props }, ref) => /* @__PURE__ */
|
|
3007
|
-
/* @__PURE__ */
|
|
3008
|
-
/* @__PURE__ */
|
|
3009
|
-
icon && /* @__PURE__ */
|
|
3113
|
+
var StatCard = React49.forwardRef(
|
|
3114
|
+
({ className, variant, label, value, icon, ...props }, ref) => /* @__PURE__ */ jsxs36("div", { ref, className: cn(statCardVariants({ variant }), className), ...props, children: [
|
|
3115
|
+
/* @__PURE__ */ jsx50("p", { className: "truncate text-ui-caption text-secondary-muted-foreground", children: label }),
|
|
3116
|
+
/* @__PURE__ */ jsxs36("p", { className: "flex items-center gap-2 text-body-base text-surface-foreground", children: [
|
|
3117
|
+
icon && /* @__PURE__ */ jsx50("span", { "aria-hidden": "true", className: "inline-flex size-6 shrink-0 items-center justify-center", children: icon }),
|
|
3010
3118
|
value
|
|
3011
3119
|
] })
|
|
3012
3120
|
] })
|
|
@@ -3014,13 +3122,13 @@ var StatCard = React48.forwardRef(
|
|
|
3014
3122
|
StatCard.displayName = "StatCard";
|
|
3015
3123
|
|
|
3016
3124
|
// src/components/Research-Specific/ActivityStructure.tsx
|
|
3017
|
-
import * as
|
|
3125
|
+
import * as React51 from "react";
|
|
3018
3126
|
|
|
3019
3127
|
// src/components/Tags & Badges/EditableTag.tsx
|
|
3020
|
-
import * as
|
|
3128
|
+
import * as React50 from "react";
|
|
3021
3129
|
import { Crown, Plus as Plus5, X as X6 } from "@phosphor-icons/react";
|
|
3022
3130
|
import { cva as cva7 } from "class-variance-authority";
|
|
3023
|
-
import { jsx as
|
|
3131
|
+
import { jsx as jsx51, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
3024
3132
|
var editableTagVariants = cva7(
|
|
3025
3133
|
"inline-flex h-6.5 items-center whitespace-nowrap rounded-sm py-1 text-ui-caption transition-colors",
|
|
3026
3134
|
{
|
|
@@ -3035,27 +3143,27 @@ var editableTagVariants = cva7(
|
|
|
3035
3143
|
defaultVariants: { type: "default" }
|
|
3036
3144
|
}
|
|
3037
3145
|
);
|
|
3038
|
-
var EditableTag =
|
|
3146
|
+
var EditableTag = React50.forwardRef(
|
|
3039
3147
|
({ className, type = "default", icon, onRemove, onClick, children, ...props }, ref) => {
|
|
3040
3148
|
const classes = cn(editableTagVariants({ type }), className);
|
|
3041
|
-
const leading = type === "add" ? /* @__PURE__ */
|
|
3149
|
+
const leading = type === "add" ? /* @__PURE__ */ jsx51(Plus5, { size: 12, "aria-hidden": true }) : icon !== void 0 ? icon : type === "default" ? /* @__PURE__ */ jsx51(Crown, { size: 12, weight: "fill", "aria-hidden": true }) : null;
|
|
3042
3150
|
if (type === "add" || type === "multiple" && onClick) {
|
|
3043
|
-
return /* @__PURE__ */
|
|
3151
|
+
return /* @__PURE__ */ jsxs37("button", { ref, type: "button", className: classes, onClick, ...props, children: [
|
|
3044
3152
|
leading,
|
|
3045
3153
|
children
|
|
3046
3154
|
] });
|
|
3047
3155
|
}
|
|
3048
|
-
return /* @__PURE__ */
|
|
3156
|
+
return /* @__PURE__ */ jsxs37("span", { ref, className: classes, ...props, children: [
|
|
3049
3157
|
leading,
|
|
3050
3158
|
children,
|
|
3051
|
-
onRemove && /* @__PURE__ */
|
|
3159
|
+
onRemove && /* @__PURE__ */ jsx51(
|
|
3052
3160
|
"button",
|
|
3053
3161
|
{
|
|
3054
3162
|
type: "button",
|
|
3055
3163
|
"aria-label": typeof children === "string" ? `Remove ${children}` : "Remove",
|
|
3056
3164
|
onClick: onRemove,
|
|
3057
3165
|
className: "inline-flex size-3 items-center justify-center rounded-xs",
|
|
3058
|
-
children: /* @__PURE__ */
|
|
3166
|
+
children: /* @__PURE__ */ jsx51(X6, { size: 12, "aria-hidden": true })
|
|
3059
3167
|
}
|
|
3060
3168
|
)
|
|
3061
3169
|
] });
|
|
@@ -3064,23 +3172,23 @@ var EditableTag = React49.forwardRef(
|
|
|
3064
3172
|
EditableTag.displayName = "EditableTag";
|
|
3065
3173
|
|
|
3066
3174
|
// src/components/Research-Specific/ActivityStructure.tsx
|
|
3067
|
-
import { jsx as
|
|
3068
|
-
var ActivityStructure =
|
|
3069
|
-
({ className, title = "Activity Structure", stats, sections, onRemoveTag, onAddTag, addTagLabel = "Add tag", ...props }, ref) => /* @__PURE__ */
|
|
3175
|
+
import { jsx as jsx52, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
3176
|
+
var ActivityStructure = React51.forwardRef(
|
|
3177
|
+
({ className, title = "Activity Structure", stats, sections, onRemoveTag, onAddTag, addTagLabel = "Add tag", ...props }, ref) => /* @__PURE__ */ jsxs38(
|
|
3070
3178
|
"section",
|
|
3071
3179
|
{
|
|
3072
3180
|
ref,
|
|
3073
3181
|
className: cn("flex w-full max-w-96.5 flex-col gap-4 rounded-2xl border border-border bg-surface p-4", className),
|
|
3074
3182
|
...props,
|
|
3075
3183
|
children: [
|
|
3076
|
-
/* @__PURE__ */
|
|
3077
|
-
/* @__PURE__ */
|
|
3078
|
-
sections?.map(({ id, heading, body, tags }) => /* @__PURE__ */
|
|
3079
|
-
/* @__PURE__ */
|
|
3080
|
-
/* @__PURE__ */
|
|
3081
|
-
(tags?.length || onAddTag) && /* @__PURE__ */
|
|
3082
|
-
tags?.map((tag) => /* @__PURE__ */
|
|
3083
|
-
onAddTag && /* @__PURE__ */
|
|
3184
|
+
/* @__PURE__ */ jsx52("h3", { className: "text-heading-h3 text-surface-foreground", children: title }),
|
|
3185
|
+
/* @__PURE__ */ jsx52("div", { className: "grid grid-cols-2 gap-3", children: stats.map(({ id, ...stat }) => /* @__PURE__ */ jsx52(StatCard, { ...stat }, id)) }),
|
|
3186
|
+
sections?.map(({ id, heading, body, tags }) => /* @__PURE__ */ jsxs38("div", { className: "flex flex-col gap-2", children: [
|
|
3187
|
+
/* @__PURE__ */ jsx52("h4", { className: "text-heading-h4 text-surface-foreground", children: heading }),
|
|
3188
|
+
/* @__PURE__ */ jsx52("p", { className: "text-body-base text-surface-foreground", children: body }),
|
|
3189
|
+
(tags?.length || onAddTag) && /* @__PURE__ */ jsxs38("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
3190
|
+
tags?.map((tag) => /* @__PURE__ */ jsx52(EditableTag, { type: "editable", onRemove: onRemoveTag && (() => onRemoveTag(id, tag)), children: tag }, tag)),
|
|
3191
|
+
onAddTag && /* @__PURE__ */ jsx52(EditableTag, { type: "add", onClick: () => onAddTag(id), children: addTagLabel })
|
|
3084
3192
|
] })
|
|
3085
3193
|
] }, id))
|
|
3086
3194
|
]
|
|
@@ -3089,11 +3197,11 @@ var ActivityStructure = React50.forwardRef(
|
|
|
3089
3197
|
);
|
|
3090
3198
|
ActivityStructure.displayName = "ActivityStructure";
|
|
3091
3199
|
|
|
3092
|
-
// src/components/Tags & Badges/
|
|
3093
|
-
import * as
|
|
3200
|
+
// src/components/Tags & Badges/Badge.tsx
|
|
3201
|
+
import * as React52 from "react";
|
|
3094
3202
|
import { DotsSixVertical as DotsSixVertical5, RadioButton as RadioButton2 } from "@phosphor-icons/react";
|
|
3095
3203
|
import { cva as cva8 } from "class-variance-authority";
|
|
3096
|
-
import { jsx as
|
|
3204
|
+
import { jsx as jsx53, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
3097
3205
|
var roleTagVariants = cva8(
|
|
3098
3206
|
"group inline-flex h-6 items-center whitespace-nowrap rounded-sm py-1 text-ui-caption transition-colors",
|
|
3099
3207
|
{
|
|
@@ -3102,7 +3210,9 @@ var roleTagVariants = cva8(
|
|
|
3102
3210
|
primary: "bg-primary-soft px-2.5 text-primary-soft-foreground",
|
|
3103
3211
|
secondary: "bg-secondary bg-linear-to-r from-overlay-dark-5 to-overlay-dark-5 px-2.5 text-secondary-muted-foreground",
|
|
3104
3212
|
question: "gap-1 bg-primary-soft pl-1 pr-2.5 text-plum-500",
|
|
3105
|
-
interactable: "gap-1 pl-2.5 pr-2.5 hover:pl-1"
|
|
3213
|
+
interactable: "gap-1 pl-2.5 pr-2.5 hover:pl-1",
|
|
3214
|
+
id: "gap-1 bg-secondary bg-linear-to-r from-overlay-dark-5 to-overlay-dark-5 px-2.5 tabular-nums text-surface-foreground",
|
|
3215
|
+
count: "min-w-6 justify-center rounded-full bg-secondary bg-linear-to-r from-overlay-dark-5 to-overlay-dark-5 px-2 tabular-nums text-surface-foreground"
|
|
3106
3216
|
},
|
|
3107
3217
|
selected: { true: "", false: "" }
|
|
3108
3218
|
},
|
|
@@ -3117,11 +3227,11 @@ var roleTagVariants = cva8(
|
|
|
3117
3227
|
defaultVariants: { type: "primary", selected: false }
|
|
3118
3228
|
}
|
|
3119
3229
|
);
|
|
3120
|
-
var
|
|
3230
|
+
var Badge = React52.forwardRef(
|
|
3121
3231
|
({ className, type = "primary", selected = false, onClick, children, ...props }, ref) => {
|
|
3122
3232
|
const classes = cn(roleTagVariants({ type, selected: type === "interactable" ? selected : false }), className);
|
|
3123
3233
|
if (type === "interactable") {
|
|
3124
|
-
return /* @__PURE__ */
|
|
3234
|
+
return /* @__PURE__ */ jsxs39(
|
|
3125
3235
|
"button",
|
|
3126
3236
|
{
|
|
3127
3237
|
ref,
|
|
@@ -3131,24 +3241,25 @@ var RoleTag = React51.forwardRef(
|
|
|
3131
3241
|
onClick,
|
|
3132
3242
|
...props,
|
|
3133
3243
|
children: [
|
|
3134
|
-
/* @__PURE__ */
|
|
3244
|
+
/* @__PURE__ */ jsx53(DotsSixVertical5, { size: 16, "aria-hidden": true, className: "hidden shrink-0 group-hover:block" }),
|
|
3135
3245
|
children
|
|
3136
3246
|
]
|
|
3137
3247
|
}
|
|
3138
3248
|
);
|
|
3139
3249
|
}
|
|
3140
|
-
return /* @__PURE__ */
|
|
3141
|
-
type === "question" && /* @__PURE__ */
|
|
3250
|
+
return /* @__PURE__ */ jsxs39("span", { ref, className: classes, ...props, children: [
|
|
3251
|
+
type === "question" && /* @__PURE__ */ jsx53(RadioButton2, { size: 16, weight: "fill", "aria-hidden": true }),
|
|
3252
|
+
type === "id" && /* @__PURE__ */ jsx53("span", { className: "text-secondary-muted-foreground", children: "ID" }),
|
|
3142
3253
|
children
|
|
3143
3254
|
] });
|
|
3144
3255
|
}
|
|
3145
3256
|
);
|
|
3146
|
-
|
|
3257
|
+
Badge.displayName = "Badge";
|
|
3147
3258
|
|
|
3148
3259
|
// src/components/Utility/Pagination.tsx
|
|
3149
|
-
import * as
|
|
3260
|
+
import * as React53 from "react";
|
|
3150
3261
|
import { ArrowLeft, ArrowRight, DotsThree as DotsThree2 } from "@phosphor-icons/react";
|
|
3151
|
-
import { jsx as
|
|
3262
|
+
import { jsx as jsx54, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
3152
3263
|
function getPaginationItems(page, pageCount, siblings = 1) {
|
|
3153
3264
|
const keep = /* @__PURE__ */ new Set([1, pageCount]);
|
|
3154
3265
|
for (let p = page - siblings; p <= page + siblings; p++) if (p >= 1 && p <= pageCount) keep.add(p);
|
|
@@ -3162,10 +3273,10 @@ function getPaginationItems(page, pageCount, siblings = 1) {
|
|
|
3162
3273
|
});
|
|
3163
3274
|
return items;
|
|
3164
3275
|
}
|
|
3165
|
-
var Pagination =
|
|
3276
|
+
var Pagination = React53.forwardRef(
|
|
3166
3277
|
({ className, page, pageCount, onPageChange, variant = "full", siblings = 1, ...props }, ref) => {
|
|
3167
3278
|
const go = (next2) => onPageChange(Math.min(pageCount, Math.max(1, next2)));
|
|
3168
|
-
const previous = /* @__PURE__ */
|
|
3279
|
+
const previous = /* @__PURE__ */ jsx54(
|
|
3169
3280
|
Button,
|
|
3170
3281
|
{
|
|
3171
3282
|
type: "button",
|
|
@@ -3174,10 +3285,10 @@ var Pagination = React52.forwardRef(
|
|
|
3174
3285
|
"aria-label": "Previous page",
|
|
3175
3286
|
disabled: page <= 1,
|
|
3176
3287
|
onClick: () => go(page - 1),
|
|
3177
|
-
children: /* @__PURE__ */
|
|
3288
|
+
children: /* @__PURE__ */ jsx54(ArrowLeft, { size: 16, "aria-hidden": true })
|
|
3178
3289
|
}
|
|
3179
3290
|
);
|
|
3180
|
-
const next = /* @__PURE__ */
|
|
3291
|
+
const next = /* @__PURE__ */ jsx54(
|
|
3181
3292
|
Button,
|
|
3182
3293
|
{
|
|
3183
3294
|
type: "button",
|
|
@@ -3186,10 +3297,10 @@ var Pagination = React52.forwardRef(
|
|
|
3186
3297
|
"aria-label": "Next page",
|
|
3187
3298
|
disabled: page >= pageCount,
|
|
3188
3299
|
onClick: () => go(page + 1),
|
|
3189
|
-
children: /* @__PURE__ */
|
|
3300
|
+
children: /* @__PURE__ */ jsx54(ArrowRight, { size: 16, "aria-hidden": true })
|
|
3190
3301
|
}
|
|
3191
3302
|
);
|
|
3192
|
-
return /* @__PURE__ */
|
|
3303
|
+
return /* @__PURE__ */ jsxs40(
|
|
3193
3304
|
"nav",
|
|
3194
3305
|
{
|
|
3195
3306
|
ref,
|
|
@@ -3198,14 +3309,14 @@ var Pagination = React52.forwardRef(
|
|
|
3198
3309
|
...props,
|
|
3199
3310
|
children: [
|
|
3200
3311
|
previous,
|
|
3201
|
-
variant === "compact" ? /* @__PURE__ */
|
|
3312
|
+
variant === "compact" ? /* @__PURE__ */ jsxs40("span", { className: "text-body-small text-surface-foreground", "aria-live": "polite", children: [
|
|
3202
3313
|
page,
|
|
3203
3314
|
"/",
|
|
3204
3315
|
pageCount
|
|
3205
|
-
] }) : /* @__PURE__ */
|
|
3206
|
-
/* @__PURE__ */
|
|
3207
|
-
/* @__PURE__ */
|
|
3208
|
-
] }) : /* @__PURE__ */
|
|
3316
|
+
] }) : /* @__PURE__ */ jsx54("ul", { className: "flex items-center gap-2", children: getPaginationItems(page, pageCount, siblings).map((item, index) => /* @__PURE__ */ jsx54("li", { children: item === "ellipsis" ? /* @__PURE__ */ jsxs40("span", { className: "inline-flex size-8 items-center justify-center rounded-sm border border-border bg-surface text-surface-foreground", children: [
|
|
3317
|
+
/* @__PURE__ */ jsx54(DotsThree2, { size: 16, "aria-hidden": true }),
|
|
3318
|
+
/* @__PURE__ */ jsx54("span", { className: "sr-only", children: "More pages" })
|
|
3319
|
+
] }) : /* @__PURE__ */ jsx54(
|
|
3209
3320
|
Button,
|
|
3210
3321
|
{
|
|
3211
3322
|
type: "button",
|
|
@@ -3230,6 +3341,7 @@ export {
|
|
|
3230
3341
|
ActivityStructure,
|
|
3231
3342
|
AskAiInput,
|
|
3232
3343
|
AskAiToggle,
|
|
3344
|
+
Badge,
|
|
3233
3345
|
Button,
|
|
3234
3346
|
Calendar,
|
|
3235
3347
|
ChatChoices,
|
|
@@ -3275,6 +3387,7 @@ export {
|
|
|
3275
3387
|
FormMessage,
|
|
3276
3388
|
ImagePreview,
|
|
3277
3389
|
ImageThumbnails,
|
|
3390
|
+
InlineEdit,
|
|
3278
3391
|
Input,
|
|
3279
3392
|
InputWithAction,
|
|
3280
3393
|
Label,
|
|
@@ -3297,7 +3410,6 @@ export {
|
|
|
3297
3410
|
RadioGroupItem,
|
|
3298
3411
|
RankList,
|
|
3299
3412
|
RatingScale,
|
|
3300
|
-
RoleTag,
|
|
3301
3413
|
SearchBar,
|
|
3302
3414
|
Select,
|
|
3303
3415
|
SelectContent,
|