@orianatech/pire 0.2.1 → 0.4.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 (34) hide show
  1. package/README.md +43 -5
  2. package/dist/components/core/Icon.d.cts +22 -7
  3. package/dist/components/core/Icon.d.ts +22 -7
  4. package/dist/components/core/Icon.d.ts.map +1 -1
  5. package/dist/components/core/icon-data.generated.d.cts +1 -0
  6. package/dist/components/core/icon-data.generated.d.ts +2 -0
  7. package/dist/components/core/icon-data.generated.d.ts.map +1 -0
  8. package/dist/components/core/icon-map.d.cts +13 -0
  9. package/dist/components/core/icon-map.d.ts +14 -0
  10. package/dist/components/core/icon-map.d.ts.map +1 -0
  11. package/dist/components/feedback/Skeleton.d.cts +43 -0
  12. package/dist/components/feedback/Skeleton.d.ts +44 -0
  13. package/dist/components/feedback/Skeleton.d.ts.map +1 -0
  14. package/dist/components/forms/MultiComboBox.d.cts +58 -0
  15. package/dist/components/forms/MultiComboBox.d.ts +59 -0
  16. package/dist/components/forms/MultiComboBox.d.ts.map +1 -0
  17. package/dist/components/forms/TextArea.d.cts +42 -0
  18. package/dist/components/forms/TextArea.d.ts +43 -0
  19. package/dist/components/forms/TextArea.d.ts.map +1 -0
  20. package/dist/components/navigation/ShellBar.d.cts +8 -1
  21. package/dist/components/navigation/ShellBar.d.ts +8 -1
  22. package/dist/components/navigation/ShellBar.d.ts.map +1 -1
  23. package/dist/components/navigation/SideNav.d.cts +56 -4
  24. package/dist/components/navigation/SideNav.d.ts +56 -4
  25. package/dist/components/navigation/SideNav.d.ts.map +1 -1
  26. package/dist/components.css +73 -1
  27. package/dist/index.cjs +806 -353
  28. package/dist/index.cjs.map +1 -1
  29. package/dist/index.d.cts +4 -1
  30. package/dist/index.d.ts +4 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +809 -347
  33. package/dist/index.js.map +1 -1
  34. package/package.json +4 -2
