@orianatech/pire 0.8.0 → 0.10.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/dist/index.cjs CHANGED
@@ -40,15 +40,18 @@ __export(src_exports, {
40
40
  ConfirmDialog: () => ConfirmDialog,
41
41
  DataTable: () => DataTable,
42
42
  DatePicker: () => DatePicker,
43
+ DateRangePicker: () => DateRangePicker,
43
44
  DescriptionList: () => DescriptionList,
44
45
  Dialog: () => Dialog,
45
- DialogTrigger: () => import_react_aria_components29.DialogTrigger,
46
+ DialogTrigger: () => import_react_aria_components32.DialogTrigger,
46
47
  EmptyState: () => EmptyState,
48
+ FileDropZone: () => FileDropZone,
49
+ FileUpload: () => FileUpload,
47
50
  FilterBar: () => FilterBar,
48
51
  FooterBar: () => FooterBar,
49
52
  FormField: () => FormField,
50
53
  Heading: () => Heading,
51
- I18nProvider: () => import_react_aria_components29.I18nProvider,
54
+ I18nProvider: () => import_react_aria_components32.I18nProvider,
52
55
  Icon: () => Icon,
53
56
  IconButton: () => IconButton,
54
57
  InlineMessage: () => InlineMessage,
@@ -60,7 +63,7 @@ __export(src_exports, {
60
63
  MenuItem: () => MenuItem,
61
64
  MenuSection: () => MenuSection,
62
65
  MenuSeparator: () => MenuSeparator,
63
- MenuTrigger: () => import_react_aria_components29.MenuTrigger,
66
+ MenuTrigger: () => import_react_aria_components32.MenuTrigger,
64
67
  MultiComboBox: () => MultiComboBox,
65
68
  NumberField: () => NumberField,
66
69
  ObjectHeader: () => ObjectHeader,
@@ -68,11 +71,11 @@ __export(src_exports, {
68
71
  PageHeader: () => PageHeader,
69
72
  Pagination: () => Pagination,
70
73
  PireIntlProvider: () => PireIntlProvider,
71
- Popover: () => import_react_aria_components29.Popover,
74
+ Popover: () => import_react_aria_components32.Popover,
72
75
  ProgressBar: () => ProgressBar,
73
76
  Radio: () => Radio,
74
77
  RadioGroup: () => RadioGroup,
75
- RouterProvider: () => import_react_aria_components29.RouterProvider,
78
+ RouterProvider: () => import_react_aria_components32.RouterProvider,
76
79
  SectionHeader: () => SectionHeader,
77
80
  SegmentedControl: () => SegmentedControl,
78
81
  Select: () => Select,
@@ -84,7 +87,7 @@ __export(src_exports, {
84
87
  Skeleton: () => Skeleton,
85
88
  SkeletonTableRow: () => SkeletonTableRow,
86
89
  Strong: () => Strong,
87
- SubmenuTrigger: () => import_react_aria_components29.SubmenuTrigger,
90
+ SubmenuTrigger: () => import_react_aria_components32.SubmenuTrigger,
88
91
  Switch: () => Switch,
89
92
  Tabs: () => Tabs,
90
93
  Tag: () => Tag,
@@ -99,6 +102,8 @@ __export(src_exports, {
99
102
  configureIcons: () => configureIcons,
100
103
  enMessages: () => enMessages,
101
104
  esMessages: () => esMessages,
105
+ formatFileSize: () => formatFileSize,
106
+ rangeLengthInDays: () => rangeLengthInDays,
102
107
  usePireMessages: () => usePireMessages,
103
108
  useToast: () => useToast
104
109
  });
@@ -896,6 +901,7 @@ var enMessages = {
896
901
  datePickerOpenCalendar: "Open calendar",
897
902
  datePickerPreviousMonth: "Previous month",
898
903
  datePickerNextMonth: "Next month",
904
+ dateRangePresetsLabel: "Date range shortcuts",
899
905
  numberFieldIncrease: "Increase",
900
906
  numberFieldDecrease: "Decrease",
901
907
  valueHelpFieldClear: "Clear selection",
@@ -909,7 +915,11 @@ var enMessages = {
909
915
  paginationPrevious: "Previous page",
910
916
  paginationNext: "Next page",
911
917
  paginationRowsPerPage: "Rows per page",
912
- sideNavLabel: "Main navigation"
918
+ sideNavLabel: "Main navigation",
919
+ fileUploadChoose: "Choose files",
920
+ fileUploadRemoveNamed: "Remove {name}",
921
+ fileUploadUploading: "Uploading",
922
+ fileDropZonePrompt: "Drag files here, or choose them"
913
923
  };
914
924
  var esMessages = {
915
925
  filterBarLabel: "Filtros",
@@ -928,6 +938,7 @@ var esMessages = {
928
938
  datePickerOpenCalendar: "Abrir calendario",
929
939
  datePickerPreviousMonth: "Mes anterior",
930
940
  datePickerNextMonth: "Mes siguiente",
941
+ dateRangePresetsLabel: "Atajos de rango de fechas",
931
942
  numberFieldIncrease: "Aumentar",
932
943
  numberFieldDecrease: "Disminuir",
933
944
  valueHelpFieldClear: "Limpiar selecci\xF3n",
@@ -941,7 +952,11 @@ var esMessages = {
941
952
  paginationPrevious: "P\xE1gina anterior",
942
953
  paginationNext: "P\xE1gina siguiente",
943
954
  paginationRowsPerPage: "Filas por p\xE1gina",
944
- sideNavLabel: "Navegaci\xF3n principal"
955
+ sideNavLabel: "Navegaci\xF3n principal",
956
+ fileUploadChoose: "Elegir archivos",
957
+ fileUploadRemoveNamed: "Quitar {name}",
958
+ fileUploadUploading: "Subiendo",
959
+ fileDropZonePrompt: "Arrastr\xE1 archivos ac\xE1, o elegilos"
945
960
  };
946
961
 
947
962
  // src/i18n/PireIntlProvider.tsx
@@ -1283,6 +1298,120 @@ function DatePicker({
1283
1298
  ] });
1284
1299
  }
1285
1300
 
1301
+ // src/components/forms/DateRangePicker.tsx
1302
+ var import_react_aria_components19 = require("react-aria-components");
1303
+ var import_jsx_runtime26 = require("react/jsx-runtime");
1304
+ function rangeLengthInDays(range) {
1305
+ return range.end.toDate("UTC").getTime() / 864e5 - range.start.toDate("UTC").getTime() / 864e5 + 1;
1306
+ }
1307
+ function DateRangePicker({
1308
+ label,
1309
+ description,
1310
+ errorMessage,
1311
+ maxRangeDays,
1312
+ presets,
1313
+ size = "md",
1314
+ fullWidth = true,
1315
+ startName,
1316
+ endName,
1317
+ className,
1318
+ style,
1319
+ ...rest
1320
+ }) {
1321
+ const msg = usePireMessages();
1322
+ const current = rest.value ?? rest.defaultValue ?? null;
1323
+ const tooLong = maxRangeDays != null && current != null && rangeLengthInDays(current) > maxRangeDays;
1324
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1325
+ import_react_aria_components19.DateRangePicker,
1326
+ {
1327
+ className: cx("pire-field", className),
1328
+ style,
1329
+ startName,
1330
+ endName,
1331
+ validationBehavior: "aria",
1332
+ ...rest,
1333
+ isInvalid: rest.isInvalid || tooLong,
1334
+ children: [
1335
+ label ? /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_react_aria_components19.Label, { className: "pire-field-label", children: [
1336
+ label,
1337
+ rest.isRequired ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
1338
+ ] }) : null,
1339
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1340
+ import_react_aria_components19.Group,
1341
+ {
1342
+ className: "pire-control pire-daterange-control",
1343
+ "data-size": size,
1344
+ "data-full-width": String(fullWidth),
1345
+ "data-invalid": rest.isInvalid || tooLong ? "true" : void 0,
1346
+ "data-readonly": rest.isReadOnly ? "true" : void 0,
1347
+ children: [
1348
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_aria_components19.DateInput, { slot: "start", className: "pire-datefield", children: (segment) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_aria_components19.DateSegment, { segment, className: "pire-datesegment" }) }),
1349
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { "aria-hidden": "true", className: "pire-daterange-dash", children: "\u2013" }),
1350
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_aria_components19.DateInput, { slot: "end", className: "pire-datefield", children: (segment) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_aria_components19.DateSegment, { segment, className: "pire-datesegment" }) }),
1351
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1352
+ import_react_aria_components19.Button,
1353
+ {
1354
+ className: "pire-iconbtn",
1355
+ "data-size": "sm",
1356
+ "aria-label": msg.datePickerOpenCalendar,
1357
+ style: { width: 24, height: 24 },
1358
+ children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(Icon, { name: "calendar", size: 16 })
1359
+ }
1360
+ )
1361
+ ]
1362
+ }
1363
+ ),
1364
+ description ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_aria_components19.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
1365
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_aria_components19.FieldError, { className: "pire-field-error", children: errorMessage }),
1366
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_aria_components19.Popover, { className: "pire-popover", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_react_aria_components19.Dialog, { className: "pire-daterange-dialog", children: [
1367
+ presets?.length ? (
1368
+ // Before the calendar in the DOM, so keyboard users reach the shortcut without
1369
+ // arrowing through a month first.
1370
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "pire-daterange-presets", role: "group", "aria-label": msg.dateRangePresetsLabel, children: presets.map((preset) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1371
+ import_react_aria_components19.Button,
1372
+ {
1373
+ className: "pire-daterange-preset",
1374
+ onPress: () => rest.onChange?.(preset.range()),
1375
+ children: preset.label
1376
+ },
1377
+ preset.id
1378
+ )) })
1379
+ ) : null,
1380
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_react_aria_components19.RangeCalendar, { className: "pire-calendar", children: [
1381
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("header", { className: "pire-calendar-head", children: [
1382
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1383
+ import_react_aria_components19.Button,
1384
+ {
1385
+ slot: "previous",
1386
+ className: "pire-iconbtn",
1387
+ "data-size": "sm",
1388
+ "aria-label": msg.datePickerPreviousMonth,
1389
+ children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(Icon, { name: "chevron-left", size: 16 })
1390
+ }
1391
+ ),
1392
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_aria_components19.Heading, { className: "pire-calendar-title" }),
1393
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1394
+ import_react_aria_components19.Button,
1395
+ {
1396
+ slot: "next",
1397
+ className: "pire-iconbtn",
1398
+ "data-size": "sm",
1399
+ "aria-label": msg.datePickerNextMonth,
1400
+ children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(Icon, { name: "chevron-right", size: 16 })
1401
+ }
1402
+ )
1403
+ ] }),
1404
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_react_aria_components19.CalendarGrid, { className: "pire-calendar-grid", children: [
1405
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_aria_components19.CalendarGridHeader, { children: (day) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_aria_components19.CalendarHeaderCell, { children: day }) }),
1406
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_aria_components19.CalendarGridBody, { children: (date) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_aria_components19.CalendarCell, { date, className: "pire-calendar-cell" }) })
1407
+ ] })
1408
+ ] })
1409
+ ] }) })
1410
+ ]
1411
+ }
1412
+ );
1413
+ }
1414
+
1286
1415
  // src/components/forms/ValueHelpField.tsx
