@orianatech/pire 0.4.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 (58) hide show
  1. package/NOTICE +19 -0
  2. package/dist/components/core/Heading.d.cts +15 -0
  3. package/dist/components/core/Heading.d.ts +16 -0
  4. package/dist/components/core/Heading.d.ts.map +1 -0
  5. package/dist/components/core/Link.d.cts +13 -0
  6. package/dist/components/core/Link.d.ts +14 -0
  7. package/dist/components/core/Link.d.ts.map +1 -0
  8. package/dist/components/core/Separator.d.cts +12 -0
  9. package/dist/components/core/Separator.d.ts +13 -0
  10. package/dist/components/core/Separator.d.ts.map +1 -0
  11. package/dist/components/core/Text.d.cts +29 -0
  12. package/dist/components/core/Text.d.ts +30 -0
  13. package/dist/components/core/Text.d.ts.map +1 -0
  14. package/dist/components/data/DataTable.d.ts.map +1 -1
  15. package/dist/components/data/FilterBar.d.cts +7 -1
  16. package/dist/components/data/FilterBar.d.ts +7 -1
  17. package/dist/components/data/FilterBar.d.ts.map +1 -1
  18. package/dist/components/feedback/Dialog.d.ts.map +1 -1
  19. package/dist/components/feedback/InlineMessage.d.ts.map +1 -1
  20. package/dist/components/feedback/Toast.d.ts.map +1 -1
  21. package/dist/components/forms/ComboBox.d.ts.map +1 -1
  22. package/dist/components/forms/DatePicker.d.ts.map +1 -1
  23. package/dist/components/forms/MultiComboBox.d.ts.map +1 -1
  24. package/dist/components/forms/NumberField.d.ts.map +1 -1
  25. package/dist/components/forms/ValueHelpField.d.ts.map +1 -1
  26. package/dist/components/navigation/Menu.d.cts +39 -0
  27. package/dist/components/navigation/Menu.d.ts +40 -0
  28. package/dist/components/navigation/Menu.d.ts.map +1 -0
  29. package/dist/components/navigation/Pagination.d.ts.map +1 -1
  30. package/dist/components/navigation/SideNav.d.ts.map +1 -1
  31. package/dist/components/patterns/SidePanel.d.ts.map +1 -1
  32. package/dist/components/patterns/ValueHelpDialog.d.ts.map +1 -1
  33. package/dist/components.css +67 -0
  34. package/dist/fonts/LICENSE-jetbrains-mono.txt +93 -0
  35. package/dist/fonts/LICENSE-public-sans.txt +93 -0
  36. package/dist/fonts/jetbrains-mono-latin-400-normal.woff2 +0 -0
  37. package/dist/fonts/jetbrains-mono-latin-500-normal.woff2 +0 -0
  38. package/dist/fonts/jetbrains-mono-latin-600-normal.woff2 +0 -0
  39. package/dist/fonts/public-sans-latin-400-normal.woff2 +0 -0
  40. package/dist/fonts/public-sans-latin-500-normal.woff2 +0 -0
  41. package/dist/fonts/public-sans-latin-600-normal.woff2 +0 -0
  42. package/dist/fonts/public-sans-latin-700-normal.woff2 +0 -0
  43. package/dist/i18n/PireIntlProvider.d.cts +21 -0
  44. package/dist/i18n/PireIntlProvider.d.ts +22 -0
  45. package/dist/i18n/PireIntlProvider.d.ts.map +1 -0
  46. package/dist/i18n/messages.d.cts +64 -0
  47. package/dist/i18n/messages.d.ts +65 -0
  48. package/dist/i18n/messages.d.ts.map +1 -0
  49. package/dist/index.cjs +674 -399
  50. package/dist/index.cjs.map +1 -1
  51. package/dist/index.d.cts +8 -1
  52. package/dist/index.d.ts +8 -1
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +628 -359
  55. package/dist/index.js.map +1 -1
  56. package/dist/tokens/fonts.css +20 -15
  57. package/dist/tokens/typography.css +5 -0
  58. package/package.json +5 -2
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,64 +1572,65 @@ 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,
1368
1580
  "data-active-child": isGroup && item.id === activeParent ? "true" : void 0,
1369
1581
  "aria-current": selected ? "page" : void 0,
1582
+ "aria-label": collapsed ? item.label : void 0,
1370
1583
  onPress,
