@orianatech/pire 0.5.0 → 0.6.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.
Files changed (47) hide show
  1. package/dist/components/core/Heading.d.cts +15 -0
  2. package/dist/components/core/Heading.d.ts +16 -0
  3. package/dist/components/core/Heading.d.ts.map +1 -0
  4. package/dist/components/core/Link.d.cts +13 -0
  5. package/dist/components/core/Link.d.ts +14 -0
  6. package/dist/components/core/Link.d.ts.map +1 -0
  7. package/dist/components/core/Separator.d.cts +12 -0
  8. package/dist/components/core/Separator.d.ts +13 -0
  9. package/dist/components/core/Separator.d.ts.map +1 -0
  10. package/dist/components/core/Text.d.cts +29 -0
  11. package/dist/components/core/Text.d.ts +30 -0
  12. package/dist/components/core/Text.d.ts.map +1 -0
  13. package/dist/components/data/DataTable.d.ts.map +1 -1
  14. package/dist/components/data/FilterBar.d.cts +7 -1
  15. package/dist/components/data/FilterBar.d.ts +7 -1
  16. package/dist/components/data/FilterBar.d.ts.map +1 -1
  17. package/dist/components/feedback/Dialog.d.ts.map +1 -1
  18. package/dist/components/feedback/InlineMessage.d.ts.map +1 -1
  19. package/dist/components/feedback/Toast.d.ts.map +1 -1
  20. package/dist/components/forms/ComboBox.d.ts.map +1 -1
  21. package/dist/components/forms/DatePicker.d.ts.map +1 -1
  22. package/dist/components/forms/MultiComboBox.d.ts.map +1 -1
  23. package/dist/components/forms/NumberField.d.ts.map +1 -1
  24. package/dist/components/forms/ValueHelpField.d.ts.map +1 -1
  25. package/dist/components/navigation/Menu.d.cts +39 -0
  26. package/dist/components/navigation/Menu.d.ts +40 -0
  27. package/dist/components/navigation/Menu.d.ts.map +1 -0
  28. package/dist/components/navigation/Pagination.d.ts.map +1 -1
  29. package/dist/components/navigation/SideNav.d.ts.map +1 -1
  30. package/dist/components/patterns/SidePanel.d.ts.map +1 -1
  31. package/dist/components/patterns/ValueHelpDialog.d.ts.map +1 -1
  32. package/dist/components.css +67 -0
  33. package/dist/i18n/PireIntlProvider.d.cts +21 -0
  34. package/dist/i18n/PireIntlProvider.d.ts +22 -0
  35. package/dist/i18n/PireIntlProvider.d.ts.map +1 -0
  36. package/dist/i18n/messages.d.cts +64 -0
  37. package/dist/i18n/messages.d.ts +65 -0
  38. package/dist/i18n/messages.d.ts.map +1 -0
  39. package/dist/index.cjs +673 -399
  40. package/dist/index.cjs.map +1 -1
  41. package/dist/index.d.cts +8 -1
  42. package/dist/index.d.ts +8 -1
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +627 -359
  45. package/dist/index.js.map +1 -1
  46. package/dist/tokens/typography.css +5 -0
  47. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -42,43 +42,52 @@ __export(src_exports, {
42
42
  DatePicker: () => DatePicker,
43
43
  DescriptionList: () => DescriptionList,
44
44
  Dialog: () => Dialog,
45
- DialogTrigger: () => import_react_aria_components25.DialogTrigger,
45
+ DialogTrigger: () => import_react_aria_components29.DialogTrigger,
46
46
  EmptyState: () => EmptyState,
47
47
  FilterBar: () => FilterBar,
48
48
  FooterBar: () => FooterBar,
49
49
  FormField: () => FormField,
50
- I18nProvider: () => import_react_aria_components25.I18nProvider,
50
+ Heading: () => Heading,
51
+ I18nProvider: () => import_react_aria_components29.I18nProvider,
51
52
  Icon: () => Icon,
52
53
  IconButton: () => IconButton,
53
54
  InlineMessage: () => InlineMessage,
54
55
  Input: () => Input,
55
56
  KpiTile: () => KpiTile,
57
+ Link: () => Link,
56
58
  LinkList: () => LinkList,
57
- Menu: () => import_react_aria_components25.Menu,
58
- MenuItem: () => import_react_aria_components25.MenuItem,
59
- MenuTrigger: () => import_react_aria_components25.MenuTrigger,
59
+ Menu: () => Menu,
60
+ MenuItem: () => MenuItem,
61
+ MenuSection: () => MenuSection,
62
+ MenuSeparator: () => MenuSeparator,
63
+ MenuTrigger: () => import_react_aria_components29.MenuTrigger,
60
64
  MultiComboBox: () => MultiComboBox,
61
65
  NumberField: () => NumberField,
62
66
  ObjectHeader: () => ObjectHeader,
63
67
  PageHeader: () => PageHeader,
64
68
  Pagination: () => Pagination,
65
- Popover: () => import_react_aria_components25.Popover,
69
+ PireIntlProvider: () => PireIntlProvider,
70
+ Popover: () => import_react_aria_components29.Popover,
66
71
  ProgressBar: () => ProgressBar,
67
72
  Radio: () => Radio,
68
73
  RadioGroup: () => RadioGroup,
74
+ RouterProvider: () => import_react_aria_components29.RouterProvider,
69
75
  SectionHeader: () => SectionHeader,
70
76
  SegmentedControl: () => SegmentedControl,
71
77
  Select: () => Select,
72
78
  SelectionBar: () => SelectionBar,
73
- Separator: () => import_react_aria_components25.Separator,
79
+ Separator: () => Separator,
74
80
  ShellBar: () => ShellBar,
75
81
  SideNav: () => SideNav,
76
82
  SidePanel: () => SidePanel,
77
83
  Skeleton: () => Skeleton,
78
84
  SkeletonTableRow: () => SkeletonTableRow,
85
+ Strong: () => Strong,
86
+ SubmenuTrigger: () => import_react_aria_components29.SubmenuTrigger,
79
87
  Switch: () => Switch,
80
88
  Tabs: () => Tabs,
81
89
  Tag: () => Tag,
90
+ Text: () => Text,
82
91
  TextArea: () => TextArea,
83
92
  Timeline: () => Timeline,
84
93
  Toast: () => Toast,
@@ -87,6 +96,9 @@ __export(src_exports, {
87
96
  ValueHelpDialog: () => ValueHelpDialog,
88
97
  ValueHelpField: () => ValueHelpField,
89
98
  configureIcons: () => configureIcons,
99
+ enMessages: () => enMessages,
100
+ esMessages: () => esMessages,
101
+ usePireMessages: () => usePireMessages,
90
102
  useToast: () => useToast
91
103
  });
92
104
  module.exports = __toCommonJS(src_exports);
@@ -481,25 +493,131 @@ function SegmentedControl({
481
493
  );
482
494
  }
483
495
 
484
- // src/components/forms/FormField.tsx
496
+ // src/components/core/Text.tsx
485
497
  var import_jsx_runtime10 = require("react/jsx-runtime");
498
+ function Text({
499
+ size = "body",
500
+ color = "primary",
501
+ weight = "regular",
502
+ numeric,
503
+ eyebrow,
504
+ truncate,
505
+ elementType: Wrapper = "p",
506
+ className,
507
+ style,
508
+ ...rest
509
+ }) {
510
+ const lineClamp = typeof truncate === "number" ? truncate : truncate ? 1 : void 0;
511
+ const clampStyle = lineClamp == null ? style : { ["--pire-text-clamp"]: lineClamp, ...style };
512
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
513
+ Wrapper,
514
+ {
515
+ className: cx("pire-text", className),
516
+ "data-size": size,
517
+ "data-color": color,
518
+ "data-weight": weight === "strong" ? "strong" : void 0,
519
+ "data-numeric": numeric ? "true" : void 0,
520
+ "data-eyebrow": eyebrow ? "true" : void 0,
521
+ "data-truncate": lineClamp != null ? "true" : void 0,
522
+ style: clampStyle,
523
+ ...rest
524
+ }
525
+ );
526
+ }
527
+ function Strong({ className, ...rest }) {
528
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Text, { elementType: "span", weight: "strong", className, ...rest });
529
+ }
530
+
531
+ // src/components/core/Heading.tsx
532
+ var import_react_aria_components6 = require("react-aria-components");
533
+ var import_jsx_runtime11 = require("react/jsx-runtime");
534
+ function Heading({
535
+ level = 2,
536
+ size,
537
+ color = "primary",
538
+ truncate,
539
+ className,
540
+ style,
541
+ ...rest
542
+ }) {
543
+ const lineClamp = typeof truncate === "number" ? truncate : truncate ? 1 : void 0;
544
+ const clampStyle = lineClamp == null ? style : { ["--pire-text-clamp"]: lineClamp, ...style };
545
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
546
+ import_react_aria_components6.Heading,
547
+ {
548
+ level,
549
+ className: cx("pire-heading", className),
550
+ "data-size": size ?? `h${level}`,
551
+ "data-color": color,
552
+ "data-truncate": lineClamp != null ? "true" : void 0,
553
+ style: clampStyle,
554
+ ...rest
555
+ }
556
+ );
557
+ }
558
+
559
+ // src/components/core/Link.tsx
560
+ var import_react_aria_components7 = require("react-aria-components");
561
+ var import_jsx_runtime12 = require("react/jsx-runtime");
562
+ function Link({ children, size, isExternal, className, rel, ...rest }) {
563
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
564
+ import_react_aria_components7.Link,
565
+ {
566
+ className: cx("pire-link", className),
567
+ "data-size": size,
568
+ "data-external": isExternal ? "true" : void 0,
569
+ rel: isExternal ? rel ?? "noopener noreferrer" : rel,
570
+ ...rest,
571
+ children: [
572
+ children,
573
+ isExternal ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Icon, { name: "external-link", size: 12, className: "pire-link-external" }) : null
574
+ ]
575
+ }
576
+ );
577
+ }
578
+
579
+ // src/components/core/Separator.tsx
580
+ var import_react_aria_components8 = require("react-aria-components");
581
+ var import_jsx_runtime13 = require("react/jsx-runtime");
582
+ function Separator({
583
+ orientation = "horizontal",
584
+ emphasis = "default",
585
+ spacing = "md",
586
+ className,
587
+ ...rest
588
+ }) {
589
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
590
+ import_react_aria_components8.Separator,
591
+ {
592
+ orientation,
593
+ className: cx("pire-separator", className),
594
+ "data-orientation": orientation,
595
+ "data-emphasis": emphasis,
596
+ "data-spacing": spacing,
597
+ ...rest
598
+ }
599
+ );
600
+ }
601
+
602
+ // src/components/forms/FormField.tsx
603
+ var import_jsx_runtime14 = require("react/jsx-runtime");
486
604
  function FormField({ label, htmlFor, isRequired, hint, error, layout = "stacked", children, className, ...rest }) {
487
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: cx("pire-field", className), "data-layout": layout, ...rest, children: [
488
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("label", { className: "pire-field-label", htmlFor, children: [
605
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: cx("pire-field", className), "data-layout": layout, ...rest, children: [
606
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("label", { className: "pire-field-label", htmlFor, children: [
489
607
  label,
490
- isRequired ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
608
+ isRequired ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
491
609
  ] }),
492
610
  children,
493
- error ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { className: "pire-field-error", role: "alert", children: [
494
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Icon, { name: "alert-circle", size: 12 }),
611
+ error ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("span", { className: "pire-field-error", role: "alert", children: [
612
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Icon, { name: "alert-circle", size: 12 }),
495
613
  error
496
- ] }) : hint ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "pire-field-hint", children: hint }) : null
614
+ ] }) : hint ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "pire-field-hint", children: hint }) : null
497
615
  ] });
498
616
  }
499
617
 
500
618
  // src/components/forms/Input.tsx
501
- var import_react_aria_components6 = require("react-aria-components");
502
- var import_jsx_runtime11 = require("react/jsx-runtime");
619
+ var import_react_aria_components9 = require("react-aria-components");
620
+ var import_jsx_runtime15 = require("react/jsx-runtime");
503
621
  function Input({
504
622
  label,
505
623
  icon,
@@ -515,8 +633,8 @@ function Input({
515
633
  onChange,
516
634
  ...rest
517
635
  }) {
518
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
519
- import_react_aria_components6.TextField,
636
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
637
+ import_react_aria_components9.TextField,
520
638
  {
521
639
  className: cx("pire-field", className),
522
640
  style,
@@ -524,12 +642,12 @@ function Input({
524
642
  validationBehavior: "aria",
525
643
  ...rest,
526
644
  children: [
527
- label ? /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_aria_components6.Label, { className: "pire-field-label", children: [
645
+ label ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_react_aria_components9.Label, { className: "pire-field-label", children: [
528
646
  label,
529
- rest.isRequired ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
647
+ rest.isRequired ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
530
648
  ] }) : null,
531
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
532
- import_react_aria_components6.Group,
649
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
650
+ import_react_aria_components9.Group,
533
651
  {
534
652
  className: "pire-control",
535
653
  "data-size": size,
@@ -537,14 +655,14 @@ function Input({
537
655
  "data-invalid": rest.isInvalid ? "true" : void 0,
538
656
  "data-readonly": rest.isReadOnly ? "true" : void 0,
539
657
  children: [
540
- icon ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Icon, { name: icon, size: 16, className: "pire-leading-icon" }) : null,
541
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_aria_components6.Input, { ref: inputRef, className: "pire-input", "data-numeric": numeric ? "true" : void 0 }),
542
- suffix ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("span", { className: "pire-affix", children: suffix }) : null
658
+ icon ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Icon, { name: icon, size: 16, className: "pire-leading-icon" }) : null,
659
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_aria_components9.Input, { ref: inputRef, className: "pire-input", "data-numeric": numeric ? "true" : void 0 }),
660
+ suffix ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "pire-affix", children: suffix }) : null
543
661
  ]
544
662
  }
545
663
  ),
546
- description ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_aria_components6.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
547
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_aria_components6.FieldError, { className: "pire-field-error", children: errorMessage })
664
+ description ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_aria_components9.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
665
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_aria_components9.FieldError, { className: "pire-field-error", children: errorMessage })
548
666
  ]