1287
1416
  var React9 = __toESM(require("react"), 1);
1288
1417
 
@@ -1290,8 +1419,8 @@ var React9 = __toESM(require("react"), 1);
1290
1419
  var React8 = __toESM(require("react"), 1);
1291
1420
 
1292
1421
  // src/components/feedback/Dialog.tsx
1293
- var import_react_aria_components19 = require("react-aria-components");
1294
- var import_jsx_runtime26 = require("react/jsx-runtime");
1422
+ var import_react_aria_components20 = require("react-aria-components");
1423
+ var import_jsx_runtime27 = require("react/jsx-runtime");
1295
1424
  function Dialog({
1296
1425
  isOpen,
1297
1426
  onOpenChange,
@@ -1311,8 +1440,8 @@ function Dialog({
1311
1440
  onClose?.();
1312
1441
  onOpenChange?.(false);
1313
1442
  };
1314
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1315
- import_react_aria_components19.ModalOverlay,
1443
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1444
+ import_react_aria_components20.ModalOverlay,
1316
1445
  {
1317
1446
  className: "pire-modal-overlay",
1318
1447
  isOpen,
@@ -1320,28 +1449,28 @@ function Dialog({
1320
1449
  onOpenChange: (o) => {
1321
1450
  if (!o) close();
1322
1451
  },
1323
- children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_aria_components19.Modal, { className: cx("pire-modal", className), "data-size": size, style, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_react_aria_components19.Dialog, { className: "pire-dialog", children: [
1324
- title ? /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("header", { className: "pire-dialog-head", children: [
1325
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
1326
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_aria_components19.Heading, { slot: "title", className: "pire-dialog-title", children: title }),
1327
- subtitle ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("p", { className: "pire-dialog-sub", style: { margin: 0 }, children: subtitle }) : null
1452
+ children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_aria_components20.Modal, { className: cx("pire-modal", className), "data-size": size, style, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_react_aria_components20.Dialog, { className: "pire-dialog", children: [
1453
+ title ? /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("header", { className: "pire-dialog-head", children: [
1454
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
1455
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_aria_components20.Heading, { slot: "title", className: "pire-dialog-title", children: title }),
1456
+ subtitle ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("p", { className: "pire-dialog-sub", style: { margin: 0 }, children: subtitle }) : null
1328
1457
  ] }),
1329
- showClose ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(IconButton, { icon: "x", label: msg.dialogClose, size: "sm", onPress: close }) : null
1458
+ showClose ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(IconButton, { icon: "x", label: msg.dialogClose, size: "sm", onPress: close }) : null
1330
1459
  ] }) : null,
1331
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "pire-dialog-body", children }),
1332
- footer ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("footer", { className: "pire-dialog-foot", children: footer }) : null
1460
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "pire-dialog-body", children }),
1461
+ footer ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("footer", { className: "pire-dialog-foot", children: footer }) : null
1333
1462
  ] }) })
1334
1463
  }
1335
1464
  );
1336
1465
  }
1337
1466
 
1338
1467
  // src/components/data/DataTable.tsx
1339
- var import_react_aria_components20 = require("react-aria-components");
1468
+ var import_react_aria_components21 = require("react-aria-components");
1340
1469
 
1341
1470
  // src/components/feedback/Skeleton.tsx