1371
1584
  children: [
1372
- item.icon ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(Icon, { name: item.icon, size: 16 }) : null,
1373
- collapsed ? null : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { children: item.label }),
1374
- 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
1375
1588
  ]
1376
1589
  },
1377
1590
  item.id
1378
1591
  );
1379
- 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;
1380
1593
  };
1381
- const renderSection = (item) => /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_react_aria_components18.Disclosure, { id: item.id, className: "pire-sidenav-section", children: [
1382
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1383
- 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,
1384
1597
  {
1385
1598
  slot: "trigger",
1386
1599
  className: "pire-sidenav-item",
1387
1600
  "data-kind": "group",
1388
1601
  "data-active-child": item.id === activeParent ? "true" : void 0,
1389
1602
  children: [
1390
- item.icon ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(Icon, { name: item.icon, size: 16 }) : null,
1391
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { children: item.label }),
1392
- item.count != null ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "pire-sidenav-count", children: item.count }) : null,
1393
- /* @__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" })
1394
1607
  ]
1395
1608
  }
1396
1609
  ),
1397
- /* @__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) => {
1398
1611
  const selected = child.id === value;
1399
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1400
- import_react_aria_components18.Button,
1612
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
1613
+ import_react_aria_components21.Button,
1401
1614
  {
1402
1615
  className: "pire-sidenav-item pire-sidenav-subitem",
1403
1616
  "data-selected": selected ? "true" : void 0,
1404
1617
  "aria-current": selected ? "page" : void 0,
1405
1618
  onPress: () => onChange?.(child.id),
1406
1619
  children: [
1407
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { children: child.label }),
1408
- 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
1409
1622
  ]
1410
1623
  },
1411
1624
  child.id
1412
1625
  );
1413
1626
  }) })
1414
1627
  ] }, item.id);
1415
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1628
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
1416
1629
  "nav",
1417
1630
  {
1418
1631
  className: cx("pire-sidenav", className),
1419
1632
  "data-collapsed": collapsed ? "true" : void 0,
1420
- "aria-label": "Main navigation",
1633
+ "aria-label": msg.sideNavLabel,
1421
1634
  ...rest,
1422
1635
  children: [
1423
1636
  groups.map((group, gi) => {
@@ -1427,10 +1640,10 @@ function SideNav({
1427
1640
  if (isGroup && !collapsed) return renderSection(item);
1428
1641
  return renderRow(item, () => isGroup ? toggleExpanded(item.id) : onChange?.(item.id), isGroup);
1429
1642
  });
1430
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: "pire-sidenav-group", children: [
1431
- group.label && !collapsed ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: "pire-sidenav-label", children: group.label }) : null,
1432
- hasSections ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1433
- 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,
1434
1647
  {
1435
1648
  className: "pire-sidenav-tree",
1436
1649
  allowsMultipleExpanded: true,
@@ -1441,18 +1654,18 @@ function SideNav({
1441
1654
  ) : rows
1442
1655
  ] }, group.label ?? gi);
1443
1656
  }),
1444
- 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
1445
1658
  ]
1446
1659
  }
1447
1660
  );
1448
1661
  }
1449
1662
 
1450
1663
  // src/components/navigation/Tabs.tsx
1451
- var import_react_aria_components19 = require("react-aria-components");
1452
- 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");
1453
1666
  function Tabs({ items, value, defaultValue, onChange, panels, className, style, ...rest }) {
1454
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
1455
- import_react_aria_components19.Tabs,
1667
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
1668
+ import_react_aria_components22.Tabs,
1456
1669
  {
1457
1670
  className,
1458
1671
  style,
@@ -1460,23 +1673,23 @@ function Tabs({ items, value, defaultValue, onChange, panels, className, style,
1460
1673
  defaultSelectedKey: defaultValue,
1461
1674
  onSelectionChange: (k) => onChange?.(String(k)),
1462
1675
  children: [
1463
- /* @__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: [
1464
- 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,
1465
1678
  item.label,
1466
- 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
1467
1680
  ] }) }),
1468
- 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))
1469
1682
  ]
1470
1683
  }
1471
1684
  );
1472
1685
  }
1473
1686
 
1474
1687
  // src/components/navigation/Breadcrumb.tsx
1475
- var import_react_aria_components20 = require("react-aria-components");
1476
- 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");
1477
1690
  function Breadcrumb({ items, onNavigate, className, style }) {
1478
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1479
- import_react_aria_components20.Breadcrumbs,
1691
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1692
+ import_react_aria_components23.Breadcrumbs,
1480
1693
  {
1481
1694
  className: cx("pire-breadcrumbs", className),
1482
1695
  style,
@@ -1484,9 +1697,9 @@ function Breadcrumb({ items, onNavigate, className, style }) {
1484
1697
  onAction: (key) => onNavigate?.(String(key)),
1485
1698
  children: (item) => {
1486
1699
  const last = items[items.length - 1] === item;
1487
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_react_aria_components20.Breadcrumb, { className: "pire-breadcrumb", id: item.id ?? item.label, children: [
1488
- last ? item.label : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_react_aria_components20.Link, { href: item.href, children: item.label }),
1489
- 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)" } })
1490
1703
  ] });
1491
1704
  }
1492
1705
  }
@@ -1494,7 +1707,7 @@ function Breadcrumb({ items, onNavigate, className, style }) {
1494
1707
  }
1495
1708
 
1496
1709
  // src/components/navigation/Pagination.tsx
1497
- var import_jsx_runtime29 = require("react/jsx-runtime");
1710
+ var import_jsx_runtime34 = require("react/jsx-runtime");
1498
1711
  function Pagination({
1499
1712
  page = 1,
1500
1713
  pageSize = 25,
@@ -1505,49 +1718,39 @@ function Pagination({
1505
1718
  className,
1506
1719
  style
1507
1720
  }) {
1721
+ const msg = usePireMessages();
1508
1722
  const pages = Math.max(1, Math.ceil(total / pageSize));
1509
1723
  const from = total === 0 ? 0 : (page - 1) * pageSize + 1;
1510
1724
  const to = Math.min(total, page * pageSize);
1511
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("nav", { className: cx("pire-pagination", className), style, "aria-label": "Pagination", children: [
1512
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("span", { className: "pire-pagination-count", children: [
1513
- from.toLocaleString(),
1514
- "\u2013",
1515
- to.toLocaleString(),
1516
- " of ",
1517
- total.toLocaleString()
1518
- ] }),
1519
- /* @__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)(
1520
1728
  IconButton,
1521
1729
  {
1522
1730
  icon: "chevron-left",
1523
- label: "Previous page",
1731
+ label: msg.paginationPrevious,
1524
1732
  size: "sm",
1525
1733
  variant: "outlined",
1526
1734
  isDisabled: page <= 1,
1527
1735
  onPress: () => onPageChange?.(page - 1)
1528
1736
  }
1529
1737
  ),
1530
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("span", { className: "pire-pagination-count", "aria-live": "polite", children: [
1531
- "Page ",
1532
- page,
1533
- " of ",
1534
- pages
1535
- ] }),
1536
- /* @__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)(
1537
1740
  IconButton,
1538
1741
  {
1539
1742
  icon: "chevron-right",
1540
- label: "Next page",
1743
+ label: msg.paginationNext,
1541
1744
  size: "sm",
1542
1745
  variant: "outlined",
1543
1746
  isDisabled: page >= pages,
1544
1747
  onPress: () => onPageChange?.(page + 1)
1545
1748
  }
1546
1749
  ),
1547
- onPageSizeChange ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1750
+ onPageSizeChange ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
1548
1751
  Select,
1549
1752
  {
1550
- "aria-label": "Rows per page",
1753
+ "aria-label": msg.paginationRowsPerPage,
1551
1754
  size: "sm",
1552
1755
  fullWidth: false,
1553
1756
  value: String(pageSize),
@@ -1559,8 +1762,59 @@ function Pagination({
1559
1762
  ] });
1560
1763
  }
1561
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
+
1562
1816
  // src/components/feedback/InlineMessage.tsx
1563
- var import_jsx_runtime30 = require("react/jsx-runtime");
1817
+ var import_jsx_runtime36 = require("react/jsx-runtime");
1564
1818
  var KIND_ICON = {
1565
1819
  info: "info",
1566
1820
  success: "check-circle-2",
@@ -1568,8 +1822,9 @@ var KIND_ICON = {
1568
1822
  error: "alert-octagon"
1569
1823
  };
1570
1824
  function InlineMessage({ kind = "info", title, action, onClose, children, className, ...rest }) {
1825
+ const msg = usePireMessages();
1571
1826
  const assertive = kind === "error" || kind === "warning";
1572
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(
1827
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(
1573
1828
  "div",
1574
1829
  {
1575
1830
  className: cx("pire-msg", className),
@@ -1578,21 +1833,21 @@ function InlineMessage({ kind = "info", title, action, onClose, children, classN
1578
1833
  "aria-live": assertive ? "assertive" : "polite",
1579
1834
  ...rest,
1580
1835
  children: [
1581
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(Icon, { name: KIND_ICON[kind], size: 16, style: { marginTop: 2 } }),
1582
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { style: { flex: 1, display: "flex", flexDirection: "column", gap: "var(--sp-1)" }, children: [
1583
- title ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: "pire-msg-title", children: title }) : null,
1584
- 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,
1585
1840
  action
1586
1841
  ] }),
1587
- 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
1588
1843
  ]
1589
1844
  }
1590
1845
  );
1591
1846
  }
1592
1847
 
1593
1848
  // src/components/feedback/ProgressBar.tsx
1594
- var import_react_aria_components21 = require("react-aria-components");
1595
- 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");
1596
1851
  function ProgressBar({
1597
1852
  value = 0,
1598
1853
  minValue = 0,
@@ -1605,8 +1860,8 @@ function ProgressBar({
1605
1860
  className,
1606
1861
  style
1607
1862
  }) {
1608
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
1609
- import_react_aria_components21.ProgressBar,
1863
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
1864
+ import_react_aria_components25.ProgressBar,
1610
1865
  {
1611
1866
  className: cx("pire-progress", className),
1612
1867
  "data-status": status,
@@ -1616,20 +1871,20 @@ function ProgressBar({
1616
1871
  maxValue,
1617
1872
  isIndeterminate,
1618
1873
  style,
1619
- children: ({ percentage, valueText }) => /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_jsx_runtime31.Fragment, { children: [
1620
- label || showValue ? /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "pire-progress-head", children: [
1621
- label ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_react_aria_components21.Label, { children: label }) : /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", {}),
1622
- 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
1623
1878
  ] }) : null,
1624
- /* @__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}%` } }) })
1625
1880
  ] })
1626
1881
  }
1627
1882
  );
1628
1883
  }
1629
1884
 
1630
1885
  // src/components/feedback/Toast.tsx
1631
- var React10 = __toESM(require("react"), 1);
1632
- var import_jsx_runtime32 = require("react/jsx-runtime");
1886
+ var React11 = __toESM(require("react"), 1);
1887
+ var import_jsx_runtime38 = require("react/jsx-runtime");
1633
1888
  var KIND_ICON2 = {
1634
1889
  info: "info",
1635
1890
  success: "check-circle-2",
@@ -1637,7 +1892,8 @@ var KIND_ICON2 = {
1637
1892
  error: "alert-octagon"
1638
1893
  };
1639
1894
  function Toast({ kind = "success", onClose, position = "bottom-center", children, className, ...rest }) {
1640
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
1895
+ const msg = usePireMessages();
1896
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(
1641
1897
  "div",
1642
1898
  {
1643
1899
  className: cx("pire-toast", className),
@@ -1646,40 +1902,41 @@ function Toast({ kind = "success", onClose, position = "bottom-center", children
1646
1902
  "aria-live": kind === "error" ? "assertive" : "polite",
1647
1903
  ...rest,
1648
1904
  children: [
1649
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(Icon, { name: KIND_ICON2[kind], size: 16 }),
1650
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("span", { style: { flex: 1 }, children }),
1651
- 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
1652
1908
  ]
1653
1909
  }
1654
1910
  );
1655
1911
  }
1656
- var ToastContext = React10.createContext(null);
1912
+ var ToastContext = React11.createContext(null);
1657
1913
  function ToastProvider({ children, timeout = 6e3 }) {
1658
- const [toasts, setToasts] = React10.useState([]);
1659
- const close = React10.useCallback((id) => setToasts((t) => t.filter((x) => x.id !== id)), []);
1660
- 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) => {
1661
1918
  const id = Math.random().toString(36).slice(2);
1662
1919
  setToasts((t) => [...t, { ...toast, id }]);
1663
1920
  const ms = toast.timeout ?? timeout;
1664
1921
  if (ms > 0) setTimeout(() => close(id), ms);
1665
1922
  return id;
1666
1923
  }, [close, timeout]);
1667
- const value = React10.useMemo(() => ({ add, close }), [add, close]);
1668
- 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: [
1669
1926
  children,
1670
- /* @__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)) })
1671
1928
  ] });
1672
1929
  }
1673
1930
  function useToast() {
1674
- const ctx = React10.useContext(ToastContext);
1931
+ const ctx = React11.useContext(ToastContext);
1675
1932
  if (!ctx) throw new Error("useToast must be used inside <ToastProvider>");
1676
1933
  return ctx;
1677
1934
  }
1678
1935
 
1679
1936
  // src/components/feedback/Skeleton.tsx
1680
- var import_jsx_runtime33 = require("react/jsx-runtime");
1937
+ var import_jsx_runtime39 = require("react/jsx-runtime");
1681
1938
  function Skeleton({ shape = "text", width, height, className, style, ...rest }) {
1682
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1939
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
1683
1940
  "div",
1684
1941
  {
1685
1942
  className: cx("pire-skeleton", className),
@@ -1693,7 +1950,7 @@ function Skeleton({ shape = "text", width, height, className, style, ...rest })
1693
1950
  var BAR_WIDTHS = ["72%", "54%", "86%", "63%"];
1694
1951
  function SkeletonTableRow({ columns, density = "regular", className, style, ...rest }) {
1695
1952
  const cells = typeof columns === "number" ? Array.from({ length: columns }, () => ({})) : columns;
1696
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1953
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
1697
1954
  "div",
1698
1955
  {
1699
1956
  className: cx("pire-skeleton-row", className),
@@ -1705,13 +1962,13 @@ function SkeletonTableRow({ columns, density = "regular", className, style, ...r
1705
1962
  const align = c.numeric ? "right" : c.align ?? "left";
1706
1963
  return (
1707
1964
  // biome-ignore lint/suspicious/noArrayIndexKey: columns are positional and never reordered.
1708
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1965
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
1709
1966
  "div",
1710
1967
  {
1711
1968
  className: "pire-skeleton-cell",
1712
1969
  "data-align": align,
1713
1970
  style: { width: c.width, flex: c.width ? "0 0 auto" : void 0 },
1714
- 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] })
1715
1972
  },
1716
1973
  i
1717
1974
  )
@@ -1722,8 +1979,8 @@ function SkeletonTableRow({ columns, density = "regular", className, style, ...r
1722
1979
  }
1723
1980
 
1724
1981
  // src/components/data/KpiTile.tsx
1725
- var import_react_aria_components22 = require("react-aria-components");
1726
- 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");
1727
1984
  function KpiTile({
1728
1985
  label,
1729
1986
  value,
@@ -1739,50 +1996,50 @@ function KpiTile({
1739
1996
  style
1740
1997
  }) {
1741
1998
  const tone = deltaTone ?? (deltaDirection === "down" ? "negative" : "positive");
1742
- const body = /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_jsx_runtime34.Fragment, { children: [
1743
- /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("span", { className: "pire-kpi-label", children: [
1744
- 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,
1745
2002
  label
1746
2003
  ] }),
1747
- /* @__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: [
1748
2005
  value,
1749
- 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
1750
2007
  ] }),
1751
- delta ? /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("span", { className: "pire-kpi-delta", "data-tone": tone, children: [
1752
- 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,
1753
2010
  delta
1754
2011
  ] }) : null,
1755
- 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
1756
2013
  ] });
1757
2014
  const props = { className: cx("pire-kpi", className), "data-status": status, style };
1758
- 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 });
1759
2016
  }
1760
2017
 
1761
2018
  // src/components/data/ObjectHeader.tsx
1762
- var import_jsx_runtime35 = require("react/jsx-runtime");
2019
+ var import_jsx_runtime41 = require("react/jsx-runtime");
1763
2020
  function ObjectHeader({ title, subtitle, id, breadcrumb, badge, facts, actions, className, ...rest }) {
1764
- 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: [
1765
2022
  breadcrumb,
1766
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { className: "pire-objheader-row", children: [
1767
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)("div", { style: { minWidth: 0 }, children: [
1768
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("h1", { className: "pire-objheader-title", children: title }),
1769
- 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: [
1770
2027
  subtitle,
1771
- 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
1772
2029
  ] }) : null
1773
2030
  ] }),
1774
2031
  badge,
1775
- 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
1776
2033
  ] }),
1777
- 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: [
1778
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("dt", { className: "pire-fact-label", children: fact.label }),
1779
- /* @__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 })
1780
2037
  ] }, fact.label)) }) : null
1781
2038
  ] });
1782
2039
  }
1783
2040
 
1784
2041
  // src/components/data/FilterBar.tsx
1785
- var import_jsx_runtime36 = require("react/jsx-runtime");
2042
+ var import_jsx_runtime42 = require("react/jsx-runtime");
1786
2043
  function FilterBar({
1787
2044
  children,
1788
2045
  activeFilters = [],
@@ -1791,118 +2048,123 @@ function FilterBar({
1791
2048
  onGo,
1792
2049
  resultLabel,
1793
2050
  actions,
2051
+ goLabel,
2052
+ clearAllLabel,
1794
2053
  className,
1795
2054
  ...rest
1796
2055
  }) {
1797
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("section", { className: cx("pire-filterbar", className), "aria-label": "Filters", ...rest, children: [
1798
- /* @__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: [
1799
2061
  children,
1800
- 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
1801
2063
  ] }),
1802
- activeFilters.length || resultLabel || actions ? /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)("div", { className: "pire-filterbar-foot", children: [
1803
- activeFilters.map((filter) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Tag, { onRemove: onRemoveFilter ? () => onRemoveFilter(filter.id) : void 0, children: filter.label }, filter.id)),
1804
- activeFilters.length && onClear ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(Button, { variant: "tertiary", size: "sm", onPress: onClear, children: "Clear all" }) : null,
1805
- resultLabel ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: "pire-filterbar-result", "aria-live": "polite", children: resultLabel }) : null,
1806
- 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
1807
2069
  ] }) : null
1808
2070
  ] });
1809
2071
  }
1810
2072
 
1811
2073
  // src/components/data/DescriptionList.tsx
1812
- var import_jsx_runtime37 = require("react/jsx-runtime");
2074
+ var import_jsx_runtime43 = require("react/jsx-runtime");
1813
2075
  function DescriptionList({ items, layout = "rows", columns = 3, className, style, ...rest }) {
1814
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2076
+ return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
1815
2077
  "dl",
1816
2078
  {
1817
2079
  className: cx("pire-dl", className),
1818
2080
  "data-layout": layout,
1819
2081
  style: { ...layout === "grid" ? { "--pire-dl-cols": columns } : null, ...style },
1820
2082
  ...rest,
1821
- children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: "pire-dl-row", "data-emphasis": item.emphasis ? "true" : void 0, children: [
1822
- /* @__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: [
1823
2085
  item.label,
1824
2086
  item.hint
1825
2087
  ] }),
1826
- /* @__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 })
1827
2089
  ] }, i))
1828
2090
  }
1829
2091
  );
1830
2092
  }
1831
2093
 
1832
2094
  // src/components/data/Timeline.tsx
1833
- var import_jsx_runtime38 = require("react/jsx-runtime");
2095
+ var import_jsx_runtime44 = require("react/jsx-runtime");
1834
2096
  function Timeline({ entries, reverse = false, className, ...rest }) {
1835
2097
  const list = reverse ? [...entries].reverse() : entries;
1836
- 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: [
1837
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "pire-timeline-time", children: entry.time }),
1838
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("span", { className: "pire-timeline-text", children: entry.event }),
1839
- 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
1840
2102
  ] }, entry.id ?? i)) });
1841
2103
  }
1842
2104
 
1843
2105
  // src/components/data/LinkList.tsx
1844
- var import_react_aria_components23 = require("react-aria-components");
1845
- 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");
1846
2108
  function LinkList({ items, onSelect, className, ...rest }) {
1847
- 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: [
1848
- item.icon ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(Icon, { name: item.icon, size: 16, style: { color: "var(--text-secondary)" } }) : null,
1849
- item.key ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { className: "pire-linklist-key", children: item.key }) : null,
1850
- 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,
1851
2113
  item.trailing
1852
2114
  ] }, item.id)) });
1853
2115
  }
1854
2116
 
1855
2117
  // src/components/layout/PageHeader.tsx
1856
- var import_jsx_runtime40 = require("react/jsx-runtime");
2118
+ var import_jsx_runtime46 = require("react/jsx-runtime");
1857
2119
  function PageHeader({ title, subtitle, actions, className, ...rest }) {
1858
- return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("header", { className: cx("pire-pageheader", className), ...rest, children: [
1859
- /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("div", { style: { minWidth: 0 }, children: [
1860
- /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("h1", { className: "pire-pageheader-title", children: title }),
1861
- 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
1862
2124
  ] }),
1863
- 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
1864
2126
  ] });
1865
2127
  }
1866
2128
 
1867
2129
  // src/components/layout/SectionHeader.tsx
1868
- var import_jsx_runtime41 = require("react/jsx-runtime");
2130
+ var import_jsx_runtime47 = require("react/jsx-runtime");
1869
2131
  function SectionHeader({ title, meta, actions, className, ...rest }) {
1870
- return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("div", { className: cx("pire-sectionhead", className), ...rest, children: [
1871
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { className: "pire-eyebrow", children: title }),
1872
- meta ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("span", { style: { font: "var(--type-caption)", color: "var(--text-tertiary)" }, children: meta }) : null,
1873
- 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
1874
2136
  ] });
1875
2137
  }
1876
2138
 
1877
2139
  // src/components/layout/SelectionBar.tsx
1878
- var import_jsx_runtime42 = require("react/jsx-runtime");
2140
+ var import_jsx_runtime48 = require("react/jsx-runtime");
1879
2141
  function SelectionBar({ count, noun = "record", children, actions, className, ...rest }) {
1880
2142
  if (!count) return null;
1881
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: cx("pire-selectionbar", className), role: "status", "aria-live": "polite", ...rest, children: [
1882
- /* @__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: [
1883
2145
  count.toLocaleString(),
1884
2146
  " ",
1885
2147
  noun,
1886
2148
  count === 1 ? "" : "s",
1887
2149
  " selected"
1888
2150
  ] }),
1889
- children ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { style: { color: "var(--text-secondary)", font: "var(--type-caption)" }, children }) : null,
1890
- 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
1891
2153
  ] });
1892
2154
  }
1893
2155
 
1894
2156
  // src/components/layout/FooterBar.tsx
1895
- var import_jsx_runtime43 = require("react/jsx-runtime");
2157
+ var import_jsx_runtime49 = require("react/jsx-runtime");
1896
2158
  function FooterBar({ note, actions, children, className, ...rest }) {
1897
- return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("footer", { className: cx("pire-footerbar", className), ...rest, children: [
1898
- 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,
1899
2161
  children,
1900
- 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
1901
2163
  ] });
1902
2164
  }
1903
2165
 
1904
2166
  // src/components/patterns/ConfirmDialog.tsx
1905
- var import_jsx_runtime44 = require("react/jsx-runtime");
2167
+ var import_jsx_runtime50 = require("react/jsx-runtime");
1906
2168
  function ConfirmDialog({
1907
2169
  isOpen,
1908
2170
  title,
@@ -1916,7 +2178,7 @@ function ConfirmDialog({
1916
2178
  onConfirm,
1917
2179
  onCancel
1918
2180
  }) {
1919
- return /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
2181
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(
1920
2182
  Dialog,
1921
2183
  {
1922
2184
  isOpen,
@@ -1926,12 +2188,12 @@ function ConfirmDialog({
1926
2188
  onClose: onCancel,
1927
2189
  isDismissable: !isBusy,
1928
2190
  showClose: false,
1929
- footer: /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_jsx_runtime44.Fragment, { children: [
1930
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(Button, { variant: "tertiary", isDisabled: isBusy, onPress: onCancel, children: cancelLabel }),
1931
- /* @__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 })
1932
2194
  ] }),
1933
2195
  children: [
1934
- 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,
1935
2197
  children
1936
2198
  ]
1937
2199
  }
@@ -1939,11 +2201,12 @@ function ConfirmDialog({
1939
2201
  }
1940
2202
 
1941
2203
  // src/components/patterns/SidePanel.tsx
1942
- var import_react_aria_components24 = require("react-aria-components");
1943
- 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");
1944
2206
  function SidePanel({ isOpen, title, subtitle, width = 400, children, footer, onClose, className }) {
1945
- return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
1946
- import_react_aria_components24.ModalOverlay,
2207
+ const msg = usePireMessages();
2208
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
2209
+ import_react_aria_components28.ModalOverlay,
1947
2210
  {
1948
2211
  className: "pire-sidepanel-overlay",
1949
2212
  isOpen,
@@ -1951,34 +2214,34 @@ function SidePanel({ isOpen, title, subtitle, width = 400, children, footer, onC
1951
2214
  onOpenChange: (o) => {
1952
2215
  if (!o) onClose?.();
1953
2216
  },
1954
- 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: [
1955
- /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("header", { className: "pire-dialog-head", children: [
1956
- /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { style: { flex: 1, minWidth: 0 }, children: [
1957
- /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_react_aria_components24.Heading, { slot: "title", className: "pire-dialog-title", children: title }),
1958
- 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
1959
2222
  ] }),
1960
- /* @__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 })
1961
2224
  ] }),
1962
- /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "pire-dialog-body", style: { flex: 1 }, children }),
1963
- 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
1964
2227
  ] }) })
1965
2228
  }
1966
2229
  );
1967
2230
  }
1968
2231
 
1969
2232
  // src/components/patterns/EmptyState.tsx
1970
- var import_jsx_runtime46 = require("react/jsx-runtime");
2233
+ var import_jsx_runtime52 = require("react/jsx-runtime");
1971
2234
  function EmptyState({ icon = "file-text", title, action, compact, children, className, ...rest }) {
1972
- return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: cx("pire-empty", className), "data-compact": compact ? "true" : void 0, ...rest, children: [
1973
- /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(Icon, { name: icon, size: 24, className: "pire-empty-icon" }),
1974
- title ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("p", { className: "pire-empty-title", style: { margin: 0 }, children: title }) : null,
1975
- 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,
1976
2239
  action
1977
2240
  ] });
1978
2241
  }
1979
2242
 
1980
2243
  // src/index.ts
1981
- var import_react_aria_components25 = require("react-aria-components");
2244
+ var import_react_aria_components29 = require("react-aria-components");
1982
2245
  // Annotate the CommonJS export names for ESM import in node:
1983
2246
  0 && (module.exports = {
1984
2247
  Avatar,
@@ -1998,25 +2261,31 @@ var import_react_aria_components25 = require("react-aria-components");
1998
2261
  FilterBar,
1999
2262
  FooterBar,
2000
2263
  FormField,
2264
+ Heading,
2001
2265
  I18nProvider,
2002
2266
  Icon,
2003
2267
  IconButton,
2004
2268
  InlineMessage,
2005
2269
  Input,
2006
2270
  KpiTile,
2271
+ Link,
2007
2272
  LinkList,
2008
2273
  Menu,
2009
2274
  MenuItem,
2275
+ MenuSection,
2276
+ MenuSeparator,
2010
2277
  MenuTrigger,
2011
2278
  MultiComboBox,
2012
2279
  NumberField,
2013
2280
  ObjectHeader,
2014
2281
  PageHeader,
2015
2282
  Pagination,
2283
+ PireIntlProvider,
2016
2284
  Popover,
2017
2285
  ProgressBar,
2018
2286
  Radio,
2019
2287
  RadioGroup,
2288
+ RouterProvider,
2020
2289
  SectionHeader,
2021
2290
  SegmentedControl,
2022
2291
  Select,
@@ -2027,9 +2296,12 @@ var import_react_aria_components25 = require("react-aria-components");
2027
2296
  SidePanel,
2028
2297
  Skeleton,
2029
2298
  SkeletonTableRow,
2299
+ Strong,
2300
+ SubmenuTrigger,
2030
2301
  Switch,
2031
2302
  Tabs,
2032
2303
  Tag,
2304
+ Text,
2033
2305
  TextArea,
2034
2306
  Timeline,
2035
2307
  Toast,
@@ -2038,6 +2310,9 @@ var import_react_aria_components25 = require("react-aria-components");
2038
2310
  ValueHelpDialog,
2039
2311
  ValueHelpField,
2040
2312
  configureIcons,
2313
+ enMessages,
2314
+ esMessages,
2315
+ usePireMessages,
2041
2316
  useToast
2042
2317
  });
2043
2318
  //# sourceMappingURL=index.cjs.map