549
667
  }
550
668
  );
@@ -552,8 +670,8 @@ function Input({
552
670
 
553
671
  // src/components/forms/TextArea.tsx
554
672
  var React5 = __toESM(require("react"), 1);
555
- var import_react_aria_components7 = require("react-aria-components");
556
- var import_jsx_runtime12 = require("react/jsx-runtime");
673
+ var import_react_aria_components10 = require("react-aria-components");
674
+ var import_jsx_runtime16 = require("react/jsx-runtime");
557
675
  var useIsomorphicLayoutEffect = typeof document === "undefined" ? React5.useEffect : React5.useLayoutEffect;
558
676
  function TextArea({
559
677
  label,
@@ -594,8 +712,8 @@ function TextArea({
594
712
  }
595
713
  grow();
596
714
  }, [autoGrow, grow, rest.value]);
597
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
598
- import_react_aria_components7.TextField,
715
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
716
+ import_react_aria_components10.TextField,
599
717
  {
600
718
  className: cx("pire-field", className),
601
719
  style,
@@ -603,12 +721,12 @@ function TextArea({
603
721
  validationBehavior: "aria",
604
722
  ...rest,
605
723
  children: [
606
- label ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_aria_components7.Label, { className: "pire-field-label", children: [
724
+ label ? /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_react_aria_components10.Label, { className: "pire-field-label", children: [
607
725
  label,
608
- rest.isRequired ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
726
+ rest.isRequired ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
609
727
  ] }) : null,
610
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
611
- import_react_aria_components7.Group,
728
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
729
+ import_react_aria_components10.Group,
612
730
  {
613
731
  className: "pire-control",
614
732
  "data-size": size,
@@ -616,8 +734,8 @@ function TextArea({
616
734
  "data-multiline": "true",
617
735
  "data-invalid": rest.isInvalid ? "true" : void 0,
618
736
  "data-readonly": rest.isReadOnly ? "true" : void 0,
619
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
620
- import_react_aria_components7.TextArea,
737
+ children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
738
+ import_react_aria_components10.TextArea,
621
739
  {
622
740
  ref,
623
741
  rows,
@@ -628,16 +746,16 @@ function TextArea({
628
746
  )
629
747
  }
630
748
  ),
631
- description ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_aria_components7.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
632
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_aria_components7.FieldError, { className: "pire-field-error", children: errorMessage })
749
+ description ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_aria_components10.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
750
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_aria_components10.FieldError, { className: "pire-field-error", children: errorMessage })
633
751
  ]
634
752
  }
635
753
  );
636
754
  }
637
755
 
638
756
  // src/components/forms/Select.tsx
639
- var import_react_aria_components8 = require("react-aria-components");
640
- var import_jsx_runtime13 = require("react/jsx-runtime");
757
+ var import_react_aria_components11 = require("react-aria-components");
758
+ var import_jsx_runtime17 = require("react/jsx-runtime");
641
759
  var norm = (o) => typeof o === "string" ? { value: o, label: o, isDisabled: false } : o;
642
760
  function Select({
643
761
  label,
@@ -655,8 +773,8 @@ function Select({
655
773
  ...rest
656
774
  }) {
657
775
  const items = options.map(norm);
658
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
659
- import_react_aria_components8.Select,
776
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
777
+ import_react_aria_components11.Select,
660
778
  {
661
779
  className: cx("pire-field", className),
662
780
  style,
@@ -667,78 +785,163 @@ function Select({
667
785
  validationBehavior: "aria",
668
786
  ...rest,
669
787
  children: [
670
- label ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_react_aria_components8.Label, { className: "pire-field-label", children: [
788
+ label ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_react_aria_components11.Label, { className: "pire-field-label", children: [
671
789
  label,
672
- rest.isRequired ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
790
+ rest.isRequired ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
673
791
  ] }) : null,
674
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
675
- import_react_aria_components8.Button,
792
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
793
+ import_react_aria_components11.Button,
676
794
  {
677
795
  className: "pire-control",
678
796
  "data-size": size,
679
797
  "data-full-width": String(fullWidth),
680
798
  "data-invalid": rest.isInvalid ? "true" : void 0,
681
799
  children: [
682
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_aria_components8.SelectValue, { className: "pire-select-value" }),
683
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Icon, { name: "chevron-down", size: 16, className: "pire-leading-icon" })
800
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_aria_components11.SelectValue, { className: "pire-select-value" }),
801
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Icon, { name: "chevron-down", size: 16, className: "pire-leading-icon" })
684
802
  ]
685
803
  }
686
804
  ),
687
- description ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_aria_components8.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
688
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_aria_components8.FieldError, { className: "pire-field-error", children: errorMessage }),
689
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_aria_components8.Popover, { className: "pire-popover", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_aria_components8.ListBox, { className: "pire-listbox", items, children: (item) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_aria_components8.ListBoxItem, { className: "pire-option", id: item.value, textValue: item.label, isDisabled: item.isDisabled, children: item.label }) }) })
805
+ description ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_aria_components11.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
806
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_aria_components11.FieldError, { className: "pire-field-error", children: errorMessage }),
807
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_aria_components11.Popover, { className: "pire-popover", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_aria_components11.ListBox, { className: "pire-listbox", items, children: (item) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_aria_components11.ListBoxItem, { className: "pire-option", id: item.value, textValue: item.label, isDisabled: item.isDisabled, children: item.label }) }) })
690
808
  ]
691
809
  }
692
810
  );
693
811
  }
694
812
 
695
813
  // src/components/forms/Checkbox.tsx
696
- var import_react_aria_components9 = require("react-aria-components");
697
- var import_jsx_runtime14 = require("react/jsx-runtime");
814
+ var import_react_aria_components12 = require("react-aria-components");
815
+ var import_jsx_runtime18 = require("react/jsx-runtime");
698
816
  function Checkbox({ label, hint, children, className, ...rest }) {
699
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_aria_components9.Checkbox, { className: cx("pire-choice", className), ...rest, children: ({ isSelected, isIndeterminate }) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
700
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "pire-choice-box", "aria-hidden": "true", children: isIndeterminate ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Icon, { name: "minus", size: 12 }) : isSelected ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Icon, { name: "check", size: 12 }) : null }),
701
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("span", { children: [
817
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_aria_components12.Checkbox, { className: cx("pire-choice", className), ...rest, children: ({ isSelected, isIndeterminate }) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_jsx_runtime18.Fragment, { children: [
818
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "pire-choice-box", "aria-hidden": "true", children: isIndeterminate ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Icon, { name: "minus", size: 12 }) : isSelected ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Icon, { name: "check", size: 12 }) : null }),
819
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("span", { children: [
702
820
  label ?? children,
703
- hint ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("span", { className: "pire-choice-hint", children: hint }) : null
821
+ hint ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "pire-choice-hint", children: hint }) : null
704
822
  ] })
705
823
  ] }) });
706
824
  }
707
825
 
708
826
  // src/components/forms/Radio.tsx
709
- var import_react_aria_components10 = require("react-aria-components");
710
- var import_jsx_runtime15 = require("react/jsx-runtime");
827
+ var import_react_aria_components13 = require("react-aria-components");
828
+ var import_jsx_runtime19 = require("react/jsx-runtime");
711
829
  function RadioGroup({ label, description, errorMessage, children, className, ...rest }) {
712
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_react_aria_components10.RadioGroup, { className: cx("pire-field", className), validationBehavior: "aria", ...rest, children: [
713
- label ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_aria_components10.Label, { className: "pire-field-label", children: label }) : null,
714
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "pire-radiogroup", children }),
715
- description ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_aria_components10.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
716
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_aria_components10.FieldError, { className: "pire-field-error", children: errorMessage })
830
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_react_aria_components13.RadioGroup, { className: cx("pire-field", className), validationBehavior: "aria", ...rest, children: [
831
+ label ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react_aria_components13.Label, { className: "pire-field-label", children: label }) : null,
832
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "pire-radiogroup", children }),
833
+ description ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react_aria_components13.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
834
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react_aria_components13.FieldError, { className: "pire-field-error", children: errorMessage })
717
835
  ] });
718
836
  }
719
837
  function Radio({ label, hint, children, className, ...rest }) {
720
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_react_aria_components10.Radio, { className: cx("pire-choice", className), ...rest, children: [
721
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "pire-choice-box", "data-radio": "true", "aria-hidden": "true" }),
722
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { children: [
838
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_react_aria_components13.Radio, { className: cx("pire-choice", className), ...rest, children: [
839
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "pire-choice-box", "data-radio": "true", "aria-hidden": "true" }),
840
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { children: [
723
841
  label ?? children,
724
- hint ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: "pire-choice-hint", children: hint }) : null
842
+ hint ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "pire-choice-hint", children: hint }) : null
725
843
  ] })
726
844
  ] });
727
845
  }
728
846
 
729
847
  // src/components/forms/Switch.tsx
730
- var import_react_aria_components11 = require("react-aria-components");
731
- var import_jsx_runtime16 = require("react/jsx-runtime");
848
+ var import_react_aria_components14 = require("react-aria-components");
849
+ var import_jsx_runtime20 = require("react/jsx-runtime");
732
850
  function Switch({ label, children, className, ...rest }) {
733
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_react_aria_components11.Switch, { className: cx("pire-choice", className), ...rest, children: [
734
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "pire-switch-track", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { className: "pire-switch-thumb" }) }),
735
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("span", { children: label ?? children })
851
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_react_aria_components14.Switch, { className: cx("pire-choice", className), ...rest, children: [
852
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "pire-switch-track", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "pire-switch-thumb" }) }),
853
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { children: label ?? children })
736
854
  ] });
737
855
  }
738
856
 
739
857
  // src/components/forms/ComboBox.tsx
740
- var import_react_aria_components12 = require("react-aria-components");
741
- var import_jsx_runtime17 = require("react/jsx-runtime");
858
+ var import_react_aria_components15 = require("react-aria-components");
859
+
860
+ // src/i18n/PireIntlProvider.tsx
861
+ var React6 = __toESM(require("react"), 1);
862
+
863
+ // src/i18n/messages.ts
864
+ var enMessages = {
865
+ filterBarLabel: "Filters",
866
+ filterBarGo: "Go",
867
+ filterBarClearAll: "Clear all",
868
+ dataTableSelectAll: "Select all rows",
869
+ dataTableSelectRow: "Select row",
870
+ dialogClose: "Close",
871
+ sidePanelClose: "Close panel",
872
+ inlineMessageDismiss: "Dismiss message",
873
+ toastDismiss: "Dismiss",
874
+ toastRegionLabel: "Notifications",
875
+ comboBoxShowSuggestions: "Show suggestions",
876
+ datePickerOpenCalendar: "Open calendar",
877
+ datePickerPreviousMonth: "Previous month",
878
+ datePickerNextMonth: "Next month",
879
+ numberFieldIncrease: "Increase",
880
+ numberFieldDecrease: "Decrease",
881
+ valueHelpFieldClear: "Clear selection",
882
+ valueHelpFieldOpenNamed: "Select {label}",
883
+ valueHelpFieldOpen: "Open value help",
884
+ valueHelpDialogSearch: "Search records",
885
+ valueHelpDialogCancel: "Cancel",
886
+ paginationLabel: "Pagination",
887
+ paginationRange: "{from}\u2013{to} of {total}",
888
+ paginationPageOf: "Page {page} of {pages}",
889
+ paginationPrevious: "Previous page",
890
+ paginationNext: "Next page",
891
+ paginationRowsPerPage: "Rows per page",
892
+ sideNavLabel: "Main navigation"
893
+ };
894
+ var esMessages = {
895
+ filterBarLabel: "Filtros",
896
+ filterBarGo: "Buscar",
897
+ filterBarClearAll: "Limpiar todo",
898
+ dataTableSelectAll: "Seleccionar todas las filas",
899
+ dataTableSelectRow: "Seleccionar fila",
900
+ dialogClose: "Cerrar",
901
+ sidePanelClose: "Cerrar panel",
902
+ inlineMessageDismiss: "Descartar mensaje",
903
+ toastDismiss: "Descartar",
904
+ toastRegionLabel: "Notificaciones",
905
+ comboBoxShowSuggestions: "Mostrar sugerencias",
906
+ datePickerOpenCalendar: "Abrir calendario",
907
+ datePickerPreviousMonth: "Mes anterior",
908
+ datePickerNextMonth: "Mes siguiente",
909
+ numberFieldIncrease: "Aumentar",
910
+ numberFieldDecrease: "Disminuir",
911
+ valueHelpFieldClear: "Limpiar selecci\xF3n",
912
+ valueHelpFieldOpenNamed: "Seleccionar {label}",
913
+ valueHelpFieldOpen: "Abrir ayuda de valores",
914
+ valueHelpDialogSearch: "Buscar registros",
915
+ valueHelpDialogCancel: "Cancelar",
916
+ paginationLabel: "Paginaci\xF3n",
917
+ paginationRange: "{from}\u2013{to} de {total}",
918
+ paginationPageOf: "P\xE1gina {page} de {pages}",
919
+ paginationPrevious: "P\xE1gina anterior",
920
+ paginationNext: "P\xE1gina siguiente",
921
+ paginationRowsPerPage: "Filas por p\xE1gina",
922
+ sideNavLabel: "Navegaci\xF3n principal"
923
+ };
924
+
925
+ // src/i18n/PireIntlProvider.tsx
926
+ var import_jsx_runtime21 = require("react/jsx-runtime");
927
+ var MessagesContext = React6.createContext(enMessages);
928
+ function PireIntlProvider({ messages, children }) {
929
+ const value = React6.useMemo(
930
+ () => messages ? { ...enMessages, ...messages } : enMessages,
931
+ [messages]
932
+ );
933
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(MessagesContext.Provider, { value, children });
934
+ }
935
+ function usePireMessages() {
936
+ return React6.useContext(MessagesContext);
937
+ }
938
+ function useMessage(key, override) {
939
+ const messages = React6.useContext(MessagesContext);
940
+ return override ?? messages[key];
941
+ }
942
+
943
+ // src/components/forms/ComboBox.tsx
944
+ var import_jsx_runtime22 = require("react/jsx-runtime");
742
945
  var norm2 = (o) => typeof o === "string" ? { value: o, label: o } : o;