1342
- var import_jsx_runtime27 = require("react/jsx-runtime");
1471
+ var import_jsx_runtime28 = require("react/jsx-runtime");
1343
1472
  function Skeleton({ shape = "text", width, height, className, style, ...rest }) {
1344
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1473
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1345
1474
  "div",
1346
1475
  {
1347
1476
  className: cx("pire-skeleton", className),
@@ -1355,7 +1484,7 @@ function Skeleton({ shape = "text", width, height, className, style, ...rest })
1355
1484
  var BAR_WIDTHS = ["72%", "54%", "86%", "63%"];
1356
1485
  function SkeletonTableRow({ columns, density = "regular", className, style, ...rest }) {
1357
1486
  const cells = typeof columns === "number" ? Array.from({ length: columns }, () => ({})) : columns;
1358
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1487
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1359
1488
  "div",
1360
1489
  {
1361
1490
  className: cx("pire-skeleton-row", className),
@@ -1367,13 +1496,13 @@ function SkeletonTableRow({ columns, density = "regular", className, style, ...r
1367
1496
  const align = c.numeric ? "right" : c.align ?? "left";
1368
1497
  return (
1369
1498
  // biome-ignore lint/suspicious/noArrayIndexKey: columns are positional and never reordered.
1370
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1499
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1371
1500
  "div",
1372
1501
  {
1373
1502
  className: "pire-skeleton-cell",
1374
1503
  "data-align": align,
1375
1504
  style: { width: c.width, flex: c.width ? "0 0 auto" : void 0 },
1376
- children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Skeleton, { width: BAR_WIDTHS[i % BAR_WIDTHS.length] })
1505
+ children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Skeleton, { width: BAR_WIDTHS[i % BAR_WIDTHS.length] })
1377
1506
  },
1378
1507
  i
1379
1508
  )
@@ -1384,7 +1513,7 @@ function SkeletonTableRow({ columns, density = "regular", className, style, ...r
1384
1513
  }
1385
1514
 
1386
1515
  // src/components/data/DataTable.tsx
1387
- var import_jsx_runtime28 = require("react/jsx-runtime");
1516
+ var import_jsx_runtime29 = require("react/jsx-runtime");
1388
1517
  function DataTable({
1389
1518
  columns,
1390
1519
  rows,
@@ -1416,15 +1545,15 @@ function DataTable({
1416
1545
  ...columns.map((c) => ({ width: c.width, align: c.align, numeric: c.numeric }))
1417
1546
  ];
1418
1547
  const body = isLoading ? [] : rows;
1419
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1548
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1420
1549
  "div",
1421
1550
  {
1422
1551
  className: cx("pire-table-wrap", className),
1423
1552
  style,
1424
1553
  "data-loading": isLoading ? "true" : void 0,
1425
1554
  "aria-busy": isLoading ? "true" : void 0,
1426
- children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
1427
- import_react_aria_components20.Table,
1555
+ children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
1556
+ import_react_aria_components21.Table,
1428
1557
  {
1429
1558
  className: "pire-table",
1430
1559
  "data-density": density,
@@ -1440,10 +1569,10 @@ function DataTable({
1440
1569
  if (row) onRowAction(row);
1441
1570
  } : void 0,
1442
1571
  children: [
1443
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_react_aria_components20.TableHeader, { className: "pire-thead-row", children: [
1444
- selectable ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_react_aria_components20.Column, { className: "pire-th", width: 44, children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Checkbox, { slot: "selection", "aria-label": msg.dataTableSelectAll }) }) : null,
1445
- columns.map((c, i) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1446
- import_react_aria_components20.Column,
1572
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_react_aria_components21.TableHeader, { className: "pire-thead-row", children: [
1573
+ selectable ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_react_aria_components21.Column, { className: "pire-th", width: 44, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Checkbox, { slot: "selection", "aria-label": msg.dataTableSelectAll }) }) : null,
1574
+ columns.map((c, i) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1575
+ import_react_aria_components21.Column,
1447
1576
  {
1448
1577
  id: c.key,
1449
1578
  className: "pire-th",
@@ -1452,9 +1581,9 @@ function DataTable({
1452
1581
  width: c.width,
1453
1582
  "data-align": c.numeric || c.align === "right" ? "right" : c.align,
1454
1583
  "data-allows-sorting": c.sortable ? "true" : void 0,
1455
- children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("span", { className: "pire-th-inner", children: [
1584
+ children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("span", { className: "pire-th-inner", children: [
1456
1585
  c.label,
1457
- c.sortable ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1586
+ c.sortable ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1458
1587
  Icon,
1459
1588
  {
1460
1589
  size: 12,
@@ -1467,16 +1596,16 @@ function DataTable({
1467
1596
  c.key
1468
1597
  ))
1469
1598
  ] }),
1470
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_react_aria_components20.TableBody, { renderEmptyState: () => isLoading ? /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: "pire-table-loading", role: "status", "aria-live": "polite", children: [
1471
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: "pire-sr-only", children: loadingLabel ?? msg.dataTableLoading }),
1599
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_react_aria_components21.TableBody, { renderEmptyState: () => isLoading ? /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: "pire-table-loading", role: "status", "aria-live": "polite", children: [
1600
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: "pire-sr-only", children: loadingLabel ?? msg.dataTableLoading }),
1472
1601
  Array.from({ length: skeletonRows }, (_, i) => (
1473
1602
  // biome-ignore lint/suspicious/noArrayIndexKey: placeholder rows are positional.
1474
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SkeletonTableRow, { columns: skeletonColumns, density }, i)
1603
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(SkeletonTableRow, { columns: skeletonColumns, density }, i)
1475
1604
  ))
1476
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: "pire-table-empty", children: emptyLabel }), children: body.map((row) => /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_react_aria_components20.Row, { id: row.id, className: "pire-tr", "data-pressable": onRowAction ? "true" : void 0, children: [
1477
- selectable ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_react_aria_components20.Cell, { className: "pire-td", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Checkbox, { slot: "selection", "aria-label": msg.dataTableSelectRow }) }) : null,
1478
- columns.map((c) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1479
- import_react_aria_components20.Cell,
1605
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "pire-table-empty", children: emptyLabel }), children: body.map((row) => /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_react_aria_components21.Row, { id: row.id, className: "pire-tr", "data-pressable": onRowAction ? "true" : void 0, children: [
1606
+ selectable ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_react_aria_components21.Cell, { className: "pire-td", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Checkbox, { slot: "selection", "aria-label": msg.dataTableSelectRow }) }) : null,
1607
+ columns.map((c) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1608
+ import_react_aria_components21.Cell,
1480
1609
  {
1481
1610
  className: "pire-td",
1482
1611
  "data-numeric": c.numeric ? "true" : void 0,
@@ -1494,7 +1623,7 @@ function DataTable({
1494
1623
  }
1495
1624
 
1496
1625
  // src/components/patterns/ValueHelpDialog.tsx
1497
- var import_jsx_runtime29 = require("react/jsx-runtime");
1626
+ var import_jsx_runtime30 = require("react/jsx-runtime");
1498
1627
  function ValueHelpDialog({
1499
1628
  isOpen,
1500
1629
  title = "Select a record",
@@ -1515,16 +1644,16 @@ function ValueHelpDialog({
1515
1644
  if (!q) return rows;
1516
1645
  return rows.filter((row) => Object.values(row).some((v) => String(v).toLowerCase().includes(q)));
1517
1646
  }, [rows, query]);
1518
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1647
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1519
1648
  Dialog,
1520
1649
  {
1521
1650
  isOpen,
1522
1651
  size: "lg",
1523
1652
  title,
1524
1653
  onClose,
1525
- footer: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(Button, { variant: "tertiary", onPress: onClose, children: msg.valueHelpDialogCancel }),
1526
- children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "var(--sp-3)" }, children: [
1527
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1654
+ footer: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Button, { variant: "tertiary", onPress: onClose, children: msg.valueHelpDialogCancel }),
1655
+ children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "var(--sp-3)" }, children: [
1656
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1528
1657
  Input,
1529
1658
  {
1530
1659
  "aria-label": msg.valueHelpDialogSearch,
@@ -1536,7 +1665,7 @@ function ValueHelpDialog({
1536
1665
  autoFocus: true
1537
1666
  }
1538
1667
  ),
1539
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1668
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1540
1669
  DataTable,
1541
1670
  {
1542
1671
  "aria-label": typeof title === "string" ? title : "Records",
@@ -1556,7 +1685,7 @@ function ValueHelpDialog({
1556
1685
  }
1557
1686
 
1558
1687
  // src/components/forms/ValueHelpField.tsx
1559
- var import_jsx_runtime30 = require("react/jsx-runtime");
1688
+ var import_jsx_runtime31 = require("react/jsx-runtime");
1560
1689
  var defaultFormat = (row) => [row.id, row.name ?? row.label ?? row.text].filter(Boolean).join(" \u2014 ");
1561
1690
  function ValueHelpField({
1562
1691
  label,
@@ -1578,9 +1707,9 @@ function ValueHelpField({
1578
1707
  }) {
1579
1708
  const msg = usePireMessages();
1580
1709
  const [open, setOpen] = React9.useState(false);
1581
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: cx(className), style, children: [
1582
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { style: { display: "flex", gap: "var(--sp-2)", alignItems: "flex-end" }, children: [
1583
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1710
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: cx(className), style, children: [
1711
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { style: { display: "flex", gap: "var(--sp-2)", alignItems: "flex-end" }, children: [
1712
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1584
1713
  Input,
1585
1714
  {
1586
1715
  label,
@@ -1594,7 +1723,7 @@ function ValueHelpField({
1594
1723
  errorMessage
1595
1724
  }
1596
1725
  ),
1597
- allowsClear && value ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1726
+ allowsClear && value ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1598
1727
  IconButton,
1599
1728
  {
1600
1729
  icon: "x",
@@ -1604,7 +1733,7 @@ function ValueHelpField({
1604
1733
  onPress: () => onChange?.(null)
1605
1734
  }
1606
1735
  ) : null,
1607
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1736
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1608
1737
  IconButton,
1609
1738
  {
1610
1739
  icon: "search",
@@ -1615,7 +1744,7 @@ function ValueHelpField({
1615
1744
  }
1616
1745
  )
1617
1746
  ] }),
1618
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1747
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1619
1748
  ValueHelpDialog,
1620
1749
  {
1621
1750
  isOpen: open,
@@ -1629,8 +1758,165 @@ function ValueHelpField({
1629
1758
  ] });
1630
1759
  }
1631
1760
 
1761
+ // src/components/forms/FileUpload.tsx
1762
+ var React10 = __toESM(require("react"), 1);
1763
+ var import_react_aria_components23 = require("react-aria-components");
1764
+
1765
+ // src/components/feedback/ProgressBar.tsx
1766
+ var import_react_aria_components22 = require("react-aria-components");
1767
+ var import_jsx_runtime32 = require("react/jsx-runtime");
1768
+ function ProgressBar({
1769
+ value = 0,
1770
+ minValue = 0,
1771
+ maxValue = 100,
1772
+ label,
1773
+ showValue = true,
1774
+ isIndeterminate,
1775
+ status = "informative",
1776
+ size = "md",
1777
+ className,
1778
+ style
1779
+ }) {
1780
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1781
+ import_react_aria_components22.ProgressBar,
1782
+ {
1783
+ className: cx("pire-progress", className),
1784
+ "data-status": status,
1785
+ "data-size": size,
1786
+ value,
1787
+ minValue,
1788
+ maxValue,
1789
+ isIndeterminate,
1790
+ style,
1791
+ children: ({ percentage, valueText }) => /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_jsx_runtime32.Fragment, { children: [
1792
+ label || showValue ? /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "pire-progress-head", children: [
1793
+ label ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_react_aria_components22.Label, { children: label }) : /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", {}),
1794
+ showValue && !isIndeterminate ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "pire-numeric", children: valueText }) : null
1795
+ ] }) : null,
1796
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: "pire-progress-track", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: "pire-progress-fill", style: { width: `${isIndeterminate ? 40 : percentage}%` } }) })
1797
+ ] })
1798
+ }
1799
+ );
1800
+ }
1801
+
1802
+ // src/components/forms/FileUpload.tsx
1803
+ var import_jsx_runtime33 = require("react/jsx-runtime");
1804
+ var isImage = (file) => file.type.startsWith("image/");
1805
+ function formatFileSize(bytes) {
1806
+ if (bytes < 1024) return `${bytes} B`;
1807
+ if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024).toLocaleString()} KB`;
1808
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
1809
+ }
1810
+ function screenFiles(files, { maxSize, acceptedFileTypes }) {
1811
+ const accepted = [];
1812
+ const rejected = [];
1813
+ for (const file of files) {
1814
+ if (maxSize != null && file.size > maxSize) {
1815
+ rejected.push({ file, reason: "size" });
1816
+ continue;
1817
+ }
1818
+ if (acceptedFileTypes?.length) {
1819
+ const ok = acceptedFileTypes.some((t) => t.startsWith(".") ? file.name.toLowerCase().endsWith(t.toLowerCase()) : t.endsWith("/*") ? file.type.startsWith(t.slice(0, -1)) : file.type === t);
1820
+ if (!ok) {
1821
+ rejected.push({ file, reason: "type" });
1822
+ continue;
1823
+ }
1824
+ }
1825
+ accepted.push(file);
1826
+ }
1827
+ return { accepted, rejected };
1828
+ }
1829
+ function FileUpload({
1830
+ label,
1831
+ value,
1832
+ defaultValue,
1833
+ onChange,
1834
+ acceptedFileTypes,
1835
+ allowsMultiple,
1836
+ maxSize,
1837
+ onError,
1838
+ showPreview = true,
1839
+ uploadProgress,
1840
+ chooseLabel,
1841
+ description,
1842
+ errorMessage,
1843
+ isInvalid,
1844
+ isDisabled,
1845
+ isReadOnly,
1846
+ isRequired,
1847
+ fullWidth = true,
1848
+ className,
1849
+ style
1850
+ }) {
1851
+ const msg = usePireMessages();
1852
+ const [uncontrolled, setUncontrolled] = React10.useState(defaultValue ?? []);
1853
+ const files = value ?? uncontrolled;
1854
+ const created = React10.useRef([]);
1855
+ React10.useEffect(() => () => {
1856
+ for (const url of created.current) URL.revokeObjectURL(url);
1857
+ }, []);
1858
+ const commit = (next) => {
1859
+ if (value === void 0) setUncontrolled(next);
1860
+ onChange?.(next);
1861
+ };
1862
+ const accept = (picked) => {
1863
+ if (!picked || isDisabled || isReadOnly) return;
1864
+ const { accepted, rejected } = screenFiles([...picked], { maxSize, acceptedFileTypes });
1865
+ if (rejected.length) onError?.(rejected);
1866
+ if (!accepted.length) return;
1867
+ const wrapped = accepted.map((file) => {
1868
+ const previewUrl = showPreview && isImage(file) ? URL.createObjectURL(file) : void 0;
1869
+ if (previewUrl) created.current.push(previewUrl);
1870
+ return { file, previewUrl };
1871
+ });
1872
+ commit(allowsMultiple ? [...files, ...wrapped] : wrapped.slice(0, 1));
1873
+ };
1874
+ const remove = (target) => commit(files.filter((f) => f.file !== target));
1875
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
1876
+ "div",
1877
+ {
1878
+ className: cx("pire-field", "pire-fileupload", className),
1879
+ style,
1880
+ "data-full-width": String(fullWidth),
1881
+ "data-invalid": isInvalid ? "true" : void 0,
1882
+ children: [
1883
+ label ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("span", { className: "pire-field-label", children: [
1884
+ label,
1885
+ isRequired ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
1886
+ ] }) : null,
1887
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1888
+ import_react_aria_components23.FileTrigger,
1889
+ {
1890
+ acceptedFileTypes,
1891
+ allowsMultiple,
1892
+ onSelect: accept,
1893
+ children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Button, { icon: "paperclip", isDisabled: isDisabled || isReadOnly, children: chooseLabel ?? msg.fileUploadChoose })
1894
+ }
1895
+ ),
1896
+ files.length ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("ul", { className: "pire-fileupload-list", children: files.map(({ file, previewUrl }) => /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("li", { className: "pire-fileupload-item", children: [
1897
+ previewUrl ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("img", { className: "pire-fileupload-thumb", src: previewUrl, alt: "" }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Icon, { name: "file-text", size: 16, className: "pire-fileupload-icon" }),
1898
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "pire-fileupload-name", children: file.name }),
1899
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "pire-fileupload-size", children: formatFileSize(file.size) }),
1900
+ isDisabled || isReadOnly ? null : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1901
+ IconButton,
1902
+ {
1903
+ icon: "x",
1904
+ size: "sm",
1905
+ label: msg.fileUploadRemoveNamed.replace("{name}", file.name),
1906
+ onPress: () => remove(file)
1907
+ }
1908
+ )
1909
+ ] }, `${file.name}-${file.size}-${file.lastModified}`)) }) : null,
1910
+ uploadProgress != null ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(ProgressBar, { value: uploadProgress, label: msg.fileUploadUploading }) : null,
1911
+ description ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_react_aria_components23.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
1912
+ isInvalid && errorMessage ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "pire-field-error", children: errorMessage }) : null
1913
+ ]
1914
+ }
1915
+ );
1916
+ }
1917
+
1632
1918
  // src/components/navigation/ShellBar.tsx
1633
- var import_jsx_runtime31 = require("react/jsx-runtime");
1919
+ var import_jsx_runtime34 = require("react/jsx-runtime");
1634
1920
  var initials2 = (name) => name.trim().split(/\s+/).slice(0, 2).map((p) => p[0]).join("").toUpperCase();
1635
1921
  function ShellBar({
1636
1922
  product,
@@ -1645,22 +1931,75 @@ function ShellBar({
1645
1931
  className,
1646
1932
  ...rest
1647
1933
  }) {
1648
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("header", { className: cx("pire-shellbar", className), ...rest, children: [
1649
- onMenu ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(IconButton, { icon: "menu", label: menuLabel, variant: "inverse", size: "sm", onPress: onMenu }) : null,
1650
- monogram ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "pire-shellbar-mono", "aria-hidden": "true", children: monogram }) : null,
1651
- product ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "pire-shellbar-product", children: product }) : null,
1652
- title ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "pire-shellbar-title", children: title }) : null,
1653
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "pire-shellbar-spacer" }),
1654
- onSearch ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(IconButton, { icon: "search", label: searchLabel, variant: "inverse", size: "sm", onPress: onSearch }) : null,
1934
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("header", { className: cx("pire-shellbar", className), ...rest, children: [
1935
+ onMenu ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(IconButton, { icon: "menu", label: menuLabel, variant: "inverse", size: "sm", onPress: onMenu }) : null,
1936
+ monogram ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "pire-shellbar-mono", "aria-hidden": "true", children: monogram }) : null,
1937
+ product ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "pire-shellbar-product", children: product }) : null,
1938
+ title ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "pire-shellbar-title", children: title }) : null,
1939
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "pire-shellbar-spacer" }),
1940
+ onSearch ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(IconButton, { icon: "search", label: searchLabel, variant: "inverse", size: "sm", onPress: onSearch }) : null,
1655
1941
  actions,
1656
- user ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "pire-avatar", title: user, "aria-label": user, role: "img", children: initials2(user) }) : null
1942
+ user ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "pire-avatar", title: user, "aria-label": user, role: "img", children: initials2(user) }) : null
1657
1943
  ] });
1658
1944
  }
1659
1945
 
1660
1946
  // src/components/navigation/SideNav.tsx
1661
- var React10 = __toESM(require("react"), 1);
1662
- var import_react_aria_components21 = require("react-aria-components");
1663
- var import_jsx_runtime32 = require("react/jsx-runtime");
1947
+ var React11 = __toESM(require("react"), 1);
1948
+ var import_react_aria_components25 = require("react-aria-components");
1949
+
1950
+ // src/components/navigation/Menu.tsx
1951
+ var import_react_aria_components24 = require("react-aria-components");
1952
+ var import_jsx_runtime35 = require("react/jsx-runtime");
1953
+ function Menu({ minWidth, className, style, ...rest }) {
1954
+ const width = typeof minWidth === "number" ? `${minWidth}px` : minWidth;
1955
+ const menuStyle = width == null ? style : { ["--pire-menu-min-w"]: width, ...style };
1956
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
1957
+ import_react_aria_components24.Menu,
1958
+ {
1959
+ className: cx("pire-menu", className),
1960
+ style: menuStyle,
1961
+ ...rest
1962
+ }
1963
+ );
1964
+ }
1965
+ function MenuItem({
1966
+ children,
1967
+ icon,
1968
+ description,
1969
+ shortcut,
1970
+ tone = "default",
1971
+ className,
1972
+ ...rest
1973
+ }) {
1974
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
1975
+ import_react_aria_components24.MenuItem,
1976
+ {
1977
+ className: cx("pire-menu-item", className),
1978
+ "data-tone": tone === "danger" ? "danger" : void 0,
1979
+ ...rest,
1980
+ children: [
1981
+ icon ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(Icon, { name: icon, size: 16, className: "pire-menu-item-icon" }) : null,
1982
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("span", { className: "pire-menu-item-body", children: [
1983
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "pire-menu-item-label", children }),
1984
+ description ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "pire-menu-item-desc", children: description }) : null
1985
+ ] }),
1986
+ shortcut ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("kbd", { className: "pire-menu-item-shortcut", children: shortcut }) : null
1987
+ ]
1988
+ }
1989
+ );
1990
+ }
1991
+ function MenuSection({ title, children, className, ...rest }) {
1992
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_react_aria_components24.MenuSection, { className: cx("pire-menu-section", className), ...rest, children: [
1993
+ title ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_react_aria_components24.Header, { className: "pire-menu-section-title", children: title }) : null,
1994
+ children
1995
+ ] });
1996
+ }
1997
+ function MenuSeparator({ className }) {
1998
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_react_aria_components24.Separator, { className: cx("pire-menu-separator", className) });
1999
+ }
2000
+
2001
+ // src/components/navigation/SideNav.tsx
2002
+ var import_jsx_runtime36 = require("react/jsx-runtime");
1664
2003
  function findActiveParent(groups, value) {
1665
2004
  if (value == null) return void 0;
1666
2005
  for (const group of groups) {
@@ -1678,6 +2017,7 @@ function SideNav({
1678
2017
  defaultExpandedIds,
1679
2018
  onExpandedChange,
1680
2019
  collapsed,
2020
+ railFlyout = true,
1681
2021
  footer,
1682
2022
  className,
1683
2023
  ...rest
@@ -1685,10 +2025,10 @@ function SideNav({
1685
2025
  const msg = usePireMessages();
1686
2026
  const activeParent = findActiveParent(groups, value);
1687
2027
  const isControlled = expandedIds != null;
1688
- const [ownExpanded, setOwnExpanded] = React10.useState(
2028
+ const [ownExpanded, setOwnExpanded] = React11.useState(
1689
2029
  () => new Set(defaultExpandedIds ?? (activeParent ? [activeParent] : []))
1690
2030
  );
1691
- const [lastValue, setLastValue] = React10.useState(value);
2031
+ const [lastValue, setLastValue] = React11.useState(value);
1692
2032
  if (value !== lastValue) {
1693
2033
  setLastValue(value);
1694
2034
  if (!isControlled && activeParent && !ownExpanded.has(activeParent)) {
@@ -1708,8 +2048,8 @@ function SideNav({
1708
2048
  };
1709
2049
  const renderRow = (item, onPress, isGroup) => {
1710
2050
  const selected = !isGroup && item.id === value;
1711
- const button = /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
1712
- import_react_aria_components21.Button,
2051
+ const button = /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
2052
+ import_react_aria_components25.Button,
1713
2053
  {
1714
2054
  className: "pire-sidenav-item",
1715
2055
  "data-selected": selected ? "true" : void 0,
@@ -1718,50 +2058,70 @@ function SideNav({
1718
2058
  "aria-label": collapsed ? item.label : void 0,
1719
2059
  onPress,
1720
2060
  children: [
1721
- item.icon ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Icon, { name: item.icon, size: 16 }) : null,
1722
- collapsed ? null : /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { children: item.label }),
1723
- item.count != null && !collapsed ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "pire-sidenav-count", children: item.count }) : null
2061
+ item.icon ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Icon, { name: item.icon, size: 16 }) : null,
2062
+ collapsed ? null : /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { children: item.label }),
2063
+ item.count != null && !collapsed ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "pire-sidenav-count", children: item.count }) : null
1724
2064
  ]
1725
2065
  },
1726
2066
  item.id
1727
2067
  );
1728
- return collapsed ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Tooltip, { label: item.label, placement: "right", children: button }, item.id) : button;
2068
+ return collapsed ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Tooltip, { label: item.label, placement: "right", children: button }, item.id) : button;
1729
2069
  };
1730
- const renderSection = (item) => /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_react_aria_components21.Disclosure, { id: item.id, className: "pire-sidenav-section", children: [
1731
- /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
1732
- import_react_aria_components21.Button,
2070
+ const renderRailFlyout = (item) => /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_react_aria_components25.MenuTrigger, { children: [
2071
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2072
+ import_react_aria_components25.Button,
2073
+ {
2074
+ className: "pire-sidenav-item",
2075
+ "aria-label": item.label,
2076
+ "data-active-child": item.id === activeParent ? "true" : void 0,
2077
+ children: item.icon ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Icon, { name: item.icon, size: 16 }) : null
2078
+ }
2079
+ ),
2080
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_react_aria_components25.Popover, { className: "pire-popover", placement: "right top", offset: 4, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2081
+ Menu,
2082
+ {
2083
+ "aria-label": item.label,
2084
+ className: "pire-sidenav-flyout",
2085
+ onAction: (key) => onChange?.(String(key)),
2086
+ children: (item.items ?? []).map((child) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(MenuItem, { id: child.id, children: child.label }, child.id))
2087
+ }
2088
+ ) })
2089
+ ] }, item.id);
2090
+ const renderSection = (item) => /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_react_aria_components25.Disclosure, { id: item.id, className: "pire-sidenav-section", children: [
2091
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
2092
+ import_react_aria_components25.Button,
1733
2093
  {
1734
2094
  slot: "trigger",
1735
2095
  className: "pire-sidenav-item",
1736
2096
  "data-kind": "group",
1737
2097
  "data-active-child": item.id === activeParent ? "true" : void 0,
1738
2098
  children: [
1739
- item.icon ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Icon, { name: item.icon, size: 16 }) : null,
1740
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { children: item.label }),
1741
- item.count != null ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "pire-sidenav-count", children: item.count }) : null,
1742
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Icon, { name: "chevron-down", size: 16, className: "pire-sidenav-chevron" })
2099
+ item.icon ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Icon, { name: item.icon, size: 16 }) : null,
2100
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { children: item.label }),
2101
+ item.count != null ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "pire-sidenav-count", children: item.count }) : null,
2102
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Icon, { name: "chevron-down", size: 16, className: "pire-sidenav-chevron" })
1743
2103
  ]
1744
2104
  }
1745
2105
  ),
1746
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_react_aria_components21.DisclosurePanel, { className: "pire-sidenav-subnav", children: item.items?.map((child) => {
2106
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_react_aria_components25.DisclosurePanel, { className: "pire-sidenav-subnav", children: item.items?.map((child) => {
1747
2107
  const selected = child.id === value;
1748
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
1749
- import_react_aria_components21.Button,
2108
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
2109
+ import_react_aria_components25.Button,
1750
2110
  {
1751
2111
  className: "pire-sidenav-item pire-sidenav-subitem",
1752
2112
  "data-selected": selected ? "true" : void 0,
1753
2113
  "aria-current": selected ? "page" : void 0,
1754
2114
  onPress: () => onChange?.(child.id),
1755
2115
  children: [
1756
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { children: child.label }),
1757
- child.count != null ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "pire-sidenav-count", children: child.count }) : null
2116
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { children: child.label }),
2117
+ child.count != null ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "pire-sidenav-count", children: child.count }) : null
1758
2118
  ]
1759
2119
  },
1760
2120
  child.id
1761
2121
  );
1762
2122
  }) })
1763
2123
  ] }, item.id);
1764
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
2124
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
1765
2125
  "nav",
1766
2126
  {
1767
2127
  className: cx("pire-sidenav", className),
@@ -1774,12 +2134,13 @@ function SideNav({
1774
2134
  const rows = group.items.map((item) => {
1775
2135
  const isGroup = Boolean(item.items?.length);
1776
2136
  if (isGroup && !collapsed) return renderSection(item);
2137
+ if (isGroup && collapsed && railFlyout) return renderRailFlyout(item);
1777
2138
  return renderRow(item, () => isGroup ? toggleExpanded(item.id) : onChange?.(item.id), isGroup);
1778
2139
  });
1779
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)("div", { className: "pire-sidenav-group", children: [
1780
- group.label && !collapsed ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: "pire-sidenav-label", children: group.label }) : null,
1781
- hasSections ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1782
- import_react_aria_components21.DisclosureGroup,
2140
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "pire-sidenav-group", children: [
2141
+ group.label && !collapsed ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "pire-sidenav-label", children: group.label }) : null,
2142
+ hasSections ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2143
+ import_react_aria_components25.DisclosureGroup,
1783
2144
  {
1784
2145
  className: "pire-sidenav-tree",
1785
2146
  allowsMultipleExpanded: true,
@@ -1790,18 +2151,18 @@ function SideNav({
1790
2151
  ) : rows
1791
2152
  ] }, group.label ?? gi);
1792
2153
  }),
1793
- footer ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: "pire-sidenav-footer", children: footer }) : null
2154
+ footer ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "pire-sidenav-footer", children: footer }) : null
1794
2155
  ]
1795
2156
  }
1796
2157
  );
1797
2158
  }
1798
2159
 
1799
2160
  // src/components/navigation/Tabs.tsx
1800
- var import_react_aria_components22 = require("react-aria-components");
1801
- var import_jsx_runtime33 = require("react/jsx-runtime");
2161
+ var import_react_aria_components26 = require("react-aria-components");
2162
+ var import_jsx_runtime37 = require("react/jsx-runtime");
1802
2163
  function Tabs({ items, value, defaultValue, onChange, panels, className, style, ...rest }) {
1803
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
1804
- import_react_aria_components22.Tabs,
2164
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
2165
+ import_react_aria_components26.Tabs,
1805
2166
  {
1806
2167
  className,
1807
2168
  style,
@@ -1809,23 +2170,23 @@ function Tabs({ items, value, defaultValue, onChange, panels, className, style,
1809
2170
  defaultSelectedKey: defaultValue,
1810
2171
  onSelectionChange: (k) => onChange?.(String(k)),
1811
2172
  children: [
1812
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_react_aria_components22.TabList, { className: "pire-tablist", items, "aria-label": rest["aria-label"] ?? "Views", children: (item) => /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_react_aria_components22.Tab, { className: cx("pire-tab"), id: item.id, isDisabled: item.isDisabled, children: [
1813
- item.icon ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Icon, { name: item.icon, size: 16 }) : null,
2173
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_react_aria_components26.TabList, { className: "pire-tablist", items, "aria-label": rest["aria-label"] ?? "Views", children: (item) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_react_aria_components26.Tab, { className: cx("pire-tab"), id: item.id, isDisabled: item.isDisabled, children: [
2174
+ item.icon ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(Icon, { name: item.icon, size: 16 }) : null,
1814
2175
  item.label,
1815
- item.count != null ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: "pire-tab-count", children: item.count }) : null
2176
+ item.count != null ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "pire-tab-count", children: item.count }) : null
1816
2177
  ] }) }),
1817
- items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_react_aria_components22.TabPanel, { id: item.id, className: panels ? "pire-tabpanel" : void 0, children: panels?.[item.id] }, item.id))
2178
+ items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_react_aria_components26.TabPanel, { id: item.id, className: panels ? "pire-tabpanel" : void 0, children: panels?.[item.id] }, item.id))
1818
2179
  ]
1819
2180
  }
1820
2181
  );
1821
2182
  }
1822
2183
 
1823
2184
  // src/components/navigation/Breadcrumb.tsx
1824
- var import_react_aria_components23 = require("react-aria-components");
1825
- var import_jsx_runtime34 = require("react/jsx-runtime");
2185
+ var import_react_aria_components27 = require("react-aria-components");
2186
+ var import_jsx_runtime38 = require("react/jsx-runtime");
1826
2187
  function Breadcrumb({ items, onNavigate, className, style }) {
1827
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
1828
- import_react_aria_components23.Breadcrumbs,
2188
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2189
+ import_react_aria_components27.Breadcrumbs,
1829
2190
  {
1830
2191
  className: cx("pire-breadcrumbs", className),
1831
2192
  style,
@@ -1833,9 +2194,9 @@ function Breadcrumb({ items, onNavigate, className, style }) {
1833
2194
  onAction: (key) => onNavigate?.(String(key)),
1834
2195
  children: (item) => {
1835
2196
  const last = items[items.length - 1] === item;
1836
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_react_aria_components23.Breadcrumb, { className: "pire-breadcrumb", id: item.id ?? item.label, children: [
1837
- last ? item.label : /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_react_aria_components23.Link, { href: item.href, children: item.label }),
1838
- last ? null : /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(Icon, { name: "chevron-right", size: 12, style: { color: "var(--text-tertiary)" } })
2197
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_react_aria_components27.Breadcrumb, { className: "pire-breadcrumb", id: item.id ?? item.label, children: [
2198
+ last ? item.label : /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_react_aria_components27.Link, { href: item.href, children: item.label }),
2199
+ last ? null : /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(Icon, { name: "chevron-right", size: 12, style: { color: "var(--text-tertiary)" } })
1839
2200
  ] });
1840
2201
  }
1841
2202
  }
@@ -1843,7 +2204,7 @@ function Breadcrumb({ items, onNavigate, className, style }) {
1843
2204
  }
1844
2205
 
1845
2206
  // src/components/navigation/Pagination.tsx
1846
- var import_jsx_runtime35 = require("react/jsx-runtime");
2207
+ var import_jsx_runtime39 = require("react/jsx-runtime");
1847
2208
  function Pagination({
1848
2209
  page = 1,
1849
2210
  pageSize = 25,
@@ -1858,9 +2219,9 @@ function Pagination({
1858
2219
  const pages = Math.max(1, Math.ceil(total / pageSize));
1859
2220
  const from = total === 0 ? 0 : (page - 1) * pageSize + 1;
1860
2221
  const to = Math.min(total, page * pageSize);
1861
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("nav", { className: cx("pire-pagination", className), style, "aria-label": msg.paginationLabel, children: [
1862
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "pire-pagination-count", children: msg.paginationRange.replace("{from}", from.toLocaleString()).replace("{to}", to.toLocaleString()).replace("{total}", total.toLocaleString()) }),
1863
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
2222
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("nav", { className: cx("pire-pagination", className), style, "aria-label": msg.paginationLabel, children: [
2223
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { className: "pire-pagination-count", children: msg.paginationRange.replace("{from}", from.toLocaleString()).replace("{to}", to.toLocaleString()).replace("{total}", total.toLocaleString()) }),
2224
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
1864
2225
  IconButton,
1865
2226
  {
1866
2227
  icon: "chevron-left",
@@ -1871,8 +2232,8 @@ function Pagination({
1871
2232
  onPress: () => onPageChange?.(page - 1)
1872
2233
  }
1873
2234
  ),
1874
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "pire-pagination-count", "aria-live": "polite", children: msg.paginationPageOf.replace("{page}", String(page)).replace("{pages}", String(pages)) }),
1875
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
2235
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { className: "pire-pagination-count", "aria-live": "polite", children: msg.paginationPageOf.replace("{page}", String(page)).replace("{pages}", String(pages)) }),
2236
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
1876
2237
  IconButton,
1877
2238
  {
1878
2239
  icon: "chevron-right",
@@ -1883,7 +2244,7 @@ function Pagination({
1883
2244
  onPress: () => onPageChange?.(page + 1)
1884
2245
  }
1885
2246
  ),
1886
- onPageSizeChange ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
2247
+ onPageSizeChange ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
1887
2248
  Select,
1888
2249
  {
1889
2250
  "aria-label": msg.paginationRowsPerPage,
@@ -1898,59 +2259,8 @@ function Pagination({
1898
2259
  ] });
1899
2260
  }
1900
2261
 
1901
- // src/components/navigation/Menu.tsx
1902
- var import_react_aria_components24 = require("react-aria-components");
1903
- var import_jsx_runtime36 = require("react/jsx-runtime");
1904
- function Menu({ minWidth, className, style, ...rest }) {
1905
- const width = typeof minWidth === "number" ? `${minWidth}px` : minWidth;
1906
- const menuStyle = width == null ? style : { ["--pire-menu-min-w"]: width, ...style };
1907
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
1908
- import_react_aria_components24.Menu,
1909
- {
1910
- className: cx("pire-menu", className),
1911
- style: menuStyle,
1912
- ...rest
1913
- }
1914
- );
1915
- }
1916
- function MenuItem({
1917
- children,
1918
- icon,
1919
- description,
1920
- shortcut,
1921
- tone = "default",
1922
- className,
1923
- ...rest
1924
- }) {
1925
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
1926
- import_react_aria_components24.MenuItem,
1927
- {
1928
- className: cx("pire-menu-item", className),
1929
- "data-tone": tone === "danger" ? "danger" : void 0,
1930
- ...rest,
1931
- children: [
1932
- icon ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Icon, { name: icon, size: 16, className: "pire-menu-item-icon" }) : null,
1933
- /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("span", { className: "pire-menu-item-body", children: [
1934
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "pire-menu-item-label", children }),
1935
- description ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "pire-menu-item-desc", children: description }) : null
1936
- ] }),
1937
- shortcut ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("kbd", { className: "pire-menu-item-shortcut", children: shortcut }) : null
1938
- ]
1939
- }
1940
- );
1941
- }
1942
- function MenuSection({ title, children, className, ...rest }) {
1943
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_react_aria_components24.MenuSection, { className: cx("pire-menu-section", className), ...rest, children: [
1944
- title ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_react_aria_components24.Header, { className: "pire-menu-section-title", children: title }) : null,
1945
- children
1946
- ] });
1947
- }
1948
- function MenuSeparator({ className }) {
1949
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_react_aria_components24.Separator, { className: cx("pire-menu-separator", className) });
1950
- }
1951
-
1952
2262
  // src/components/feedback/InlineMessage.tsx
1953
- var import_jsx_runtime37 = require("react/jsx-runtime");
2263
+ var import_jsx_runtime40 = require("react/jsx-runtime");
1954
2264
  var KIND_ICON = {
1955
2265
  info: "info",
1956
2266
  success: "check-circle-2",
@@ -1960,7 +2270,7 @@ var KIND_ICON = {
1960
2270
  function InlineMessage({ kind = "info", title, action, onClose, children, className, ...rest }) {
1961
2271
  const msg = usePireMessages();
1962
2272
  const assertive = kind === "error" || kind === "warning";
1963
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
2273
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(
1964
2274
  "div",
1965
2275
  {
1966
2276
  className: cx("pire-msg", className),
@@ -1969,58 +2279,21 @@ function InlineMessage({ kind = "info", title, action, onClose, children, classN
1969
2279
  "aria-live": assertive ? "assertive" : "polite",
1970
2280
  ...rest,
1971
2281
  children: [
1972
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(Icon, { name: KIND_ICON[kind], size: 16, style: { marginTop: 2 } }),
1973
- /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { style: { flex: 1, display: "flex", flexDirection: "column", gap: "var(--sp-1)" }, children: [
1974
- title ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "pire-msg-title", children: title }) : null,
1975
- children ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "pire-msg-body", children }) : null,
2282
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Icon, { name: KIND_ICON[kind], size: 16, style: { marginTop: 2 } }),
2283
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("div", { style: { flex: 1, display: "flex", flexDirection: "column", gap: "var(--sp-1)" }, children: [
2284
+ title ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("span", { className: "pire-msg-title", children: title }) : null,
2285
+ children ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("span", { className: "pire-msg-body", children }) : null,
1976
2286
  action
1977
2287
  ] }),
1978
- onClose ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(IconButton, { icon: "x", label: msg.inlineMessageDismiss, size: "sm", onPress: onClose }) : null
2288
+ onClose ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(IconButton, { icon: "x", label: msg.inlineMessageDismiss, size: "sm", onPress: onClose }) : null
1979
2289
  ]
1980
2290
  }
1981
2291
  );
1982
2292
  }
1983
2293
 
1984
- // src/components/feedback/ProgressBar.tsx
1985
- var import_react_aria_components25 = require("react-aria-components");
1986
- var import_jsx_runtime38 = require("react/jsx-runtime");
1987
- function ProgressBar({
1988
- value = 0,
1989
- minValue = 0,
1990
- maxValue = 100,
1991
- label,
1992
- showValue = true,
1993
- isIndeterminate,
1994
- status = "informative",
1995
- size = "md",
1996
- className,
1997
- style
1998
- }) {
1999
- return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2000
- import_react_aria_components25.ProgressBar,
2001
- {
2002
- className: cx("pire-progress", className),
2003
- "data-status": status,
2004
- "data-size": size,
2005
- value,
2006
- minValue,
2007
- maxValue,
2008
- isIndeterminate,
2009
- style,
2010
- children: ({ percentage, valueText }) => /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_jsx_runtime38.Fragment, { children: [
2011
- label || showValue ? /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("div", { className: "pire-progress-head", children: [
2012
- label ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_react_aria_components25.Label, { children: label }) : /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", {}),
2013
- showValue && !isIndeterminate ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "pire-numeric", children: valueText }) : null
2014
- ] }) : null,
2015
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "pire-progress-track", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "pire-progress-fill", style: { width: `${isIndeterminate ? 40 : percentage}%` } }) })
2016
- ] })
2017
- }
2018
- );
2019
- }
2020
-
2021
2294
  // src/components/feedback/Toast.tsx
2022
- var React11 = __toESM(require("react"), 1);
2023
- var import_jsx_runtime39 = require("react/jsx-runtime");
2295
+ var React12 = __toESM(require("react"), 1);
2296
+ var import_jsx_runtime41 = require("react/jsx-runtime");
2024
2297
  var KIND_ICON2 = {
2025
2298
  info: "info",
2026
2299
  success: "check-circle-2",
@@ -2029,7 +2302,7 @@ var KIND_ICON2 = {
2029
2302
  };
2030
2303
  function Toast({ kind = "success", onClose, position = "bottom-center", children, className, ...rest }) {
2031
2304
  const msg = usePireMessages();
2032
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(
2305
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(
2033
2306
  "div",
2034
2307
  {
2035
2308
  className: cx("pire-toast", className),
@@ -2038,40 +2311,40 @@ function Toast({ kind = "success", onClose, position = "bottom-center", children
2038
2311
  "aria-live": kind === "error" ? "assertive" : "polite",
2039
2312
  ...rest,
2040
2313
  children: [
2041
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Icon, { name: KIND_ICON2[kind], size: 16 }),
2042
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { style: { flex: 1 }, children }),
2043
- onClose ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(IconButton, { icon: "x", label: msg.toastDismiss, size: "sm", variant: "inverse", onPress: onClose }) : null
2314
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Icon, { name: KIND_ICON2[kind], size: 16 }),
2315
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { style: { flex: 1 }, children }),
2316
+ onClose ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(IconButton, { icon: "x", label: msg.toastDismiss, size: "sm", variant: "inverse", onPress: onClose }) : null
2044
2317
  ]
2045
2318
  }
2046
2319
  );
2047
2320
  }
2048
- var ToastContext = React11.createContext(null);
2321
+ var ToastContext = React12.createContext(null);
2049
2322
  function ToastProvider({ children, timeout = 6e3 }) {
2050
2323
  const msg = usePireMessages();
2051
- const [toasts, setToasts] = React11.useState([]);
2052
- const close = React11.useCallback((id) => setToasts((t) => t.filter((x) => x.id !== id)), []);
2053
- const add = React11.useCallback((toast) => {
2324
+ const [toasts, setToasts] = React12.useState([]);
2325
+ const close = React12.useCallback((id) => setToasts((t) => t.filter((x) => x.id !== id)), []);
2326
+ const add = React12.useCallback((toast) => {
2054
2327
  const id = Math.random().toString(36).slice(2);
2055
2328
  setToasts((t) => [...t, { ...toast, id }]);
2056
2329
  const ms = toast.timeout ?? timeout;
2057
2330
  if (ms > 0) setTimeout(() => close(id), ms);
2058
2331
  return id;
2059
2332
  }, [close, timeout]);
2060
- const value = React11.useMemo(() => ({ add, close }), [add, close]);
2061
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(ToastContext.Provider, { value, children: [
2333
+ const value = React12.useMemo(() => ({ add, close }), [add, close]);
2334
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(ToastContext.Provider, { value, children: [
2062
2335
  children,
2063
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: "pire-toast-region", role: "region", "aria-label": msg.toastRegionLabel, children: toasts.map((t) => /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Toast, { kind: t.kind, onClose: () => close(t.id), style: { position: "static", transform: "none" }, children: t.message }, t.id)) })
2336
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "pire-toast-region", role: "region", "aria-label": msg.toastRegionLabel, children: toasts.map((t) => /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(Toast, { kind: t.kind, onClose: () => close(t.id), style: { position: "static", transform: "none" }, children: t.message }, t.id)) })
2064
2337
  ] });
2065
2338
  }
2066
2339
  function useToast() {
2067
- const ctx = React11.useContext(ToastContext);
2340
+ const ctx = React12.useContext(ToastContext);
2068
2341
  if (!ctx) throw new Error("useToast must be used inside <ToastProvider>");
2069
2342
  return ctx;
2070
2343
  }
2071
2344
 
2072
2345
  // src/components/data/KpiTile.tsx
2073
- var import_react_aria_components26 = require("react-aria-components");
2074
- var import_jsx_runtime40 = require("react/jsx-runtime");
2346
+ var import_react_aria_components28 = require("react-aria-components");
2347
+ var import_jsx_runtime42 = require("react/jsx-runtime");
2075
2348
  function KpiTile({
2076
2349
  label,
2077
2350
  value,
@@ -2087,50 +2360,50 @@ function KpiTile({
2087
2360
  style
2088
2361
  }) {
2089
2362
  const tone = deltaTone ?? (deltaDirection === "down" ? "negative" : "positive");
2090
- const body = /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_jsx_runtime40.Fragment, { children: [
2091
- /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("span", { className: "pire-kpi-label", children: [
2092
- icon ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Icon, { name: icon, size: 16 }) : null,
2363
+ const body = /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, { children: [
2364
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("span", { className: "pire-kpi-label", children: [
2365
+ icon ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Icon, { name: icon, size: 16 }) : null,
2093
2366
  label
2094
2367
  ] }),
2095
- /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("span", { className: "pire-kpi-value", children: [
2368
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("span", { className: "pire-kpi-value", children: [
2096
2369
  value,
2097
- unit ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("span", { className: "pire-kpi-unit", children: unit }) : null
2370
+ unit ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "pire-kpi-unit", children: unit }) : null
2098
2371
  ] }),
2099
- delta ? /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("span", { className: "pire-kpi-delta", "data-tone": tone, children: [
2100
- deltaDirection ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Icon, { name: deltaDirection === "up" ? "trending-up" : "trending-down", size: 12 }) : null,
2372
+ delta ? /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("span", { className: "pire-kpi-delta", "data-tone": tone, children: [
2373
+ deltaDirection ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Icon, { name: deltaDirection === "up" ? "trending-up" : "trending-down", size: 12 }) : null,
2101
2374
  delta
2102
2375
  ] }) : null,
2103
- footnote ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("span", { className: "pire-kpi-foot", children: footnote }) : null
2376
+ footnote ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "pire-kpi-foot", children: footnote }) : null
2104
2377
  ] });
2105
2378
  const props = { className: cx("pire-kpi", className), "data-status": status, style };
2106
- return onPress ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_react_aria_components26.Button, { ...props, "data-pressable": "true", onPress, children: body }) : /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { ...props, children: body });
2379
+ return onPress ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_react_aria_components28.Button, { ...props, "data-pressable": "true", onPress, children: body }) : /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { ...props, children: body });
2107
2380
  }
2108
2381
 
2109
2382
  // src/components/data/ObjectHeader.tsx
2110
- var import_jsx_runtime41 = require("react/jsx-runtime");
2383
+ var import_jsx_runtime43 = require("react/jsx-runtime");
2111
2384
  function ObjectHeader({ title, subtitle, id, breadcrumb, badge, facts, actions, className, ...rest }) {
2112
- return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("header", { className: cx("pire-objheader", className), ...rest, children: [
2385
+ return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("header", { className: cx("pire-objheader", className), ...rest, children: [
2113
2386
  breadcrumb,
2114
- /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "pire-objheader-row", children: [
2115
- /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { style: { minWidth: 0 }, children: [
2116
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("h1", { className: "pire-objheader-title", children: title }),
2117
- subtitle || id ? /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "pire-objheader-sub", children: [
2387
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("div", { className: "pire-objheader-row", children: [
2388
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("div", { style: { minWidth: 0 }, children: [
2389
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("h1", { className: "pire-objheader-title", children: title }),
2390
+ subtitle || id ? /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("div", { className: "pire-objheader-sub", children: [
2118
2391
  subtitle,
2119
- id ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "pire-objheader-id", children: id }) : null
2392
+ id ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("span", { className: "pire-objheader-id", children: id }) : null
2120
2393
  ] }) : null
2121
2394
  ] }),
2122
2395
  badge,
2123
- actions ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "pire-objheader-actions", children: actions }) : null
2396
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("div", { className: "pire-objheader-actions", children: actions }) : null
2124
2397
  ] }),
2125
- facts?.length ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("dl", { className: "pire-facts", style: { margin: 0 }, children: facts.map((fact) => /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { children: [
2126
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("dt", { className: "pire-fact-label", children: fact.label }),
2127
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("dd", { className: "pire-fact-value", "data-numeric": fact.numeric ? "true" : void 0, style: { margin: 0 }, children: fact.value })
2398
+ facts?.length ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("dl", { className: "pire-facts", style: { margin: 0 }, children: facts.map((fact) => /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("div", { children: [
2399
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("dt", { className: "pire-fact-label", children: fact.label }),
2400
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("dd", { className: "pire-fact-value", "data-numeric": fact.numeric ? "true" : void 0, style: { margin: 0 }, children: fact.value })
2128
2401
  ] }, fact.label)) }) : null
2129
2402
  ] });
2130
2403
  }
2131
2404
 
2132
2405
  // src/components/data/FilterBar.tsx
2133
- var import_jsx_runtime42 = require("react/jsx-runtime");
2406
+ var import_jsx_runtime44 = require("react/jsx-runtime");
2134
2407
  function FilterBar({
2135
2408
  children,
2136
2409
  activeFilters = [],
@@ -2147,66 +2420,66 @@ function FilterBar({
2147
2420
  const label = useMessage("filterBarLabel", rest["aria-label"]);
2148
2421
  const go = useMessage("filterBarGo", goLabel);
2149
2422
  const clearAll = useMessage("filterBarClearAll", clearAllLabel);
2150
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("section", { className: cx("pire-filterbar", className), ...rest, "aria-label": label, children: [
2151
- /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "pire-filterbar-controls", children: [
2423
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("section", { className: cx("pire-filterbar", className), ...rest, "aria-label": label, children: [
2424
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("div", { className: "pire-filterbar-controls", children: [
2152
2425
  children,
2153
- onGo ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Button, { variant: "primary", onPress: onGo, children: go }) : null
2426
+ onGo ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(Button, { variant: "primary", onPress: onGo, children: go }) : null
2154
2427
  ] }),
2155
- activeFilters.length || resultLabel || actions ? /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "pire-filterbar-foot", children: [
2156
- activeFilters.map((filter) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Tag, { onRemove: onRemoveFilter ? () => onRemoveFilter(filter.id) : void 0, children: filter.label }, filter.id)),
2157
- activeFilters.length && onClear ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Button, { variant: "tertiary", size: "sm", onPress: onClear, children: clearAll }) : null,
2158
- resultLabel ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "pire-filterbar-result", "aria-live": "polite", children: resultLabel }) : null,
2159
- actions ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "pire-filterbar-actions", children: actions }) : null
2428
+ activeFilters.length || resultLabel || actions ? /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("div", { className: "pire-filterbar-foot", children: [
2429
+ activeFilters.map((filter) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(Tag, { onRemove: onRemoveFilter ? () => onRemoveFilter(filter.id) : void 0, children: filter.label }, filter.id)),
2430
+ activeFilters.length && onClear ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(Button, { variant: "tertiary", size: "sm", onPress: onClear, children: clearAll }) : null,
2431
+ resultLabel ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "pire-filterbar-result", "aria-live": "polite", children: resultLabel }) : null,
2432
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("div", { className: "pire-filterbar-actions", children: actions }) : null
2160
2433
  ] }) : null
2161
2434
  ] });
2162
2435
  }
2163
2436
 
2164
2437
  // src/components/data/DescriptionList.tsx
2165
- var import_jsx_runtime43 = require("react/jsx-runtime");
2438
+ var import_jsx_runtime45 = require("react/jsx-runtime");
2166
2439
  function DescriptionList({ items, layout = "rows", columns = 3, className, style, ...rest }) {
2167
- return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
2440
+ return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
2168
2441
  "dl",
2169
2442
  {
2170
2443
  className: cx("pire-dl", className),
2171
2444
  "data-layout": layout,
2172
2445
  style: { ...layout === "grid" ? { "--pire-dl-cols": columns } : null, ...style },
2173
2446
  ...rest,
2174
- children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("div", { className: "pire-dl-row", "data-emphasis": item.emphasis ? "true" : void 0, children: [
2175
- /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("dt", { className: "pire-dl-term", children: [
2447
+ children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "pire-dl-row", "data-emphasis": item.emphasis ? "true" : void 0, children: [
2448
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("dt", { className: "pire-dl-term", children: [
2176
2449
  item.label,
2177
2450
  item.hint
2178
2451
  ] }),
2179
- /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("dd", { className: "pire-dl-value", "data-numeric": item.numeric ? "true" : void 0, children: item.value })
2452
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("dd", { className: "pire-dl-value", "data-numeric": item.numeric ? "true" : void 0, children: item.value })
2180
2453
  ] }, i))
2181
2454
  }
2182
2455
  );
2183
2456
  }
2184
2457
 
2185
2458
  // src/components/data/Timeline.tsx
2186
- var import_jsx_runtime44 = require("react/jsx-runtime");
2459
+ var import_jsx_runtime46 = require("react/jsx-runtime");
2187
2460
  function Timeline({ entries, reverse = false, className, ...rest }) {
2188
2461
  const list = reverse ? [...entries].reverse() : entries;
2189
- return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("ol", { className: cx("pire-timeline", className), ...rest, children: list.map((entry, i) => /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("li", { className: "pire-timeline-item", children: [
2190
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "pire-timeline-time", children: entry.time }),
2191
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "pire-timeline-text", children: entry.event }),
2192
- entry.actor ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "pire-timeline-actor", children: entry.actor }) : null
2462
+ return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("ol", { className: cx("pire-timeline", className), ...rest, children: list.map((entry, i) => /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("li", { className: "pire-timeline-item", children: [
2463
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "pire-timeline-time", children: entry.time }),
2464
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "pire-timeline-text", children: entry.event }),
2465
+ entry.actor ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "pire-timeline-actor", children: entry.actor }) : null
2193
2466
  ] }, entry.id ?? i)) });
2194
2467
  }
2195
2468
 
2196
2469
  // src/components/data/LinkList.tsx
2197
- var import_react_aria_components27 = require("react-aria-components");
2198
- var import_jsx_runtime45 = require("react/jsx-runtime");
2470
+ var import_react_aria_components29 = require("react-aria-components");
2471
+ var import_jsx_runtime47 = require("react/jsx-runtime");
2199
2472
  function LinkList({ items, onSelect, className, ...rest }) {
2200
- return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: cx("pire-linklist", className), role: "list", ...rest, children: items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_react_aria_components27.Button, { className: "pire-linklist-item", onPress: () => onSelect?.(item.id), children: [
2201
- item.icon ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(Icon, { name: item.icon, size: 16, style: { color: "var(--text-secondary)" } }) : null,
2202
- item.key ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "pire-linklist-key", children: item.key }) : null,
2203
- item.text ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "pire-linklist-text", children: item.text }) : null,
2473
+ return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: cx("pire-linklist", className), role: "list", ...rest, children: items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(import_react_aria_components29.Button, { className: "pire-linklist-item", onPress: () => onSelect?.(item.id), children: [
2474
+ item.icon ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Icon, { name: item.icon, size: 16, style: { color: "var(--text-secondary)" } }) : null,
2475
+ item.key ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: "pire-linklist-key", children: item.key }) : null,
2476
+ item.text ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: "pire-linklist-text", children: item.text }) : null,
2204
2477
  item.trailing
2205
2478
  ] }, item.id)) });
2206
2479
  }
2207
2480
 
2208
2481
  // src/components/layout/PageBand.tsx
2209
- var import_jsx_runtime46 = require("react/jsx-runtime");
2482
+ var import_jsx_runtime48 = require("react/jsx-runtime");
2210
2483
  function PageBand({
2211
2484
  surface = "card",
2212
2485
  hasBorder = true,
@@ -2214,7 +2487,7 @@ function PageBand({
2214
2487
  className,
2215
2488
  ...rest
2216
2489
  }) {
2217
- return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
2490
+ return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
2218
2491
  "div",
2219
2492
  {
2220
2493
  className: cx("pire-pageband", className),
@@ -2227,56 +2500,56 @@ function PageBand({
2227
2500
  }
2228
2501
 
2229
2502
  // src/components/layout/PageHeader.tsx
2230
- var import_jsx_runtime47 = require("react/jsx-runtime");
2503
+ var import_jsx_runtime49 = require("react/jsx-runtime");
2231
2504
  function PageHeader({ title, subtitle, actions, className, ...rest }) {
2232
- return /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("header", { className: cx("pire-pageheader", className), ...rest, children: [
2233
- /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { style: { minWidth: 0 }, children: [
2234
- /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("h1", { className: "pire-pageheader-title", children: title }),
2235
- subtitle ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("p", { className: "pire-pageheader-sub", children: subtitle }) : null
2505
+ return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("header", { className: cx("pire-pageheader", className), ...rest, children: [
2506
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { style: { minWidth: 0 }, children: [
2507
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("h1", { className: "pire-pageheader-title", children: title }),
2508
+ subtitle ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("p", { className: "pire-pageheader-sub", children: subtitle }) : null
2236
2509
  ] }),
2237
- actions ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: "pire-pageheader-actions", children: actions }) : null
2510
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "pire-pageheader-actions", children: actions }) : null
2238
2511
  ] });
2239
2512
  }
2240
2513
 
2241
2514
  // src/components/layout/SectionHeader.tsx
2242
- var import_jsx_runtime48 = require("react/jsx-runtime");
2515
+ var import_jsx_runtime50 = require("react/jsx-runtime");
2243
2516
  function SectionHeader({ title, meta, actions, className, ...rest }) {
2244
- return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: cx("pire-sectionhead", className), ...rest, children: [
2245
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "pire-eyebrow", children: title }),
2246
- meta ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { style: { font: "var(--type-caption)", color: "var(--text-tertiary)" }, children: meta }) : null,
2247
- actions ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "pire-sectionhead-actions", children: actions }) : null
2517
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)("div", { className: cx("pire-sectionhead", className), ...rest, children: [
2518
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("span", { className: "pire-eyebrow", children: title }),
2519
+ meta ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("span", { style: { font: "var(--type-caption)", color: "var(--text-tertiary)" }, children: meta }) : null,
2520
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("div", { className: "pire-sectionhead-actions", children: actions }) : null
2248
2521
  ] });
2249
2522
  }
2250
2523
 
2251
2524
  // src/components/layout/SelectionBar.tsx
2252
- var import_jsx_runtime49 = require("react/jsx-runtime");
2525
+ var import_jsx_runtime51 = require("react/jsx-runtime");
2253
2526
  function SelectionBar({ count, noun = "record", children, actions, className, ...rest }) {
2254
2527
  if (!count) return null;
2255
- return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: cx("pire-selectionbar", className), role: "status", "aria-live": "polite", ...rest, children: [
2256
- /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("span", { className: "pire-selectionbar-count", children: [
2528
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { className: cx("pire-selectionbar", className), role: "status", "aria-live": "polite", ...rest, children: [
2529
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("span", { className: "pire-selectionbar-count", children: [
2257
2530
  count.toLocaleString(),
2258
2531
  " ",
2259
2532
  noun,
2260
2533
  count === 1 ? "" : "s",
2261
2534
  " selected"
2262
2535
  ] }),
2263
- children ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { style: { color: "var(--text-secondary)", font: "var(--type-caption)" }, children }) : null,
2264
- actions ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "pire-selectionbar-actions", children: actions }) : null
2536
+ children ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("span", { style: { color: "var(--text-secondary)", font: "var(--type-caption)" }, children }) : null,
2537
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "pire-selectionbar-actions", children: actions }) : null
2265
2538
  ] });
2266
2539
  }
2267
2540
 
2268
2541
  // src/components/layout/FooterBar.tsx
2269
- var import_jsx_runtime50 = require("react/jsx-runtime");
2542
+ var import_jsx_runtime52 = require("react/jsx-runtime");
2270
2543
  function FooterBar({ note, actions, children, className, ...rest }) {
2271
- return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)("footer", { className: cx("pire-footerbar", className), ...rest, children: [
2272
- note ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("span", { className: "pire-footerbar-note", children: note }) : null,
2544
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("footer", { className: cx("pire-footerbar", className), ...rest, children: [
2545
+ note ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("span", { className: "pire-footerbar-note", children: note }) : null,
2273
2546
  children,
2274
- actions ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("div", { className: "pire-footerbar-actions", children: actions }) : null
2547
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "pire-footerbar-actions", children: actions }) : null
2275
2548
  ] });
2276
2549
  }
2277
2550
 
2278
2551
  // src/components/patterns/ConfirmDialog.tsx
2279
- var import_jsx_runtime51 = require("react/jsx-runtime");
2552
+ var import_jsx_runtime53 = require("react/jsx-runtime");
2280
2553
  function ConfirmDialog({
2281
2554
  isOpen,
2282
2555
  title,
@@ -2290,7 +2563,7 @@ function ConfirmDialog({
2290
2563
  onConfirm,
2291
2564
  onCancel
2292
2565
  }) {
2293
- return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(
2566
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(
2294
2567
  Dialog,
2295
2568
  {
2296
2569
  isOpen,
@@ -2300,12 +2573,12 @@ function ConfirmDialog({
2300
2573
  onClose: onCancel,
2301
2574
  isDismissable: !isBusy,
2302
2575
  showClose: false,
2303
- footer: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_jsx_runtime51.Fragment, { children: [
2304
- /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Button, { variant: "tertiary", isDisabled: isBusy, onPress: onCancel, children: cancelLabel }),
2305
- /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Button, { variant: tone === "danger" ? "danger" : "primary", isDisabled: isBusy, onPress: onConfirm, children: isBusy ? "Working\u2026" : confirmLabel })
2576
+ footer: /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_jsx_runtime53.Fragment, { children: [
2577
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(Button, { variant: "tertiary", isDisabled: isBusy, onPress: onCancel, children: cancelLabel }),
2578
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(Button, { variant: tone === "danger" ? "danger" : "primary", isDisabled: isBusy, onPress: onConfirm, children: isBusy ? "Working\u2026" : confirmLabel })
2306
2579
  ] }),
2307
2580
  children: [
2308
- consequence ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(InlineMessage, { kind: tone === "danger" ? "error" : "warning", style: { marginBottom: children ? "var(--sp-3)" : 0 }, children: consequence }) : null,
2581
+ consequence ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(InlineMessage, { kind: tone === "danger" ? "error" : "warning", style: { marginBottom: children ? "var(--sp-3)" : 0 }, children: consequence }) : null,
2309
2582
  children
2310
2583
  ]
2311
2584
  }
@@ -2313,12 +2586,12 @@ function ConfirmDialog({
2313
2586
  }
2314
2587
 
2315
2588
  // src/components/patterns/SidePanel.tsx
2316
- var import_react_aria_components28 = require("react-aria-components");
2317
- var import_jsx_runtime52 = require("react/jsx-runtime");
2589
+ var import_react_aria_components30 = require("react-aria-components");
2590
+ var import_jsx_runtime54 = require("react/jsx-runtime");
2318
2591
  function SidePanel({ isOpen, title, subtitle, width = 400, children, footer, onClose, className }) {
2319
2592
  const msg = usePireMessages();
2320
- return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
2321
- import_react_aria_components28.ModalOverlay,
2593
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
2594
+ import_react_aria_components30.ModalOverlay,
2322
2595
  {
2323
2596
  className: "pire-sidepanel-overlay",
2324
2597
  isOpen,
@@ -2326,34 +2599,138 @@ function SidePanel({ isOpen, title, subtitle, width = 400, children, footer, onC
2326
2599
  onOpenChange: (o) => {
2327
2600
  if (!o) onClose?.();
2328
2601
  },
2329
- children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_react_aria_components28.Modal, { className: cx("pire-sidepanel", className), style: { width }, children: /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_react_aria_components28.Dialog, { className: "pire-dialog", style: { height: "100%" }, children: [
2330
- /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("header", { className: "pire-dialog-head", children: [
2331
- /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
2332
- /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_react_aria_components28.Heading, { slot: "title", className: "pire-dialog-title", children: title }),
2333
- subtitle ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("p", { className: "pire-dialog-sub", style: { margin: 0 }, children: subtitle }) : null
2602
+ children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_aria_components30.Modal, { className: cx("pire-sidepanel", className), style: { width }, children: /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_react_aria_components30.Dialog, { className: "pire-dialog", style: { height: "100%" }, children: [
2603
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("header", { className: "pire-dialog-head", children: [
2604
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
2605
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_react_aria_components30.Heading, { slot: "title", className: "pire-dialog-title", children: title }),
2606
+ subtitle ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { className: "pire-dialog-sub", style: { margin: 0 }, children: subtitle }) : null
2334
2607
  ] }),
2335
- /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(IconButton, { icon: "x", label: msg.sidePanelClose, size: "sm", onPress: onClose })
2608
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(IconButton, { icon: "x", label: msg.sidePanelClose, size: "sm", onPress: onClose })
2336
2609
  ] }),
2337
- /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "pire-dialog-body", style: { flex: 1 }, children }),
2338
- footer ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("footer", { className: "pire-dialog-foot", children: footer }) : null
2610
+ /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "pire-dialog-body", style: { flex: 1 }, children }),
2611
+ footer ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("footer", { className: "pire-dialog-foot", children: footer }) : null
2339
2612
  ] }) })
2340
2613
  }
2341
2614
  );
2342
2615
  }
2343
2616
 
2344
2617
  // src/components/patterns/EmptyState.tsx
2345
- var import_jsx_runtime53 = require("react/jsx-runtime");
2618
+ var import_jsx_runtime55 = require("react/jsx-runtime");
2346
2619
  function EmptyState({ icon = "file-text", title, action, compact, children, className, ...rest }) {
2347
- return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)("div", { className: cx("pire-empty", className), "data-compact": compact ? "true" : void 0, ...rest, children: [
2348
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(Icon, { name: icon, size: 24, className: "pire-empty-icon" }),
2349
- title ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("p", { className: "pire-empty-title", style: { margin: 0 }, children: title }) : null,
2350
- children ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)("p", { className: "pire-empty-body", style: { margin: 0 }, children }) : null,
2620
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: cx("pire-empty", className), "data-compact": compact ? "true" : void 0, ...rest, children: [
2621
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(Icon, { name: icon, size: 24, className: "pire-empty-icon" }),
2622
+ title ? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("p", { className: "pire-empty-title", style: { margin: 0 }, children: title }) : null,
2623
+ children ? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("p", { className: "pire-empty-body", style: { margin: 0 }, children }) : null,
2351
2624
  action
2352
2625
  ] });
2353
2626
  }
2354
2627
 
2628
+ // src/components/patterns/FileDropZone.tsx
2629
+ var React13 = __toESM(require("react"), 1);
2630
+ var import_react_aria_components31 = require("react-aria-components");
2631
+ var import_jsx_runtime56 = require("react/jsx-runtime");
2632
+ var isImage2 = (file) => file.type.startsWith("image/");
2633
+ function FileDropZone({
2634
+ label,
2635
+ value,
2636
+ defaultValue,
2637
+ onChange,
2638
+ acceptedFileTypes,
2639
+ allowsMultiple,
2640
+ maxSize,
2641
+ onError,
2642
+ showPreview = true,
2643
+ uploadProgress,
2644
+ promptLabel,
2645
+ height = "regular",
2646
+ description,
2647
+ errorMessage,
2648
+ isInvalid,
2649
+ isDisabled,
2650
+ isReadOnly,
2651
+ isRequired,
2652
+ fullWidth = true,
2653
+ className,
2654
+ style
2655
+ }) {
2656
+ const msg = usePireMessages();
2657
+ const [uncontrolled, setUncontrolled] = React13.useState(defaultValue ?? []);
2658
+ const files = value ?? uncontrolled;
2659
+ const created = React13.useRef([]);
2660
+ React13.useEffect(() => () => {
2661
+ for (const url of created.current) URL.revokeObjectURL(url);
2662
+ }, []);
2663
+ const commit = (next) => {
2664
+ if (value === void 0) setUncontrolled(next);
2665
+ onChange?.(next);
2666
+ };
2667
+ const accept = (picked) => {
2668
+ if (isDisabled || isReadOnly || !picked.length) return;
2669
+ const { accepted, rejected } = screenFiles(picked, { maxSize, acceptedFileTypes });
2670
+ if (rejected.length) onError?.(rejected);
2671
+ if (!accepted.length) return;
2672
+ const wrapped = accepted.map((file) => {
2673
+ const previewUrl = showPreview && isImage2(file) ? URL.createObjectURL(file) : void 0;
2674
+ if (previewUrl) created.current.push(previewUrl);
2675
+ return { file, previewUrl };
2676
+ });
2677
+ commit(allowsMultiple ? [...files, ...wrapped] : wrapped.slice(0, 1));
2678
+ };
2679
+ const remove = (target) => commit(files.filter((f) => f.file !== target));
2680
+ return /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", { className: cx("pire-field", className), style, "data-full-width": String(fullWidth), children: [
2681
+ label ? /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("span", { className: "pire-field-label", children: [
2682
+ label,
2683
+ isRequired ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
2684
+ ] }) : null,
2685
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(
2686
+ import_react_aria_components31.DropZone,
2687
+ {
2688
+ className: "pire-dropzone",
2689
+ "data-height": height,
2690
+ isDisabled: isDisabled || isReadOnly,
2691
+ onDrop: async (e) => {
2692
+ const dropped = await Promise.all(
2693
+ e.items.filter(import_react_aria_components31.isFileDropItem).map((item) => item.getFile())
2694
+ );
2695
+ accept(dropped);
2696
+ },
2697
+ children: [
2698
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Icon, { name: "download", size: 24, className: "pire-dropzone-icon" }),
2699
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "pire-dropzone-prompt", children: promptLabel ?? msg.fileDropZonePrompt }),
2700
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
2701
+ import_react_aria_components31.FileTrigger,
2702
+ {
2703
+ acceptedFileTypes,
2704
+ allowsMultiple,
2705
+ onSelect: (list) => accept(list ? [...list] : []),
2706
+ children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Button, { variant: "secondary", isDisabled: isDisabled || isReadOnly, children: msg.fileUploadChoose })
2707
+ }
2708
+ )
2709
+ ]
2710
+ }
2711
+ ),
2712
+ files.length ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("ul", { className: "pire-fileupload-list", children: files.map(({ file, previewUrl }) => /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("li", { className: "pire-fileupload-item", children: [
2713
+ previewUrl ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("img", { className: "pire-fileupload-thumb", src: previewUrl, alt: "" }) : /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Icon, { name: "file-text", size: 16, className: "pire-fileupload-icon" }),
2714
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "pire-fileupload-name", children: file.name }),
2715
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "pire-fileupload-size", children: formatFileSize(file.size) }),
2716
+ isDisabled || isReadOnly ? null : /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
2717
+ IconButton,
2718
+ {
2719
+ icon: "x",
2720
+ size: "sm",
2721
+ label: msg.fileUploadRemoveNamed.replace("{name}", file.name),
2722
+ onPress: () => remove(file)
2723
+ }
2724
+ )
2725
+ ] }, `${file.name}-${file.size}-${file.lastModified}`)) }) : null,
2726
+ uploadProgress != null ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(ProgressBar, { value: uploadProgress, label: msg.fileUploadUploading }) : null,
2727
+ description ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "pire-field-hint", children: description }) : null,
2728
+ isInvalid && errorMessage ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)("span", { className: "pire-field-error", children: errorMessage }) : null
2729
+ ] });
2730
+ }
2731
+
2355
2732
  // src/index.ts
2356
- var import_react_aria_components29 = require("react-aria-components");
2733
+ var import_react_aria_components32 = require("react-aria-components");
2357
2734
  // Annotate the CommonJS export names for ESM import in node:
2358
2735
  0 && (module.exports = {
2359
2736
  Avatar,
@@ -2366,10 +2743,13 @@ var import_react_aria_components29 = require("react-aria-components");
2366
2743
  ConfirmDialog,
2367
2744
  DataTable,
2368
2745
  DatePicker,
2746
+ DateRangePicker,
2369
2747
  DescriptionList,
2370
2748
  Dialog,
2371
2749
  DialogTrigger,
2372
2750
  EmptyState,
2751
+ FileDropZone,
2752
+ FileUpload,
2373
2753
  FilterBar,
2374
2754
  FooterBar,
2375
2755
  FormField,
@@ -2425,6 +2805,8 @@ var import_react_aria_components29 = require("react-aria-components");
2425
2805
  configureIcons,
2426
2806
  enMessages,
2427
2807
  esMessages,
2808
+ formatFileSize,
2809
+ rangeLengthInDays,
2428
2810
  usePireMessages,
2429
2811
  useToast
2430
2812
  });