@orianatech/pire 0.6.0 → 0.7.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.js CHANGED
@@ -252,9 +252,22 @@ function Tooltip({ label, placement = "top", delay = 500, children }) {
252
252
  }
253
253
 
254
254
  // src/components/core/IconButton.tsx
255
- import { jsx as jsx4 } from "react/jsx-runtime";
256
- var IconButton = React2.forwardRef(function IconButton2({ icon, label, size = "md", variant = "tertiary", selected, hideTooltip, className, ...rest }, ref) {
257
- const button = /* @__PURE__ */ jsx4(
255
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
256
+ var IconButton = React2.forwardRef(function IconButton2({
257
+ icon,
258
+ label,
259
+ size = "md",
260
+ variant = "tertiary",
261
+ selected,
262
+ hideTooltip,
263
+ count,
264
+ countMax = 9,
265
+ countVariant = "number",
266
+ className,
267
+ ...rest
268
+ }, ref) {
269
+ const showsCount = count != null && count > 0;
270
+ const button = /* @__PURE__ */ jsxs3(
258
271
  AriaButton2,
259
272
  {
260
273
  ref,
@@ -264,15 +277,19 @@ var IconButton = React2.forwardRef(function IconButton2({ icon, label, size = "m
264
277
  "data-size": size,
265
278
  "data-variant": variant,
266
279
  "data-selected": selected ? "true" : void 0,
280
+ "data-has-count": showsCount ? "true" : void 0,
267
281
  ...rest,
268
- children: /* @__PURE__ */ jsx4(Icon, { name: icon, size: size === "lg" ? 20 : 16 })
282
+ children: [
283
+ /* @__PURE__ */ jsx4(Icon, { name: icon, size: size === "lg" ? 20 : 16 }),
284
+ showsCount ? /* @__PURE__ */ jsx4("span", { className: "pire-iconbtn-count", "data-variant": countVariant, "aria-hidden": "true", children: countVariant === "number" ? count > countMax ? `${countMax}+` : count : null }) : null
285
+ ]
269
286
  }
270
287
  );
271
288
  return hideTooltip ? button : /* @__PURE__ */ jsx4(Tooltip, { label, children: button });
272
289
  });
273
290
 
274
291
  // src/components/core/Badge.tsx
275
- import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
292
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
276
293
  var STATUS_ICON = {
277
294
  positive: "check-circle-2",
278
295
  critical: "alert-triangle",
@@ -281,7 +298,7 @@ var STATUS_ICON = {
281
298
  neutral: "circle"
282
299
  };
283
300
  function Badge({ children, status = "neutral", showIcon = true, className, ...rest }) {
284
- return /* @__PURE__ */ jsxs3("span", { className: cx("pire-badge", className), "data-status": status, ...rest, children: [
301
+ return /* @__PURE__ */ jsxs4("span", { className: cx("pire-badge", className), "data-status": status, ...rest, children: [
285
302
  showIcon ? /* @__PURE__ */ jsx5(Icon, { name: STATUS_ICON[status], size: 12 }) : null,
286
303
  children
287
304
  ] });
@@ -289,9 +306,9 @@ function Badge({ children, status = "neutral", showIcon = true, className, ...re
289
306
 
290
307
  // src/components/core/Tag.tsx
291
308
  import { Button as AriaButton3 } from "react-aria-components";
292
- import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
309
+ import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
293
310
  function Tag({ children, onRemove, isDisabled, className, ...rest }) {
294
- return /* @__PURE__ */ jsxs4("span", { className: cx("pire-tag", className), "data-disabled": isDisabled ? "true" : void 0, ...rest, children: [
311
+ return /* @__PURE__ */ jsxs5("span", { className: cx("pire-tag", className), "data-disabled": isDisabled ? "true" : void 0, ...rest, children: [
295
312
  children,
296
313
  onRemove ? /* @__PURE__ */ jsx6(
297
314
  AriaButton3,
@@ -307,12 +324,12 @@ function Tag({ children, onRemove, isDisabled, className, ...rest }) {
307
324
  }
308
325
 
309
326
  // src/components/core/Card.tsx
310
- import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
327
+ import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
311
328
  function Card({ title, subtitle, icon, actions, footer, interactive, children, className, ...rest }) {
312
- return /* @__PURE__ */ jsxs5("section", { className: cx("pire-card", className), "data-interactive": interactive ? "true" : void 0, ...rest, children: [
313
- title || actions ? /* @__PURE__ */ jsxs5("header", { className: "pire-card-head", children: [
329
+ return /* @__PURE__ */ jsxs6("section", { className: cx("pire-card", className), "data-interactive": interactive ? "true" : void 0, ...rest, children: [
330
+ title || actions ? /* @__PURE__ */ jsxs6("header", { className: "pire-card-head", children: [
314
331
  icon ? /* @__PURE__ */ jsx7(Icon, { name: icon, size: 20, style: { color: "var(--text-secondary)" } }) : null,
315
- /* @__PURE__ */ jsxs5("div", { style: { flex: 1, minWidth: 0 }, children: [
332
+ /* @__PURE__ */ jsxs6("div", { style: { flex: 1, minWidth: 0 }, children: [
316
333
  /* @__PURE__ */ jsx7("h3", { className: "pire-card-title", children: title }),
317
334
  subtitle ? /* @__PURE__ */ jsx7("p", { className: "pire-card-sub", style: { margin: 0 }, children: subtitle }) : null
318
335
  ] }),
@@ -343,7 +360,7 @@ function Avatar({ name, size = "md", src, className, ...rest }) {
343
360
  // src/components/core/SegmentedControl.tsx
344
361
  import * as React4 from "react";
345
362
  import { ToggleButtonGroup, ToggleButton } from "react-aria-components";
346
- import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
363
+ import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
347
364
  function SegmentedControl({
348
365
  options,
349
366
  value,
@@ -370,7 +387,7 @@ function SegmentedControl({
370
387
  const first = [...keys][0];
371
388
  if (first != null) onChange?.(String(first));
372
389
  },
373
- children: options.map((option) => /* @__PURE__ */ jsxs6(
390
+ children: options.map((option) => /* @__PURE__ */ jsxs7(
374
391
  ToggleButton,
375
392
  {
376
393
  id: option.id,
@@ -453,9 +470,9 @@ function Heading({
453
470
 
454
471
  // src/components/core/Link.tsx
455
472
  import { Link as AriaLink } from "react-aria-components";
456
- import { jsx as jsx12, jsxs as jsxs7 } from "react/jsx-runtime";
473
+ import { jsx as jsx12, jsxs as jsxs8 } from "react/jsx-runtime";
457
474
  function Link({ children, size, isExternal, className, rel, ...rest }) {
458
- return /* @__PURE__ */ jsxs7(
475
+ return /* @__PURE__ */ jsxs8(
459
476
  AriaLink,
460
477
  {
461
478
  className: cx("pire-link", className),
@@ -495,15 +512,15 @@ function Separator({
495
512
  }
496
513
 
497
514
  // src/components/forms/FormField.tsx
498
- import { jsx as jsx14, jsxs as jsxs8 } from "react/jsx-runtime";
515
+ import { jsx as jsx14, jsxs as jsxs9 } from "react/jsx-runtime";
499
516
  function FormField({ label, htmlFor, isRequired, hint, error, layout = "stacked", children, className, ...rest }) {
500
- return /* @__PURE__ */ jsxs8("div", { className: cx("pire-field", className), "data-layout": layout, ...rest, children: [
501
- /* @__PURE__ */ jsxs8("label", { className: "pire-field-label", htmlFor, children: [
517
+ return /* @__PURE__ */ jsxs9("div", { className: cx("pire-field", className), "data-layout": layout, ...rest, children: [
518
+ /* @__PURE__ */ jsxs9("label", { className: "pire-field-label", htmlFor, children: [
502
519
  label,
503
520
  isRequired ? /* @__PURE__ */ jsx14("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
504
521
  ] }),
505
522
  children,
506
- error ? /* @__PURE__ */ jsxs8("span", { className: "pire-field-error", role: "alert", children: [
523
+ error ? /* @__PURE__ */ jsxs9("span", { className: "pire-field-error", role: "alert", children: [
507
524
  /* @__PURE__ */ jsx14(Icon, { name: "alert-circle", size: 12 }),
508
525
  error
509
526
  ] }) : hint ? /* @__PURE__ */ jsx14("span", { className: "pire-field-hint", children: hint }) : null
@@ -512,7 +529,7 @@ function FormField({ label, htmlFor, isRequired, hint, error, layout = "stacked"
512
529
 
513
530
  // src/components/forms/Input.tsx
514
531
  import { TextField, Label, Input as AriaInput, Group, Text as Text2, FieldError } from "react-aria-components";
515
- import { jsx as jsx15, jsxs as jsxs9 } from "react/jsx-runtime";
532
+ import { jsx as jsx15, jsxs as jsxs10 } from "react/jsx-runtime";
516
533
  function Input({
517
534
  label,
518
535
  icon,
@@ -528,7 +545,7 @@ function Input({
528
545
  onChange,
529
546
  ...rest
530
547
  }) {
531
- return /* @__PURE__ */ jsxs9(
548
+ return /* @__PURE__ */ jsxs10(
532
549
  TextField,
533
550
  {
534
551
  className: cx("pire-field", className),
@@ -537,11 +554,11 @@ function Input({
537
554
  validationBehavior: "aria",
538
555
  ...rest,
539
556
  children: [
540
- label ? /* @__PURE__ */ jsxs9(Label, { className: "pire-field-label", children: [
557
+ label ? /* @__PURE__ */ jsxs10(Label, { className: "pire-field-label", children: [
541
558
  label,
542
559
  rest.isRequired ? /* @__PURE__ */ jsx15("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
543
560
  ] }) : null,
544
- /* @__PURE__ */ jsxs9(
561
+ /* @__PURE__ */ jsxs10(
545
562
  Group,
546
563
  {
547
564
  className: "pire-control",
@@ -566,7 +583,7 @@ function Input({
566
583
  // src/components/forms/TextArea.tsx
567
584
  import * as React5 from "react";
568
585
  import { TextField as TextField2, Label as Label2, TextArea as AriaTextArea, Group as Group2, Text as Text3, FieldError as FieldError2 } from "react-aria-components";
569
- import { jsx as jsx16, jsxs as jsxs10 } from "react/jsx-runtime";
586
+ import { jsx as jsx16, jsxs as jsxs11 } from "react/jsx-runtime";
570
587
  var useIsomorphicLayoutEffect = typeof document === "undefined" ? React5.useEffect : React5.useLayoutEffect;
571
588
  function TextArea({
572
589
  label,
@@ -607,7 +624,7 @@ function TextArea({
607
624
  }
608
625
  grow();
609
626
  }, [autoGrow, grow, rest.value]);
610
- return /* @__PURE__ */ jsxs10(
627
+ return /* @__PURE__ */ jsxs11(
611
628
  TextField2,
612
629
  {
613
630
  className: cx("pire-field", className),
@@ -616,7 +633,7 @@ function TextArea({
616
633
  validationBehavior: "aria",
617
634
  ...rest,
618
635
  children: [
619
- label ? /* @__PURE__ */ jsxs10(Label2, { className: "pire-field-label", children: [
636
+ label ? /* @__PURE__ */ jsxs11(Label2, { className: "pire-field-label", children: [
620
637
  label,
621
638
  rest.isRequired ? /* @__PURE__ */ jsx16("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
622
639
  ] }) : null,
@@ -660,7 +677,7 @@ import {
660
677
  Text as Text4,
661
678
  FieldError as FieldError3
662
679
  } from "react-aria-components";
663
- import { jsx as jsx17, jsxs as jsxs11 } from "react/jsx-runtime";
680
+ import { jsx as jsx17, jsxs as jsxs12 } from "react/jsx-runtime";
664
681
  var norm = (o) => typeof o === "string" ? { value: o, label: o, isDisabled: false } : o;
665
682
  function Select({
666
683
  label,
@@ -678,7 +695,7 @@ function Select({
678
695
  ...rest
679
696
  }) {
680
697
  const items = options.map(norm);
681
- return /* @__PURE__ */ jsxs11(
698
+ return /* @__PURE__ */ jsxs12(
682
699
  AriaSelect,
683
700
  {
684
701
  className: cx("pire-field", className),
@@ -690,11 +707,11 @@ function Select({
690
707
  validationBehavior: "aria",
691
708
  ...rest,
692
709
  children: [
693
- label ? /* @__PURE__ */ jsxs11(Label3, { className: "pire-field-label", children: [
710
+ label ? /* @__PURE__ */ jsxs12(Label3, { className: "pire-field-label", children: [
694
711
  label,
695
712
  rest.isRequired ? /* @__PURE__ */ jsx17("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
696
713
  ] }) : null,
697
- /* @__PURE__ */ jsxs11(
714
+ /* @__PURE__ */ jsxs12(
698
715
  AriaButton4,
699
716
  {
700
717
  className: "pire-control",
@@ -717,11 +734,11 @@ function Select({
717
734
 
718
735
  // src/components/forms/Checkbox.tsx
719
736
  import { Checkbox as AriaCheckbox } from "react-aria-components";
720
- import { Fragment, jsx as jsx18, jsxs as jsxs12 } from "react/jsx-runtime";
737
+ import { Fragment, jsx as jsx18, jsxs as jsxs13 } from "react/jsx-runtime";
721
738
  function Checkbox({ label, hint, children, className, ...rest }) {
722
- return /* @__PURE__ */ jsx18(AriaCheckbox, { className: cx("pire-choice", className), ...rest, children: ({ isSelected, isIndeterminate }) => /* @__PURE__ */ jsxs12(Fragment, { children: [
739
+ return /* @__PURE__ */ jsx18(AriaCheckbox, { className: cx("pire-choice", className), ...rest, children: ({ isSelected, isIndeterminate }) => /* @__PURE__ */ jsxs13(Fragment, { children: [
723
740
  /* @__PURE__ */ jsx18("span", { className: "pire-choice-box", "aria-hidden": "true", children: isIndeterminate ? /* @__PURE__ */ jsx18(Icon, { name: "minus", size: 12 }) : isSelected ? /* @__PURE__ */ jsx18(Icon, { name: "check", size: 12 }) : null }),
724
- /* @__PURE__ */ jsxs12("span", { children: [
741
+ /* @__PURE__ */ jsxs13("span", { children: [
725
742
  label ?? children,
726
743
  hint ? /* @__PURE__ */ jsx18("span", { className: "pire-choice-hint", children: hint }) : null
727
744
  ] })
@@ -736,9 +753,9 @@ import {
736
753
  Text as Text5,
737
754
  FieldError as FieldError4
738
755
  } from "react-aria-components";
739
- import { jsx as jsx19, jsxs as jsxs13 } from "react/jsx-runtime";
756
+ import { jsx as jsx19, jsxs as jsxs14 } from "react/jsx-runtime";
740
757
  function RadioGroup({ label, description, errorMessage, children, className, ...rest }) {
741
- return /* @__PURE__ */ jsxs13(AriaRadioGroup, { className: cx("pire-field", className), validationBehavior: "aria", ...rest, children: [
758
+ return /* @__PURE__ */ jsxs14(AriaRadioGroup, { className: cx("pire-field", className), validationBehavior: "aria", ...rest, children: [
742
759
  label ? /* @__PURE__ */ jsx19(Label4, { className: "pire-field-label", children: label }) : null,
743
760
  /* @__PURE__ */ jsx19("div", { className: "pire-radiogroup", children }),
744
761
  description ? /* @__PURE__ */ jsx19(Text5, { slot: "description", className: "pire-field-hint", children: description }) : null,
@@ -746,9 +763,9 @@ function RadioGroup({ label, description, errorMessage, children, className, ...
746
763
  ] });
747
764
  }
748
765
  function Radio({ label, hint, children, className, ...rest }) {
749
- return /* @__PURE__ */ jsxs13(AriaRadio, { className: cx("pire-choice", className), ...rest, children: [
766
+ return /* @__PURE__ */ jsxs14(AriaRadio, { className: cx("pire-choice", className), ...rest, children: [
750
767
  /* @__PURE__ */ jsx19("span", { className: "pire-choice-box", "data-radio": "true", "aria-hidden": "true" }),
751
- /* @__PURE__ */ jsxs13("span", { children: [
768
+ /* @__PURE__ */ jsxs14("span", { children: [
752
769
  label ?? children,
753
770
  hint ? /* @__PURE__ */ jsx19("span", { className: "pire-choice-hint", children: hint }) : null
754
771
  ] })
@@ -757,9 +774,9 @@ function Radio({ label, hint, children, className, ...rest }) {
757
774
 
758
775
  // src/components/forms/Switch.tsx
759
776
  import { Switch as AriaSwitch } from "react-aria-components";
760
- import { jsx as jsx20, jsxs as jsxs14 } from "react/jsx-runtime";
777
+ import { jsx as jsx20, jsxs as jsxs15 } from "react/jsx-runtime";
761
778
  function Switch({ label, children, className, ...rest }) {
762
- return /* @__PURE__ */ jsxs14(AriaSwitch, { className: cx("pire-choice", className), ...rest, children: [
779
+ return /* @__PURE__ */ jsxs15(AriaSwitch, { className: cx("pire-choice", className), ...rest, children: [
763
780
  /* @__PURE__ */ jsx20("span", { className: "pire-switch-track", "aria-hidden": "true", children: /* @__PURE__ */ jsx20("span", { className: "pire-switch-thumb" }) }),
764
781
  /* @__PURE__ */ jsx20("span", { children: label ?? children })
765
782
  ] });
@@ -789,6 +806,7 @@ var enMessages = {
789
806
  filterBarClearAll: "Clear all",
790
807
  dataTableSelectAll: "Select all rows",
791
808
  dataTableSelectRow: "Select row",
809
+ dataTableLoading: "Loading records",
792
810
  dialogClose: "Close",
793
811
  sidePanelClose: "Close panel",
794
812
  inlineMessageDismiss: "Dismiss message",
@@ -819,6 +837,7 @@ var esMessages = {
819
837
  filterBarClearAll: "Limpiar todo",
820
838
  dataTableSelectAll: "Seleccionar todas las filas",
821
839
  dataTableSelectRow: "Seleccionar fila",
840
+ dataTableLoading: "Cargando registros",
822
841
  dialogClose: "Cerrar",
823
842
  sidePanelClose: "Cerrar panel",
824
843
  inlineMessageDismiss: "Descartar mensaje",
@@ -863,7 +882,7 @@ function useMessage(key, override) {
863
882
  }
864
883
 
865
884
  // src/components/forms/ComboBox.tsx
866
- import { jsx as jsx22, jsxs as jsxs15 } from "react/jsx-runtime";
885
+ import { jsx as jsx22, jsxs as jsxs16 } from "react/jsx-runtime";
867
886
  var norm2 = (o) => typeof o === "string" ? { value: o, label: o } : o;
868
887
  function ComboBox({
869
888
  label,
@@ -882,7 +901,7 @@ function ComboBox({
882
901
  }) {
883
902
  const msg = usePireMessages();
884
903
  const items = options.map(norm2);
885
- return /* @__PURE__ */ jsxs15(
904
+ return /* @__PURE__ */ jsxs16(
886
905
  AriaComboBox,
887
906
  {
888
907
  className: cx("pire-field", className),
@@ -896,11 +915,11 @@ function ComboBox({
896
915
  validationBehavior: "aria",
897
916
  ...rest,
898
917
  children: [
899
- label ? /* @__PURE__ */ jsxs15(Label5, { className: "pire-field-label", children: [
918
+ label ? /* @__PURE__ */ jsxs16(Label5, { className: "pire-field-label", children: [
900
919
  label,
901
920
  rest.isRequired ? /* @__PURE__ */ jsx22("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
902
921
  ] }) : null,
903
- /* @__PURE__ */ jsxs15(
922
+ /* @__PURE__ */ jsxs16(
904
923
  Group3,
905
924
  {
906
925
  className: "pire-control",
@@ -916,7 +935,7 @@ function ComboBox({
916
935
  ),
917
936
  description ? /* @__PURE__ */ jsx22(Text6, { slot: "description", className: "pire-field-hint", children: description }) : null,
918
937
  /* @__PURE__ */ jsx22(FieldError5, { className: "pire-field-error", children: errorMessage }),
919
- /* @__PURE__ */ jsx22(Popover2, { className: "pire-popover", children: /* @__PURE__ */ jsx22(ListBox2, { className: "pire-listbox", children: (item) => /* @__PURE__ */ jsxs15(ListBoxItem2, { className: "pire-option", id: item.value, textValue: item.label, isDisabled: item.isDisabled, children: [
938
+ /* @__PURE__ */ jsx22(Popover2, { className: "pire-popover", children: /* @__PURE__ */ jsx22(ListBox2, { className: "pire-listbox", children: (item) => /* @__PURE__ */ jsxs16(ListBoxItem2, { className: "pire-option", id: item.value, textValue: item.label, isDisabled: item.isDisabled, children: [
920
939
  /* @__PURE__ */ jsx22("span", { style: { flex: 1 }, children: item.label }),
921
940
  item.secondary ? /* @__PURE__ */ jsx22("span", { style: { font: "var(--type-code)", color: "var(--text-tertiary)" }, children: item.secondary }) : null
922
941
  ] }) }) })
@@ -941,7 +960,7 @@ import {
941
960
  FieldError as FieldError6,
942
961
  VisuallyHidden
943
962
  } from "react-aria-components";
944
- import { jsx as jsx23, jsxs as jsxs16 } from "react/jsx-runtime";
963
+ import { jsx as jsx23, jsxs as jsxs17 } from "react/jsx-runtime";
945
964
  var norm3 = (o) => typeof o === "string" ? { value: o, label: o } : o;
946
965
  function MultiComboBox({
947
966
  label,
@@ -999,7 +1018,7 @@ function MultiComboBox({
999
1018
  e.stopPropagation();
1000
1019
  if (!values.includes(next)) commit([...values, next]);
1001
1020
  };
1002
- return /* @__PURE__ */ jsxs16(
1021
+ return /* @__PURE__ */ jsxs17(
1003
1022
  AriaComboBox2,
1004
1023
  {
1005
1024
  className: cx("pire-field", className),
@@ -1013,11 +1032,11 @@ function MultiComboBox({
1013
1032
  validationBehavior: "aria",
1014
1033
  ...rest,
1015
1034
  children: [
1016
- label ? /* @__PURE__ */ jsxs16(Label6, { className: "pire-field-label", children: [
1035
+ label ? /* @__PURE__ */ jsxs17(Label6, { className: "pire-field-label", children: [
1017
1036
  label,
1018
1037
  rest.isRequired ? /* @__PURE__ */ jsx23("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
1019
1038
  ] }) : null,
1020
- /* @__PURE__ */ jsxs16(
1039
+ /* @__PURE__ */ jsxs17(
1021
1040
  Group4,
1022
1041
  {
1023
1042
  className: "pire-control",
@@ -1028,7 +1047,7 @@ function MultiComboBox({
1028
1047
  "data-readonly": rest.isReadOnly ? "true" : void 0,
1029
1048
  children: [
1030
1049
  /* @__PURE__ */ jsx23(Icon, { name: "search", size: 16, className: "pire-leading-icon" }),
1031
- /* @__PURE__ */ jsxs16("div", { className: "pire-chipfield", children: [
1050
+ /* @__PURE__ */ jsxs17("div", { className: "pire-chipfield", children: [
1032
1051
  /* @__PURE__ */ jsx23(ButtonContext.Provider, { value: null, children: values.map((v) => (
1033
1052
  /* Disabled follows the field, not `isEditable`: a read-only field's chips are
1034
1053
  real, current values and should read as such — they simply lose the × . */
@@ -1051,7 +1070,7 @@ function MultiComboBox({
1051
1070
  /* @__PURE__ */ jsx23(VisuallyHidden, { children: /* @__PURE__ */ jsx23("span", { "aria-live": "polite", children: announcement }) }),
1052
1071
  description ? /* @__PURE__ */ jsx23(Text7, { slot: "description", className: "pire-field-hint", children: description }) : null,
1053
1072
  /* @__PURE__ */ jsx23(FieldError6, { className: "pire-field-error", children: errorMessage }),
1054
- /* @__PURE__ */ jsx23(Popover3, { className: "pire-popover", children: /* @__PURE__ */ jsx23(ListBox3, { className: "pire-listbox", children: (item) => /* @__PURE__ */ jsxs16(ListBoxItem3, { className: "pire-option", id: item.value, textValue: item.label, isDisabled: item.isDisabled, children: [
1073
+ /* @__PURE__ */ jsx23(Popover3, { className: "pire-popover", children: /* @__PURE__ */ jsx23(ListBox3, { className: "pire-listbox", children: (item) => /* @__PURE__ */ jsxs17(ListBoxItem3, { className: "pire-option", id: item.value, textValue: item.label, isDisabled: item.isDisabled, children: [
1055
1074
  /* @__PURE__ */ jsx23("span", { style: { flex: 1 }, children: item.label }),
1056
1075
  item.secondary ? /* @__PURE__ */ jsx23("span", { style: { font: "var(--type-code)", color: "var(--text-tertiary)" }, children: item.secondary }) : null
1057
1076
  ] }) }) })
@@ -1070,7 +1089,7 @@ import {
1070
1089
  Text as Text8,
1071
1090
  FieldError as FieldError7
1072
1091
  } from "react-aria-components";
1073
- import { jsx as jsx24, jsxs as jsxs17 } from "react/jsx-runtime";
1092
+ import { jsx as jsx24, jsxs as jsxs18 } from "react/jsx-runtime";
1074
1093
  function NumberField({
1075
1094
  label,
1076
1095
  suffix,
@@ -1084,12 +1103,12 @@ function NumberField({
1084
1103
  ...rest
1085
1104
  }) {
1086
1105
  const msg = usePireMessages();
1087
- return /* @__PURE__ */ jsxs17(AriaNumberField, { className: cx("pire-field", className), style, validationBehavior: "aria", ...rest, children: [
1088
- label ? /* @__PURE__ */ jsxs17(Label7, { className: "pire-field-label", children: [
1106
+ return /* @__PURE__ */ jsxs18(AriaNumberField, { className: cx("pire-field", className), style, validationBehavior: "aria", ...rest, children: [
1107
+ label ? /* @__PURE__ */ jsxs18(Label7, { className: "pire-field-label", children: [
1089
1108
  label,
1090
1109
  rest.isRequired ? /* @__PURE__ */ jsx24("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
1091
1110
  ] }) : null,
1092
- /* @__PURE__ */ jsxs17(
1111
+ /* @__PURE__ */ jsxs18(
1093
1112
  Group5,
1094
1113
  {
1095
1114
  className: "pire-control",
@@ -1100,7 +1119,7 @@ function NumberField({
1100
1119
  children: [
1101
1120
  /* @__PURE__ */ jsx24(AriaInput4, { className: "pire-input", "data-numeric": "true" }),
1102
1121
  suffix ? /* @__PURE__ */ jsx24("span", { className: "pire-affix", children: suffix }) : null,
1103
- hideStepper ? null : /* @__PURE__ */ jsxs17("span", { className: "pire-stepper", children: [
1122
+ hideStepper ? null : /* @__PURE__ */ jsxs18("span", { className: "pire-stepper", children: [
1104
1123
  /* @__PURE__ */ jsx24(AriaButton7, { slot: "increment", className: "pire-stepper-btn", "aria-label": msg.numberFieldIncrease, children: /* @__PURE__ */ jsx24(Icon, { name: "plus", size: 10 }) }),
1105
1124
  /* @__PURE__ */ jsx24(AriaButton7, { slot: "decrement", className: "pire-stepper-btn", "aria-label": msg.numberFieldDecrease, children: /* @__PURE__ */ jsx24(Icon, { name: "minus", size: 10 }) })
1106
1125
  ] })
@@ -1132,7 +1151,7 @@ import {
1132
1151
  Text as Text9,
1133
1152
  FieldError as FieldError8
1134
1153
  } from "react-aria-components";
1135
- import { jsx as jsx25, jsxs as jsxs18 } from "react/jsx-runtime";
1154
+ import { jsx as jsx25, jsxs as jsxs19 } from "react/jsx-runtime";
1136
1155
  function DatePicker({
1137
1156
  label,
1138
1157
  description,
@@ -1144,12 +1163,12 @@ function DatePicker({
1144
1163
  ...rest
1145
1164
  }) {
1146
1165
  const msg = usePireMessages();
1147
- return /* @__PURE__ */ jsxs18(AriaDatePicker, { className: cx("pire-field", className), style, validationBehavior: "aria", ...rest, children: [
1148
- label ? /* @__PURE__ */ jsxs18(Label8, { className: "pire-field-label", children: [
1166
+ return /* @__PURE__ */ jsxs19(AriaDatePicker, { className: cx("pire-field", className), style, validationBehavior: "aria", ...rest, children: [
1167
+ label ? /* @__PURE__ */ jsxs19(Label8, { className: "pire-field-label", children: [
1149
1168
  label,
1150
1169
  rest.isRequired ? /* @__PURE__ */ jsx25("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
1151
1170
  ] }) : null,
1152
- /* @__PURE__ */ jsxs18(
1171
+ /* @__PURE__ */ jsxs19(
1153
1172
  Group6,
1154
1173
  {
1155
1174
  className: "pire-control",
@@ -1165,13 +1184,13 @@ function DatePicker({
1165
1184
  ),
1166
1185
  description ? /* @__PURE__ */ jsx25(Text9, { slot: "description", className: "pire-field-hint", children: description }) : null,
1167
1186
  /* @__PURE__ */ jsx25(FieldError8, { className: "pire-field-error", children: errorMessage }),
1168
- /* @__PURE__ */ jsx25(Popover4, { className: "pire-popover", children: /* @__PURE__ */ jsx25(AriaDialog, { children: /* @__PURE__ */ jsxs18(Calendar, { className: "pire-calendar", children: [
1169
- /* @__PURE__ */ jsxs18("header", { className: "pire-calendar-head", children: [
1187
+ /* @__PURE__ */ jsx25(Popover4, { className: "pire-popover", children: /* @__PURE__ */ jsx25(AriaDialog, { children: /* @__PURE__ */ jsxs19(Calendar, { className: "pire-calendar", children: [
1188
+ /* @__PURE__ */ jsxs19("header", { className: "pire-calendar-head", children: [
1170
1189
  /* @__PURE__ */ jsx25(AriaButton8, { slot: "previous", className: "pire-iconbtn", "data-size": "sm", "aria-label": msg.datePickerPreviousMonth, children: /* @__PURE__ */ jsx25(Icon, { name: "chevron-left", size: 16 }) }),
1171
1190
  /* @__PURE__ */ jsx25(Heading2, { className: "pire-calendar-title" }),
1172
1191
  /* @__PURE__ */ jsx25(AriaButton8, { slot: "next", className: "pire-iconbtn", "data-size": "sm", "aria-label": msg.datePickerNextMonth, children: /* @__PURE__ */ jsx25(Icon, { name: "chevron-right", size: 16 }) })
1173
1192
  ] }),
1174
- /* @__PURE__ */ jsxs18(CalendarGrid, { className: "pire-calendar-grid", children: [
1193
+ /* @__PURE__ */ jsxs19(CalendarGrid, { className: "pire-calendar-grid", children: [
1175
1194
  /* @__PURE__ */ jsx25(CalendarGridHeader, { children: (day) => /* @__PURE__ */ jsx25(CalendarHeaderCell, { children: day }) }),
1176
1195
  /* @__PURE__ */ jsx25(CalendarGridBody, { children: (date) => /* @__PURE__ */ jsx25(CalendarCell, { date, className: "pire-calendar-cell" }) })
1177
1196
  ] })
@@ -1187,7 +1206,7 @@ import * as React8 from "react";
1187
1206
 
1188
1207
  // src/components/feedback/Dialog.tsx
1189
1208
  import { ModalOverlay, Modal, Dialog as AriaDialog2, Heading as Heading3 } from "react-aria-components";
1190
- import { jsx as jsx26, jsxs as jsxs19 } from "react/jsx-runtime";
1209
+ import { jsx as jsx26, jsxs as jsxs20 } from "react/jsx-runtime";
1191
1210
  function Dialog({
1192
1211
  isOpen,
1193
1212
  onOpenChange,
@@ -1216,9 +1235,9 @@ function Dialog({
1216
1235
  onOpenChange: (o) => {
1217
1236
  if (!o) close();
1218
1237
  },
1219
- children: /* @__PURE__ */ jsx26(Modal, { className: cx("pire-modal", className), "data-size": size, style, children: /* @__PURE__ */ jsxs19(AriaDialog2, { className: "pire-dialog", children: [
1220
- title ? /* @__PURE__ */ jsxs19("header", { className: "pire-dialog-head", children: [
1221
- /* @__PURE__ */ jsxs19("div", { style: { flex: 1, minWidth: 0 }, children: [
1238
+ children: /* @__PURE__ */ jsx26(Modal, { className: cx("pire-modal", className), "data-size": size, style, children: /* @__PURE__ */ jsxs20(AriaDialog2, { className: "pire-dialog", children: [
1239
+ title ? /* @__PURE__ */ jsxs20("header", { className: "pire-dialog-head", children: [
1240
+ /* @__PURE__ */ jsxs20("div", { style: { flex: 1, minWidth: 0 }, children: [
1222
1241
  /* @__PURE__ */ jsx26(Heading3, { slot: "title", className: "pire-dialog-title", children: title }),
1223
1242
  subtitle ? /* @__PURE__ */ jsx26("p", { className: "pire-dialog-sub", style: { margin: 0 }, children: subtitle }) : null
1224
1243
  ] }),
@@ -1240,7 +1259,54 @@ import {
1240
1259
  Row,
1241
1260
  Cell
1242
1261
  } from "react-aria-components";
1243
- import { jsx as jsx27, jsxs as jsxs20 } from "react/jsx-runtime";
1262
+
1263
+ // src/components/feedback/Skeleton.tsx
1264
+ import { jsx as jsx27 } from "react/jsx-runtime";
1265
+ function Skeleton({ shape = "text", width, height, className, style, ...rest }) {
1266
+ return /* @__PURE__ */ jsx27(
1267
+ "div",
1268
+ {
1269
+ className: cx("pire-skeleton", className),
1270
+ "data-shape": shape,
1271
+ "aria-hidden": "true",
1272
+ style: { width, height, ...style },
1273
+ ...rest
1274
+ }
1275
+ );
1276
+ }
1277
+ var BAR_WIDTHS = ["72%", "54%", "86%", "63%"];
1278
+ function SkeletonTableRow({ columns, density = "regular", className, style, ...rest }) {
1279
+ const cells = typeof columns === "number" ? Array.from({ length: columns }, () => ({})) : columns;
1280
+ return /* @__PURE__ */ jsx27(
1281
+ "div",
1282
+ {
1283
+ className: cx("pire-skeleton-row", className),
1284
+ "data-density": density,
1285
+ "aria-hidden": "true",
1286
+ style,
1287
+ ...rest,
1288
+ children: cells.map((c, i) => {
1289
+ const align = c.numeric ? "right" : c.align ?? "left";
1290
+ return (
1291
+ // biome-ignore lint/suspicious/noArrayIndexKey: columns are positional and never reordered.
1292
+ /* @__PURE__ */ jsx27(
1293
+ "div",
1294
+ {
1295
+ className: "pire-skeleton-cell",
1296
+ "data-align": align,
1297
+ style: { width: c.width, flex: c.width ? "0 0 auto" : void 0 },
1298
+ children: /* @__PURE__ */ jsx27(Skeleton, { width: BAR_WIDTHS[i % BAR_WIDTHS.length] })
1299
+ },
1300
+ i
1301
+ )
1302
+ );
1303
+ })
1304
+ }
1305
+ );
1306
+ }
1307
+
1308
+ // src/components/data/DataTable.tsx
1309
+ import { jsx as jsx28, jsxs as jsxs21 } from "react/jsx-runtime";
1244
1310
  function DataTable({
1245
1311
  columns,
1246
1312
  rows,
@@ -1253,6 +1319,9 @@ function DataTable({
1253
1319
  onRowAction,
1254
1320
  stickyHeader = true,
1255
1321
  emptyLabel = "No records match the current filters.",
1322
+ isLoading,
1323
+ loadingRowCount,
1324
+ loadingLabel,
1256
1325
  className,
1257
1326
  style,
1258
1327
  ...rest
@@ -1263,70 +1332,91 @@ function DataTable({
1263
1332
  if (keys === "all") return onSelectionChange?.(rows.map((r) => r.id));
1264
1333
  onSelectionChange?.([...keys]);
1265
1334
  };
1266
- return /* @__PURE__ */ jsx27("div", { className: cx("pire-table-wrap", className), style, children: /* @__PURE__ */ jsxs20(
1267
- Table,
1335
+ const skeletonRows = loadingRowCount ?? (rows.length || 5);
1336
+ const skeletonColumns = [
1337
+ ...selectable ? [{ width: 44 }] : [],
1338
+ ...columns.map((c) => ({ width: c.width, align: c.align, numeric: c.numeric }))
1339
+ ];
1340
+ const body = isLoading ? [] : rows;
1341
+ return /* @__PURE__ */ jsx28(
1342
+ "div",
1268
1343
  {
1269
- className: "pire-table",
1270
- "data-density": density,
1271
- "data-sticky": String(stickyHeader),
1272
- "aria-label": rest["aria-label"],
1273
- selectionMode: selectable ? "multiple" : "none",
1274
- selectedKeys: selected ? new Set(selected) : void 0,
1275
- onSelectionChange: handleSelection,
1276
- sortDescriptor,
1277
- onSortChange: (d) => onSortChange?.({ key: String(d.column), dir: d.direction === "ascending" ? "asc" : "desc" }),
1278
- onRowAction: onRowAction ? (key) => {
1279
- const row = rows.find((r) => String(r.id) === String(key));
1280
- if (row) onRowAction(row);
1281
- } : void 0,
1282
- children: [
1283
- /* @__PURE__ */ jsxs20(TableHeader, { className: "pire-thead-row", children: [
1284
- selectable ? /* @__PURE__ */ jsx27(Column, { className: "pire-th", width: 44, children: /* @__PURE__ */ jsx27(Checkbox, { slot: "selection", "aria-label": msg.dataTableSelectAll }) }) : null,
1285
- columns.map((c, i) => /* @__PURE__ */ jsx27(
1286
- Column,
1287
- {
1288
- id: c.key,
1289
- className: "pire-th",
1290
- isRowHeader: i === 0 && !selectable,
1291
- allowsSorting: c.sortable,
1292
- width: c.width,
1293
- "data-align": c.numeric || c.align === "right" ? "right" : c.align,
1294
- "data-allows-sorting": c.sortable ? "true" : void 0,
1295
- children: /* @__PURE__ */ jsxs20("span", { className: "pire-th-inner", children: [
1296
- c.label,
1297
- c.sortable ? /* @__PURE__ */ jsx27(
1298
- Icon,
1299
- {
1300
- size: 12,
1301
- name: sort?.key === c.key ? sort.dir === "asc" ? "arrow-up" : "arrow-down" : "chevrons-up-down",
1302
- style: { color: sort?.key === c.key ? "var(--accent-subtle-fg)" : "var(--text-tertiary)" }
1303
- }
1304
- ) : null
1305
- ] })
1306
- },
1307
- c.key
1308
- ))
1309
- ] }),
1310
- /* @__PURE__ */ jsx27(TableBody, { renderEmptyState: () => /* @__PURE__ */ jsx27("div", { className: "pire-table-empty", children: emptyLabel }), children: rows.map((row) => /* @__PURE__ */ jsxs20(Row, { id: row.id, className: "pire-tr", "data-pressable": onRowAction ? "true" : void 0, children: [
1311
- selectable ? /* @__PURE__ */ jsx27(Cell, { className: "pire-td", children: /* @__PURE__ */ jsx27(Checkbox, { slot: "selection", "aria-label": msg.dataTableSelectRow }) }) : null,
1312
- columns.map((c) => /* @__PURE__ */ jsx27(
1313
- Cell,
1314
- {
1315
- className: "pire-td",
1316
- "data-numeric": c.numeric ? "true" : void 0,
1317
- style: { textAlign: c.align && !c.numeric ? c.align : void 0 },
1318
- children: c.render ? c.render(row) : row[c.key]
1319
- },
1320
- c.key
1321
- ))
1322
- ] }, row.id)) })
1323
- ]
1344
+ className: cx("pire-table-wrap", className),
1345
+ style,
1346
+ "data-loading": isLoading ? "true" : void 0,
1347
+ "aria-busy": isLoading ? "true" : void 0,
1348
+ children: /* @__PURE__ */ jsxs21(
1349
+ Table,
1350
+ {
1351
+ className: "pire-table",
1352
+ "data-density": density,
1353
+ "data-sticky": String(stickyHeader),
1354
+ "aria-label": rest["aria-label"],
1355
+ selectionMode: selectable ? "multiple" : "none",
1356
+ selectedKeys: selected ? new Set(selected) : void 0,
1357
+ onSelectionChange: handleSelection,
1358
+ sortDescriptor,
1359
+ onSortChange: (d) => onSortChange?.({ key: String(d.column), dir: d.direction === "ascending" ? "asc" : "desc" }),
1360
+ onRowAction: onRowAction ? (key) => {
1361
+ const row = rows.find((r) => String(r.id) === String(key));
1362
+ if (row) onRowAction(row);
1363
+ } : void 0,
1364
+ children: [
1365
+ /* @__PURE__ */ jsxs21(TableHeader, { className: "pire-thead-row", children: [
1366
+ selectable ? /* @__PURE__ */ jsx28(Column, { className: "pire-th", width: 44, children: /* @__PURE__ */ jsx28(Checkbox, { slot: "selection", "aria-label": msg.dataTableSelectAll }) }) : null,
1367
+ columns.map((c, i) => /* @__PURE__ */ jsx28(
1368
+ Column,
1369
+ {
1370
+ id: c.key,
1371
+ className: "pire-th",
1372
+ isRowHeader: i === 0 && !selectable,
1373
+ allowsSorting: c.sortable,
1374
+ width: c.width,
1375
+ "data-align": c.numeric || c.align === "right" ? "right" : c.align,
1376
+ "data-allows-sorting": c.sortable ? "true" : void 0,
1377
+ children: /* @__PURE__ */ jsxs21("span", { className: "pire-th-inner", children: [
1378
+ c.label,
1379
+ c.sortable ? /* @__PURE__ */ jsx28(
1380
+ Icon,
1381
+ {
1382
+ size: 12,
1383
+ name: sort?.key === c.key ? sort.dir === "asc" ? "arrow-up" : "arrow-down" : "chevrons-up-down",
1384
+ style: { color: sort?.key === c.key ? "var(--accent-subtle-fg)" : "var(--text-tertiary)" }
1385
+ }
1386
+ ) : null
1387
+ ] })
1388
+ },
1389
+ c.key
1390
+ ))
1391
+ ] }),
1392
+ /* @__PURE__ */ jsx28(TableBody, { renderEmptyState: () => isLoading ? /* @__PURE__ */ jsxs21("div", { className: "pire-table-loading", role: "status", "aria-live": "polite", children: [
1393
+ /* @__PURE__ */ jsx28("span", { className: "pire-sr-only", children: loadingLabel ?? msg.dataTableLoading }),
1394
+ Array.from({ length: skeletonRows }, (_, i) => (
1395
+ // biome-ignore lint/suspicious/noArrayIndexKey: placeholder rows are positional.
1396
+ /* @__PURE__ */ jsx28(SkeletonTableRow, { columns: skeletonColumns, density }, i)
1397
+ ))
1398
+ ] }) : /* @__PURE__ */ jsx28("div", { className: "pire-table-empty", children: emptyLabel }), children: body.map((row) => /* @__PURE__ */ jsxs21(Row, { id: row.id, className: "pire-tr", "data-pressable": onRowAction ? "true" : void 0, children: [
1399
+ selectable ? /* @__PURE__ */ jsx28(Cell, { className: "pire-td", children: /* @__PURE__ */ jsx28(Checkbox, { slot: "selection", "aria-label": msg.dataTableSelectRow }) }) : null,
1400
+ columns.map((c) => /* @__PURE__ */ jsx28(
1401
+ Cell,
1402
+ {
1403
+ className: "pire-td",
1404
+ "data-numeric": c.numeric ? "true" : void 0,
1405
+ style: { textAlign: c.align && !c.numeric ? c.align : void 0 },
1406
+ children: c.render ? c.render(row) : row[c.key]
1407
+ },
1408
+ c.key
1409
+ ))
1410
+ ] }, row.id)) })
1411
+ ]
1412
+ }
1413
+ )
1324
1414
  }
1325
- ) });
1415
+ );
1326
1416
  }
1327
1417
 
1328
1418
  // src/components/patterns/ValueHelpDialog.tsx
1329
- import { jsx as jsx28, jsxs as jsxs21 } from "react/jsx-runtime";
1419
+ import { jsx as jsx29, jsxs as jsxs22 } from "react/jsx-runtime";
1330
1420
  function ValueHelpDialog({
1331
1421
  isOpen,
1332
1422
  title = "Select a record",
@@ -1347,16 +1437,16 @@ function ValueHelpDialog({
1347
1437
  if (!q) return rows;
1348
1438
  return rows.filter((row) => Object.values(row).some((v) => String(v).toLowerCase().includes(q)));
1349
1439
  }, [rows, query]);
1350
- return /* @__PURE__ */ jsx28(
1440
+ return /* @__PURE__ */ jsx29(
1351
1441
  Dialog,
1352
1442
  {
1353
1443
  isOpen,
1354
1444
  size: "lg",
1355
1445
  title,
1356
1446
  onClose,
1357
- footer: /* @__PURE__ */ jsx28(Button, { variant: "tertiary", onPress: onClose, children: msg.valueHelpDialogCancel }),
1358
- children: /* @__PURE__ */ jsxs21("div", { style: { display: "flex", flexDirection: "column", gap: "var(--sp-3)" }, children: [
1359
- /* @__PURE__ */ jsx28(
1447
+ footer: /* @__PURE__ */ jsx29(Button, { variant: "tertiary", onPress: onClose, children: msg.valueHelpDialogCancel }),
1448
+ children: /* @__PURE__ */ jsxs22("div", { style: { display: "flex", flexDirection: "column", gap: "var(--sp-3)" }, children: [
1449
+ /* @__PURE__ */ jsx29(
1360
1450
  Input,
1361
1451
  {
1362
1452
  "aria-label": msg.valueHelpDialogSearch,
@@ -1368,7 +1458,7 @@ function ValueHelpDialog({
1368
1458
  autoFocus: true
1369
1459
  }
1370
1460
  ),
1371
- /* @__PURE__ */ jsx28(
1461
+ /* @__PURE__ */ jsx29(
1372
1462
  DataTable,
1373
1463
  {
1374
1464
  "aria-label": typeof title === "string" ? title : "Records",
@@ -1388,7 +1478,7 @@ function ValueHelpDialog({
1388
1478
  }
1389
1479
 
1390
1480
  // src/components/forms/ValueHelpField.tsx
1391
- import { jsx as jsx29, jsxs as jsxs22 } from "react/jsx-runtime";
1481
+ import { jsx as jsx30, jsxs as jsxs23 } from "react/jsx-runtime";
1392
1482
  var defaultFormat = (row) => [row.id, row.name ?? row.label ?? row.text].filter(Boolean).join(" \u2014 ");
1393
1483
  function ValueHelpField({
1394
1484
  label,
@@ -1410,9 +1500,9 @@ function ValueHelpField({
1410
1500
  }) {
1411
1501
  const msg = usePireMessages();
1412
1502
  const [open, setOpen] = React9.useState(false);
1413
- return /* @__PURE__ */ jsxs22("div", { className: cx(className), style, children: [
1414
- /* @__PURE__ */ jsxs22("div", { style: { display: "flex", gap: "var(--sp-2)", alignItems: "flex-end" }, children: [
1415
- /* @__PURE__ */ jsx29(
1503
+ return /* @__PURE__ */ jsxs23("div", { className: cx(className), style, children: [
1504
+ /* @__PURE__ */ jsxs23("div", { style: { display: "flex", gap: "var(--sp-2)", alignItems: "flex-end" }, children: [
1505
+ /* @__PURE__ */ jsx30(
1416
1506
  Input,
1417
1507
  {
1418
1508
  label,
@@ -1426,7 +1516,7 @@ function ValueHelpField({
1426
1516
  errorMessage
1427
1517
  }
1428
1518
  ),
1429
- allowsClear && value ? /* @__PURE__ */ jsx29(
1519
+ allowsClear && value ? /* @__PURE__ */ jsx30(
1430
1520
  IconButton,
1431
1521
  {
1432
1522
  icon: "x",
@@ -1436,7 +1526,7 @@ function ValueHelpField({
1436
1526
  onPress: () => onChange?.(null)
1437
1527
  }
1438
1528
  ) : null,
1439
- /* @__PURE__ */ jsx29(
1529
+ /* @__PURE__ */ jsx30(
1440
1530
  IconButton,
1441
1531
  {
1442
1532
  icon: "search",
@@ -1447,7 +1537,7 @@ function ValueHelpField({
1447
1537
  }
1448
1538
  )
1449
1539
  ] }),
1450
- /* @__PURE__ */ jsx29(
1540
+ /* @__PURE__ */ jsx30(
1451
1541
  ValueHelpDialog,
1452
1542
  {
1453
1543
  isOpen: open,
@@ -1462,7 +1552,7 @@ function ValueHelpField({
1462
1552
  }
1463
1553
 
1464
1554
  // src/components/navigation/ShellBar.tsx
1465
- import { jsx as jsx30, jsxs as jsxs23 } from "react/jsx-runtime";
1555
+ import { jsx as jsx31, jsxs as jsxs24 } from "react/jsx-runtime";
1466
1556
  var initials2 = (name) => name.trim().split(/\s+/).slice(0, 2).map((p) => p[0]).join("").toUpperCase();
1467
1557
  function ShellBar({
1468
1558
  product,
@@ -1477,22 +1567,22 @@ function ShellBar({
1477
1567
  className,
1478
1568
  ...rest
1479
1569
  }) {
1480
- return /* @__PURE__ */ jsxs23("header", { className: cx("pire-shellbar", className), ...rest, children: [
1481
- onMenu ? /* @__PURE__ */ jsx30(IconButton, { icon: "menu", label: menuLabel, variant: "inverse", size: "sm", onPress: onMenu }) : null,
1482
- monogram ? /* @__PURE__ */ jsx30("span", { className: "pire-shellbar-mono", "aria-hidden": "true", children: monogram }) : null,
1483
- product ? /* @__PURE__ */ jsx30("span", { className: "pire-shellbar-product", children: product }) : null,
1484
- title ? /* @__PURE__ */ jsx30("span", { className: "pire-shellbar-title", children: title }) : null,
1485
- /* @__PURE__ */ jsx30("span", { className: "pire-shellbar-spacer" }),
1486
- onSearch ? /* @__PURE__ */ jsx30(IconButton, { icon: "search", label: searchLabel, variant: "inverse", size: "sm", onPress: onSearch }) : null,
1570
+ return /* @__PURE__ */ jsxs24("header", { className: cx("pire-shellbar", className), ...rest, children: [
1571
+ onMenu ? /* @__PURE__ */ jsx31(IconButton, { icon: "menu", label: menuLabel, variant: "inverse", size: "sm", onPress: onMenu }) : null,
1572
+ monogram ? /* @__PURE__ */ jsx31("span", { className: "pire-shellbar-mono", "aria-hidden": "true", children: monogram }) : null,
1573
+ product ? /* @__PURE__ */ jsx31("span", { className: "pire-shellbar-product", children: product }) : null,
1574
+ title ? /* @__PURE__ */ jsx31("span", { className: "pire-shellbar-title", children: title }) : null,
1575
+ /* @__PURE__ */ jsx31("span", { className: "pire-shellbar-spacer" }),
1576
+ onSearch ? /* @__PURE__ */ jsx31(IconButton, { icon: "search", label: searchLabel, variant: "inverse", size: "sm", onPress: onSearch }) : null,
1487
1577
  actions,
1488
- user ? /* @__PURE__ */ jsx30("span", { className: "pire-avatar", title: user, "aria-label": user, role: "img", children: initials2(user) }) : null
1578
+ user ? /* @__PURE__ */ jsx31("span", { className: "pire-avatar", title: user, "aria-label": user, role: "img", children: initials2(user) }) : null
1489
1579
  ] });
1490
1580
  }
1491
1581
 
1492
1582
  // src/components/navigation/SideNav.tsx
1493
1583
  import * as React10 from "react";
1494
1584
  import { Button as AriaButton9, Disclosure, DisclosureGroup, DisclosurePanel } from "react-aria-components";
1495
- import { jsx as jsx31, jsxs as jsxs24 } from "react/jsx-runtime";
1585
+ import { jsx as jsx32, jsxs as jsxs25 } from "react/jsx-runtime";
1496
1586
  function findActiveParent(groups, value) {
1497
1587
  if (value == null) return void 0;
1498
1588
  for (const group of groups) {
@@ -1540,7 +1630,7 @@ function SideNav({
1540
1630
  };
1541
1631
  const renderRow = (item, onPress, isGroup) => {
1542
1632
  const selected = !isGroup && item.id === value;
1543
- const button = /* @__PURE__ */ jsxs24(
1633
+ const button = /* @__PURE__ */ jsxs25(
1544
1634
  AriaButton9,
1545
1635
  {
1546
1636
  className: "pire-sidenav-item",
@@ -1550,17 +1640,17 @@ function SideNav({
1550
1640
  "aria-label": collapsed ? item.label : void 0,
1551
1641
  onPress,
1552
1642
  children: [
1553
- item.icon ? /* @__PURE__ */ jsx31(Icon, { name: item.icon, size: 16 }) : null,
1554
- collapsed ? null : /* @__PURE__ */ jsx31("span", { children: item.label }),
1555
- item.count != null && !collapsed ? /* @__PURE__ */ jsx31("span", { className: "pire-sidenav-count", children: item.count }) : null
1643
+ item.icon ? /* @__PURE__ */ jsx32(Icon, { name: item.icon, size: 16 }) : null,
1644
+ collapsed ? null : /* @__PURE__ */ jsx32("span", { children: item.label }),
1645
+ item.count != null && !collapsed ? /* @__PURE__ */ jsx32("span", { className: "pire-sidenav-count", children: item.count }) : null
1556
1646
  ]
1557
1647
  },
1558
1648
  item.id
1559
1649
  );
1560
- return collapsed ? /* @__PURE__ */ jsx31(Tooltip, { label: item.label, placement: "right", children: button }, item.id) : button;
1650
+ return collapsed ? /* @__PURE__ */ jsx32(Tooltip, { label: item.label, placement: "right", children: button }, item.id) : button;
1561
1651
  };
1562
- const renderSection = (item) => /* @__PURE__ */ jsxs24(Disclosure, { id: item.id, className: "pire-sidenav-section", children: [
1563
- /* @__PURE__ */ jsxs24(
1652
+ const renderSection = (item) => /* @__PURE__ */ jsxs25(Disclosure, { id: item.id, className: "pire-sidenav-section", children: [
1653
+ /* @__PURE__ */ jsxs25(
1564
1654
  AriaButton9,
1565
1655
  {
1566
1656
  slot: "trigger",
@@ -1568,16 +1658,16 @@ function SideNav({
1568
1658
  "data-kind": "group",
1569
1659
  "data-active-child": item.id === activeParent ? "true" : void 0,
1570
1660
  children: [
1571
- item.icon ? /* @__PURE__ */ jsx31(Icon, { name: item.icon, size: 16 }) : null,
1572
- /* @__PURE__ */ jsx31("span", { children: item.label }),
1573
- item.count != null ? /* @__PURE__ */ jsx31("span", { className: "pire-sidenav-count", children: item.count }) : null,
1574
- /* @__PURE__ */ jsx31(Icon, { name: "chevron-down", size: 16, className: "pire-sidenav-chevron" })
1661
+ item.icon ? /* @__PURE__ */ jsx32(Icon, { name: item.icon, size: 16 }) : null,
1662
+ /* @__PURE__ */ jsx32("span", { children: item.label }),
1663
+ item.count != null ? /* @__PURE__ */ jsx32("span", { className: "pire-sidenav-count", children: item.count }) : null,
1664
+ /* @__PURE__ */ jsx32(Icon, { name: "chevron-down", size: 16, className: "pire-sidenav-chevron" })
1575
1665
  ]
1576
1666
  }
1577
1667
  ),
1578
- /* @__PURE__ */ jsx31(DisclosurePanel, { className: "pire-sidenav-subnav", children: item.items?.map((child) => {
1668
+ /* @__PURE__ */ jsx32(DisclosurePanel, { className: "pire-sidenav-subnav", children: item.items?.map((child) => {
1579
1669
  const selected = child.id === value;
1580
- return /* @__PURE__ */ jsxs24(
1670
+ return /* @__PURE__ */ jsxs25(
1581
1671
  AriaButton9,
1582
1672
  {
1583
1673
  className: "pire-sidenav-item pire-sidenav-subitem",
@@ -1585,15 +1675,15 @@ function SideNav({
1585
1675
  "aria-current": selected ? "page" : void 0,
1586
1676
  onPress: () => onChange?.(child.id),
1587
1677
  children: [
1588
- /* @__PURE__ */ jsx31("span", { children: child.label }),
1589
- child.count != null ? /* @__PURE__ */ jsx31("span", { className: "pire-sidenav-count", children: child.count }) : null
1678
+ /* @__PURE__ */ jsx32("span", { children: child.label }),
1679
+ child.count != null ? /* @__PURE__ */ jsx32("span", { className: "pire-sidenav-count", children: child.count }) : null
1590
1680
  ]
1591
1681
  },
1592
1682
  child.id
1593
1683
  );
1594
1684
  }) })
1595
1685
  ] }, item.id);
1596
- return /* @__PURE__ */ jsxs24(
1686
+ return /* @__PURE__ */ jsxs25(
1597
1687
  "nav",
1598
1688
  {
1599
1689
  className: cx("pire-sidenav", className),
@@ -1608,9 +1698,9 @@ function SideNav({
1608
1698
  if (isGroup && !collapsed) return renderSection(item);
1609
1699
  return renderRow(item, () => isGroup ? toggleExpanded(item.id) : onChange?.(item.id), isGroup);
1610
1700
  });
1611
- return /* @__PURE__ */ jsxs24("div", { className: "pire-sidenav-group", children: [
1612
- group.label && !collapsed ? /* @__PURE__ */ jsx31("div", { className: "pire-sidenav-label", children: group.label }) : null,
1613
- hasSections ? /* @__PURE__ */ jsx31(
1701
+ return /* @__PURE__ */ jsxs25("div", { className: "pire-sidenav-group", children: [
1702
+ group.label && !collapsed ? /* @__PURE__ */ jsx32("div", { className: "pire-sidenav-label", children: group.label }) : null,
1703
+ hasSections ? /* @__PURE__ */ jsx32(
1614
1704
  DisclosureGroup,
1615
1705
  {
1616
1706
  className: "pire-sidenav-tree",
@@ -1622,7 +1712,7 @@ function SideNav({
1622
1712
  ) : rows
1623
1713
  ] }, group.label ?? gi);
1624
1714
  }),
1625
- footer ? /* @__PURE__ */ jsx31("div", { className: "pire-sidenav-footer", children: footer }) : null
1715
+ footer ? /* @__PURE__ */ jsx32("div", { className: "pire-sidenav-footer", children: footer }) : null
1626
1716
  ]
1627
1717
  }
1628
1718
  );
@@ -1630,9 +1720,9 @@ function SideNav({
1630
1720
 
1631
1721
  // src/components/navigation/Tabs.tsx
1632
1722
  import { Tabs as AriaTabs, TabList, Tab as AriaTab, TabPanel } from "react-aria-components";
1633
- import { jsx as jsx32, jsxs as jsxs25 } from "react/jsx-runtime";
1723
+ import { jsx as jsx33, jsxs as jsxs26 } from "react/jsx-runtime";
1634
1724
  function Tabs({ items, value, defaultValue, onChange, panels, className, style, ...rest }) {
1635
- return /* @__PURE__ */ jsxs25(
1725
+ return /* @__PURE__ */ jsxs26(
1636
1726
  AriaTabs,
1637
1727
  {
1638
1728
  className,
@@ -1641,12 +1731,12 @@ function Tabs({ items, value, defaultValue, onChange, panels, className, style,
1641
1731
  defaultSelectedKey: defaultValue,
1642
1732
  onSelectionChange: (k) => onChange?.(String(k)),
1643
1733
  children: [
1644
- /* @__PURE__ */ jsx32(TabList, { className: "pire-tablist", items, "aria-label": rest["aria-label"] ?? "Views", children: (item) => /* @__PURE__ */ jsxs25(AriaTab, { className: cx("pire-tab"), id: item.id, isDisabled: item.isDisabled, children: [
1645
- item.icon ? /* @__PURE__ */ jsx32(Icon, { name: item.icon, size: 16 }) : null,
1734
+ /* @__PURE__ */ jsx33(TabList, { className: "pire-tablist", items, "aria-label": rest["aria-label"] ?? "Views", children: (item) => /* @__PURE__ */ jsxs26(AriaTab, { className: cx("pire-tab"), id: item.id, isDisabled: item.isDisabled, children: [
1735
+ item.icon ? /* @__PURE__ */ jsx33(Icon, { name: item.icon, size: 16 }) : null,
1646
1736
  item.label,
1647
- item.count != null ? /* @__PURE__ */ jsx32("span", { className: "pire-tab-count", children: item.count }) : null
1737
+ item.count != null ? /* @__PURE__ */ jsx33("span", { className: "pire-tab-count", children: item.count }) : null
1648
1738
  ] }) }),
1649
- items.map((item) => /* @__PURE__ */ jsx32(TabPanel, { id: item.id, className: panels ? "pire-tabpanel" : void 0, children: panels?.[item.id] }, item.id))
1739
+ items.map((item) => /* @__PURE__ */ jsx33(TabPanel, { id: item.id, className: panels ? "pire-tabpanel" : void 0, children: panels?.[item.id] }, item.id))
1650
1740
  ]
1651
1741
  }
1652
1742
  );
@@ -1654,9 +1744,9 @@ function Tabs({ items, value, defaultValue, onChange, panels, className, style,
1654
1744
 
1655
1745
  // src/components/navigation/Breadcrumb.tsx
1656
1746
  import { Breadcrumbs as AriaBreadcrumbs, Breadcrumb as AriaBreadcrumb, Link as Link2 } from "react-aria-components";
1657
- import { jsx as jsx33, jsxs as jsxs26 } from "react/jsx-runtime";
1747
+ import { jsx as jsx34, jsxs as jsxs27 } from "react/jsx-runtime";
1658
1748
  function Breadcrumb({ items, onNavigate, className, style }) {
1659
- return /* @__PURE__ */ jsx33(
1749
+ return /* @__PURE__ */ jsx34(
1660
1750
  AriaBreadcrumbs,
1661
1751
  {
1662
1752
  className: cx("pire-breadcrumbs", className),
@@ -1665,9 +1755,9 @@ function Breadcrumb({ items, onNavigate, className, style }) {
1665
1755
  onAction: (key) => onNavigate?.(String(key)),
1666
1756
  children: (item) => {
1667
1757
  const last = items[items.length - 1] === item;
1668
- return /* @__PURE__ */ jsxs26(AriaBreadcrumb, { className: "pire-breadcrumb", id: item.id ?? item.label, children: [
1669
- last ? item.label : /* @__PURE__ */ jsx33(Link2, { href: item.href, children: item.label }),
1670
- last ? null : /* @__PURE__ */ jsx33(Icon, { name: "chevron-right", size: 12, style: { color: "var(--text-tertiary)" } })
1758
+ return /* @__PURE__ */ jsxs27(AriaBreadcrumb, { className: "pire-breadcrumb", id: item.id ?? item.label, children: [
1759
+ last ? item.label : /* @__PURE__ */ jsx34(Link2, { href: item.href, children: item.label }),
1760
+ last ? null : /* @__PURE__ */ jsx34(Icon, { name: "chevron-right", size: 12, style: { color: "var(--text-tertiary)" } })
1671
1761
  ] });
1672
1762
  }
1673
1763
  }
@@ -1675,7 +1765,7 @@ function Breadcrumb({ items, onNavigate, className, style }) {
1675
1765
  }
1676
1766
 
1677
1767
  // src/components/navigation/Pagination.tsx
1678
- import { jsx as jsx34, jsxs as jsxs27 } from "react/jsx-runtime";
1768
+ import { jsx as jsx35, jsxs as jsxs28 } from "react/jsx-runtime";
1679
1769
  function Pagination({
1680
1770
  page = 1,
1681
1771
  pageSize = 25,
@@ -1690,9 +1780,9 @@ function Pagination({
1690
1780
  const pages = Math.max(1, Math.ceil(total / pageSize));
1691
1781
  const from = total === 0 ? 0 : (page - 1) * pageSize + 1;
1692
1782
  const to = Math.min(total, page * pageSize);
1693
- return /* @__PURE__ */ jsxs27("nav", { className: cx("pire-pagination", className), style, "aria-label": msg.paginationLabel, children: [
1694
- /* @__PURE__ */ jsx34("span", { className: "pire-pagination-count", children: msg.paginationRange.replace("{from}", from.toLocaleString()).replace("{to}", to.toLocaleString()).replace("{total}", total.toLocaleString()) }),
1695
- /* @__PURE__ */ jsx34(
1783
+ return /* @__PURE__ */ jsxs28("nav", { className: cx("pire-pagination", className), style, "aria-label": msg.paginationLabel, children: [
1784
+ /* @__PURE__ */ jsx35("span", { className: "pire-pagination-count", children: msg.paginationRange.replace("{from}", from.toLocaleString()).replace("{to}", to.toLocaleString()).replace("{total}", total.toLocaleString()) }),
1785
+ /* @__PURE__ */ jsx35(
1696
1786
  IconButton,
1697
1787
  {
1698
1788
  icon: "chevron-left",
@@ -1703,8 +1793,8 @@ function Pagination({
1703
1793
  onPress: () => onPageChange?.(page - 1)
1704
1794
  }
1705
1795
  ),
1706
- /* @__PURE__ */ jsx34("span", { className: "pire-pagination-count", "aria-live": "polite", children: msg.paginationPageOf.replace("{page}", String(page)).replace("{pages}", String(pages)) }),
1707
- /* @__PURE__ */ jsx34(
1796
+ /* @__PURE__ */ jsx35("span", { className: "pire-pagination-count", "aria-live": "polite", children: msg.paginationPageOf.replace("{page}", String(page)).replace("{pages}", String(pages)) }),
1797
+ /* @__PURE__ */ jsx35(
1708
1798
  IconButton,
1709
1799
  {
1710
1800
  icon: "chevron-right",
@@ -1715,7 +1805,7 @@ function Pagination({
1715
1805
  onPress: () => onPageChange?.(page + 1)
1716
1806
  }
1717
1807
  ),
1718
- onPageSizeChange ? /* @__PURE__ */ jsx34(
1808
+ onPageSizeChange ? /* @__PURE__ */ jsx35(
1719
1809
  Select,
1720
1810
  {
1721
1811
  "aria-label": msg.paginationRowsPerPage,
@@ -1738,11 +1828,11 @@ import {
1738
1828
  Separator as AriaSeparator2,
1739
1829
  Header
1740
1830
  } from "react-aria-components";
1741
- import { jsx as jsx35, jsxs as jsxs28 } from "react/jsx-runtime";
1831
+ import { jsx as jsx36, jsxs as jsxs29 } from "react/jsx-runtime";
1742
1832
  function Menu({ minWidth, className, style, ...rest }) {
1743
1833
  const width = typeof minWidth === "number" ? `${minWidth}px` : minWidth;
1744
1834
  const menuStyle = width == null ? style : { ["--pire-menu-min-w"]: width, ...style };
1745
- return /* @__PURE__ */ jsx35(
1835
+ return /* @__PURE__ */ jsx36(
1746
1836
  AriaMenu,
1747
1837
  {
1748
1838
  className: cx("pire-menu", className),
@@ -1760,35 +1850,35 @@ function MenuItem({
1760
1850
  className,
1761
1851
  ...rest
1762
1852
  }) {
1763
- return /* @__PURE__ */ jsxs28(
1853
+ return /* @__PURE__ */ jsxs29(
1764
1854
  AriaMenuItem,
1765
1855
  {
1766
1856
  className: cx("pire-menu-item", className),
1767
1857
  "data-tone": tone === "danger" ? "danger" : void 0,
1768
1858
  ...rest,
1769
1859
  children: [
1770
- icon ? /* @__PURE__ */ jsx35(Icon, { name: icon, size: 16, className: "pire-menu-item-icon" }) : null,
1771
- /* @__PURE__ */ jsxs28("span", { className: "pire-menu-item-body", children: [
1772
- /* @__PURE__ */ jsx35("span", { className: "pire-menu-item-label", children }),
1773
- description ? /* @__PURE__ */ jsx35("span", { className: "pire-menu-item-desc", children: description }) : null
1860
+ icon ? /* @__PURE__ */ jsx36(Icon, { name: icon, size: 16, className: "pire-menu-item-icon" }) : null,
1861
+ /* @__PURE__ */ jsxs29("span", { className: "pire-menu-item-body", children: [
1862
+ /* @__PURE__ */ jsx36("span", { className: "pire-menu-item-label", children }),
1863
+ description ? /* @__PURE__ */ jsx36("span", { className: "pire-menu-item-desc", children: description }) : null
1774
1864
  ] }),
1775
- shortcut ? /* @__PURE__ */ jsx35("kbd", { className: "pire-menu-item-shortcut", children: shortcut }) : null
1865
+ shortcut ? /* @__PURE__ */ jsx36("kbd", { className: "pire-menu-item-shortcut", children: shortcut }) : null
1776
1866
  ]
1777
1867
  }
1778
1868
  );
1779
1869
  }
1780
1870
  function MenuSection({ title, children, className, ...rest }) {
1781
- return /* @__PURE__ */ jsxs28(AriaMenuSection, { className: cx("pire-menu-section", className), ...rest, children: [
1782
- title ? /* @__PURE__ */ jsx35(Header, { className: "pire-menu-section-title", children: title }) : null,
1871
+ return /* @__PURE__ */ jsxs29(AriaMenuSection, { className: cx("pire-menu-section", className), ...rest, children: [
1872
+ title ? /* @__PURE__ */ jsx36(Header, { className: "pire-menu-section-title", children: title }) : null,
1783
1873
  children
1784
1874
  ] });
1785
1875
  }
1786
1876
  function MenuSeparator({ className }) {
1787
- return /* @__PURE__ */ jsx35(AriaSeparator2, { className: cx("pire-menu-separator", className) });
1877
+ return /* @__PURE__ */ jsx36(AriaSeparator2, { className: cx("pire-menu-separator", className) });
1788
1878
  }
1789
1879
 
1790
1880
  // src/components/feedback/InlineMessage.tsx
1791
- import { jsx as jsx36, jsxs as jsxs29 } from "react/jsx-runtime";
1881
+ import { jsx as jsx37, jsxs as jsxs30 } from "react/jsx-runtime";
1792
1882
  var KIND_ICON = {
1793
1883
  info: "info",
1794
1884
  success: "check-circle-2",
@@ -1798,7 +1888,7 @@ var KIND_ICON = {
1798
1888
  function InlineMessage({ kind = "info", title, action, onClose, children, className, ...rest }) {
1799
1889
  const msg = usePireMessages();
1800
1890
  const assertive = kind === "error" || kind === "warning";
1801
- return /* @__PURE__ */ jsxs29(
1891
+ return /* @__PURE__ */ jsxs30(
1802
1892
  "div",
1803
1893
  {
1804
1894
  className: cx("pire-msg", className),
@@ -1807,13 +1897,13 @@ function InlineMessage({ kind = "info", title, action, onClose, children, classN
1807
1897
  "aria-live": assertive ? "assertive" : "polite",
1808
1898
  ...rest,
1809
1899
  children: [
1810
- /* @__PURE__ */ jsx36(Icon, { name: KIND_ICON[kind], size: 16, style: { marginTop: 2 } }),
1811
- /* @__PURE__ */ jsxs29("div", { style: { flex: 1, display: "flex", flexDirection: "column", gap: "var(--sp-1)" }, children: [
1812
- title ? /* @__PURE__ */ jsx36("span", { className: "pire-msg-title", children: title }) : null,
1813
- children ? /* @__PURE__ */ jsx36("span", { className: "pire-msg-body", children }) : null,
1900
+ /* @__PURE__ */ jsx37(Icon, { name: KIND_ICON[kind], size: 16, style: { marginTop: 2 } }),
1901
+ /* @__PURE__ */ jsxs30("div", { style: { flex: 1, display: "flex", flexDirection: "column", gap: "var(--sp-1)" }, children: [
1902
+ title ? /* @__PURE__ */ jsx37("span", { className: "pire-msg-title", children: title }) : null,
1903
+ children ? /* @__PURE__ */ jsx37("span", { className: "pire-msg-body", children }) : null,
1814
1904
  action
1815
1905
  ] }),
1816
- onClose ? /* @__PURE__ */ jsx36(IconButton, { icon: "x", label: msg.inlineMessageDismiss, size: "sm", onPress: onClose }) : null
1906
+ onClose ? /* @__PURE__ */ jsx37(IconButton, { icon: "x", label: msg.inlineMessageDismiss, size: "sm", onPress: onClose }) : null
1817
1907
  ]
1818
1908
  }
1819
1909
  );
@@ -1821,7 +1911,7 @@ function InlineMessage({ kind = "info", title, action, onClose, children, classN
1821
1911
 
1822
1912
  // src/components/feedback/ProgressBar.tsx
1823
1913
  import { ProgressBar as AriaProgressBar, Label as Label9 } from "react-aria-components";
1824
- import { Fragment as Fragment2, jsx as jsx37, jsxs as jsxs30 } from "react/jsx-runtime";
1914
+ import { Fragment as Fragment2, jsx as jsx38, jsxs as jsxs31 } from "react/jsx-runtime";
1825
1915
  function ProgressBar({
1826
1916
  value = 0,
1827
1917
  minValue = 0,
@@ -1834,7 +1924,7 @@ function ProgressBar({
1834
1924
  className,
1835
1925
  style
1836
1926
  }) {
1837
- return /* @__PURE__ */ jsx37(
1927
+ return /* @__PURE__ */ jsx38(
1838
1928
  AriaProgressBar,
1839
1929
  {
1840
1930
  className: cx("pire-progress", className),
@@ -1845,12 +1935,12 @@ function ProgressBar({
1845
1935
  maxValue,
1846
1936
  isIndeterminate,
1847
1937
  style,
1848
- children: ({ percentage, valueText }) => /* @__PURE__ */ jsxs30(Fragment2, { children: [
1849
- label || showValue ? /* @__PURE__ */ jsxs30("div", { className: "pire-progress-head", children: [
1850
- label ? /* @__PURE__ */ jsx37(Label9, { children: label }) : /* @__PURE__ */ jsx37("span", {}),
1851
- showValue && !isIndeterminate ? /* @__PURE__ */ jsx37("span", { className: "pire-numeric", children: valueText }) : null
1938
+ children: ({ percentage, valueText }) => /* @__PURE__ */ jsxs31(Fragment2, { children: [
1939
+ label || showValue ? /* @__PURE__ */ jsxs31("div", { className: "pire-progress-head", children: [
1940
+ label ? /* @__PURE__ */ jsx38(Label9, { children: label }) : /* @__PURE__ */ jsx38("span", {}),
1941
+ showValue && !isIndeterminate ? /* @__PURE__ */ jsx38("span", { className: "pire-numeric", children: valueText }) : null
1852
1942
  ] }) : null,
1853
- /* @__PURE__ */ jsx37("div", { className: "pire-progress-track", children: /* @__PURE__ */ jsx37("div", { className: "pire-progress-fill", style: { width: `${isIndeterminate ? 40 : percentage}%` } }) })
1943
+ /* @__PURE__ */ jsx38("div", { className: "pire-progress-track", children: /* @__PURE__ */ jsx38("div", { className: "pire-progress-fill", style: { width: `${isIndeterminate ? 40 : percentage}%` } }) })
1854
1944
  ] })
1855
1945
  }
1856
1946
  );
@@ -1858,7 +1948,7 @@ function ProgressBar({
1858
1948
 
1859
1949
  // src/components/feedback/Toast.tsx
1860
1950
  import * as React11 from "react";
1861
- import { jsx as jsx38, jsxs as jsxs31 } from "react/jsx-runtime";
1951
+ import { jsx as jsx39, jsxs as jsxs32 } from "react/jsx-runtime";
1862
1952
  var KIND_ICON2 = {
1863
1953
  info: "info",
1864
1954
  success: "check-circle-2",
@@ -1867,7 +1957,7 @@ var KIND_ICON2 = {
1867
1957
  };
1868
1958
  function Toast({ kind = "success", onClose, position = "bottom-center", children, className, ...rest }) {
1869
1959
  const msg = usePireMessages();
1870
- return /* @__PURE__ */ jsxs31(
1960
+ return /* @__PURE__ */ jsxs32(
1871
1961
  "div",
1872
1962
  {
1873
1963
  className: cx("pire-toast", className),
@@ -1876,9 +1966,9 @@ function Toast({ kind = "success", onClose, position = "bottom-center", children
1876
1966
  "aria-live": kind === "error" ? "assertive" : "polite",
1877
1967
  ...rest,
1878
1968
  children: [
1879
- /* @__PURE__ */ jsx38(Icon, { name: KIND_ICON2[kind], size: 16 }),
1880
- /* @__PURE__ */ jsx38("span", { style: { flex: 1 }, children }),
1881
- onClose ? /* @__PURE__ */ jsx38(IconButton, { icon: "x", label: msg.toastDismiss, size: "sm", variant: "inverse", onPress: onClose }) : null
1969
+ /* @__PURE__ */ jsx39(Icon, { name: KIND_ICON2[kind], size: 16 }),
1970
+ /* @__PURE__ */ jsx39("span", { style: { flex: 1 }, children }),
1971
+ onClose ? /* @__PURE__ */ jsx39(IconButton, { icon: "x", label: msg.toastDismiss, size: "sm", variant: "inverse", onPress: onClose }) : null
1882
1972
  ]
1883
1973
  }
1884
1974
  );
@@ -1896,9 +1986,9 @@ function ToastProvider({ children, timeout = 6e3 }) {
1896
1986
  return id;
1897
1987
  }, [close, timeout]);
1898
1988
  const value = React11.useMemo(() => ({ add, close }), [add, close]);
1899
- return /* @__PURE__ */ jsxs31(ToastContext.Provider, { value, children: [
1989
+ return /* @__PURE__ */ jsxs32(ToastContext.Provider, { value, children: [
1900
1990
  children,
1901
- /* @__PURE__ */ jsx38("div", { className: "pire-toast-region", role: "region", "aria-label": msg.toastRegionLabel, children: toasts.map((t) => /* @__PURE__ */ jsx38(Toast, { kind: t.kind, onClose: () => close(t.id), style: { position: "static", transform: "none" }, children: t.message }, t.id)) })
1991
+ /* @__PURE__ */ jsx39("div", { className: "pire-toast-region", role: "region", "aria-label": msg.toastRegionLabel, children: toasts.map((t) => /* @__PURE__ */ jsx39(Toast, { kind: t.kind, onClose: () => close(t.id), style: { position: "static", transform: "none" }, children: t.message }, t.id)) })
1902
1992
  ] });
1903
1993
  }
1904
1994
  function useToast() {
@@ -1907,54 +1997,9 @@ function useToast() {
1907
1997
  return ctx;
1908
1998
  }
1909
1999
 
1910
- // src/components/feedback/Skeleton.tsx
1911
- import { jsx as jsx39 } from "react/jsx-runtime";
1912
- function Skeleton({ shape = "text", width, height, className, style, ...rest }) {
1913
- return /* @__PURE__ */ jsx39(
1914
- "div",
1915
- {
1916
- className: cx("pire-skeleton", className),
1917
- "data-shape": shape,
1918
- "aria-hidden": "true",
1919
- style: { width, height, ...style },
1920
- ...rest
1921
- }
1922
- );
1923
- }
1924
- var BAR_WIDTHS = ["72%", "54%", "86%", "63%"];
1925
- function SkeletonTableRow({ columns, density = "regular", className, style, ...rest }) {
1926
- const cells = typeof columns === "number" ? Array.from({ length: columns }, () => ({})) : columns;
1927
- return /* @__PURE__ */ jsx39(
1928
- "div",
1929
- {
1930
- className: cx("pire-skeleton-row", className),
1931
- "data-density": density,
1932
- "aria-hidden": "true",
1933
- style,
1934
- ...rest,
1935
- children: cells.map((c, i) => {
1936
- const align = c.numeric ? "right" : c.align ?? "left";
1937
- return (
1938
- // biome-ignore lint/suspicious/noArrayIndexKey: columns are positional and never reordered.
1939
- /* @__PURE__ */ jsx39(
1940
- "div",
1941
- {
1942
- className: "pire-skeleton-cell",
1943
- "data-align": align,
1944
- style: { width: c.width, flex: c.width ? "0 0 auto" : void 0 },
1945
- children: /* @__PURE__ */ jsx39(Skeleton, { width: BAR_WIDTHS[i % BAR_WIDTHS.length] })
1946
- },
1947
- i
1948
- )
1949
- );
1950
- })
1951
- }
1952
- );
1953
- }
1954
-
1955
2000
  // src/components/data/KpiTile.tsx
1956
2001
  import { Button as AriaButton10 } from "react-aria-components";
1957
- import { Fragment as Fragment3, jsx as jsx40, jsxs as jsxs32 } from "react/jsx-runtime";
2002
+ import { Fragment as Fragment3, jsx as jsx40, jsxs as jsxs33 } from "react/jsx-runtime";
1958
2003
  function KpiTile({
1959
2004
  label,
1960
2005
  value,
@@ -1970,16 +2015,16 @@ function KpiTile({
1970
2015
  style
1971
2016
  }) {
1972
2017
  const tone = deltaTone ?? (deltaDirection === "down" ? "negative" : "positive");
1973
- const body = /* @__PURE__ */ jsxs32(Fragment3, { children: [
1974
- /* @__PURE__ */ jsxs32("span", { className: "pire-kpi-label", children: [
2018
+ const body = /* @__PURE__ */ jsxs33(Fragment3, { children: [
2019
+ /* @__PURE__ */ jsxs33("span", { className: "pire-kpi-label", children: [
1975
2020
  icon ? /* @__PURE__ */ jsx40(Icon, { name: icon, size: 16 }) : null,
1976
2021
  label
1977
2022
  ] }),
1978
- /* @__PURE__ */ jsxs32("span", { className: "pire-kpi-value", children: [
2023
+ /* @__PURE__ */ jsxs33("span", { className: "pire-kpi-value", children: [
1979
2024
  value,
1980
2025
  unit ? /* @__PURE__ */ jsx40("span", { className: "pire-kpi-unit", children: unit }) : null
1981
2026
  ] }),
1982
- delta ? /* @__PURE__ */ jsxs32("span", { className: "pire-kpi-delta", "data-tone": tone, children: [
2027
+ delta ? /* @__PURE__ */ jsxs33("span", { className: "pire-kpi-delta", "data-tone": tone, children: [
1983
2028
  deltaDirection ? /* @__PURE__ */ jsx40(Icon, { name: deltaDirection === "up" ? "trending-up" : "trending-down", size: 12 }) : null,
1984
2029
  delta
1985
2030
  ] }) : null,
@@ -1990,14 +2035,14 @@ function KpiTile({
1990
2035
  }
1991
2036
 
1992
2037
  // src/components/data/ObjectHeader.tsx
1993
- import { jsx as jsx41, jsxs as jsxs33 } from "react/jsx-runtime";
2038
+ import { jsx as jsx41, jsxs as jsxs34 } from "react/jsx-runtime";
1994
2039
  function ObjectHeader({ title, subtitle, id, breadcrumb, badge, facts, actions, className, ...rest }) {
1995
- return /* @__PURE__ */ jsxs33("header", { className: cx("pire-objheader", className), ...rest, children: [
2040
+ return /* @__PURE__ */ jsxs34("header", { className: cx("pire-objheader", className), ...rest, children: [
1996
2041
  breadcrumb,
1997
- /* @__PURE__ */ jsxs33("div", { className: "pire-objheader-row", children: [
1998
- /* @__PURE__ */ jsxs33("div", { style: { minWidth: 0 }, children: [
2042
+ /* @__PURE__ */ jsxs34("div", { className: "pire-objheader-row", children: [
2043
+ /* @__PURE__ */ jsxs34("div", { style: { minWidth: 0 }, children: [
1999
2044
  /* @__PURE__ */ jsx41("h1", { className: "pire-objheader-title", children: title }),
2000
- subtitle || id ? /* @__PURE__ */ jsxs33("div", { className: "pire-objheader-sub", children: [
2045
+ subtitle || id ? /* @__PURE__ */ jsxs34("div", { className: "pire-objheader-sub", children: [
2001
2046
  subtitle,
2002
2047
  id ? /* @__PURE__ */ jsx41("span", { className: "pire-objheader-id", children: id }) : null
2003
2048
  ] }) : null
@@ -2005,7 +2050,7 @@ function ObjectHeader({ title, subtitle, id, breadcrumb, badge, facts, actions,
2005
2050
  badge,
2006
2051
  actions ? /* @__PURE__ */ jsx41("div", { className: "pire-objheader-actions", children: actions }) : null
2007
2052
  ] }),
2008
- facts?.length ? /* @__PURE__ */ jsx41("dl", { className: "pire-facts", style: { margin: 0 }, children: facts.map((fact) => /* @__PURE__ */ jsxs33("div", { children: [
2053
+ facts?.length ? /* @__PURE__ */ jsx41("dl", { className: "pire-facts", style: { margin: 0 }, children: facts.map((fact) => /* @__PURE__ */ jsxs34("div", { children: [
2009
2054
  /* @__PURE__ */ jsx41("dt", { className: "pire-fact-label", children: fact.label }),
2010
2055
  /* @__PURE__ */ jsx41("dd", { className: "pire-fact-value", "data-numeric": fact.numeric ? "true" : void 0, style: { margin: 0 }, children: fact.value })
2011
2056
  ] }, fact.label)) }) : null
@@ -2013,7 +2058,7 @@ function ObjectHeader({ title, subtitle, id, breadcrumb, badge, facts, actions,
2013
2058
  }
2014
2059
 
2015
2060
  // src/components/data/FilterBar.tsx
2016
- import { jsx as jsx42, jsxs as jsxs34 } from "react/jsx-runtime";
2061
+ import { jsx as jsx42, jsxs as jsxs35 } from "react/jsx-runtime";
2017
2062
  function FilterBar({
2018
2063
  children,
2019
2064
  activeFilters = [],
@@ -2030,12 +2075,12 @@ function FilterBar({
2030
2075
  const label = useMessage("filterBarLabel", rest["aria-label"]);
2031
2076
  const go = useMessage("filterBarGo", goLabel);
2032
2077
  const clearAll = useMessage("filterBarClearAll", clearAllLabel);
2033
- return /* @__PURE__ */ jsxs34("section", { className: cx("pire-filterbar", className), ...rest, "aria-label": label, children: [
2034
- /* @__PURE__ */ jsxs34("div", { className: "pire-filterbar-controls", children: [
2078
+ return /* @__PURE__ */ jsxs35("section", { className: cx("pire-filterbar", className), ...rest, "aria-label": label, children: [
2079
+ /* @__PURE__ */ jsxs35("div", { className: "pire-filterbar-controls", children: [
2035
2080
  children,
2036
2081
  onGo ? /* @__PURE__ */ jsx42(Button, { variant: "primary", onPress: onGo, children: go }) : null
2037
2082
  ] }),
2038
- activeFilters.length || resultLabel || actions ? /* @__PURE__ */ jsxs34("div", { className: "pire-filterbar-foot", children: [
2083
+ activeFilters.length || resultLabel || actions ? /* @__PURE__ */ jsxs35("div", { className: "pire-filterbar-foot", children: [
2039
2084
  activeFilters.map((filter) => /* @__PURE__ */ jsx42(Tag, { onRemove: onRemoveFilter ? () => onRemoveFilter(filter.id) : void 0, children: filter.label }, filter.id)),
2040
2085
  activeFilters.length && onClear ? /* @__PURE__ */ jsx42(Button, { variant: "tertiary", size: "sm", onPress: onClear, children: clearAll }) : null,
2041
2086
  resultLabel ? /* @__PURE__ */ jsx42("span", { className: "pire-filterbar-result", "aria-live": "polite", children: resultLabel }) : null,
@@ -2045,7 +2090,7 @@ function FilterBar({
2045
2090
  }
2046
2091
 
2047
2092
  // src/components/data/DescriptionList.tsx
2048
- import { jsx as jsx43, jsxs as jsxs35 } from "react/jsx-runtime";
2093
+ import { jsx as jsx43, jsxs as jsxs36 } from "react/jsx-runtime";
2049
2094
  function DescriptionList({ items, layout = "rows", columns = 3, className, style, ...rest }) {
2050
2095
  return /* @__PURE__ */ jsx43(
2051
2096
  "dl",
@@ -2054,8 +2099,8 @@ function DescriptionList({ items, layout = "rows", columns = 3, className, style
2054
2099
  "data-layout": layout,
2055
2100
  style: { ...layout === "grid" ? { "--pire-dl-cols": columns } : null, ...style },
2056
2101
  ...rest,
2057
- children: items.map((item, i) => /* @__PURE__ */ jsxs35("div", { className: "pire-dl-row", "data-emphasis": item.emphasis ? "true" : void 0, children: [
2058
- /* @__PURE__ */ jsxs35("dt", { className: "pire-dl-term", children: [
2102
+ children: items.map((item, i) => /* @__PURE__ */ jsxs36("div", { className: "pire-dl-row", "data-emphasis": item.emphasis ? "true" : void 0, children: [
2103
+ /* @__PURE__ */ jsxs36("dt", { className: "pire-dl-term", children: [
2059
2104
  item.label,
2060
2105
  item.hint
2061
2106
  ] }),
@@ -2066,10 +2111,10 @@ function DescriptionList({ items, layout = "rows", columns = 3, className, style
2066
2111
  }
2067
2112
 
2068
2113
  // src/components/data/Timeline.tsx
2069
- import { jsx as jsx44, jsxs as jsxs36 } from "react/jsx-runtime";
2114
+ import { jsx as jsx44, jsxs as jsxs37 } from "react/jsx-runtime";
2070
2115
  function Timeline({ entries, reverse = false, className, ...rest }) {
2071
2116
  const list = reverse ? [...entries].reverse() : entries;
2072
- return /* @__PURE__ */ jsx44("ol", { className: cx("pire-timeline", className), ...rest, children: list.map((entry, i) => /* @__PURE__ */ jsxs36("li", { className: "pire-timeline-item", children: [
2117
+ return /* @__PURE__ */ jsx44("ol", { className: cx("pire-timeline", className), ...rest, children: list.map((entry, i) => /* @__PURE__ */ jsxs37("li", { className: "pire-timeline-item", children: [
2073
2118
  /* @__PURE__ */ jsx44("span", { className: "pire-timeline-time", children: entry.time }),
2074
2119
  /* @__PURE__ */ jsx44("span", { className: "pire-timeline-text", children: entry.event }),
2075
2120
  entry.actor ? /* @__PURE__ */ jsx44("span", { className: "pire-timeline-actor", children: entry.actor }) : null
@@ -2078,9 +2123,9 @@ function Timeline({ entries, reverse = false, className, ...rest }) {
2078
2123
 
2079
2124
  // src/components/data/LinkList.tsx
2080
2125
  import { Button as AriaButton11 } from "react-aria-components";
2081
- import { jsx as jsx45, jsxs as jsxs37 } from "react/jsx-runtime";
2126
+ import { jsx as jsx45, jsxs as jsxs38 } from "react/jsx-runtime";
2082
2127
  function LinkList({ items, onSelect, className, ...rest }) {
2083
- return /* @__PURE__ */ jsx45("div", { className: cx("pire-linklist", className), role: "list", ...rest, children: items.map((item) => /* @__PURE__ */ jsxs37(AriaButton11, { className: "pire-linklist-item", onPress: () => onSelect?.(item.id), children: [
2128
+ return /* @__PURE__ */ jsx45("div", { className: cx("pire-linklist", className), role: "list", ...rest, children: items.map((item) => /* @__PURE__ */ jsxs38(AriaButton11, { className: "pire-linklist-item", onPress: () => onSelect?.(item.id), children: [
2084
2129
  item.icon ? /* @__PURE__ */ jsx45(Icon, { name: item.icon, size: 16, style: { color: "var(--text-secondary)" } }) : null,
2085
2130
  item.key ? /* @__PURE__ */ jsx45("span", { className: "pire-linklist-key", children: item.key }) : null,
2086
2131
  item.text ? /* @__PURE__ */ jsx45("span", { className: "pire-linklist-text", children: item.text }) : null,
@@ -2088,57 +2133,78 @@ function LinkList({ items, onSelect, className, ...rest }) {
2088
2133
  ] }, item.id)) });
2089
2134
  }
2090
2135
 
2136
+ // src/components/layout/PageBand.tsx
2137
+ import { jsx as jsx46 } from "react/jsx-runtime";
2138
+ function PageBand({
2139
+ surface = "card",
2140
+ hasBorder = true,
2141
+ children,
2142
+ className,
2143
+ ...rest
2144
+ }) {
2145
+ return /* @__PURE__ */ jsx46(
2146
+ "div",
2147
+ {
2148
+ className: cx("pire-pageband", className),
2149
+ "data-surface": surface,
2150
+ "data-border": hasBorder ? "true" : void 0,
2151
+ ...rest,
2152
+ children
2153
+ }
2154
+ );
2155
+ }
2156
+
2091
2157
  // src/components/layout/PageHeader.tsx
2092
- import { jsx as jsx46, jsxs as jsxs38 } from "react/jsx-runtime";
2158
+ import { jsx as jsx47, jsxs as jsxs39 } from "react/jsx-runtime";
2093
2159
  function PageHeader({ title, subtitle, actions, className, ...rest }) {
2094
- return /* @__PURE__ */ jsxs38("header", { className: cx("pire-pageheader", className), ...rest, children: [
2095
- /* @__PURE__ */ jsxs38("div", { style: { minWidth: 0 }, children: [
2096
- /* @__PURE__ */ jsx46("h1", { className: "pire-pageheader-title", children: title }),
2097
- subtitle ? /* @__PURE__ */ jsx46("p", { className: "pire-pageheader-sub", children: subtitle }) : null
2160
+ return /* @__PURE__ */ jsxs39("header", { className: cx("pire-pageheader", className), ...rest, children: [
2161
+ /* @__PURE__ */ jsxs39("div", { style: { minWidth: 0 }, children: [
2162
+ /* @__PURE__ */ jsx47("h1", { className: "pire-pageheader-title", children: title }),
2163
+ subtitle ? /* @__PURE__ */ jsx47("p", { className: "pire-pageheader-sub", children: subtitle }) : null
2098
2164
  ] }),
2099
- actions ? /* @__PURE__ */ jsx46("div", { className: "pire-pageheader-actions", children: actions }) : null
2165
+ actions ? /* @__PURE__ */ jsx47("div", { className: "pire-pageheader-actions", children: actions }) : null
2100
2166
  ] });
2101
2167
  }
2102
2168
 
2103
2169
  // src/components/layout/SectionHeader.tsx
2104
- import { jsx as jsx47, jsxs as jsxs39 } from "react/jsx-runtime";
2170
+ import { jsx as jsx48, jsxs as jsxs40 } from "react/jsx-runtime";
2105
2171
  function SectionHeader({ title, meta, actions, className, ...rest }) {
2106
- return /* @__PURE__ */ jsxs39("div", { className: cx("pire-sectionhead", className), ...rest, children: [
2107
- /* @__PURE__ */ jsx47("span", { className: "pire-eyebrow", children: title }),
2108
- meta ? /* @__PURE__ */ jsx47("span", { style: { font: "var(--type-caption)", color: "var(--text-tertiary)" }, children: meta }) : null,
2109
- actions ? /* @__PURE__ */ jsx47("div", { className: "pire-sectionhead-actions", children: actions }) : null
2172
+ return /* @__PURE__ */ jsxs40("div", { className: cx("pire-sectionhead", className), ...rest, children: [
2173
+ /* @__PURE__ */ jsx48("span", { className: "pire-eyebrow", children: title }),
2174
+ meta ? /* @__PURE__ */ jsx48("span", { style: { font: "var(--type-caption)", color: "var(--text-tertiary)" }, children: meta }) : null,
2175
+ actions ? /* @__PURE__ */ jsx48("div", { className: "pire-sectionhead-actions", children: actions }) : null
2110
2176
  ] });
2111
2177
  }
2112
2178
 
2113
2179
  // src/components/layout/SelectionBar.tsx
2114
- import { jsx as jsx48, jsxs as jsxs40 } from "react/jsx-runtime";
2180
+ import { jsx as jsx49, jsxs as jsxs41 } from "react/jsx-runtime";
2115
2181
  function SelectionBar({ count, noun = "record", children, actions, className, ...rest }) {
2116
2182
  if (!count) return null;
2117
- return /* @__PURE__ */ jsxs40("div", { className: cx("pire-selectionbar", className), role: "status", "aria-live": "polite", ...rest, children: [
2118
- /* @__PURE__ */ jsxs40("span", { className: "pire-selectionbar-count", children: [
2183
+ return /* @__PURE__ */ jsxs41("div", { className: cx("pire-selectionbar", className), role: "status", "aria-live": "polite", ...rest, children: [
2184
+ /* @__PURE__ */ jsxs41("span", { className: "pire-selectionbar-count", children: [
2119
2185
  count.toLocaleString(),
2120
2186
  " ",
2121
2187
  noun,
2122
2188
  count === 1 ? "" : "s",
2123
2189
  " selected"
2124
2190
  ] }),
2125
- children ? /* @__PURE__ */ jsx48("span", { style: { color: "var(--text-secondary)", font: "var(--type-caption)" }, children }) : null,
2126
- actions ? /* @__PURE__ */ jsx48("div", { className: "pire-selectionbar-actions", children: actions }) : null
2191
+ children ? /* @__PURE__ */ jsx49("span", { style: { color: "var(--text-secondary)", font: "var(--type-caption)" }, children }) : null,
2192
+ actions ? /* @__PURE__ */ jsx49("div", { className: "pire-selectionbar-actions", children: actions }) : null
2127
2193
  ] });
2128
2194
  }
2129
2195
 
2130
2196
  // src/components/layout/FooterBar.tsx
2131
- import { jsx as jsx49, jsxs as jsxs41 } from "react/jsx-runtime";
2197
+ import { jsx as jsx50, jsxs as jsxs42 } from "react/jsx-runtime";
2132
2198
  function FooterBar({ note, actions, children, className, ...rest }) {
2133
- return /* @__PURE__ */ jsxs41("footer", { className: cx("pire-footerbar", className), ...rest, children: [
2134
- note ? /* @__PURE__ */ jsx49("span", { className: "pire-footerbar-note", children: note }) : null,
2199
+ return /* @__PURE__ */ jsxs42("footer", { className: cx("pire-footerbar", className), ...rest, children: [
2200
+ note ? /* @__PURE__ */ jsx50("span", { className: "pire-footerbar-note", children: note }) : null,
2135
2201
  children,
2136
- actions ? /* @__PURE__ */ jsx49("div", { className: "pire-footerbar-actions", children: actions }) : null
2202
+ actions ? /* @__PURE__ */ jsx50("div", { className: "pire-footerbar-actions", children: actions }) : null
2137
2203
  ] });
2138
2204
  }
2139
2205
 
2140
2206
  // src/components/patterns/ConfirmDialog.tsx
2141
- import { Fragment as Fragment4, jsx as jsx50, jsxs as jsxs42 } from "react/jsx-runtime";
2207
+ import { Fragment as Fragment4, jsx as jsx51, jsxs as jsxs43 } from "react/jsx-runtime";
2142
2208
  function ConfirmDialog({
2143
2209
  isOpen,
2144
2210
  title,
@@ -2152,7 +2218,7 @@ function ConfirmDialog({
2152
2218
  onConfirm,
2153
2219
  onCancel
2154
2220
  }) {
2155
- return /* @__PURE__ */ jsxs42(
2221
+ return /* @__PURE__ */ jsxs43(
2156
2222
  Dialog,
2157
2223
  {
2158
2224
  isOpen,
@@ -2162,12 +2228,12 @@ function ConfirmDialog({
2162
2228
  onClose: onCancel,
2163
2229
  isDismissable: !isBusy,
2164
2230
  showClose: false,
2165
- footer: /* @__PURE__ */ jsxs42(Fragment4, { children: [
2166
- /* @__PURE__ */ jsx50(Button, { variant: "tertiary", isDisabled: isBusy, onPress: onCancel, children: cancelLabel }),
2167
- /* @__PURE__ */ jsx50(Button, { variant: tone === "danger" ? "danger" : "primary", isDisabled: isBusy, onPress: onConfirm, children: isBusy ? "Working\u2026" : confirmLabel })
2231
+ footer: /* @__PURE__ */ jsxs43(Fragment4, { children: [
2232
+ /* @__PURE__ */ jsx51(Button, { variant: "tertiary", isDisabled: isBusy, onPress: onCancel, children: cancelLabel }),
2233
+ /* @__PURE__ */ jsx51(Button, { variant: tone === "danger" ? "danger" : "primary", isDisabled: isBusy, onPress: onConfirm, children: isBusy ? "Working\u2026" : confirmLabel })
2168
2234
  ] }),
2169
2235
  children: [
2170
- consequence ? /* @__PURE__ */ jsx50(InlineMessage, { kind: tone === "danger" ? "error" : "warning", style: { marginBottom: children ? "var(--sp-3)" : 0 }, children: consequence }) : null,
2236
+ consequence ? /* @__PURE__ */ jsx51(InlineMessage, { kind: tone === "danger" ? "error" : "warning", style: { marginBottom: children ? "var(--sp-3)" : 0 }, children: consequence }) : null,
2171
2237
  children
2172
2238
  ]
2173
2239
  }
@@ -2176,10 +2242,10 @@ function ConfirmDialog({
2176
2242
 
2177
2243
  // src/components/patterns/SidePanel.tsx
2178
2244
  import { ModalOverlay as ModalOverlay2, Modal as Modal2, Dialog as AriaDialog3, Heading as Heading4 } from "react-aria-components";
2179
- import { jsx as jsx51, jsxs as jsxs43 } from "react/jsx-runtime";
2245
+ import { jsx as jsx52, jsxs as jsxs44 } from "react/jsx-runtime";
2180
2246
  function SidePanel({ isOpen, title, subtitle, width = 400, children, footer, onClose, className }) {
2181
2247
  const msg = usePireMessages();
2182
- return /* @__PURE__ */ jsx51(
2248
+ return /* @__PURE__ */ jsx52(
2183
2249
  ModalOverlay2,
2184
2250
  {
2185
2251
  className: "pire-sidepanel-overlay",
@@ -2188,28 +2254,28 @@ function SidePanel({ isOpen, title, subtitle, width = 400, children, footer, onC
2188
2254
  onOpenChange: (o) => {
2189
2255
  if (!o) onClose?.();
2190
2256
  },
2191
- children: /* @__PURE__ */ jsx51(Modal2, { className: cx("pire-sidepanel", className), style: { width }, children: /* @__PURE__ */ jsxs43(AriaDialog3, { className: "pire-dialog", style: { height: "100%" }, children: [
2192
- /* @__PURE__ */ jsxs43("header", { className: "pire-dialog-head", children: [
2193
- /* @__PURE__ */ jsxs43("div", { style: { flex: 1, minWidth: 0 }, children: [
2194
- /* @__PURE__ */ jsx51(Heading4, { slot: "title", className: "pire-dialog-title", children: title }),
2195
- subtitle ? /* @__PURE__ */ jsx51("p", { className: "pire-dialog-sub", style: { margin: 0 }, children: subtitle }) : null
2257
+ children: /* @__PURE__ */ jsx52(Modal2, { className: cx("pire-sidepanel", className), style: { width }, children: /* @__PURE__ */ jsxs44(AriaDialog3, { className: "pire-dialog", style: { height: "100%" }, children: [
2258
+ /* @__PURE__ */ jsxs44("header", { className: "pire-dialog-head", children: [
2259
+ /* @__PURE__ */ jsxs44("div", { style: { flex: 1, minWidth: 0 }, children: [
2260
+ /* @__PURE__ */ jsx52(Heading4, { slot: "title", className: "pire-dialog-title", children: title }),
2261
+ subtitle ? /* @__PURE__ */ jsx52("p", { className: "pire-dialog-sub", style: { margin: 0 }, children: subtitle }) : null
2196
2262
  ] }),
2197
- /* @__PURE__ */ jsx51(IconButton, { icon: "x", label: msg.sidePanelClose, size: "sm", onPress: onClose })
2263
+ /* @__PURE__ */ jsx52(IconButton, { icon: "x", label: msg.sidePanelClose, size: "sm", onPress: onClose })
2198
2264
  ] }),
2199
- /* @__PURE__ */ jsx51("div", { className: "pire-dialog-body", style: { flex: 1 }, children }),
2200
- footer ? /* @__PURE__ */ jsx51("footer", { className: "pire-dialog-foot", children: footer }) : null
2265
+ /* @__PURE__ */ jsx52("div", { className: "pire-dialog-body", style: { flex: 1 }, children }),
2266
+ footer ? /* @__PURE__ */ jsx52("footer", { className: "pire-dialog-foot", children: footer }) : null
2201
2267
  ] }) })
2202
2268
  }
2203
2269
  );
2204
2270
  }
2205
2271
 
2206
2272
  // src/components/patterns/EmptyState.tsx
2207
- import { jsx as jsx52, jsxs as jsxs44 } from "react/jsx-runtime";
2273
+ import { jsx as jsx53, jsxs as jsxs45 } from "react/jsx-runtime";
2208
2274
  function EmptyState({ icon = "file-text", title, action, compact, children, className, ...rest }) {
2209
- return /* @__PURE__ */ jsxs44("div", { className: cx("pire-empty", className), "data-compact": compact ? "true" : void 0, ...rest, children: [
2210
- /* @__PURE__ */ jsx52(Icon, { name: icon, size: 24, className: "pire-empty-icon" }),
2211
- title ? /* @__PURE__ */ jsx52("p", { className: "pire-empty-title", style: { margin: 0 }, children: title }) : null,
2212
- children ? /* @__PURE__ */ jsx52("p", { className: "pire-empty-body", style: { margin: 0 }, children }) : null,
2275
+ return /* @__PURE__ */ jsxs45("div", { className: cx("pire-empty", className), "data-compact": compact ? "true" : void 0, ...rest, children: [
2276
+ /* @__PURE__ */ jsx53(Icon, { name: icon, size: 24, className: "pire-empty-icon" }),
2277
+ title ? /* @__PURE__ */ jsx53("p", { className: "pire-empty-title", style: { margin: 0 }, children: title }) : null,
2278
+ children ? /* @__PURE__ */ jsx53("p", { className: "pire-empty-body", style: { margin: 0 }, children }) : null,
2213
2279
  action
2214
2280
  ] });
2215
2281
  }
@@ -2251,6 +2317,7 @@ export {
2251
2317
  MultiComboBox,
2252
2318
  NumberField,
2253
2319
  ObjectHeader,
2320
+ PageBand,
2254
2321
  PageHeader,
2255
2322
  Pagination,
2256
2323
  PireIntlProvider,