743
946
  function ComboBox({
744
947
  label,
@@ -755,9 +958,10 @@ function ComboBox({
755
958
  style,
756
959
  ...rest
757
960
  }) {
961
+ const msg = usePireMessages();
758
962
  const items = options.map(norm2);
759
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
760
- import_react_aria_components12.ComboBox,
963
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
964
+ import_react_aria_components15.ComboBox,
761
965
  {
762
966
  className: cx("pire-field", className),
763
967
  style,
@@ -770,29 +974,29 @@ function ComboBox({
770
974
  validationBehavior: "aria",
771
975
  ...rest,
772
976
  children: [
773
- label ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_react_aria_components12.Label, { className: "pire-field-label", children: [
977
+ label ? /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_react_aria_components15.Label, { className: "pire-field-label", children: [
774
978
  label,
775
- rest.isRequired ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
979
+ rest.isRequired ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
776
980
  ] }) : null,
777
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
778
- import_react_aria_components12.Group,
981
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
982
+ import_react_aria_components15.Group,
779
983
  {
780
984
  className: "pire-control",
781
985
  "data-size": size,
782
986
  "data-full-width": String(fullWidth),
783
987
  "data-invalid": rest.isInvalid ? "true" : void 0,
784
988
  children: [
785
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Icon, { name: "search", size: 16, className: "pire-leading-icon" }),
786
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_aria_components12.Input, { className: "pire-input", placeholder: rest.placeholder }),
787
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_aria_components12.Button, { className: "pire-iconbtn", "data-size": "sm", "aria-label": "Show suggestions", style: { width: 20, height: 20 }, children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Icon, { name: "chevron-down", size: 16 }) })
989
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Icon, { name: "search", size: 16, className: "pire-leading-icon" }),
990
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_aria_components15.Input, { className: "pire-input", placeholder: rest.placeholder }),
991
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_aria_components15.Button, { className: "pire-iconbtn", "data-size": "sm", "aria-label": msg.comboBoxShowSuggestions, style: { width: 20, height: 20 }, children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Icon, { name: "chevron-down", size: 16 }) })
788
992
  ]
789
993
  }
790
994
  ),
791
- description ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_aria_components12.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
792
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_aria_components12.FieldError, { className: "pire-field-error", children: errorMessage }),
793
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_aria_components12.Popover, { className: "pire-popover", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_react_aria_components12.ListBox, { className: "pire-listbox", children: (item) => /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_react_aria_components12.ListBoxItem, { className: "pire-option", id: item.value, textValue: item.label, isDisabled: item.isDisabled, children: [
794
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { flex: 1 }, children: item.label }),
795
- item.secondary ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { style: { font: "var(--type-code)", color: "var(--text-tertiary)" }, children: item.secondary }) : null
995
+ description ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_aria_components15.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
996
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_aria_components15.FieldError, { className: "pire-field-error", children: errorMessage }),
997
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_aria_components15.Popover, { className: "pire-popover", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_aria_components15.ListBox, { className: "pire-listbox", children: (item) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_react_aria_components15.ListBoxItem, { className: "pire-option", id: item.value, textValue: item.label, isDisabled: item.isDisabled, children: [
998
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { style: { flex: 1 }, children: item.label }),
999
+ item.secondary ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { style: { font: "var(--type-code)", color: "var(--text-tertiary)" }, children: item.secondary }) : null
796
1000
  ] }) }) })
797
1001
  ]
798
1002
  }
@@ -800,9 +1004,9 @@ function ComboBox({
800
1004
  }
801
1005
 
802
1006
  // src/components/forms/MultiComboBox.tsx
803
- var React6 = __toESM(require("react"), 1);
804
- var import_react_aria_components13 = require("react-aria-components");
805
- var import_jsx_runtime18 = require("react/jsx-runtime");
1007
+ var React7 = __toESM(require("react"), 1);
1008
+ var import_react_aria_components16 = require("react-aria-components");
1009
+ var import_jsx_runtime23 = require("react/jsx-runtime");
806
1010
  var norm3 = (o) => typeof o === "string" ? { value: o, label: o } : o;
807
1011
  function MultiComboBox({
808
1012
  label,
@@ -820,13 +1024,14 @@ function MultiComboBox({
820
1024
  style,
821
1025
  ...rest
822
1026
  }) {
823
- const items = React6.useMemo(() => options.map(norm3), [options]);
824
- const [uncontrolled, setUncontrolled] = React6.useState(defaultValue ?? []);
825
- const [announcement, setAnnouncement] = React6.useState("");
826
- const inputRef = React6.useRef(null);
1027
+ const msg = usePireMessages();
1028
+ const items = React7.useMemo(() => options.map(norm3), [options]);
1029
+ const [uncontrolled, setUncontrolled] = React7.useState(defaultValue ?? []);
1030
+ const [announcement, setAnnouncement] = React7.useState("");
1031
+ const inputRef = React7.useRef(null);
827
1032
  const raw = value ?? uncontrolled;
828
1033
  const contentKey = raw.join("\0");
829
- const values = React6.useMemo(() => raw, [contentKey]);
1034
+ const values = React7.useMemo(() => raw, [contentKey]);
830
1035
  const labelOf = (v) => items.find((o) => o.value === v)?.label ?? v;
831
1036
  const isEditable = !rest.isDisabled && !rest.isReadOnly;
832
1037
  const commit = (next) => {
@@ -859,8 +1064,8 @@ function MultiComboBox({
859
1064
  e.stopPropagation();
860
1065
  if (!values.includes(next)) commit([...values, next]);
861
1066
  };
862
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
863
- import_react_aria_components13.ComboBox,
1067
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
1068
+ import_react_aria_components16.ComboBox,
864
1069
  {
865
1070
  className: cx("pire-field", className),
866
1071
  style,
@@ -873,12 +1078,12 @@ function MultiComboBox({
873
1078
  validationBehavior: "aria",
874
1079
  ...rest,
875
1080
  children: [
876
- label ? /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_react_aria_components13.Label, { className: "pire-field-label", children: [
1081
+ label ? /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_react_aria_components16.Label, { className: "pire-field-label", children: [
877
1082
  label,
878
- rest.isRequired ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
1083
+ rest.isRequired ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
879
1084
  ] }) : null,
880
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
881
- import_react_aria_components13.Group,
1085
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
1086
+ import_react_aria_components16.Group,
882
1087
  {
883
1088
  className: "pire-control",
884
1089
  "data-size": size,
@@ -887,15 +1092,15 @@ function MultiComboBox({
887
1092
  "data-invalid": rest.isInvalid ? "true" : void 0,
888
1093
  "data-readonly": rest.isReadOnly ? "true" : void 0,
889
1094
  children: [
890
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Icon, { name: "search", size: 16, className: "pire-leading-icon" }),
891
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "pire-chipfield", children: [
892
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_aria_components13.ButtonContext.Provider, { value: null, children: values.map((v) => (
1095
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Icon, { name: "search", size: 16, className: "pire-leading-icon" }),
1096
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "pire-chipfield", children: [
1097
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_react_aria_components16.ButtonContext.Provider, { value: null, children: values.map((v) => (
893
1098
  /* Disabled follows the field, not `isEditable`: a read-only field's chips are
894
1099
  real, current values and should read as such — they simply lose the × . */
895
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Tag, { isDisabled: rest.isDisabled, onRemove: isEditable ? () => remove(v) : void 0, children: labelOf(v) }, v)
1100
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Tag, { isDisabled: rest.isDisabled, onRemove: isEditable ? () => remove(v) : void 0, children: labelOf(v) }, v)
896
1101
  )) }),
897
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
898
- import_react_aria_components13.Input,
1102
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1103
+ import_react_aria_components16.Input,
899
1104
  {
900
1105
  ref: inputRef,
901
1106
  className: cx("pire-input", "pire-chipinput"),
@@ -904,16 +1109,16 @@ function MultiComboBox({
904
1109
  }
905
1110
  )
906
1111
  ] }),
907
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_aria_components13.Button, { className: "pire-iconbtn", "data-size": "sm", "aria-label": "Show suggestions", style: { width: 20, height: 20 }, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Icon, { name: "chevron-down", size: 16 }) })
1112
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_react_aria_components16.Button, { className: "pire-iconbtn", "data-size": "sm", "aria-label": msg.comboBoxShowSuggestions, style: { width: 20, height: 20 }, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Icon, { name: "chevron-down", size: 16 }) })
908
1113
  ]
909
1114
  }
910
1115
  ),
911
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_aria_components13.VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { "aria-live": "polite", children: announcement }) }),
912
- description ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_aria_components13.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
913
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_aria_components13.FieldError, { className: "pire-field-error", children: errorMessage }),
914
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_aria_components13.Popover, { className: "pire-popover", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_aria_components13.ListBox, { className: "pire-listbox", children: (item) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_react_aria_components13.ListBoxItem, { className: "pire-option", id: item.value, textValue: item.label, isDisabled: item.isDisabled, children: [
915
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: { flex: 1 }, children: item.label }),
916
- item.secondary ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { style: { font: "var(--type-code)", color: "var(--text-tertiary)" }, children: item.secondary }) : null
1116
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_react_aria_components16.VisuallyHidden, { children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { "aria-live": "polite", children: announcement }) }),
1117
+ description ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_react_aria_components16.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
1118
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_react_aria_components16.FieldError, { className: "pire-field-error", children: errorMessage }),
1119
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_react_aria_components16.Popover, { className: "pire-popover", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_react_aria_components16.ListBox, { className: "pire-listbox", children: (item) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_react_aria_components16.ListBoxItem, { className: "pire-option", id: item.value, textValue: item.label, isDisabled: item.isDisabled, children: [
1120
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { style: { flex: 1 }, children: item.label }),
1121
+ item.secondary ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { style: { font: "var(--type-code)", color: "var(--text-tertiary)" }, children: item.secondary }) : null
917
1122
  ] }) }) })
918
1123
  ]
919
1124
  }
@@ -921,8 +1126,8 @@ function MultiComboBox({
921
1126
  }
922
1127
 
923
1128
  // src/components/forms/NumberField.tsx
924
- var import_react_aria_components14 = require("react-aria-components");
925
- var import_jsx_runtime19 = require("react/jsx-runtime");
1129
+ var import_react_aria_components17 = require("react-aria-components");
1130
+ var import_jsx_runtime24 = require("react/jsx-runtime");
926
1131
  function NumberField({
927
1132
  label,
928
1133
  suffix,
@@ -935,13 +1140,14 @@ function NumberField({
935
1140
  style,
936
1141
  ...rest
937
1142
  }) {
938
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_react_aria_components14.NumberField, { className: cx("pire-field", className), style, validationBehavior: "aria", ...rest, children: [
939
- label ? /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_react_aria_components14.Label, { className: "pire-field-label", children: [
1143
+ const msg = usePireMessages();
1144
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_react_aria_components17.NumberField, { className: cx("pire-field", className), style, validationBehavior: "aria", ...rest, children: [
1145
+ label ? /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_react_aria_components17.Label, { className: "pire-field-label", children: [
940
1146
  label,
941
- rest.isRequired ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
1147
+ rest.isRequired ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
942
1148
  ] }) : null,
943
- /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
944
- import_react_aria_components14.Group,
1149
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(
1150
+ import_react_aria_components17.Group,
945
1151
  {
946
1152
  className: "pire-control",
947
1153
  "data-size": size,
@@ -949,23 +1155,23 @@ function NumberField({
949
1155
  "data-invalid": rest.isInvalid ? "true" : void 0,
950
1156
  "data-readonly": rest.isReadOnly ? "true" : void 0,
951
1157
  children: [
952
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react_aria_components14.Input, { className: "pire-input", "data-numeric": "true" }),
953
- suffix ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "pire-affix", children: suffix }) : null,
954
- hideStepper ? null : /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("span", { className: "pire-stepper", children: [
955
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react_aria_components14.Button, { slot: "increment", className: "pire-stepper-btn", "aria-label": "Increase", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Icon, { name: "plus", size: 10 }) }),
956
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react_aria_components14.Button, { slot: "decrement", className: "pire-stepper-btn", "aria-label": "Decrease", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Icon, { name: "minus", size: 10 }) })
1158
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_react_aria_components17.Input, { className: "pire-input", "data-numeric": "true" }),
1159
+ suffix ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("span", { className: "pire-affix", children: suffix }) : null,
1160
+ hideStepper ? null : /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("span", { className: "pire-stepper", children: [
1161
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_react_aria_components17.Button, { slot: "increment", className: "pire-stepper-btn", "aria-label": msg.numberFieldIncrease, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Icon, { name: "plus", size: 10 }) }),
1162
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_react_aria_components17.Button, { slot: "decrement", className: "pire-stepper-btn", "aria-label": msg.numberFieldDecrease, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Icon, { name: "minus", size: 10 }) })
957
1163
  ] })
958
1164
  ]
959
1165
  }
960
1166
  ),
961
- description ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react_aria_components14.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
962
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react_aria_components14.FieldError, { className: "pire-field-error", children: errorMessage })
1167
+ description ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_react_aria_components17.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
1168
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_react_aria_components17.FieldError, { className: "pire-field-error", children: errorMessage })
963
1169
  ] });
964
1170
  }
965
1171
 
966
1172
  // src/components/forms/DatePicker.tsx