package/dist/index.js CHANGED
@@ -1,6 +1,71 @@
1
- // src/components/core/Icon.tsx
2
- import * as React from "react";
3
- import { jsx } from "react/jsx-runtime";
1
+ // src/components/core/icon-data.generated.ts
2
+ var ICON_MARKUP = {
3
+ "add": '<path d="M17 15 17 8 15 8 15 15 8 15 8 17 15 17 15 24 17 24 17 17 24 17 24 15z"/>',
4
+ "apps": '<path d="M8,4V8H4V4Zm2-2H2v8h8Zm8,2V8H14V4Zm2-2H12v8h8Zm8,2V8H24V4Zm2-2H22v8h8ZM8,14v4H4V14Zm2-2H2v8h8Zm8,2v4H14V14Zm2-2H12v8h8Zm8,2v4H24V14Zm2-2H22v8h8ZM8,24v4H4V24Zm2-2H2v8h8Zm8,2v4H14V24Zm2-2H12v8h8Zm8,2v4H24V24Zm2-2H22v8h8Z"/>',
5
+ "arrow--down": '<path d="M24.59 16.59 17 24.17 17 4 15 4 15 24.17 7.41 16.59 6 18 16 28 26 18 24.59 16.59z"/>',
6
+ "arrow--right": '<path d="M18 6 16.57 7.393 24.15 15 4 15 4 17 24.15 17 16.57 24.573 18 26 28 16 18 6z"/>',
7
+ "arrow--up": '<path d="M16 4 6 14 7.41 15.41 15 7.83 15 28 17 28 17 7.83 24.59 15.41 26 14 16 4z"/>',
8
+ "arrows--vertical": '<path d="M27.6 20.6 24 24.2 24 4 22 4 22 24.2 18.4 20.6 17 22 23 28 29 22z"/><path d="M9 4 3 10 4.4 11.4 8 7.8 8 28 10 28 10 7.8 13.6 11.4 15 10z"/>',
9
+ "attachment": '<path d="M28.1,18.9L13.1,3.9c-2.5-2.6-6.6-2.6-9.2-0.1S1.3,10.5,3.9,13c0,0,0.1,0.1,0.1,0.1L6.8,16l1.4-1.4l-2.9-2.9 C3.6,10,3.6,7.1,5.3,5.4s4.6-1.8,6.3-0.1c0,0,0,0,0.1,0.1l14.9,14.9c1.8,1.7,1.8,4.6,0.1,6.3c-1.7,1.8-4.6,1.8-6.3,0.1 c0,0,0,0-0.1-0.1l-7.4-7.4c-1-1-0.9-2.6,0-3.5c1-0.9,2.5-0.9,3.5,0l4.1,4.1l1.4-1.4c0,0-4.2-4.2-4.2-4.2c-1.8-1.7-4.6-1.6-6.3,0.2 c-1.6,1.7-1.6,4.4,0,6.2l7.5,7.5c2.5,2.6,6.6,2.6,9.2,0.1S30.7,21.5,28.1,18.9C28.1,19,28.1,18.9,28.1,18.9L28.1,18.9z"/>',
10
+ "box": '<path d="M20,21H12a2,2,0,0,1-2-2V17a2,2,0,0,1,2-2h8a2,2,0,0,1,2,2v2A2,2,0,0,1,20,21Zm-8-4v2h8V17Z"/><path d="M28,4H4A2,2,0,0,0,2,6v4a2,2,0,0,0,2,2V28a2,2,0,0,0,2,2H26a2,2,0,0,0,2-2V12a2,2,0,0,0,2-2V6A2,2,0,0,0,28,4ZM26,28H6V12H26Zm2-18H4V6H28v4Z"/>',
11
+ "building": '<path d="M28,2H16a2.002,2.002,0,0,0-2,2V14H4a2.002,2.002,0,0,0-2,2V30H30V4A2.0023,2.0023,0,0,0,28,2ZM9,28V21h4v7Zm19,0H15V20a1,1,0,0,0-1-1H8a1,1,0,0,0-1,1v8H4V16H16V4H28Z"/><path d="M18 8H20V10H18z"/><path d="M24 8H26V10H24z"/><path d="M18 14H20V16H18z"/><path d="M24 14H26V16H24z"/><path d="M18 20H20V22H18z"/><path d="M24 20H26V22H24z"/>',
12
+ "building--insights-1": '<path d="M28,2H16a2.002,2.002,0,0,0-2,2V14H4a2.002,2.002,0,0,0-2,2V30H30V4A2.0023,2.0023,0,0,0,28,2ZM9,28V21h4v7Zm19,0H15V20a1,1,0,0,0-1-1H8a1,1,0,0,0-1,1v8H4V16H16V4H28Z"/><path d="M18 8H20V10H18z"/><path d="M24 8H26V10H24z"/><path d="M18 14H20V16H18z"/><path d="M24 14H26V16H24z"/><path d="M18 20H20V22H18z"/><path d="M24 20H26V22H24z"/><path d="M9,12H7a5.0059,5.0059,0,0,1,5-5V9A3.0033,3.0033,0,0,0,9,12Z"/><path d="M4,12H2A10.0114,10.0114,0,0,1,12,2V4A8.0092,8.0092,0,0,0,4,12Z"/>',
13
+ "calculator": '<path d="M26,4V28H6V4H26m0-2H6A2,2,0,0,0,4,4V28a2,2,0,0,0,2,2H26a2,2,0,0,0,2-2V4A2,2,0,0,0,26,2Z"/><path d="M9 23H11V25H9z"/><path d="M21 23H23V25H21z"/><path d="M9 18H11V20H9z"/><path d="M21 18H23V20H21z"/><path d="M9 13H11V15H9z"/><path d="M15 23H17V25H15z"/><path d="M15 18H17V20H15z"/><path d="M15 13H17V15H15z"/><path d="M21 13H23V15H21z"/><path d="M9 7H23V10H9z"/>',
14
+ "calendar": '<path d="M26,4h-4V2h-2v2h-8V2h-2v2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h20c1.1,0,2-0.9,2-2V6C28,4.9,27.1,4,26,4z M26,26H6V12h20 V26z M26,10H6V6h4v2h2V6h8v2h2V6h4V10z"/>',
15
+ "checkmark": '<path d="M13 24 4 15 5.414 13.586 13 21.171 26.586 7.586 28 9 13 24z"/>',
16
+ "checkmark--filled": '<path d="M16,2A14,14,0,1,0,30,16,14,14,0,0,0,16,2ZM14,21.5908l-5-5L10.5906,15,14,18.4092,21.41,11l1.5957,1.5859Z"/><path fill="none" d="M14 21.591 9 16.591 10.591 15 14 18.409 21.41 11 23.005 12.585 14 21.591z" data-icon-path="inner-path"/>',
17
+ "checkmark--outline": '<path d="M14 21.414 9 16.413 10.413 15 14 18.586 21.585 11 23 12.415 14 21.414z"/><path d="M16,2A14,14,0,1,0,30,16,14,14,0,0,0,16,2Zm0,26A12,12,0,1,1,28,16,12,12,0,0,1,16,28Z"/>',
18
+ "chevron--down": '<path d="M16 22 6 12 7.4 10.6 16 19.2 24.6 10.6 26 12z"/>',
19
+ "chevron--left": '<path d="M10 16 20 6 21.4 7.4 12.8 16 21.4 24.6 20 26z"/>',
20
+ "chevron--right": '<path d="M22 16 12 26 10.6 24.6 19.2 16 10.6 7.4 12 6z"/>',
21
+ "chevron--sort": '<path d="M16 28 9 21 10.41 19.59 16 25.17 21.59 19.59 23 21 16 28z"/><path d="M16 4 23 11 21.59 12.41 16 6.83 10.41 12.41 9 11 16 4z"/>',
22
+ "circle-dash": '<path d="M7.7,4.7a14.7,14.7,0,0,0-3,3.1L6.3,9A13.26,13.26,0,0,1,8.9,6.3Z"/><path d="M4.6,12.3l-1.9-.6A12.51,12.51,0,0,0,2,16H4A11.48,11.48,0,0,1,4.6,12.3Z"/><path d="M2.7,20.4a14.4,14.4,0,0,0,2,3.9l1.6-1.2a12.89,12.89,0,0,1-1.7-3.3Z"/><path d="M7.8,27.3a14.4,14.4,0,0,0,3.9,2l.6-1.9A12.89,12.89,0,0,1,9,25.7Z"/><path d="M11.7,2.7l.6,1.9A11.48,11.48,0,0,1,16,4V2A12.51,12.51,0,0,0,11.7,2.7Z"/><path d="M24.2,27.3a15.18,15.18,0,0,0,3.1-3.1L25.7,23A11.53,11.53,0,0,1,23,25.7Z"/><path d="M27.4,19.7l1.9.6A15.47,15.47,0,0,0,30,16H28A11.48,11.48,0,0,1,27.4,19.7Z"/><path d="M29.2,11.6a14.4,14.4,0,0,0-2-3.9L25.6,8.9a12.89,12.89,0,0,1,1.7,3.3Z"/><path d="M24.1,4.6a14.4,14.4,0,0,0-3.9-2l-.6,1.9a12.89,12.89,0,0,1,3.3,1.7Z"/><path d="M20.3,29.3l-.6-1.9A11.48,11.48,0,0,1,16,28v2A21.42,21.42,0,0,0,20.3,29.3Z"/>',
23
+ "close": '<path d="M17.4141 16 24 9.4141 22.5859 8 16 14.5859 9.4143 8 8 9.4141 14.5859 16 8 22.5859 9.4143 24 16 17.4141 22.5859 24 24 22.5859 17.4141 16z"/>',
24
+ "color-palette": '<circle cx="10" cy="12" r="2"/><circle cx="16" cy="9" r="2"/><circle cx="22" cy="12" r="2"/><circle cx="23" cy="18" r="2"/><circle cx="19" cy="23" r="2"/><path d="M16.54,2A14,14,0,0,0,2,16a4.82,4.82,0,0,0,6.09,4.65l1.12-.31A3,3,0,0,1,13,23.24V27a3,3,0,0,0,3,3A14,14,0,0,0,30,15.46,14.05,14.05,0,0,0,16.54,2Zm8.11,22.31A11.93,11.93,0,0,1,16,28a1,1,0,0,1-1-1V23.24a5,5,0,0,0-5-5,5.07,5.07,0,0,0-1.33.18l-1.12.31A2.82,2.82,0,0,1,4,16,12,12,0,0,1,16.47,4,12.18,12.18,0,0,1,28,15.53,11.89,11.89,0,0,1,24.65,24.32Z"/>',
25
+ "copy": '<path d="M28,10V28H10V10H28m0-2H10a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2Z"/><path d="M4,18H2V4A2,2,0,0,1,4,2H18V4H4Z"/>',
26
+ "delivery-truck": '<path d="M29.92,16.61l-3-7A1,1,0,0,0,26,9H23V7a1,1,0,0,0-1-1H3A1,1,0,0,0,2,7V24a1,1,0,0,0,1,1H5.14a4,4,0,0,0,7.72,0h6.28a4,4,0,0,0,7.72,0H29a1,1,0,0,0,1-1V17A1,1,0,0,0,29.92,16.61ZM23,11h2.34l2.14,5H23ZM9,26a2,2,0,1,1,2-2A2,2,0,0,1,9,26Zm10.14-3H12.86a4,4,0,0,0-7.72,0H4V8H21V20.56A4,4,0,0,0,19.14,23ZM23,26a2,2,0,1,1,2-2A2,2,0,0,1,23,26Zm5-3H26.86A4,4,0,0,0,23,20V18h5Z"/>',
27
+ "document": '<path d="M25.7,9.3l-7-7C18.5,2.1,18.3,2,18,2H8C6.9,2,6,2.9,6,4v24c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V10C26,9.7,25.9,9.5,25.7,9.3 z M18,4.4l5.6,5.6H18V4.4z M24,28H8V4h8v6c0,1.1,0.9,2,2,2h6V28z"/><path d="M10 22H22V24H10z"/><path d="M10 16H22V18H10z"/>',
28
+ "download": '<path d="M26,24v4H6V24H4v4H4a2,2,0,0,0,2,2H26a2,2,0,0,0,2-2h0V24Z"/><path d="M26 14 24.59 12.59 17 20.17 17 2 15 2 15 20.17 7.41 12.59 6 14 16 24 26 14z"/>',
29
+ "edit": '<path d="M2 26H30V28H2z"/><path d="M25.4,9c0.8-0.8,0.8-2,0-2.8c0,0,0,0,0,0l-3.6-3.6c-0.8-0.8-2-0.8-2.8,0c0,0,0,0,0,0l-15,15V24h6.4L25.4,9z M20.4,4L24,7.6 l-3,3L17.4,7L20.4,4z M6,22v-3.6l10-10l3.6,3.6l-10,10H6z"/>',
30
+ "error--filled": '<path fill="none" d="M14.9 7.2H17.1V24.799H14.9z" data-icon-path="inner-path" transform="rotate(-45 16 16)"/><path d="M16,2A13.914,13.914,0,0,0,2,16,13.914,13.914,0,0,0,16,30,13.914,13.914,0,0,0,30,16,13.914,13.914,0,0,0,16,2Zm5.4449,21L9,10.5557,10.5557,9,23,21.4448Z"/>',
31
+ "filter": '<path d="M18,28H14a2,2,0,0,1-2-2V18.41L4.59,11A2,2,0,0,1,4,9.59V6A2,2,0,0,1,6,4H26a2,2,0,0,1,2,2V9.59A2,2,0,0,1,27.41,11L20,18.41V26A2,2,0,0,1,18,28ZM6,6V9.59l8,8V26h4V17.59l8-8V6Z"/>',
32
+ "flash": '<path d="M11.61,29.92a1,1,0,0,1-.6-1.07L12.83,17H8a1,1,0,0,1-1-1.23l3-13A1,1,0,0,1,11,2H21a1,1,0,0,1,.78.37,1,1,0,0,1,.2.85L20.25,11H25a1,1,0,0,1,.9.56,1,1,0,0,1-.11,1l-13,17A1,1,0,0,1,12,30,1.09,1.09,0,0,1,11.61,29.92ZM17.75,13l2-9H11.8L9.26,15h5.91L13.58,25.28,23,13Z"/>',
33
+ "grid": '<path d="M12,4H6A2,2,0,0,0,4,6v6a2,2,0,0,0,2,2h6a2,2,0,0,0,2-2V6A2,2,0,0,0,12,4Zm0,8H6V6h6Z"/><path d="M26,4H20a2,2,0,0,0-2,2v6a2,2,0,0,0,2,2h6a2,2,0,0,0,2-2V6A2,2,0,0,0,26,4Zm0,8H20V6h6Z"/><path d="M12,18H6a2,2,0,0,0-2,2v6a2,2,0,0,0,2,2h6a2,2,0,0,0,2-2V20A2,2,0,0,0,12,18Zm0,8H6V20h6Z"/><path d="M26,18H20a2,2,0,0,0-2,2v6a2,2,0,0,0,2,2h6a2,2,0,0,0,2-2V20A2,2,0,0,0,26,18Zm0,8H20V20h6Z"/>',
34
+ "hashtag": '<path d="M28,12V10H22V4H20v6H12V4H10v6H4v2h6v8H4v2h6v6h2V22h8v6h2V22h6V20H22V12Zm-8,8H12V12h8Z"/>',
35
+ "help": '<path d="M16,2A14,14,0,1,0,30,16,14,14,0,0,0,16,2Zm0,26A12,12,0,1,1,28,16,12,12,0,0,1,16,28Z"/><circle cx="16" cy="23.5" r="1.5"/><path d="M17,8H15.5A4.49,4.49,0,0,0,11,12.5V13h2v-.5A2.5,2.5,0,0,1,15.5,10H17a2.5,2.5,0,0,1,0,5H15v4.5h2V17a4.5,4.5,0,0,0,0-9Z"/>',
36
+ "home": '<path d="M16.6123,2.2138a1.01,1.01,0,0,0-1.2427,0L1,13.4194l1.2427,1.5717L4,13.6209V26a2.0041,2.0041,0,0,0,2,2H26a2.0037,2.0037,0,0,0,2-2V13.63L29.7573,15,31,13.4282ZM18,26H14V18h4Zm2,0V18a2.0023,2.0023,0,0,0-2-2H14a2.002,2.002,0,0,0-2,2v8H6V12.0615l10-7.79,10,7.8005V26Z"/>',
37
+ "information": '<path d="M17 22 17 14 13 14 13 16 15 16 15 22 12 22 12 24 20 24 20 22 17 22z"/><path d="M16,8a1.5,1.5,0,1,0,1.5,1.5A1.5,1.5,0,0,0,16,8Z"/><path d="M16,30A14,14,0,1,1,30,16,14,14,0,0,1,16,30ZM16,4A12,12,0,1,0,28,16,12,12,0,0,0,16,4Z"/>',
38
+ "launch": '<path d="M26,28H6a2.0027,2.0027,0,0,1-2-2V6A2.0027,2.0027,0,0,1,6,4H16V6H6V26H26V16h2V26A2.0027,2.0027,0,0,1,26,28Z"/><path d="M20 2 20 4 26.586 4 18 12.586 19.414 14 28 5.414 28 12 30 12 30 2 20 2z"/>',
39
+ "layers": '<path d="M16,24a.9967.9967,0,0,1-.4741-.12l-13-7L3.4741,15.12,16,21.8643,28.5259,15.12l.9482,1.7607-13,7A.9967.9967,0,0,1,16,24Z"/><path d="M16,30a.9967.9967,0,0,1-.4741-.12l-13-7L3.4741,21.12,16,27.8643,28.5259,21.12l.9482,1.7607-13,7A.9967.9967,0,0,1,16,30Z"/><path d="M16,18a.9967.9967,0,0,1-.4741-.12l-13-7a1,1,0,0,1,0-1.7607l13-7a.9982.9982,0,0,1,.9482,0l13,7a1,1,0,0,1,0,1.7607l-13,7A.9967.9967,0,0,1,16,18ZM5.1094,10,16,15.8643,26.8906,10,16,4.1358Z"/>',
40
+ "list": '<path d="M10 6H28V8H10z"/><path d="M10 24H28V26H10z"/><path d="M10 15H28V17H10z"/><path d="M4 15H6V17H4z"/><path d="M4 6H6V8H4z"/><path d="M4 24H6V26H4z"/>',
41
+ "list--boxes": '<path d="M16 8H30V10H16z"/><path d="M16 22H30V24H16z"/><path d="M10,14H4a2.0023,2.0023,0,0,1-2-2V6A2.0023,2.0023,0,0,1,4,4h6a2.0023,2.0023,0,0,1,2,2v6A2.0023,2.0023,0,0,1,10,14ZM4,6v6h6.0012L10,6Z"/><path d="M10,28H4a2.0023,2.0023,0,0,1-2-2V20a2.0023,2.0023,0,0,1,2-2h6a2.0023,2.0023,0,0,1,2,2v6A2.0023,2.0023,0,0,1,10,28ZM4,20v6h6.0012L10,20Z"/>',
42
+ "list--checked": '<path d="M16 22H30V24H16z"/><path d="M14 19.4 12.6 18 6 24.6 3.4 22 2 23.4 6 27.4z"/><path d="M16 8H30V10H16z"/><path d="M14 5.4 12.6 4 6 10.6 3.4 8 2 9.4 6 13.4z"/>',
43
+ "location": '<path d="M16,18a5,5,0,1,1,5-5A5.0057,5.0057,0,0,1,16,18Zm0-8a3,3,0,1,0,3,3A3.0033,3.0033,0,0,0,16,10Z"/><path d="M16,30,7.5645,20.0513c-.0479-.0571-.3482-.4515-.3482-.4515A10.8888,10.8888,0,0,1,5,13a11,11,0,0,1,22,0,10.8844,10.8844,0,0,1-2.2148,6.5973l-.0015.0025s-.3.3944-.3447.4474ZM8.8125,18.395c.001.0007.2334.3082.2866.3744L16,26.9079l6.91-8.15c.0439-.0552.2783-.3649.2788-.3657A8.901,8.901,0,0,0,25,13,9,9,0,1,0,7,13a8.9054,8.9054,0,0,0,1.8125,5.395Z"/>',
44
+ "locked": '<path d="M24,14H22V8A6,6,0,0,0,10,8v6H8a2,2,0,0,0-2,2V28a2,2,0,0,0,2,2H24a2,2,0,0,0,2-2V16A2,2,0,0,0,24,14ZM12,8a4,4,0,0,1,8,0v6H12ZM24,28H8V16H24Z"/>',
45
+ "menu": '<path d="M4 6H28V8H4z"/><path d="M4 24H28V26H4z"/><path d="M4 12H28V14H4z"/><path d="M4 18H28V20H4z"/>',
46
+ "minimize": '<path d="M4 18 4 20 10.586 20 2 28.582 3.414 30 12 21.414 12 28 14 28 14 18 4 18z"/><path d="M30 3.416 28.592 2 20 10.586 20 4 18 4 18 14 28 14 28 12 21.414 12 30 3.416z"/>',
47
+ "misuse": '<path d="M16,2C8.3,2,2,8.3,2,16s6.3,14,14,14s14-6.3,14-14S23.7,2,16,2z M21.4,23L16,17.6L10.6,23L9,21.4l5.4-5.4L9,10.6L10.6,9 l5.4,5.4L21.4,9l1.6,1.6L17.6,16l5.4,5.4L21.4,23z"/><path fill="none" d="M21.4,23L16,17.6L10.6,23L9,21.4l5.4-5.4L9,10.6L10.6,9l5.4,5.4L21.4,9l1.6,1.6L17.6,16 l5.4,5.4L21.4,23z" data-icon-path="inner-path" opacity="0"/>',
48
+ "notification": '<path d="M28.7071,19.293,26,16.5859V13a10.0136,10.0136,0,0,0-9-9.9492V1H15V3.0508A10.0136,10.0136,0,0,0,6,13v3.5859L3.2929,19.293A1,1,0,0,0,3,20v3a1,1,0,0,0,1,1h7v.7768a5.152,5.152,0,0,0,4.5,5.1987A5.0057,5.0057,0,0,0,21,25V24h7a1,1,0,0,0,1-1V20A1,1,0,0,0,28.7071,19.293ZM19,25a3,3,0,0,1-6,0V24h6Zm8-3H5V20.4141L7.707,17.707A1,1,0,0,0,8,17V13a8,8,0,0,1,16,0v4a1,1,0,0,0,.293.707L27,20.4141Z"/>',
49
+ "overflow-menu--vertical": '<circle cx="16" cy="8" r="2"/><circle cx="16" cy="16" r="2"/><circle cx="16" cy="24" r="2"/>',
50
+ "printer": '<path d="M28,9H25V3H7V9H4a2,2,0,0,0-2,2V21a2,2,0,0,0,2,2H7v6H25V23h3a2,2,0,0,0,2-2V11A2,2,0,0,0,28,9ZM9,5H23V9H9ZM23,27H9V17H23Zm5-6H25V15H7v6H4V11H28Z"/>',
51
+ "qr-code": '<path d="M24 26H26V28H24z" transform="rotate(-90 25 27)"/><path d="M18 22H20V24H18z" transform="rotate(-90 19 23)"/><path d="M18 30 22 30 22 28 20 28 20 26 18 26 18 30z"/><path d="M25 23H29V25H25z" transform="rotate(-90 27 24)"/><path d="M28 26 30 26 30 30 26 30 26 28 28 28 28 26z"/><path d="M26 20 26 18 30 18 30 22 28 22 28 20 26 20z"/><path d="M24 20 22 20 22 24 20 24 20 26 24 26 24 20z"/><path d="M19 17H21V21H19z" transform="rotate(-90 20 19)"/><path d="M6 22H10V26H6z"/><path d="M14,30H2V18H14ZM4,28h8V20H4Z"/><path d="M22 6H26V10H22z"/><path d="M30,14H18V2H30ZM20,12h8V4H20Z"/><path d="M6 6H10V10H6z"/><path d="M14,14H2V2H14ZM4,12h8V4H4Z"/>',
52
+ "recently-viewed": '<path d="M20.59 22 15 16.41 15 7 17 7 17 15.58 22 20.59 20.59 22z"/><path d="M16,2A13.94,13.94,0,0,0,6,6.23V2H4v8h8V8H7.08A12,12,0,1,1,4,16H2A14,14,0,1,0,16,2Z"/>',
53
+ "renew": '<path d="M12,10H6.78A11,11,0,0,1,27,16h2A13,13,0,0,0,6,7.68V4H4v8h8Z"/><path d="M20,22h5.22A11,11,0,0,1,5,16H3a13,13,0,0,0,23,8.32V28h2V20H20Z"/>',
54
+ "search": '<path d="M29,27.5859l-7.5521-7.5521a11.0177,11.0177,0,1,0-1.4141,1.4141L27.5859,29ZM4,13a9,9,0,1,1,9,9A9.01,9.01,0,0,1,4,13Z"/>',
55
+ "settings": '<path d="M27,16.76c0-.25,0-.5,0-.76s0-.51,0-.77l1.92-1.68A2,2,0,0,0,29.3,11L26.94,7a2,2,0,0,0-1.73-1,2,2,0,0,0-.64.1l-2.43.82a11.35,11.35,0,0,0-1.31-.75l-.51-2.52a2,2,0,0,0-2-1.61H13.64a2,2,0,0,0-2,1.61l-.51,2.52a11.48,11.48,0,0,0-1.32.75L7.43,6.06A2,2,0,0,0,6.79,6,2,2,0,0,0,5.06,7L2.7,11a2,2,0,0,0,.41,2.51L5,15.24c0,.25,0,.5,0,.76s0,.51,0,.77L3.11,18.45A2,2,0,0,0,2.7,21L5.06,25a2,2,0,0,0,1.73,1,2,2,0,0,0,.64-.1l2.43-.82a11.35,11.35,0,0,0,1.31.75l.51,2.52a2,2,0,0,0,2,1.61h4.72a2,2,0,0,0,2-1.61l.51-2.52a11.48,11.48,0,0,0,1.32-.75l2.42.82a2,2,0,0,0,.64.1,2,2,0,0,0,1.73-1L29.3,21a2,2,0,0,0-.41-2.51ZM25.21,24l-3.43-1.16a8.86,8.86,0,0,1-2.71,1.57L18.36,28H13.64l-.71-3.55a9.36,9.36,0,0,1-2.7-1.57L6.79,24,4.43,20l2.72-2.4a8.9,8.9,0,0,1,0-3.13L4.43,12,6.79,8l3.43,1.16a8.86,8.86,0,0,1,2.71-1.57L13.64,4h4.72l.71,3.55a9.36,9.36,0,0,1,2.7,1.57L25.21,8,27.57,12l-2.72,2.4a8.9,8.9,0,0,1,0,3.13L27.57,20Z"/><path d="M16,22a6,6,0,1,1,6-6A5.94,5.94,0,0,1,16,22Zm0-10a3.91,3.91,0,0,0-4,4,3.91,3.91,0,0,0,4,4,3.91,3.91,0,0,0,4-4A3.91,3.91,0,0,0,16,12Z"/>',
56
+ "settings--adjust": '<path d="M30,8h-4.1c-0.5-2.3-2.5-4-4.9-4s-4.4,1.7-4.9,4H2v2h14.1c0.5,2.3,2.5,4,4.9,4s4.4-1.7,4.9-4H30V8z M21,12c-1.7,0-3-1.3-3-3 s1.3-3,3-3s3,1.3,3,3S22.7,12,21,12z"/><path d="M2,24h4.1c0.5,2.3,2.5,4,4.9,4s4.4-1.7,4.9-4H30v-2H15.9c-0.5-2.3-2.5-4-4.9-4s-4.4,1.7-4.9,4H2V24z M11,20c1.7,0,3,1.3,3,3 s-1.3,3-3,3s-3-1.3-3-3S9.3,20,11,20z"/>',
57
+ "shopping--cart": '<circle cx="10" cy="28" r="2"/><circle cx="24" cy="28" r="2"/><path d="M28,7H5.82L5,2.8A1,1,0,0,0,4,2H0V4H3.18L7,23.2A1,1,0,0,0,8,24H26V22H8.82L8,18H26a1,1,0,0,0,1-.78l2-9A1,1,0,0,0,28,7Zm-2.8,9H7.62L6.22,9H26.75Z"/>',
58
+ "subtract": '<path d="M8 15H24V17H8z"/>',
59
+ "text--font": '<path d="M25,12H20v2h5a1.0008,1.0008,0,0,1,1,1v2H22a3.0033,3.0033,0,0,0-3,3v1a3.0033,3.0033,0,0,0,3,3h6V15A3.0033,3.0033,0,0,0,25,12ZM22,22a1.0008,1.0008,0,0,1-1-1V20a1.0008,1.0008,0,0,1,1-1h4v3Z"/><path d="M16,24h2L12,7H10L4,24H6l1.6936-5h6.6135ZM8.3711,17l2.4966-7.3711.2668.0005L13.63,17Z"/>',
60
+ "time": '<path d="M16,30A14,14,0,1,1,30,16,14,14,0,0,1,16,30ZM16,4A12,12,0,1,0,28,16,12,12,0,0,0,16,4Z"/><path d="M20.59 22 15 16.41 15 7 17 7 17 15.58 22 20.59 20.59 22z"/>',
61
+ "trash-can": '<path d="M12 12H14V24H12z"/><path d="M18 12H20V24H18z"/><path d="M4,6V8H6V28a2,2,0,0,0,2,2H24a2,2,0,0,0,2-2V8h2V6ZM8,28V8H24V28Z"/><path d="M12 2H20V4H12z"/>',
62
+ "user": '<path d="M16,4a5,5,0,1,1-5,5,5,5,0,0,1,5-5m0-2a7,7,0,1,0,7,7A7,7,0,0,0,16,2Z"/><path d="M26,30H24V25a5,5,0,0,0-5-5H13a5,5,0,0,0-5,5v5H6V25a7,7,0,0,1,7-7h6a7,7,0,0,1,7,7Z"/>',
63
+ "view": '<path d="M30.94,15.66A16.69,16.69,0,0,0,16,5,16.69,16.69,0,0,0,1.06,15.66a1,1,0,0,0,0,.68A16.69,16.69,0,0,0,16,27,16.69,16.69,0,0,0,30.94,16.34,1,1,0,0,0,30.94,15.66ZM16,25c-5.3,0-10.9-3.93-12.93-9C5.1,10.93,10.7,7,16,7s10.9,3.93,12.93,9C26.9,21.07,21.3,25,16,25Z"/><path d="M16,10a6,6,0,1,0,6,6A6,6,0,0,0,16,10Zm0,10a4,4,0,1,1,4-4A4,4,0,0,1,16,20Z"/>',
64
+ "warning--alt": '<path d="M16,23a1.5,1.5,0,1,0,1.5,1.5A1.5,1.5,0,0,0,16,23Z"/><path d="M15 12H17V21H15z"/><path d="M29,30H3a1,1,0,0,1-.8872-1.4614l13-25a1,1,0,0,1,1.7744,0l13,25A1,1,0,0,1,29,30ZM4.6507,28H27.3493l.002-.0033L16.002,6.1714h-.004L4.6487,27.9967Z"/>',
65
+ "warning--filled": '<path d="M16,2C8.3,2,2,8.3,2,16s6.3,14,14,14s14-6.3,14-14C30,8.3,23.7,2,16,2z M14.9,8h2.2v11h-2.2V8z M16,25 c-0.8,0-1.5-0.7-1.5-1.5S15.2,22,16,22c0.8,0,1.5,0.7,1.5,1.5S16.8,25,16,25z"/><path fill="none" d="M17.5,23.5c0,0.8-0.7,1.5-1.5,1.5c-0.8,0-1.5-0.7-1.5-1.5S15.2,22,16,22 C16.8,22,17.5,22.7,17.5,23.5z M17.1,8h-2.2v11h2.2V8z" data-icon-path="inner-path" opacity="0"/>'
66
+ };
67
+
68
+ // src/components/core/icon-map.ts
4
69
  var CARBON_MAP = {
5
70
  "menu": "menu",
6
71
  "search": "search",
@@ -70,21 +135,49 @@ var CARBON_MAP = {
70
135
  "eye": "view",
71
136
  "minimize-2": "minimize"
72
137
  };
73
- var PACKS = {
74
- carbon: { base: "https://cdn.jsdelivr.net/npm/@carbon/icons@11/svg/32/", map: CARBON_MAP },
75
- lucide: { base: "https://cdn.jsdelivr.net/npm/lucide-static/icons/", map: null }
76
- };
138
+
139
+ // src/components/core/Icon.tsx
140
+ import { jsx } from "react/jsx-runtime";
141
+ var IS_DEV = process.env.NODE_ENV !== "production";
142
+ var warned = /* @__PURE__ */ new Set();
143
+ function warnOnce(key, message) {
144
+ if (warned.has(key)) return;
145
+ warned.add(key);
146
+ console.warn(`[pire] ${message}`);
147
+ }
77
148
  var config = {};
78
149
  function configureIcons(next) {
79
150
  config = { ...config, ...next };
151
+ if (!IS_DEV) return;
152
+ if (next.base !== void 0) {
153
+ warnOnce(
154
+ "config:base",
155
+ "configureIcons({ base }) is ignored: glyphs are inlined in the bundle and no longer fetched over the network. Remove the call, and the self-hosted SVGs it pointed at."
156
+ );
157
+ }
158
+ if (next.pack !== void 0) {
159
+ warnOnce(
160
+ "config:pack",
161
+ "configureIcons({ pack }) is ignored: the bundled Carbon pack is the only pack. Use configureIcons({ resolve }) to supply a glyph Pire does not ship."
162
+ );
163
+ }
80
164
  }
81
165
  function Icon({ name, size = 16, label, pack, style, ...rest }) {
82
- const cfg = PACKS[pack ?? config.pack ?? "carbon"] ?? PACKS.lucide;
83
- const slug = cfg.map ? cfg.map[name] ?? name : name;
84
- const url = `${config.base ?? cfg.base}${slug}.svg`;
85
- const [failed, setFailed] = React.useState(false);
86
- React.useEffect(() => setFailed(false), [url]);
87
- const mask = `url("${url}") center / ${size}px ${size}px no-repeat`;
166
+ const markup = config.resolve?.(name) ?? ICON_MARKUP[CARBON_MAP[name] ?? name];
167
+ if (IS_DEV) {
168
+ if (pack !== void 0) {
169
+ warnOnce(
170
+ "prop:pack",
171
+ "The Icon `pack` prop is ignored: the bundled Carbon pack is the only pack. Drop the prop."
172
+ );
173
+ }
174
+ if (markup === void 0) {
175
+ warnOnce(
176
+ `missing:${name}`,
177
+ `Unknown icon name "${name}" \u2014 nothing will render. Add it to CARBON_MAP in src/components/core/icon-map.ts and rebuild, or register it with configureIcons({ resolve }).`
178
+ );
179
+ }
180
+ }
88
181
  return /* @__PURE__ */ jsx(
89
182
  "span",
90
183
  {
@@ -93,26 +186,18 @@ function Icon({ name, size = 16, label, pack, style, ...rest }) {
93
186
  "aria-hidden": label ? void 0 : true,
94
187
  "data-icon": name,
95
188
  ...rest,
96
- style: {
97
- position: "relative",
98
- display: "inline-block",
99
- flex: "0 0 auto",
100
- width: size,
101
- height: size,
102
- backgroundColor: failed ? "transparent" : "currentColor",
103
- WebkitMaskImage: failed ? void 0 : `url("${url}")`,
104
- WebkitMask: failed ? void 0 : mask,
105
- mask: failed ? void 0 : mask,
106
- ...style
107
- },
108
- children: /* @__PURE__ */ jsx(
109
- "img",
189
+ style: { display: "inline-block", flex: "0 0 auto", width: size, height: size, ...style },
190
+ children: markup === void 0 ? null : /* @__PURE__ */ jsx(
191
+ "svg",
110
192
  {
111
- src: url,
112
- alt: "",
193
+ viewBox: "0 0 32 32",
194
+ width: size,
195
+ height: size,
196
+ fill: "currentColor",
197
+ focusable: "false",
113
198
  "aria-hidden": "true",
114
- onError: () => setFailed(true),
115
- style: { position: "absolute", width: 1, height: 1, opacity: 0, pointerEvents: "none" }
199
+ style: { display: "block" },
200
+ dangerouslySetInnerHTML: { __html: markup }
116
201
  }
117
202
  )
118
203
  }
@@ -120,7 +205,7 @@ function Icon({ name, size = 16, label, pack, style, ...rest }) {
120
205
  }
121
206
 
122
207
  // src/components/core/Button.tsx
123
- import * as React2 from "react";
208
+ import * as React from "react";
124
209
  import { Button as AriaButton } from "react-aria-components";
125
210
 
126
211
  // src/components/utils/cx.ts
@@ -130,7 +215,7 @@ function cx(...parts) {
130
215
 
131
216
  // src/components/core/Button.tsx
132
217
  import { jsx as jsx2, jsxs } from "react/jsx-runtime";
133
- var Button = React2.forwardRef(function Button2({ children, variant = "secondary", size = "md", icon, iconEnd, fullWidth, className, ...rest }, ref) {
218
+ var Button = React.forwardRef(function Button2({ children, variant = "secondary", size = "md", icon, iconEnd, fullWidth, className, ...rest }, ref) {
134
219
  return /* @__PURE__ */ jsxs(
135
220
  AriaButton,
136
221
  {
@@ -150,7 +235,7 @@ var Button = React2.forwardRef(function Button2({ children, variant = "secondary
150
235
  });
151
236
 
152
237
  // src/components/core/IconButton.tsx
153
- import * as React3 from "react";
238
+ import * as React2 from "react";
154
239
  import { Button as AriaButton2 } from "react-aria-components";
155
240
 
156
241
  // src/components/feedback/Tooltip.tsx
@@ -168,7 +253,7 @@ function Tooltip({ label, placement = "top", delay = 500, children }) {
168
253
 
169
254
  // src/components/core/IconButton.tsx
170
255
  import { jsx as jsx4 } from "react/jsx-runtime";
171
- var IconButton = React3.forwardRef(function IconButton2({ icon, label, size = "md", variant = "tertiary", selected, hideTooltip, className, ...rest }, ref) {
256
+ var IconButton = React2.forwardRef(function IconButton2({ icon, label, size = "md", variant = "tertiary", selected, hideTooltip, className, ...rest }, ref) {
172
257
  const button = /* @__PURE__ */ jsx4(
173
258
  AriaButton2,
174
259
  {
@@ -239,11 +324,11 @@ function Card({ title, subtitle, icon, actions, footer, interactive, children, c
239
324
  }
240
325
 
241
326
  // src/components/core/Avatar.tsx
242
- import * as React4 from "react";
327
+ import * as React3 from "react";
243
328
  import { jsx as jsx8 } from "react/jsx-runtime";
244
329
  var initials = (name) => name.trim().split(/\s+/).slice(0, 2).map((p) => p[0]).join("").toUpperCase();
245
330
  function Avatar({ name, size = "md", src, className, ...rest }) {
246
- const [failed, setFailed] = React4.useState(false);
331
+ const [failed, setFailed] = React3.useState(false);
247
332
  return /* @__PURE__ */ jsx8("span", { className: cx("pire-avatar", className), "data-size": size, role: "img", "aria-label": name, ...rest, children: src && !failed ? /* @__PURE__ */ jsx8(
248
333
  "img",
249
334
  {
@@ -256,7 +341,7 @@ function Avatar({ name, size = "md", src, className, ...rest }) {
256
341
  }
257
342
 
258
343
  // src/components/core/SegmentedControl.tsx
259
- import * as React5 from "react";
344
+ import * as React4 from "react";
260
345
  import { ToggleButtonGroup, ToggleButton } from "react-aria-components";
261
346
  import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
262
347
  function SegmentedControl({
@@ -270,7 +355,7 @@ function SegmentedControl({
270
355
  style,
271
356
  ...rest
272
357
  }) {
273
- const selected = React5.useMemo(() => new Set(value ? [value] : defaultValue ? [defaultValue] : []), [value, defaultValue]);
358
+ const selected = React4.useMemo(() => new Set(value ? [value] : defaultValue ? [defaultValue] : []), [value, defaultValue]);
274
359
  return /* @__PURE__ */ jsx9(
275
360
  ToggleButtonGroup,
276
361
  {
@@ -372,19 +457,104 @@ function Input({
372
457
  );
373
458
  }
374
459
 
460
+ // src/components/forms/TextArea.tsx
461
+ import * as React5 from "react";
462
+ import { TextField as TextField2, Label as Label2, TextArea as AriaTextArea, Group as Group2, Text as Text2, FieldError as FieldError2 } from "react-aria-components";
463
+ import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
464
+ var useIsomorphicLayoutEffect = typeof document === "undefined" ? React5.useEffect : React5.useLayoutEffect;
465
+ function TextArea({
466
+ label,
467
+ description,
468
+ errorMessage,
469
+ size = "md",
470
+ rows = 3,
471
+ autoGrow,
472
+ maxRows,
473
+ fullWidth = true,
474
+ className,
475
+ style,
476
+ textAreaRef,
477
+ onChange,
478
+ ...rest
479
+ }) {
480
+ const innerRef = React5.useRef(null);
481
+ const ref = React5.useCallback((node) => {
482
+ innerRef.current = node;
483
+ if (typeof textAreaRef === "function") textAreaRef(node);
484
+ else if (textAreaRef) textAreaRef.current = node;
485
+ }, [textAreaRef]);
486
+ const grow = React5.useCallback(() => {
487
+ const el = innerRef.current;
488
+ if (!el || !autoGrow) return;
489
+ const styles = getComputedStyle(el);
490
+ const lineHeight = Number.parseFloat(styles.lineHeight) || Number.parseFloat(styles.fontSize) * 1.5;
491
+ const chrome = el.offsetHeight - el.clientHeight;
492
+ el.style.height = "auto";
493
+ const wanted = maxRows ? Math.min(el.scrollHeight, Math.ceil(lineHeight * maxRows)) : el.scrollHeight;
494
+ const next = `${wanted + chrome}px`;
495
+ if (el.style.height !== next) el.style.height = next;
496
+ }, [autoGrow, maxRows]);
497
+ useIsomorphicLayoutEffect(() => {
498
+ if (!autoGrow) {
499
+ if (innerRef.current) innerRef.current.style.height = "";
500
+ return;
501
+ }
502
+ grow();
503
+ }, [autoGrow, grow, rest.value]);
504
+ return /* @__PURE__ */ jsxs9(
505
+ TextField2,
506
+ {
507
+ className: cx("pire-field", className),
508
+ style,
509
+ onChange,
510
+ validationBehavior: "aria",
511
+ ...rest,
512
+ children: [
513
+ label ? /* @__PURE__ */ jsxs9(Label2, { className: "pire-field-label", children: [
514
+ label,
515
+ rest.isRequired ? /* @__PURE__ */ jsx12("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
516
+ ] }) : null,
517
+ /* @__PURE__ */ jsx12(
518
+ Group2,
519
+ {
520
+ className: "pire-control",
521
+ "data-size": size,
522
+ "data-full-width": String(fullWidth),
523
+ "data-multiline": "true",
524
+ "data-invalid": rest.isInvalid ? "true" : void 0,
525
+ "data-readonly": rest.isReadOnly ? "true" : void 0,
526
+ children: /* @__PURE__ */ jsx12(
527
+ AriaTextArea,
528
+ {
529
+ ref,
530
+ rows,
531
+ onInput: autoGrow ? grow : void 0,
532
+ className: cx("pire-input", "pire-textarea"),
533
+ "data-auto-grow": autoGrow ? "true" : void 0
534
+ }
535
+ )
536
+ }
537
+ ),
538
+ description ? /* @__PURE__ */ jsx12(Text2, { slot: "description", className: "pire-field-hint", children: description }) : null,
539
+ /* @__PURE__ */ jsx12(FieldError2, { className: "pire-field-error", children: errorMessage })
540
+ ]
541
+ }
542
+ );
543
+ }
544
+
375
545
  // src/components/forms/Select.tsx
376
546
  import {
377
547
  Select as AriaSelect,
378
- Label as Label2,
548
+ Label as Label3,
379
549
  Button as AriaButton4,
380
550
  SelectValue,
381
551
  Popover,
382
552
  ListBox,
383
553
  ListBoxItem,
384
- Text as Text2,
385
- FieldError as FieldError2
554
+ Text as Text3,
555
+ FieldError as FieldError3
386
556
  } from "react-aria-components";
387
- import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
557
+ import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
388
558
  var norm = (o) => typeof o === "string" ? { value: o, label: o, isDisabled: false } : o;
389
559
  function Select({
390
560
  label,
@@ -402,7 +572,7 @@ function Select({
402
572
  ...rest
403
573
  }) {
404
574
  const items = options.map(norm);
405
- return /* @__PURE__ */ jsxs9(
575
+ return /* @__PURE__ */ jsxs10(
406
576
  AriaSelect,
407
577
  {
408
578
  className: cx("pire-field", className),
@@ -414,11 +584,11 @@ function Select({
414
584
  validationBehavior: "aria",
415
585
  ...rest,
416
586
  children: [
417
- label ? /* @__PURE__ */ jsxs9(Label2, { className: "pire-field-label", children: [
587
+ label ? /* @__PURE__ */ jsxs10(Label3, { className: "pire-field-label", children: [
418
588
  label,
419
- rest.isRequired ? /* @__PURE__ */ jsx12("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
589
+ rest.isRequired ? /* @__PURE__ */ jsx13("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
420
590
  ] }) : null,
421
- /* @__PURE__ */ jsxs9(
591
+ /* @__PURE__ */ jsxs10(
422
592
  AriaButton4,
423
593
  {
424
594
  className: "pire-control",
@@ -426,14 +596,14 @@ function Select({
426
596
  "data-full-width": String(fullWidth),
427
597
  "data-invalid": rest.isInvalid ? "true" : void 0,
428
598
  children: [
429
- /* @__PURE__ */ jsx12(SelectValue, { className: "pire-select-value" }),
430
- /* @__PURE__ */ jsx12(Icon, { name: "chevron-down", size: 16, className: "pire-leading-icon" })
599
+ /* @__PURE__ */ jsx13(SelectValue, { className: "pire-select-value" }),
600
+ /* @__PURE__ */ jsx13(Icon, { name: "chevron-down", size: 16, className: "pire-leading-icon" })
431
601
  ]
432
602
  }
433
603
  ),
434
- description ? /* @__PURE__ */ jsx12(Text2, { slot: "description", className: "pire-field-hint", children: description }) : null,
435
- /* @__PURE__ */ jsx12(FieldError2, { className: "pire-field-error", children: errorMessage }),
436
- /* @__PURE__ */ jsx12(Popover, { className: "pire-popover", children: /* @__PURE__ */ jsx12(ListBox, { className: "pire-listbox", items, children: (item) => /* @__PURE__ */ jsx12(ListBoxItem, { className: "pire-option", id: item.value, textValue: item.label, isDisabled: item.isDisabled, children: item.label }) }) })
604
+ description ? /* @__PURE__ */ jsx13(Text3, { slot: "description", className: "pire-field-hint", children: description }) : null,
605
+ /* @__PURE__ */ jsx13(FieldError3, { className: "pire-field-error", children: errorMessage }),
606
+ /* @__PURE__ */ jsx13(Popover, { className: "pire-popover", children: /* @__PURE__ */ jsx13(ListBox, { className: "pire-listbox", items, children: (item) => /* @__PURE__ */ jsx13(ListBoxItem, { className: "pire-option", id: item.value, textValue: item.label, isDisabled: item.isDisabled, children: item.label }) }) })
437
607
  ]
438
608
  }
439
609
  );
@@ -441,13 +611,13 @@ function Select({
441
611
 
442
612
  // src/components/forms/Checkbox.tsx
443
613
  import { Checkbox as AriaCheckbox } from "react-aria-components";
444
- import { Fragment, jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
614
+ import { Fragment, jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
445
615
  function Checkbox({ label, hint, children, className, ...rest }) {
446
- return /* @__PURE__ */ jsx13(AriaCheckbox, { className: cx("pire-choice", className), ...rest, children: ({ isSelected, isIndeterminate }) => /* @__PURE__ */ jsxs10(Fragment, { children: [
447
- /* @__PURE__ */ jsx13("span", { className: "pire-choice-box", "aria-hidden": "true", children: isIndeterminate ? /* @__PURE__ */ jsx13(Icon, { name: "minus", size: 12 }) : isSelected ? /* @__PURE__ */ jsx13(Icon, { name: "check", size: 12 }) : null }),
448
- /* @__PURE__ */ jsxs10("span", { children: [
616
+ return /* @__PURE__ */ jsx14(AriaCheckbox, { className: cx("pire-choice", className), ...rest, children: ({ isSelected, isIndeterminate }) => /* @__PURE__ */ jsxs11(Fragment, { children: [
617
+ /* @__PURE__ */ jsx14("span", { className: "pire-choice-box", "aria-hidden": "true", children: isIndeterminate ? /* @__PURE__ */ jsx14(Icon, { name: "minus", size: 12 }) : isSelected ? /* @__PURE__ */ jsx14(Icon, { name: "check", size: 12 }) : null }),
618
+ /* @__PURE__ */ jsxs11("span", { children: [
449
619
  label ?? children,
450
- hint ? /* @__PURE__ */ jsx13("span", { className: "pire-choice-hint", children: hint }) : null
620
+ hint ? /* @__PURE__ */ jsx14("span", { className: "pire-choice-hint", children: hint }) : null
451
621
  ] })
452
622
  ] }) });
453
623
  }
@@ -456,53 +626,53 @@ function Checkbox({ label, hint, children, className, ...rest }) {
456
626
  import {
457
627
  RadioGroup as AriaRadioGroup,
458
628
  Radio as AriaRadio,
459
- Label as Label3,
460
- Text as Text3,
461
- FieldError as FieldError3
629
+ Label as Label4,
630
+ Text as Text4,
631
+ FieldError as FieldError4
462
632
  } from "react-aria-components";
463
- import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
633
+ import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
464
634
  function RadioGroup({ label, description, errorMessage, children, className, ...rest }) {
465
- return /* @__PURE__ */ jsxs11(AriaRadioGroup, { className: cx("pire-field", className), validationBehavior: "aria", ...rest, children: [
466
- label ? /* @__PURE__ */ jsx14(Label3, { className: "pire-field-label", children: label }) : null,
467
- /* @__PURE__ */ jsx14("div", { className: "pire-radiogroup", children }),
468
- description ? /* @__PURE__ */ jsx14(Text3, { slot: "description", className: "pire-field-hint", children: description }) : null,
469
- /* @__PURE__ */ jsx14(FieldError3, { className: "pire-field-error", children: errorMessage })
635
+ return /* @__PURE__ */ jsxs12(AriaRadioGroup, { className: cx("pire-field", className), validationBehavior: "aria", ...rest, children: [
636
+ label ? /* @__PURE__ */ jsx15(Label4, { className: "pire-field-label", children: label }) : null,
637
+ /* @__PURE__ */ jsx15("div", { className: "pire-radiogroup", children }),
638
+ description ? /* @__PURE__ */ jsx15(Text4, { slot: "description", className: "pire-field-hint", children: description }) : null,
639
+ /* @__PURE__ */ jsx15(FieldError4, { className: "pire-field-error", children: errorMessage })
470
640
  ] });
471
641
  }
472
642
  function Radio({ label, hint, children, className, ...rest }) {
473
- return /* @__PURE__ */ jsxs11(AriaRadio, { className: cx("pire-choice", className), ...rest, children: [
474
- /* @__PURE__ */ jsx14("span", { className: "pire-choice-box", "data-radio": "true", "aria-hidden": "true" }),
475
- /* @__PURE__ */ jsxs11("span", { children: [
643
+ return /* @__PURE__ */ jsxs12(AriaRadio, { className: cx("pire-choice", className), ...rest, children: [
644
+ /* @__PURE__ */ jsx15("span", { className: "pire-choice-box", "data-radio": "true", "aria-hidden": "true" }),
645
+ /* @__PURE__ */ jsxs12("span", { children: [
476
646
  label ?? children,
477
- hint ? /* @__PURE__ */ jsx14("span", { className: "pire-choice-hint", children: hint }) : null
647
+ hint ? /* @__PURE__ */ jsx15("span", { className: "pire-choice-hint", children: hint }) : null
478
648
  ] })
479
649
  ] });
480
650
  }
481
651
 
482
652
  // src/components/forms/Switch.tsx
483
653
  import { Switch as AriaSwitch } from "react-aria-components";
484
- import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
654
+ import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
485
655
  function Switch({ label, children, className, ...rest }) {
486
- return /* @__PURE__ */ jsxs12(AriaSwitch, { className: cx("pire-choice", className), ...rest, children: [
487
- /* @__PURE__ */ jsx15("span", { className: "pire-switch-track", "aria-hidden": "true", children: /* @__PURE__ */ jsx15("span", { className: "pire-switch-thumb" }) }),
488
- /* @__PURE__ */ jsx15("span", { children: label ?? children })
656
+ return /* @__PURE__ */ jsxs13(AriaSwitch, { className: cx("pire-choice", className), ...rest, children: [
657
+ /* @__PURE__ */ jsx16("span", { className: "pire-switch-track", "aria-hidden": "true", children: /* @__PURE__ */ jsx16("span", { className: "pire-switch-thumb" }) }),
658
+ /* @__PURE__ */ jsx16("span", { children: label ?? children })
489
659
  ] });
490
660
  }
491
661
 
492
662
  // src/components/forms/ComboBox.tsx
493
663
  import {
494
664
  ComboBox as AriaComboBox,
495
- Label as Label4,
665
+ Label as Label5,
496
666
  Input as AriaInput2,
497
667
  Button as AriaButton5,
498
- Group as Group2,
668
+ Group as Group3,
499
669
  Popover as Popover2,
500
670
  ListBox as ListBox2,
501
671
  ListBoxItem as ListBoxItem2,
502
- Text as Text4,
503
- FieldError as FieldError4
672
+ Text as Text5,
673
+ FieldError as FieldError5
504
674
  } from "react-aria-components";
505
- import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
675
+ import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
506
676
  var norm2 = (o) => typeof o === "string" ? { value: o, label: o } : o;
507
677
  function ComboBox({
508
678
  label,
@@ -520,7 +690,7 @@ function ComboBox({
520
690
  ...rest
521
691
  }) {
522
692
  const items = options.map(norm2);
523
- return /* @__PURE__ */ jsxs13(
693
+ return /* @__PURE__ */ jsxs14(
524
694
  AriaComboBox,
525
695
  {
526
696
  className: cx("pire-field", className),
@@ -534,46 +704,180 @@ function ComboBox({
534
704
  validationBehavior: "aria",
535
705
  ...rest,
536
706
  children: [
537
- label ? /* @__PURE__ */ jsxs13(Label4, { className: "pire-field-label", children: [
707
+ label ? /* @__PURE__ */ jsxs14(Label5, { className: "pire-field-label", children: [
538
708
  label,
539
- rest.isRequired ? /* @__PURE__ */ jsx16("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
709
+ rest.isRequired ? /* @__PURE__ */ jsx17("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
540
710
  ] }) : null,
541
- /* @__PURE__ */ jsxs13(
542
- Group2,
711
+ /* @__PURE__ */ jsxs14(
712
+ Group3,
543
713
  {
544
714
  className: "pire-control",
545
715
  "data-size": size,
546
716
  "data-full-width": String(fullWidth),
547
717
  "data-invalid": rest.isInvalid ? "true" : void 0,
548
718
  children: [
549
- /* @__PURE__ */ jsx16(Icon, { name: "search", size: 16, className: "pire-leading-icon" }),
550
- /* @__PURE__ */ jsx16(AriaInput2, { className: "pire-input", placeholder: rest.placeholder }),
551
- /* @__PURE__ */ jsx16(AriaButton5, { className: "pire-iconbtn", "data-size": "sm", "aria-label": "Show suggestions", style: { width: 20, height: 20 }, children: /* @__PURE__ */ jsx16(Icon, { name: "chevron-down", size: 16 }) })
719
+ /* @__PURE__ */ jsx17(Icon, { name: "search", size: 16, className: "pire-leading-icon" }),
720
+ /* @__PURE__ */ jsx17(AriaInput2, { className: "pire-input", placeholder: rest.placeholder }),
721
+ /* @__PURE__ */ jsx17(AriaButton5, { className: "pire-iconbtn", "data-size": "sm", "aria-label": "Show suggestions", style: { width: 20, height: 20 }, children: /* @__PURE__ */ jsx17(Icon, { name: "chevron-down", size: 16 }) })
552
722
  ]
553
723
  }
554
724
  ),
555
- description ? /* @__PURE__ */ jsx16(Text4, { slot: "description", className: "pire-field-hint", children: description }) : null,
556
- /* @__PURE__ */ jsx16(FieldError4, { className: "pire-field-error", children: errorMessage }),
557
- /* @__PURE__ */ jsx16(Popover2, { className: "pire-popover", children: /* @__PURE__ */ jsx16(ListBox2, { className: "pire-listbox", children: (item) => /* @__PURE__ */ jsxs13(ListBoxItem2, { className: "pire-option", id: item.value, textValue: item.label, isDisabled: item.isDisabled, children: [
558
- /* @__PURE__ */ jsx16("span", { style: { flex: 1 }, children: item.label }),
559
- item.secondary ? /* @__PURE__ */ jsx16("span", { style: { font: "var(--type-code)", color: "var(--text-tertiary)" }, children: item.secondary }) : null
725
+ description ? /* @__PURE__ */ jsx17(Text5, { slot: "description", className: "pire-field-hint", children: description }) : null,
726
+ /* @__PURE__ */ jsx17(FieldError5, { className: "pire-field-error", children: errorMessage }),
727
+ /* @__PURE__ */ jsx17(Popover2, { className: "pire-popover", children: /* @__PURE__ */ jsx17(ListBox2, { className: "pire-listbox", children: (item) => /* @__PURE__ */ jsxs14(ListBoxItem2, { className: "pire-option", id: item.value, textValue: item.label, isDisabled: item.isDisabled, children: [
728
+ /* @__PURE__ */ jsx17("span", { style: { flex: 1 }, children: item.label }),
729
+ item.secondary ? /* @__PURE__ */ jsx17("span", { style: { font: "var(--type-code)", color: "var(--text-tertiary)" }, children: item.secondary }) : null
560
730
  ] }) }) })
561
731
  ]
562
732
  }
563
733
  );
564
734
  }
565
735
 
566
- // src/components/forms/NumberField.tsx
736
+ // src/components/forms/MultiComboBox.tsx
737
+ import * as React6 from "react";
567
738
  import {
568
- NumberField as AriaNumberField,
569
- Label as Label5,
739
+ ComboBox as AriaComboBox2,
740
+ Label as Label6,
570
741
  Input as AriaInput3,
571
- Group as Group3,
572
742
  Button as AriaButton6,
573
- Text as Text5,
574
- FieldError as FieldError5
743
+ ButtonContext,
744
+ Group as Group4,
745
+ Popover as Popover3,
746
+ ListBox as ListBox3,
747
+ ListBoxItem as ListBoxItem3,
748
+ Text as Text6,
749
+ FieldError as FieldError6,
750
+ VisuallyHidden
575
751
  } from "react-aria-components";
576
- import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
752
+ import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
753
+ var norm3 = (o) => typeof o === "string" ? { value: o, label: o } : o;
754
+ function MultiComboBox({
755
+ label,
756
+ value,
757
+ defaultValue,
758
+ onChange,
759
+ onInputChange,
760
+ options = [],
761
+ description,
762
+ errorMessage,
763
+ allowsCustomValue,
764
+ size = "md",
765
+ fullWidth = true,
766
+ className,
767
+ style,
768
+ ...rest
769
+ }) {
770
+ const items = React6.useMemo(() => options.map(norm3), [options]);
771
+ const [uncontrolled, setUncontrolled] = React6.useState(defaultValue ?? []);
772
+ const [announcement, setAnnouncement] = React6.useState("");
773
+ const inputRef = React6.useRef(null);
774
+ const raw = value ?? uncontrolled;
775
+ const contentKey = raw.join("\0");
776
+ const values = React6.useMemo(() => raw, [contentKey]);
777
+ const labelOf = (v) => items.find((o) => o.value === v)?.label ?? v;
778
+ const isEditable = !rest.isDisabled && !rest.isReadOnly;
779
+ const commit = (next) => {
780
+ const added = next.find((v) => !values.includes(v));
781
+ const removed = values.find((v) => !next.includes(v));
782
+ if (added) setAnnouncement(`${labelOf(added)} added. ${next.length} selected.`);
783
+ else if (removed) setAnnouncement(`${labelOf(removed)} removed. ${next.length} selected.`);
784
+ if (value === void 0) setUncontrolled(next);
785
+ onChange?.(next);
786
+ };
787
+ const remove = (v) => {
788
+ commit(values.filter((x) => x !== v));
789
+ inputRef.current?.focus();
790
+ };
791
+ const onKeyDownCapture = (e) => {
792
+ const el = e.currentTarget;
793
+ if (!isEditable) return;
794
+ if (e.key === "Backspace" && el.value === "" && values.length > 0) {
795
+ e.preventDefault();
796
+ e.stopPropagation();
797
+ commit(values.slice(0, -1));
798
+ return;
799
+ }
800
+ if (e.key !== "Enter" || !allowsCustomValue) return;
801
+ const text = el.value.trim();
802
+ if (text === "" || el.getAttribute("aria-activedescendant")) return;
803
+ const match = items.find((o) => o.label.toLowerCase() === text.toLowerCase());
804
+ const next = match ? match.value : text;
805
+ e.preventDefault();
806
+ e.stopPropagation();
807
+ if (!values.includes(next)) commit([...values, next]);
808
+ };
809
+ return /* @__PURE__ */ jsxs15(
810
+ AriaComboBox2,
811
+ {
812
+ className: cx("pire-field", className),
813
+ style,
814
+ selectionMode: "multiple",
815
+ value: values,
816
+ onChange: (keys) => commit(keys.map(String)),
817
+ onInputChange,
818
+ defaultItems: items,
819
+ menuTrigger: "input",
820
+ validationBehavior: "aria",
821
+ ...rest,
822
+ children: [
823
+ label ? /* @__PURE__ */ jsxs15(Label6, { className: "pire-field-label", children: [
824
+ label,
825
+ rest.isRequired ? /* @__PURE__ */ jsx18("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
826
+ ] }) : null,
827
+ /* @__PURE__ */ jsxs15(
828
+ Group4,
829
+ {
830
+ className: "pire-control",
831
+ "data-size": size,
832
+ "data-full-width": String(fullWidth),
833
+ "data-multiline": "true",
834
+ "data-invalid": rest.isInvalid ? "true" : void 0,
835
+ "data-readonly": rest.isReadOnly ? "true" : void 0,
836
+ children: [
837
+ /* @__PURE__ */ jsx18(Icon, { name: "search", size: 16, className: "pire-leading-icon" }),
838
+ /* @__PURE__ */ jsxs15("div", { className: "pire-chipfield", children: [
839
+ /* @__PURE__ */ jsx18(ButtonContext.Provider, { value: null, children: values.map((v) => (
840
+ /* Disabled follows the field, not `isEditable`: a read-only field's chips are
841
+ real, current values and should read as such — they simply lose the × . */
842
+ /* @__PURE__ */ jsx18(Tag, { isDisabled: rest.isDisabled, onRemove: isEditable ? () => remove(v) : void 0, children: labelOf(v) }, v)
843
+ )) }),
844
+ /* @__PURE__ */ jsx18(
845
+ AriaInput3,
846
+ {
847
+ ref: inputRef,
848
+ className: cx("pire-input", "pire-chipinput"),
849
+ placeholder: rest.placeholder,
850
+ onKeyDownCapture
851
+ }
852
+ )
853
+ ] }),
854
+ /* @__PURE__ */ jsx18(AriaButton6, { className: "pire-iconbtn", "data-size": "sm", "aria-label": "Show suggestions", style: { width: 20, height: 20 }, children: /* @__PURE__ */ jsx18(Icon, { name: "chevron-down", size: 16 }) })
855
+ ]
856
+ }
857
+ ),
858
+ /* @__PURE__ */ jsx18(VisuallyHidden, { children: /* @__PURE__ */ jsx18("span", { "aria-live": "polite", children: announcement }) }),
859
+ description ? /* @__PURE__ */ jsx18(Text6, { slot: "description", className: "pire-field-hint", children: description }) : null,
860
+ /* @__PURE__ */ jsx18(FieldError6, { className: "pire-field-error", children: errorMessage }),
861
+ /* @__PURE__ */ jsx18(Popover3, { className: "pire-popover", children: /* @__PURE__ */ jsx18(ListBox3, { className: "pire-listbox", children: (item) => /* @__PURE__ */ jsxs15(ListBoxItem3, { className: "pire-option", id: item.value, textValue: item.label, isDisabled: item.isDisabled, children: [
862
+ /* @__PURE__ */ jsx18("span", { style: { flex: 1 }, children: item.label }),
863
+ item.secondary ? /* @__PURE__ */ jsx18("span", { style: { font: "var(--type-code)", color: "var(--text-tertiary)" }, children: item.secondary }) : null
864
+ ] }) }) })
865
+ ]
866
+ }
867
+ );
868
+ }
869
+
870
+ // src/components/forms/NumberField.tsx
871
+ import {
872
+ NumberField as AriaNumberField,
873
+ Label as Label7,
874
+ Input as AriaInput4,
875
+ Group as Group5,
876
+ Button as AriaButton7,
877
+ Text as Text7,
878
+ FieldError as FieldError7
879
+ } from "react-aria-components";
880
+ import { jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
577
881
  function NumberField({
578
882
  label,
579
883
  suffix,
@@ -586,13 +890,13 @@ function NumberField({
586
890
  style,
587
891
  ...rest
588
892
  }) {
589
- return /* @__PURE__ */ jsxs14(AriaNumberField, { className: cx("pire-field", className), style, validationBehavior: "aria", ...rest, children: [
590
- label ? /* @__PURE__ */ jsxs14(Label5, { className: "pire-field-label", children: [
893
+ return /* @__PURE__ */ jsxs16(AriaNumberField, { className: cx("pire-field", className), style, validationBehavior: "aria", ...rest, children: [
894
+ label ? /* @__PURE__ */ jsxs16(Label7, { className: "pire-field-label", children: [
591
895
  label,
592
- rest.isRequired ? /* @__PURE__ */ jsx17("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
896
+ rest.isRequired ? /* @__PURE__ */ jsx19("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
593
897
  ] }) : null,
594
- /* @__PURE__ */ jsxs14(
595
- Group3,
898
+ /* @__PURE__ */ jsxs16(
899
+ Group5,
596
900
  {
597
901
  className: "pire-control",
598
902
  "data-size": size,
@@ -600,29 +904,29 @@ function NumberField({
600
904
  "data-invalid": rest.isInvalid ? "true" : void 0,
601
905
  "data-readonly": rest.isReadOnly ? "true" : void 0,
602
906
  children: [
603
- /* @__PURE__ */ jsx17(AriaInput3, { className: "pire-input", "data-numeric": "true" }),
604
- suffix ? /* @__PURE__ */ jsx17("span", { className: "pire-affix", children: suffix }) : null,
605
- hideStepper ? null : /* @__PURE__ */ jsxs14("span", { className: "pire-stepper", children: [
606
- /* @__PURE__ */ jsx17(AriaButton6, { slot: "increment", className: "pire-stepper-btn", "aria-label": "Increase", children: /* @__PURE__ */ jsx17(Icon, { name: "plus", size: 10 }) }),
607
- /* @__PURE__ */ jsx17(AriaButton6, { slot: "decrement", className: "pire-stepper-btn", "aria-label": "Decrease", children: /* @__PURE__ */ jsx17(Icon, { name: "minus", size: 10 }) })
907
+ /* @__PURE__ */ jsx19(AriaInput4, { className: "pire-input", "data-numeric": "true" }),
908
+ suffix ? /* @__PURE__ */ jsx19("span", { className: "pire-affix", children: suffix }) : null,
909
+ hideStepper ? null : /* @__PURE__ */ jsxs16("span", { className: "pire-stepper", children: [
910
+ /* @__PURE__ */ jsx19(AriaButton7, { slot: "increment", className: "pire-stepper-btn", "aria-label": "Increase", children: /* @__PURE__ */ jsx19(Icon, { name: "plus", size: 10 }) }),
911
+ /* @__PURE__ */ jsx19(AriaButton7, { slot: "decrement", className: "pire-stepper-btn", "aria-label": "Decrease", children: /* @__PURE__ */ jsx19(Icon, { name: "minus", size: 10 }) })
608
912
  ] })
609
913
  ]
610
914
  }
611
915
  ),
612
- description ? /* @__PURE__ */ jsx17(Text5, { slot: "description", className: "pire-field-hint", children: description }) : null,
613
- /* @__PURE__ */ jsx17(FieldError5, { className: "pire-field-error", children: errorMessage })
916
+ description ? /* @__PURE__ */ jsx19(Text7, { slot: "description", className: "pire-field-hint", children: description }) : null,
917
+ /* @__PURE__ */ jsx19(FieldError7, { className: "pire-field-error", children: errorMessage })
614
918
  ] });
615
919
  }
616
920
 
617
921
  // src/components/forms/DatePicker.tsx
618
922
  import {
619
923
  DatePicker as AriaDatePicker,
620
- Label as Label6,
621
- Group as Group4,
924
+ Label as Label8,
925
+ Group as Group6,
622
926
  DateInput,
623
927
  DateSegment,
624
- Button as AriaButton7,
625
- Popover as Popover3,
928
+ Button as AriaButton8,
929
+ Popover as Popover4,
626
930
  Dialog as AriaDialog,
627
931
  Calendar,
628
932
  CalendarGrid,
@@ -631,10 +935,10 @@ import {
631
935
  CalendarGridBody,
632
936
  CalendarCell,
633
937
  Heading,
634
- Text as Text6,
635
- FieldError as FieldError6
938
+ Text as Text8,
939
+ FieldError as FieldError8
636
940
  } from "react-aria-components";
637
- import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
941
+ import { jsx as jsx20, jsxs as jsxs17 } from "react/jsx-runtime";
638
942
  function DatePicker({
639
943
  label,
640
944
  description,
@@ -645,13 +949,13 @@ function DatePicker({
645
949
  style,
646
950
  ...rest
647
951
  }) {
648
- return /* @__PURE__ */ jsxs15(AriaDatePicker, { className: cx("pire-field", className), style, validationBehavior: "aria", ...rest, children: [
649
- label ? /* @__PURE__ */ jsxs15(Label6, { className: "pire-field-label", children: [
952
+ return /* @__PURE__ */ jsxs17(AriaDatePicker, { className: cx("pire-field", className), style, validationBehavior: "aria", ...rest, children: [
953
+ label ? /* @__PURE__ */ jsxs17(Label8, { className: "pire-field-label", children: [
650
954
  label,
651
- rest.isRequired ? /* @__PURE__ */ jsx18("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
955
+ rest.isRequired ? /* @__PURE__ */ jsx20("span", { className: "pire-field-req", "aria-hidden": "true", children: "*" }) : null
652
956
  ] }) : null,
653
- /* @__PURE__ */ jsxs15(
654
- Group4,
957
+ /* @__PURE__ */ jsxs17(
958
+ Group6,
655
959
  {
656
960
  className: "pire-control",
657
961
  "data-size": size,
@@ -659,36 +963,36 @@ function DatePicker({
659
963
  "data-invalid": rest.isInvalid ? "true" : void 0,
660
964
  "data-readonly": rest.isReadOnly ? "true" : void 0,
661
965
  children: [
662
- /* @__PURE__ */ jsx18(DateInput, { className: "pire-datefield", children: (segment) => /* @__PURE__ */ jsx18(DateSegment, { segment, className: "pire-datesegment" }) }),
663
- /* @__PURE__ */ jsx18(AriaButton7, { className: "pire-iconbtn", "data-size": "sm", "aria-label": "Open calendar", style: { width: 24, height: 24 }, children: /* @__PURE__ */ jsx18(Icon, { name: "calendar", size: 16 }) })
966
+ /* @__PURE__ */ jsx20(DateInput, { className: "pire-datefield", children: (segment) => /* @__PURE__ */ jsx20(DateSegment, { segment, className: "pire-datesegment" }) }),
967
+ /* @__PURE__ */ jsx20(AriaButton8, { className: "pire-iconbtn", "data-size": "sm", "aria-label": "Open calendar", style: { width: 24, height: 24 }, children: /* @__PURE__ */ jsx20(Icon, { name: "calendar", size: 16 }) })
664
968
  ]
665
969
  }
666
970
  ),
667
- description ? /* @__PURE__ */ jsx18(Text6, { slot: "description", className: "pire-field-hint", children: description }) : null,
668
- /* @__PURE__ */ jsx18(FieldError6, { className: "pire-field-error", children: errorMessage }),
669
- /* @__PURE__ */ jsx18(Popover3, { className: "pire-popover", children: /* @__PURE__ */ jsx18(AriaDialog, { children: /* @__PURE__ */ jsxs15(Calendar, { className: "pire-calendar", children: [
670
- /* @__PURE__ */ jsxs15("header", { className: "pire-calendar-head", children: [
671
- /* @__PURE__ */ jsx18(AriaButton7, { slot: "previous", className: "pire-iconbtn", "data-size": "sm", "aria-label": "Previous month", children: /* @__PURE__ */ jsx18(Icon, { name: "chevron-left", size: 16 }) }),
672
- /* @__PURE__ */ jsx18(Heading, { className: "pire-calendar-title" }),
673
- /* @__PURE__ */ jsx18(AriaButton7, { slot: "next", className: "pire-iconbtn", "data-size": "sm", "aria-label": "Next month", children: /* @__PURE__ */ jsx18(Icon, { name: "chevron-right", size: 16 }) })
971
+ description ? /* @__PURE__ */ jsx20(Text8, { slot: "description", className: "pire-field-hint", children: description }) : null,
972
+ /* @__PURE__ */ jsx20(FieldError8, { className: "pire-field-error", children: errorMessage }),
973
+ /* @__PURE__ */ jsx20(Popover4, { className: "pire-popover", children: /* @__PURE__ */ jsx20(AriaDialog, { children: /* @__PURE__ */ jsxs17(Calendar, { className: "pire-calendar", children: [
974
+ /* @__PURE__ */ jsxs17("header", { className: "pire-calendar-head", children: [
975
+ /* @__PURE__ */ jsx20(AriaButton8, { slot: "previous", className: "pire-iconbtn", "data-size": "sm", "aria-label": "Previous month", children: /* @__PURE__ */ jsx20(Icon, { name: "chevron-left", size: 16 }) }),
976
+ /* @__PURE__ */ jsx20(Heading, { className: "pire-calendar-title" }),
977
+ /* @__PURE__ */ jsx20(AriaButton8, { slot: "next", className: "pire-iconbtn", "data-size": "sm", "aria-label": "Next month", children: /* @__PURE__ */ jsx20(Icon, { name: "chevron-right", size: 16 }) })
674
978
  ] }),
675
- /* @__PURE__ */ jsxs15(CalendarGrid, { className: "pire-calendar-grid", children: [
676
- /* @__PURE__ */ jsx18(CalendarGridHeader, { children: (day) => /* @__PURE__ */ jsx18(CalendarHeaderCell, { children: day }) }),
677
- /* @__PURE__ */ jsx18(CalendarGridBody, { children: (date) => /* @__PURE__ */ jsx18(CalendarCell, { date, className: "pire-calendar-cell" }) })
979
+ /* @__PURE__ */ jsxs17(CalendarGrid, { className: "pire-calendar-grid", children: [
980
+ /* @__PURE__ */ jsx20(CalendarGridHeader, { children: (day) => /* @__PURE__ */ jsx20(CalendarHeaderCell, { children: day }) }),
981
+ /* @__PURE__ */ jsx20(CalendarGridBody, { children: (date) => /* @__PURE__ */ jsx20(CalendarCell, { date, className: "pire-calendar-cell" }) })
678
982
  ] })
679
983
  ] }) }) })
680
984
  ] });
681
985
  }
682
986
 
683
987
  // src/components/forms/ValueHelpField.tsx
684
- import * as React7 from "react";
988
+ import * as React8 from "react";
685
989
 
686
990
  // src/components/patterns/ValueHelpDialog.tsx
687
- import * as React6 from "react";
991
+ import * as React7 from "react";
688
992
 
689
993
  // src/components/feedback/Dialog.tsx
690
994
  import { ModalOverlay, Modal, Dialog as AriaDialog2, Heading as Heading2 } from "react-aria-components";
691
- import { jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
995
+ import { jsx as jsx21, jsxs as jsxs18 } from "react/jsx-runtime";
692
996
  function Dialog({
693
997
  isOpen,
694
998
  onOpenChange,
@@ -707,7 +1011,7 @@ function Dialog({
707
1011
  onClose?.();
708
1012
  onOpenChange?.(false);
709
1013
  };
710
- return /* @__PURE__ */ jsx19(
1014
+ return /* @__PURE__ */ jsx21(
711
1015
  ModalOverlay,
712
1016
  {
713
1017
  className: "pire-modal-overlay",
@@ -716,16 +1020,16 @@ function Dialog({
716
1020
  onOpenChange: (o) => {
717
1021
  if (!o) close();
718
1022
  },
719
- children: /* @__PURE__ */ jsx19(Modal, { className: cx("pire-modal", className), "data-size": size, style, children: /* @__PURE__ */ jsxs16(AriaDialog2, { className: "pire-dialog", children: [
720
- title ? /* @__PURE__ */ jsxs16("header", { className: "pire-dialog-head", children: [
721
- /* @__PURE__ */ jsxs16("div", { style: { flex: 1, minWidth: 0 }, children: [
722
- /* @__PURE__ */ jsx19(Heading2, { slot: "title", className: "pire-dialog-title", children: title }),
723
- subtitle ? /* @__PURE__ */ jsx19("p", { className: "pire-dialog-sub", style: { margin: 0 }, children: subtitle }) : null
1023
+ children: /* @__PURE__ */ jsx21(Modal, { className: cx("pire-modal", className), "data-size": size, style, children: /* @__PURE__ */ jsxs18(AriaDialog2, { className: "pire-dialog", children: [
1024
+ title ? /* @__PURE__ */ jsxs18("header", { className: "pire-dialog-head", children: [
1025
+ /* @__PURE__ */ jsxs18("div", { style: { flex: 1, minWidth: 0 }, children: [
1026
+ /* @__PURE__ */ jsx21(Heading2, { slot: "title", className: "pire-dialog-title", children: title }),
1027
+ subtitle ? /* @__PURE__ */ jsx21("p", { className: "pire-dialog-sub", style: { margin: 0 }, children: subtitle }) : null
724
1028
  ] }),
725
- showClose ? /* @__PURE__ */ jsx19(IconButton, { icon: "x", label: "Close", size: "sm", onPress: close }) : null
1029
+ showClose ? /* @__PURE__ */ jsx21(IconButton, { icon: "x", label: "Close", size: "sm", onPress: close }) : null
726
1030
  ] }) : null,
727
- /* @__PURE__ */ jsx19("div", { className: "pire-dialog-body", children }),
728
- footer ? /* @__PURE__ */ jsx19("footer", { className: "pire-dialog-foot", children: footer }) : null
1031
+ /* @__PURE__ */ jsx21("div", { className: "pire-dialog-body", children }),
1032
+ footer ? /* @__PURE__ */ jsx21("footer", { className: "pire-dialog-foot", children: footer }) : null
729
1033
  ] }) })
730
1034
  }
731
1035
  );
@@ -740,7 +1044,7 @@ import {
740
1044
  Row,
741
1045
  Cell
742
1046
  } from "react-aria-components";
743
- import { jsx as jsx20, jsxs as jsxs17 } from "react/jsx-runtime";
1047
+ import { jsx as jsx22, jsxs as jsxs19 } from "react/jsx-runtime";
744
1048
  function DataTable({
745
1049
  columns,
746
1050
  rows,
@@ -762,7 +1066,7 @@ function DataTable({
762
1066
  if (keys === "all") return onSelectionChange?.(rows.map((r) => r.id));
763
1067
  onSelectionChange?.([...keys]);
764
1068
  };
765
- return /* @__PURE__ */ jsx20("div", { className: cx("pire-table-wrap", className), style, children: /* @__PURE__ */ jsxs17(
1069
+ return /* @__PURE__ */ jsx22("div", { className: cx("pire-table-wrap", className), style, children: /* @__PURE__ */ jsxs19(
766
1070
  Table,
767
1071
  {
768
1072
  className: "pire-table",
@@ -779,9 +1083,9 @@ function DataTable({
779
1083
  if (row) onRowAction(row);
780
1084
  } : void 0,
781
1085
  children: [
782
- /* @__PURE__ */ jsxs17(TableHeader, { className: "pire-thead-row", children: [
783
- selectable ? /* @__PURE__ */ jsx20(Column, { className: "pire-th", width: 44, children: /* @__PURE__ */ jsx20(Checkbox, { slot: "selection", "aria-label": "Select all rows" }) }) : null,
784
- columns.map((c, i) => /* @__PURE__ */ jsx20(
1086
+ /* @__PURE__ */ jsxs19(TableHeader, { className: "pire-thead-row", children: [
1087
+ selectable ? /* @__PURE__ */ jsx22(Column, { className: "pire-th", width: 44, children: /* @__PURE__ */ jsx22(Checkbox, { slot: "selection", "aria-label": "Select all rows" }) }) : null,
1088
+ columns.map((c, i) => /* @__PURE__ */ jsx22(
785
1089
  Column,
786
1090
  {
787
1091
  id: c.key,
@@ -791,9 +1095,9 @@ function DataTable({
791
1095
  width: c.width,
792
1096
  "data-align": c.numeric || c.align === "right" ? "right" : c.align,
793
1097
  "data-allows-sorting": c.sortable ? "true" : void 0,
794
- children: /* @__PURE__ */ jsxs17("span", { className: "pire-th-inner", children: [
1098
+ children: /* @__PURE__ */ jsxs19("span", { className: "pire-th-inner", children: [
795
1099
  c.label,
796
- c.sortable ? /* @__PURE__ */ jsx20(
1100
+ c.sortable ? /* @__PURE__ */ jsx22(
797
1101
  Icon,
798
1102
  {
799
1103
  size: 12,
@@ -806,9 +1110,9 @@ function DataTable({
806
1110
  c.key
807
1111
  ))
808
1112
  ] }),
809
- /* @__PURE__ */ jsx20(TableBody, { renderEmptyState: () => /* @__PURE__ */ jsx20("div", { className: "pire-table-empty", children: emptyLabel }), children: rows.map((row) => /* @__PURE__ */ jsxs17(Row, { id: row.id, className: "pire-tr", "data-pressable": onRowAction ? "true" : void 0, children: [
810
- selectable ? /* @__PURE__ */ jsx20(Cell, { className: "pire-td", children: /* @__PURE__ */ jsx20(Checkbox, { slot: "selection", "aria-label": "Select row" }) }) : null,
811
- columns.map((c) => /* @__PURE__ */ jsx20(
1113
+ /* @__PURE__ */ jsx22(TableBody, { renderEmptyState: () => /* @__PURE__ */ jsx22("div", { className: "pire-table-empty", children: emptyLabel }), children: rows.map((row) => /* @__PURE__ */ jsxs19(Row, { id: row.id, className: "pire-tr", "data-pressable": onRowAction ? "true" : void 0, children: [
1114
+ selectable ? /* @__PURE__ */ jsx22(Cell, { className: "pire-td", children: /* @__PURE__ */ jsx22(Checkbox, { slot: "selection", "aria-label": "Select row" }) }) : null,
1115
+ columns.map((c) => /* @__PURE__ */ jsx22(
812
1116
  Cell,
813
1117
  {
814
1118
  className: "pire-td",
@@ -825,7 +1129,7 @@ function DataTable({
825
1129
  }
826
1130
 
827
1131
  // src/components/patterns/ValueHelpDialog.tsx
828
- import { jsx as jsx21, jsxs as jsxs18 } from "react/jsx-runtime";
1132
+ import { jsx as jsx23, jsxs as jsxs20 } from "react/jsx-runtime";
829
1133
  function ValueHelpDialog({
830
1134
  isOpen,
831
1135
  title = "Select a record",
@@ -836,25 +1140,25 @@ function ValueHelpDialog({
836
1140
  onSelect,
837
1141
  onClose
838
1142
  }) {
839
- const [query, setQuery] = React6.useState("");
840
- React6.useEffect(() => {
1143
+ const [query, setQuery] = React7.useState("");
1144
+ React7.useEffect(() => {
841
1145
  if (isOpen) setQuery("");
842
1146
  }, [isOpen]);
843
- const filtered = React6.useMemo(() => {
1147
+ const filtered = React7.useMemo(() => {
844
1148
  const q = query.trim().toLowerCase();
845
1149
  if (!q) return rows;
846
1150
  return rows.filter((row) => Object.values(row).some((v) => String(v).toLowerCase().includes(q)));
847
1151
  }, [rows, query]);
848
- return /* @__PURE__ */ jsx21(
1152
+ return /* @__PURE__ */ jsx23(
849
1153
  Dialog,
850
1154
  {
851
1155
  isOpen,
852
1156
  size: "lg",
853
1157
  title,
854
1158
  onClose,
855
- footer: /* @__PURE__ */ jsx21(Button, { variant: "tertiary", onPress: onClose, children: "Cancel" }),
856
- children: /* @__PURE__ */ jsxs18("div", { style: { display: "flex", flexDirection: "column", gap: "var(--sp-3)" }, children: [
857
- /* @__PURE__ */ jsx21(
1159
+ footer: /* @__PURE__ */ jsx23(Button, { variant: "tertiary", onPress: onClose, children: "Cancel" }),
1160
+ children: /* @__PURE__ */ jsxs20("div", { style: { display: "flex", flexDirection: "column", gap: "var(--sp-3)" }, children: [
1161
+ /* @__PURE__ */ jsx23(
858
1162
  Input,
859
1163
  {
860
1164
  "aria-label": "Search records",
@@ -866,7 +1170,7 @@ function ValueHelpDialog({
866
1170
  autoFocus: true
867
1171
  }
868
1172
  ),
869
- /* @__PURE__ */ jsx21(
1173
+ /* @__PURE__ */ jsx23(
870
1174
  DataTable,
871
1175
  {
872
1176
  "aria-label": typeof title === "string" ? title : "Records",
@@ -886,7 +1190,7 @@ function ValueHelpDialog({
886
1190
  }
887
1191
 
888
1192
  // src/components/forms/ValueHelpField.tsx
889
- import { jsx as jsx22, jsxs as jsxs19 } from "react/jsx-runtime";
1193
+ import { jsx as jsx24, jsxs as jsxs21 } from "react/jsx-runtime";
890
1194
  var defaultFormat = (row) => [row.id, row.name ?? row.label ?? row.text].filter(Boolean).join(" \u2014 ");
891
1195
  function ValueHelpField({
892
1196
  label,
@@ -906,10 +1210,10 @@ function ValueHelpField({
906
1210
  className,
907
1211
  style
908
1212
  }) {
909
- const [open, setOpen] = React7.useState(false);
910
- return /* @__PURE__ */ jsxs19("div", { className: cx(className), style, children: [
911
- /* @__PURE__ */ jsxs19("div", { style: { display: "flex", gap: "var(--sp-2)", alignItems: "flex-end" }, children: [
912
- /* @__PURE__ */ jsx22(
1213
+ const [open, setOpen] = React8.useState(false);
1214
+ return /* @__PURE__ */ jsxs21("div", { className: cx(className), style, children: [
1215
+ /* @__PURE__ */ jsxs21("div", { style: { display: "flex", gap: "var(--sp-2)", alignItems: "flex-end" }, children: [
1216
+ /* @__PURE__ */ jsx24(
913
1217
  Input,
914
1218
  {
915
1219
  label,
@@ -923,7 +1227,7 @@ function ValueHelpField({
923
1227
  errorMessage
924
1228
  }
925
1229
  ),
926
- allowsClear && value ? /* @__PURE__ */ jsx22(
1230
+ allowsClear && value ? /* @__PURE__ */ jsx24(
927
1231
  IconButton,
928
1232
  {
929
1233
  icon: "x",
@@ -933,7 +1237,7 @@ function ValueHelpField({
933
1237
  onPress: () => onChange?.(null)
934
1238
  }
935
1239
  ) : null,
936
- /* @__PURE__ */ jsx22(
1240
+ /* @__PURE__ */ jsx24(
937
1241
  IconButton,
938
1242
  {
939
1243
  icon: "search",
@@ -944,7 +1248,7 @@ function ValueHelpField({
944
1248
  }
945
1249
  )
946
1250
  ] }),
947
- /* @__PURE__ */ jsx22(
1251
+ /* @__PURE__ */ jsx24(
948
1252
  ValueHelpDialog,
949
1253
  {
950
1254
  isOpen: open,
@@ -959,26 +1263,136 @@ function ValueHelpField({
959
1263
  }
960
1264
 
961
1265
  // src/components/navigation/ShellBar.tsx
962
- import { jsx as jsx23, jsxs as jsxs20 } from "react/jsx-runtime";
1266
+ import { jsx as jsx25, jsxs as jsxs22 } from "react/jsx-runtime";
963
1267
  var initials2 = (name) => name.trim().split(/\s+/).slice(0, 2).map((p) => p[0]).join("").toUpperCase();
964
- function ShellBar({ product, monogram, title, onMenu, onSearch, actions, user, className, ...rest }) {
965
- return /* @__PURE__ */ jsxs20("header", { className: cx("pire-shellbar", className), ...rest, children: [
966
- onMenu ? /* @__PURE__ */ jsx23(IconButton, { icon: "menu", label: "Open navigation", variant: "inverse", size: "sm", onPress: onMenu }) : null,
967
- monogram ? /* @__PURE__ */ jsx23("span", { className: "pire-shellbar-mono", "aria-hidden": "true", children: monogram }) : null,
968
- product ? /* @__PURE__ */ jsx23("span", { className: "pire-shellbar-product", children: product }) : null,
969
- title ? /* @__PURE__ */ jsx23("span", { className: "pire-shellbar-title", children: title }) : null,
970
- /* @__PURE__ */ jsx23("span", { className: "pire-shellbar-spacer" }),
971
- onSearch ? /* @__PURE__ */ jsx23(IconButton, { icon: "search", label: "Search", variant: "inverse", size: "sm", onPress: onSearch }) : null,
1268
+ function ShellBar({
1269
+ product,
1270
+ monogram,
1271
+ title,
1272
+ onMenu,
1273
+ onSearch,
1274
+ menuLabel = "Open navigation",
1275
+ searchLabel = "Search",
1276
+ actions,
1277
+ user,
1278
+ className,
1279
+ ...rest
1280
+ }) {
1281
+ return /* @__PURE__ */ jsxs22("header", { className: cx("pire-shellbar", className), ...rest, children: [
1282
+ onMenu ? /* @__PURE__ */ jsx25(IconButton, { icon: "menu", label: menuLabel, variant: "inverse", size: "sm", onPress: onMenu }) : null,
1283
+ monogram ? /* @__PURE__ */ jsx25("span", { className: "pire-shellbar-mono", "aria-hidden": "true", children: monogram }) : null,
1284
+ product ? /* @__PURE__ */ jsx25("span", { className: "pire-shellbar-product", children: product }) : null,
1285
+ title ? /* @__PURE__ */ jsx25("span", { className: "pire-shellbar-title", children: title }) : null,
1286
+ /* @__PURE__ */ jsx25("span", { className: "pire-shellbar-spacer" }),
1287
+ onSearch ? /* @__PURE__ */ jsx25(IconButton, { icon: "search", label: searchLabel, variant: "inverse", size: "sm", onPress: onSearch }) : null,
972
1288
  actions,
973
- user ? /* @__PURE__ */ jsx23("span", { className: "pire-avatar", title: user, "aria-label": user, role: "img", children: initials2(user) }) : null
1289
+ user ? /* @__PURE__ */ jsx25("span", { className: "pire-avatar", title: user, "aria-label": user, role: "img", children: initials2(user) }) : null
974
1290
  ] });
975
1291
  }
976
1292
 
977
1293
  // src/components/navigation/SideNav.tsx
978
- import { Button as AriaButton8 } from "react-aria-components";
979
- import { jsx as jsx24, jsxs as jsxs21 } from "react/jsx-runtime";
980
- function SideNav({ groups, value, onChange, collapsed, footer, className, ...rest }) {
981
- return /* @__PURE__ */ jsxs21(
1294
+ import * as React9 from "react";
1295
+ import { Button as AriaButton9, Disclosure, DisclosureGroup, DisclosurePanel } from "react-aria-components";
1296
+ import { jsx as jsx26, jsxs as jsxs23 } from "react/jsx-runtime";
1297
+ function findActiveParent(groups, value) {
1298
+ if (value == null) return void 0;
1299
+ for (const group of groups) {
1300
+ for (const item of group.items) {
1301
+ if (item.items?.some((child) => child.id === value)) return item.id;
1302
+ }
1303
+ }
1304
+ return void 0;
1305
+ }
1306
+ function SideNav({
1307
+ groups,
1308
+ value,
1309
+ onChange,
1310
+ expandedIds,
1311
+ defaultExpandedIds,
1312
+ onExpandedChange,
1313
+ collapsed,
1314
+ footer,
1315
+ className,
1316
+ ...rest
1317
+ }) {
1318
+ const activeParent = findActiveParent(groups, value);
1319
+ const isControlled = expandedIds != null;
1320
+ const [ownExpanded, setOwnExpanded] = React9.useState(
1321
+ () => new Set(defaultExpandedIds ?? (activeParent ? [activeParent] : []))
1322
+ );
1323
+ const [lastValue, setLastValue] = React9.useState(value);
1324
+ if (value !== lastValue) {
1325
+ setLastValue(value);
1326
+ if (!isControlled && activeParent && !ownExpanded.has(activeParent)) {
1327
+ setOwnExpanded(new Set(ownExpanded).add(activeParent));
1328
+ }
1329
+ }
1330
+ const expanded = isControlled ? new Set(expandedIds) : ownExpanded;
1331
+ const commitExpanded = (next) => {
1332
+ if (!isControlled) setOwnExpanded(next);
1333
+ onExpandedChange?.([...next]);
1334
+ };
1335
+ const handleExpandedChange = (keys) => commitExpanded(new Set([...keys].map(String)));
1336
+ const toggleExpanded = (id) => {
1337
+ const next = new Set(expanded);
1338
+ if (!next.delete(id)) next.add(id);
1339
+ commitExpanded(next);
1340
+ };
1341
+ const renderRow = (item, onPress, isGroup) => {
1342
+ const selected = !isGroup && item.id === value;
1343
+ const button = /* @__PURE__ */ jsxs23(
1344
+ AriaButton9,
1345
+ {
1346
+ className: "pire-sidenav-item",
1347
+ "data-selected": selected ? "true" : void 0,
1348
+ "data-active-child": isGroup && item.id === activeParent ? "true" : void 0,
1349
+ "aria-current": selected ? "page" : void 0,
1350
+ onPress,
1351
+ children: [
1352
+ item.icon ? /* @__PURE__ */ jsx26(Icon, { name: item.icon, size: 16 }) : null,
1353
+ collapsed ? null : /* @__PURE__ */ jsx26("span", { children: item.label }),
1354
+ item.count != null && !collapsed ? /* @__PURE__ */ jsx26("span", { className: "pire-sidenav-count", children: item.count }) : null
1355
+ ]
1356
+ },
1357
+ item.id
1358
+ );
1359
+ return collapsed ? /* @__PURE__ */ jsx26(Tooltip, { label: item.label, placement: "right", children: button }, item.id) : button;
1360
+ };
1361
+ const renderSection = (item) => /* @__PURE__ */ jsxs23(Disclosure, { id: item.id, className: "pire-sidenav-section", children: [
1362
+ /* @__PURE__ */ jsxs23(
1363
+ AriaButton9,
1364
+ {
1365
+ slot: "trigger",
1366
+ className: "pire-sidenav-item",
1367
+ "data-kind": "group",
1368
+ "data-active-child": item.id === activeParent ? "true" : void 0,
1369
+ children: [
1370
+ item.icon ? /* @__PURE__ */ jsx26(Icon, { name: item.icon, size: 16 }) : null,
1371
+ /* @__PURE__ */ jsx26("span", { children: item.label }),
1372
+ item.count != null ? /* @__PURE__ */ jsx26("span", { className: "pire-sidenav-count", children: item.count }) : null,
1373
+ /* @__PURE__ */ jsx26(Icon, { name: "chevron-down", size: 16, className: "pire-sidenav-chevron" })
1374
+ ]
1375
+ }
1376
+ ),
1377
+ /* @__PURE__ */ jsx26(DisclosurePanel, { className: "pire-sidenav-subnav", children: item.items?.map((child) => {
1378
+ const selected = child.id === value;
1379
+ return /* @__PURE__ */ jsxs23(
1380
+ AriaButton9,
1381
+ {
1382
+ className: "pire-sidenav-item pire-sidenav-subitem",
1383
+ "data-selected": selected ? "true" : void 0,
1384
+ "aria-current": selected ? "page" : void 0,
1385
+ onPress: () => onChange?.(child.id),
1386
+ children: [
1387
+ /* @__PURE__ */ jsx26("span", { children: child.label }),
1388
+ child.count != null ? /* @__PURE__ */ jsx26("span", { className: "pire-sidenav-count", children: child.count }) : null
1389
+ ]
1390
+ },
1391
+ child.id
1392
+ );
1393
+ }) })
1394
+ ] }, item.id);
1395
+ return /* @__PURE__ */ jsxs23(
982
1396
  "nav",
983
1397
  {
984
1398
  className: cx("pire-sidenav", className),
@@ -986,29 +1400,28 @@ function SideNav({ groups, value, onChange, collapsed, footer, className, ...res
986
1400
  "aria-label": "Main navigation",
987
1401
  ...rest,
988
1402
  children: [
989
- groups.map((group, gi) => /* @__PURE__ */ jsxs21("div", { className: "pire-sidenav-group", children: [
990
- group.label && !collapsed ? /* @__PURE__ */ jsx24("div", { className: "pire-sidenav-label", children: group.label }) : null,
991
- group.items.map((item) => {
992
- const selected = item.id === value;
993
- const button = /* @__PURE__ */ jsxs21(
994
- AriaButton8,
1403
+ groups.map((group, gi) => {
1404
+ const hasSections = !collapsed && group.items.some((item) => item.items?.length);
1405
+ const rows = group.items.map((item) => {
1406
+ const isGroup = Boolean(item.items?.length);
1407
+ if (isGroup && !collapsed) return renderSection(item);
1408
+ return renderRow(item, () => isGroup ? toggleExpanded(item.id) : onChange?.(item.id), isGroup);
1409
+ });
1410
+ return /* @__PURE__ */ jsxs23("div", { className: "pire-sidenav-group", children: [
1411
+ group.label && !collapsed ? /* @__PURE__ */ jsx26("div", { className: "pire-sidenav-label", children: group.label }) : null,
1412
+ hasSections ? /* @__PURE__ */ jsx26(
1413
+ DisclosureGroup,
995
1414
  {
996
- className: "pire-sidenav-item",
997
- "data-selected": selected ? "true" : void 0,
998
- "aria-current": selected ? "page" : void 0,
999
- onPress: () => onChange?.(item.id),
1000
- children: [
1001
- item.icon ? /* @__PURE__ */ jsx24(Icon, { name: item.icon, size: 16 }) : null,
1002
- collapsed ? null : /* @__PURE__ */ jsx24("span", { children: item.label }),
1003
- item.count != null && !collapsed ? /* @__PURE__ */ jsx24("span", { className: "pire-sidenav-count", children: item.count }) : null
1004
- ]
1005
- },
1006
- item.id
1007
- );
1008
- return collapsed ? /* @__PURE__ */ jsx24(Tooltip, { label: item.label, placement: "right", children: button }, item.id) : button;
1009
- })
1010
- ] }, group.label ?? gi)),
1011
- footer ? /* @__PURE__ */ jsx24("div", { className: "pire-sidenav-footer", children: footer }) : null
1415
+ className: "pire-sidenav-tree",
1416
+ allowsMultipleExpanded: true,
1417
+ expandedKeys: expanded,
1418
+ onExpandedChange: handleExpandedChange,
1419
+ children: rows
1420
+ }
1421
+ ) : rows
1422
+ ] }, group.label ?? gi);
1423
+ }),
1424
+ footer ? /* @__PURE__ */ jsx26("div", { className: "pire-sidenav-footer", children: footer }) : null
1012
1425
  ]
1013
1426
  }
1014
1427
  );
@@ -1016,9 +1429,9 @@ function SideNav({ groups, value, onChange, collapsed, footer, className, ...res
1016
1429
 
1017
1430
  // src/components/navigation/Tabs.tsx
1018
1431
  import { Tabs as AriaTabs, TabList, Tab as AriaTab, TabPanel } from "react-aria-components";
1019
- import { jsx as jsx25, jsxs as jsxs22 } from "react/jsx-runtime";
1432
+ import { jsx as jsx27, jsxs as jsxs24 } from "react/jsx-runtime";
1020
1433
  function Tabs({ items, value, defaultValue, onChange, panels, className, style, ...rest }) {
1021
- return /* @__PURE__ */ jsxs22(
1434
+ return /* @__PURE__ */ jsxs24(
1022
1435
  AriaTabs,
1023
1436
  {
1024
1437
  className,
@@ -1027,12 +1440,12 @@ function Tabs({ items, value, defaultValue, onChange, panels, className, style,
1027
1440
  defaultSelectedKey: defaultValue,
1028
1441
  onSelectionChange: (k) => onChange?.(String(k)),
1029
1442
  children: [
1030
- /* @__PURE__ */ jsx25(TabList, { className: "pire-tablist", items, "aria-label": rest["aria-label"] ?? "Views", children: (item) => /* @__PURE__ */ jsxs22(AriaTab, { className: cx("pire-tab"), id: item.id, isDisabled: item.isDisabled, children: [
1031
- item.icon ? /* @__PURE__ */ jsx25(Icon, { name: item.icon, size: 16 }) : null,
1443
+ /* @__PURE__ */ jsx27(TabList, { className: "pire-tablist", items, "aria-label": rest["aria-label"] ?? "Views", children: (item) => /* @__PURE__ */ jsxs24(AriaTab, { className: cx("pire-tab"), id: item.id, isDisabled: item.isDisabled, children: [
1444
+ item.icon ? /* @__PURE__ */ jsx27(Icon, { name: item.icon, size: 16 }) : null,
1032
1445
  item.label,
1033
- item.count != null ? /* @__PURE__ */ jsx25("span", { className: "pire-tab-count", children: item.count }) : null
1446
+ item.count != null ? /* @__PURE__ */ jsx27("span", { className: "pire-tab-count", children: item.count }) : null
1034
1447
  ] }) }),
1035
- items.map((item) => /* @__PURE__ */ jsx25(TabPanel, { id: item.id, className: panels ? "pire-tabpanel" : void 0, children: panels?.[item.id] }, item.id))
1448
+ items.map((item) => /* @__PURE__ */ jsx27(TabPanel, { id: item.id, className: panels ? "pire-tabpanel" : void 0, children: panels?.[item.id] }, item.id))
1036
1449
  ]
1037
1450
  }
1038
1451
  );
@@ -1040,9 +1453,9 @@ function Tabs({ items, value, defaultValue, onChange, panels, className, style,
1040
1453
 
1041
1454
  // src/components/navigation/Breadcrumb.tsx
1042
1455
  import { Breadcrumbs as AriaBreadcrumbs, Breadcrumb as AriaBreadcrumb, Link } from "react-aria-components";
1043
- import { jsx as jsx26, jsxs as jsxs23 } from "react/jsx-runtime";
1456
+ import { jsx as jsx28, jsxs as jsxs25 } from "react/jsx-runtime";
1044
1457
  function Breadcrumb({ items, onNavigate, className, style }) {
1045
- return /* @__PURE__ */ jsx26(
1458
+ return /* @__PURE__ */ jsx28(
1046
1459
  AriaBreadcrumbs,
1047
1460
  {
1048
1461
  className: cx("pire-breadcrumbs", className),
@@ -1051,9 +1464,9 @@ function Breadcrumb({ items, onNavigate, className, style }) {
1051
1464
  onAction: (key) => onNavigate?.(String(key)),
1052
1465
  children: (item) => {
1053
1466
  const last = items[items.length - 1] === item;
1054
- return /* @__PURE__ */ jsxs23(AriaBreadcrumb, { className: "pire-breadcrumb", id: item.id ?? item.label, children: [
1055
- last ? item.label : /* @__PURE__ */ jsx26(Link, { href: item.href, children: item.label }),
1056
- last ? null : /* @__PURE__ */ jsx26(Icon, { name: "chevron-right", size: 12, style: { color: "var(--text-tertiary)" } })
1467
+ return /* @__PURE__ */ jsxs25(AriaBreadcrumb, { className: "pire-breadcrumb", id: item.id ?? item.label, children: [
1468
+ last ? item.label : /* @__PURE__ */ jsx28(Link, { href: item.href, children: item.label }),
1469
+ last ? null : /* @__PURE__ */ jsx28(Icon, { name: "chevron-right", size: 12, style: { color: "var(--text-tertiary)" } })
1057
1470
  ] });
1058
1471
  }
1059
1472
  }
@@ -1061,7 +1474,7 @@ function Breadcrumb({ items, onNavigate, className, style }) {
1061
1474
  }
1062
1475
 
1063
1476
  // src/components/navigation/Pagination.tsx
1064
- import { jsx as jsx27, jsxs as jsxs24 } from "react/jsx-runtime";
1477
+ import { jsx as jsx29, jsxs as jsxs26 } from "react/jsx-runtime";
1065
1478
  function Pagination({
1066
1479
  page = 1,
1067
1480
  pageSize = 25,
@@ -1075,15 +1488,15 @@ function Pagination({
1075
1488
  const pages = Math.max(1, Math.ceil(total / pageSize));
1076
1489
  const from = total === 0 ? 0 : (page - 1) * pageSize + 1;
1077
1490
  const to = Math.min(total, page * pageSize);
1078
- return /* @__PURE__ */ jsxs24("nav", { className: cx("pire-pagination", className), style, "aria-label": "Pagination", children: [
1079
- /* @__PURE__ */ jsxs24("span", { className: "pire-pagination-count", children: [
1491
+ return /* @__PURE__ */ jsxs26("nav", { className: cx("pire-pagination", className), style, "aria-label": "Pagination", children: [
1492
+ /* @__PURE__ */ jsxs26("span", { className: "pire-pagination-count", children: [
1080
1493
  from.toLocaleString(),
1081
1494
  "\u2013",
1082
1495
  to.toLocaleString(),
1083
1496
  " of ",
1084
1497
  total.toLocaleString()
1085
1498
  ] }),
1086
- /* @__PURE__ */ jsx27(
1499
+ /* @__PURE__ */ jsx29(
1087
1500
  IconButton,
1088
1501
  {
1089
1502
  icon: "chevron-left",
@@ -1094,13 +1507,13 @@ function Pagination({
1094
1507
  onPress: () => onPageChange?.(page - 1)
1095
1508
  }
1096
1509
  ),
1097
- /* @__PURE__ */ jsxs24("span", { className: "pire-pagination-count", "aria-live": "polite", children: [
1510
+ /* @__PURE__ */ jsxs26("span", { className: "pire-pagination-count", "aria-live": "polite", children: [
1098
1511
  "Page ",
1099
1512
  page,
1100
1513
  " of ",
1101
1514
  pages
1102
1515
  ] }),
1103
- /* @__PURE__ */ jsx27(
1516
+ /* @__PURE__ */ jsx29(
1104
1517
  IconButton,
1105
1518
  {
1106
1519
  icon: "chevron-right",
@@ -1111,7 +1524,7 @@ function Pagination({
1111
1524
  onPress: () => onPageChange?.(page + 1)
1112
1525
  }
1113
1526
  ),
1114
- onPageSizeChange ? /* @__PURE__ */ jsx27(
1527
+ onPageSizeChange ? /* @__PURE__ */ jsx29(
1115
1528
  Select,
1116
1529
  {
1117
1530
  "aria-label": "Rows per page",
@@ -1127,7 +1540,7 @@ function Pagination({
1127
1540
  }
1128
1541
 
1129
1542
  // src/components/feedback/InlineMessage.tsx
1130
- import { jsx as jsx28, jsxs as jsxs25 } from "react/jsx-runtime";
1543
+ import { jsx as jsx30, jsxs as jsxs27 } from "react/jsx-runtime";
1131
1544
  var KIND_ICON = {
1132
1545
  info: "info",
1133
1546
  success: "check-circle-2",
@@ -1136,7 +1549,7 @@ var KIND_ICON = {
1136
1549
  };
1137
1550
  function InlineMessage({ kind = "info", title, action, onClose, children, className, ...rest }) {
1138
1551
  const assertive = kind === "error" || kind === "warning";
1139
- return /* @__PURE__ */ jsxs25(
1552
+ return /* @__PURE__ */ jsxs27(
1140
1553
  "div",
1141
1554
  {
1142
1555
  className: cx("pire-msg", className),
@@ -1145,21 +1558,21 @@ function InlineMessage({ kind = "info", title, action, onClose, children, classN
1145
1558
  "aria-live": assertive ? "assertive" : "polite",
1146
1559
  ...rest,
1147
1560
  children: [
1148
- /* @__PURE__ */ jsx28(Icon, { name: KIND_ICON[kind], size: 16, style: { marginTop: 2 } }),
1149
- /* @__PURE__ */ jsxs25("div", { style: { flex: 1, display: "flex", flexDirection: "column", gap: "var(--sp-1)" }, children: [
1150
- title ? /* @__PURE__ */ jsx28("span", { className: "pire-msg-title", children: title }) : null,
1151
- children ? /* @__PURE__ */ jsx28("span", { className: "pire-msg-body", children }) : null,
1561
+ /* @__PURE__ */ jsx30(Icon, { name: KIND_ICON[kind], size: 16, style: { marginTop: 2 } }),
1562
+ /* @__PURE__ */ jsxs27("div", { style: { flex: 1, display: "flex", flexDirection: "column", gap: "var(--sp-1)" }, children: [
1563
+ title ? /* @__PURE__ */ jsx30("span", { className: "pire-msg-title", children: title }) : null,
1564
+ children ? /* @__PURE__ */ jsx30("span", { className: "pire-msg-body", children }) : null,
1152
1565
  action
1153
1566
  ] }),
1154
- onClose ? /* @__PURE__ */ jsx28(IconButton, { icon: "x", label: "Dismiss message", size: "sm", onPress: onClose }) : null
1567
+ onClose ? /* @__PURE__ */ jsx30(IconButton, { icon: "x", label: "Dismiss message", size: "sm", onPress: onClose }) : null
1155
1568
  ]
1156
1569
  }
1157
1570
  );
1158
1571
  }
1159
1572
 
1160
1573
  // src/components/feedback/ProgressBar.tsx
1161
- import { ProgressBar as AriaProgressBar, Label as Label7 } from "react-aria-components";
1162
- import { Fragment as Fragment2, jsx as jsx29, jsxs as jsxs26 } from "react/jsx-runtime";
1574
+ import { ProgressBar as AriaProgressBar, Label as Label9 } from "react-aria-components";
1575
+ import { Fragment as Fragment2, jsx as jsx31, jsxs as jsxs28 } from "react/jsx-runtime";
1163
1576
  function ProgressBar({
1164
1577
  value = 0,
1165
1578
  minValue = 0,
@@ -1172,7 +1585,7 @@ function ProgressBar({
1172
1585
  className,
1173
1586
  style
1174
1587
  }) {
1175
- return /* @__PURE__ */ jsx29(
1588
+ return /* @__PURE__ */ jsx31(
1176
1589
  AriaProgressBar,
1177
1590
  {
1178
1591
  className: cx("pire-progress", className),
@@ -1183,20 +1596,20 @@ function ProgressBar({
1183
1596
  maxValue,
1184
1597
  isIndeterminate,
1185
1598
  style,
1186
- children: ({ percentage, valueText }) => /* @__PURE__ */ jsxs26(Fragment2, { children: [
1187
- label || showValue ? /* @__PURE__ */ jsxs26("div", { className: "pire-progress-head", children: [
1188
- label ? /* @__PURE__ */ jsx29(Label7, { children: label }) : /* @__PURE__ */ jsx29("span", {}),
1189
- showValue && !isIndeterminate ? /* @__PURE__ */ jsx29("span", { className: "pire-numeric", children: valueText }) : null
1599
+ children: ({ percentage, valueText }) => /* @__PURE__ */ jsxs28(Fragment2, { children: [
1600
+ label || showValue ? /* @__PURE__ */ jsxs28("div", { className: "pire-progress-head", children: [
1601
+ label ? /* @__PURE__ */ jsx31(Label9, { children: label }) : /* @__PURE__ */ jsx31("span", {}),
1602
+ showValue && !isIndeterminate ? /* @__PURE__ */ jsx31("span", { className: "pire-numeric", children: valueText }) : null
1190
1603
  ] }) : null,
1191
- /* @__PURE__ */ jsx29("div", { className: "pire-progress-track", children: /* @__PURE__ */ jsx29("div", { className: "pire-progress-fill", style: { width: `${isIndeterminate ? 40 : percentage}%` } }) })
1604
+ /* @__PURE__ */ jsx31("div", { className: "pire-progress-track", children: /* @__PURE__ */ jsx31("div", { className: "pire-progress-fill", style: { width: `${isIndeterminate ? 40 : percentage}%` } }) })
1192
1605
  ] })
1193
1606
  }
1194
1607
  );
1195
1608
  }
1196
1609
 
1197
1610
  // src/components/feedback/Toast.tsx
1198
- import * as React8 from "react";
1199
- import { jsx as jsx30, jsxs as jsxs27 } from "react/jsx-runtime";
1611
+ import * as React10 from "react";
1612
+ import { jsx as jsx32, jsxs as jsxs29 } from "react/jsx-runtime";
1200
1613
  var KIND_ICON2 = {
1201
1614
  info: "info",
1202
1615
  success: "check-circle-2",
@@ -1204,7 +1617,7 @@ var KIND_ICON2 = {
1204
1617
  error: "alert-octagon"
1205
1618
  };
1206
1619
  function Toast({ kind = "success", onClose, position = "bottom-center", children, className, ...rest }) {
1207
- return /* @__PURE__ */ jsxs27(
1620
+ return /* @__PURE__ */ jsxs29(
1208
1621
  "div",
1209
1622
  {
1210
1623
  className: cx("pire-toast", className),
@@ -1213,39 +1626,84 @@ function Toast({ kind = "success", onClose, position = "bottom-center", children
1213
1626
  "aria-live": kind === "error" ? "assertive" : "polite",
1214
1627
  ...rest,
1215
1628
  children: [
1216
- /* @__PURE__ */ jsx30(Icon, { name: KIND_ICON2[kind], size: 16 }),
1217
- /* @__PURE__ */ jsx30("span", { style: { flex: 1 }, children }),
1218
- onClose ? /* @__PURE__ */ jsx30(IconButton, { icon: "x", label: "Dismiss", size: "sm", variant: "inverse", onPress: onClose }) : null
1629
+ /* @__PURE__ */ jsx32(Icon, { name: KIND_ICON2[kind], size: 16 }),
1630
+ /* @__PURE__ */ jsx32("span", { style: { flex: 1 }, children }),
1631
+ onClose ? /* @__PURE__ */ jsx32(IconButton, { icon: "x", label: "Dismiss", size: "sm", variant: "inverse", onPress: onClose }) : null
1219
1632
  ]
1220
1633
  }
1221
1634
  );
1222
1635
  }
1223
- var ToastContext = React8.createContext(null);
1636
+ var ToastContext = React10.createContext(null);
1224
1637
  function ToastProvider({ children, timeout = 6e3 }) {
1225
- const [toasts, setToasts] = React8.useState([]);
1226
- const close = React8.useCallback((id) => setToasts((t) => t.filter((x) => x.id !== id)), []);
1227
- const add = React8.useCallback((toast) => {
1638
+ const [toasts, setToasts] = React10.useState([]);
1639
+ const close = React10.useCallback((id) => setToasts((t) => t.filter((x) => x.id !== id)), []);
1640
+ const add = React10.useCallback((toast) => {
1228
1641
  const id = Math.random().toString(36).slice(2);
1229
1642
  setToasts((t) => [...t, { ...toast, id }]);
1230
1643
  const ms = toast.timeout ?? timeout;
1231
1644
  if (ms > 0) setTimeout(() => close(id), ms);
1232
1645
  return id;
1233
1646
  }, [close, timeout]);
1234
- const value = React8.useMemo(() => ({ add, close }), [add, close]);
1235
- return /* @__PURE__ */ jsxs27(ToastContext.Provider, { value, children: [
1647
+ const value = React10.useMemo(() => ({ add, close }), [add, close]);
1648
+ return /* @__PURE__ */ jsxs29(ToastContext.Provider, { value, children: [
1236
1649
  children,
1237
- /* @__PURE__ */ jsx30("div", { className: "pire-toast-region", role: "region", "aria-label": "Notifications", children: toasts.map((t) => /* @__PURE__ */ jsx30(Toast, { kind: t.kind, onClose: () => close(t.id), style: { position: "static", transform: "none" }, children: t.message }, t.id)) })
1650
+ /* @__PURE__ */ jsx32("div", { className: "pire-toast-region", role: "region", "aria-label": "Notifications", children: toasts.map((t) => /* @__PURE__ */ jsx32(Toast, { kind: t.kind, onClose: () => close(t.id), style: { position: "static", transform: "none" }, children: t.message }, t.id)) })
1238
1651
  ] });
1239
1652
  }
1240
1653
  function useToast() {
1241
- const ctx = React8.useContext(ToastContext);
1654
+ const ctx = React10.useContext(ToastContext);
1242
1655
  if (!ctx) throw new Error("useToast must be used inside <ToastProvider>");
1243
1656
  return ctx;
1244
1657
  }
1245
1658
 
1659
+ // src/components/feedback/Skeleton.tsx
1660
+ import { jsx as jsx33 } from "react/jsx-runtime";
1661
+ function Skeleton({ shape = "text", width, height, className, style, ...rest }) {
1662
+ return /* @__PURE__ */ jsx33(
1663
+ "div",
1664
+ {
1665
+ className: cx("pire-skeleton", className),
1666
+ "data-shape": shape,
1667
+ "aria-hidden": "true",
1668
+ style: { width, height, ...style },
1669
+ ...rest
1670
+ }
1671
+ );
1672
+ }
1673
+ var BAR_WIDTHS = ["72%", "54%", "86%", "63%"];
1674
+ function SkeletonTableRow({ columns, density = "regular", className, style, ...rest }) {
1675
+ const cells = typeof columns === "number" ? Array.from({ length: columns }, () => ({})) : columns;
1676
+ return /* @__PURE__ */ jsx33(
1677
+ "div",
1678
+ {
1679
+ className: cx("pire-skeleton-row", className),
1680
+ "data-density": density,
1681
+ "aria-hidden": "true",
1682
+ style,
1683
+ ...rest,
1684
+ children: cells.map((c, i) => {
1685
+ const align = c.numeric ? "right" : c.align ?? "left";
1686
+ return (
1687
+ // biome-ignore lint/suspicious/noArrayIndexKey: columns are positional and never reordered.
1688
+ /* @__PURE__ */ jsx33(
1689
+ "div",
1690
+ {
1691
+ className: "pire-skeleton-cell",
1692
+ "data-align": align,
1693
+ style: { width: c.width, flex: c.width ? "0 0 auto" : void 0 },
1694
+ children: /* @__PURE__ */ jsx33(Skeleton, { width: BAR_WIDTHS[i % BAR_WIDTHS.length] })
1695
+ },
1696
+ i
1697
+ )
1698
+ );
1699
+ })
1700
+ }
1701
+ );
1702
+ }
1703
+
1246
1704
  // src/components/data/KpiTile.tsx
1247
- import { Button as AriaButton9 } from "react-aria-components";
1248
- import { Fragment as Fragment3, jsx as jsx31, jsxs as jsxs28 } from "react/jsx-runtime";
1705
+ import { Button as AriaButton10 } from "react-aria-components";
1706
+ import { Fragment as Fragment3, jsx as jsx34, jsxs as jsxs30 } from "react/jsx-runtime";
1249
1707
  function KpiTile({
1250
1708
  label,
1251
1709
  value,
@@ -1261,50 +1719,50 @@ function KpiTile({
1261
1719
  style
1262
1720
  }) {
1263
1721
  const tone = deltaTone ?? (deltaDirection === "down" ? "negative" : "positive");
1264
- const body = /* @__PURE__ */ jsxs28(Fragment3, { children: [
1265
- /* @__PURE__ */ jsxs28("span", { className: "pire-kpi-label", children: [
1266
- icon ? /* @__PURE__ */ jsx31(Icon, { name: icon, size: 16 }) : null,
1722
+ const body = /* @__PURE__ */ jsxs30(Fragment3, { children: [
1723
+ /* @__PURE__ */ jsxs30("span", { className: "pire-kpi-label", children: [
1724
+ icon ? /* @__PURE__ */ jsx34(Icon, { name: icon, size: 16 }) : null,
1267
1725
  label
1268
1726
  ] }),
1269
- /* @__PURE__ */ jsxs28("span", { className: "pire-kpi-value", children: [
1727
+ /* @__PURE__ */ jsxs30("span", { className: "pire-kpi-value", children: [
1270
1728
  value,
1271
- unit ? /* @__PURE__ */ jsx31("span", { className: "pire-kpi-unit", children: unit }) : null
1729
+ unit ? /* @__PURE__ */ jsx34("span", { className: "pire-kpi-unit", children: unit }) : null
1272
1730
  ] }),
1273
- delta ? /* @__PURE__ */ jsxs28("span", { className: "pire-kpi-delta", "data-tone": tone, children: [
1274
- deltaDirection ? /* @__PURE__ */ jsx31(Icon, { name: deltaDirection === "up" ? "trending-up" : "trending-down", size: 12 }) : null,
1731
+ delta ? /* @__PURE__ */ jsxs30("span", { className: "pire-kpi-delta", "data-tone": tone, children: [
1732
+ deltaDirection ? /* @__PURE__ */ jsx34(Icon, { name: deltaDirection === "up" ? "trending-up" : "trending-down", size: 12 }) : null,
1275
1733
  delta
1276
1734
  ] }) : null,
1277
- footnote ? /* @__PURE__ */ jsx31("span", { className: "pire-kpi-foot", children: footnote }) : null
1735
+ footnote ? /* @__PURE__ */ jsx34("span", { className: "pire-kpi-foot", children: footnote }) : null
1278
1736
  ] });
1279
1737
  const props = { className: cx("pire-kpi", className), "data-status": status, style };
1280
- return onPress ? /* @__PURE__ */ jsx31(AriaButton9, { ...props, "data-pressable": "true", onPress, children: body }) : /* @__PURE__ */ jsx31("div", { ...props, children: body });
1738
+ return onPress ? /* @__PURE__ */ jsx34(AriaButton10, { ...props, "data-pressable": "true", onPress, children: body }) : /* @__PURE__ */ jsx34("div", { ...props, children: body });
1281
1739
  }
1282
1740
 
1283
1741
  // src/components/data/ObjectHeader.tsx
1284
- import { jsx as jsx32, jsxs as jsxs29 } from "react/jsx-runtime";
1742
+ import { jsx as jsx35, jsxs as jsxs31 } from "react/jsx-runtime";
1285
1743
  function ObjectHeader({ title, subtitle, id, breadcrumb, badge, facts, actions, className, ...rest }) {
1286
- return /* @__PURE__ */ jsxs29("header", { className: cx("pire-objheader", className), ...rest, children: [
1744
+ return /* @__PURE__ */ jsxs31("header", { className: cx("pire-objheader", className), ...rest, children: [
1287
1745
  breadcrumb,
1288
- /* @__PURE__ */ jsxs29("div", { className: "pire-objheader-row", children: [
1289
- /* @__PURE__ */ jsxs29("div", { style: { minWidth: 0 }, children: [
1290
- /* @__PURE__ */ jsx32("h1", { className: "pire-objheader-title", children: title }),
1291
- subtitle || id ? /* @__PURE__ */ jsxs29("div", { className: "pire-objheader-sub", children: [
1746
+ /* @__PURE__ */ jsxs31("div", { className: "pire-objheader-row", children: [
1747
+ /* @__PURE__ */ jsxs31("div", { style: { minWidth: 0 }, children: [
1748
+ /* @__PURE__ */ jsx35("h1", { className: "pire-objheader-title", children: title }),
1749
+ subtitle || id ? /* @__PURE__ */ jsxs31("div", { className: "pire-objheader-sub", children: [
1292
1750
  subtitle,
1293
- id ? /* @__PURE__ */ jsx32("span", { className: "pire-objheader-id", children: id }) : null
1751
+ id ? /* @__PURE__ */ jsx35("span", { className: "pire-objheader-id", children: id }) : null
1294
1752
  ] }) : null
1295
1753
  ] }),
1296
1754
  badge,
1297
- actions ? /* @__PURE__ */ jsx32("div", { className: "pire-objheader-actions", children: actions }) : null
1755
+ actions ? /* @__PURE__ */ jsx35("div", { className: "pire-objheader-actions", children: actions }) : null
1298
1756
  ] }),
1299
- facts?.length ? /* @__PURE__ */ jsx32("dl", { className: "pire-facts", style: { margin: 0 }, children: facts.map((fact) => /* @__PURE__ */ jsxs29("div", { children: [
1300
- /* @__PURE__ */ jsx32("dt", { className: "pire-fact-label", children: fact.label }),
1301
- /* @__PURE__ */ jsx32("dd", { className: "pire-fact-value", "data-numeric": fact.numeric ? "true" : void 0, style: { margin: 0 }, children: fact.value })
1757
+ facts?.length ? /* @__PURE__ */ jsx35("dl", { className: "pire-facts", style: { margin: 0 }, children: facts.map((fact) => /* @__PURE__ */ jsxs31("div", { children: [
1758
+ /* @__PURE__ */ jsx35("dt", { className: "pire-fact-label", children: fact.label }),
1759
+ /* @__PURE__ */ jsx35("dd", { className: "pire-fact-value", "data-numeric": fact.numeric ? "true" : void 0, style: { margin: 0 }, children: fact.value })
1302
1760
  ] }, fact.label)) }) : null
1303
1761
  ] });
1304
1762
  }
1305
1763
 
1306
1764
  // src/components/data/FilterBar.tsx
1307
- import { jsx as jsx33, jsxs as jsxs30 } from "react/jsx-runtime";
1765
+ import { jsx as jsx36, jsxs as jsxs32 } from "react/jsx-runtime";
1308
1766
  function FilterBar({
1309
1767
  children,
1310
1768
  activeFilters = [],
@@ -1316,115 +1774,115 @@ function FilterBar({
1316
1774
  className,
1317
1775
  ...rest
1318
1776
  }) {
1319
- return /* @__PURE__ */ jsxs30("section", { className: cx("pire-filterbar", className), "aria-label": "Filters", ...rest, children: [
1320
- /* @__PURE__ */ jsxs30("div", { className: "pire-filterbar-controls", children: [
1777
+ return /* @__PURE__ */ jsxs32("section", { className: cx("pire-filterbar", className), "aria-label": "Filters", ...rest, children: [
1778
+ /* @__PURE__ */ jsxs32("div", { className: "pire-filterbar-controls", children: [
1321
1779
  children,
1322
- onGo ? /* @__PURE__ */ jsx33(Button, { variant: "primary", onPress: onGo, children: "Go" }) : null
1780
+ onGo ? /* @__PURE__ */ jsx36(Button, { variant: "primary", onPress: onGo, children: "Go" }) : null
1323
1781
  ] }),
1324
- activeFilters.length || resultLabel || actions ? /* @__PURE__ */ jsxs30("div", { className: "pire-filterbar-foot", children: [
1325
- activeFilters.map((filter) => /* @__PURE__ */ jsx33(Tag, { onRemove: onRemoveFilter ? () => onRemoveFilter(filter.id) : void 0, children: filter.label }, filter.id)),
1326
- activeFilters.length && onClear ? /* @__PURE__ */ jsx33(Button, { variant: "tertiary", size: "sm", onPress: onClear, children: "Clear all" }) : null,
1327
- resultLabel ? /* @__PURE__ */ jsx33("span", { className: "pire-filterbar-result", "aria-live": "polite", children: resultLabel }) : null,
1328
- actions ? /* @__PURE__ */ jsx33("div", { className: "pire-filterbar-actions", children: actions }) : null
1782
+ activeFilters.length || resultLabel || actions ? /* @__PURE__ */ jsxs32("div", { className: "pire-filterbar-foot", children: [
1783
+ activeFilters.map((filter) => /* @__PURE__ */ jsx36(Tag, { onRemove: onRemoveFilter ? () => onRemoveFilter(filter.id) : void 0, children: filter.label }, filter.id)),
1784
+ activeFilters.length && onClear ? /* @__PURE__ */ jsx36(Button, { variant: "tertiary", size: "sm", onPress: onClear, children: "Clear all" }) : null,
1785
+ resultLabel ? /* @__PURE__ */ jsx36("span", { className: "pire-filterbar-result", "aria-live": "polite", children: resultLabel }) : null,
1786
+ actions ? /* @__PURE__ */ jsx36("div", { className: "pire-filterbar-actions", children: actions }) : null
1329
1787
  ] }) : null
1330
1788
  ] });
1331
1789
  }
1332
1790
 
1333
1791
  // src/components/data/DescriptionList.tsx
1334
- import { jsx as jsx34, jsxs as jsxs31 } from "react/jsx-runtime";
1792
+ import { jsx as jsx37, jsxs as jsxs33 } from "react/jsx-runtime";
1335
1793
  function DescriptionList({ items, layout = "rows", columns = 3, className, style, ...rest }) {
1336
- return /* @__PURE__ */ jsx34(
1794
+ return /* @__PURE__ */ jsx37(
1337
1795
  "dl",
1338
1796
  {
1339
1797
  className: cx("pire-dl", className),
1340
1798
  "data-layout": layout,
1341
1799
  style: { ...layout === "grid" ? { "--pire-dl-cols": columns } : null, ...style },
1342
1800
  ...rest,
1343
- children: items.map((item, i) => /* @__PURE__ */ jsxs31("div", { className: "pire-dl-row", "data-emphasis": item.emphasis ? "true" : void 0, children: [
1344
- /* @__PURE__ */ jsxs31("dt", { className: "pire-dl-term", children: [
1801
+ children: items.map((item, i) => /* @__PURE__ */ jsxs33("div", { className: "pire-dl-row", "data-emphasis": item.emphasis ? "true" : void 0, children: [
1802
+ /* @__PURE__ */ jsxs33("dt", { className: "pire-dl-term", children: [
1345
1803
  item.label,
1346
1804
  item.hint
1347
1805
  ] }),
1348
- /* @__PURE__ */ jsx34("dd", { className: "pire-dl-value", "data-numeric": item.numeric ? "true" : void 0, children: item.value })
1806
+ /* @__PURE__ */ jsx37("dd", { className: "pire-dl-value", "data-numeric": item.numeric ? "true" : void 0, children: item.value })
1349
1807
  ] }, i))
1350
1808
  }
1351
1809
  );
1352
1810
  }
1353
1811
 
1354
1812
  // src/components/data/Timeline.tsx
1355
- import { jsx as jsx35, jsxs as jsxs32 } from "react/jsx-runtime";
1813
+ import { jsx as jsx38, jsxs as jsxs34 } from "react/jsx-runtime";
1356
1814
  function Timeline({ entries, reverse = false, className, ...rest }) {
1357
1815
  const list = reverse ? [...entries].reverse() : entries;
1358
- return /* @__PURE__ */ jsx35("ol", { className: cx("pire-timeline", className), ...rest, children: list.map((entry, i) => /* @__PURE__ */ jsxs32("li", { className: "pire-timeline-item", children: [
1359
- /* @__PURE__ */ jsx35("span", { className: "pire-timeline-time", children: entry.time }),
1360
- /* @__PURE__ */ jsx35("span", { className: "pire-timeline-text", children: entry.event }),
1361
- entry.actor ? /* @__PURE__ */ jsx35("span", { className: "pire-timeline-actor", children: entry.actor }) : null
1816
+ return /* @__PURE__ */ jsx38("ol", { className: cx("pire-timeline", className), ...rest, children: list.map((entry, i) => /* @__PURE__ */ jsxs34("li", { className: "pire-timeline-item", children: [
1817
+ /* @__PURE__ */ jsx38("span", { className: "pire-timeline-time", children: entry.time }),
1818
+ /* @__PURE__ */ jsx38("span", { className: "pire-timeline-text", children: entry.event }),
1819
+ entry.actor ? /* @__PURE__ */ jsx38("span", { className: "pire-timeline-actor", children: entry.actor }) : null
1362
1820
  ] }, entry.id ?? i)) });
1363
1821
  }
1364
1822
 
1365
1823
  // src/components/data/LinkList.tsx
1366
- import { Button as AriaButton10 } from "react-aria-components";
1367
- import { jsx as jsx36, jsxs as jsxs33 } from "react/jsx-runtime";
1824
+ import { Button as AriaButton11 } from "react-aria-components";
1825
+ import { jsx as jsx39, jsxs as jsxs35 } from "react/jsx-runtime";
1368
1826
  function LinkList({ items, onSelect, className, ...rest }) {
1369
- return /* @__PURE__ */ jsx36("div", { className: cx("pire-linklist", className), role: "list", ...rest, children: items.map((item) => /* @__PURE__ */ jsxs33(AriaButton10, { className: "pire-linklist-item", onPress: () => onSelect?.(item.id), children: [
1370
- item.icon ? /* @__PURE__ */ jsx36(Icon, { name: item.icon, size: 16, style: { color: "var(--text-secondary)" } }) : null,
1371
- item.key ? /* @__PURE__ */ jsx36("span", { className: "pire-linklist-key", children: item.key }) : null,
1372
- item.text ? /* @__PURE__ */ jsx36("span", { className: "pire-linklist-text", children: item.text }) : null,
1827
+ return /* @__PURE__ */ jsx39("div", { className: cx("pire-linklist", className), role: "list", ...rest, children: items.map((item) => /* @__PURE__ */ jsxs35(AriaButton11, { className: "pire-linklist-item", onPress: () => onSelect?.(item.id), children: [
1828
+ item.icon ? /* @__PURE__ */ jsx39(Icon, { name: item.icon, size: 16, style: { color: "var(--text-secondary)" } }) : null,
1829
+ item.key ? /* @__PURE__ */ jsx39("span", { className: "pire-linklist-key", children: item.key }) : null,
1830
+ item.text ? /* @__PURE__ */ jsx39("span", { className: "pire-linklist-text", children: item.text }) : null,
1373
1831
  item.trailing
1374
1832
  ] }, item.id)) });
1375
1833
  }
1376
1834
 
1377
1835
  // src/components/layout/PageHeader.tsx
1378
- import { jsx as jsx37, jsxs as jsxs34 } from "react/jsx-runtime";
1836
+ import { jsx as jsx40, jsxs as jsxs36 } from "react/jsx-runtime";
1379
1837
  function PageHeader({ title, subtitle, actions, className, ...rest }) {
1380
- return /* @__PURE__ */ jsxs34("header", { className: cx("pire-pageheader", className), ...rest, children: [
1381
- /* @__PURE__ */ jsxs34("div", { style: { minWidth: 0 }, children: [
1382
- /* @__PURE__ */ jsx37("h1", { className: "pire-pageheader-title", children: title }),
1383
- subtitle ? /* @__PURE__ */ jsx37("p", { className: "pire-pageheader-sub", children: subtitle }) : null
1838
+ return /* @__PURE__ */ jsxs36("header", { className: cx("pire-pageheader", className), ...rest, children: [
1839
+ /* @__PURE__ */ jsxs36("div", { style: { minWidth: 0 }, children: [
1840
+ /* @__PURE__ */ jsx40("h1", { className: "pire-pageheader-title", children: title }),
1841
+ subtitle ? /* @__PURE__ */ jsx40("p", { className: "pire-pageheader-sub", children: subtitle }) : null
1384
1842
  ] }),
1385
- actions ? /* @__PURE__ */ jsx37("div", { className: "pire-pageheader-actions", children: actions }) : null
1843
+ actions ? /* @__PURE__ */ jsx40("div", { className: "pire-pageheader-actions", children: actions }) : null
1386
1844
  ] });
1387
1845
  }
1388
1846
 
1389
1847
  // src/components/layout/SectionHeader.tsx
1390
- import { jsx as jsx38, jsxs as jsxs35 } from "react/jsx-runtime";
1848
+ import { jsx as jsx41, jsxs as jsxs37 } from "react/jsx-runtime";
1391
1849
  function SectionHeader({ title, meta, actions, className, ...rest }) {
1392
- return /* @__PURE__ */ jsxs35("div", { className: cx("pire-sectionhead", className), ...rest, children: [
1393
- /* @__PURE__ */ jsx38("span", { className: "pire-eyebrow", children: title }),
1394
- meta ? /* @__PURE__ */ jsx38("span", { style: { font: "var(--type-caption)", color: "var(--text-tertiary)" }, children: meta }) : null,
1395
- actions ? /* @__PURE__ */ jsx38("div", { className: "pire-sectionhead-actions", children: actions }) : null
1850
+ return /* @__PURE__ */ jsxs37("div", { className: cx("pire-sectionhead", className), ...rest, children: [
1851
+ /* @__PURE__ */ jsx41("span", { className: "pire-eyebrow", children: title }),
1852
+ meta ? /* @__PURE__ */ jsx41("span", { style: { font: "var(--type-caption)", color: "var(--text-tertiary)" }, children: meta }) : null,
1853
+ actions ? /* @__PURE__ */ jsx41("div", { className: "pire-sectionhead-actions", children: actions }) : null
1396
1854
  ] });
1397
1855
  }
1398
1856
 
1399
1857
  // src/components/layout/SelectionBar.tsx
1400
- import { jsx as jsx39, jsxs as jsxs36 } from "react/jsx-runtime";
1858
+ import { jsx as jsx42, jsxs as jsxs38 } from "react/jsx-runtime";
1401
1859
  function SelectionBar({ count, noun = "record", children, actions, className, ...rest }) {
1402
1860
  if (!count) return null;
1403
- return /* @__PURE__ */ jsxs36("div", { className: cx("pire-selectionbar", className), role: "status", "aria-live": "polite", ...rest, children: [
1404
- /* @__PURE__ */ jsxs36("span", { className: "pire-selectionbar-count", children: [
1861
+ return /* @__PURE__ */ jsxs38("div", { className: cx("pire-selectionbar", className), role: "status", "aria-live": "polite", ...rest, children: [
1862
+ /* @__PURE__ */ jsxs38("span", { className: "pire-selectionbar-count", children: [
1405
1863
  count.toLocaleString(),
1406
1864
  " ",
1407
1865
  noun,
1408
1866
  count === 1 ? "" : "s",
1409
1867
  " selected"
1410
1868
  ] }),
1411
- children ? /* @__PURE__ */ jsx39("span", { style: { color: "var(--text-secondary)", font: "var(--type-caption)" }, children }) : null,
1412
- actions ? /* @__PURE__ */ jsx39("div", { className: "pire-selectionbar-actions", children: actions }) : null
1869
+ children ? /* @__PURE__ */ jsx42("span", { style: { color: "var(--text-secondary)", font: "var(--type-caption)" }, children }) : null,
1870
+ actions ? /* @__PURE__ */ jsx42("div", { className: "pire-selectionbar-actions", children: actions }) : null
1413
1871
  ] });
1414
1872
  }
1415
1873
 
1416
1874
  // src/components/layout/FooterBar.tsx
1417
- import { jsx as jsx40, jsxs as jsxs37 } from "react/jsx-runtime";
1875
+ import { jsx as jsx43, jsxs as jsxs39 } from "react/jsx-runtime";
1418
1876
  function FooterBar({ note, actions, children, className, ...rest }) {
1419
- return /* @__PURE__ */ jsxs37("footer", { className: cx("pire-footerbar", className), ...rest, children: [
1420
- note ? /* @__PURE__ */ jsx40("span", { className: "pire-footerbar-note", children: note }) : null,
1877
+ return /* @__PURE__ */ jsxs39("footer", { className: cx("pire-footerbar", className), ...rest, children: [
1878
+ note ? /* @__PURE__ */ jsx43("span", { className: "pire-footerbar-note", children: note }) : null,
1421
1879
  children,
1422
- actions ? /* @__PURE__ */ jsx40("div", { className: "pire-footerbar-actions", children: actions }) : null
1880
+ actions ? /* @__PURE__ */ jsx43("div", { className: "pire-footerbar-actions", children: actions }) : null
1423
1881
  ] });
1424
1882
  }
1425
1883
 
1426
1884
  // src/components/patterns/ConfirmDialog.tsx
1427
- import { Fragment as Fragment4, jsx as jsx41, jsxs as jsxs38 } from "react/jsx-runtime";
1885
+ import { Fragment as Fragment4, jsx as jsx44, jsxs as jsxs40 } from "react/jsx-runtime";
1428
1886
  function ConfirmDialog({
1429
1887
  isOpen,
1430
1888
  title,
@@ -1438,7 +1896,7 @@ function ConfirmDialog({
1438
1896
  onConfirm,
1439
1897
  onCancel
1440
1898
  }) {
1441
- return /* @__PURE__ */ jsxs38(
1899
+ return /* @__PURE__ */ jsxs40(
1442
1900
  Dialog,
1443
1901
  {
1444
1902
  isOpen,
@@ -1448,12 +1906,12 @@ function ConfirmDialog({
1448
1906
  onClose: onCancel,
1449
1907
  isDismissable: !isBusy,
1450
1908
  showClose: false,
1451
- footer: /* @__PURE__ */ jsxs38(Fragment4, { children: [
1452
- /* @__PURE__ */ jsx41(Button, { variant: "tertiary", isDisabled: isBusy, onPress: onCancel, children: cancelLabel }),
1453
- /* @__PURE__ */ jsx41(Button, { variant: tone === "danger" ? "danger" : "primary", isDisabled: isBusy, onPress: onConfirm, children: isBusy ? "Working\u2026" : confirmLabel })
1909
+ footer: /* @__PURE__ */ jsxs40(Fragment4, { children: [
1910
+ /* @__PURE__ */ jsx44(Button, { variant: "tertiary", isDisabled: isBusy, onPress: onCancel, children: cancelLabel }),
1911
+ /* @__PURE__ */ jsx44(Button, { variant: tone === "danger" ? "danger" : "primary", isDisabled: isBusy, onPress: onConfirm, children: isBusy ? "Working\u2026" : confirmLabel })
1454
1912
  ] }),
1455
1913
  children: [
1456
- consequence ? /* @__PURE__ */ jsx41(InlineMessage, { kind: tone === "danger" ? "error" : "warning", style: { marginBottom: children ? "var(--sp-3)" : 0 }, children: consequence }) : null,
1914
+ consequence ? /* @__PURE__ */ jsx44(InlineMessage, { kind: tone === "danger" ? "error" : "warning", style: { marginBottom: children ? "var(--sp-3)" : 0 }, children: consequence }) : null,
1457
1915
  children
1458
1916
  ]
1459
1917
  }
@@ -1462,9 +1920,9 @@ function ConfirmDialog({
1462
1920
 
1463
1921
  // src/components/patterns/SidePanel.tsx
1464
1922
  import { ModalOverlay as ModalOverlay2, Modal as Modal2, Dialog as AriaDialog3, Heading as Heading3 } from "react-aria-components";
1465
- import { jsx as jsx42, jsxs as jsxs39 } from "react/jsx-runtime";
1923
+ import { jsx as jsx45, jsxs as jsxs41 } from "react/jsx-runtime";
1466
1924
  function SidePanel({ isOpen, title, subtitle, width = 400, children, footer, onClose, className }) {
1467
- return /* @__PURE__ */ jsx42(
1925
+ return /* @__PURE__ */ jsx45(
1468
1926
  ModalOverlay2,
1469
1927
  {
1470
1928
  className: "pire-sidepanel-overlay",
@@ -1473,34 +1931,34 @@ function SidePanel({ isOpen, title, subtitle, width = 400, children, footer, onC
1473
1931
  onOpenChange: (o) => {
1474
1932
  if (!o) onClose?.();
1475
1933
  },
1476
- children: /* @__PURE__ */ jsx42(Modal2, { className: cx("pire-sidepanel", className), style: { width }, children: /* @__PURE__ */ jsxs39(AriaDialog3, { className: "pire-dialog", style: { height: "100%" }, children: [
1477
- /* @__PURE__ */ jsxs39("header", { className: "pire-dialog-head", children: [
1478
- /* @__PURE__ */ jsxs39("div", { style: { flex: 1, minWidth: 0 }, children: [
1479
- /* @__PURE__ */ jsx42(Heading3, { slot: "title", className: "pire-dialog-title", children: title }),
1480
- subtitle ? /* @__PURE__ */ jsx42("p", { className: "pire-dialog-sub", style: { margin: 0 }, children: subtitle }) : null
1934
+ children: /* @__PURE__ */ jsx45(Modal2, { className: cx("pire-sidepanel", className), style: { width }, children: /* @__PURE__ */ jsxs41(AriaDialog3, { className: "pire-dialog", style: { height: "100%" }, children: [
1935
+ /* @__PURE__ */ jsxs41("header", { className: "pire-dialog-head", children: [
1936
+ /* @__PURE__ */ jsxs41("div", { style: { flex: 1, minWidth: 0 }, children: [
1937
+ /* @__PURE__ */ jsx45(Heading3, { slot: "title", className: "pire-dialog-title", children: title }),
1938
+ subtitle ? /* @__PURE__ */ jsx45("p", { className: "pire-dialog-sub", style: { margin: 0 }, children: subtitle }) : null
1481
1939
  ] }),
1482
- /* @__PURE__ */ jsx42(IconButton, { icon: "x", label: "Close panel", size: "sm", onPress: onClose })
1940
+ /* @__PURE__ */ jsx45(IconButton, { icon: "x", label: "Close panel", size: "sm", onPress: onClose })
1483
1941
  ] }),
1484
- /* @__PURE__ */ jsx42("div", { className: "pire-dialog-body", style: { flex: 1 }, children }),
1485
- footer ? /* @__PURE__ */ jsx42("footer", { className: "pire-dialog-foot", children: footer }) : null
1942
+ /* @__PURE__ */ jsx45("div", { className: "pire-dialog-body", style: { flex: 1 }, children }),
1943
+ footer ? /* @__PURE__ */ jsx45("footer", { className: "pire-dialog-foot", children: footer }) : null
1486
1944
  ] }) })
1487
1945
  }
1488
1946
  );
1489
1947
  }
1490
1948
 
1491
1949
  // src/components/patterns/EmptyState.tsx
1492
- import { jsx as jsx43, jsxs as jsxs40 } from "react/jsx-runtime";
1950
+ import { jsx as jsx46, jsxs as jsxs42 } from "react/jsx-runtime";
1493
1951
  function EmptyState({ icon = "file-text", title, action, compact, children, className, ...rest }) {
1494
- return /* @__PURE__ */ jsxs40("div", { className: cx("pire-empty", className), "data-compact": compact ? "true" : void 0, ...rest, children: [
1495
- /* @__PURE__ */ jsx43(Icon, { name: icon, size: 24, className: "pire-empty-icon" }),
1496
- title ? /* @__PURE__ */ jsx43("p", { className: "pire-empty-title", style: { margin: 0 }, children: title }) : null,
1497
- children ? /* @__PURE__ */ jsx43("p", { className: "pire-empty-body", style: { margin: 0 }, children }) : null,
1952
+ return /* @__PURE__ */ jsxs42("div", { className: cx("pire-empty", className), "data-compact": compact ? "true" : void 0, ...rest, children: [
1953
+ /* @__PURE__ */ jsx46(Icon, { name: icon, size: 24, className: "pire-empty-icon" }),
1954
+ title ? /* @__PURE__ */ jsx46("p", { className: "pire-empty-title", style: { margin: 0 }, children: title }) : null,
1955
+ children ? /* @__PURE__ */ jsx46("p", { className: "pire-empty-body", style: { margin: 0 }, children }) : null,
1498
1956
  action
1499
1957
  ] });
1500
1958
  }
1501
1959
 
1502
1960
  // src/index.ts
1503
- import { DialogTrigger, MenuTrigger, Menu, MenuItem, Popover as Popover4, Separator, I18nProvider } from "react-aria-components";
1961
+ import { DialogTrigger, MenuTrigger, Menu, MenuItem, Popover as Popover5, Separator, I18nProvider } from "react-aria-components";
1504
1962
  export {
1505
1963
  Avatar,
1506
1964
  Badge,
@@ -1529,11 +1987,12 @@ export {
1529
1987
  Menu,
1530
1988
  MenuItem,
1531
1989
  MenuTrigger,
1990
+ MultiComboBox,
1532
1991
  NumberField,
1533
1992
  ObjectHeader,
1534
1993
  PageHeader,
1535
1994
  Pagination,
1536
- Popover4 as Popover,
1995
+ Popover5 as Popover,
1537
1996
  ProgressBar,
1538
1997
  Radio,
1539
1998
  RadioGroup,
@@ -1545,9 +2004,12 @@ export {
1545
2004
  ShellBar,
1546
2005
  SideNav,
1547
2006
  SidePanel,
2007
+ Skeleton,
2008
+ SkeletonTableRow,
1548
2009
  Switch,
1549
2010
  Tabs,
1550
2011
  Tag,
2012
+ TextArea,
1551
2013
  Timeline,
1552
2014
  Toast,
1553
2015
  ToastProvider,