967
- var import_react_aria_components15 = require("react-aria-components");
968
- var import_jsx_runtime20 = require("react/jsx-runtime");
1173
+ var import_react_aria_components18 = require("react-aria-components");
1174
+ var import_jsx_runtime25 = require("react/jsx-runtime");
969
1175
  function DatePicker({
970
1176
  label,
971
1177
  description,
@@ -976,13 +1182,14 @@ function DatePicker({
976
1182
  style,
977
1183
  ...rest
978
1184
  }) {
979
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_react_aria_components15.DatePicker, { className: cx("pire-field", className), style, validationBehavior: "aria", ...rest, children: [
980
- label ? /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_react_aria_components15.Label, { className: "pire-field-label", children: [
1185
+ const msg = usePireMessages();
1186
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_react_aria_components18.DatePicker, { className: cx("pire-field", className), style, validationBehavior: "aria", ...rest, children: [
1187
+ label ? /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_react_aria_components18.Label, { className: "pire-field-label", children: [
981
1188
  label,
982
- rest.isRequired ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
1189
+ rest.isRequired ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
983
1190
  ] }) : null,
984
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
985
- import_react_aria_components15.Group,
1191
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
1192
+ import_react_aria_components18.Group,
986
1193
  {
987
1194
  className: "pire-control",
988
1195
  "data-size": size,
@@ -990,36 +1197,36 @@ function DatePicker({
990
1197
  "data-invalid": rest.isInvalid ? "true" : void 0,
991
1198
  "data-readonly": rest.isReadOnly ? "true" : void 0,
992
1199
  children: [
993
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_aria_components15.DateInput, { className: "pire-datefield", children: (segment) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_aria_components15.DateSegment, { segment, className: "pire-datesegment" }) }),
994
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_aria_components15.Button, { className: "pire-iconbtn", "data-size": "sm", "aria-label": "Open calendar", style: { width: 24, height: 24 }, children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Icon, { name: "calendar", size: 16 }) })
1200
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_aria_components18.DateInput, { className: "pire-datefield", children: (segment) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_aria_components18.DateSegment, { segment, className: "pire-datesegment" }) }),
1201
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_aria_components18.Button, { className: "pire-iconbtn", "data-size": "sm", "aria-label": msg.datePickerOpenCalendar, style: { width: 24, height: 24 }, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Icon, { name: "calendar", size: 16 }) })
995
1202
  ]
996
1203
  }
997
1204
  ),
998
- description ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_aria_components15.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
999
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_aria_components15.FieldError, { className: "pire-field-error", children: errorMessage }),
1000
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_aria_components15.Popover, { className: "pire-popover", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_aria_components15.Dialog, { children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_react_aria_components15.Calendar, { className: "pire-calendar", children: [
1001
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("header", { className: "pire-calendar-head", children: [
1002
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_aria_components15.Button, { slot: "previous", className: "pire-iconbtn", "data-size": "sm", "aria-label": "Previous month", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Icon, { name: "chevron-left", size: 16 }) }),
1003
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_aria_components15.Heading, { className: "pire-calendar-title" }),
1004
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_aria_components15.Button, { slot: "next", className: "pire-iconbtn", "data-size": "sm", "aria-label": "Next month", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Icon, { name: "chevron-right", size: 16 }) })
1205
+ description ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_aria_components18.Text, { slot: "description", className: "pire-field-hint", children: description }) : null,
1206
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_aria_components18.FieldError, { className: "pire-field-error", children: errorMessage }),
1207
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_aria_components18.Popover, { className: "pire-popover", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_aria_components18.Dialog, { children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_react_aria_components18.Calendar, { className: "pire-calendar", children: [
1208
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("header", { className: "pire-calendar-head", children: [
1209
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_aria_components18.Button, { slot: "previous", className: "pire-iconbtn", "data-size": "sm", "aria-label": msg.datePickerPreviousMonth, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Icon, { name: "chevron-left", size: 16 }) }),
1210
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_aria_components18.Heading, { className: "pire-calendar-title" }),
1211
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_aria_components18.Button, { slot: "next", className: "pire-iconbtn", "data-size": "sm", "aria-label": msg.datePickerNextMonth, children: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(Icon, { name: "chevron-right", size: 16 }) })
1005
1212
  ] }),
1006
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_react_aria_components15.CalendarGrid, { className: "pire-calendar-grid", children: [
1007
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_aria_components15.CalendarGridHeader, { children: (day) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_aria_components15.CalendarHeaderCell, { children: day }) }),
1008
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_aria_components15.CalendarGridBody, { children: (date) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_react_aria_components15.CalendarCell, { date, className: "pire-calendar-cell" }) })
1213
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_react_aria_components18.CalendarGrid, { className: "pire-calendar-grid", children: [
1214
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_aria_components18.CalendarGridHeader, { children: (day) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_aria_components18.CalendarHeaderCell, { children: day }) }),
1215
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_aria_components18.CalendarGridBody, { children: (date) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_aria_components18.CalendarCell, { date, className: "pire-calendar-cell" }) })
1009
1216
  ] })
1010
1217
  ] }) }) })
1011
1218
  ] });
1012
1219
  }
1013
1220
 
1014
1221
  // src/components/forms/ValueHelpField.tsx
1015
- var React8 = __toESM(require("react"), 1);
1222
+ var React9 = __toESM(require("react"), 1);
1016
1223
 
1017
1224
  // src/components/patterns/ValueHelpDialog.tsx
1018
- var React7 = __toESM(require("react"), 1);
1225
+ var React8 = __toESM(require("react"), 1);
1019
1226
 
1020
1227
  // src/components/feedback/Dialog.tsx
1021
- var import_react_aria_components16 = require("react-aria-components");
1022
- var import_jsx_runtime21 = require("react/jsx-runtime");
1228
+ var import_react_aria_components19 = require("react-aria-components");
1229
+ var import_jsx_runtime26 = require("react/jsx-runtime");
1023
1230
  function Dialog({
1024
1231
  isOpen,
1025
1232
  onOpenChange,
@@ -1034,12 +1241,13 @@ function Dialog({
1034
1241
  className,
1035
1242
  style
1036
1243
  }) {
1244
+ const msg = usePireMessages();
1037
1245
  const close = () => {
1038
1246
  onClose?.();
1039
1247
  onOpenChange?.(false);
1040
1248
  };
1041
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1042
- import_react_aria_components16.ModalOverlay,
1249
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1250
+ import_react_aria_components19.ModalOverlay,
1043
1251
  {
1044
1252
  className: "pire-modal-overlay",
1045
1253
  isOpen,
@@ -1047,24 +1255,24 @@ function Dialog({
1047
1255
  onOpenChange: (o) => {
1048
1256
  if (!o) close();
1049
1257
  },
1050
- children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_aria_components16.Modal, { className: cx("pire-modal", className), "data-size": size, style, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_react_aria_components16.Dialog, { className: "pire-dialog", children: [
1051
- title ? /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("header", { className: "pire-dialog-head", children: [
1052
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
1053
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_aria_components16.Heading, { slot: "title", className: "pire-dialog-title", children: title }),
1054
- subtitle ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "pire-dialog-sub", style: { margin: 0 }, children: subtitle }) : null
1258
+ 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: [
1259
+ title ? /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("header", { className: "pire-dialog-head", children: [
1260
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
1261
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_aria_components19.Heading, { slot: "title", className: "pire-dialog-title", children: title }),
1262
+ subtitle ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("p", { className: "pire-dialog-sub", style: { margin: 0 }, children: subtitle }) : null
1055
1263
  ] }),
1056
- showClose ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(IconButton, { icon: "x", label: "Close", size: "sm", onPress: close }) : null
1264
+ showClose ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(IconButton, { icon: "x", label: msg.dialogClose, size: "sm", onPress: close }) : null
1057
1265
  ] }) : null,
1058
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "pire-dialog-body", children }),
1059
- footer ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("footer", { className: "pire-dialog-foot", children: footer }) : null
1266
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "pire-dialog-body", children }),
1267
+ footer ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("footer", { className: "pire-dialog-foot", children: footer }) : null
1060
1268
  ] }) })
1061
1269
  }
1062
1270
  );
1063
1271
  }
1064
1272
 
1065
1273
  // src/components/data/DataTable.tsx
1066
- var import_react_aria_components17 = require("react-aria-components");
1067
- var import_jsx_runtime22 = require("react/jsx-runtime");
1274
+ var import_react_aria_components20 = require("react-aria-components");
1275
+ var import_jsx_runtime27 = require("react/jsx-runtime");
1068
1276
  function DataTable({
1069
1277
  columns,
1070
1278
  rows,
@@ -1081,13 +1289,14 @@ function DataTable({
1081
1289
  style,
1082
1290
  ...rest
1083
1291
  }) {
1292
+ const msg = usePireMessages();
1084
1293
  const sortDescriptor = sort ? { column: sort.key, direction: sort.dir === "asc" ? "ascending" : "descending" } : void 0;
1085
1294
  const handleSelection = (keys) => {
1086
1295
  if (keys === "all") return onSelectionChange?.(rows.map((r) => r.id));
1087
1296
  onSelectionChange?.([...keys]);
1088
1297
  };
1089
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: cx("pire-table-wrap", className), style, children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
1090
- import_react_aria_components17.Table,
1298
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: cx("pire-table-wrap", className), style, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
1299
+ import_react_aria_components20.Table,
1091
1300
  {
1092
1301
  className: "pire-table",
1093
1302
  "data-density": density,
@@ -1103,10 +1312,10 @@ function DataTable({
1103
1312
  if (row) onRowAction(row);
1104
1313
  } : void 0,
1105
1314
  children: [
1106
- /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_react_aria_components17.TableHeader, { className: "pire-thead-row", children: [
1107
- selectable ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_aria_components17.Column, { className: "pire-th", width: 44, children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Checkbox, { slot: "selection", "aria-label": "Select all rows" }) }) : null,
1108
- columns.map((c, i) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1109
- import_react_aria_components17.Column,
1315
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_react_aria_components20.TableHeader, { className: "pire-thead-row", children: [
1316
+ selectable ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_aria_components20.Column, { className: "pire-th", width: 44, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Checkbox, { slot: "selection", "aria-label": msg.dataTableSelectAll }) }) : null,
1317
+ columns.map((c, i) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1318
+ import_react_aria_components20.Column,
1110
1319
  {
1111
1320
  id: c.key,
1112
1321
  className: "pire-th",
@@ -1115,9 +1324,9 @@ function DataTable({
1115
1324
  width: c.width,
1116
1325
  "data-align": c.numeric || c.align === "right" ? "right" : c.align,
1117
1326
  "data-allows-sorting": c.sortable ? "true" : void 0,
1118
- children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("span", { className: "pire-th-inner", children: [
1327
+ children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("span", { className: "pire-th-inner", children: [
1119
1328
  c.label,
1120
- c.sortable ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1329
+ c.sortable ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1121
1330
  Icon,
1122
1331
  {
1123
1332
  size: 12,
@@ -1130,10 +1339,10 @@ function DataTable({
1130
1339
  c.key
1131
1340
  ))
1132
1341
  ] }),
1133
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_aria_components17.TableBody, { renderEmptyState: () => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("div", { className: "pire-table-empty", children: emptyLabel }), children: rows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_react_aria_components17.Row, { id: row.id, className: "pire-tr", "data-pressable": onRowAction ? "true" : void 0, children: [
1134
- selectable ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_aria_components17.Cell, { className: "pire-td", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Checkbox, { slot: "selection", "aria-label": "Select row" }) }) : null,
1135
- columns.map((c) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1136
- import_react_aria_components17.Cell,
1342
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_aria_components20.TableBody, { renderEmptyState: () => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: "pire-table-empty", children: emptyLabel }), children: rows.map((row) => /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_react_aria_components20.Row, { id: row.id, className: "pire-tr", "data-pressable": onRowAction ? "true" : void 0, children: [
1343
+ selectable ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_aria_components20.Cell, { className: "pire-td", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Checkbox, { slot: "selection", "aria-label": msg.dataTableSelectRow }) }) : null,
1344
+ columns.map((c) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1345
+ import_react_aria_components20.Cell,
1137
1346
  {
1138
1347
  className: "pire-td",
1139
1348
  "data-numeric": c.numeric ? "true" : void 0,
@@ -1149,7 +1358,7 @@ function DataTable({
1149
1358
  }
1150
1359
 
1151
1360
  // src/components/patterns/ValueHelpDialog.tsx
1152
- var import_jsx_runtime23 = require("react/jsx-runtime");
1361
+ var import_jsx_runtime28 = require("react/jsx-runtime");
1153
1362
  function ValueHelpDialog({
1154
1363
  isOpen,
1155
1364
  title = "Select a record",
@@ -1160,28 +1369,29 @@ function ValueHelpDialog({
1160
1369
  onSelect,
1161
1370
  onClose
1162
1371
  }) {
1163
- const [query, setQuery] = React7.useState("");
1164
- React7.useEffect(() => {
1372
+ const msg = usePireMessages();
1373
+ const [query, setQuery] = React8.useState("");
1374
+ React8.useEffect(() => {
1165
1375
  if (isOpen) setQuery("");
1166
1376
  }, [isOpen]);
1167
- const filtered = React7.useMemo(() => {
1377
+ const filtered = React8.useMemo(() => {
1168
1378
  const q = query.trim().toLowerCase();
1169
1379
  if (!q) return rows;
1170
1380
  return rows.filter((row) => Object.values(row).some((v) => String(v).toLowerCase().includes(q)));
1171
1381
  }, [rows, query]);
1172
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1382
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1173
1383
  Dialog,
1174
1384
  {
1175
1385
  isOpen,
1176
1386
  size: "lg",
1177
1387
  title,
1178
1388
  onClose,
1179
- footer: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Button, { variant: "tertiary", onPress: onClose, children: "Cancel" }),
1180
- children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "var(--sp-3)" }, children: [
1181
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1389
+ footer: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Button, { variant: "tertiary", onPress: onClose, children: msg.valueHelpDialogCancel }),
1390
+ children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { style: { display: "flex", flexDirection: "column", gap: "var(--sp-3)" }, children: [
1391
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1182
1392
  Input,
1183
1393
  {
1184
- "aria-label": "Search records",
1394
+ "aria-label": msg.valueHelpDialogSearch,
1185
1395
  icon: "search",
1186
1396
  type: "search",
1187
1397
  value: query,
@@ -1190,7 +1400,7 @@ function ValueHelpDialog({
1190
1400
  autoFocus: true
1191
1401
  }
1192
1402
  ),
1193
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1403
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1194
1404
  DataTable,
1195
1405
  {
1196
1406
  "aria-label": typeof title === "string" ? title : "Records",
@@ -1210,7 +1420,7 @@ function ValueHelpDialog({
1210
1420
  }
1211
1421
 
1212
1422
  // src/components/forms/ValueHelpField.tsx
1213
- var import_jsx_runtime24 = require("react/jsx-runtime");
1423
+ var import_jsx_runtime29 = require("react/jsx-runtime");
1214
1424
  var defaultFormat = (row) => [row.id, row.name ?? row.label ?? row.text].filter(Boolean).join(" \u2014 ");
1215
1425
  function ValueHelpField({
1216
1426
  label,
@@ -1230,10 +1440,11 @@ function ValueHelpField({
1230
1440
  className,
1231
1441
  style
1232
1442
  }) {
1233
- const [open, setOpen] = React8.useState(false);
1234
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: cx(className), style, children: [
1235
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { style: { display: "flex", gap: "var(--sp-2)", alignItems: "flex-end" }, children: [
1236
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1443
+ const msg = usePireMessages();
1444
+ const [open, setOpen] = React9.useState(false);
1445
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { className: cx(className), style, children: [
1446
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("div", { style: { display: "flex", gap: "var(--sp-2)", alignItems: "flex-end" }, children: [
1447
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1237
1448
  Input,
1238
1449
  {
1239
1450
  label,
@@ -1247,28 +1458,28 @@ function ValueHelpField({
1247
1458
  errorMessage
1248
1459
  }
1249
1460
  ),
1250
- allowsClear && value ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1461
+ allowsClear && value ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1251
1462
  IconButton,
1252
1463
  {
1253
1464
  icon: "x",
1254
- label: "Clear selection",
1465
+ label: msg.valueHelpFieldClear,
1255
1466
  variant: "outlined",
1256
1467
  isDisabled,
1257
1468
  onPress: () => onChange?.(null)
1258
1469
  }
1259
1470
  ) : null,
1260
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1471
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1261
1472
  IconButton,
1262
1473
  {
1263
1474
  icon: "search",
1264
- label: typeof label === "string" ? `Select ${label.toLowerCase()}` : "Open value help",
1475
+ label: typeof label === "string" ? msg.valueHelpFieldOpenNamed.replace("{label}", label.toLowerCase()) : msg.valueHelpFieldOpen,
1265
1476
  variant: "outlined",
1266
1477
  isDisabled,
1267
1478
  onPress: () => setOpen(true)
1268
1479
  }
1269
1480
  )
1270
1481
  ] }),
1271
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(
1482
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1272
1483
  ValueHelpDialog,
1273
1484
  {
1274
1485
  isOpen: open,
@@ -1283,7 +1494,7 @@ function ValueHelpField({
1283
1494
  }
1284
1495
 
1285
1496
  // src/components/navigation/ShellBar.tsx
1286
- var import_jsx_runtime25 = require("react/jsx-runtime");
1497
+ var import_jsx_runtime30 = require("react/jsx-runtime");
1287
1498
  var initials2 = (name) => name.trim().split(/\s+/).slice(0, 2).map((p) => p[0]).join("").toUpperCase();
1288
1499
  function ShellBar({
1289
1500
  product,
@@ -1298,22 +1509,22 @@ function ShellBar({
1298
1509
  className,
1299
1510
  ...rest
1300
1511
  }) {
1301
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("header", { className: cx("pire-shellbar", className), ...rest, children: [
1302
- onMenu ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(IconButton, { icon: "menu", label: menuLabel, variant: "inverse", size: "sm", onPress: onMenu }) : null,
1303
- monogram ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "pire-shellbar-mono", "aria-hidden": "true", children: monogram }) : null,
1304
- product ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "pire-shellbar-product", children: product }) : null,
1305
- title ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "pire-shellbar-title", children: title }) : null,
1306
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "pire-shellbar-spacer" }),
1307
- onSearch ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(IconButton, { icon: "search", label: searchLabel, variant: "inverse", size: "sm", onPress: onSearch }) : null,
1512
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("header", { className: cx("pire-shellbar", className), ...rest, children: [
1513
+ onMenu ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(IconButton, { icon: "menu", label: menuLabel, variant: "inverse", size: "sm", onPress: onMenu }) : null,
1514
+ monogram ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "pire-shellbar-mono", "aria-hidden": "true", children: monogram }) : null,
1515
+ product ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "pire-shellbar-product", children: product }) : null,
1516
+ title ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "pire-shellbar-title", children: title }) : null,
1517
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "pire-shellbar-spacer" }),
1518
+ onSearch ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(IconButton, { icon: "search", label: searchLabel, variant: "inverse", size: "sm", onPress: onSearch }) : null,
1308
1519
  actions,
1309
- user ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "pire-avatar", title: user, "aria-label": user, role: "img", children: initials2(user) }) : null
1520
+ user ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "pire-avatar", title: user, "aria-label": user, role: "img", children: initials2(user) }) : null
1310
1521
  ] });
1311
1522
  }
1312
1523
 
1313
1524
  // src/components/navigation/SideNav.tsx
1314
- var React9 = __toESM(require("react"), 1);
1315
- var import_react_aria_components18 = require("react-aria-components");
1316
- var import_jsx_runtime26 = require("react/jsx-runtime");
1525
+ var React10 = __toESM(require("react"), 1);
1526
+ var import_react_aria_components21 = require("react-aria-components");
1527
+ var import_jsx_runtime31 = require("react/jsx-runtime");
1317
1528
  function findActiveParent(groups, value) {
1318
1529
  if (value == null) return void 0;
1319
1530
  for (const group of groups) {
@@ -1335,12 +1546,13 @@ function SideNav({
1335
1546
  className,
1336
1547
  ...rest
1337
1548
  }) {
1549
+ const msg = usePireMessages();
1338
1550
  const activeParent = findActiveParent(groups, value);
1339
1551
  const isControlled = expandedIds != null;
1340
- const [ownExpanded, setOwnExpanded] = React9.useState(
1552
+ const [ownExpanded, setOwnExpanded] = React10.useState(
1341
1553
  () => new Set(defaultExpandedIds ?? (activeParent ? [activeParent] : []))
1342
1554
  );
1343
- const [lastValue, setLastValue] = React9.useState(value);
1555
+ const [lastValue, setLastValue] = React10.useState(value);
1344
1556
  if (value !== lastValue) {
1345
1557
  setLastValue(value);
1346
1558
  if (!isControlled && activeParent && !ownExpanded.has(activeParent)) {
@@ -1360,8 +1572,8 @@ function SideNav({
1360
1572
  };
1361
1573
  const renderRow = (item, onPress, isGroup) => {
1362
1574
  const selected = !isGroup && item.id === value;
1363
- const button = /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1364
- import_react_aria_components18.Button,
1575
+ const button = /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
1576
+ import_react_aria_components21.Button,
1365
1577
  {
1366
1578
  className: "pire-sidenav-item",
1367
1579
  "data-selected": selected ? "true" : void 0,
@@ -1370,55 +1582,55 @@ function SideNav({
1370
1582
  "aria-label": collapsed ? item.label : void 0,
1371
1583
  onPress,
1372
1584
  children: [
1373
- item.icon ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(Icon, { name: item.icon, size: 16 }) : null,
1374
- collapsed ? null : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { children: item.label }),
1375
- item.count != null && !collapsed ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "pire-sidenav-count", children: item.count }) : null
1585
+ item.icon ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Icon, { name: item.icon, size: 16 }) : null,
1586
+ collapsed ? null : /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { children: item.label }),
1587
+ item.count != null && !collapsed ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "pire-sidenav-count", children: item.count }) : null
1376
1588
  ]
1377
1589
  },
1378
1590
  item.id
1379
1591
  );
1380
- return collapsed ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(Tooltip, { label: item.label, placement: "right", children: button }, item.id) : button;
1592
+ return collapsed ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Tooltip, { label: item.label, placement: "right", children: button }, item.id) : button;
1381
1593
  };
1382
- const renderSection = (item) => /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_react_aria_components18.Disclosure, { id: item.id, className: "pire-sidenav-section", children: [
1383
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1384
- import_react_aria_components18.Button,
1594
+ const renderSection = (item) => /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_react_aria_components21.Disclosure, { id: item.id, className: "pire-sidenav-section", children: [
1595
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
1596
+ import_react_aria_components21.Button,
1385
1597
  {
1386
1598
  slot: "trigger",
1387
1599
  className: "pire-sidenav-item",
1388
1600
  "data-kind": "group",
1389
1601
  "data-active-child": item.id === activeParent ? "true" : void 0,
1390
1602
  children: [
1391
- item.icon ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(Icon, { name: item.icon, size: 16 }) : null,
1392
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { children: item.label }),
1393
- item.count != null ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "pire-sidenav-count", children: item.count }) : null,
1394
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(Icon, { name: "chevron-down", size: 16, className: "pire-sidenav-chevron" })
1603
+ item.icon ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Icon, { name: item.icon, size: 16 }) : null,
1604
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { children: item.label }),
1605
+ item.count != null ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "pire-sidenav-count", children: item.count }) : null,
1606
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(Icon, { name: "chevron-down", size: 16, className: "pire-sidenav-chevron" })
1395
1607
  ]
1396
1608
  }
1397
1609
  ),
1398
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_aria_components18.DisclosurePanel, { className: "pire-sidenav-subnav", children: item.items?.map((child) => {
1610
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_react_aria_components21.DisclosurePanel, { className: "pire-sidenav-subnav", children: item.items?.map((child) => {
1399
1611
  const selected = child.id === value;
1400
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1401
- import_react_aria_components18.Button,
1612
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
1613
+ import_react_aria_components21.Button,
1402
1614
  {
1403
1615
  className: "pire-sidenav-item pire-sidenav-subitem",
1404
1616
  "data-selected": selected ? "true" : void 0,
1405
1617
  "aria-current": selected ? "page" : void 0,
1406
1618
  onPress: () => onChange?.(child.id),
1407
1619
  children: [
1408
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { children: child.label }),
1409
- child.count != null ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "pire-sidenav-count", children: child.count }) : null
1620
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { children: child.label }),
1621
+ child.count != null ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "pire-sidenav-count", children: child.count }) : null
1410
1622
  ]
1411
1623
  },
1412
1624
  child.id
1413
1625
  );
1414
1626
  }) })
1415
1627
  ] }, item.id);
1416
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1628
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
1417
1629
  "nav",
1418
1630
  {
1419
1631
  className: cx("pire-sidenav", className),
1420
1632
  "data-collapsed": collapsed ? "true" : void 0,
1421
- "aria-label": "Main navigation",
1633
+ "aria-label": msg.sideNavLabel,
1422
1634
  ...rest,
1423
1635
  children: [
1424
1636
  groups.map((group, gi) => {
@@ -1428,10 +1640,10 @@ function SideNav({
1428
1640
  if (isGroup && !collapsed) return renderSection(item);
1429
1641
  return renderRow(item, () => isGroup ? toggleExpanded(item.id) : onChange?.(item.id), isGroup);
1430
1642
  });
1431
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "pire-sidenav-group", children: [
1432
- group.label && !collapsed ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "pire-sidenav-label", children: group.label }) : null,
1433
- hasSections ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1434
- import_react_aria_components18.DisclosureGroup,
1643
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "pire-sidenav-group", children: [
1644
+ group.label && !collapsed ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "pire-sidenav-label", children: group.label }) : null,
1645
+ hasSections ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1646
+ import_react_aria_components21.DisclosureGroup,
1435
1647
  {
1436
1648
  className: "pire-sidenav-tree",
1437
1649
  allowsMultipleExpanded: true,
@@ -1442,18 +1654,18 @@ function SideNav({
1442
1654
  ) : rows
1443
1655
  ] }, group.label ?? gi);
1444
1656
  }),
1445
- footer ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "pire-sidenav-footer", children: footer }) : null
1657
+ footer ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "pire-sidenav-footer", children: footer }) : null
1446
1658
  ]
1447
1659
  }
1448
1660
  );
1449
1661
  }
1450
1662
 
1451
1663
  // src/components/navigation/Tabs.tsx
1452
- var import_react_aria_components19 = require("react-aria-components");
1453
- var import_jsx_runtime27 = require("react/jsx-runtime");
1664
+ var import_react_aria_components22 = require("react-aria-components");
1665
+ var import_jsx_runtime32 = require("react/jsx-runtime");
1454
1666
  function Tabs({ items, value, defaultValue, onChange, panels, className, style, ...rest }) {
1455
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
1456
- import_react_aria_components19.Tabs,
1667
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
1668
+ import_react_aria_components22.Tabs,
1457
1669
  {
1458
1670
  className,
1459
1671
  style,
@@ -1461,23 +1673,23 @@ function Tabs({ items, value, defaultValue, onChange, panels, className, style,
1461
1673
  defaultSelectedKey: defaultValue,
1462
1674
  onSelectionChange: (k) => onChange?.(String(k)),
1463
1675
  children: [
1464
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_aria_components19.TabList, { className: "pire-tablist", items, "aria-label": rest["aria-label"] ?? "Views", children: (item) => /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_react_aria_components19.Tab, { className: cx("pire-tab"), id: item.id, isDisabled: item.isDisabled, children: [
1465
- item.icon ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(Icon, { name: item.icon, size: 16 }) : null,
1676
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_react_aria_components22.TabList, { className: "pire-tablist", items, "aria-label": rest["aria-label"] ?? "Views", children: (item) => /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_react_aria_components22.Tab, { className: cx("pire-tab"), id: item.id, isDisabled: item.isDisabled, children: [
1677
+ item.icon ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Icon, { name: item.icon, size: 16 }) : null,
1466
1678
  item.label,
1467
- item.count != null ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "pire-tab-count", children: item.count }) : null
1679
+ item.count != null ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { className: "pire-tab-count", children: item.count }) : null
1468
1680
  ] }) }),
1469
- items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_aria_components19.TabPanel, { id: item.id, className: panels ? "pire-tabpanel" : void 0, children: panels?.[item.id] }, item.id))
1681
+ items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_react_aria_components22.TabPanel, { id: item.id, className: panels ? "pire-tabpanel" : void 0, children: panels?.[item.id] }, item.id))
1470
1682
  ]
1471
1683
  }
1472
1684
  );
1473
1685
  }
1474
1686
 
1475
1687
  // src/components/navigation/Breadcrumb.tsx
1476
- var import_react_aria_components20 = require("react-aria-components");
1477
- var import_jsx_runtime28 = require("react/jsx-runtime");
1688
+ var import_react_aria_components23 = require("react-aria-components");
1689
+ var import_jsx_runtime33 = require("react/jsx-runtime");
1478
1690
  function Breadcrumb({ items, onNavigate, className, style }) {
1479
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1480
- import_react_aria_components20.Breadcrumbs,
1691
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1692
+ import_react_aria_components23.Breadcrumbs,
1481
1693
  {
1482
1694
  className: cx("pire-breadcrumbs", className),
1483
1695
  style,
@@ -1485,9 +1697,9 @@ function Breadcrumb({ items, onNavigate, className, style }) {
1485
1697
  onAction: (key) => onNavigate?.(String(key)),
1486
1698
  children: (item) => {
1487
1699
  const last = items[items.length - 1] === item;
1488
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_react_aria_components20.Breadcrumb, { className: "pire-breadcrumb", id: item.id ?? item.label, children: [
1489
- last ? item.label : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_react_aria_components20.Link, { href: item.href, children: item.label }),
1490
- last ? null : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Icon, { name: "chevron-right", size: 12, style: { color: "var(--text-tertiary)" } })
1700
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_react_aria_components23.Breadcrumb, { className: "pire-breadcrumb", id: item.id ?? item.label, children: [
1701
+ last ? item.label : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_react_aria_components23.Link, { href: item.href, children: item.label }),
1702
+ last ? null : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Icon, { name: "chevron-right", size: 12, style: { color: "var(--text-tertiary)" } })
1491
1703
  ] });
1492
1704
  }
1493
1705
  }
@@ -1495,7 +1707,7 @@ function Breadcrumb({ items, onNavigate, className, style }) {
1495
1707
  }
1496
1708
 
1497
1709
  // src/components/navigation/Pagination.tsx
1498
- var import_jsx_runtime29 = require("react/jsx-runtime");
1710
+ var import_jsx_runtime34 = require("react/jsx-runtime");
1499
1711
  function Pagination({
1500
1712
  page = 1,
1501
1713
  pageSize = 25,
@@ -1506,49 +1718,39 @@ function Pagination({
1506
1718
  className,
1507
1719
  style
1508
1720
  }) {
1721
+ const msg = usePireMessages();
1509
1722
  const pages = Math.max(1, Math.ceil(total / pageSize));
1510
1723
  const from = total === 0 ? 0 : (page - 1) * pageSize + 1;
1511
1724
  const to = Math.min(total, page * pageSize);
1512
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("nav", { className: cx("pire-pagination", className), style, "aria-label": "Pagination", children: [
1513
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("span", { className: "pire-pagination-count", children: [
1514
- from.toLocaleString(),
1515
- "\u2013",
1516
- to.toLocaleString(),
1517
- " of ",
1518
- total.toLocaleString()
1519
- ] }),
1520
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1725
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("nav", { className: cx("pire-pagination", className), style, "aria-label": msg.paginationLabel, children: [
1726
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "pire-pagination-count", children: msg.paginationRange.replace("{from}", from.toLocaleString()).replace("{to}", to.toLocaleString()).replace("{total}", total.toLocaleString()) }),
1727
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
1521
1728
  IconButton,
1522
1729
  {
1523
1730
  icon: "chevron-left",
1524
- label: "Previous page",
1731
+ label: msg.paginationPrevious,
1525
1732
  size: "sm",
1526
1733
  variant: "outlined",
1527
1734
  isDisabled: page <= 1,
1528
1735
  onPress: () => onPageChange?.(page - 1)
1529
1736
  }
1530
1737
  ),
1531
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("span", { className: "pire-pagination-count", "aria-live": "polite", children: [
1532
- "Page ",
1533
- page,
1534
- " of ",
1535
- pages
1536
- ] }),
1537
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1738
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "pire-pagination-count", "aria-live": "polite", children: msg.paginationPageOf.replace("{page}", String(page)).replace("{pages}", String(pages)) }),
1739
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
1538
1740
  IconButton,
1539
1741
  {
1540
1742
  icon: "chevron-right",
1541
- label: "Next page",
1743
+ label: msg.paginationNext,
1542
1744
  size: "sm",
1543
1745
  variant: "outlined",
1544
1746
  isDisabled: page >= pages,
1545
1747
  onPress: () => onPageChange?.(page + 1)
1546
1748
  }
1547
1749
  ),
1548
- onPageSizeChange ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1750
+ onPageSizeChange ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
1549
1751
  Select,
1550
1752
  {
1551
- "aria-label": "Rows per page",
1753
+ "aria-label": msg.paginationRowsPerPage,
1552
1754
  size: "sm",
1553
1755
  fullWidth: false,
1554
1756
  value: String(pageSize),
@@ -1560,8 +1762,59 @@ function Pagination({
1560
1762
  ] });
1561
1763
  }
1562
1764
 
1765
+ // src/components/navigation/Menu.tsx
1766
+ var import_react_aria_components24 = require("react-aria-components");
1767
+ var import_jsx_runtime35 = require("react/jsx-runtime");
1768
+ function Menu({ minWidth, className, style, ...rest }) {
1769
+ const width = typeof minWidth === "number" ? `${minWidth}px` : minWidth;
1770
+ const menuStyle = width == null ? style : { ["--pire-menu-min-w"]: width, ...style };
1771
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
1772
+ import_react_aria_components24.Menu,
1773
+ {
1774
+ className: cx("pire-menu", className),
1775
+ style: menuStyle,
1776
+ ...rest
1777
+ }
1778
+ );
1779
+ }
1780
+ function MenuItem({
1781
+ children,
1782
+ icon,
1783
+ description,
1784
+ shortcut,
1785
+ tone = "default",
1786
+ className,
1787
+ ...rest
1788
+ }) {
1789
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(
1790
+ import_react_aria_components24.MenuItem,
1791
+ {
1792
+ className: cx("pire-menu-item", className),
1793
+ "data-tone": tone === "danger" ? "danger" : void 0,
1794
+ ...rest,
1795
+ children: [
1796
+ icon ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(Icon, { name: icon, size: 16, className: "pire-menu-item-icon" }) : null,
1797
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("span", { className: "pire-menu-item-body", children: [
1798
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "pire-menu-item-label", children }),
1799
+ description ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "pire-menu-item-desc", children: description }) : null
1800
+ ] }),
1801
+ shortcut ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("kbd", { className: "pire-menu-item-shortcut", children: shortcut }) : null
1802
+ ]
1803
+ }
1804
+ );
1805
+ }
1806
+ function MenuSection({ title, children, className, ...rest }) {
1807
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_react_aria_components24.MenuSection, { className: cx("pire-menu-section", className), ...rest, children: [
1808
+ title ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_react_aria_components24.Header, { className: "pire-menu-section-title", children: title }) : null,
1809
+ children
1810
+ ] });
1811
+ }
1812
+ function MenuSeparator({ className }) {
1813
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_react_aria_components24.Separator, { className: cx("pire-menu-separator", className) });
1814
+ }
1815
+
1563
1816
  // src/components/feedback/InlineMessage.tsx
1564
- var import_jsx_runtime30 = require("react/jsx-runtime");
1817
+ var import_jsx_runtime36 = require("react/jsx-runtime");
1565
1818
  var KIND_ICON = {
1566
1819
  info: "info",
1567
1820
  success: "check-circle-2",
@@ -1569,8 +1822,9 @@ var KIND_ICON = {
1569
1822
  error: "alert-octagon"
1570
1823
  };
1571
1824
  function InlineMessage({ kind = "info", title, action, onClose, children, className, ...rest }) {
1825
+ const msg = usePireMessages();
1572
1826
  const assertive = kind === "error" || kind === "warning";
1573
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
1827
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
1574
1828
  "div",
1575
1829
  {
1576
1830
  className: cx("pire-msg", className),
@@ -1579,21 +1833,21 @@ function InlineMessage({ kind = "info", title, action, onClose, children, classN
1579
1833
  "aria-live": assertive ? "assertive" : "polite",
1580
1834
  ...rest,
1581
1835
  children: [
1582
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Icon, { name: KIND_ICON[kind], size: 16, style: { marginTop: 2 } }),
1583
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { style: { flex: 1, display: "flex", flexDirection: "column", gap: "var(--sp-1)" }, children: [
1584
- title ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "pire-msg-title", children: title }) : null,
1585
- children ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "pire-msg-body", children }) : null,
1836
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Icon, { name: KIND_ICON[kind], size: 16, style: { marginTop: 2 } }),
1837
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { style: { flex: 1, display: "flex", flexDirection: "column", gap: "var(--sp-1)" }, children: [
1838
+ title ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "pire-msg-title", children: title }) : null,
1839
+ children ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "pire-msg-body", children }) : null,
1586
1840
  action
1587
1841
  ] }),
1588
- onClose ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(IconButton, { icon: "x", label: "Dismiss message", size: "sm", onPress: onClose }) : null
1842
+ onClose ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(IconButton, { icon: "x", label: msg.inlineMessageDismiss, size: "sm", onPress: onClose }) : null
1589
1843
  ]
1590
1844
  }
1591
1845
  );
1592
1846
  }
1593
1847
 
1594
1848
  // src/components/feedback/ProgressBar.tsx
1595
- var import_react_aria_components21 = require("react-aria-components");
1596
- var import_jsx_runtime31 = require("react/jsx-runtime");
1849
+ var import_react_aria_components25 = require("react-aria-components");
1850
+ var import_jsx_runtime37 = require("react/jsx-runtime");
1597
1851
  function ProgressBar({
1598
1852
  value = 0,
1599
1853
  minValue = 0,
@@ -1606,8 +1860,8 @@ function ProgressBar({
1606
1860
  className,
1607
1861
  style
1608
1862
  }) {
1609
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1610
- import_react_aria_components21.ProgressBar,
1863
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
1864
+ import_react_aria_components25.ProgressBar,
1611
1865
  {
1612
1866
  className: cx("pire-progress", className),
1613
1867
  "data-status": status,
@@ -1617,20 +1871,20 @@ function ProgressBar({
1617
1871
  maxValue,
1618
1872
  isIndeterminate,
1619
1873
  style,
1620
- children: ({ percentage, valueText }) => /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_jsx_runtime31.Fragment, { children: [
1621
- label || showValue ? /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "pire-progress-head", children: [
1622
- label ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_react_aria_components21.Label, { children: label }) : /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", {}),
1623
- showValue && !isIndeterminate ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: "pire-numeric", children: valueText }) : null
1874
+ children: ({ percentage, valueText }) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_jsx_runtime37.Fragment, { children: [
1875
+ label || showValue ? /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "pire-progress-head", children: [
1876
+ label ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_react_aria_components25.Label, { children: label }) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", {}),
1877
+ showValue && !isIndeterminate ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: "pire-numeric", children: valueText }) : null
1624
1878
  ] }) : null,
1625
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "pire-progress-track", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "pire-progress-fill", style: { width: `${isIndeterminate ? 40 : percentage}%` } }) })
1879
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "pire-progress-track", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("div", { className: "pire-progress-fill", style: { width: `${isIndeterminate ? 40 : percentage}%` } }) })
1626
1880
  ] })
1627
1881
  }
1628
1882
  );
1629
1883
  }
1630
1884
 
1631
1885
  // src/components/feedback/Toast.tsx
1632
- var React10 = __toESM(require("react"), 1);
1633
- var import_jsx_runtime32 = require("react/jsx-runtime");
1886
+ var React11 = __toESM(require("react"), 1);
1887
+ var import_jsx_runtime38 = require("react/jsx-runtime");
1634
1888
  var KIND_ICON2 = {
1635
1889
  info: "info",
1636
1890
  success: "check-circle-2",
@@ -1638,7 +1892,8 @@ var KIND_ICON2 = {
1638
1892
  error: "alert-octagon"
1639
1893
  };
1640
1894
  function Toast({ kind = "success", onClose, position = "bottom-center", children, className, ...rest }) {
1641
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
1895
+ const msg = usePireMessages();
1896
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
1642
1897
  "div",
1643
1898
  {
1644
1899
  className: cx("pire-toast", className),
@@ -1647,40 +1902,41 @@ function Toast({ kind = "success", onClose, position = "bottom-center", children
1647
1902
  "aria-live": kind === "error" ? "assertive" : "polite",
1648
1903
  ...rest,
1649
1904
  children: [
1650
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Icon, { name: KIND_ICON2[kind], size: 16 }),
1651
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { style: { flex: 1 }, children }),
1652
- onClose ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(IconButton, { icon: "x", label: "Dismiss", size: "sm", variant: "inverse", onPress: onClose }) : null
1905
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(Icon, { name: KIND_ICON2[kind], size: 16 }),
1906
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { style: { flex: 1 }, children }),
1907
+ onClose ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(IconButton, { icon: "x", label: msg.toastDismiss, size: "sm", variant: "inverse", onPress: onClose }) : null
1653
1908
  ]
1654
1909
  }
1655
1910
  );
1656
1911
  }
1657
- var ToastContext = React10.createContext(null);
1912
+ var ToastContext = React11.createContext(null);
1658
1913
  function ToastProvider({ children, timeout = 6e3 }) {
1659
- const [toasts, setToasts] = React10.useState([]);
1660
- const close = React10.useCallback((id) => setToasts((t) => t.filter((x) => x.id !== id)), []);
1661
- const add = React10.useCallback((toast) => {
1914
+ const msg = usePireMessages();
1915
+ const [toasts, setToasts] = React11.useState([]);
1916
+ const close = React11.useCallback((id) => setToasts((t) => t.filter((x) => x.id !== id)), []);
1917
+ const add = React11.useCallback((toast) => {
1662
1918
  const id = Math.random().toString(36).slice(2);
1663
1919
  setToasts((t) => [...t, { ...toast, id }]);
1664
1920
  const ms = toast.timeout ?? timeout;
1665
1921
  if (ms > 0) setTimeout(() => close(id), ms);
1666
1922
  return id;
1667
1923
  }, [close, timeout]);
1668
- const value = React10.useMemo(() => ({ add, close }), [add, close]);
1669
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(ToastContext.Provider, { value, children: [
1924
+ const value = React11.useMemo(() => ({ add, close }), [add, close]);
1925
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(ToastContext.Provider, { value, children: [
1670
1926
  children,
1671
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: "pire-toast-region", role: "region", "aria-label": "Notifications", children: toasts.map((t) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Toast, { kind: t.kind, onClose: () => close(t.id), style: { position: "static", transform: "none" }, children: t.message }, t.id)) })
1927
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("div", { className: "pire-toast-region", role: "region", "aria-label": msg.toastRegionLabel, children: toasts.map((t) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(Toast, { kind: t.kind, onClose: () => close(t.id), style: { position: "static", transform: "none" }, children: t.message }, t.id)) })
1672
1928
  ] });
1673
1929
  }
1674
1930
  function useToast() {
1675
- const ctx = React10.useContext(ToastContext);
1931
+ const ctx = React11.useContext(ToastContext);
1676
1932
  if (!ctx) throw new Error("useToast must be used inside <ToastProvider>");
1677
1933
  return ctx;
1678
1934
  }
1679
1935
 
1680
1936
  // src/components/feedback/Skeleton.tsx
1681
- var import_jsx_runtime33 = require("react/jsx-runtime");
1937
+ var import_jsx_runtime39 = require("react/jsx-runtime");
1682
1938
  function Skeleton({ shape = "text", width, height, className, style, ...rest }) {
1683
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1939
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
1684
1940
  "div",
1685
1941
  {
1686
1942
  className: cx("pire-skeleton", className),
@@ -1694,7 +1950,7 @@ function Skeleton({ shape = "text", width, height, className, style, ...rest })
1694
1950
  var BAR_WIDTHS = ["72%", "54%", "86%", "63%"];
1695
1951
  function SkeletonTableRow({ columns, density = "regular", className, style, ...rest }) {
1696
1952
  const cells = typeof columns === "number" ? Array.from({ length: columns }, () => ({})) : columns;
1697
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1953
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
1698
1954
  "div",
1699
1955
  {
1700
1956
  className: cx("pire-skeleton-row", className),
@@ -1706,13 +1962,13 @@ function SkeletonTableRow({ columns, density = "regular", className, style, ...r
1706
1962
  const align = c.numeric ? "right" : c.align ?? "left";
1707
1963
  return (
1708
1964
  // biome-ignore lint/suspicious/noArrayIndexKey: columns are positional and never reordered.
1709
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1965
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
1710
1966
  "div",
1711
1967
  {
1712
1968
  className: "pire-skeleton-cell",
1713
1969
  "data-align": align,
1714
1970
  style: { width: c.width, flex: c.width ? "0 0 auto" : void 0 },
1715
- children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Skeleton, { width: BAR_WIDTHS[i % BAR_WIDTHS.length] })
1971
+ children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Skeleton, { width: BAR_WIDTHS[i % BAR_WIDTHS.length] })
1716
1972
  },
1717
1973
  i
1718
1974
  )
@@ -1723,8 +1979,8 @@ function SkeletonTableRow({ columns, density = "regular", className, style, ...r
1723
1979
  }
1724
1980
 
1725
1981
  // src/components/data/KpiTile.tsx
1726
- var import_react_aria_components22 = require("react-aria-components");
1727
- var import_jsx_runtime34 = require("react/jsx-runtime");
1982
+ var import_react_aria_components26 = require("react-aria-components");
1983
+ var import_jsx_runtime40 = require("react/jsx-runtime");
1728
1984
  function KpiTile({
1729
1985
  label,
1730
1986
  value,
@@ -1740,50 +1996,50 @@ function KpiTile({
1740
1996
  style
1741
1997
  }) {
1742
1998
  const tone = deltaTone ?? (deltaDirection === "down" ? "negative" : "positive");
1743
- const body = /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_jsx_runtime34.Fragment, { children: [
1744
- /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("span", { className: "pire-kpi-label", children: [
1745
- icon ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(Icon, { name: icon, size: 16 }) : null,
1999
+ const body = /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_jsx_runtime40.Fragment, { children: [
2000
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("span", { className: "pire-kpi-label", children: [
2001
+ icon ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Icon, { name: icon, size: 16 }) : null,
1746
2002
  label
1747
2003
  ] }),
1748
- /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("span", { className: "pire-kpi-value", children: [
2004
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("span", { className: "pire-kpi-value", children: [
1749
2005
  value,
1750
- unit ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "pire-kpi-unit", children: unit }) : null
2006
+ unit ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("span", { className: "pire-kpi-unit", children: unit }) : null
1751
2007
  ] }),
1752
- delta ? /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("span", { className: "pire-kpi-delta", "data-tone": tone, children: [
1753
- deltaDirection ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(Icon, { name: deltaDirection === "up" ? "trending-up" : "trending-down", size: 12 }) : null,
2008
+ delta ? /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("span", { className: "pire-kpi-delta", "data-tone": tone, children: [
2009
+ deltaDirection ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(Icon, { name: deltaDirection === "up" ? "trending-up" : "trending-down", size: 12 }) : null,
1754
2010
  delta
1755
2011
  ] }) : null,
1756
- footnote ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: "pire-kpi-foot", children: footnote }) : null
2012
+ footnote ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("span", { className: "pire-kpi-foot", children: footnote }) : null
1757
2013
  ] });
1758
2014
  const props = { className: cx("pire-kpi", className), "data-status": status, style };
1759
- return onPress ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_react_aria_components22.Button, { ...props, "data-pressable": "true", onPress, children: body }) : /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { ...props, children: body });
2015
+ 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 });
1760
2016
  }
1761
2017
 
1762
2018
  // src/components/data/ObjectHeader.tsx
1763
- var import_jsx_runtime35 = require("react/jsx-runtime");
2019
+ var import_jsx_runtime41 = require("react/jsx-runtime");
1764
2020
  function ObjectHeader({ title, subtitle, id, breadcrumb, badge, facts, actions, className, ...rest }) {
1765
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("header", { className: cx("pire-objheader", className), ...rest, children: [
2021
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("header", { className: cx("pire-objheader", className), ...rest, children: [
1766
2022
  breadcrumb,
1767
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "pire-objheader-row", children: [
1768
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { style: { minWidth: 0 }, children: [
1769
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("h1", { className: "pire-objheader-title", children: title }),
1770
- subtitle || id ? /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "pire-objheader-sub", children: [
2023
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "pire-objheader-row", children: [
2024
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { style: { minWidth: 0 }, children: [
2025
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("h1", { className: "pire-objheader-title", children: title }),
2026
+ subtitle || id ? /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: "pire-objheader-sub", children: [
1771
2027
  subtitle,
1772
- id ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("span", { className: "pire-objheader-id", children: id }) : null
2028
+ id ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "pire-objheader-id", children: id }) : null
1773
2029
  ] }) : null
1774
2030
  ] }),
1775
2031
  badge,
1776
- actions ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { className: "pire-objheader-actions", children: actions }) : null
2032
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "pire-objheader-actions", children: actions }) : null
1777
2033
  ] }),
1778
- facts?.length ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("dl", { className: "pire-facts", style: { margin: 0 }, children: facts.map((fact) => /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { children: [
1779
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("dt", { className: "pire-fact-label", children: fact.label }),
1780
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("dd", { className: "pire-fact-value", "data-numeric": fact.numeric ? "true" : void 0, style: { margin: 0 }, children: fact.value })
2034
+ 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: [
2035
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("dt", { className: "pire-fact-label", children: fact.label }),
2036
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("dd", { className: "pire-fact-value", "data-numeric": fact.numeric ? "true" : void 0, style: { margin: 0 }, children: fact.value })
1781
2037
  ] }, fact.label)) }) : null
1782
2038
  ] });
1783
2039
  }
1784
2040
 
1785
2041
  // src/components/data/FilterBar.tsx
1786
- var import_jsx_runtime36 = require("react/jsx-runtime");
2042
+ var import_jsx_runtime42 = require("react/jsx-runtime");
1787
2043
  function FilterBar({
1788
2044
  children,
1789
2045
  activeFilters = [],
@@ -1792,118 +2048,123 @@ function FilterBar({
1792
2048
  onGo,
1793
2049
  resultLabel,
1794
2050
  actions,
2051
+ goLabel,
2052
+ clearAllLabel,
1795
2053
  className,
1796
2054
  ...rest
1797
2055
  }) {
1798
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("section", { className: cx("pire-filterbar", className), "aria-label": "Filters", ...rest, children: [
1799
- /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "pire-filterbar-controls", children: [
2056
+ const label = useMessage("filterBarLabel", rest["aria-label"]);
2057
+ const go = useMessage("filterBarGo", goLabel);
2058
+ const clearAll = useMessage("filterBarClearAll", clearAllLabel);
2059
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("section", { className: cx("pire-filterbar", className), ...rest, "aria-label": label, children: [
2060
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "pire-filterbar-controls", children: [
1800
2061
  children,
1801
- onGo ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Button, { variant: "primary", onPress: onGo, children: "Go" }) : null
2062
+ onGo ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Button, { variant: "primary", onPress: onGo, children: go }) : null
1802
2063
  ] }),
1803
- activeFilters.length || resultLabel || actions ? /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "pire-filterbar-foot", children: [
1804
- activeFilters.map((filter) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Tag, { onRemove: onRemoveFilter ? () => onRemoveFilter(filter.id) : void 0, children: filter.label }, filter.id)),
1805
- activeFilters.length && onClear ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Button, { variant: "tertiary", size: "sm", onPress: onClear, children: "Clear all" }) : null,
1806
- resultLabel ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "pire-filterbar-result", "aria-live": "polite", children: resultLabel }) : null,
1807
- actions ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("div", { className: "pire-filterbar-actions", children: actions }) : null
2064
+ activeFilters.length || resultLabel || actions ? /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: "pire-filterbar-foot", children: [
2065
+ activeFilters.map((filter) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Tag, { onRemove: onRemoveFilter ? () => onRemoveFilter(filter.id) : void 0, children: filter.label }, filter.id)),
2066
+ activeFilters.length && onClear ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Button, { variant: "tertiary", size: "sm", onPress: onClear, children: clearAll }) : null,
2067
+ resultLabel ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: "pire-filterbar-result", "aria-live": "polite", children: resultLabel }) : null,
2068
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "pire-filterbar-actions", children: actions }) : null
1808
2069
  ] }) : null
1809
2070
  ] });
1810
2071
  }
1811
2072
 
1812
2073
  // src/components/data/DescriptionList.tsx
1813
- var import_jsx_runtime37 = require("react/jsx-runtime");
2074
+ var import_jsx_runtime43 = require("react/jsx-runtime");
1814
2075
  function DescriptionList({ items, layout = "rows", columns = 3, className, style, ...rest }) {
1815
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2076
+ return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
1816
2077
  "dl",
1817
2078
  {
1818
2079
  className: cx("pire-dl", className),
1819
2080
  "data-layout": layout,
1820
2081
  style: { ...layout === "grid" ? { "--pire-dl-cols": columns } : null, ...style },
1821
2082
  ...rest,
1822
- children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "pire-dl-row", "data-emphasis": item.emphasis ? "true" : void 0, children: [
1823
- /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("dt", { className: "pire-dl-term", children: [
2083
+ children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("div", { className: "pire-dl-row", "data-emphasis": item.emphasis ? "true" : void 0, children: [
2084
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("dt", { className: "pire-dl-term", children: [
1824
2085
  item.label,
1825
2086
  item.hint
1826
2087
  ] }),
1827
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("dd", { className: "pire-dl-value", "data-numeric": item.numeric ? "true" : void 0, children: item.value })
2088
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("dd", { className: "pire-dl-value", "data-numeric": item.numeric ? "true" : void 0, children: item.value })
1828
2089
  ] }, i))
1829
2090
  }
1830
2091
  );
1831
2092
  }
1832
2093
 
1833
2094
  // src/components/data/Timeline.tsx
1834
- var import_jsx_runtime38 = require("react/jsx-runtime");
2095
+ var import_jsx_runtime44 = require("react/jsx-runtime");
1835
2096
  function Timeline({ entries, reverse = false, className, ...rest }) {
1836
2097
  const list = reverse ? [...entries].reverse() : entries;
1837
- return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("ol", { className: cx("pire-timeline", className), ...rest, children: list.map((entry, i) => /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("li", { className: "pire-timeline-item", children: [
1838
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "pire-timeline-time", children: entry.time }),
1839
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "pire-timeline-text", children: entry.event }),
1840
- entry.actor ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "pire-timeline-actor", children: entry.actor }) : null
2098
+ 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: [
2099
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "pire-timeline-time", children: entry.time }),
2100
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "pire-timeline-text", children: entry.event }),
2101
+ entry.actor ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "pire-timeline-actor", children: entry.actor }) : null
1841
2102
  ] }, entry.id ?? i)) });
1842
2103
  }
1843
2104
 
1844
2105
  // src/components/data/LinkList.tsx
1845
- var import_react_aria_components23 = require("react-aria-components");
1846
- var import_jsx_runtime39 = require("react/jsx-runtime");
2106
+ var import_react_aria_components27 = require("react-aria-components");
2107
+ var import_jsx_runtime45 = require("react/jsx-runtime");
1847
2108
  function LinkList({ items, onSelect, className, ...rest }) {
1848
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: cx("pire-linklist", className), role: "list", ...rest, children: items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_react_aria_components23.Button, { className: "pire-linklist-item", onPress: () => onSelect?.(item.id), children: [
1849
- item.icon ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Icon, { name: item.icon, size: 16, style: { color: "var(--text-secondary)" } }) : null,
1850
- item.key ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { className: "pire-linklist-key", children: item.key }) : null,
1851
- item.text ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { className: "pire-linklist-text", children: item.text }) : null,
2109
+ 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: [
2110
+ item.icon ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(Icon, { name: item.icon, size: 16, style: { color: "var(--text-secondary)" } }) : null,
2111
+ item.key ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "pire-linklist-key", children: item.key }) : null,
2112
+ item.text ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "pire-linklist-text", children: item.text }) : null,
1852
2113
  item.trailing
1853
2114
  ] }, item.id)) });
1854
2115
  }
1855
2116
 
1856
2117
  // src/components/layout/PageHeader.tsx
1857
- var import_jsx_runtime40 = require("react/jsx-runtime");
2118
+ var import_jsx_runtime46 = require("react/jsx-runtime");
1858
2119
  function PageHeader({ title, subtitle, actions, className, ...rest }) {
1859
- return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("header", { className: cx("pire-pageheader", className), ...rest, children: [
1860
- /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("div", { style: { minWidth: 0 }, children: [
1861
- /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("h1", { className: "pire-pageheader-title", children: title }),
1862
- subtitle ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("p", { className: "pire-pageheader-sub", children: subtitle }) : null
2120
+ return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("header", { className: cx("pire-pageheader", className), ...rest, children: [
2121
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { style: { minWidth: 0 }, children: [
2122
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("h1", { className: "pire-pageheader-title", children: title }),
2123
+ subtitle ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("p", { className: "pire-pageheader-sub", children: subtitle }) : null
1863
2124
  ] }),
1864
- actions ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { className: "pire-pageheader-actions", children: actions }) : null
2125
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "pire-pageheader-actions", children: actions }) : null
1865
2126
  ] });
1866
2127
  }
1867
2128
 
1868
2129
  // src/components/layout/SectionHeader.tsx
1869
- var import_jsx_runtime41 = require("react/jsx-runtime");
2130
+ var import_jsx_runtime47 = require("react/jsx-runtime");
1870
2131
  function SectionHeader({ title, meta, actions, className, ...rest }) {
1871
- return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: cx("pire-sectionhead", className), ...rest, children: [
1872
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "pire-eyebrow", children: title }),
1873
- meta ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { style: { font: "var(--type-caption)", color: "var(--text-tertiary)" }, children: meta }) : null,
1874
- actions ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { className: "pire-sectionhead-actions", children: actions }) : null
2132
+ return /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: cx("pire-sectionhead", className), ...rest, children: [
2133
+ /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { className: "pire-eyebrow", children: title }),
2134
+ meta ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("span", { style: { font: "var(--type-caption)", color: "var(--text-tertiary)" }, children: meta }) : null,
2135
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)("div", { className: "pire-sectionhead-actions", children: actions }) : null
1875
2136
  ] });
1876
2137
  }
1877
2138
 
1878
2139
  // src/components/layout/SelectionBar.tsx
1879
- var import_jsx_runtime42 = require("react/jsx-runtime");
2140
+ var import_jsx_runtime48 = require("react/jsx-runtime");
1880
2141
  function SelectionBar({ count, noun = "record", children, actions, className, ...rest }) {
1881
2142
  if (!count) return null;
1882
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: cx("pire-selectionbar", className), role: "status", "aria-live": "polite", ...rest, children: [
1883
- /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("span", { className: "pire-selectionbar-count", children: [
2143
+ return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: cx("pire-selectionbar", className), role: "status", "aria-live": "polite", ...rest, children: [
2144
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("span", { className: "pire-selectionbar-count", children: [
1884
2145
  count.toLocaleString(),
1885
2146
  " ",
1886
2147
  noun,
1887
2148
  count === 1 ? "" : "s",
1888
2149
  " selected"
1889
2150
  ] }),
1890
- children ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { style: { color: "var(--text-secondary)", font: "var(--type-caption)" }, children }) : null,
1891
- actions ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: "pire-selectionbar-actions", children: actions }) : null
2151
+ children ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { style: { color: "var(--text-secondary)", font: "var(--type-caption)" }, children }) : null,
2152
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "pire-selectionbar-actions", children: actions }) : null
1892
2153
  ] });
1893
2154
  }
1894
2155
 
1895
2156
  // src/components/layout/FooterBar.tsx
1896
- var import_jsx_runtime43 = require("react/jsx-runtime");
2157
+ var import_jsx_runtime49 = require("react/jsx-runtime");
1897
2158
  function FooterBar({ note, actions, children, className, ...rest }) {
1898
- return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("footer", { className: cx("pire-footerbar", className), ...rest, children: [
1899
- note ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("span", { className: "pire-footerbar-note", children: note }) : null,
2159
+ return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("footer", { className: cx("pire-footerbar", className), ...rest, children: [
2160
+ note ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "pire-footerbar-note", children: note }) : null,
1900
2161
  children,
1901
- actions ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("div", { className: "pire-footerbar-actions", children: actions }) : null
2162
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "pire-footerbar-actions", children: actions }) : null
1902
2163
  ] });
1903
2164
  }
1904
2165
 
1905
2166
  // src/components/patterns/ConfirmDialog.tsx
1906
- var import_jsx_runtime44 = require("react/jsx-runtime");
2167
+ var import_jsx_runtime50 = require("react/jsx-runtime");
1907
2168
  function ConfirmDialog({
1908
2169
  isOpen,
1909
2170
  title,
@@ -1917,7 +2178,7 @@ function ConfirmDialog({
1917
2178
  onConfirm,
1918
2179
  onCancel
1919
2180
  }) {
1920
- return /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
2181
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(
1921
2182
  Dialog,
1922
2183
  {
1923
2184
  isOpen,
@@ -1927,12 +2188,12 @@ function ConfirmDialog({
1927
2188
  onClose: onCancel,
1928
2189
  isDismissable: !isBusy,
1929
2190
  showClose: false,
1930
- footer: /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_jsx_runtime44.Fragment, { children: [
1931
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(Button, { variant: "tertiary", isDisabled: isBusy, onPress: onCancel, children: cancelLabel }),
1932
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(Button, { variant: tone === "danger" ? "danger" : "primary", isDisabled: isBusy, onPress: onConfirm, children: isBusy ? "Working\u2026" : confirmLabel })
2191
+ footer: /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_jsx_runtime50.Fragment, { children: [
2192
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Button, { variant: "tertiary", isDisabled: isBusy, onPress: onCancel, children: cancelLabel }),
2193
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Button, { variant: tone === "danger" ? "danger" : "primary", isDisabled: isBusy, onPress: onConfirm, children: isBusy ? "Working\u2026" : confirmLabel })
1933
2194
  ] }),
1934
2195
  children: [
1935
- consequence ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(InlineMessage, { kind: tone === "danger" ? "error" : "warning", style: { marginBottom: children ? "var(--sp-3)" : 0 }, children: consequence }) : null,
2196
+ consequence ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(InlineMessage, { kind: tone === "danger" ? "error" : "warning", style: { marginBottom: children ? "var(--sp-3)" : 0 }, children: consequence }) : null,
1936
2197
  children
1937
2198
  ]
1938
2199
  }
@@ -1940,11 +2201,12 @@ function ConfirmDialog({
1940
2201
  }
1941
2202
 
1942
2203
  // src/components/patterns/SidePanel.tsx
1943
- var import_react_aria_components24 = require("react-aria-components");
1944
- var import_jsx_runtime45 = require("react/jsx-runtime");
2204
+ var import_react_aria_components28 = require("react-aria-components");
2205
+ var import_jsx_runtime51 = require("react/jsx-runtime");
1945
2206
  function SidePanel({ isOpen, title, subtitle, width = 400, children, footer, onClose, className }) {
1946
- return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
1947
- import_react_aria_components24.ModalOverlay,
2207
+ const msg = usePireMessages();
2208
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
2209
+ import_react_aria_components28.ModalOverlay,
1948
2210
  {
1949
2211
  className: "pire-sidepanel-overlay",
1950
2212
  isOpen,
@@ -1952,34 +2214,34 @@ function SidePanel({ isOpen, title, subtitle, width = 400, children, footer, onC
1952
2214
  onOpenChange: (o) => {
1953
2215
  if (!o) onClose?.();
1954
2216
  },
1955
- children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_react_aria_components24.Modal, { className: cx("pire-sidepanel", className), style: { width }, children: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_react_aria_components24.Dialog, { className: "pire-dialog", style: { height: "100%" }, children: [
1956
- /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("header", { className: "pire-dialog-head", children: [
1957
- /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
1958
- /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_react_aria_components24.Heading, { slot: "title", className: "pire-dialog-title", children: title }),
1959
- subtitle ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "pire-dialog-sub", style: { margin: 0 }, children: subtitle }) : null
2217
+ children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_react_aria_components28.Modal, { className: cx("pire-sidepanel", className), style: { width }, children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_react_aria_components28.Dialog, { className: "pire-dialog", style: { height: "100%" }, children: [
2218
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("header", { className: "pire-dialog-head", children: [
2219
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
2220
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_react_aria_components28.Heading, { slot: "title", className: "pire-dialog-title", children: title }),
2221
+ subtitle ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("p", { className: "pire-dialog-sub", style: { margin: 0 }, children: subtitle }) : null
1960
2222
  ] }),
1961
- /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(IconButton, { icon: "x", label: "Close panel", size: "sm", onPress: onClose })
2223
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(IconButton, { icon: "x", label: msg.sidePanelClose, size: "sm", onPress: onClose })
1962
2224
  ] }),
1963
- /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "pire-dialog-body", style: { flex: 1 }, children }),
1964
- footer ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("footer", { className: "pire-dialog-foot", children: footer }) : null
2225
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "pire-dialog-body", style: { flex: 1 }, children }),
2226
+ footer ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)("footer", { className: "pire-dialog-foot", children: footer }) : null
1965
2227
  ] }) })
1966
2228
  }
1967
2229
  );
1968
2230
  }
1969
2231
 
1970
2232
  // src/components/patterns/EmptyState.tsx
1971
- var import_jsx_runtime46 = require("react/jsx-runtime");
2233
+ var import_jsx_runtime52 = require("react/jsx-runtime");
1972
2234
  function EmptyState({ icon = "file-text", title, action, compact, children, className, ...rest }) {
1973
- return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: cx("pire-empty", className), "data-compact": compact ? "true" : void 0, ...rest, children: [
1974
- /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Icon, { name: icon, size: 24, className: "pire-empty-icon" }),
1975
- title ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("p", { className: "pire-empty-title", style: { margin: 0 }, children: title }) : null,
1976
- children ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("p", { className: "pire-empty-body", style: { margin: 0 }, children }) : null,
2235
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)("div", { className: cx("pire-empty", className), "data-compact": compact ? "true" : void 0, ...rest, children: [
2236
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(Icon, { name: icon, size: 24, className: "pire-empty-icon" }),
2237
+ title ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("p", { className: "pire-empty-title", style: { margin: 0 }, children: title }) : null,
2238
+ children ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("p", { className: "pire-empty-body", style: { margin: 0 }, children }) : null,
1977
2239
  action
1978
2240
  ] });
1979
2241
  }
1980
2242
 
1981
2243
  // src/index.ts
1982
- var import_react_aria_components25 = require("react-aria-components");
2244
+ var import_react_aria_components29 = require("react-aria-components");
1983
2245
  // Annotate the CommonJS export names for ESM import in node:
1984
2246
  0 && (module.exports = {
1985
2247
  Avatar,
@@ -1999,25 +2261,31 @@ var import_react_aria_components25 = require("react-aria-components");
1999
2261
  FilterBar,
2000
2262
  FooterBar,
2001
2263
  FormField,
2264
+ Heading,
2002
2265
  I18nProvider,
2003
2266
  Icon,
2004
2267
  IconButton,
2005
2268
  InlineMessage,
2006
2269
  Input,
2007
2270
  KpiTile,
2271
+ Link,
2008
2272
  LinkList,
2009
2273
  Menu,
2010
2274
  MenuItem,
2275
+ MenuSection,
2276
+ MenuSeparator,
2011
2277
  MenuTrigger,
2012
2278
  MultiComboBox,
2013
2279
  NumberField,
2014
2280
  ObjectHeader,
2015
2281
  PageHeader,
2016
2282
  Pagination,
2283
+ PireIntlProvider,
2017
2284
  Popover,
2018
2285
  ProgressBar,
2019
2286
  Radio,
2020
2287
  RadioGroup,
2288
+ RouterProvider,
2021
2289
  SectionHeader,
2022
2290
  SegmentedControl,
2023
2291
  Select,
@@ -2028,9 +2296,12 @@ var import_react_aria_components25 = require("react-aria-components");
2028
2296
  SidePanel,
2029
2297
  Skeleton,
2030
2298
  SkeletonTableRow,
2299
+ Strong,
2300
+ SubmenuTrigger,
2031
2301
  Switch,
2032
2302
  Tabs,
2033
2303
  Tag,
2304
+ Text,
2034
2305
  TextArea,
2035
2306
  Timeline,
2036
2307
  Toast,
@@ -2039,6 +2310,9 @@ var import_react_aria_components25 = require("react-aria-components");
2039
2310
  ValueHelpDialog,
2040
2311
  ValueHelpField,
2041
2312
  configureIcons,
2313
+ enMessages,
2314
+ esMessages,
2315
+ usePireMessages,
2042
2316
  useToast
2043
2317
  });
2044
2318
  //# sourceMappingURL=index.cjs.map