@orianatech/pire 0.19.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/core/Tag.d.cts +16 -1
- package/dist/components/core/Tag.d.ts +16 -1
- package/dist/components/core/Tag.d.ts.map +1 -1
- package/dist/components.css +12 -0
- package/dist/index.cjs +2 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/core/icon-data.generated.ts","../src/components/core/icon-map.ts","../src/components/core/Icon.tsx","../src/components/core/Button.tsx","../src/components/utils/cx.ts","../src/components/core/IconButton.tsx","../src/components/feedback/Tooltip.tsx","../src/components/core/Badge.tsx","../src/components/core/Tag.tsx","../src/components/core/Card.tsx","../src/components/core/Avatar.tsx","../src/components/core/SegmentedControl.tsx","../src/components/core/Text.tsx","../src/components/core/Heading.tsx","../src/components/core/Link.tsx","../src/components/core/Separator.tsx","../src/components/core/Kbd.tsx","../src/components/forms/FormField.tsx","../src/components/forms/Input.tsx","../src/i18n/PireIntlProvider.tsx","../src/i18n/messages.ts","../src/components/forms/TextArea.tsx","../src/components/forms/Select.tsx","../src/components/forms/Checkbox.tsx","../src/components/forms/Radio.tsx","../src/components/forms/Switch.tsx","../src/components/forms/ComboBox.tsx","../src/components/forms/MultiComboBox.tsx","../src/components/forms/NumberField.tsx","../src/components/forms/DatePicker.tsx","../src/components/forms/DateRangePicker.tsx","../src/components/forms/ValueHelpField.tsx","../src/components/patterns/ValueHelpDialog.tsx","../src/components/feedback/Dialog.tsx","../src/components/data/DataTable.tsx","../src/components/feedback/Skeleton.tsx","../src/components/forms/FileUpload.tsx","../src/components/feedback/ProgressBar.tsx","../src/components/navigation/ShellBar.tsx","../src/components/navigation/SideNav.tsx","../src/components/navigation/Menu.tsx","../src/components/navigation/Tabs.tsx","../src/components/navigation/Breadcrumb.tsx","../src/components/navigation/Pagination.tsx","../src/components/feedback/InlineMessage.tsx","../src/components/feedback/Toast.tsx","../src/components/data/KpiTile.tsx","../src/components/data/ObjectHeader.tsx","../src/components/data/FilterBar.tsx","../src/components/data/DescriptionList.tsx","../src/components/data/Timeline.tsx","../src/components/data/chartGeometry.ts","../src/components/data/ChartFrame.tsx","../src/components/data/BarChart.tsx","../src/components/data/LineChart.tsx","../src/components/data/DonutChart.tsx","../src/components/data/LinkList.tsx","../src/components/layout/PageBand.tsx","../src/components/layout/PageHeader.tsx","../src/components/layout/SectionHeader.tsx","../src/components/layout/SelectionBar.tsx","../src/components/layout/FooterBar.tsx","../src/components/layout/SplitPane.tsx","../src/components/patterns/ConfirmDialog.tsx","../src/components/patterns/CommandPalette.tsx","../src/components/patterns/SidePanel.tsx","../src/components/patterns/EmptyState.tsx","../src/components/patterns/FileDropZone.tsx","../src/index.ts"],"sourcesContent":["// GENERATED FILE — do not edit by hand. Run `pnpm icons:generate` (or `pnpm build`).\n// Source: scripts/generate-icon-data.mjs, from @carbon/icons (devDependency) and the CARBON_MAP\n// in ./icon-map.ts. Committed so typecheck, lint, tests and Storybook work on a fresh clone\n// without a build step.\n//\n// Inner markup of each 32x32 Carbon glyph, keyed by Carbon slug. `Icon` drops it into\n// <svg viewBox=\"0 0 32 32\" fill=\"currentColor\">, so paths inherit text colour. Slugs are the\n// Carbon names; call sites use the canonical Lucide names in ./icon-map.ts.\nexport const ICON_MARKUP: Record<string, string> = {\n '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\"/>',\n 'apps': '<path d=\"M8,4V8H4V4Zm2-2H2v8h8Zm8,2V8H14V4Zm2-2H12v8h8Zm8,2V8H24V4Zm2-2H22v8h8ZM8,14v4H4V14Zm2-2H2v8h8Zm8,2v4H14V14Zm2-2H12v8h8Zm8,2v4H24V14Zm2-2H22v8h8ZM8,24v4H4V24Zm2-2H2v8h8Zm8,2v4H14V24Zm2-2H12v8h8Zm8,2v4H24V24Zm2-2H22v8h8Z\"/>',\n 'archive': '<path d=\"M14 19H18V21H14z\"/><path d=\"M6,2V28a2,2,0,0,0,2,2H24a2,2,0,0,0,2-2V2ZM24,28H8V16H24Zm0-14H8V10H24ZM8,8V4H24V8Z\"/>',\n '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\"/>',\n 'arrow--left': '<path d=\"M14 26 15.41 24.59 7.83 17 28 17 28 15 7.83 15 15.41 7.41 14 6 4 16 14 26z\"/>',\n '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\"/>',\n '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\"/>',\n '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\"/>',\n 'asterisk': '<path d=\"M28.316 13.949 27.684 12.051 17 15.612 17 4 15 4 15 15.612 4.316 12.051 3.684 13.949 14.368 17.51 7.2 27.066 8.8 28.267 16 18.667 23.2 28.267 24.8 27.066 17.632 17.51 28.316 13.949z\"/>',\n '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\tC3.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\tc0,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\tc-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\"/>',\n 'bank--vault': '<path d=\"M26,30h-2v-2H8v2h-2v-2h-2c-1.103,0-2-.8975-2-2V4c0-1.103.897-2,2-2h24c1.1025,0,2,.897,2,2v22c0,1.1025-.8975,2-2,2h-2v2ZM4,4v22h24.002l-.002-22H4ZM17,22h-2v-2.1006c-.626-.127-1.2207-.374-1.7573-.7285l-2.5356,2.5361-1.4141-1.4141,2.5366-2.5371c-.3555-.5371-.6021-1.1318-.729-1.7559h-2.1006v-2h2.1001c.1274-.626.374-1.2207.7285-1.7573l-2.5356-2.5356,1.4141-1.4141,2.5366,2.5366c.5376-.3555,1.1318-.6021,1.7563-.729v-2.1006h2v2.1006c.626.127,1.2207.3735,1.7568.728l2.5361-2.5356,1.4141,1.4141-2.5361,2.5356c.3545.5366.6016,1.1313.7285,1.7573h2.1006v2h-2.1006c-.127.626-.374,1.2207-.7285,1.7568l2.5361,2.5361-1.4141,1.4141-2.5371-2.5371c-.5371.3555-1.1318.6025-1.7559.7295v2.1006ZM16,12c-.7954,0-1.5513.3135-2.1279.8818-.5586.5669-.8721,1.3228-.8721,2.1182,0,.7949.3135,1.5508.8823,2.1279,1.1318,1.1162,3.0908,1.127,4.2456-.0098.5586-.5674.8721-1.3232.8721-2.1182,0-.793-.3115-1.5464-.877-2.1226-.5771-.5659-1.3306-.8774-2.123-.8774Z\"/>',\n 'barcode': '<path d=\"M2 6H4V28H2z\"/><path d=\"M12 6H14V26H12z\"/><path d=\"M6 6H10V26H6z\"/><path d=\"M16 6H20V26H16z\"/><path d=\"M22 6H26V26H22z\"/><path d=\"M28 6H30V28H28z\"/>',\n 'book': '<path d=\"M19 10H26V12H19z\"/><path d=\"M19 15H26V17H19z\"/><path d=\"M19 20H26V22H19z\"/><path d=\"M6 10H13V12H6z\"/><path d=\"M6 15H13V17H6z\"/><path d=\"M6 20H13V22H6z\"/><path d=\"M28,5H4A2.002,2.002,0,0,0,2,7V25a2.002,2.002,0,0,0,2,2H28a2.002,2.002,0,0,0,2-2V7A2.002,2.002,0,0,0,28,5ZM4,7H15V25H4ZM17,25V7H28V25Z\"/>',\n 'bookmark': '<path d=\"M24,4V26.75l-7.1-3.59-.9-.45-.9.45L8,26.75V4H24m0-2H8A2,2,0,0,0,6,4V30L16,25,26,30V4A2,2,0,0,0,24,2Z\"/>',\n '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\"/>',\n '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\"/>',\n '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\"/>',\n '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\"/>',\n '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\tV26z M26,10H6V6h4v2h2V6h8v2h2V6h4V10z\"/>',\n 'calendar--add': '<switch><foreignObject width=\"1\" height=\"1\" x=\"0\" y=\"0\" requiredExtensions=\"http://ns.adobe.com/AdobeIllustrator/10.0/\"/><g><path d=\"M30 22 24 22 24 16 22 16 22 22 16 22 16 24 22 24 22 30 24 30 24 24 30 24z\"/><path d=\"M28,6c0-1.1-0.9-2-2-2h-4V2h-2v2h-8V2h-2v2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h8v-2H6V6h4v2h2V6h8v2h2V6h4v8h2V6z\"/></g></switch>',\n 'calendar--heat-map': '<path d=\"M26,4H22V2H20V4H12V2H10V4H6A2.0025,2.0025,0,0,0,4,6V26a2.0025,2.0025,0,0,0,2,2H26a2.0025,2.0025,0,0,0,2-2V6A2.0025,2.0025,0,0,0,26,4ZM6,6h4V8h2V6h8V8h2V6h4l0,4H6Zm0,6h5v6H6ZM19,26H13V20h6Zm0-8H13V12h6Zm2,8V20h5l.0012,6Z\"/>',\n 'chart--area': '<path d=\"M20.4761,8.0151,13.4473,4.2109a2.0076,2.0076,0,0,0-2.1158.2051L4,10.001V2H2V28a2,2,0,0,0,2,2H30V5.7354ZM28,20.209l-7.62,1.8022-7.0288-2.8838a1.99,1.99,0,0,0-2.022.37L4,25.8359v-4.455l8.375-9.4,7.0186,5.62a2.0155,2.0155,0,0,0,2.0459.2119L28,14.6025ZM12.5239,5.9849l7.03,3.8042a2.012,2.012,0,0,0,1.3408.16L28,8.2646v4.1138L20.6187,16.02,13.6,10.4a1.99,1.99,0,0,0-2.6885.2642L4,18.3838v-5.87ZM4.5513,28,12.62,20.9888l7.0288,2.8838a1.9977,1.9977,0,0,0,1.147.0771L28,22.2612V28Z\"/>',\n 'chart--bar': '<path d=\"M4,2H2V28a2,2,0,0,0,2,2H30V28H4V25H26V17H4V13H18V5H4ZM24,19v4H4V19ZM16,7v4H4V7Z\"/>',\n 'chart--column': '<path d=\"M27,28V6H19V28H15V14H7V28H4V2H2V28a2,2,0,0,0,2,2H30V28ZM13,28H9V16h4Zm12,0H21V8h4Z\"/>',\n 'chart--line': '<path d=\"M4.67,28l6.39-12,7.3,6.49a2,2,0,0,0,1.7.47,2,2,0,0,0,1.42-1.07L27,10.9,25.18,10,19.69,21l-7.3-6.49A2,2,0,0,0,10.71,14a2,2,0,0,0-1.42,1L4,25V2H2V28a2,2,0,0,0,2,2H30V28Z\"/>',\n 'chart--pie': '<path d=\"M16,4A12,12,0,1,0,28,16,12,12,0,0,0,16,4ZM26,15H17V6.05A10,10,0,0,1,26,15ZM15.42,26A10,10,0,0,1,15,6.05v9a2,2,0,0,0,2,2h9A10,10,0,0,1,15.42,26Z\"/>',\n 'checkmark': '<path d=\"M13 24 4 15 5.414 13.586 13 21.171 26.586 7.586 28 9 13 24z\"/>',\n '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\"/>',\n '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\"/>',\n 'chevron--down': '<path d=\"M16 22 6 12 7.4 10.6 16 19.2 24.6 10.6 26 12z\"/>',\n 'chevron--left': '<path d=\"M10 16 20 6 21.4 7.4 12.8 16 21.4 24.6 20 26z\"/>',\n 'chevron--right': '<path d=\"M22 16 12 26 10.6 24.6 19.2 16 10.6 7.4 12 6z\"/>',\n '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\"/>',\n 'chevron--up': '<path d=\"M16 10 26 20 24.6 21.4 16 12.8 7.4 21.4 6 20z\"/>',\n '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\"/>',\n '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\"/>',\n 'cloud--download': '<path d=\"M23.5,22H23V20h.5a4.5,4.5,0,0,0,.36-9L23,11l-.1-.82a7,7,0,0,0-13.88,0L9,11,8.14,11a4.5,4.5,0,0,0,.36,9H9v2H8.5A6.5,6.5,0,0,1,7.2,9.14a9,9,0,0,1,17.6,0A6.5,6.5,0,0,1,23.5,22Z\"/><path d=\"M17 26.17 17 14 15 14 15 26.17 12.41 23.59 11 25 16 30 21 25 19.59 23.59 17 26.17z\"/>',\n 'cloud--upload': '<path d=\"M11 18 12.41 19.41 15 16.83 15 29 17 29 17 16.83 19.59 19.41 21 18 16 13 11 18z\"/><path d=\"M23.5,22H23V20h.5a4.5,4.5,0,0,0,.36-9L23,11l-.1-.82a7,7,0,0,0-13.88,0L9,11,8.14,11a4.5,4.5,0,0,0,.36,9H9v2H8.5A6.5,6.5,0,0,1,7.2,9.14a9,9,0,0,1,17.6,0A6.5,6.5,0,0,1,23.5,22Z\"/>',\n '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\"/>',\n '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\"/>',\n 'currency': '<path d=\"M21,12V10H17V7H15v3H13a2.002,2.002,0,0,0-2,2v3a2.002,2.002,0,0,0,2,2h6v3H11v2h4v3h2V22h2a2.0023,2.0023,0,0,0,2-2V17a2.002,2.002,0,0,0-2-2H13V12Z\"/><path d=\"M16,4A12,12,0,1,1,4,16,12.0353,12.0353,0,0,1,16,4m0-2A14,14,0,1,0,30,16,14.0412,14.0412,0,0,0,16,2Z\"/>',\n 'currency--dollar': '<path d=\"M23,20.5151c0-4.6152-3.78-5.1411-6.8171-5.563-3.31-.4609-5.1829-.86-5.1829-3.71C11,8.8491,13.5071,8,15.6538,8a6.7538,6.7538,0,0,1,5.5681,2.6279l1.5562-1.2558A8.6508,8.6508,0,0,0,17,6.0962V3H15V6.022c-3.6152.2192-6,2.26-6,5.22,0,4.73,3.83,5.2627,6.9075,5.69C19.16,17.3848,21,17.7744,21,20.5151,21,23.5474,17.8674,24,16,24c-3.4294,0-4.8782-.9639-6.2219-2.6279L8.2219,22.6279A8.4382,8.4382,0,0,0,15,25.9648V29h2V25.9551C20.7256,25.6509,23,23.6279,23,20.5151Z\"/>',\n 'currency--euro': '<path d=\"M17,26c-3.6162,0-6.3328-2.2974-7.4456-6H19V18H9.1321A15.2782,15.2782,0,0,1,9,16c0-.33.01-.6641.0259-1H19V13H9.2371C9.8447,9.3525,11.81,6,17,6c3.8533,0,5.5315,1.6465,7.1282,4.4893l1.7436-.9786C24.2649,6.6484,22.0779,4,17,4,10.6448,4,7,8.374,7,16c0,7.0654,4.1121,12,10,12,5.0779,0,7.2649-2.6484,8.8718-5.5107l-1.7436-.9786C22.5315,24.3535,20.8533,26,17,26Z\"/>',\n 'data--base': '<path d=\"M24,3H8A2,2,0,0,0,6,5V27a2,2,0,0,0,2,2H24a2,2,0,0,0,2-2V5A2,2,0,0,0,24,3Zm0,2v6H8V5ZM8,19V13H24v6Zm0,8V21H24v6Z\"/><circle cx=\"11\" cy=\"8\" r=\"1\"/><circle cx=\"11\" cy=\"16\" r=\"1\"/><circle cx=\"11\" cy=\"24\" r=\"1\"/>',\n 'debug': '<path d=\"M29.83,20l.34-2L25,17.15V13c0-.08,0-.15,0-.23l5.06-1.36-.51-1.93-4.83,1.29A9,9,0,0,0,20,5V2H18V4.23a8.81,8.81,0,0,0-4,0V2H12V5a9,9,0,0,0-4.71,5.82L2.46,9.48,2,11.41,7,12.77c0,.08,0,.15,0,.23v4.15L1.84,18l.32,2L7,19.18a8.9,8.9,0,0,0,.82,3.57L3.29,27.29l1.42,1.42,4.19-4.2a9,9,0,0,0,14.2,0l4.19,4.2,1.42-1.42-4.54-4.54A8.9,8.9,0,0,0,25,19.18ZM15,25.92A7,7,0,0,1,9,19V13h6ZM9.29,11a7,7,0,0,1,13.42,0ZM23,19a7,7,0,0,1-6,6.92V13h6Z\"/>',\n 'delivery--parcel': '<path d=\"M29.4819,8.624l-10-5.5a1,1,0,0,0-.9638,0l-10,5.5a1,1,0,0,0,0,1.752L18,15.5913V26.3086l-3.0362-1.6693L14,26.3912l4.5181,2.4848a.9984.9984,0,0,0,.9638,0l10-5.5A1,1,0,0,0,30,22.5V9.5A1,1,0,0,0,29.4819,8.624ZM19,5.1416,26.9248,9.5,19,13.8584,11.0752,9.5Zm9,16.7671-8,4.4V15.5913l8-4.4Z\"/><path d=\"M2 14H10V16H2z\" transform=\"matrix(-1 0 0 -1 12 30)\"/><path d=\"M4 22H12V24H4z\" transform=\"matrix(-1 0 0 -1 16 46)\"/><path d=\"M6 18H14V20H6z\" transform=\"matrix(-1 0 0 -1 20 38)\"/>',\n '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\"/>',\n '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\tz M18,4.4l5.6,5.6H18V4.4z M24,28H8V4h8v6c0,1.1,0.9,2,2,2h6V28z\"/><path d=\"M10 22H22V24H10z\"/><path d=\"M10 16H22V18H10z\"/>',\n 'document--add': '<path d=\"M30 24 26 24 26 20 24 20 24 24 20 24 20 26 24 26 24 30 26 30 26 26 30 26 30 24z\"/><path d=\"M16,28H8V4h8v6a2.0058,2.0058,0,0,0,2,2h6v4h2V10a.9092.9092,0,0,0-.3-.7l-7-7A.9087.9087,0,0,0,18,2H8A2.0058,2.0058,0,0,0,6,4V28a2.0058,2.0058,0,0,0,2,2h8ZM18,4.4,23.6,10H18Z\"/>',\n '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\"/>',\n '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\tl-3,3L17.4,7L20.4,4z M6,22v-3.6l10-10l3.6,3.6l-10,10H6z\"/>',\n 'email': '<path d=\"M28,6H4A2,2,0,0,0,2,8V24a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V8A2,2,0,0,0,28,6ZM25.8,8,16,14.78,6.2,8ZM4,24V8.91l11.43,7.91a1,1,0,0,0,1.14,0L28,8.91V24Z\"/>',\n '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\"/>',\n 'events': '<path d=\"M26,14H24v2h2a3.0033,3.0033,0,0,1,3,3v4h2V19A5.0058,5.0058,0,0,0,26,14Z\"/><path d=\"M24,4a3,3,0,1,1-3,3,3,3,0,0,1,3-3m0-2a5,5,0,1,0,5,5A5,5,0,0,0,24,2Z\"/><path d=\"M23,30H21V28a3.0033,3.0033,0,0,0-3-3H14a3.0033,3.0033,0,0,0-3,3v2H9V28a5.0059,5.0059,0,0,1,5-5h4a5.0059,5.0059,0,0,1,5,5Z\"/><path d=\"M16,13a3,3,0,1,1-3,3,3,3,0,0,1,3-3m0-2a5,5,0,1,0,5,5A5,5,0,0,0,16,11Z\"/><path d=\"M8,14H6a5.0059,5.0059,0,0,0-5,5v4H3V19a3.0033,3.0033,0,0,1,3-3H8Z\"/><path d=\"M8,4A3,3,0,1,1,5,7,3,3,0,0,1,8,4M8,2a5,5,0,1,0,5,5A5,5,0,0,0,8,2Z\"/>',\n '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\"/>',\n 'filter--edit': '<path d=\"M26,6H4V9.17l7.41,7.42.59.58V26h4V24h2v2a2,2,0,0,1-2,2H12a2,2,0,0,1-2-2V18L2.59,10.59A2,2,0,0,1,2,9.17V6A2,2,0,0,1,4,4H26Z\"/><path d=\"M29.71,11.29l-3-3a1,1,0,0,0-1.42,0L16,17.59V22h4.41l9.3-9.29A1,1,0,0,0,29.71,11.29ZM19.59,20H18V18.41l5-5L24.59,15ZM26,13.59,24.41,12,26,10.41,27.59,12Z\"/>',\n '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\"/>',\n 'flow': '<path d=\"M27,22.14V17a2,2,0,0,0-2-2H17V9.86a4,4,0,1,0-2,0V15H7a2,2,0,0,0-2,2v5.14a4,4,0,1,0,2,0V17H25v5.14a4,4,0,1,0,2,0ZM8,26a2,2,0,1,1-2-2A2,2,0,0,1,8,26ZM14,6a2,2,0,1,1,2,2A2,2,0,0,1,14,6ZM26,28a2,2,0,1,1,2-2A2,2,0,0,1,26,28Z\"/>',\n 'folder': '<path d=\"M11.17,6l3.42,3.41.58.59H28V26H4V6h7.17m0-2H4A2,2,0,0,0,2,6V26a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2H16L12.59,4.59A2,2,0,0,0,11.17,4Z\"/>',\n 'function': '<path d=\"M19.6262,29.5256,19.11,27.5935A12.0035,12.0035,0,0,0,25.2312,8.3323l1.5376-1.2788a14.0033,14.0033,0,0,1-7.1426,22.4721Z\"/><path d=\"M10,29H8V25.18l.8037-.1607C10.2617,24.728,12,23.6206,12,20V18.6182l-4-2V14.3818l4-2V12c0-5.4673,3.9253-9,10-9h2V6.82l-.8037.1607C21.7383,7.272,20,8.3794,20,12v.3818l4,2v2.2364l-4,2V20C20,25.4673,16.0747,29,10,29Zm0-2c4.9346,0,8-2.6821,8-7V17.3818L21.7642,15.5,18,13.6182V12c0-4.5781,2.3853-6.1924,4-6.76V5c-4.9346,0-8,2.6821-8,7v1.6182L10.2358,15.5,14,17.3818V20c0,4.5781-2.3853,6.1924-4,6.76Z\"/><path d=\"M5.2312,24.9465A14.0032,14.0032,0,0,1,12.3779,2.4734l.5161,1.9321A12.0035,12.0035,0,0,0,6.7688,23.6677Z\"/>',\n 'globe': '<path d=\"M14,4a7,7,0,1,1-7,7,7,7,0,0,1,7-7m0-2a9,9,0,1,0,9,9A9,9,0,0,0,14,2Z\"/><path d=\"M28,11a13.9563,13.9563,0,0,0-4.1051-9.8949L22.4813,2.5187A11.9944,11.9944,0,0,1,5.5568,19.5194l-.0381-.0381L4.1051,20.8949A13.9563,13.9563,0,0,0,14,25v3H10v2H20V28H16V24.84A14.0094,14.0094,0,0,0,28,11Z\"/>',\n '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\"/>',\n 'hashtag': '<path d=\"M28,12V10H22V4H20v6H12V4H10v6H4v2h6v8H4v2h6v6h2V22h8v6h2V22h6V20H22V12Zm-8,8H12V12h8Z\"/>',\n '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\"/>',\n '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\"/>',\n 'idea': '<path d=\"M11 24H21V26H11z\"/><path d=\"M13 28H19V30H13z\"/><path d=\"M16,2A10,10,0,0,0,6,12a9.19,9.19,0,0,0,3.46,7.62c1,.93,1.54,1.46,1.54,2.38h2c0-1.84-1.11-2.87-2.19-3.86A7.2,7.2,0,0,1,8,12a8,8,0,0,1,16,0,7.2,7.2,0,0,1-2.82,6.14c-1.07,1-2.18,2-2.18,3.86h2c0-.92.53-1.45,1.54-2.39A9.18,9.18,0,0,0,26,12,10,10,0,0,0,16,2Z\"/>',\n 'identification': '<path d=\"M28,6V26H4V6H28m0-2H4A2,2,0,0,0,2,6V26a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V6a2,2,0,0,0-2-2Z\"/><path d=\"M6 10H13V12H6z\"/><path d=\"M6 14H10V16H6z\"/><path d=\"M23,18H17a3,3,0,0,0-3,3v2h2V21a1,1,0,0,1,1-1h6a1,1,0,0,1,1,1v2h2V21A3,3,0,0,0,23,18Z\"/><path d=\"M20,17a4,4,0,1,0-4-4A4,4,0,0,0,20,17Zm0-6a2,2,0,1,1-2,2A2,2,0,0,1,20,11Z\"/>',\n '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\"/>',\n 'information--square': '<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=\"M26,28H6a2.0023,2.0023,0,0,1-2-2V6A2.0023,2.0023,0,0,1,6,4H26a2.0023,2.0023,0,0,1,2,2V26A2.0023,2.0023,0,0,1,26,28ZM6,6V26H26V6Z\"/>',\n 'inventory-management': '<path d=\"M19 24H23V28H19z\"/><path d=\"M26 24H30V28H26z\"/><path d=\"M19 17H23V21H19z\"/><path d=\"M26 17H30V21H26z\"/><path d=\"M17,24H4V10H28v5h2V10a2.0023,2.0023,0,0,0-2-2H22V4a2.0023,2.0023,0,0,0-2-2H12a2.002,2.002,0,0,0-2,2V8H4a2.002,2.002,0,0,0-2,2V24a2.0023,2.0023,0,0,0,2,2H17ZM12,4h8V8H12Z\"/>',\n '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\"/>',\n '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\"/>',\n 'license': '<path d=\"M10 6H22V8H10z\"/><path d=\"M10 10H22V12H10z\"/><path d=\"M10 24H16V26H10z\"/><path d=\"M10 14H16V16H10z\"/><path d=\"M24,30H8a2.0023,2.0023,0,0,1-2-2V4A2.0023,2.0023,0,0,1,8,2H24a2.0023,2.0023,0,0,1,2,2V28A2.0023,2.0023,0,0,1,24,30ZM8,4V28H24V4Z\"/>',\n '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\"/>',\n '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\"/>',\n '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\"/>',\n '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\"/>',\n 'location--company': '<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,0,0,7,13a8.9054,8.9054,0,0,0,1.8125,5.395Z\"/><path d=\"M21,18H19V10H13v8H11V10a2.0021,2.0021,0,0,1,2-2h6a2.0021,2.0021,0,0,1,2,2Z\"/><path d=\"M15 16H17V18H15z\"/><path d=\"M15 12H17V14H15z\"/>',\n '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\"/>',\n 'login': '<path d=\"M26,30H14a2,2,0,0,1-2-2V25h2v3H26V4H14V7H12V4a2,2,0,0,1,2-2H26a2,2,0,0,1,2,2V28A2,2,0,0,1,26,30Z\"/><path d=\"M14.59 20.59 18.17 17 4 17 4 15 18.17 15 14.59 11.41 16 10 22 16 16 22 14.59 20.59z\"/>',\n 'logout': '<path d=\"M6,30H18a2.0023,2.0023,0,0,0,2-2V25H18v3H6V4H18V7h2V4a2.0023,2.0023,0,0,0-2-2H6A2.0023,2.0023,0,0,0,4,4V28A2.0023,2.0023,0,0,0,6,30Z\"/><path d=\"M20.586 20.586 24.172 17 10 17 10 15 24.172 15 20.586 11.414 22 10 28 16 22 22 20.586 20.586z\"/>',\n 'maximize': '<path d=\"M20 2 20 4 26.586 4 18 12.582 19.414 14 28 5.414 28 12 30 12 30 2 20 2z\"/><path d=\"M14 19.416 12.592 18 4 26.586 4 20 2 20 2 30 12 30 12 28 5.414 28 14 19.416z\"/>',\n 'menu': '<path d=\"M4 6H28V8H4z\"/><path d=\"M4 24H28V26H4z\"/><path d=\"M4 12H28V14H4z\"/><path d=\"M4 18H28V20H4z\"/>',\n '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\"/>',\n '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\tl5.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\tl5.4,5.4L21.4,23z\" data-icon-path=\"inner-path\" opacity=\"0\"/>',\n 'money': '<path d=\"M2 22H30V24H2z\"/><path d=\"M2 26H30V28H2z\"/><path d=\"M24,10a2,2,0,1,0,2,2,2,2,0,0,0-2-2Z\"/><path d=\"M16,16a4,4,0,1,1,4-4A4.0045,4.0045,0,0,1,16,16Zm0-6a2,2,0,1,0,2,2A2.002,2.002,0,0,0,16,10Z\"/><path d=\"M8,10a2,2,0,1,0,2,2,2,2,0,0,0-2-2Z\"/><path d=\"M28,20H4a2.0051,2.0051,0,0,1-2-2V6A2.0051,2.0051,0,0,1,4,4H28a2.0051,2.0051,0,0,1,2,2V18A2.0027,2.0027,0,0,1,28,20ZM28,6H4V18H28Z\"/>',\n 'notebook': '<path d=\"M19 10H26V12H19z\"/><path d=\"M19 15H26V17H19z\"/><path d=\"M19 20H26V22H19z\"/><path d=\"M28,5H4A2.002,2.002,0,0,0,2,7V25a2.0023,2.0023,0,0,0,2,2H28a2.0027,2.0027,0,0,0,2-2V7A2.0023,2.0023,0,0,0,28,5ZM4,7H15V25H4ZM17,25V7H28l.002,18Z\"/>',\n '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\"/>',\n 'overflow-menu--horizontal': '<circle cx=\"8\" cy=\"16\" r=\"2\"/><circle cx=\"16\" cy=\"16\" r=\"2\"/><circle cx=\"24\" cy=\"16\" r=\"2\"/>',\n 'overflow-menu--vertical': '<circle cx=\"16\" cy=\"8\" r=\"2\"/><circle cx=\"16\" cy=\"16\" r=\"2\"/><circle cx=\"16\" cy=\"24\" r=\"2\"/>',\n 'partnership': '<path d=\"M8,9a4,4,0,1,1,4-4A4,4,0,0,1,8,9ZM8,3a2,2,0,1,0,2,2A2,2,0,0,0,8,3Z\"/><path d=\"M24,9a4,4,0,1,1,4-4A4,4,0,0,1,24,9Zm0-6a2,2,0,1,0,2,2A2,2,0,0,0,24,3Z\"/><path d=\"M26,30H22a2,2,0,0,1-2-2V21h2v7h4V19h2V13a1,1,0,0,0-1-1H20.58L16,20l-4.58-8H5a1,1,0,0,0-1,1v6H6v9h4V21h2v7a2,2,0,0,1-2,2H6a2,2,0,0,1-2-2V21a2,2,0,0,1-2-2V13a3,3,0,0,1,3-3h7.58L16,16l3.42-6H27a3,3,0,0,1,3,3v6a2,2,0,0,1-2,2v7A2,2,0,0,1,26,30Z\"/>',\n 'payment--methods': '<path d=\"M5,26V15.8281l-3.5859,3.586L0,18l6-6,6,6-1.4141,1.4141-3.5859-3.586v10.1719h12v2H7c-1.104-.0013-1.9987-.896-2-2Z\"/><path d=\"M31,18h-3v-2h-2v2h-1c-1.1046,0-2,.8954-2,2v2c0,1.1046,.8954,2,2,2h4v2h-6s0,2,0,2h3v2h2v-2h1c1.1046,0,2-.8954,2-2v-2c0-1.1046-.8954-2-2-2h-4v-2h6v-2Z\"/><path d=\"M28,12V6c-.0012-1.104-.896-1.9988-2-2H12v2h14v6\"/><path d=\"M2 6H7V8H2z\"/><path d=\"M2 2H10V4H2z\"/>',\n 'percentage': '<path d=\"M9,14a5,5,0,1,1,5-5A5.0055,5.0055,0,0,1,9,14ZM9,6a3,3,0,1,0,3,3A3.0033,3.0033,0,0,0,9,6Z\"/><path d=\"M.029 15H31.97V17H.029z\" transform=\"rotate(-45 16 16)\"/><path d=\"M23,28a5,5,0,1,1,5-5A5.0055,5.0055,0,0,1,23,28Zm0-8a3,3,0,1,0,3,3A3.0033,3.0033,0,0,0,23,20Z\"/>',\n 'phone': '<path d=\"M26,29h-.17C6.18,27.87,3.39,11.29,3,6.23A3,3,0,0,1,5.76,3h5.51a2,2,0,0,1,1.86,1.26L14.65,8a2,2,0,0,1-.44,2.16l-2.13,2.15a9.37,9.37,0,0,0,7.58,7.6l2.17-2.15A2,2,0,0,1,24,17.35l3.77,1.51A2,2,0,0,1,29,20.72V26A3,3,0,0,1,26,29ZM6,5A1,1,0,0,0,5,6v.08C5.46,12,8.41,26,25.94,27A1,1,0,0,0,27,26.06V20.72l-3.77-1.51-2.87,2.85L19.88,22C11.18,20.91,10,12.21,10,12.12l-.06-.48,2.84-2.87L11.28,5Z\"/>',\n 'piggy-bank': '<path d=\"M16.5,14H20V12H18V11H16v1.0508A2.5,2.5,0,0,0,16.5,17h1a.5.5,0,0,1,0,1H14v2h2v1h2V19.9492A2.5,2.5,0,0,0,17.5,15h-1a.5.5,0,0,1,0-1Z\"/><path d=\"M29,13H26.98A5.7789,5.7789,0,0,0,25,8.8525V5a1,1,0,0,0-1.6-.8L19.6665,7H15c-5.5095,0-9.4634,3.2412-9.9485,8H5a1.0009,1.0009,0,0,1-1-1V12H2v2a3.0033,3.0033,0,0,0,3,3h.07A9.1733,9.1733,0,0,0,9,23.5566V27a1,1,0,0,0,1,1h4a1,1,0,0,0,1-1V25h3v2a1,1,0,0,0,1,1h4a1,1,0,0,0,1-1V23.6372A5.0926,5.0926,0,0,0,26.8188,20H29a1,1,0,0,0,1-1V14A1,1,0,0,0,29,13Zm-1,5H25.124c-.3052,2.7529-.8235,3.4854-3.124,4.3154V26H20V23H13v3H11V22.3779A7.013,7.013,0,0,1,7,16c0-4.8354,4.0181-7,8-7h5.3335L23,7V9.7764c2.4182,1.8593,1.9126,3.186,2.0183,5.2236H28Z\"/>',\n 'portfolio': '<path d=\"M28,10H22V6a2,2,0,0,0-2-2H12a2,2,0,0,0-2,2v4H4a2,2,0,0,0-2,2V26a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V12A2,2,0,0,0,28,10ZM12,6h8v4H12ZM4,26V12H28V26Z\"/>',\n '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\"/>',\n 'purchase': '<path d=\"M28,6H4A2,2,0,0,0,2,8V24a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V8A2,2,0,0,0,28,6Zm0,2v3H4V8ZM4,24V13H28V24Z\"/><path d=\"M6 20H16V22H6z\"/>',\n '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\"/>',\n 'receipt': '<path d=\"M21 16H23V18H21z\"/><path d=\"M9 16H17V18H9z\"/><path d=\"M21 12H23V14H21z\"/><path d=\"M9 12H17V14H9z\"/><path d=\"M9 8H23V10H9z\"/><path d=\"M25,2H7A2.002,2.002,0,0,0,5,4V29a1,1,0,0,0,1,1H7a.9987.9987,0,0,0,.8-.4L10,26.667,12.2,29.6a1.0353,1.0353,0,0,0,1.6,0L16,26.667,18.2,29.6a1.0353,1.0353,0,0,0,1.6,0L22,26.667,24.2,29.6a.9993.9993,0,0,0,.8.4h1a1,1,0,0,0,1-1V4A2.0023,2.0023,0,0,0,25,2Zm0,25.333L22.8,24.4a1.0353,1.0353,0,0,0-1.6,0L19,27.333,16.8,24.4a1.0353,1.0353,0,0,0-1.6,0L13,27.333,10.8,24.4a1.0353,1.0353,0,0,0-1.6,0L7,27.333V4H25Z\"/>',\n '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\"/>',\n 'redo': '<path d=\"M12,10H24.1851L20.5977,6.4141,22,5,28,11,22,17l-1.4023-1.4146L24.1821,12H12a6,6,0,0,0,0,12h8v2H12a8,8,0,0,1,0-16Z\"/>',\n '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\"/>',\n 'repeat': '<path d=\"M6,6H26.1719l-3.586-3.5859L24,1l6,6-6,6-1.4141-1.4141L26.1719,8H6v7H4V8A2.0024,2.0024,0,0,1,6,6Z\"/><path d=\"M9.4141,20.4141,5.8281,24H26V17h2v7a2.0024,2.0024,0,0,1-2,2H5.8281L9.414,29.5859,8,31,2,25l6-6Z\"/>',\n 'report': '<path d=\"M10 18H18V20H10z\"/><path d=\"M10 13H22V15H10z\"/><path d=\"M10 23H15V25H10z\"/><path d=\"M25,5H22V4a2,2,0,0,0-2-2H12a2,2,0,0,0-2,2V5H7A2,2,0,0,0,5,7V28a2,2,0,0,0,2,2H25a2,2,0,0,0,2-2V7A2,2,0,0,0,25,5ZM12,4h8V8H12ZM25,28H7V7h3v3H22V7h3Z\"/>',\n 'request-quote': '<path d=\"M22,22v6H6V4H16V2H6A2,2,0,0,0,4,4V28a2,2,0,0,0,2,2H22a2,2,0,0,0,2-2V22Z\"/><path d=\"M29.54,5.76l-3.3-3.3a1.6,1.6,0,0,0-2.24,0l-14,14V22h5.53l14-14a1.6,1.6,0,0,0,0-2.24ZM14.7,20H12V17.3l9.44-9.45,2.71,2.71ZM25.56,9.15,22.85,6.44l2.27-2.27,2.71,2.71Z\"/>',\n 'reset': '<path d=\"M18,28A12,12,0,1,0,6,16v6.2L2.4,18.6,1,20l6,6,6-6-1.4-1.4L8,22.2V16H8A10,10,0,1,1,18,26Z\"/>',\n 'rule': '<path d=\"M10 16H22V18H10z\"/><path d=\"M10 10H22V12H10z\"/><path d=\"M16,30,9.8242,26.7071A10.9815,10.9815,0,0,1,4,17V4A2.0022,2.0022,0,0,1,6,2H26a2.0022,2.0022,0,0,1,2,2V17a10.9815,10.9815,0,0,1-5.8242,9.7069ZM6,4V17a8.9852,8.9852,0,0,0,4.7656,7.9423L16,27.7333l5.2344-2.791A8.9852,8.9852,0,0,0,26,17V4Z\"/>',\n 'save': '<path d=\"M27.71,9.29l-5-5A1,1,0,0,0,22,4H6A2,2,0,0,0,4,6V26a2,2,0,0,0,2,2H26a2,2,0,0,0,2-2V10A1,1,0,0,0,27.71,9.29ZM12,6h8v4H12Zm8,20H12V18h8Zm2,0V18a2,2,0,0,0-2-2H12a2,2,0,0,0-2,2v8H6V6h4v4a2,2,0,0,0,2,2h8a2,2,0,0,0,2-2V6.41l4,4V26Z\"/>',\n 'scales': '<path d=\"M20,16a5,5,0,0,0,10,0,1,1,0,0,0-.1055-.4473L25.896,7.5562a.8913.8913,0,0,0-.0454-.0816A1,1,0,0,0,25,7H18.8218A3.0155,3.0155,0,0,0,17,5.1841V2H15V5.1841A3.0155,3.0155,0,0,0,13.1782,7H7a1,1,0,0,0-.8945.5527l-4,8A1,1,0,0,0,2,16a5,5,0,0,0,10,0,1,1,0,0,0-.1055-.4473L8.6182,9h4.56A3.0147,3.0147,0,0,0,15,10.8154V28H6v2H26V28H17V10.8159A3.0155,3.0155,0,0,0,18.8218,9h4.56l-3.2763,6.5527A1,1,0,0,0,20,16ZM7,19a2.9958,2.9958,0,0,1-2.8152-2h5.63A2.9956,2.9956,0,0,1,7,19Zm2.3821-4H4.6179L7,10.2363ZM16,9a1,1,0,1,1,1-1A1.0009,1.0009,0,0,1,16,9Zm9,10a2.9958,2.9958,0,0,1-2.8152-2h5.63A2.9956,2.9956,0,0,1,25,19Zm0-8.7637L27.3821,15H22.6179Z\"/>',\n '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\"/>',\n 'send': '<path d=\"M27.45,15.11l-22-11a1,1,0,0,0-1.08.12,1,1,0,0,0-.33,1L7,16,4,26.74A1,1,0,0,0,5,28a1,1,0,0,0,.45-.11l22-11a1,1,0,0,0,0-1.78Zm-20.9,10L8.76,17H18V15H8.76L6.55,6.89,24.76,16Z\"/>',\n '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\"/>',\n '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\ts1.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\ts-1.3,3-3,3s-3-1.3-3-3S9.3,20,11,20z\"/>',\n 'shopping--bag': '<path d=\"M28.76,11.35A1,1,0,0,0,28,11H22V7a3,3,0,0,0-3-3H13a3,3,0,0,0-3,3v4H4a1,1,0,0,0-1,1.15L4.88,24.3a2,2,0,0,0,2,1.7H25.14a2,2,0,0,0,2-1.7L29,12.15A1,1,0,0,0,28.76,11.35ZM12,7a1,1,0,0,1,1-1h6a1,1,0,0,1,1,1v4H12ZM25.14,24H6.86L5.17,13H26.83Z\"/>',\n '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\"/>',\n 'sort--ascending': '<path d=\"M18 22 19.414 20.586 23 24.172 23 4 25 4 25 24.172 28.586 20.586 30 22 24 28 18 22z\"/><path d=\"M2 18H16V20H2z\"/><path d=\"M6 12H16V14H6z\"/><path d=\"M10 6H16V8H10z\"/>',\n 'sort--descending': '<path d=\"M18 22 19.414 20.586 23 24.172 23 4 25 4 25 24.172 28.586 20.586 30 22 24 28 18 22z\"/><path d=\"M2 6H16V8H2z\"/><path d=\"M6 12H16V14H6z\"/><path d=\"M10 18H16V20H10z\"/>',\n 'star': '<path d=\"M16,6.52l2.76,5.58.46,1,1,.15,6.16.89L22,18.44l-.75.73.18,1,1.05,6.13-5.51-2.89L16,23l-.93.49L9.56,26.34l1-6.13.18-1L10,18.44,5.58,14.09l6.16-.89,1-.15.46-1L16,6.52M16,2l-4.55,9.22L1.28,12.69l7.36,7.18L6.9,30,16,25.22,25.1,30,23.36,19.87l7.36-7.17L20.55,11.22Z\"/>',\n 'star--filled': '<path d=\"M16,2l-4.55,9.22L1.28,12.69l7.36,7.18L6.9,30,16,25.22,25.1,30,23.36,19.87l7.36-7.17L20.55,11.22Z\"/>',\n 'subtract': '<path d=\"M8 15H24V17H8z\"/>',\n 'table--split': '<path d=\"M27,3H5A2,2,0,0,0,3,5V27a2,2,0,0,0,2,2H27a2,2,0,0,0,2-2V5A2,2,0,0,0,27,3Zm0,2V9H5V5ZM17,11H27v7H17Zm-2,7H5V11H15ZM5,20H15v7H5Zm12,7V20H27v7Z\"/>',\n 'tag': '<path d=\"M10,14a4,4,0,1,1,4-4A4.0045,4.0045,0,0,1,10,14Zm0-6a2,2,0,1,0,1.998,2.0044A2.002,2.002,0,0,0,10,8Z\"/><path d=\"M16.6436,29.4145,2.5858,15.3555A2,2,0,0,1,2,13.9414V4A2,2,0,0,1,4,2h9.9413a2,2,0,0,1,1.4142.5858L29.4144,16.6436a2.0005,2.0005,0,0,1,0,2.8285l-9.9424,9.9425a2.0008,2.0008,0,0,1-2.8285,0ZM4,4v9.9417L18.0578,28,28,18.0579,13.9416,4Z\"/>',\n 'task': '<path d=\"M14 20.18 10.41 16.59 9 18 14 23 23 14 21.59 12.58 14 20.18z\"/><path d=\"M25,5H22V4a2,2,0,0,0-2-2H12a2,2,0,0,0-2,2V5H7A2,2,0,0,0,5,7V28a2,2,0,0,0,2,2H25a2,2,0,0,0,2-2V7A2,2,0,0,0,25,5ZM12,4h8V8H12ZM25,28H7V7h3v3H22V7h3Z\"/>',\n 'task--complete': '<path d=\"M22 27.18 19.41 24.59 18 26 22 30 30 22 28.59 20.59 22 27.18z\"/><path d=\"M25,5H22V4a2.0058,2.0058,0,0,0-2-2H12a2.0058,2.0058,0,0,0-2,2V5H7A2.0058,2.0058,0,0,0,5,7V28a2.0058,2.0058,0,0,0,2,2h9V28H7V7h3v3H22V7h3V18h2V7A2.0058,2.0058,0,0,0,25,5ZM20,8H12V4h8Z\"/>',\n '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\"/>',\n '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\"/>',\n '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\"/>',\n 'undo': '<path d=\"M20,10H7.8149l3.5874-3.5859L10,5,4,11,10,17l1.4023-1.4146L7.8179,12H20a6,6,0,0,1,0,12H12v2h8a8,8,0,0,0,0-16Z\"/>',\n '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\"/>',\n 'user--admin': '<path d=\"M12,4A5,5,0,1,1,7,9a5,5,0,0,1,5-5m0-2a7,7,0,1,0,7,7A7,7,0,0,0,12,2Z\"/><path d=\"M22,30H20V25a5,5,0,0,0-5-5H9a5,5,0,0,0-5,5v5H2V25a7,7,0,0,1,7-7h6a7,7,0,0,1,7,7Z\"/><path d=\"M25 16.18 22.41 13.59 21 15 25 19 32 12 30.59 10.59 25 16.18z\"/>',\n 'user--follow': '<path d=\"M32 14 28 14 28 10 26 10 26 14 22 14 22 16 26 16 26 20 28 20 28 16 32 16 32 14z\"/><path d=\"M12,4A5,5,0,1,1,7,9a5,5,0,0,1,5-5m0-2a7,7,0,1,0,7,7A7,7,0,0,0,12,2Z\"/><path d=\"M22,30H20V25a5,5,0,0,0-5-5H9a5,5,0,0,0-5,5v5H2V25a7,7,0,0,1,7-7h6a7,7,0,0,1,7,7Z\"/>',\n 'user--multiple': '<path d=\"M30,30H28V25a5.0057,5.0057,0,0,0-5-5V18a7.0078,7.0078,0,0,1,7,7Z\"/><path d=\"M22,30H20V25a5.0059,5.0059,0,0,0-5-5H9a5.0059,5.0059,0,0,0-5,5v5H2V25a7.0082,7.0082,0,0,1,7-7h6a7.0082,7.0082,0,0,1,7,7Z\"/><path d=\"M20,2V4a5,5,0,0,1,0,10v2A7,7,0,0,0,20,2Z\"/><path d=\"M12,4A5,5,0,1,1,7,9a5,5,0,0,1,5-5m0-2a7,7,0,1,0,7,7A7,7,0,0,0,12,2Z\"/>',\n 'user--profile': '<path d=\"M12,4A5,5,0,1,1,7,9a5,5,0,0,1,5-5m0-2a7,7,0,1,0,7,7A7,7,0,0,0,12,2Z\"/><path d=\"M22,30H20V25a5,5,0,0,0-5-5H9a5,5,0,0,0-5,5v5H2V25a7,7,0,0,1,7-7h6a7,7,0,0,1,7,7Z\"/><path d=\"M22 4H32V6H22z\"/><path d=\"M22 9H32V11H22z\"/><path d=\"M22 14H29V16H22z\"/>',\n '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\"/>',\n 'wallet': '<path d=\"M22 17H24V19H22z\"/><path d=\"M28,8H4V5H26V3H4A2,2,0,0,0,2,5V26a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10A2,2,0,0,0,28,8ZM4,26V10H28v3H20a2,2,0,0,0-2,2v6a2,2,0,0,0,2,2h8v3ZM28,15v6H20V15Z\"/>',\n '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\"/>',\n '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\tc-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\tC16.8,22,17.5,22.7,17.5,23.5z M17.1,8h-2.2v11h2.2V8z\" data-icon-path=\"inner-path\" opacity=\"0\"/>',\n};\n","/** Canonical Pire icon names are Lucide slugs; the shipped IBM Carbon pack is reached through\n * this map, so swapping packs never touches a call site. A new icon name used by a component\n * must be added here — that is the whole registration step.\n *\n * This file is also the single source of truth for *which glyphs get vendored*:\n * `scripts/generate-icon-data.mjs` reads it and inlines the matching SVG from\n * `@carbon/icons` into `icon-data.generated.ts`. The script cannot import TypeScript, so it\n * parses this object textually. **Every entry must stay a literal `'name': 'slug',` pair.**\n * A spread, a computed key or a template literal is invisible to the generator: the glyph\n * never gets vendored and `Icon` warns at runtime instead of rendering. Multiple names may\n * point at one slug (`boxes` and `package` both mean `box`); the generator de-duplicates.\n */\nexport const CARBON_MAP: Record<string, string> = {\n 'menu':'menu','search':'search','bell':'notification','help-circle':'help','grid-3x3':'grid',\n 'home':'home','file-text':'document','clipboard-list':'list--checked','building-2':'building',\n 'boxes':'box','truck':'delivery-truck','stamp':'checkmark--outline','check':'checkmark','x':'close',\n 'minus':'subtract','plus':'add','trash-2':'trash-can','printer':'printer','paperclip':'attachment',\n 'download':'download','calendar':'calendar','hash':'hashtag','history':'recently-viewed',\n 'calculator':'calculator','zap':'flash','palette':'color-palette','settings':'settings',\n 'sliders-horizontal':'settings--adjust','filter':'filter','rows-3':'list','align-justify':'list--boxes',\n 'more-vertical':'overflow-menu--vertical','alert-triangle':'warning--alt','alert-octagon':'error--filled',\n 'alert-circle':'warning--filled','check-circle-2':'checkmark--filled','x-circle':'misuse',\n 'info':'information','circle':'circle-dash','chevron-right':'chevron--right','chevron-left':'chevron--left',\n 'chevron-down':'chevron--down','chevrons-up-down':'chevron--sort','arrow-right':'arrow--right',\n 'arrow-up':'arrow--up','arrow-down':'arrow--down','trending-up':'arrow--up','trending-down':'arrow--down',\n 'shopping-cart':'shopping--cart','user':'user','shapes':'apps','type':'text--font',\n 'package':'box','warehouse':'building--insights-1','arrow-up-down':'arrows--vertical','scan-line':'qr-code',\n 'circle-alert':'warning--filled','clock':'time','layers':'layers','map-pin':'location','copy':'copy',\n 'refresh-cw':'renew','external-link':'launch','pencil':'edit','lock':'locked','eye':'view','minimize-2':'minimize',\n\n /* --- Direction and chrome, completing the sets above --------------------\n `chevron-up` and `arrow-left` were missing while their three siblings shipped, so a collapsible\n that pointed down had nothing to point back up with. */\n 'chevron-up':'chevron--up','arrow-left':'arrow--left','more-horizontal':'overflow-menu--horizontal',\n 'maximize-2':'maximize','log-out':'logout','log-in':'login','archive':'archive','folder':'folder',\n 'book':'book','notebook':'notebook','asterisk':'asterisk','bookmark':'bookmark','star':'star',\n 'star-filled':'star--filled','tag':'tag','repeat':'repeat','undo-2':'undo','redo-2':'redo',\n 'rotate-ccw':'reset','table':'table--split','database':'data--base','function-square':'function',\n\n /* --- Money -------------------------------------------------------------\n `credit-card` is here because its absence shipped: it resolved to nothing, rendered an empty\n box, and reached production on the payment notifications. Carbon spells it `payment--methods`,\n which is exactly the kind of mismatch this map exists to absorb. */\n 'credit-card':'payment--methods','wallet':'wallet','banknote':'money','coins':'currency',\n 'dollar-sign':'currency--dollar','euro':'currency--euro','receipt':'receipt','percent':'percentage',\n 'piggy-bank':'piggy-bank','landmark':'bank--vault','scale':'scales','purchase':'purchase',\n\n /* --- Documents and ERP objects ----------------------------------------- */\n 'file-signature':'request-quote','scroll-text':'license','file-plus':'document--add','save':'save',\n 'file-bar-chart':'report','list-todo':'task','check-square':'task--complete','gavel':'rule',\n 'id-card':'identification','briefcase':'portfolio','handshake':'partnership','lightbulb':'idea',\n 'inventory':'inventory-management','package-2':'delivery--parcel','shopping-bag':'shopping--bag',\n 'barcode':'barcode','qr-code':'qr-code','git-branch':'flow','bug':'debug',\n\n /* --- People and contact ------------------------------------------------- */\n 'users':'user--multiple','user-plus':'user--follow','user-cog':'user--admin','user-circle':'user--profile',\n 'mail':'email','phone':'phone','send':'send','globe':'globe','building':'location--company',\n\n /* --- Charts and time ---------------------------------------------------- */\n 'bar-chart-3':'chart--column','bar-chart-horizontal':'chart--bar','line-chart':'chart--line',\n 'pie-chart':'chart--pie','area-chart':'chart--area','calendar-days':'events','calendar-plus':'calendar--add',\n 'calendar-heatmap':'calendar--heat-map',\n\n /* --- Transfer ----------------------------------------------------------- */\n 'cloud-upload':'cloud--upload','cloud-download':'cloud--download','filter-x':'filter--edit',\n 'arrow-up-narrow-wide':'sort--ascending','arrow-down-wide-narrow':'sort--descending',\n 'badge-info':'information--square',\n};\n\n/**\n * Every name `Icon` can render, frozen and sorted.\n *\n * Exported because an unknown slug fails quietly — an empty box and one dev-only console warning,\n * which is easy to lose in a busy log. A consumer that generates icon names from data can assert\n * against this list at build time instead of discovering the gap in production, which is how\n * `credit-card` shipped as a blank square.\n */\nexport const ICON_NAMES: readonly string[] = Object.freeze(Object.keys(CARBON_MAP).sort());\n","import type * as React from 'react';\nimport { ICON_MARKUP } from './icon-data.generated';\nimport { CARBON_MAP } from './icon-map';\n\n/** The package has no `@types/node`, and it should not need one for a browser library — but the\n * literal token `process.env.NODE_ENV` has to survive into the output for a bundler to substitute\n * it. Declared inside the module rather than globally so it shadows, and cannot clash with, the\n * `process` that `@types/node` contributes when it is present in a consumer's graph. */\ndeclare const process: { env: { NODE_ENV?: string } };\n\n/** Dev-only diagnostics. Every bundler replaces `process.env.NODE_ENV` statically, so the warnings\n * and their registry are dead code a minifier drops from production builds. Do *not* wrap this in\n * `typeof process !== 'undefined'`: `process` is genuinely undefined in the browser, the `typeof`\n * test is not something a bundler substitutes, and the guard would evaluate false in development —\n * silencing the warnings this exists to emit. This is the same bare check react-aria-components\n * ships, so it is already in every consumer's bundle. */\nconst IS_DEV = process.env.NODE_ENV !== 'production';\n\nconst warned = new Set<string>();\n/** One warning per distinct cause. Icons re-render on every keystroke in a filter bar, so warning\n * per render would bury the message in its own repetitions. */\nfunction warnOnce(key: string, message: string): void {\n if (warned.has(key)) return;\n warned.add(key);\n console.warn(`[pire] ${message}`);\n}\n\n/** @deprecated Retained only so existing `pack` values still typecheck. Glyphs are bundled from\n * the Carbon pack; there is no second pack and no remote fetch, so the value is ignored. */\nexport type IconPack = 'carbon' | 'lucide';\n\nexport interface IconConfig {\n /** @deprecated Ignored. The bundled Carbon pack is the only pack — `lucide` was a remote-URL\n * pack and no longer exists. Setting this warns in development. */\n pack?: IconPack;\n /** @deprecated Ignored — glyphs are inlined in the bundle, so there is nothing to serve from a\n * folder. Apps that vendored `<slug>.svg` files into `public/` to survive offline can delete\n * both the files and this call. Setting it warns in development. */\n base?: string;\n /** Escape hatch for a glyph Pire does not bundle, or to override one. Return the *inner* markup\n * of a 32x32 SVG (`'<path d=\"…\"/>'`), or `undefined` to fall through to the bundled set. The\n * string is injected as-is, so it must be authored markup, never user input. */\n resolve?: (name: string) => string | undefined;\n}\n\nlet config: IconConfig = {};\n\n/** Optional. The bundled Carbon set needs no configuration — this exists only to register glyphs\n * Pire does not ship, once at startup. */\nexport function configureIcons(next: IconConfig): void {\n config = { ...config, ...next };\n if (!IS_DEV) return;\n if (next.base !== undefined) {\n warnOnce(\n 'config:base',\n '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.',\n );\n }\n if (next.pack !== undefined) {\n warnOnce(\n 'config:pack',\n 'configureIcons({ pack }) is ignored: the bundled Carbon pack is the only pack. Use configureIcons({ resolve }) to supply a glyph Pire does not ship.',\n );\n }\n}\n\nexport interface IconProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {\n /** Canonical (Lucide) slug, e.g. \"shopping-cart\". Translated to the Carbon pack automatically. */\n name: string;\n /** Pixel box. 16 in dense UI, 20 in headers, 24 in tiles. */\n size?: number;\n /** Accessible name. Omit for decorative icons — they are hidden from assistive tech. */\n label?: string;\n /** @deprecated Ignored. See {@link IconConfig.pack}. */\n pack?: IconPack;\n}\n\n/** Glyph rendered as inline SVG filled with `currentColor`, so it inherits text colour everywhere\n * and paints with no network at all — which the previous CDN-backed implementation did not, leaving\n * every icon blank offline in the PWAs that consume this library.\n *\n * An unknown name still renders nothing, so a typo cannot collapse a layout, but it warns in\n * development: the silent blank gap was the failure mode worth killing. */\nexport function Icon({ name, size = 16, label, pack, style, ...rest }: IconProps) {\n const markup = config.resolve?.(name) ?? ICON_MARKUP[CARBON_MAP[name] ?? name];\n if (IS_DEV) {\n if (pack !== undefined) {\n warnOnce(\n 'prop:pack',\n 'The Icon `pack` prop is ignored: the bundled Carbon pack is the only pack. Drop the prop.',\n );\n }\n if (markup === undefined) {\n warnOnce(\n `missing:${name}`,\n `Unknown icon name \"${name}\" — nothing will render. Add it to CARBON_MAP in src/components/core/icon-map.ts and rebuild, or register it with configureIcons({ resolve }).`,\n );\n }\n }\n return (\n <span\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n data-icon={name}\n {...rest}\n style={{ display: 'inline-block', flex: '0 0 auto', width: size, height: size, ...style }}\n >\n {markup === undefined ? (\n // A broken icon has to look broken. In development the box gets a dashed outline so the\n // gap is visible on screen instead of only in a console warning that is easy to lose in a\n // busy log — which is how a missing `credit-card` reached production as a blank square.\n // Production still renders nothing at all: a dev diagnostic must never become a user's\n // first sight of a defect. Deliberately not an <svg>, so nothing reads it as a real glyph.\n IS_DEV ? <span className=\"pire-icon-missing\" title={`Unknown icon: ${name}`} /> : null\n ) : (\n <svg viewBox=\"0 0 32 32\" width={size} height={size} fill=\"currentColor\" focusable=\"false\"\n aria-hidden=\"true\" style={{ display: 'block' }}\n // The markup is build-time output of scripts/generate-icon-data.mjs, or a string the app\n // itself handed to configureIcons — never user input. Parsing it into React elements\n // would mean shipping an SVG parser to do what the browser already does.\n // biome-ignore lint/security/noDangerouslySetInnerHtml: build-time generated icon markup.\n dangerouslySetInnerHTML={{ __html: markup }}\n />\n )}\n </span>\n );\n}\n","import * as React from 'react';\nimport { Button as AriaButton, type ButtonProps as AriaButtonProps } from 'react-aria-components';\nimport { Icon } from './Icon';\nimport { cx } from '../utils/cx';\n\nexport interface ButtonProps extends Omit<AriaButtonProps, 'className' | 'children'> {\n children?: React.ReactNode;\n /** primary = one per view. secondary = default action. tertiary = low-stakes/inline.\n * danger = destructive. emphasized = on the dark shell. */\n variant?: 'primary' | 'secondary' | 'tertiary' | 'danger' | 'emphasized';\n /** sm = table rows & toolbars, md = default forms, lg = full-width CTAs. */\n size?: 'sm' | 'md' | 'lg';\n /** Icon slug rendered before the label. */\n icon?: string;\n /** Icon slug rendered after the label. */\n iconEnd?: string;\n fullWidth?: boolean;\n className?: string;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n { children, variant = 'secondary', size = 'md', icon, iconEnd, fullWidth, className, ...rest }, ref,\n) {\n return (\n <AriaButton ref={ref} className={cx('pire-btn', className)} data-variant={variant} data-size={size}\n data-full-width={fullWidth ? 'true' : undefined} {...rest}>\n {icon ? <Icon name={icon} size={16} /> : null}\n {children}\n {iconEnd ? <Icon name={iconEnd} size={16} /> : null}\n </AriaButton>\n );\n});\n","/** Joins truthy class names. Kept local so the package has no runtime class-name dependency. */\nexport function cx(...parts: Array<string | false | null | undefined>) {\n return parts.filter(Boolean).join(' ');\n}\n","import * as React from 'react';\nimport { Button as AriaButton, type ButtonProps as AriaButtonProps } from 'react-aria-components';\nimport { Icon } from './Icon';\nimport { Tooltip } from '../feedback/Tooltip';\nimport { cx } from '../utils/cx';\n\nexport interface IconButtonProps extends Omit<AriaButtonProps, 'className' | 'children' | 'aria-label'> {\n icon: string;\n /** Required accessible name — also the tooltip text. */\n label: string;\n size?: 'sm' | 'md' | 'lg';\n /** inverse = on the dark shell bar. outlined = standalone beside fields. */\n variant?: 'tertiary' | 'outlined' | 'inverse';\n selected?: boolean;\n /** Suppress the tooltip when the control already sits inside one. */\n hideTooltip?: boolean;\n /**\n * Indicator over the icon. `0` and `undefined` draw nothing — a badge reading \"0\" is noise.\n *\n * Drawn `aria-hidden`, so **`label` must carry the number itself** (\"Notifications, 3 unread\").\n * Pire cannot compose that sentence: it does not know the noun, and word order differs by\n * language. Passing `count` without putting it in `label` hides the count from screen readers.\n */\n count?: number;\n /** Cap before rendering \"N+\". Default 9. */\n countMax?: number;\n /** `dot` when \"something is new\" is the whole message and the number adds nothing. */\n countVariant?: 'number' | 'dot';\n className?: string;\n}\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { icon, label, size = 'md', variant = 'tertiary', selected, hideTooltip,\n count, countMax = 9, countVariant = 'number', className, ...rest }, ref,\n) {\n const showsCount = count != null && count > 0;\n const button = (\n <AriaButton ref={ref} aria-label={label} aria-pressed={selected} className={cx('pire-iconbtn', className)}\n data-size={size} data-variant={variant} data-selected={selected ? 'true' : undefined}\n data-has-count={showsCount ? 'true' : undefined} {...rest}>\n <Icon name={icon} size={size === 'lg' ? 20 : 16} />\n {showsCount ? (\n <span className=\"pire-iconbtn-count\" data-variant={countVariant} aria-hidden=\"true\">\n {countVariant === 'number' ? (count > countMax ? `${countMax}+` : count) : null}\n </span>\n ) : null}\n </AriaButton>\n );\n return hideTooltip ? button : <Tooltip label={label}>{button}</Tooltip>;\n});\n","import * as React from 'react';\nimport { TooltipTrigger, Tooltip as AriaTooltip, OverlayArrow, Focusable } from 'react-aria-components';\nimport { cx } from '../utils/cx';\n\nexport interface TooltipProps {\n /** Short clarifying text — never the only source of an instruction. */\n label: React.ReactNode;\n placement?: 'top' | 'bottom' | 'left' | 'right';\n /** Hover delay in ms. Keyboard focus always shows it immediately. */\n delay?: number;\n /**\n * Anything — a Button, a Badge, a span, plain text.\n *\n * A child that cannot take focus on its own is made focusable for you. That is the point: a\n * tooltip on something unreachable by keyboard is invisible to anyone not using a mouse, and it\n * fails silently — a dead tooltip is indistinguishable from a live one until somebody hovers it.\n */\n children: React.ReactNode;\n}\n\n/**\n * Explains something without adding a step. Shows on hover after `delay`, and immediately on\n * keyboard focus.\n *\n * Never put an instruction here that is not available elsewhere: there is no hover on touch.\n */\nexport function Tooltip({ label, placement = 'top', delay = 500, children }: TooltipProps) {\n /**\n * `Focusable` clones its child rather than wrapping it in a node, so an already-focusable child\n * keeps exactly one tab stop while a non-focusable one simply gains `tabindex=\"0\"`. That is what\n * makes this unconditional — no prop asking the caller whether their child takes focus, and no\n * guessing at render time.\n *\n * The class rides along so the focus ring can live in components.css. React Aria sets only\n * `tabindex` here, no `data-focus-visible`, so the ring would otherwise come from base.css's\n * `[tabindex]:focus-visible` — and base.css is the layer a consumer migrating off Tailwind skips.\n */\n const target = React.isValidElement<{ className?: string }>(children)\n ? React.cloneElement(children, { className: cx(children.props.className, 'pire-tooltip-target') })\n : <span className=\"pire-tooltip-target\">{children}</span>;\n\n return (\n <TooltipTrigger delay={delay} closeDelay={0}>\n <Focusable>{target}</Focusable>\n <AriaTooltip className=\"pire-tooltip\" placement={placement} offset={6}>\n <OverlayArrow><span /></OverlayArrow>\n {label}\n </AriaTooltip>\n </TooltipTrigger>\n );\n}\n","import type * as React from 'react';\nimport { Icon } from './Icon';\nimport { cx } from '../utils/cx';\n\nexport type BadgeStatus = 'positive' | 'critical' | 'negative' | 'informative' | 'neutral';\n\nconst STATUS_ICON: Record<BadgeStatus, string> = {\n positive: 'check-circle-2', critical: 'alert-triangle', negative: 'x-circle',\n informative: 'info', neutral: 'circle',\n};\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Semantic value state. Colour is never the only signal — the icon carries the same meaning. */\n status?: BadgeStatus;\n showIcon?: boolean;\n}\n\n/** Value state on an object or row. Text is the label, never a bare colour dot. */\nexport function Badge({ children, status = 'neutral', showIcon = true, className, ...rest }: BadgeProps) {\n return (\n <span className={cx('pire-badge', className)} data-status={status} {...rest}>\n {showIcon ? <Icon name={STATUS_ICON[status]} size={12} /> : null}\n {children}\n </span>\n );\n}\n","import type * as React from 'react';\nimport { Button as AriaButton } from 'react-aria-components';\nimport { Icon } from './Icon';\nimport { cx } from '../utils/cx';\n\nexport interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Provide to render the remove affordance — filter tokens, multi-select values. */\n onRemove?: () => void;\n isDisabled?: boolean;\n}\n\n/** A removable token: applied filters, multi-select values. */\nexport function Tag({ children, onRemove, isDisabled, className, ...rest }: TagProps) {\n return (\n <span className={cx('pire-tag', className)} data-disabled={isDisabled ? 'true' : undefined} {...rest}>\n {children}\n {onRemove ? (\n <AriaButton className=\"pire-tag-remove\" isDisabled={isDisabled} onPress={onRemove}\n aria-label={`Remove ${typeof children === 'string' ? children : 'filter'}`}>\n <Icon name=\"x\" size={12} />\n </AriaButton>\n ) : null}\n </span>\n );\n}\n","import type * as React from 'react';\nimport { Icon } from './Icon';\nimport { cx } from '../utils/cx';\n\nexport interface CardProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n icon?: string;\n /** Header-right actions — usually IconButtons. */\n actions?: React.ReactNode;\n /** Right-aligned footer actions, separated by a hairline. */\n footer?: React.ReactNode;\n /** Raises the shadow on hover and sets a pointer cursor. Pair with onClick and a heading link. */\n interactive?: boolean;\n}\n\nexport function Card({ title, subtitle, icon, actions, footer, interactive, children, className, ...rest }: CardProps) {\n return (\n <section className={cx('pire-card', className)} data-interactive={interactive ? 'true' : undefined} {...rest}>\n {title || actions ? (\n <header className=\"pire-card-head\">\n {icon ? <Icon name={icon} size={20} style={{ color: 'var(--text-secondary)' }} /> : null}\n <div style={{ flex: 1, minWidth: 0 }}>\n <h3 className=\"pire-card-title\">{title}</h3>\n {subtitle ? <p className=\"pire-card-sub\" style={{ margin: 0 }}>{subtitle}</p> : null}\n </div>\n {actions ? <div style={{ display: 'flex', gap: 'var(--sp-1)' }}>{actions}</div> : null}\n </header>\n ) : null}\n {children ? <div className=\"pire-card-body\">{children}</div> : null}\n {footer ? <footer className=\"pire-card-foot\">{footer}</footer> : null}\n </section>\n );\n}\n","import * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Full name — initials are derived from the first two words. */\n name: string;\n size?: 'sm' | 'md' | 'lg';\n /** Optional photo. Falls back to initials if it fails to load. */\n src?: string;\n}\n\nconst initials = (name: string) => name.trim().split(/\\s+/).slice(0, 2).map((p) => p[0]).join('').toUpperCase();\n\n/** Identity chip for the shell bar, approval lists and history rows. Never the only way a person\n * is named — always sits beside or is labelled with the full name. */\nexport function Avatar({ name, size = 'md', src, className, ...rest }: AvatarProps) {\n const [failed, setFailed] = React.useState(false);\n return (\n <span className={cx('pire-avatar', className)} data-size={size} role=\"img\" aria-label={name} {...rest}>\n {src && !failed\n ? <img src={src} alt=\"\" onError={() => setFailed(true)}\n style={{ width: '100%', height: '100%', borderRadius: 'inherit', objectFit: 'cover' }} />\n : initials(name)}\n </span>\n );\n}\n","import * as React from 'react';\nimport { ToggleButtonGroup, ToggleButton } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { cx } from '../utils/cx';\n\nexport interface SegmentOption { id: string; label: string; icon?: string; isDisabled?: boolean }\n\nexport interface SegmentedControlProps {\n /** Names the choice for assistive tech, e.g. \"Row density\". */\n 'aria-label': string;\n options: SegmentOption[];\n value?: string;\n defaultValue?: string;\n onChange?: (id: string) => void;\n /** Show icons only; labels move into the accessible name and the tooltip. */\n iconOnly?: boolean;\n size?: 'sm' | 'md';\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Two to four mutually exclusive view options that change how data is displayed, not what it is:\n * row density, list vs chart, period. For filtering, use Select or Tabs. */\nexport function SegmentedControl({ options, value, defaultValue, onChange, iconOnly, size = 'sm',\n className, style, ...rest }: SegmentedControlProps) {\n const selected = React.useMemo(() => new Set(value ? [value] : defaultValue ? [defaultValue] : []), [value, defaultValue]);\n return (\n <ToggleButtonGroup className={cx('pire-segmented', className)} data-size={size} style={style}\n aria-label={rest['aria-label']} selectionMode=\"single\" disallowEmptySelection\n selectedKeys={selected} onSelectionChange={(keys) => {\n const first = [...keys][0];\n if (first != null) onChange?.(String(first));\n }}>\n {options.map((option) => (\n <ToggleButton key={option.id} id={option.id} className=\"pire-segmented-item\"\n isDisabled={option.isDisabled} aria-label={iconOnly ? option.label : undefined}>\n {option.icon ? <Icon name={option.icon} size={16} /> : null}\n {iconOnly ? null : option.label}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\n/** Colour hierarchy, named after the `--text-*` token each value resolves to. */\nexport type TextColor = 'primary' | 'secondary' | 'tertiary' | 'disabled' | 'inverse';\n\n/** Typographic scale, named after the `--type-*` tokens. */\nexport type TextSize = 'body' | 'body-lg' | 'caption' | 'micro';\n\n// `color` shadows a DOM attribute, so it must be Omitted before being redeclared.\nexport interface TextProps extends Omit<React.HTMLAttributes<HTMLElement>, 'color'> {\n /** Typographic scale. `body` covers most copy. */\n size?: TextSize;\n /** `secondary` for supporting copy, `tertiary` for metadata. */\n color?: TextColor;\n /** Raises weight without changing size. Same effect as wrapping in `<Strong>`. */\n weight?: 'regular' | 'strong';\n /** Tabular mono, right-aligned. Use for every amount, quantity and ID. */\n numeric?: boolean;\n /** Uppercase label for a block. Replaces the `.pire-eyebrow` helper. */\n eyebrow?: boolean;\n /** `true` clamps to one line; a number clamps to that many. */\n truncate?: boolean | number;\n /** `span` when inline, `div` when wrapping, `dd`/`li` inside lists. */\n elementType?: 'p' | 'span' | 'div' | 'dd' | 'li';\n className?: string;\n}\n\n/** Body copy, captions, metadata and eyebrows — everything that is text but not a heading. */\nexport function Text({\n size = 'body', color = 'primary', weight = 'regular', numeric, eyebrow, truncate,\n elementType: Wrapper = 'p', className, style, ...rest\n}: TextProps) {\n const lineClamp = typeof truncate === 'number' ? truncate : truncate ? 1 : undefined;\n const clampStyle = lineClamp == null\n ? style\n : ({ ['--pire-text-clamp' as string]: lineClamp, ...style } as React.CSSProperties);\n\n return (\n <Wrapper\n className={cx('pire-text', className)}\n data-size={size}\n data-color={color}\n data-weight={weight === 'strong' ? 'strong' : undefined}\n data-numeric={numeric ? 'true' : undefined}\n data-eyebrow={eyebrow ? 'true' : undefined}\n data-truncate={lineClamp != null ? 'true' : undefined}\n style={clampStyle}\n {...rest}\n />\n );\n}\n\nexport interface StrongProps extends Omit<React.HTMLAttributes<HTMLElement>, 'color'> {\n className?: string;\n}\n\n/** Inline emphasis. Sugar over `<Text weight=\"strong\" elementType=\"span\">`. */\nexport function Strong({ className, ...rest }: StrongProps) {\n return <Text elementType=\"span\" weight=\"strong\" className={className} {...rest} />;\n}\n","import type * as React from 'react';\nimport { Heading as AriaHeading } from 'react-aria-components';\nimport { cx } from '../utils/cx';\nimport type { TextColor } from './Text';\n\n// `color` shadows a DOM attribute, so it must be Omitted before being redeclared.\nexport interface HeadingProps extends Omit<React.HTMLAttributes<HTMLHeadingElement>, 'color'> {\n /** Semantic level. Picks the h1–h4 element and defines the document outline. */\n level?: 1 | 2 | 3 | 4;\n /** Visual scale, independent of `level`. Set it when a correct outline needs a different size. */\n size?: 'display' | 'h1' | 'h2' | 'h3' | 'h4';\n /** `secondary` for a supporting title. Same vocabulary as `Text`. */\n color?: TextColor;\n /** `true` clamps to one line; a number clamps to that many. */\n truncate?: boolean | number;\n className?: string;\n}\n\n/** Section and page titles. Built on React Aria's `Heading` so a `Dialog` picks it up as its name. */\nexport function Heading({\n level = 2, size, color = 'primary', truncate, className, style, ...rest\n}: HeadingProps) {\n const lineClamp = typeof truncate === 'number' ? truncate : truncate ? 1 : undefined;\n const clampStyle = lineClamp == null\n ? style\n : ({ ['--pire-text-clamp' as string]: lineClamp, ...style } as React.CSSProperties);\n\n return (\n <AriaHeading\n level={level}\n className={cx('pire-heading', className)}\n data-size={size ?? `h${level}`}\n data-color={color}\n data-truncate={lineClamp != null ? 'true' : undefined}\n style={clampStyle}\n {...rest}\n />\n );\n}\n","import type * as React from 'react';\nimport { Link as AriaLink, type LinkProps as AriaLinkProps } from 'react-aria-components';\nimport { Icon } from './Icon';\nimport { cx } from '../utils/cx';\nimport type { TextSize } from './Text';\n\nexport interface LinkProps extends Omit<AriaLinkProps, 'className' | 'children'> {\n children?: React.ReactNode;\n /** Inherits the surrounding size by default. Set it when the link stands alone. */\n size?: TextSize;\n /** Adds the launch glyph and `rel=\"noopener noreferrer\"`. Does not set `target`. */\n isExternal?: boolean;\n className?: string;\n}\n\n/** A real anchor with the system's link styling. Honours a `RouterProvider` when the app supplies one. */\nexport function Link({ children, size, isExternal, className, rel, ...rest }: LinkProps) {\n return (\n <AriaLink\n className={cx('pire-link', className)}\n data-size={size}\n data-external={isExternal ? 'true' : undefined}\n rel={isExternal ? (rel ?? 'noopener noreferrer') : rel}\n {...rest}\n >\n {children}\n {isExternal ? <Icon name=\"external-link\" size={12} className=\"pire-link-external\" /> : null}\n </AriaLink>\n );\n}\n","import { Separator as AriaSeparator, type SeparatorProps as AriaSeparatorProps } from 'react-aria-components';\nimport { cx } from '../utils/cx';\n\nexport interface SeparatorProps extends Omit<AriaSeparatorProps, 'className'> {\n /** `vertical` to divide actions inside a toolbar. */\n orientation?: 'horizontal' | 'vertical';\n /** `subtle` divides inside a card without chopping it up. */\n emphasis?: 'default' | 'subtle';\n /** `none` when the container already provides the rhythm. */\n spacing?: 'none' | 'sm' | 'md';\n className?: string;\n}\n\n/** A page-level divider. For rules inside a menu use `MenuSeparator`, which follows the menu's rhythm. */\nexport function Separator({\n orientation = 'horizontal', emphasis = 'default', spacing = 'md', className, ...rest\n}: SeparatorProps) {\n return (\n <AriaSeparator\n orientation={orientation}\n className={cx('pire-separator', className)}\n data-orientation={orientation}\n data-emphasis={emphasis}\n data-spacing={spacing}\n {...rest}\n />\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface KbdProps extends React.HTMLAttributes<HTMLElement> {\n /** One key per element — compose several for a chord: `<Kbd>⌘</Kbd><Kbd>K</Kbd>`. */\n children: React.ReactNode;\n /** `sm` for inline use inside running text, where a full-size cap sits taller than the line. */\n size?: 'sm' | 'md';\n}\n\n/**\n * A single key, drawn as a key cap.\n *\n * Renders a real `<kbd>`, so assistive tech announces it as keyboard input rather than as loose\n * text. It is painted only — nothing here binds a shortcut; that stays with the app.\n *\n * One key per element. A chord is several of these side by side, which keeps each cap the size of\n * its own glyph instead of stretching one cap across \"Ctrl+Shift+K\".\n */\nexport function Kbd({ children, size = 'md', className, ...rest }: KbdProps) {\n return (\n <kbd className={cx('pire-kbd', className)} data-size={size} {...rest}>{children}</kbd>\n );\n}\n","import type * as React from 'react';\nimport { Icon } from '../core/Icon';\nimport { cx } from '../utils/cx';\n\nexport interface FormFieldProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n label: React.ReactNode;\n /** id of the control this label points at. Required when wrapping a bare control. */\n htmlFor?: string;\n isRequired?: boolean;\n /** Static help text. Hidden while an error is shown. */\n hint?: React.ReactNode;\n /** Error message; rendered in an alert row with an icon. */\n error?: React.ReactNode;\n /** horizontal = right-aligned 160px label column, the ERP detail-form default. */\n layout?: 'stacked' | 'horizontal';\n children?: React.ReactNode;\n}\n\n/** Label + control + hint/error wrapper for controls that do not manage their own label\n * (most Pire controls do — use their `label` prop first). */\nexport function FormField({ label, htmlFor, isRequired, hint, error, layout = 'stacked', children, className, ...rest }: FormFieldProps) {\n return (\n <div className={cx('pire-field', className)} data-layout={layout} {...rest}>\n <label className=\"pire-field-label\" htmlFor={htmlFor}>\n {label}{isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </label>\n {children}\n {error ? (\n <span className=\"pire-field-error\" role=\"alert\"><Icon name=\"alert-circle\" size={12} />{error}</span>\n ) : hint ? <span className=\"pire-field-hint\">{hint}</span> : null}\n </div>\n );\n}\n","import * as React from 'react';\nimport { TextField, Label, Input as AriaInput, Group, Text, FieldError,\n Button as AriaButton } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface InputProps {\n label?: React.ReactNode;\n value?: string;\n defaultValue?: string;\n /** Receives the raw string value. */\n onChange?: (value: string) => void;\n placeholder?: string;\n /**\n * `date` is accepted for compatibility but reaches for the browser's native picker, which\n * ignores the token palette and behaves differently per browser. Use `DatePicker`, or\n * `DateRangePicker` for two ends.\n */\n type?: 'text' | 'search' | 'email' | 'number' | 'date' | 'password' | 'tel' | 'url';\n /** Leading icon slug — \"search\", \"calendar\", \"hash\". */\n icon?: string;\n /** Trailing static text: unit, currency, \"of 40\". */\n suffix?: React.ReactNode;\n /**\n * Adds a clear affordance once the field has a value.\n *\n * Use it on every search field. `type=\"search\"` gets one from the browser for free, but only in\n * Chrome and Safari, and it cannot be styled or sized — Pire hides that one so a search box does\n * not look different per browser. This is the replacement, and it is a real button: focusable,\n * labelled, and the same shape everywhere.\n *\n * Works controlled or uncontrolled.\n */\n isClearable?: boolean;\n /**\n * The clear button's visible text. Defaults to the dictionary's `inputClear`.\n *\n * Deliberately a word rather than an icon: an \"x\" beside a dialog's own close \"x\" reads as a\n * second way to dismiss the dialog. Keep it short — it sits inside the field.\n */\n clearLabel?: string;\n /** Help text below the field. Replaced by errorMessage when invalid. */\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isReadOnly?: boolean;\n isRequired?: boolean;\n size?: 'sm' | 'md' | 'lg';\n /** Right-aligned tabular mono — use for every amount, quantity and ID. */\n numeric?: boolean;\n fullWidth?: boolean;\n name?: string;\n autoFocus?: boolean;\n className?: string;\n style?: React.CSSProperties;\n inputRef?: React.Ref<HTMLInputElement>;\n}\n\n/** Single-line text entry. Labels, descriptions and errors are wired to the input by React Aria,\n * so no manual aria-describedby is ever needed. */\nexport function Input({ label, icon, suffix, description, errorMessage, size = 'md', numeric,\n isClearable, clearLabel, fullWidth = true, className, style, inputRef, onChange, ...rest }: InputProps) {\n const msg = usePireMessages();\n const isControlled = rest.value !== undefined;\n const [ownValue, setOwnValue] = React.useState(rest.defaultValue ?? '');\n const currentValue = isControlled ? rest.value : ownValue;\n const handleChange = (next: string) => { setOwnValue(next); onChange?.(next); };\n\n /**\n * A clearable, uncontrolled field is driven by Pire rather than by React Aria. There is no\n * imperative \"clear\" on TextField, and writing to the DOM node directly would leave React Aria's\n * own state holding the old value. Scoped to `isClearable` so every other Input keeps exactly\n * the behaviour it has today.\n */\n const takesOverValue = isClearable && !isControlled;\n const valueProps = takesOverValue ? { value: ownValue, defaultValue: undefined } : {};\n const showsClear = isClearable && currentValue !== '' && !rest.isDisabled && !rest.isReadOnly;\n return (\n <TextField className={cx('pire-field', className)} style={style} onChange={handleChange}\n validationBehavior=\"aria\" {...rest} {...valueProps}>\n {label ? (\n <Label className=\"pire-field-label\">\n {label}{rest.isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </Label>\n ) : null}\n <Group className=\"pire-control\" data-size={size} data-full-width={String(fullWidth)}\n data-invalid={rest.isInvalid ? 'true' : undefined} data-readonly={rest.isReadOnly ? 'true' : undefined}>\n {icon ? <Icon name={icon} size={16} className=\"pire-leading-icon\" /> : null}\n <AriaInput ref={inputRef} className=\"pire-input\" data-numeric={numeric ? 'true' : undefined} />\n {/* A labelled text button, not an \"x\": inside a dialog an icon-only x sits next to the\n dialog's own close x and reads as a second dismiss. The word says what it clears. */}\n {showsClear ? (\n <AriaButton className=\"pire-input-clear\" onPress={() => handleChange('')}>\n {clearLabel ?? msg.inputClear}\n </AriaButton>\n ) : null}\n {suffix ? <span className=\"pire-affix\">{suffix}</span> : null}\n </Group>\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n </TextField>\n );\n}\n","import * as React from 'react';\nimport { type PireMessages, enMessages } from './messages';\n\nconst MessagesContext = React.createContext<PireMessages>(enMessages);\n\nexport interface PireIntlProviderProps {\n /** Overrides merged over the English defaults, so a partial dictionary is enough. */\n messages?: Partial<PireMessages>;\n children?: React.ReactNode;\n}\n\n/**\n * Supplies the strings Pire renders itself. Mount once near the app root, alongside React Aria's\n * `I18nProvider` — that one localises React Aria's internals, this one localises Pire's.\n */\nexport function PireIntlProvider({ messages, children }: PireIntlProviderProps) {\n const value = React.useMemo(\n () => (messages ? { ...enMessages, ...messages } : enMessages),\n [messages],\n );\n\n return <MessagesContext.Provider value={value}>{children}</MessagesContext.Provider>;\n}\n\n/** Reads the active dictionary. Without a provider this returns the English defaults. */\nexport function usePireMessages(): PireMessages {\n return React.useContext(MessagesContext);\n}\n\n/**\n * Resolves one string, letting an explicit prop win over the dictionary.\n *\n * Components call this so a per-instance override is always available — a screen with two navs\n * needs to name them differently even when the dictionary is correct.\n */\nexport function useMessage(key: keyof PireMessages, override?: string): string {\n // Read the context unconditionally — `override ?? useContext(...)` short-circuits, which\n // changes the hook call order between renders.\n const messages = React.useContext(MessagesContext);\n return override ?? messages[key];\n}\n","/**\n * Every string Pire renders that the consumer did not supply.\n *\n * Keys are `<component><thing>`. Values are the English defaults, so a consumer that installs\n * nothing keeps working exactly as before.\n *\n * React Aria localises its own internals (date field segments, table sort announcements) through\n * `I18nProvider`, which Pire re-exports. This dictionary is the parallel for Pire's own strings —\n * install both to fully translate the UI.\n */\nexport interface PireMessages {\n /** FilterBar's landmark name. */\n filterBarLabel: string;\n /** Visible text of the apply button. Filters apply explicitly, never live. */\n filterBarGo: string;\n /** Visible text of the button that removes every active filter. */\n filterBarClearAll: string;\n\n /** Accessible name of the header checkbox that selects every row. */\n dataTableSelectAll: string;\n /** Accessible name of a row's selection checkbox. */\n dataTableSelectRow: string;\n /** Announced while the table body is a skeleton. */\n dataTableLoading: string;\n /** Row header announced for the totals row when the first column carries no summary cell. */\n dataTableSummaryRow: string;\n\n /** Accessible name of the dialog's close affordance. */\n dialogClose: string;\n /** Accessible name of SidePanel's close affordance. */\n sidePanelClose: string;\n\n /** Accessible name of InlineMessage's dismiss affordance. */\n inlineMessageDismiss: string;\n /** Accessible name of a toast's dismiss affordance. */\n toastDismiss: string;\n /** Landmark name of the toast live region. */\n toastRegionLabel: string;\n\n /** Accessible name of the button that opens a ComboBox's list. */\n /** Shown inside the popover when a Select has no options at all. A Select whose list is empty\n * used not to open, so the field read as broken; this is the text that explains it instead. */\n selectEmpty: string;\n\n comboBoxShowSuggestions: string;\n /** Row shown in the popover while a server search is in flight. */\n comboBoxLoading: string;\n\n /** Accessible name of the button that opens the calendar popover. */\n datePickerOpenCalendar: string;\n datePickerPreviousMonth: string;\n datePickerNextMonth: string;\n /** Groups the shortcut buttons beside the range calendar. */\n dateRangePresetsLabel: string;\n\n /** Accessible names of the NumberField steppers. */\n numberFieldIncrease: string;\n numberFieldDecrease: string;\n\n /** Accessible name of the button that clears a ValueHelpField. */\n /** Accessible name of the clear affordance on a clearable Input. */\n inputClear: string;\n\n /** Placeholder in the closed value-help field when nothing is picked. */\n valueHelpFieldPlaceholder: string;\n valueHelpFieldClear: string;\n /** Opens the value-help dialog. `{label}` is replaced with the field's own label. */\n valueHelpFieldOpenNamed: string;\n /** Same button, when the field has no string label to name it with. */\n valueHelpFieldOpen: string;\n /** Accessible name of ValueHelpDialog's search field. */\n valueHelpDialogSearch: string;\n /** Default dialog heading when the field does not supply one. */\n valueHelpDialogTitle: string;\n /** Placeholder in the value-help search box. */\n valueHelpDialogSearchPlaceholder: string;\n /** Shown when the search returns nothing. */\n valueHelpDialogEmpty: string;\n /** Visible text of ValueHelpDialog's cancel button. */\n valueHelpDialogCancel: string;\n\n /** Pagination's landmark name and its controls. */\n paginationLabel: string;\n /** Record range. `{from}`, `{to}` and `{total}` are replaced with formatted numbers. */\n paginationRange: string;\n /** Current page. `{page}` and `{pages}` are replaced. */\n paginationPageOf: string;\n paginationPrevious: string;\n paginationNext: string;\n paginationRowsPerPage: string;\n\n /** Landmark name of the main SideNav. Override it when a screen has more than one nav. */\n sideNavLabel: string;\n /** Names SplitPane's list column. */\n splitPaneList: string;\n /** Names SplitPane's detail column. */\n splitPaneDetail: string;\n /** Returns to the list when SplitPane is narrow enough to show one column. */\n splitPaneBack: string;\n\n /** Button that opens the OS file picker. */\n fileUploadChoose: string;\n /** Removes one picked file. `{name}` is replaced with the file name. */\n fileUploadRemoveNamed: string;\n /** Label on the progress bar while the app uploads. */\n fileUploadUploading: string;\n /** Instruction inside the drop surface. */\n fileDropZonePrompt: string;\n\n /** Accessible name of the ShellBar avatar once it opens a menu. `{user}` is the person's name. */\n shellBarUserMenu: string;\n\n /** Names the command palette dialog. */\n commandPaletteLabel: string;\n /** Accessible name of the palette's search input. */\n commandPaletteSearchLabel: string;\n /** Placeholder in the palette's input. */\n commandPalettePlaceholder: string;\n /** Shown when nothing matches what was typed. */\n commandPaletteEmpty: string;\n /** Shown while a server-backed search is in flight. */\n commandPaletteLoading: string;\n /** Footer hint beside the arrow-key glyphs. */\n commandPaletteHintNavigate: string;\n /** Footer hint beside the Enter glyph. */\n commandPaletteHintSelect: string;\n /** Footer hint beside the Esc glyph. */\n commandPaletteHintClose: string;\n\n /** Heading of the category column in a chart's data table. */\n chartCategoryHeader: string;\n /** Cell text where a chart series has no reading for a category. Never \"0\" — a gap is not a zero. */\n chartNoValue: string;\n /** Shown in place of the plot when a chart has nothing to draw. */\n chartEmpty: string;\n}\n\nexport const enMessages: PireMessages = {\n filterBarLabel: 'Filters',\n filterBarGo: 'Go',\n filterBarClearAll: 'Clear all',\n\n dataTableSelectAll: 'Select all rows',\n dataTableSelectRow: 'Select row',\n dataTableLoading: 'Loading records',\n dataTableSummaryRow: 'Summary',\n\n dialogClose: 'Close',\n sidePanelClose: 'Close panel',\n\n inlineMessageDismiss: 'Dismiss message',\n toastDismiss: 'Dismiss',\n toastRegionLabel: 'Notifications',\n\n selectEmpty: 'No options available',\n\n comboBoxShowSuggestions: 'Show suggestions',\n comboBoxLoading: 'Searching…',\n\n datePickerOpenCalendar: 'Open calendar',\n datePickerPreviousMonth: 'Previous month',\n datePickerNextMonth: 'Next month',\n dateRangePresetsLabel: 'Date range shortcuts',\n\n numberFieldIncrease: 'Increase',\n numberFieldDecrease: 'Decrease',\n\n inputClear: 'Clear',\n\n valueHelpFieldPlaceholder: 'Not selected',\n valueHelpFieldClear: 'Clear selection',\n valueHelpFieldOpenNamed: 'Select {label}',\n valueHelpFieldOpen: 'Open value help',\n valueHelpDialogSearch: 'Search records',\n valueHelpDialogTitle: 'Select a record',\n valueHelpDialogSearchPlaceholder: 'Search by ID or name',\n valueHelpDialogEmpty: 'No records found',\n valueHelpDialogCancel: 'Cancel',\n\n paginationLabel: 'Pagination',\n paginationRange: '{from}–{to} of {total}',\n paginationPageOf: 'Page {page} of {pages}',\n paginationPrevious: 'Previous page',\n paginationNext: 'Next page',\n paginationRowsPerPage: 'Rows per page',\n\n sideNavLabel: 'Main navigation',\n splitPaneList: 'List',\n splitPaneDetail: 'Detail',\n splitPaneBack: 'Back to list',\n\n fileUploadChoose: 'Choose files',\n fileUploadRemoveNamed: 'Remove {name}',\n fileUploadUploading: 'Uploading',\n fileDropZonePrompt: 'Drag files here, or choose them',\n\n shellBarUserMenu: 'Account menu for {user}',\n\n commandPaletteLabel: 'Command palette',\n commandPaletteSearchLabel: 'Search commands and records',\n commandPalettePlaceholder: 'Search for a screen, an action or a record…',\n commandPaletteEmpty: 'Nothing matches that',\n commandPaletteLoading: 'Searching…',\n commandPaletteHintNavigate: 'navigate',\n commandPaletteHintSelect: 'open',\n commandPaletteHintClose: 'close',\n\n chartCategoryHeader: 'Category',\n chartNoValue: 'No data',\n chartEmpty: 'No data for this period',\n};\n\nexport const esMessages: PireMessages = {\n filterBarLabel: 'Filtros',\n filterBarGo: 'Buscar',\n filterBarClearAll: 'Limpiar todo',\n\n dataTableSelectAll: 'Seleccionar todas las filas',\n dataTableSelectRow: 'Seleccionar fila',\n dataTableLoading: 'Cargando registros',\n dataTableSummaryRow: 'Resumen',\n\n dialogClose: 'Cerrar',\n sidePanelClose: 'Cerrar panel',\n\n inlineMessageDismiss: 'Descartar mensaje',\n toastDismiss: 'Descartar',\n toastRegionLabel: 'Notificaciones',\n\n selectEmpty: 'Sin opciones disponibles',\n\n comboBoxShowSuggestions: 'Mostrar sugerencias',\n comboBoxLoading: 'Buscando…',\n\n datePickerOpenCalendar: 'Abrir calendario',\n datePickerPreviousMonth: 'Mes anterior',\n datePickerNextMonth: 'Mes siguiente',\n dateRangePresetsLabel: 'Atajos de rango de fechas',\n\n numberFieldIncrease: 'Aumentar',\n numberFieldDecrease: 'Disminuir',\n\n inputClear: 'Limpiar',\n\n valueHelpFieldPlaceholder: 'Sin seleccionar',\n valueHelpFieldClear: 'Limpiar selección',\n valueHelpFieldOpenNamed: 'Seleccionar {label}',\n valueHelpFieldOpen: 'Abrir ayuda de valores',\n valueHelpDialogSearch: 'Buscar registros',\n valueHelpDialogTitle: 'Seleccionar un registro',\n valueHelpDialogSearchPlaceholder: 'Buscar por código o nombre',\n valueHelpDialogEmpty: 'No se encontraron registros',\n valueHelpDialogCancel: 'Cancelar',\n\n paginationLabel: 'Paginación',\n paginationRange: '{from}–{to} de {total}',\n paginationPageOf: 'Página {page} de {pages}',\n paginationPrevious: 'Página anterior',\n paginationNext: 'Página siguiente',\n paginationRowsPerPage: 'Filas por página',\n\n sideNavLabel: 'Navegación principal',\n splitPaneList: 'Lista',\n splitPaneDetail: 'Detalle',\n splitPaneBack: 'Volver a la lista',\n\n fileUploadChoose: 'Elegir archivos',\n fileUploadRemoveNamed: 'Quitar {name}',\n fileUploadUploading: 'Subiendo',\n fileDropZonePrompt: 'Arrastrá archivos acá, o elegilos',\n\n shellBarUserMenu: 'Menú de cuenta de {user}',\n\n commandPaletteLabel: 'Paleta de comandos',\n commandPaletteSearchLabel: 'Buscar comandos y registros',\n commandPalettePlaceholder: 'Buscá una pantalla, una acción o un registro…',\n commandPaletteEmpty: 'No hay coincidencias',\n commandPaletteLoading: 'Buscando…',\n commandPaletteHintNavigate: 'navegar',\n commandPaletteHintSelect: 'abrir',\n commandPaletteHintClose: 'cerrar',\n\n chartCategoryHeader: 'Categoría',\n chartNoValue: 'Sin datos',\n chartEmpty: 'Sin datos para este período',\n};\n","import * as React from 'react';\nimport { TextField, Label, TextArea as AriaTextArea, Group, Text, FieldError } from 'react-aria-components';\nimport { cx } from '../utils/cx';\n\n/* Measuring before paint is the whole point of autoGrow — useEffect would show one frame at the\n wrong height — but useLayoutEffect warns when it runs during server rendering, where there is\n nothing to measure anyway. */\nconst useIsomorphicLayoutEffect = typeof document === 'undefined' ? React.useEffect : React.useLayoutEffect;\n\nexport interface TextAreaProps {\n label?: React.ReactNode;\n value?: string;\n defaultValue?: string;\n /** Receives the raw string value. */\n onChange?: (value: string) => void;\n placeholder?: string;\n /** Help text below the field. Replaced by errorMessage when invalid. */\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isReadOnly?: boolean;\n isRequired?: boolean;\n size?: 'sm' | 'md' | 'lg';\n /** Visible lines before scrolling. Three is the ERP default: an address or a short note. */\n rows?: number;\n /** Grow with the content instead of scrolling. Off by default — see the component note. */\n autoGrow?: boolean;\n /** Ceiling for `autoGrow`, in lines. Beyond it the field scrolls, so a pasted essay\n * cannot push the form's buttons off screen. */\n maxRows?: number;\n fullWidth?: boolean;\n name?: string;\n autoFocus?: boolean;\n className?: string;\n style?: React.CSSProperties;\n textAreaRef?: React.Ref<HTMLTextAreaElement>;\n}\n\n/** Multi-line text entry — notes, addresses, rejection reasons. The prop API is Input's, so a\n * field can be swapped between the two without relearning; labels, descriptions and errors are\n * wired up by React Aria, so no manual aria-describedby is ever needed.\n *\n * `autoGrow` is opt-in, not always-on, for two reasons. It costs a synchronous measure-and-write\n * on every keystroke, and in a dense form it makes every field below the one being typed in jump\n * — the wrong trade in a screen the user is tabbing through. Turn it on where the content length\n * is genuinely unknown (a long free-text comment) and leave it off everywhere else. When on, the\n * height is only written when it actually changed, so a keystroke that does not wrap costs no\n * layout; and the resize grip is removed, since a manual height would be overwritten on the next\n * keystroke anyway. */\nexport function TextArea({ label, description, errorMessage, size = 'md', rows = 3, autoGrow,\n maxRows, fullWidth = true, className, style, textAreaRef, onChange, ...rest }: TextAreaProps) {\n const innerRef = React.useRef<HTMLTextAreaElement>(null);\n const ref = React.useCallback((node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n if (typeof textAreaRef === 'function') textAreaRef(node);\n else if (textAreaRef) (textAreaRef as React.RefObject<HTMLTextAreaElement | null>).current = node;\n }, [textAreaRef]);\n\n // Read from the DOM rather than from `rest.value`: the same measure has to run for the\n // uncontrolled case, where no value ever reaches this component.\n const grow = React.useCallback(() => {\n const el = innerRef.current;\n if (!el || !autoGrow) return;\n const styles = getComputedStyle(el);\n const lineHeight = Number.parseFloat(styles.lineHeight) || Number.parseFloat(styles.fontSize) * 1.5;\n const chrome = el.offsetHeight - el.clientHeight; // borders, which scrollHeight excludes\n // Collapse first: scrollHeight can never report less than the current height, so without\n // this the field would only ever grow, never shrink back when text is deleted.\n el.style.height = 'auto';\n const wanted = maxRows ? Math.min(el.scrollHeight, Math.ceil(lineHeight * maxRows)) : el.scrollHeight;\n const next = `${wanted + chrome}px`;\n // Only write when it changed — a keystroke that does not wrap must not dirty layout.\n if (el.style.height !== next) el.style.height = next;\n }, [autoGrow, maxRows]);\n\n // Layout effect, not an onChange hook: it has to run for controlled values pushed in from the\n // outside (a reset, a loaded record) as well as for typing, and before paint so the field never\n // renders one frame at the wrong height.\n useIsomorphicLayoutEffect(() => {\n if (!autoGrow) {\n if (innerRef.current) innerRef.current.style.height = '';\n return;\n }\n grow();\n }, [autoGrow, grow, rest.value]);\n\n return (\n <TextField className={cx('pire-field', className)} style={style} onChange={onChange}\n validationBehavior=\"aria\" {...rest}>\n {label ? (\n <Label className=\"pire-field-label\">\n {label}{rest.isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </Label>\n ) : null}\n <Group className=\"pire-control\" data-size={size} data-full-width={String(fullWidth)}\n data-multiline=\"true\" data-invalid={rest.isInvalid ? 'true' : undefined}\n data-readonly={rest.isReadOnly ? 'true' : undefined}>\n <AriaTextArea ref={ref} rows={rows} onInput={autoGrow ? grow : undefined}\n className={cx('pire-input', 'pire-textarea')} data-auto-grow={autoGrow ? 'true' : undefined} />\n </Group>\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n </TextField>\n );\n}\n","import type * as React from 'react';\nimport { Select as AriaSelect, Label, Button as AriaButton, SelectValue, Popover, ListBox,\n ListBoxItem, Text, FieldError } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport type SelectOption = string | { value: string; label: string; isDisabled?: boolean };\n\nexport interface SelectProps {\n label?: React.ReactNode;\n value?: string | null;\n defaultValue?: string;\n onChange?: (value: string) => void;\n options?: SelectOption[];\n /** Shown when nothing is selected. */\n placeholder?: string;\n /**\n * Replaces the dictionary's `selectEmpty` inside the popover when `options` is empty. Worth\n * setting whenever you can say *why* the list is empty — \"Pick a company first\" beats the\n * generic default, and an empty reference table is the usual cause.\n */\n emptyLabel?: React.ReactNode;\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isRequired?: boolean;\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n name?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst norm = (o: SelectOption) => (typeof o === 'string' ? { value: o, label: o, isDisabled: false } : o);\n\n/** Single-choice picker. Uses a listbox popover rather than a native <select> so the option\n * rows can carry Pire typography and keyboard behaviour is identical across browsers. */\nexport function Select({ label, value, defaultValue, onChange, options = [], placeholder = 'Select…',\n description, errorMessage, emptyLabel, size = 'md', fullWidth = true, className, style, ...rest }: SelectProps) {\n const msg = usePireMessages();\n const items = options.map(norm);\n return (\n <AriaSelect className={cx('pire-field', className)} style={style} selectedKey={value}\n defaultSelectedKey={defaultValue} onSelectionChange={(k) => onChange?.(String(k))}\n // Without this React Aria refuses to open on an empty collection — `useSelectState.open()`\n // is guarded by `collection.size !== 0 || props.allowsEmptyCollection`. The trigger then\n // swallows the click while staying enabled and reporting aria-expanded=\"false\", so the\n // field reads as broken rather than as empty. That reached users twice as \"the dropdown\n // doesn't work\", both times an unseeded reference table behind a required field.\n allowsEmptyCollection\n placeholder={placeholder} validationBehavior=\"aria\" {...rest}>\n {label ? (\n <Label className=\"pire-field-label\">\n {label}{rest.isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </Label>\n ) : null}\n <AriaButton className=\"pire-control\" data-size={size} data-full-width={String(fullWidth)}\n data-invalid={rest.isInvalid ? 'true' : undefined}>\n <SelectValue className=\"pire-select-value\" />\n <Icon name=\"chevron-down\" size={16} className=\"pire-leading-icon\" />\n </AriaButton>\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n <Popover className=\"pire-popover\">\n <ListBox className=\"pire-listbox\" items={items}\n // Same treatment ComboBox gives a server that answered with nothing, so the two\n // components read alike. Announced, because an empty listbox is otherwise silent.\n renderEmptyState={() => (\n <div className=\"pire-listbox-status\" role=\"status\" aria-live=\"polite\">\n {emptyLabel ?? msg.selectEmpty}\n </div>\n )}>\n {(item) => (\n <ListBoxItem className=\"pire-option\" id={item.value} textValue={item.label} isDisabled={item.isDisabled}>\n {item.label}\n </ListBoxItem>\n )}\n </ListBox>\n </Popover>\n </AriaSelect>\n );\n}\n","import type * as React from 'react';\nimport { Checkbox as AriaCheckbox, type CheckboxProps as AriaCheckboxProps } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { cx } from '../utils/cx';\n\nexport interface CheckboxProps extends Omit<AriaCheckboxProps, 'className' | 'children'> {\n label?: React.ReactNode;\n hint?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n}\n\nexport function Checkbox({ label, hint, children, className, ...rest }: CheckboxProps) {\n return (\n <AriaCheckbox className={cx('pire-choice', className)} {...rest}>\n {({ isSelected, isIndeterminate }) => (\n <>\n <span className=\"pire-choice-box\" aria-hidden=\"true\">\n {isIndeterminate ? <Icon name=\"minus\" size={12} /> : isSelected ? <Icon name=\"check\" size={12} /> : null}\n </span>\n <span>\n {label ?? children}\n {hint ? <span className=\"pire-choice-hint\">{hint}</span> : null}\n </span>\n </>\n )}\n </AriaCheckbox>\n );\n}\n","import type * as React from 'react';\nimport { RadioGroup as AriaRadioGroup, Radio as AriaRadio, Label, Text, FieldError,\n type RadioGroupProps as AriaRadioGroupProps, type RadioProps as AriaRadioProps } from 'react-aria-components';\nimport { cx } from '../utils/cx';\n\nexport interface RadioGroupProps extends Omit<AriaRadioGroupProps, 'className' | 'children'> {\n label?: React.ReactNode;\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n}\n\n/** Radios must live in a group — that is what gives arrow-key navigation and a single tab stop. */\nexport function RadioGroup({ label, description, errorMessage, children, className, ...rest }: RadioGroupProps) {\n return (\n <AriaRadioGroup className={cx('pire-field', className)} validationBehavior=\"aria\" {...rest}>\n {label ? <Label className=\"pire-field-label\">{label}</Label> : null}\n <div className=\"pire-radiogroup\">{children}</div>\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n </AriaRadioGroup>\n );\n}\n\nexport interface RadioProps extends Omit<AriaRadioProps, 'className' | 'children'> {\n label?: React.ReactNode;\n hint?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n}\n\nexport function Radio({ label, hint, children, className, ...rest }: RadioProps) {\n return (\n <AriaRadio className={cx('pire-choice', className)} {...rest}>\n <span className=\"pire-choice-box\" data-radio=\"true\" aria-hidden=\"true\" />\n <span>\n {label ?? children}\n {hint ? <span className=\"pire-choice-hint\">{hint}</span> : null}\n </span>\n </AriaRadio>\n );\n}\n","import type * as React from 'react';\nimport { Switch as AriaSwitch, type SwitchProps as AriaSwitchProps } from 'react-aria-components';\nimport { cx } from '../utils/cx';\n\nexport interface SwitchProps extends Omit<AriaSwitchProps, 'className' | 'children'> {\n label?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n}\n\n/** Immediate-effect toggle. For settings that need a save step, use a Checkbox. */\nexport function Switch({ label, children, className, ...rest }: SwitchProps) {\n return (\n <AriaSwitch className={cx('pire-choice', className)} {...rest}>\n <span className=\"pire-switch-track\" aria-hidden=\"true\"><span className=\"pire-switch-thumb\" /></span>\n <span>{label ?? children}</span>\n </AriaSwitch>\n );\n}\n","import type * as React from 'react';\nimport { ComboBox as AriaComboBox, Label, Input as AriaInput, Button as AriaButton, Group,\n Popover, ListBox, ListBoxItem, Text, FieldError } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface ComboBoxOption { value: string; label: string; secondary?: string; isDisabled?: boolean }\n\nexport interface ComboBoxProps {\n label?: React.ReactNode;\n value?: string | null;\n defaultValue?: string;\n onChange?: (value: string | null) => void;\n /**\n * Free-text as typed, on every keystroke. Debounce it before calling the server.\n *\n * Without `isFilteredExternally`, React Aria also applies its own local \"contains\" filter,\n * so a result whose label does not literally contain the typed text is hidden client-side.\n */\n onInputChange?: (text: string) => void;\n /**\n * The text in the input, controlled. Pair it with `onInputChange` or typing stops working.\n *\n * Needed whenever the parent has to *impose* the text rather than read it: clearing the field\n * on a form reset or a context switch, and rehydrating an edited line whose key is known but\n * whose label is not in `options` until the search comes back. Remounting via `key` also\n * clears the field, but it drops focus.\n */\n inputValue?: string;\n options?: Array<string | ComboBoxOption>;\n /**\n * `options` is the final list and React Aria filters nothing locally. Required for server\n * search: fuzzy matches, synonyms, code-to-description and server ranking do not survive a\n * local \"contains\" pass.\n *\n * Turns `options` into a controlled collection, so the popover reflects exactly what you\n * pass — including an empty list, which is why `isLoading` and `emptyLabel` exist.\n */\n isFilteredExternally?: boolean;\n /**\n * Shows a loading row instead of closing the popover. Without it a 300ms debounce reads as\n * a menu that flickers open and shut.\n *\n * Also blocks selection while it is set: confirming here would commit an item from the\n * previous response.\n */\n isLoading?: boolean;\n /** Overrides the dictionary's `comboBoxLoading`. */\n loadingLabel?: string;\n /**\n * Shown when the server answered with nothing. Without it the popover closes and the user\n * cannot tell a bad query from a slow one.\n */\n emptyLabel?: React.ReactNode;\n /** Called when the list is scrolled near its end, for paginated results. */\n onLoadMore?: () => void;\n placeholder?: string;\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isRequired?: boolean;\n isReadOnly?: boolean;\n /** Allow committing free text that isn't in `options`, instead of reverting to the last valid selection. */\n allowsCustomValue?: boolean;\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n name?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst norm = (o: string | ComboBoxOption): ComboBoxOption =>\n typeof o === 'string' ? { value: o, label: o } : o;\n\n/** Type-ahead picker for lists too long to scroll — material, cost centre, G/L account.\n * Below ~10 fixed options use Select; for master-data search with several columns use ValueHelpField. */\nexport function ComboBox({ label, value, defaultValue, onChange, onInputChange, inputValue, options = [],\n description, errorMessage, size = 'md', fullWidth = true, isFilteredExternally, isLoading,\n loadingLabel, emptyLabel, onLoadMore, className, style, ...rest }: ComboBoxProps) {\n const msg = usePireMessages();\n const items = options.map(norm);\n\n // `items` (controlled) skips React Aria's local filter; `defaultItems` applies it. That single\n // choice is the whole feature — see useComboBoxState, which reads\n // `props.items != null || !defaultFilter ? collection : filterCollection(...)`.\n const collection = isFilteredExternally ? { items } : { defaultItems: items };\n const showsStatus = isLoading || (isFilteredExternally && items.length === 0 && emptyLabel != null);\n\n return (\n <AriaComboBox className={cx('pire-field', className)} style={style} selectedKey={value}\n defaultSelectedKey={defaultValue}\n onSelectionChange={(k) => {\n // Ignore confirmations mid-flight: the highlighted row still belongs to the last response.\n if (isLoading) return;\n onChange?.(k == null ? null : String(k));\n }}\n // Forwarded by name rather than left to `...rest`: it is part of Pire's contract, not an\n // accident of prop spreading, and a consumer should not have to know it reaches React Aria.\n inputValue={inputValue} onInputChange={onInputChange} {...collection}\n // Always true under external filtering, not just while a status row shows. Gating it on\n // showsStatus closes the popover at the moment results land, because the flag flips false\n // in the same render the collection fills.\n allowsEmptyCollection={isFilteredExternally || isLoading}\n menuTrigger=\"input\" validationBehavior=\"aria\" {...rest}>\n {label ? (\n <Label className=\"pire-field-label\">\n {label}{rest.isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </Label>\n ) : null}\n <Group className=\"pire-control\" data-size={size} data-full-width={String(fullWidth)}\n data-invalid={rest.isInvalid ? 'true' : undefined}>\n <Icon name=\"search\" size={16} className=\"pire-leading-icon\" />\n <AriaInput className=\"pire-input\" placeholder={rest.placeholder} />\n <AriaButton className=\"pire-iconbtn\" data-size=\"sm\" aria-label={msg.comboBoxShowSuggestions} style={{ width: 20, height: 20 }}>\n <Icon name=\"chevron-down\" size={16} />\n </AriaButton>\n </Group>\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n <Popover className=\"pire-popover\">\n <ListBox className=\"pire-listbox\"\n onScroll={onLoadMore ? (e) => {\n // Fires on scroll rather than on an intersection observer so nothing is added below\n // the virtual focus while the user is still moving through the list.\n const el = e.currentTarget;\n if (el.scrollHeight - el.scrollTop - el.clientHeight < 48) onLoadMore();\n } : undefined}\n // React Aria strips aria-busy from ListBox, so this live region is the whole\n // announcement: without it a screen-reader user gets silence while the request is in\n // flight and cannot tell pending from empty.\n renderEmptyState={showsStatus ? () => (\n <div className=\"pire-listbox-status\" role=\"status\" aria-live=\"polite\">\n {isLoading ? (loadingLabel ?? msg.comboBoxLoading) : emptyLabel}\n </div>\n ) : undefined}>\n {(item: ComboBoxOption) => (\n <ListBoxItem className=\"pire-option\" id={item.value} textValue={item.label} isDisabled={item.isDisabled}>\n <span className=\"pire-option-label\">{item.label}</span>\n {item.secondary ? <span className=\"pire-option-secondary\">{item.secondary}</span> : null}\n </ListBoxItem>\n )}\n </ListBox>\n </Popover>\n </AriaComboBox>\n );\n}\n","import * as React from 'react';\nimport { ComboBox as AriaComboBox, Label, Input as AriaInput, Button as AriaButton, ButtonContext,\n Group, Popover, ListBox, ListBoxItem, Text, FieldError, VisuallyHidden } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { Tag } from '../core/Tag';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\nimport type { ComboBoxOption } from './ComboBox';\n\nexport interface MultiComboBoxProps {\n label?: React.ReactNode;\n /** Selected values, in the order they were picked. */\n value?: string[];\n defaultValue?: string[];\n onChange?: (values: string[]) => void;\n /**\n * Free-text as typed, on every keystroke. Debounce it before calling the server.\n *\n * Without `isFilteredExternally`, React Aria also applies its own local \"contains\" filter,\n * so a result whose label does not literally contain the typed text is hidden client-side.\n */\n onInputChange?: (text: string) => void;\n options?: Array<string | ComboBoxOption>;\n /**\n * `options` is the final list and React Aria filters nothing locally. Same meaning and same\n * name as on `ComboBox`. Required for server search, where fuzzy matches, synonyms and\n * server ranking do not survive a local \"contains\" pass.\n */\n isFilteredExternally?: boolean;\n /** Shows a loading row instead of closing the popover, and blocks selection while set. */\n isLoading?: boolean;\n /** Overrides the dictionary's `comboBoxLoading`. */\n loadingLabel?: string;\n /** Shown when the server answered with nothing, so a bad query reads differently from a slow one. */\n emptyLabel?: React.ReactNode;\n /** Called when the list is scrolled near its end, for paginated results. */\n onLoadMore?: () => void;\n placeholder?: string;\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isRequired?: boolean;\n isReadOnly?: boolean;\n /** Let Enter commit text that is not in `options` — how product tags get coined. */\n allowsCustomValue?: boolean;\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n name?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst norm = (o: string | ComboBoxOption): ComboBoxOption =>\n typeof o === 'string' ? { value: o, label: o } : o;\n\n/** Multi-value type-ahead: pick several options, each shown as a removable chip, and — with\n * `allowsCustomValue` — coin new ones by typing. Product tags, cost-centre sets, watchers.\n *\n * A separate component rather than a mode on ComboBox: ComboBox's `value` is a `string | null`\n * and its `onChange` emits one key, while multi-select needs an array on both. Folding the two\n * together would put a discriminated union in front of every existing consumer of\n * `ComboBoxProps` — a breaking change in exchange for a purely additive feature.\n *\n * Three things worth knowing before you use it:\n *\n * - **Free text commits on Enter, never on blur.** React Aria treats the input text as\n * independent of the selection in multi-select mode, so leaving the field discards whatever\n * was typed but not committed. The chips are the only record of what was entered.\n * - **Backspace on an empty input removes the last chip.** The handler runs in the capture\n * phase because React Aria's own key handling sits on the same input and would otherwise act\n * on the same key.\n * - **The chips are plain `Tag`s, not a React Aria TagGroup.** React Aria's ComboBox builds its\n * listbox collection by shallow-rendering its entire subtree, which swallows any collection\n * component nested inside it — a TagGroup there registers its tags as listbox items and then\n * crashes looking for grid state. Each chip's remove button is an ordinary Tab stop instead,\n * and removals are announced through the live region below. */\nexport function MultiComboBox({ label, value, defaultValue, onChange, onInputChange, options = [],\n description, errorMessage, allowsCustomValue, size = 'md',\n isFilteredExternally, isLoading, loadingLabel, emptyLabel, onLoadMore,\n fullWidth = true, className, style, ...rest }: MultiComboBoxProps) {\n const msg = usePireMessages();\n const items = React.useMemo(() => options.map(norm), [options]);\n // `items` (controlled) skips React Aria's local filter; `defaultItems` applies it.\n const collection = isFilteredExternally ? { items } : { defaultItems: items };\n const showsStatus = isLoading || (isFilteredExternally && items.length === 0 && emptyLabel != null);\n const [uncontrolled, setUncontrolled] = React.useState<string[]>(defaultValue ?? []);\n const [announcement, setAnnouncement] = React.useState('');\n const inputRef = React.useRef<HTMLInputElement>(null);\n const raw = value ?? uncontrolled;\n\n // React Aria compares the value array by reference on every render to decide whether the\n // selection changed — and, when it thinks it did, clears the input. An inline `value={['a']}`\n // is a fresh array every render, which would wipe the text mid-typing, so identity here\n // follows the contents rather than the caller's literal.\n const contentKey = raw.join('\\u0000');\n // biome-ignore lint/correctness/useExhaustiveDependencies: keyed on contents by design — see above.\n const values = React.useMemo(() => raw, [contentKey]);\n\n const labelOf = (v: string) => items.find((o) => o.value === v)?.label ?? v;\n /* A read-only field still lists its chips, but nothing about it may be edited — neither by the\n remove buttons nor by Backspace, neither of which the input's readonly attribute covers. */\n const isEditable = !rest.isDisabled && !rest.isReadOnly;\n\n const commit = (next: string[]) => {\n /* Removing a chip is the only change a screen reader cannot infer from somewhere else: the\n listbox announces its own selected state, but a chip that disappears — by button or by\n Backspace — is silent otherwise. */\n const added = next.find((v) => !values.includes(v));\n const removed = values.find((v) => !next.includes(v));\n if (added) setAnnouncement(`${labelOf(added)} added. ${next.length} selected.`);\n else if (removed) setAnnouncement(`${labelOf(removed)} removed. ${next.length} selected.`);\n if (value === undefined) setUncontrolled(next);\n onChange?.(next);\n };\n\n const remove = (v: string) => {\n commit(values.filter((x) => x !== v));\n // The pressed button is about to unmount, and focus would fall to <body> with it.\n inputRef.current?.focus();\n };\n\n /* Capture phase: React Aria's input keydown handler is on the same element, and a bubble-phase\n handler cannot stop it from also acting on the key. */\n const onKeyDownCapture = (e: React.KeyboardEvent<HTMLInputElement>) => {\n const el = e.currentTarget;\n if (!isEditable) return;\n if (e.key === 'Backspace' && el.value === '' && values.length > 0) {\n e.preventDefault();\n e.stopPropagation();\n commit(values.slice(0, -1));\n return;\n }\n if (e.key !== 'Enter' || !allowsCustomValue) return;\n const text = el.value.trim();\n // An option is highlighted — this Enter belongs to React Aria, which will select it.\n if (text === '' || el.getAttribute('aria-activedescendant')) return;\n // Typing an option's label in full must resolve to that option, not coin a duplicate under a\n // different key — otherwise \"Fragile\" typed and \"Fragile\" clicked are two chips on one record.\n const match = items.find((o) => o.label.toLowerCase() === text.toLowerCase());\n const next = match ? match.value : text;\n e.preventDefault();\n e.stopPropagation();\n if (!values.includes(next)) commit([...values, next]);\n };\n\n return (\n <AriaComboBox className={cx('pire-field', className)} style={style} selectionMode=\"multiple\"\n value={values} onChange={(keys) => { if (!isLoading) commit(keys.map(String)); }}\n onInputChange={onInputChange} {...collection}\n // Always true under external filtering: gating on showsStatus closes the popover at the\n // moment results land, because the flag flips false as the collection fills.\n allowsEmptyCollection={isFilteredExternally || isLoading}\n menuTrigger=\"input\" validationBehavior=\"aria\" {...rest}>\n {label ? (\n <Label className=\"pire-field-label\">\n {label}{rest.isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </Label>\n ) : null}\n <Group className=\"pire-control\" data-size={size} data-full-width={String(fullWidth)}\n data-multiline=\"true\" data-invalid={rest.isInvalid ? 'true' : undefined}\n data-readonly={rest.isReadOnly ? 'true' : undefined}>\n <Icon name=\"search\" size={16} className=\"pire-leading-icon\" />\n <div className=\"pire-chipfield\">\n {/* React Aria's ComboBox publishes its trigger-button props through ButtonContext, and\n every Button under it — including each chip's remove button — picks them up: the\n trigger's id (duplicated three ways), aria-haspopup, an aria-labelledby that\n outranks the chip's own label, and tabindex=\"-1\", which takes the chips out of the\n keyboard order entirely. Clearing the context is React Aria's own idiom for this\n (see how Popover clears contexts on the way into an overlay). */}\n <ButtonContext.Provider value={null}>\n {values.map((v) => (\n /* Disabled follows the field, not `isEditable`: a read-only field's chips are\n real, current values and should read as such — they simply lose the × . */\n <Tag key={v} isDisabled={rest.isDisabled} onRemove={isEditable ? () => remove(v) : undefined}>\n {labelOf(v)}\n </Tag>\n ))}\n </ButtonContext.Provider>\n <AriaInput ref={inputRef} className={cx('pire-input', 'pire-chipinput')}\n placeholder={rest.placeholder} onKeyDownCapture={onKeyDownCapture} />\n </div>\n <AriaButton className=\"pire-iconbtn\" data-size=\"sm\" aria-label={msg.comboBoxShowSuggestions} style={{ width: 20, height: 20 }}>\n <Icon name=\"chevron-down\" size={16} />\n </AriaButton>\n </Group>\n <VisuallyHidden><span aria-live=\"polite\">{announcement}</span></VisuallyHidden>\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n <Popover className=\"pire-popover\">\n <ListBox className=\"pire-listbox\"\n onScroll={onLoadMore ? (e) => {\n const el = e.currentTarget;\n if (el.scrollHeight - el.scrollTop - el.clientHeight < 48) onLoadMore();\n } : undefined}\n // React Aria strips aria-busy from ListBox, so this live region is the whole\n // announcement: without it a screen-reader user gets silence while the request is in\n // flight and cannot tell pending from empty.\n renderEmptyState={showsStatus ? () => (\n <div className=\"pire-listbox-status\" role=\"status\" aria-live=\"polite\">\n {isLoading ? (loadingLabel ?? msg.comboBoxLoading) : emptyLabel}\n </div>\n ) : undefined}>\n {(item: ComboBoxOption) => (\n <ListBoxItem className=\"pire-option\" id={item.value} textValue={item.label} isDisabled={item.isDisabled}>\n <span className=\"pire-option-label\">{item.label}</span>\n {item.secondary ? <span className=\"pire-option-secondary\">{item.secondary}</span> : null}\n </ListBoxItem>\n )}\n </ListBox>\n </Popover>\n </AriaComboBox>\n );\n}\n","import type * as React from 'react';\nimport { NumberField as AriaNumberField, Label, Input as AriaInput, Group, Button as AriaButton,\n Text, FieldError } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface NumberFieldProps {\n label?: React.ReactNode;\n /** Accessible name when `label` is omitted — e.g. in a table cell where the column header\n * already carries the visible text. A field with neither is unnamed and fails axe. */\n 'aria-label'?: string;\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n minValue?: number;\n maxValue?: number;\n step?: number;\n /** Intl.NumberFormat options — currency, unit, decimals. Locale comes from the app's I18nProvider. */\n formatOptions?: Intl.NumberFormatOptions;\n /** Trailing unit shown after the figure: EA, KG, %. */\n suffix?: React.ReactNode;\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isReadOnly?: boolean;\n isRequired?: boolean;\n /** Hide the increment/decrement buttons — typical inside dense table cells. */\n hideStepper?: boolean;\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n name?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Quantities, prices and any figure the user edits. Always right-aligned tabular mono, with\n * arrow-key and scroll stepping supplied by React Aria. */\nexport function NumberField({ label, suffix, description, errorMessage, hideStepper, size = 'md',\n fullWidth = true, className, style, ...rest }: NumberFieldProps) {\n const msg = usePireMessages();\n return (\n <AriaNumberField className={cx('pire-field', className)} style={style} validationBehavior=\"aria\" {...rest}>\n {label ? (\n <Label className=\"pire-field-label\">\n {label}{rest.isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </Label>\n ) : null}\n <Group className=\"pire-control\" data-size={size} data-full-width={String(fullWidth)}\n data-invalid={rest.isInvalid ? 'true' : undefined} data-readonly={rest.isReadOnly ? 'true' : undefined}>\n <AriaInput className=\"pire-input\" data-numeric=\"true\" />\n {suffix ? <span className=\"pire-affix\">{suffix}</span> : null}\n {hideStepper ? null : (\n <span className=\"pire-stepper\">\n <AriaButton slot=\"increment\" className=\"pire-stepper-btn\" aria-label={msg.numberFieldIncrease}><Icon name=\"plus\" size={10} /></AriaButton>\n <AriaButton slot=\"decrement\" className=\"pire-stepper-btn\" aria-label={msg.numberFieldDecrease}><Icon name=\"minus\" size={10} /></AriaButton>\n </span>\n )}\n </Group>\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n </AriaNumberField>\n );\n}\n","import type * as React from 'react';\nimport { DatePicker as AriaDatePicker, Label, Group, DateInput, DateSegment, Button as AriaButton,\n Popover, Dialog as AriaDialog, Calendar, CalendarGrid, CalendarGridHeader, CalendarHeaderCell,\n CalendarGridBody, CalendarCell, Heading, Text, FieldError } from 'react-aria-components';\nimport type { DateValue } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface DatePickerProps {\n label?: React.ReactNode;\n value?: DateValue | null;\n defaultValue?: DateValue | null;\n onChange?: (value: DateValue | null) => void;\n minValue?: DateValue;\n maxValue?: DateValue;\n /** Return true for dates that cannot be picked — factory calendar, blocked periods. */\n isDateUnavailable?: (date: DateValue) => boolean;\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isReadOnly?: boolean;\n isRequired?: boolean;\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n name?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Date entry with a segmented field and a calendar popover. Segments follow the user's locale,\n * so a German user types dd.mm.yyyy without any prop change. Wrap the app in React Aria's\n * I18nProvider to pin a locale. */\nexport function DatePicker({ label, description, errorMessage, size = 'md', fullWidth = true,\n className, style, ...rest }: DatePickerProps) {\n const msg = usePireMessages();\n return (\n <AriaDatePicker className={cx('pire-field', className)} style={style} validationBehavior=\"aria\" {...rest}>\n {label ? (\n <Label className=\"pire-field-label\">\n {label}{rest.isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </Label>\n ) : null}\n <Group className=\"pire-control\" data-size={size} data-full-width={String(fullWidth)}\n data-invalid={rest.isInvalid ? 'true' : undefined} data-readonly={rest.isReadOnly ? 'true' : undefined}>\n <DateInput className=\"pire-datefield\">\n {(segment) => <DateSegment segment={segment} className=\"pire-datesegment\" />}\n </DateInput>\n <AriaButton className=\"pire-iconbtn\" data-size=\"sm\" aria-label={msg.datePickerOpenCalendar} style={{ width: 24, height: 24 }}>\n <Icon name=\"calendar\" size={16} />\n </AriaButton>\n </Group>\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n <Popover className=\"pire-popover\">\n <AriaDialog>\n <Calendar className=\"pire-calendar\">\n <header className=\"pire-calendar-head\">\n <AriaButton slot=\"previous\" className=\"pire-iconbtn\" data-size=\"sm\" aria-label={msg.datePickerPreviousMonth}>\n <Icon name=\"chevron-left\" size={16} />\n </AriaButton>\n <Heading className=\"pire-calendar-title\" />\n <AriaButton slot=\"next\" className=\"pire-iconbtn\" data-size=\"sm\" aria-label={msg.datePickerNextMonth}>\n <Icon name=\"chevron-right\" size={16} />\n </AriaButton>\n </header>\n <CalendarGrid className=\"pire-calendar-grid\">\n <CalendarGridHeader>\n {(day) => <CalendarHeaderCell>{day}</CalendarHeaderCell>}\n </CalendarGridHeader>\n <CalendarGridBody>\n {(date) => <CalendarCell date={date} className=\"pire-calendar-cell\" />}\n </CalendarGridBody>\n </CalendarGrid>\n </Calendar>\n </AriaDialog>\n </Popover>\n </AriaDatePicker>\n );\n}\n","import type * as React from 'react';\nimport {\n DateRangePicker as AriaDateRangePicker, Label, Group, DateInput, DateSegment,\n Button as AriaButton, Popover, Dialog as AriaDialog, RangeCalendar, CalendarGrid,\n CalendarGridHeader, CalendarHeaderCell, CalendarGridBody, CalendarCell, Heading, Text, FieldError,\n} from 'react-aria-components';\nimport type { DateValue } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface DateRange {\n start: DateValue;\n end: DateValue;\n}\n\nexport interface DateRangePreset {\n id: string;\n label: string;\n /** The app computes the range: Pire cannot know when a customer's fiscal year starts. */\n range: () => DateRange;\n}\n\nexport interface DateRangePickerProps {\n label?: React.ReactNode;\n value?: DateRange | null;\n defaultValue?: DateRange | null;\n onChange?: (value: DateRange | null) => void;\n minValue?: DateValue;\n maxValue?: DateValue;\n /** Return true for dates that cannot be picked — blocked periods, closed books. */\n isDateUnavailable?: (date: DateValue) => boolean;\n /**\n * Longest range the caller accepts, in days. Exceeding it marks the field invalid so\n * `errorMessage` shows — the wording is the app's, since only it knows the limit's reason.\n *\n * Days rather than a duration: \"12 months\" is not a fixed number of days, so pick the bound\n * that matches your rule rather than expecting a calendar-aware one.\n */\n maxRangeDays?: number;\n /** Shortcuts beside the calendar: \"This month\", \"Last 30 days\". */\n presets?: DateRangePreset[];\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isReadOnly?: boolean;\n isRequired?: boolean;\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n /** HTML submit names for the two ends. */\n startName?: string;\n endName?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Whole days between the two ends, inclusive of both. */\nexport function rangeLengthInDays(range: DateRange): number {\n return range.end.toDate('UTC').getTime() / 86_400_000\n - range.start.toDate('UTC').getTime() / 86_400_000 + 1;\n}\n\n/**\n * Two dates that belong together — the default filter on 24 ERP screens.\n *\n * Built on React Aria's `DateRangePicker`, which supplies the segmented ends, the ordering rules\n * between them, and locale-driven segment order. Wrap the app in `I18nProvider` to pin a locale:\n * `es-PY` reads dd/mm/yyyy and `en-US` mm/dd/yyyy off the same value.\n */\nexport function DateRangePicker({\n label, description, errorMessage, maxRangeDays, presets, size = 'md', fullWidth = true,\n startName, endName, className, style, ...rest\n}: DateRangePickerProps) {\n const msg = usePireMessages();\n const current = rest.value ?? rest.defaultValue ?? null;\n const tooLong = maxRangeDays != null && current != null\n && rangeLengthInDays(current) > maxRangeDays;\n\n return (\n <AriaDateRangePicker\n className={cx('pire-field', className)} style={style}\n startName={startName} endName={endName}\n validationBehavior=\"aria\"\n {...rest}\n isInvalid={rest.isInvalid || tooLong}\n >\n {label ? (\n <Label className=\"pire-field-label\">\n {label}{rest.isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </Label>\n ) : null}\n\n <Group className=\"pire-control pire-daterange-control\" data-size={size}\n data-full-width={String(fullWidth)}\n data-invalid={rest.isInvalid || tooLong ? 'true' : undefined}\n data-readonly={rest.isReadOnly ? 'true' : undefined}>\n {/* Two independent segment groups, each named by React Aria. Do not collapse them under a\n single aria-label: a screen reader then cannot say which end it is editing. */}\n <DateInput slot=\"start\" className=\"pire-datefield\">\n {(segment) => <DateSegment segment={segment} className=\"pire-datesegment\" />}\n </DateInput>\n <span aria-hidden=\"true\" className=\"pire-daterange-dash\">–</span>\n <DateInput slot=\"end\" className=\"pire-datefield\">\n {(segment) => <DateSegment segment={segment} className=\"pire-datesegment\" />}\n </DateInput>\n <AriaButton className=\"pire-iconbtn\" data-size=\"sm\" aria-label={msg.datePickerOpenCalendar}\n style={{ width: 24, height: 24 }}>\n <Icon name=\"calendar\" size={16} />\n </AriaButton>\n </Group>\n\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n\n <Popover className=\"pire-popover\">\n <AriaDialog className=\"pire-daterange-dialog\">\n {presets?.length ? (\n // Before the calendar in the DOM, so keyboard users reach the shortcut without\n // arrowing through a month first.\n <div className=\"pire-daterange-presets\" role=\"group\" aria-label={msg.dateRangePresetsLabel}>\n {presets.map((preset) => (\n <AriaButton key={preset.id} className=\"pire-daterange-preset\"\n onPress={() => rest.onChange?.(preset.range())}>\n {preset.label}\n </AriaButton>\n ))}\n </div>\n ) : null}\n <RangeCalendar className=\"pire-calendar\">\n <header className=\"pire-calendar-head\">\n <AriaButton slot=\"previous\" className=\"pire-iconbtn\" data-size=\"sm\"\n aria-label={msg.datePickerPreviousMonth}>\n <Icon name=\"chevron-left\" size={16} />\n </AriaButton>\n <Heading className=\"pire-calendar-title\" />\n <AriaButton slot=\"next\" className=\"pire-iconbtn\" data-size=\"sm\"\n aria-label={msg.datePickerNextMonth}>\n <Icon name=\"chevron-right\" size={16} />\n </AriaButton>\n </header>\n <CalendarGrid className=\"pire-calendar-grid\">\n <CalendarGridHeader>\n {(day) => <CalendarHeaderCell>{day}</CalendarHeaderCell>}\n </CalendarGridHeader>\n <CalendarGridBody>\n {(date) => <CalendarCell date={date} className=\"pire-calendar-cell\" />}\n </CalendarGridBody>\n </CalendarGrid>\n </RangeCalendar>\n </AriaDialog>\n </Popover>\n </AriaDateRangePicker>\n );\n}\n","import * as React from 'react';\nimport { Input } from './Input';\nimport { IconButton } from '../core/IconButton';\nimport { ValueHelpDialog } from '../patterns/ValueHelpDialog';\nimport type { DataTableColumn } from '../data/DataTable';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface ValueHelpFieldProps<T extends { id: string | number } = any> {\n label?: React.ReactNode;\n /** The picked record, or null. */\n value?: T | null;\n onChange?: (row: T | null) => void;\n /** How the picked record reads in the closed field. Default: \"id — name\". */\n format?: (row: T) => string;\n /** Records offered in the dialog, and the columns that identify them. */\n rows?: T[];\n columns?: DataTableColumn<T>[];\n dialogTitle?: React.ReactNode;\n /**\n * Forwarded to {@link ValueHelpDialog}. Set `isFilteredExternally` and feed `rows` from\n * `onSearch` when the list is too large to sit in the browser — which is the usual case for\n * suppliers, customers and products.\n */\n onSearch?: (query: string) => void;\n isFilteredExternally?: boolean;\n isLoading?: boolean;\n onLoadMore?: () => void;\n /** Shown in the dialog when the search returns nothing. */\n emptyLabel?: string;\n placeholder?: string;\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isRequired?: boolean;\n /** Provide to render a clear affordance once a record is picked. */\n allowsClear?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Falls back to \"<id> — <human label>\", probing the usual master-data label fields in order. */\nconst defaultFormat = (row: { id: string | number; [field: string]: unknown }) =>\n [row.id, row.name ?? row.label ?? row.text].filter(Boolean).join(' — ');\n\n/** The ERP field that cannot be typed: a read-only display of the picked master-data record plus\n * the value-help trigger. Pairs Input with ValueHelpDialog so screens stop rewiring both. */\nexport function ValueHelpField<T extends { id: string | number }>({ label, value, onChange, format = defaultFormat,\n rows = [], columns = [], dialogTitle, onSearch, isFilteredExternally, isLoading, onLoadMore,\n emptyLabel, placeholder, description, errorMessage,\n isInvalid, isDisabled, isRequired, allowsClear, className, style }: ValueHelpFieldProps<T>) {\n const msg = usePireMessages();\n const [open, setOpen] = React.useState(false);\n return (\n <div className={cx(className)} style={style}>\n {/* The triggers live inside the field's control rather than beside it. As siblings of Input\n they aligned to the bottom of the whole field — label, control *and* description — so any\n field with a description pushed them below the input. Inside the control they align to\n the input row by construction, at any size and however long the description runs, and the\n three read as one control instead of a field with two boxes parked next to it.\n Input keeps ownership of description and errorMessage, so React Aria's aria-describedby\n wiring is untouched; moving them out to fix the layout would have cost that. */}\n <Input label={label} isReadOnly isInvalid={isInvalid} isDisabled={isDisabled} isRequired={isRequired}\n value={value ? format(value) : ''} placeholder={placeholder ?? msg.valueHelpFieldPlaceholder}\n description={description} errorMessage={errorMessage}\n suffix={\n <span className=\"pire-valuehelp-actions\">\n {allowsClear && value ? (\n <IconButton icon=\"x\" label={msg.valueHelpFieldClear} isDisabled={isDisabled}\n onPress={() => onChange?.(null)} />\n ) : null}\n <IconButton icon=\"search\" label={typeof label === 'string'\n ? msg.valueHelpFieldOpenNamed.replace('{label}', label.toLowerCase())\n : msg.valueHelpFieldOpen}\n isDisabled={isDisabled} onPress={() => setOpen(true)} />\n </span>\n } />\n <ValueHelpDialog isOpen={open} onClose={() => setOpen(false)} title={dialogTitle ?? label}\n columns={columns} rows={rows} onSearch={onSearch} isFilteredExternally={isFilteredExternally}\n isLoading={isLoading} onLoadMore={onLoadMore} emptyLabel={emptyLabel}\n onSelect={(row) => onChange?.(row)} />\n </div>\n );\n}\n","import * as React from 'react';\nimport { Dialog } from '../feedback/Dialog';\nimport { Input } from '../forms/Input';\nimport { DataTable, type DataTableColumn } from '../data/DataTable';\nimport { Button } from '../core/Button';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\n\nexport interface ValueHelpDialogProps<T extends { id: string | number } = any> {\n isOpen?: boolean;\n title?: React.ReactNode;\n /** Show 2–4 identifying columns, not just the key. */\n columns?: DataTableColumn<T>[];\n rows?: T[];\n searchPlaceholder?: string;\n emptyLabel?: string;\n /**\n * The query on every keystroke. **Debounce before calling the server.**\n *\n * On its own this only observes; it does not change how `rows` is treated. Pair it with\n * `isFilteredExternally` to actually hand filtering to the server.\n */\n onSearch?: (query: string) => void;\n /**\n * `rows` is the final list and the dialog filters nothing locally. Required for server search:\n * fuzzy matches, synonyms, code-to-description and server ranking do not survive a local\n * \"contains\" pass over the fields that happen to be in the row.\n *\n * Named to match `ComboBox`, deliberately. The same idea under two names is worse than either\n * name — the ERP's supplier, customer, product and purchase-order pickers all need this, and\n * they already know the ComboBox spelling.\n */\n isFilteredExternally?: boolean;\n /** Keeps the table's skeleton up instead of showing \"no records\" while a request is in flight. */\n isLoading?: boolean;\n /** Called when the table is scrolled near its end, for paginated results. */\n onLoadMore?: () => void;\n /** Receives the picked row. */\n onSelect?: (row: T) => void;\n onClose?: () => void;\n}\n\n/** The ERP value help: search a master-data list and pick one record back into a field. */\nexport function ValueHelpDialog<T extends { id: string | number }>({ isOpen, title,\n columns = [], rows = [], searchPlaceholder, emptyLabel, onSearch, isFilteredExternally,\n isLoading, onLoadMore, onSelect, onClose }: ValueHelpDialogProps<T>) {\n const msg = usePireMessages();\n const [query, setQuery] = React.useState('');\n React.useEffect(() => { if (isOpen) setQuery(''); }, [isOpen]);\n\n const filtered = React.useMemo(() => {\n // Under external filtering `rows` is already the answer. Filtering it again is not merely\n // redundant: it drops every match the server made on something the row does not contain.\n if (isFilteredExternally) return rows;\n const q = query.trim().toLowerCase();\n if (!q) return rows;\n return rows.filter((row) => Object.values(row).some((v) => String(v).toLowerCase().includes(q)));\n }, [rows, query, isFilteredExternally]);\n\n const handleSearch = (value: string) => { setQuery(value); onSearch?.(value); };\n\n return (\n <Dialog isOpen={isOpen} size=\"lg\" title={title ?? msg.valueHelpDialogTitle} onClose={onClose}\n footer={<Button variant=\"tertiary\" onPress={onClose}>{msg.valueHelpDialogCancel}</Button>}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--sp-3)' }}>\n <Input aria-label={msg.valueHelpDialogSearch} icon=\"search\" type=\"search\" value={query}\n onChange={handleSearch} isClearable\n placeholder={searchPlaceholder ?? msg.valueHelpDialogSearchPlaceholder} autoFocus />\n <div onScroll={onLoadMore ? (event) => {\n const el = event.currentTarget;\n if (el.scrollHeight - el.scrollTop - el.clientHeight < 64) onLoadMore();\n } : undefined} style={{ overflow: 'auto', maxHeight: '48vh' }}>\n <DataTable aria-label={typeof title === 'string' ? title : msg.valueHelpDialogTitle}\n density=\"condensed\" columns={columns} rows={filtered} isLoading={isLoading}\n emptyLabel={emptyLabel ?? msg.valueHelpDialogEmpty}\n onRowAction={(row) => { onSelect?.(row); onClose?.(); }} />\n </div>\n </div>\n </Dialog>\n );\n}\n","import * as React from 'react';\nimport { ModalOverlay, Modal, Dialog as AriaDialog, Heading } from 'react-aria-components';\nimport { IconButton } from '../core/IconButton';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface DialogSlotProps {\n children?: React.ReactNode;\n className?: string;\n}\n\n/** The dialog's heading. Wires itself to the dialog's accessible name through React Aria's\n * `slot=\"title\"`, which is why it cannot be replaced by a bare heading element. */\nexport function DialogTitle({ children, className }: DialogSlotProps) {\n return <Heading slot=\"title\" className={cx('pire-dialog-title', className)}>{children}</Heading>;\n}\n\n/** One line under the title. Say what the action affects, not what the button is called. */\nexport function DialogDescription({ children, className }: DialogSlotProps) {\n return <p className={cx('pire-dialog-sub', className)} style={{ margin: 0 }}>{children}</p>;\n}\n\n/** The scrollable middle. Omit it entirely when the title and description say everything. */\nexport function DialogBody({ children, className }: DialogSlotProps) {\n return <div className={cx('pire-dialog-body', className)}>{children}</div>;\n}\n\n/** The action row. Cancel first, the commit or destructive action last. */\nexport function DialogActions({ children, className }: DialogSlotProps) {\n return <footer className={cx('pire-dialog-foot', className)}>{children}</footer>;\n}\n\nexport interface DialogProps {\n isOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n children?: React.ReactNode;\n /** Right-aligned actions: cancel first, primary or danger last. */\n footer?: React.ReactNode;\n onClose?: () => void;\n /** sm = confirm, md = edit form, lg = value help / table picker. */\n size?: 'sm' | 'md' | 'lg';\n /** Blocks dismiss on outside click / Esc — use only when data would be lost silently. */\n isDismissable?: boolean;\n showClose?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Modal dialog. Focus is trapped, the page behind is inert, and Esc closes unless\n * isDismissable is false — all handled by React Aria. */\nexport function Dialog({ isOpen, onOpenChange, title, subtitle, children, footer, onClose,\n size = 'md', isDismissable = true, showClose = true, className, style }: DialogProps) {\n const msg = usePireMessages();\n const close = () => { onClose?.(); onOpenChange?.(false); };\n\n /**\n * Both APIs are supported at once. The props form (`title`, `subtitle`, `footer`) is harder to\n * misuse and stays the default; the sub-components exist so a composed dialog can be written the\n * way it reads, and so a migration can change imports before it changes structure.\n *\n * Slots are hoisted rather than rendered where they sit, because the title and description belong\n * inside the header alongside the close button — a caller should not have to know that. Anything\n * that is not a slot falls through to the body, so mixing prose with a `DialogActions` works.\n */\n const parts = React.Children.toArray(children);\n const slotOf = (type: React.ElementType) =>\n parts.find((node) => React.isValidElement(node) && node.type === type);\n const titleSlot = slotOf(DialogTitle);\n const descriptionSlot = slotOf(DialogDescription);\n const bodySlot = slotOf(DialogBody);\n const actionsSlot = slotOf(DialogActions);\n const slots = [titleSlot, descriptionSlot, bodySlot, actionsSlot];\n const loose = parts.filter((node) => !slots.includes(node));\n\n // A slot always wins over the matching prop: passing both is a mistake, and the more specific\n // one is the better guess at intent.\n const heading = titleSlot\n ?? (title ? <Heading slot=\"title\" className=\"pire-dialog-title\">{title}</Heading> : null);\n const description = descriptionSlot\n ?? (subtitle ? <p className=\"pire-dialog-sub\" style={{ margin: 0 }}>{subtitle}</p> : null);\n const actions = actionsSlot\n ?? (footer ? <footer className=\"pire-dialog-foot\">{footer}</footer> : null);\n // The body keeps its conditional: it carries --sp-5 of padding, so rendering it empty leaves a\n // ~40px band between the description and the buttons. A confirmation that says everything in its\n // title and description is the normal case, not an edge one.\n const body = bodySlot ?? (loose.length ? <div className=\"pire-dialog-body\">{loose}</div> : null);\n\n return (\n <ModalOverlay className=\"pire-modal-overlay\" isOpen={isOpen} isDismissable={isDismissable}\n onOpenChange={(o) => { if (!o) close(); }}>\n <Modal className={cx('pire-modal', className)} data-size={size} style={style}>\n <AriaDialog className=\"pire-dialog\">\n {heading || description ? (\n <header className=\"pire-dialog-head\">\n <div style={{ flex: 1, minWidth: 0 }}>\n {heading}\n {description}\n </div>\n {showClose ? <IconButton icon=\"x\" label={msg.dialogClose} size=\"sm\" onPress={close} /> : null}\n </header>\n ) : null}\n {body}\n {actions}\n </AriaDialog>\n </Modal>\n </ModalOverlay>\n );\n}\n","import type * as React from 'react';\nimport { Table, TableHeader, TableBody, TableFooter, Column, Row, Cell, type Selection,\n type SortDescriptor } from 'react-aria-components';\nimport { Checkbox } from '../forms/Checkbox';\nimport { Icon } from '../core/Icon';\nimport { SkeletonTableRow } from '../feedback/Skeleton';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface DataTableColumn<T = any> {\n key: string;\n label: string;\n align?: 'left' | 'right' | 'center';\n width?: number | string;\n /** Right-aligns and switches to tabular mono. Use for every amount, quantity and ID. */\n numeric?: boolean;\n sortable?: boolean;\n /**\n * Keeps `label` for assistive tech but not on screen. For a utility column — a disclosure or\n * row-action column — where a visible header is noise. An *empty* label is not the answer: a\n * header with no text leaves its column unnamed for anyone using a screen reader.\n */\n hideLabel?: boolean;\n render?: (row: T) => React.ReactNode;\n}\n\nexport interface DataTableSort { key: string; dir: 'asc' | 'desc' }\n\nexport interface DataTableRowProps {\n /** Extra class on the `<tr>`. */\n className?: string;\n /**\n * Greys the row and takes it out of selection and row actions. Use it when a row is present for\n * context but cannot be acted on — and pair it with a cell that says *why*, since a greyed row\n * on its own does not explain itself.\n */\n isDisabled?: boolean;\n}\n\nexport interface DataTableProps<T extends { id: string | number } = any> {\n /** Accessible name for the grid — required. */\n 'aria-label': string;\n columns: DataTableColumn<T>[];\n rows: T[];\n /** Row height: 32 / 40 / 48px. Condensed is the analyst default. */\n density?: 'condensed' | 'regular' | 'comfortable';\n selectable?: boolean;\n selected?: Array<string | number>;\n onSelectionChange?: (ids: Array<string | number>) => void;\n sort?: DataTableSort;\n onSortChange?: (sort: DataTableSort) => void;\n onRowAction?: (row: T) => void;\n emptyLabel?: React.ReactNode;\n /**\n * Summary cells keyed by column, rendered in a real `<tfoot>`.\n *\n * Keyed rather than free-form so a total sits under the column it totals, and stays there when\n * columns are reordered or resized. Columns missing from the map get an empty cell. Hidden while\n * `isLoading`, since a total from the previous response next to skeleton rows reads as current.\n */\n footer?: Record<string, React.ReactNode>;\n /** Per-row presentation and interactivity. Called for every row on every render — keep it cheap. */\n rowProps?: (row: T) => DataTableRowProps;\n /**\n * Detail rendered in a full-width row beneath its parent, for the rows named by `expandedIds`.\n *\n * Expansion is controlled: put the trigger in a column's `render` and track the ids yourself.\n * The table has no opinion on what opens a row, because the affordance differs per screen.\n */\n renderExpanded?: (row: T) => React.ReactNode;\n /** Ids whose `renderExpanded` content is currently shown. */\n expandedIds?: Array<string | number>;\n /** Swaps the body for skeleton rows derived from `columns` and `density`, keeping the header. */\n isLoading?: boolean;\n /** Skeleton row count. Defaults to the current `rows` length, or 5 when there are none. */\n loadingRowCount?: number;\n /** Overrides the dictionary's `dataTableLoading`, announced while the body is a skeleton. */\n loadingLabel?: string;\n stickyHeader?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Records grid. React Aria supplies roving focus, type-ahead, shift-click ranges and\n * screen-reader row/column announcements — do not hand-roll a <table> in product code. */\nexport function DataTable<T extends { id: string | number }>({ columns, rows, density = 'regular',\n selectable, selected, onSelectionChange, sort, onSortChange, onRowAction, stickyHeader = true,\n emptyLabel = 'No records match the current filters.', isLoading, loadingRowCount, loadingLabel,\n footer, rowProps, renderExpanded, expandedIds, className, style, ...rest }: DataTableProps<T>) {\n const msg = usePireMessages();\n const sortDescriptor: SortDescriptor | undefined = sort\n ? { column: sort.key, direction: sort.dir === 'asc' ? 'ascending' : 'descending' } : undefined;\n const handleSelection = (keys: Selection) => {\n if (keys === 'all') return onSelectionChange?.(rows.map((r) => r.id));\n onSelectionChange?.([...keys] as Array<string | number>);\n };\n\n // Defaulting to the current row count keeps the grid the same height across a reload, so the\n // page does not jump under the pointer that just pressed Go.\n const skeletonRows = loadingRowCount ?? (rows.length || 5);\n const skeletonColumns = [\n ...(selectable ? [{ width: 44 }] : []),\n ...columns.map((c) => ({ width: c.width, align: c.align, numeric: c.numeric })),\n ];\n // SkeletonTableRow is not a <tr> and cannot live inside React Aria's collection. Feeding the\n // Table an empty collection and rendering the skeletons through renderEmptyState is what keeps\n // the real header — and its sort state — mounted while the body is a placeholder.\n const body = isLoading ? [] : rows;\n\n const presentation = new Map(rows.map((row) => [row.id, rowProps?.(row) ?? {}]));\n // Row disabling is a collection-level concern in React Aria, not a prop on Row: `disabledKeys`\n // is what removes a row from selection, row actions and the focus order in one go.\n const disabledKeys = rows.filter((row) => presentation.get(row.id)?.isDisabled).map((row) => row.id);\n const expanded = new Set((expandedIds ?? []).map(String));\n const spanAll = columns.length + (selectable ? 1 : 0);\n /**\n * Detail rows are siblings in the collection, so their keys must not collide with a record id.\n * Deliberately not spelled like a `pire-*` class: `styles.css.test.ts` reads `pire-*` string\n * literals in component source as class references.\n */\n const expandedKey = (id: string | number) => `${id}::__pire_expanded__`;\n\n return (\n <div className={cx('pire-table-wrap', className)} style={style}\n data-loading={isLoading ? 'true' : undefined} aria-busy={isLoading ? 'true' : undefined}>\n <Table className=\"pire-table\" data-density={density} data-sticky={String(stickyHeader)}\n aria-label={rest['aria-label']}\n disabledKeys={disabledKeys.length ? new Set(disabledKeys) : undefined}\n selectionMode={selectable ? 'multiple' : 'none'}\n selectedKeys={selected ? new Set(selected) : undefined}\n onSelectionChange={handleSelection}\n sortDescriptor={sortDescriptor}\n onSortChange={(d) => onSortChange?.({ key: String(d.column), dir: d.direction === 'ascending' ? 'asc' : 'desc' })}\n onRowAction={onRowAction ? (key) => {\n const row = rows.find((r) => String(r.id) === String(key));\n if (row) onRowAction(row);\n } : undefined}>\n <TableHeader className=\"pire-thead-row\">\n {selectable ? (\n <Column className=\"pire-th\" width={44}>\n <Checkbox slot=\"selection\" aria-label={msg.dataTableSelectAll} />\n </Column>\n ) : null}\n {columns.map((c, i) => (\n <Column key={c.key} id={c.key} className=\"pire-th\" isRowHeader={i === 0 && !selectable}\n allowsSorting={c.sortable} width={c.width as never}\n data-align={c.numeric || c.align === 'right' ? 'right' : c.align}\n data-allows-sorting={c.sortable ? 'true' : undefined}>\n <span className={cx('pire-th-inner', c.hideLabel && 'pire-sr-only')}>\n {c.label}\n {c.sortable ? (\n <Icon size={12} name={sort?.key === c.key ? (sort.dir === 'asc' ? 'arrow-up' : 'arrow-down') : 'chevrons-up-down'}\n style={{ color: sort?.key === c.key ? 'var(--accent-subtle-fg)' : 'var(--text-tertiary)' }} />\n ) : null}\n </span>\n </Column>\n ))}\n </TableHeader>\n <TableBody renderEmptyState={() => (isLoading ? (\n <div className=\"pire-table-loading\" role=\"status\" aria-live=\"polite\">\n <span className=\"pire-sr-only\">{loadingLabel ?? msg.dataTableLoading}</span>\n {Array.from({ length: skeletonRows }, (_, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: placeholder rows are positional.\n <SkeletonTableRow key={i} columns={skeletonColumns} density={density} />\n ))}\n </div>\n ) : (\n <div className=\"pire-table-empty\">{emptyLabel}</div>\n ))}>\n {body.flatMap((row) => {\n const rowIsDisabled = presentation.get(row.id)?.isDisabled;\n const record = (\n <Row key={row.id} id={row.id} className={cx('pire-tr', presentation.get(row.id)?.className)}\n data-pressable={onRowAction && !rowIsDisabled ? 'true' : undefined}>\n {selectable ? <Cell className=\"pire-td\"><Checkbox slot=\"selection\" aria-label={msg.dataTableSelectRow} /></Cell> : null}\n {columns.map((c) => (\n <Cell key={c.key} className=\"pire-td\" data-numeric={c.numeric ? 'true' : undefined}\n style={{ textAlign: c.align && !c.numeric ? c.align : undefined }}>\n {c.render ? c.render(row) : (row as Record<string, React.ReactNode>)[c.key]}\n </Cell>\n ))}\n </Row>\n );\n if (!renderExpanded || !expanded.has(String(row.id))) return [record];\n return [record, (\n <Row key={expandedKey(row.id)} id={expandedKey(row.id)} className=\"pire-tr-expanded\">\n <Cell className=\"pire-td-expanded\" colSpan={spanAll}>{renderExpanded(row)}</Cell>\n </Row>\n )];\n })}\n </TableBody>\n {footer && !isLoading ? (\n <TableFooter className=\"pire-tfoot\">\n <Row id=\"__pire_footer__\" className=\"pire-tr-footer\">\n {selectable ? <Cell className=\"pire-tf\" /> : null}\n {columns.map((c, i) => (\n <Cell key={c.key} className=\"pire-tf\" data-numeric={c.numeric ? 'true' : undefined}\n style={{ textAlign: c.align && !c.numeric ? c.align : undefined }}>\n {/* React Aria makes the row's first cell a rowheader, and an empty rowheader\n leaves every other cell in the row unnamed. Totals usually start in a later\n column, so the first cell falls back to an announced-only label rather than\n to nothing. */}\n {footer[c.key] ?? (i === 0 && !selectable\n ? <span className=\"pire-sr-only\">{msg.dataTableSummaryRow}</span> : null)}\n </Cell>\n ))}\n </Row>\n </TableFooter>\n ) : null}\n </Table>\n </div>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport type SkeletonShape = 'text' | 'block' | 'circle';\n\nexport interface SkeletonProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** text — a line of copy; block — a card, chart or image; circle — an avatar. */\n shape?: SkeletonShape;\n /** Overrides the shape's default. A percentage reads better than a pixel count in a\n * fluid layout, and keeps the placeholder honest when the real value is unknown. */\n width?: number | string;\n height?: number | string;\n}\n\n/** Loading placeholder for content whose shape is known before its value is.\n *\n * Deliberately `aria-hidden`: a screen reader gains nothing from \"graphic, graphic, graphic\",\n * and announcing placeholders as content is worse than silence. Announce the wait once, on the\n * region that is loading — `aria-busy=\"true\"` on the container, or a live-region message — and\n * let the skeleton be purely visual. Nothing inside is focusable, so keyboard order is\n * unaffected while the data is in flight.\n *\n * The shimmer is suppressed under `prefers-reduced-motion`; the placeholder still reads as one\n * because the shape and the surface contrast carry it, not the animation. */\nexport function Skeleton({ shape = 'text', width, height, className, style, ...rest }: SkeletonProps) {\n return (\n <div className={cx('pire-skeleton', className)} data-shape={shape} aria-hidden=\"true\"\n style={{ width, height, ...style }} {...rest} />\n );\n}\n\nexport interface SkeletonTableColumn {\n align?: 'left' | 'right' | 'center';\n /** Fixed column width. Omit to let the column share the free space, as DataTable does. */\n width?: number | string;\n /** Right-aligns the bar. Mirrors DataTable's column flag so a loading table and a loaded one\n * put their numbers in the same place. */\n numeric?: boolean;\n}\n\nexport interface SkeletonTableRowProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** A column count, or one descriptor per column when alignment or width matters. */\n columns: number | SkeletonTableColumn[];\n /** Must match the DataTable it stands in for, or the rows jump on load. */\n density?: 'condensed' | 'regular' | 'comfortable';\n}\n\n/* Bar widths cycle instead of being random: a random width would be a different number on every\n render, so the placeholder would twitch under any unrelated re-render. Four values is enough\n for the ragged look of real data without a visible repeat at normal column counts. */\nconst BAR_WIDTHS = ['72%', '54%', '86%', '63%'];\n\n/** One placeholder row, sized to line up with `DataTable` — same row height per density, same\n * cell padding, same bottom rule. Render a handful inside `.pire-table-wrap` (or above a real\n * table's body) while the first page loads, so the grid does not resize when it arrives.\n *\n * It is not a real `<tr>` and cannot be handed to `DataTable` as a row: DataTable builds its\n * collection from `rows`, and React Aria's table owns everything under it. Use it in place of\n * the table, not inside one. */\nexport function SkeletonTableRow({ columns, density = 'regular', className, style, ...rest }: SkeletonTableRowProps) {\n const cells: SkeletonTableColumn[] = typeof columns === 'number'\n ? Array.from({ length: columns }, () => ({}))\n : columns;\n return (\n <div className={cx('pire-skeleton-row', className)} data-density={density} aria-hidden=\"true\"\n style={style} {...rest}>\n {cells.map((c, i) => {\n const align = c.numeric ? 'right' : c.align ?? 'left';\n return (\n // biome-ignore lint/suspicious/noArrayIndexKey: columns are positional and never reordered.\n <div key={i} className=\"pire-skeleton-cell\" data-align={align}\n style={{ width: c.width, flex: c.width ? '0 0 auto' : undefined }}>\n <Skeleton width={BAR_WIDTHS[i % BAR_WIDTHS.length]} />\n </div>\n );\n })}\n </div>\n );\n}\n","import * as React from 'react';\nimport { FileTrigger, Text } from 'react-aria-components';\nimport { Button } from '../core/Button';\nimport { Icon } from '../core/Icon';\nimport { IconButton } from '../core/IconButton';\nimport { ProgressBar } from '../feedback/ProgressBar';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface PireFile {\n /** The browser's `File`. Pire uploads nothing — that is the app's job. */\n file: File;\n /** Object URL, only for images with `showPreview`. Revoked on unmount. */\n previewUrl?: string;\n}\n\nexport interface FileRejection {\n file: File;\n reason: 'size' | 'type';\n}\n\nexport interface FileUploadProps {\n label?: React.ReactNode;\n /** Controlled / uncontrolled, the same pair as `Tabs` and `MultiComboBox`. */\n value?: PireFile[];\n defaultValue?: PireFile[];\n onChange?: (files: PireFile[]) => void;\n /** Mime types or extensions, exactly as `FileTrigger.acceptedFileTypes` takes them. */\n acceptedFileTypes?: readonly string[];\n allowsMultiple?: boolean;\n /** Ceiling in bytes. Oversized files are rejected and reported, never held. */\n maxSize?: number;\n /** Rejections, so the app can word its own message. */\n onError?: (rejections: FileRejection[]) => void;\n /** Thumbnail for images. Turn it off for CSVs, where a thumbnail says nothing. */\n showPreview?: boolean;\n /** Upload progress 0–100, while the app is doing the uploading. */\n uploadProgress?: number;\n /** Overrides the dictionary's `fileUploadChoose`. */\n chooseLabel?: string;\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isRequired?: boolean;\n isReadOnly?: boolean;\n fullWidth?: boolean;\n name?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst isImage = (file: File) => file.type.startsWith('image/');\n\n/** Human-readable size. Deliberately not localised digits: `toLocaleString` on the number only. */\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024).toLocaleString()} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/** Splits a picked list into keepers and rejections, without uploading or mutating anything. */\nexport function screenFiles(\n files: File[],\n { maxSize, acceptedFileTypes }: { maxSize?: number; acceptedFileTypes?: readonly string[] },\n): { accepted: File[]; rejected: FileRejection[] } {\n const accepted: File[] = [];\n const rejected: FileRejection[] = [];\n\n for (const file of files) {\n if (maxSize != null && file.size > maxSize) {\n rejected.push({ file, reason: 'size' });\n continue;\n }\n // `acceptedFileTypes` mirrors the input's accept attribute, which the OS picker already\n // enforces — but drag-and-drop bypasses that picker entirely, so it is checked here too.\n if (acceptedFileTypes?.length) {\n const ok = acceptedFileTypes.some((t) =>\n t.startsWith('.') ? file.name.toLowerCase().endsWith(t.toLowerCase())\n : t.endsWith('/*') ? file.type.startsWith(t.slice(0, -1))\n : file.type === t);\n if (!ok) {\n rejected.push({ file, reason: 'type' });\n continue;\n }\n }\n accepted.push(file);\n }\n return { accepted, rejected };\n}\n\n/**\n * File picker with a list of what was chosen. Pire hands back `File`s through `onChange` and\n * uploads nothing: the app owns the `FormData`, the request and the progress it reports back\n * through `uploadProgress`.\n */\nexport function FileUpload({\n label, value, defaultValue, onChange, acceptedFileTypes, allowsMultiple, maxSize, onError,\n showPreview = true, uploadProgress, chooseLabel, description, errorMessage,\n isInvalid, isDisabled, isReadOnly, isRequired, fullWidth = true, className, style,\n}: FileUploadProps) {\n const msg = usePireMessages();\n const [uncontrolled, setUncontrolled] = React.useState<PireFile[]>(defaultValue ?? []);\n const files = value ?? uncontrolled;\n\n // Object URLs leak until revoked, and the browser will not do it for us.\n const created = React.useRef<string[]>([]);\n React.useEffect(() => () => {\n for (const url of created.current) URL.revokeObjectURL(url);\n }, []);\n\n const commit = (next: PireFile[]) => {\n if (value === undefined) setUncontrolled(next);\n onChange?.(next);\n };\n\n const accept = (picked: FileList | null) => {\n if (!picked || isDisabled || isReadOnly) return;\n const { accepted, rejected } = screenFiles([...picked], { maxSize, acceptedFileTypes });\n if (rejected.length) onError?.(rejected);\n if (!accepted.length) return;\n\n const wrapped = accepted.map((file) => {\n const previewUrl = showPreview && isImage(file) ? URL.createObjectURL(file) : undefined;\n if (previewUrl) created.current.push(previewUrl);\n return { file, previewUrl };\n });\n commit(allowsMultiple ? [...files, ...wrapped] : wrapped.slice(0, 1));\n };\n\n const remove = (target: File) => commit(files.filter((f) => f.file !== target));\n\n return (\n <div className={cx('pire-field', 'pire-fileupload', className)} style={style}\n data-full-width={String(fullWidth)} data-invalid={isInvalid ? 'true' : undefined}>\n {label ? (\n <span className=\"pire-field-label\">\n {label}{isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </span>\n ) : null}\n\n <FileTrigger acceptedFileTypes={acceptedFileTypes as string[] | undefined}\n allowsMultiple={allowsMultiple} onSelect={accept}>\n <Button icon=\"paperclip\" isDisabled={isDisabled || isReadOnly}>\n {chooseLabel ?? msg.fileUploadChoose}\n </Button>\n </FileTrigger>\n\n {files.length ? (\n <ul className=\"pire-fileupload-list\">\n {files.map(({ file, previewUrl }) => (\n <li key={`${file.name}-${file.size}-${file.lastModified}`} className=\"pire-fileupload-item\">\n {previewUrl\n ? <img className=\"pire-fileupload-thumb\" src={previewUrl} alt=\"\" />\n : <Icon name=\"file-text\" size={16} className=\"pire-fileupload-icon\" />}\n <span className=\"pire-fileupload-name\">{file.name}</span>\n <span className=\"pire-fileupload-size\">{formatFileSize(file.size)}</span>\n {isDisabled || isReadOnly ? null : (\n <IconButton icon=\"x\" size=\"sm\"\n label={msg.fileUploadRemoveNamed.replace('{name}', file.name)}\n onPress={() => remove(file)} />\n )}\n </li>\n ))}\n </ul>\n ) : null}\n\n {uploadProgress != null ? (\n <ProgressBar value={uploadProgress} label={msg.fileUploadUploading} />\n ) : null}\n\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n {isInvalid && errorMessage ? <span className=\"pire-field-error\">{errorMessage}</span> : null}\n </div>\n );\n}\n","import type * as React from 'react';\nimport { ProgressBar as AriaProgressBar, Label } from 'react-aria-components';\nimport { cx } from '../utils/cx';\n\nexport interface ProgressBarProps {\n value?: number;\n minValue?: number;\n maxValue?: number;\n label?: React.ReactNode;\n showValue?: boolean;\n /** Indeterminate work — no percentage is announced. */\n isIndeterminate?: boolean;\n /** Colours the fill — e.g. negative when a budget is overrun. */\n status?: 'informative' | 'positive' | 'critical' | 'negative';\n size?: 'sm' | 'md';\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function ProgressBar({ value = 0, minValue = 0, maxValue = 100, label, showValue = true,\n isIndeterminate, status = 'informative', size = 'md', className, style }: ProgressBarProps) {\n return (\n <AriaProgressBar className={cx('pire-progress', className)} data-status={status} data-size={size}\n value={value} minValue={minValue} maxValue={maxValue} isIndeterminate={isIndeterminate} style={style}>\n {({ percentage, valueText }) => (\n <>\n {label || showValue ? (\n <div className=\"pire-progress-head\">\n {label ? <Label>{label}</Label> : <span />}\n {showValue && !isIndeterminate ? <span className=\"pire-numeric\">{valueText}</span> : null}\n </div>\n ) : null}\n <div className=\"pire-progress-track\">\n <div className=\"pire-progress-fill\" style={{ width: `${isIndeterminate ? 40 : percentage}%` }} />\n </div>\n </>\n )}\n </AriaProgressBar>\n );\n}\n","import type * as React from 'react';\nimport { MenuTrigger, Button as AriaButton, Popover } from 'react-aria-components';\nimport { IconButton } from '../core/IconButton';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface ShellBarProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {\n /** Wordmark at far left, uppercase micro-caps. */\n product?: string;\n /** 1–3 letter monogram tile before the wordmark — stand-in for a customer logo. */\n monogram?: string;\n /** Current app or object title. */\n title?: React.ReactNode;\n onMenu?: () => void;\n onSearch?: () => void;\n /** Accessible name for the menu button. Defaults to English, and the bar has no access to the app's\n * catalogue — a Spanish product must pass its own or ship an English screen-reader label. */\n menuLabel?: string;\n /** Accessible name for the search button, for the same reason as {@link ShellBarProps.menuLabel}.\n * Until this existed the only way to localise it was to drop `onSearch` and re-render the icon by\n * hand, which is how a shell ends up with two search icons. */\n searchLabel?: string;\n /** IconButtons with variant=\"inverse\". */\n actions?: React.ReactNode;\n /** Full name — initials render into the avatar. */\n user?: string;\n /**\n * Turns the avatar into a menu trigger. Pass a `Menu` — the entries are the product's, because\n * they differ per app; only the trigger belongs here.\n *\n * Without it the avatar stays a plain `role=\"img\"`, so nothing that renders a bare `user` today\n * changes. With it the avatar becomes a real `<button>` carrying `aria-haspopup` and\n * `aria-expanded`.\n */\n userMenu?: React.ReactNode;\n /** Accessible name of the avatar button. `{user}` is replaced with the name. Defaults to the\n * dictionary's `shellBarUserMenu`, for the same reason as {@link ShellBarProps.menuLabel}. */\n userMenuLabel?: string;\n}\n\nconst initials = (name: string) => name.trim().split(/\\s+/).slice(0, 2).map((p) => p[0]).join('').toUpperCase();\n\n/** Fixed 48px application chrome. One per page, always the first landmark. */\nexport function ShellBar({ product, monogram, title, onMenu, onSearch, menuLabel = 'Open navigation',\n searchLabel = 'Search', actions, user, userMenu, userMenuLabel, className, ...rest }: ShellBarProps) {\n const msg = usePireMessages();\n return (\n <header className={cx('pire-shellbar', className)} {...rest}>\n {onMenu ? <IconButton icon=\"menu\" label={menuLabel} variant=\"inverse\" size=\"sm\" onPress={onMenu} /> : null}\n {monogram ? <span className=\"pire-shellbar-mono\" aria-hidden=\"true\">{monogram}</span> : null}\n {product ? <span className=\"pire-shellbar-product\">{product}</span> : null}\n {title ? <span className=\"pire-shellbar-title\">{title}</span> : null}\n <span className=\"pire-shellbar-spacer\" />\n {onSearch ? <IconButton icon=\"search\" label={searchLabel} variant=\"inverse\" size=\"sm\" onPress={onSearch} /> : null}\n {actions}\n {user && userMenu ? (\n // A real button, not the img-role span: the avatar is where \"my profile\", \"switch company\"\n // and \"sign out\" live in any ERP, and a span accepts neither focus nor onPress. Popover is\n // rendered here rather than expected from the consumer so the panel keeps shell placement.\n <MenuTrigger>\n <AriaButton className=\"pire-avatar pire-avatar-trigger\"\n aria-label={(userMenuLabel ?? msg.shellBarUserMenu).replace('{user}', user)}>\n {initials(user)}\n </AriaButton>\n <Popover className=\"pire-popover\">{userMenu}</Popover>\n </MenuTrigger>\n ) : user ? (\n <span className=\"pire-avatar\" title={user} aria-label={user} role=\"img\">{initials(user)}</span>\n ) : null}\n </header>\n );\n}\n","import * as React from 'react';\nimport { Icon } from '../core/Icon';\nimport { Tooltip } from '../feedback/Tooltip';\nimport { Button as AriaButton, Disclosure, DisclosureGroup, DisclosurePanel,\n MenuTrigger, Popover } from 'react-aria-components';\nimport { Menu, MenuItem } from './Menu';\nimport type { Key } from 'react-aria-components';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\n/** A second-level destination, nested under a first-level entry.\n *\n * Deliberately has no `icon`: only the first level carries one, so the second level reads as an\n * indented list of labels under a single glyph rather than a wall of decoration. Leaving `icon` off\n * the *type* is what stops that drifting back in one call site at a time. */\nexport interface SideNavChildItem { id: string; label: string; count?: number }\n\nexport interface SideNavItem {\n id: string;\n label: string;\n icon?: string;\n count?: number;\n /** Second-level destinations. Supplying this turns the entry into a collapsible group: it stops\n * being a destination itself (pressing it expands, never navigates) and `id` becomes the\n * expansion key used by `expandedIds` / `defaultExpandedIds`, not something `onChange` can ever\n * emit. Omit it and the entry behaves exactly as it always has. */\n items?: SideNavChildItem[];\n}\n\nexport interface SideNavGroup { label?: string; items: SideNavItem[] }\n\nexport interface SideNavProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onChange'> {\n /** Spaces-and-pages hierarchy: one group per space. */\n groups: SideNavGroup[];\n value?: string;\n /** Fires with the selected item id — not a DOM change event. Only ever a destination id: a\n * first-level entry that owns `items` is a disclosure, and toggling it does not fire this. */\n onChange?: (id: string) => void;\n /** Expanded first-level entry ids — the controlled half of the pair. Pass it and you own expansion\n * outright, including expanding the group that holds `value`. */\n expandedIds?: string[];\n /** Initial expanded ids for the uncontrolled case. Omit it and the group holding `value` opens\n * itself; supply it and it is taken literally, so `value`'s group can start closed if that is\n * genuinely what you want. */\n defaultExpandedIds?: string[];\n /** Fires with every expanded id after a toggle, controlled or not. */\n onExpandedChange?: (ids: string[]) => void;\n /** 48px icon rail. Labels move into tooltips or, for a group, into its flyout. */\n collapsed?: boolean;\n /**\n * In the rail, a group opens its children in a flyout beside it. On by default: without it the\n * rail records an expansion nothing can draw, leaving second-level destinations reachable only\n * by expanding the nav again.\n *\n * Pass `false` for the previous behaviour, where a rail group toggles expansion invisibly.\n */\n railFlyout?: boolean;\n footer?: React.ReactNode;\n}\n\n/** Which first-level entry owns `value`, if any. Undefined when `value` is a first-level destination. */\nfunction findActiveParent(groups: SideNavGroup[], value: string | undefined): string | undefined {\n if (value == null) return undefined;\n for (const group of groups) {\n for (const item of group.items) {\n if (item.items?.some((child) => child.id === value)) return item.id;\n }\n }\n return undefined;\n}\n\n/** Primary navigation. A first-level entry is either a destination (icon + label, selectable) or a\n * collapsible group (icon + label + chevron) when it carries `items` — the two coexist in one list,\n * which is how a 35-destination ERP menu fits without showing all 35 at once.\n *\n * Both levels are plain `Button`s and the disclosure is React Aria's `Disclosure` /\n * `DisclosureGroup`, so `aria-expanded`, `aria-controls`, the panel's `role=\"group\"` and\n * `aria-labelledby`, and Enter/Space on the trigger all come from React Aria rather than from\n * hand-rolled ARIA here.\n *\n * Three things worth knowing before you use it:\n *\n * - **The panel is always in the DOM.** React Aria hides a collapsed panel with\n * `hidden=\"until-found\"`, applied imperatively in a layout effect, so find-in-page can reveal it.\n * A test asserting a collapsed child is *absent* will fail; assert `aria-expanded` on the trigger,\n * or visibility, instead. The corollary in CSS: any `display` we set on the panel would beat the\n * UA's `[hidden] { display: none }`, leaving collapsed children focusable under\n * `aria-hidden=\"true\"`. `.pire-sidenav-subnav[hidden]` in `components.css` is that guard.\n * - **`collapsed` and expansion are different axes, and the rail wins.** With `collapsed` set there\n * are no labels, and a second level is nothing *but* labels. A group therefore opens its children\n * in a flyout beside the rail (`railFlyout`, on by default) rather than inline. With\n * `railFlyout={false}` the row falls back to recording the expansion silently — which leaves\n * second-level destinations reachable only by expanding the nav again, so it is off the\n * accessible path and exists for compatibility.\n * - **Several groups can be open at once**, and there is no accordion mode. Closing the group you\n * are in to open another is the wrong trade in a nav whose whole job is showing where you are. */\nexport function SideNav({ groups, value, onChange, expandedIds, defaultExpandedIds, onExpandedChange,\n collapsed, railFlyout = true, footer, className, ...rest }: SideNavProps) {\n const msg = usePireMessages();\n const activeParent = findActiveParent(groups, value);\n const isControlled = expandedIds != null;\n const [ownExpanded, setOwnExpanded] = React.useState<Set<string>>(\n () => new Set(defaultExpandedIds ?? (activeParent ? [activeParent] : [])));\n const [lastValue, setLastValue] = React.useState(value);\n\n // Reveal the group owning a *newly* selected destination. Seeding state at mount is not enough in a\n // router-driven app: a breadcrumb or a deep link can move `value` into a closed group, and the\n // current location would then be invisible. Keyed off the change rather than off `value` itself, so\n // a group the user closed by hand stays closed. Adjust-state-during-render, not an effect — React\n // re-runs this render before committing, so the panel never paints closed and then open.\n if (value !== lastValue) {\n setLastValue(value);\n if (!isControlled && activeParent && !ownExpanded.has(activeParent)) {\n setOwnExpanded(new Set(ownExpanded).add(activeParent));\n }\n }\n\n const expanded = isControlled ? new Set(expandedIds) : ownExpanded;\n\n const commitExpanded = (next: Set<string>): void => {\n if (!isControlled) setOwnExpanded(next);\n onExpandedChange?.([...next]);\n };\n\n /** React Aria hands back the whole set, typed as `Key` (which widens to number). Ids are strings. */\n const handleExpandedChange = (keys: Set<Key>): void => commitExpanded(new Set([...keys].map(String)));\n\n const toggleExpanded = (id: string): void => {\n const next = new Set(expanded);\n if (!next.delete(id)) next.add(id);\n commitExpanded(next);\n };\n\n /** A first-level row: the leaf case, and the rail-mode rendering of a group. */\n const renderRow = (item: SideNavItem, onPress: () => void, isGroup: boolean) => {\n const selected = !isGroup && item.id === value;\n const button = (\n <AriaButton key={item.id} className=\"pire-sidenav-item\" data-selected={selected ? 'true' : undefined}\n data-active-child={isGroup && item.id === activeParent ? 'true' : undefined}\n aria-current={selected ? 'page' : undefined}\n // In the rail the visible label is dropped and the Icon is decorative, which left the\n // button with no accessible name at all. The Tooltip does not cover this: React Aria\n // wires it up as aria-describedby, and a description is not a name — a screen reader\n // announced these as an unlabelled \"button\". Expanded, the <span> below names it.\n aria-label={collapsed ? item.label : undefined}\n onPress={onPress}>\n {item.icon ? <Icon name={item.icon} size={16} /> : null}\n {collapsed ? null : <span>{item.label}</span>}\n {item.count != null && !collapsed ? <span className=\"pire-sidenav-count\">{item.count}</span> : null}\n </AriaButton>\n );\n // The Tooltip stays: it is the sighted affordance for the same missing label.\n return collapsed ? <Tooltip key={item.id} label={item.label} placement=\"right\">{button}</Tooltip> : button;\n };\n\n /** A rail group: the icon button, with its children in a flyout beside the rail.\n *\n * Built on MenuTrigger so roving focus, type-ahead and Escape-returns-focus come from React\n * Aria. The trade-off is that a child is a `menuitem` here and a `link` when the nav is\n * expanded — one destination with two roles depending on chrome state. That is deliberate:\n * the interaction genuinely differs, and the alternative was hand-rolling arrow-key handling. */\n const renderRailFlyout = (item: SideNavItem) => (\n <MenuTrigger key={item.id}>\n <AriaButton className=\"pire-sidenav-item\" aria-label={item.label}\n data-active-child={item.id === activeParent ? 'true' : undefined}>\n {item.icon ? <Icon name={item.icon} size={16} /> : null}\n </AriaButton>\n <Popover className=\"pire-popover\" placement=\"right top\" offset={4}>\n <Menu aria-label={item.label} className=\"pire-sidenav-flyout\"\n onAction={(key) => onChange?.(String(key))}>\n {(item.items ?? []).map((child) => (\n <MenuItem key={child.id} id={child.id}>{child.label}</MenuItem>\n ))}\n </Menu>\n </Popover>\n </MenuTrigger>\n );\n\n const renderSection = (item: SideNavItem) => (\n <Disclosure key={item.id} id={item.id} className=\"pire-sidenav-section\">\n {/* No onPress of our own: React Aria's ButtonContext supplies the toggle through\n slot=\"trigger\", and one here would navigate as a side effect of expanding. */}\n <AriaButton slot=\"trigger\" className=\"pire-sidenav-item\" data-kind=\"group\"\n data-active-child={item.id === activeParent ? 'true' : undefined}>\n {item.icon ? <Icon name={item.icon} size={16} /> : null}\n <span>{item.label}</span>\n {item.count != null ? <span className=\"pire-sidenav-count\">{item.count}</span> : null}\n <Icon name=\"chevron-down\" size={16} className=\"pire-sidenav-chevron\" />\n </AriaButton>\n <DisclosurePanel className=\"pire-sidenav-subnav\">\n {item.items?.map((child) => {\n const selected = child.id === value;\n return (\n <AriaButton key={child.id} className=\"pire-sidenav-item pire-sidenav-subitem\"\n data-selected={selected ? 'true' : undefined} aria-current={selected ? 'page' : undefined}\n onPress={() => onChange?.(child.id)}>\n <span>{child.label}</span>\n {child.count != null ? <span className=\"pire-sidenav-count\">{child.count}</span> : null}\n </AriaButton>\n );\n })}\n </DisclosurePanel>\n </Disclosure>\n );\n\n return (\n <nav className={cx('pire-sidenav', className)} data-collapsed={collapsed ? 'true' : undefined}\n aria-label={msg.sideNavLabel} {...rest}>\n {groups.map((group, gi) => {\n const hasSections = !collapsed && group.items.some((item) => item.items?.length);\n const rows = group.items.map((item) => {\n const isGroup = Boolean(item.items?.length);\n if (isGroup && !collapsed) return renderSection(item);\n if (isGroup && collapsed && railFlyout) return renderRailFlyout(item);\n return renderRow(item, () => (isGroup ? toggleExpanded(item.id) : onChange?.(item.id)), isGroup);\n });\n return (\n <div className=\"pire-sidenav-group\" key={group.label ?? gi}>\n {group.label && !collapsed ? <div className=\"pire-sidenav-label\">{group.label}</div> : null}\n {/* The DisclosureGroup wrapper appears only where something is actually collapsible, so a\n flat `groups` renders the DOM it rendered before any of this existed. */}\n {hasSections ? (\n <DisclosureGroup className=\"pire-sidenav-tree\" allowsMultipleExpanded\n expandedKeys={expanded} onExpandedChange={handleExpandedChange}>\n {rows}\n </DisclosureGroup>\n ) : rows}\n </div>\n );\n })}\n {footer ? <div className=\"pire-sidenav-footer\">{footer}</div> : null}\n </nav>\n );\n}\n","import type * as React from 'react';\nimport {\n Menu as AriaMenu, MenuItem as AriaMenuItem, MenuSection as AriaMenuSection,\n Separator as AriaSeparator, Header,\n type MenuProps as AriaMenuProps, type MenuItemProps as AriaMenuItemProps,\n} from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { Kbd } from '../core/Kbd';\nimport { cx } from '../utils/cx';\n\nexport interface MenuProps<T extends object = object>\n extends Omit<AriaMenuProps<T>, 'className' | 'style'> {\n /** Accessible name when the trigger does not supply one. `MenuTrigger` usually does. */\n 'aria-label'?: string;\n /** Floor for the panel width. The panel sizes to its content, not to the trigger. */\n minWidth?: number | string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** The surface inside a `MenuTrigger`. Wrap it in a `Popover`, the way `Select` does. */\nexport function Menu<T extends object = object>({ minWidth, className, style, ...rest }: MenuProps<T>) {\n const width = typeof minWidth === 'number' ? `${minWidth}px` : minWidth;\n const menuStyle = width == null\n ? style\n : ({ ['--pire-menu-min-w' as string]: width, ...style } as React.CSSProperties);\n\n return (\n <AriaMenu\n className={cx('pire-menu', className)}\n style={menuStyle}\n {...(rest as AriaMenuProps<T>)}\n />\n );\n}\n\nexport interface MenuItemProps extends Omit<AriaMenuItemProps, 'className' | 'children'> {\n children?: React.ReactNode;\n /** Icon slug before the label. Same vocabulary as `Button.icon`. */\n icon?: string;\n /** Second line, for an action whose effect is not obvious from its label. */\n description?: React.ReactNode;\n /**\n * Keyboard shortcut, right-aligned and drawn as key caps. Painted only — it registers nothing.\n *\n * A string is split on `+` and spaces, so `\"Ctrl+Shift+P\"` renders as three caps. Pass an array\n * when the split cannot be inferred: `['⌘', 'N']`, since `\"⌘N\"` has no separator to split on.\n */\n shortcut?: string | string[];\n /** `danger` for a destructive action. Put it last, behind a `MenuSeparator`. */\n tone?: 'default' | 'danger';\n className?: string;\n}\n\n/** Splits `\"Ctrl+Shift+P\"` into its caps. An array is taken as given, because a chord written\n * without separators — `\"⌘N\"` — cannot be split without guessing where one key ends. */\nconst shortcutKeys = (shortcut: string | string[] | undefined): string[] => {\n if (shortcut == null) return [];\n const parts = Array.isArray(shortcut) ? shortcut : shortcut.split(/[+\\s]+/);\n return parts.map((part) => part.trim()).filter(Boolean);\n};\n\n/** A single command. Accepts `href`, so navigation items render a real anchor. */\nexport function MenuItem({\n children, icon, description, shortcut, tone = 'default', className, ...rest\n}: MenuItemProps) {\n const keys = shortcutKeys(shortcut);\n return (\n <AriaMenuItem\n className={cx('pire-menu-item', className)}\n data-tone={tone === 'danger' ? 'danger' : undefined}\n {...rest}\n >\n {icon ? <Icon name={icon} size={16} className=\"pire-menu-item-icon\" /> : null}\n <span className=\"pire-menu-item-body\">\n <span className=\"pire-menu-item-label\">{children}</span>\n {description ? <span className=\"pire-menu-item-desc\">{description}</span> : null}\n </span>\n {keys.length ? (\n <span className=\"pire-menu-item-shortcut\">\n {/* biome-ignore lint/suspicious/noArrayIndexKey: position is the identity of a cap in a fixed chord, and a glyph may repeat */}\n {keys.map((cap, index) => <Kbd key={`${cap}-${index}`} size=\"sm\">{cap}</Kbd>)}\n </span>\n ) : null}\n </AriaMenuItem>\n );\n}\n\n// `title` shadows the DOM tooltip attribute, so it must be Omitted before being redeclared.\nexport interface MenuSectionProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {\n /** Section heading. Rendered as a `Header`, not as a focusable item. */\n title?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n}\n\n/** Groups related commands under an optional heading. */\nexport function MenuSection({ title, children, className, ...rest }: MenuSectionProps) {\n return (\n <AriaMenuSection className={cx('pire-menu-section', className)} {...rest}>\n {title ? <Header className=\"pire-menu-section-title\">{title}</Header> : null}\n {children}\n </AriaMenuSection>\n );\n}\n\nexport interface MenuSeparatorProps {\n className?: string;\n}\n\n/** Rule between groups of items, on the menu's rhythm rather than the page's. */\nexport function MenuSeparator({ className }: MenuSeparatorProps) {\n return <AriaSeparator className={cx('pire-menu-separator', className)} />;\n}\n","import type * as React from 'react';\nimport { Tabs as AriaTabs, TabList, Tab as AriaTab, TabPanel } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { cx } from '../utils/cx';\n\nexport interface TabItem { id: string; label: string; icon?: string; count?: number; isDisabled?: boolean }\n\nexport interface TabsProps {\n items: TabItem[];\n value?: string;\n defaultValue?: string;\n onChange?: (id: string) => void;\n /** Optional panel content keyed by tab id. Omit when the tabs drive an external region —\n * the panel element is still rendered (empty and unstyled) so the tab's `aria-controls`\n * has something to point at. */\n panels?: Record<string, React.ReactNode>;\n 'aria-label'?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Peer views of one object. Arrow keys move between tabs; the panel is one tab stop away. */\nexport function Tabs({ items, value, defaultValue, onChange, panels, className, style, ...rest }: TabsProps) {\n return (\n <AriaTabs className={className} style={style} selectedKey={value} defaultSelectedKey={defaultValue}\n onSelectionChange={(k) => onChange?.(String(k))}>\n <TabList className=\"pire-tablist\" items={items} aria-label={rest['aria-label'] ?? 'Views'}>\n {(item) => (\n <AriaTab className={cx('pire-tab')} id={item.id} isDisabled={item.isDisabled}>\n {item.icon ? <Icon name={item.icon} size={16} /> : null}\n {item.label}\n {item.count != null ? <span className=\"pire-tab-count\">{item.count}</span> : null}\n </AriaTab>\n )}\n </TabList>\n {/* Rendered for every tab, with or without `panels`. React Aria puts `aria-controls` on\n the selected tab pointing at that tab's generated tabpanel id unconditionally, so\n omitting the panel leaves the reference dangling: invalid ARIA, and an axe\n `aria-valid-attr-value` failure in any consuming app that drives an external region.\n React Aria mounts only the selected panel, and with no content it is an empty,\n zero-height element — the padded `.pire-tabpanel` box is applied only when there is\n actually content to sit in it. */}\n {items.map((item) => (\n <TabPanel key={item.id} id={item.id} className={panels ? 'pire-tabpanel' : undefined}>\n {panels?.[item.id]}\n </TabPanel>\n ))}\n </AriaTabs>\n );\n}\n","import type * as React from 'react';\nimport { Breadcrumbs as AriaBreadcrumbs, Breadcrumb as AriaBreadcrumb, Link } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { cx } from '../utils/cx';\n\nexport interface BreadcrumbItem { id?: string; label: string; href?: string }\n\nexport interface BreadcrumbProps {\n /** Ordered trail, current page last. The last item is never a link. */\n items: BreadcrumbItem[];\n onNavigate?: (id: string) => void;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function Breadcrumb({ items, onNavigate, className, style }: BreadcrumbProps) {\n return (\n <AriaBreadcrumbs className={cx('pire-breadcrumbs', className)} style={style} items={items}\n onAction={(key) => onNavigate?.(String(key))}>\n {(item) => {\n const last = items[items.length - 1] === item;\n return (\n <AriaBreadcrumb className=\"pire-breadcrumb\" id={item.id ?? item.label}>\n {last ? item.label : <Link href={item.href}>{item.label}</Link>}\n {last ? null : <Icon name=\"chevron-right\" size={12} style={{ color: 'var(--text-tertiary)' }} />}\n </AriaBreadcrumb>\n );\n }}\n </AriaBreadcrumbs>\n );\n}\n","import type * as React from 'react';\nimport { IconButton } from '../core/IconButton';\nimport { Select } from '../forms/Select';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface PaginationProps {\n page?: number;\n pageSize?: number;\n /** Total record count — always shown, so users know the data set size. */\n total?: number;\n onPageChange?: (page: number) => void;\n onPageSizeChange?: (size: number) => void;\n pageSizes?: number[];\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function Pagination({ page = 1, pageSize = 25, total = 0, onPageChange, onPageSizeChange,\n pageSizes = [25, 50, 100], className, style }: PaginationProps) {\n const msg = usePireMessages();\n const pages = Math.max(1, Math.ceil(total / pageSize));\n const from = total === 0 ? 0 : (page - 1) * pageSize + 1;\n const to = Math.min(total, page * pageSize);\n return (\n <nav className={cx('pire-pagination', className)} style={style} aria-label={msg.paginationLabel}>\n <span className=\"pire-pagination-count\">\n {msg.paginationRange\n .replace('{from}', from.toLocaleString())\n .replace('{to}', to.toLocaleString())\n .replace('{total}', total.toLocaleString())}\n </span>\n <IconButton icon=\"chevron-left\" label={msg.paginationPrevious} size=\"sm\" variant=\"outlined\"\n isDisabled={page <= 1} onPress={() => onPageChange?.(page - 1)} />\n <span className=\"pire-pagination-count\" aria-live=\"polite\">\n {msg.paginationPageOf.replace('{page}', String(page)).replace('{pages}', String(pages))}\n </span>\n <IconButton icon=\"chevron-right\" label={msg.paginationNext} size=\"sm\" variant=\"outlined\"\n isDisabled={page >= pages} onPress={() => onPageChange?.(page + 1)} />\n {onPageSizeChange ? (\n <Select aria-label={msg.paginationRowsPerPage} size=\"sm\" fullWidth={false} value={String(pageSize)}\n options={pageSizes.map((s) => ({ value: String(s), label: `${s} rows` }))}\n onChange={(v) => onPageSizeChange(Number(v))} style={{ width: 120 }} />\n ) : null}\n </nav>\n );\n}\n","import type * as React from 'react';\nimport { Icon } from '../core/Icon';\nimport { IconButton } from '../core/IconButton';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport type MessageKind = 'info' | 'success' | 'warning' | 'error';\nconst KIND_ICON: Record<MessageKind, string> = {\n info: 'info', success: 'check-circle-2', warning: 'alert-triangle', error: 'alert-octagon',\n};\n\nexport interface InlineMessageProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n kind?: MessageKind;\n /** Message heading. Rich content, not the DOM title/tooltip attribute. */\n title?: React.ReactNode;\n /** Follow-up action, usually a tertiary Button. */\n action?: React.ReactNode;\n /** Provide to render a dismiss affordance. */\n onClose?: () => void;\n}\n\n/** In-page message tied to a region or form. Errors and warnings announce themselves. */\nexport function InlineMessage({ kind = 'info', title, action, onClose, children, className, ...rest }: InlineMessageProps) {\n const msg = usePireMessages();\n const assertive = kind === 'error' || kind === 'warning';\n return (\n <div className={cx('pire-msg', className)} data-kind={kind}\n role={assertive ? 'alert' : 'status'} aria-live={assertive ? 'assertive' : 'polite'} {...rest}>\n <Icon name={KIND_ICON[kind]} size={16} style={{ marginTop: 2 }} />\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', gap: 'var(--sp-1)' }}>\n {title ? <span className=\"pire-msg-title\">{title}</span> : null}\n {children ? <span className=\"pire-msg-body\">{children}</span> : null}\n {action}\n </div>\n {onClose ? <IconButton icon=\"x\" label={msg.inlineMessageDismiss} size=\"sm\" onPress={onClose} /> : null}\n </div>\n );\n}\n","import * as React from 'react';\nimport { Icon } from '../core/Icon';\nimport { IconButton } from '../core/IconButton';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\nimport type { MessageKind } from './InlineMessage';\n\nconst KIND_ICON: Record<MessageKind, string> = {\n info: 'info', success: 'check-circle-2', warning: 'alert-triangle', error: 'alert-octagon',\n};\n\nexport interface ToastProps extends React.HTMLAttributes<HTMLDivElement> {\n kind?: MessageKind;\n onClose?: () => void;\n position?: 'bottom-center' | 'bottom-right';\n}\n\n/** Transient confirmation of a completed action. Never use for errors the user must act on —\n * those belong in an InlineMessage next to the cause. */\nexport function Toast({ kind = 'success', onClose, position = 'bottom-center', children, className, ...rest }: ToastProps) {\n const msg = usePireMessages();\n return (\n <div className={cx('pire-toast', className)} data-position={position}\n role={kind === 'error' ? 'alert' : 'status'} aria-live={kind === 'error' ? 'assertive' : 'polite'} {...rest}>\n <Icon name={KIND_ICON[kind]} size={16} />\n <span style={{ flex: 1 }}>{children}</span>\n {onClose ? <IconButton icon=\"x\" label={msg.toastDismiss} size=\"sm\" variant=\"inverse\" onPress={onClose} /> : null}\n </div>\n );\n}\n\nexport interface ToastItem { id: string; kind?: MessageKind; message: React.ReactNode; timeout?: number }\n\ninterface ToastContextValue { add: (toast: Omit<ToastItem, 'id'>) => string; close: (id: string) => void }\nconst ToastContext = React.createContext<ToastContextValue | null>(null);\n\n/** Queue + live region. Mount once near the app root. */\nexport function ToastProvider({ children, timeout = 6000 }: { children?: React.ReactNode; timeout?: number }) {\n const msg = usePireMessages();\n const [toasts, setToasts] = React.useState<ToastItem[]>([]);\n const close = React.useCallback((id: string) => setToasts((t) => t.filter((x) => x.id !== id)), []);\n const add = React.useCallback((toast: Omit<ToastItem, 'id'>) => {\n const id = Math.random().toString(36).slice(2);\n setToasts((t) => [...t, { ...toast, id }]);\n const ms = toast.timeout ?? timeout;\n if (ms > 0) setTimeout(() => close(id), ms);\n return id;\n }, [close, timeout]);\n const value = React.useMemo(() => ({ add, close }), [add, close]);\n return (\n <ToastContext.Provider value={value}>\n {children}\n <div className=\"pire-toast-region\" role=\"region\" aria-label={msg.toastRegionLabel}>\n {toasts.map((t) => (\n <Toast key={t.id} kind={t.kind} onClose={() => close(t.id)} style={{ position: 'static', transform: 'none' }}>\n {t.message}\n </Toast>\n ))}\n </div>\n </ToastContext.Provider>\n );\n}\n\n/** `const toast = useToast(); toast.add({ kind: 'success', message: 'Order 4500012 released.' })` */\nexport function useToast() {\n const ctx = React.useContext(ToastContext);\n if (!ctx) throw new Error('useToast must be used inside <ToastProvider>');\n return ctx;\n}\n","import type * as React from 'react';\nimport { Button as AriaButton } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { cx } from '../utils/cx';\n\nexport interface KpiTileProps {\n /** Short metric name. Truncates — the tile shrinks with its grid track. */\n label: React.ReactNode;\n /** Pre-formatted figure — format in the caller's locale, not here. */\n value: React.ReactNode;\n unit?: React.ReactNode;\n /** Comparison figure, e.g. \"+4.2% vs last month\". */\n delta?: React.ReactNode;\n /** Which arrow to draw — purely the direction the number moved. */\n deltaDirection?: 'up' | 'down';\n /** Whether that movement is good news. A rising overdue-invoice count is\n * deltaDirection=\"up\" with deltaTone=\"negative\". Defaults to positive for up. */\n deltaTone?: 'positive' | 'negative' | 'neutral';\n footnote?: React.ReactNode;\n icon?: string;\n /** Tints the value when the KPI itself is out of tolerance. */\n status?: 'neutral' | 'positive' | 'critical' | 'negative';\n onPress?: () => void;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function KpiTile({ label, value, unit, delta, deltaDirection, deltaTone, footnote, icon,\n status = 'neutral', onPress, className, style }: KpiTileProps) {\n const tone = deltaTone ?? (deltaDirection === 'down' ? 'negative' : 'positive');\n const body = (\n <>\n <span className=\"pire-kpi-label\">\n {icon ? <Icon name={icon} size={16} /> : null}{label}\n </span>\n <span className=\"pire-kpi-value\">{value}{unit ? <span className=\"pire-kpi-unit\">{unit}</span> : null}</span>\n {delta ? (\n <span className=\"pire-kpi-delta\" data-tone={tone}>\n {deltaDirection ? <Icon name={deltaDirection === 'up' ? 'trending-up' : 'trending-down'} size={12} /> : null}\n {delta}\n </span>\n ) : null}\n {footnote ? <span className=\"pire-kpi-foot\">{footnote}</span> : null}\n </>\n );\n const props = { className: cx('pire-kpi', className), 'data-status': status, style };\n return onPress\n ? <AriaButton {...props} data-pressable=\"true\" onPress={onPress}>{body}</AriaButton>\n : <div {...props}>{body}</div>;\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface ObjectFact { label: string; value: React.ReactNode; numeric?: boolean }\n\nexport interface ObjectHeaderProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title' | 'id'> {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n /** Technical key — rendered in mono next to the subtitle. Not the DOM id. */\n id?: React.ReactNode;\n /** A <Breadcrumb /> element. */\n breadcrumb?: React.ReactNode;\n /** A <Badge /> carrying the object's value state. */\n badge?: React.ReactNode;\n /** Key/value summary strip. Set numeric for amounts. */\n facts?: ObjectFact[];\n actions?: React.ReactNode;\n}\n\n/** The identity block at the top of any object page: who this record is, its state, its key figures. */\nexport function ObjectHeader({ title, subtitle, id, breadcrumb, badge, facts, actions, className, ...rest }: ObjectHeaderProps) {\n return (\n <header className={cx('pire-objheader', className)} {...rest}>\n {breadcrumb}\n <div className=\"pire-objheader-row\">\n <div style={{ minWidth: 0 }}>\n <h1 className=\"pire-objheader-title\">{title}</h1>\n {subtitle || id ? (\n <div className=\"pire-objheader-sub\">\n {subtitle}\n {id ? <span className=\"pire-objheader-id\">{id}</span> : null}\n </div>\n ) : null}\n </div>\n {badge}\n {actions ? <div className=\"pire-objheader-actions\">{actions}</div> : null}\n </div>\n {facts?.length ? (\n <dl className=\"pire-facts\" style={{ margin: 0 }}>\n {facts.map((fact) => (\n <div key={fact.label}>\n <dt className=\"pire-fact-label\">{fact.label}</dt>\n <dd className=\"pire-fact-value\" data-numeric={fact.numeric ? 'true' : undefined} style={{ margin: 0 }}>\n {fact.value}\n </dd>\n </div>\n ))}\n </dl>\n ) : null}\n </header>\n );\n}\n","import type * as React from 'react';\nimport { Button } from '../core/Button';\nimport { Tag } from '../core/Tag';\nimport { useMessage } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface ActiveFilter { id: string; label: string }\n\nexport interface FilterBarProps extends React.HTMLAttributes<HTMLElement> {\n /** Filter controls — Inputs and Selects with their own labels. */\n children?: React.ReactNode;\n /** Applied filters, shown as removable Tags. */\n activeFilters?: ActiveFilter[];\n onRemoveFilter?: (id: string) => void;\n onClear?: () => void;\n /** Provide to render the \"Go\" trigger. Pire filters apply explicitly, never live. */\n onGo?: () => void;\n /** e.g. \"1,284 orders\". Announced when it changes. */\n resultLabel?: React.ReactNode;\n actions?: React.ReactNode;\n /** Overrides the dictionary's `filterBarGo` for this bar only. */\n goLabel?: string;\n /** Overrides the dictionary's `filterBarClearAll` for this bar only. */\n clearAllLabel?: string;\n /** Overrides the dictionary's `filterBarLabel` — the landmark name. */\n 'aria-label'?: string;\n}\n\nexport function FilterBar({ children, activeFilters = [], onRemoveFilter, onClear, onGo,\n resultLabel, actions, goLabel, clearAllLabel, className, ...rest }: FilterBarProps) {\n const label = useMessage('filterBarLabel', rest['aria-label']);\n const go = useMessage('filterBarGo', goLabel);\n const clearAll = useMessage('filterBarClearAll', clearAllLabel);\n\n return (\n <section className={cx('pire-filterbar', className)} {...rest} aria-label={label}>\n <div className=\"pire-filterbar-controls\">\n {children}\n {onGo ? <Button variant=\"primary\" onPress={onGo}>{go}</Button> : null}\n </div>\n {activeFilters.length || resultLabel || actions ? (\n <div className=\"pire-filterbar-foot\">\n {activeFilters.map((filter) => (\n <Tag key={filter.id} onRemove={onRemoveFilter ? () => onRemoveFilter(filter.id) : undefined}>\n {filter.label}\n </Tag>\n ))}\n {activeFilters.length && onClear ? (\n <Button variant=\"tertiary\" size=\"sm\" onPress={onClear}>{clearAll}</Button>\n ) : null}\n {resultLabel ? <span className=\"pire-filterbar-result\" aria-live=\"polite\">{resultLabel}</span> : null}\n {actions ? <div className=\"pire-filterbar-actions\">{actions}</div> : null}\n </div>\n ) : null}\n </section>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface DescriptionItem {\n label: React.ReactNode;\n value: React.ReactNode;\n /** Tabular mono — use for every amount, quantity and ID. */\n numeric?: boolean;\n /** Separates and enlarges the row: totals, gross value, balance. */\n emphasis?: boolean;\n /** Rendered after the term — a Tooltip trigger explaining the figure. */\n hint?: React.ReactNode;\n}\n\nexport interface DescriptionListProps extends React.HTMLAttributes<HTMLDListElement> {\n items: DescriptionItem[];\n /** rows = label left / value right (totals panels). grid = caps label above value (detail facts). */\n layout?: 'rows' | 'grid';\n /** Columns when layout is grid. */\n columns?: number;\n}\n\n/** Key/value readout: order totals, stock figures, master-data summaries. Replaces the hand-rolled\n * <dl> that every ERP screen used to carry. */\nexport function DescriptionList({ items, layout = 'rows', columns = 3, className, style, ...rest }: DescriptionListProps) {\n return (\n <dl className={cx('pire-dl', className)} data-layout={layout}\n style={{ ...(layout === 'grid' ? { '--pire-dl-cols': columns } : null), ...style } as React.CSSProperties} {...rest}>\n {items.map((item, i) => (\n <div className=\"pire-dl-row\" key={i} data-emphasis={item.emphasis ? 'true' : undefined}>\n <dt className=\"pire-dl-term\">{item.label}{item.hint}</dt>\n <dd className=\"pire-dl-value\" data-numeric={item.numeric ? 'true' : undefined}>{item.value}</dd>\n </div>\n ))}\n </dl>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface TimelineEntry {\n id?: string;\n /** Pre-formatted timestamp — format in the caller's locale. */\n time: React.ReactNode;\n event: React.ReactNode;\n /** Who or what caused it: a user name, \"System\", an interface id. */\n actor?: React.ReactNode;\n}\n\nexport interface TimelineProps extends React.HTMLAttributes<HTMLOListElement> {\n entries: TimelineEntry[];\n /** Newest first. Default true — audit trails read top-down from now. */\n reverse?: boolean;\n}\n\n/** Document history and audit trail: what happened, when, and who did it. */\nexport function Timeline({ entries, reverse = false, className, ...rest }: TimelineProps) {\n const list = reverse ? [...entries].reverse() : entries;\n return (\n <ol className={cx('pire-timeline', className)} {...rest}>\n {list.map((entry, i) => (\n <li className=\"pire-timeline-item\" key={entry.id ?? i}>\n <span className=\"pire-timeline-time\">{entry.time}</span>\n <span className=\"pire-timeline-text\">{entry.event}</span>\n {entry.actor ? <span className=\"pire-timeline-actor\">{entry.actor}</span> : null}\n </li>\n ))}\n </ol>\n );\n}\n","/**\n * Scale maths and slot assignment shared by the chart components.\n *\n * Kept free of React and of the DOM so the arithmetic — which is where charts go quietly\n * wrong — can be tested directly rather than through a rendered SVG.\n */\n\n/** One measured thing, drawn across every category. */\nexport interface ChartSeries {\n /** Stable across re-renders and across filter changes. Colour follows this, not position. */\n id: string;\n /** Shown in the legend, the tooltip and the data table. */\n label: string;\n /** One entry per category, in the same order. `null` is a gap in the data, never a zero. */\n values: (number | null)[];\n /**\n * Pin this series to a specific `--viz` slot, 1–6. Without it slots are handed out in\n * order. Use it when the same entity appears on several charts and must keep one colour.\n */\n colorIndex?: number;\n}\n\n/** How many distinct series colours the palette defines. Validated as a set; do not extend. */\nexport const VIZ_SLOT_COUNT = 6;\n\nexport interface ChartScale {\n min: number;\n max: number;\n /** Ascending, always including `min` and `max`. */\n ticks: number[];\n}\n\nconst NICE_STEPS = [1, 2, 2.5, 5, 10];\n\n/** Rounds a rough step up to the nearest 1 / 2 / 2.5 / 5 / 10 × 10ⁿ, so axis labels stay readable. */\nfunction niceStep(rough: number): number {\n if (!(rough > 0)) return 1;\n const magnitude = 10 ** Math.floor(Math.log10(rough));\n const normalized = rough / magnitude;\n return (NICE_STEPS.find((candidate) => candidate >= normalized) ?? 10) * magnitude;\n}\n\n/**\n * A rounded axis covering `values`.\n *\n * `startAtZero` defaults to true because a bar's length is only readable when the axis starts\n * at zero — a truncated bar axis exaggerates differences, which is the commonest way a chart\n * misleads. Lines may pass false, since a line encodes change rather than magnitude.\n */\nexport function linearScale(\n values: (number | null | undefined)[], tickCount = 4, startAtZero = true,\n): ChartScale {\n const present = values.filter((value): value is number =>\n value != null && Number.isFinite(value));\n if (present.length === 0) return { min: 0, max: 1, ticks: [0, 1] };\n\n let low = Math.min(...present);\n let high = Math.max(...present);\n if (startAtZero) { low = Math.min(0, low); high = Math.max(0, high); }\n // A flat series still needs an axis with height, or every bar renders at zero pixels.\n if (low === high) { high = low === 0 ? 1 : low + Math.abs(low); }\n\n const step = niceStep((high - low) / Math.max(1, tickCount));\n\n // Two float defences, because both failures land straight on the axis labels.\n // The epsilon stops a value that is exactly on a step — 0.5 / 0.1 evaluating to\n // 5.000000000000001 — from rounding up to a whole extra tick. The decimal rounding stops\n // 3 × 0.1 from printing as \"0.30000000000000004\".\n const EDGE_TOLERANCE = 1e-9;\n const decimals = Math.max(0, 1 - Math.floor(Math.log10(step)));\n const toStepPrecision = (value: number) => Number(value.toFixed(decimals));\n\n const min = toStepPrecision(Math.floor(low / step + EDGE_TOLERANCE) * step);\n const max = toStepPrecision(Math.ceil(high / step - EDGE_TOLERANCE) * step);\n\n const stepCount = Math.round((max - min) / step);\n const ticks = Array.from({ length: stepCount + 1 },\n (_, index) => toStepPrecision(min + index * step));\n return { min, max, ticks };\n}\n\n/** Where `value` sits on `scale`, as 0–1 from the axis minimum. */\nexport function scalePosition(value: number, scale: ChartScale): number {\n const span = scale.max - scale.min;\n return span === 0 ? 0 : (value - scale.min) / span;\n}\n\n/**\n * The CSS colour for a series.\n *\n * Slots are handed out in declaration order and never cycled: past the sixth, identity by\n * colour alone stops being reliable, so the overflow folds into one \"other\" neutral instead\n * of inventing a seventh hue. Aggregate upstream when you have more than six.\n */\nexport function seriesColor(series: ChartSeries, index: number): string {\n const slot = series.colorIndex ?? index + 1;\n return slot >= 1 && slot <= VIZ_SLOT_COUNT ? `var(--viz-${slot})` : 'var(--viz-other)';\n}\n\n/** Declared locally for the same reason as in `Icon` — see the note there. The bare\n * `process.env.NODE_ENV` token has to survive into the output for a bundler to substitute it,\n * and the package deliberately carries no `@types/node`. */\ndeclare const process: { env: { NODE_ENV?: string } };\nconst IS_DEV = process.env.NODE_ENV !== 'production';\n\n/** Charts re-render on every filter change, so one warning per cause rather than per render. */\nconst warnedCharts = new Set<string>();\n\n/** Dev-only nudge: more series than the palette can tell apart is a data-shape problem. */\nexport function warnOnSlotOverflow(series: ChartSeries[], chartLabel: string): void {\n if (!IS_DEV || warnedCharts.has(chartLabel)) return;\n if (series.length <= VIZ_SLOT_COUNT) return;\n warnedCharts.add(chartLabel);\n console.warn(\n `[pire] \"${chartLabel}\" has ${series.length} series but the palette defines ` +\n `${VIZ_SLOT_COUNT} distinguishable colours. The extras render in one shared neutral. ` +\n 'Group the tail into an \"Other\" series, or split the chart into small multiples.',\n );\n}\n\n/**\n * Dev-only checks specific to a donut, where the failure modes are about shape rather than count.\n *\n * Negative values are the important one: an arc length cannot be negative, so a refund or a\n * reversal silently draws as its own absolute value and the chart reads as confidently wrong.\n */\nexport function warnOnDonutShape(\n series: ChartSeries[], categoryCount: number, chartLabel: string,\n): void {\n if (!IS_DEV || warnedCharts.has(`donut:${chartLabel}`)) return;\n\n const complaints: string[] = [];\n if (series.length > 1) {\n complaints.push(`it has ${series.length} series but a donut draws one — the rest are ignored`);\n }\n if (categoryCount > VIZ_SLOT_COUNT) {\n complaints.push(`it has ${categoryCount} segments and the palette defines ${VIZ_SLOT_COUNT}; `\n + 'past about four, slices stop being readable at all — group the tail into \"Other\"');\n }\n if (series[0]?.values.some((value) => value != null && value < 0)) {\n complaints.push('it contains negative values, which have no part-to-whole meaning — '\n + 'a signed measure belongs in a bar chart');\n }\n if (complaints.length === 0) return;\n\n warnedCharts.add(`donut:${chartLabel}`);\n console.warn(`[pire] DonutChart \"${chartLabel}\": ${complaints.join('; ')}.`);\n}\n\n/** Sum of a category's values across series, skipping gaps. Used for stacked totals. */\nexport function stackTotal(series: ChartSeries[], categoryIndex: number): number {\n return series.reduce((total, one) => total + (one.values[categoryIndex] ?? 0), 0);\n}\n\n/** Every plotted number in one flat list — what the scale is derived from. */\nexport function flatValues(series: ChartSeries[]): (number | null)[] {\n return series.flatMap((one) => one.values);\n}\n\n/**\n * Trims each series to the category count.\n *\n * A series longer than the axis would otherwise plot points past the last category, stacked on\n * top of each other at an undefined position. Shorter series need no padding — reading past the\n * end already yields `undefined`, which every call site treats as a gap.\n */\nexport function alignToCategories(series: ChartSeries[], categoryCount: number): ChartSeries[] {\n return series.map((one) => (one.values.length <= categoryCount\n ? one\n : { ...one, values: one.values.slice(0, categoryCount) }));\n}\n","import type * as React from 'react';\nimport type { ChartSeries } from './chartGeometry';\nimport { seriesColor } from './chartGeometry';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\n/** Props every chart shares. Each chart adds its own encoding options on top. */\nexport interface ChartBaseProps {\n /**\n * What the chart shows, in a sentence. Required: a chart with no accessible name is\n * an unlabelled image, and the visible title cannot be relied on — charts are often\n * placed under a heading that already says something different.\n */\n 'aria-label': string;\n /** Category axis labels. `series[].values` line up with these by index. */\n categories: string[];\n series: ChartSeries[];\n /** Shown above the plot. With a single series this is what names it, in place of a legend. */\n title?: React.ReactNode;\n /** Sits under the title in secondary ink — units, period, source. */\n description?: React.ReactNode;\n /**\n * Formats every number that reaches a human: axis ticks, tooltips, the data table.\n * Pire does not format — only the app knows the currency, the locale and the precision.\n */\n formatValue?: (value: number) => string;\n /** Plot height in pixels. Width always fills the container. */\n height?: number;\n /** Replaces the plot when there is nothing to draw. */\n emptyState?: React.ReactNode;\n /** Renders the underlying table visibly beneath the plot, instead of only for screen readers. */\n showDataTable?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** One swatch in the legend. What it identifies differs by chart — see `ChartFrameProps.legend`. */\nexport interface ChartLegendItem {\n key: string;\n label: string;\n color: string;\n}\n\nexport interface ChartFrameProps extends\n Pick<ChartBaseProps, 'title' | 'description' | 'categories' | 'series' | 'showDataTable'\n | 'className' | 'style'> {\n label: string;\n formatValue: (value: number) => string;\n /**\n * Rendered only when there are at least two entries — one thing needs no key to tell it from\n * the others, and the title already names it.\n *\n * The chart decides what an entry stands for: bars and lines colour by series, a donut colours\n * by segment. Passing the list ready-made keeps that decision with the chart that made it.\n */\n legend?: ChartLegendItem[];\n children: React.ReactNode;\n}\n\n/** Legend entries for a chart that colours by series — bars and lines. */\nexport function seriesLegend(series: ChartSeries[]): ChartLegendItem[] {\n return series.map((one, index) => ({\n key: one.id, label: one.label, color: seriesColor(one, index),\n }));\n}\n\n/** Falls back to the browser's grouping so large figures stay readable without configuration. */\nexport const defaultFormatValue = (value: number): string => value.toLocaleString();\n\n/**\n * The shell around every Pire chart: heading, legend, plot, and the data table.\n *\n * The table is always in the DOM. A chart summarised in prose tells a screen-reader user what\n * someone else concluded; the table gives them the same numbers everyone else is looking at.\n * `showDataTable` only decides whether it is also visible.\n */\nexport function ChartFrame({\n label, title, description, categories, series, formatValue, legend, showDataTable,\n className, style, children,\n}: ChartFrameProps) {\n const msg = usePireMessages();\n return (\n <figure className={cx('pire-chart', className)} style={style}>\n {title || description ? (\n <figcaption className=\"pire-chart-head\">\n {title ? <span className=\"pire-chart-title\">{title}</span> : null}\n {description ? <span className=\"pire-chart-desc\">{description}</span> : null}\n </figcaption>\n ) : null}\n\n {legend && legend.length > 1 ? (\n <ul className=\"pire-chart-legend\">\n {legend.map((item) => (\n <li key={item.key} className=\"pire-chart-legend-item\">\n <span className=\"pire-chart-swatch\" style={{ background: item.color }} />\n {item.label}\n </li>\n ))}\n </ul>\n ) : null}\n\n {/* The plot is decorative to assistive tech — the table below carries the same data,\n and reading out a wall of SVG shapes is worse than nothing. */}\n <div className=\"pire-chart-plot\" aria-hidden=\"true\">{children}</div>\n\n <div className={showDataTable ? 'pire-chart-table' : 'pire-sr-only'}>\n <table>\n <caption>{label}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{msg.chartCategoryHeader}</th>\n {series.map((one) => <th key={one.id} scope=\"col\">{one.label}</th>)}\n </tr>\n </thead>\n <tbody>\n {categories.map((category, categoryIndex) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: categories are positional and repeat legitimately (two quarters both labelled \"Q1\").\n <tr key={categoryIndex}>\n <th scope=\"row\">{category}</th>\n {series.map((one) => {\n const value = one.values[categoryIndex];\n return (\n <td key={one.id}>\n {value == null ? msg.chartNoValue : formatValue(value)}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </figure>\n );\n}\n","import type * as React from 'react';\nimport type { ChartBaseProps } from './ChartFrame';\nimport { ChartFrame, defaultFormatValue, seriesLegend } from './ChartFrame';\nimport {\n alignToCategories, flatValues, linearScale, scalePosition, seriesColor, stackTotal,\n warnOnSlotOverflow,\n} from './chartGeometry';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\n\nexport interface BarChartProps extends ChartBaseProps {\n /**\n * `horizontal` puts categories down the side, which is what long ERP labels need — product\n * names and account descriptions do not fit under a vertical bar without turning sideways.\n * Use `vertical` when the categories are periods and reading left-to-right means time.\n */\n orientation?: 'horizontal' | 'vertical';\n /**\n * Stack the series into one bar per category, for parts of a total.\n *\n * Only the first segment and the total are easy to compare across categories, because the\n * middle segments start at different offsets. If the comparison matters more than the total,\n * leave this off and let the bars sit side by side.\n */\n stacked?: boolean;\n /**\n * Print each value beside its bar. Defaults on for a single series — where the chart is a\n * ranking and the number is half the answer — and off beyond that, where a label per bar\n * turns into noise. The tooltip and the data table always carry every value.\n */\n showValues?: boolean;\n}\n\n/**\n * Magnitude and ranking — how big, and in what order.\n *\n * Laid out in HTML rather than SVG so category labels are real text: they wrap, truncate and\n * inherit type tokens, none of which survives a scaled `viewBox`. The bar axis always starts at\n * zero, since a bar encodes length, and a truncated axis overstates the difference.\n */\nexport function BarChart({\n categories, series: rawSeries, title, description, formatValue = defaultFormatValue,\n height = 260, emptyState, showDataTable, orientation = 'horizontal', stacked = false,\n showValues, className, style, ...rest\n}: BarChartProps) {\n const label = rest['aria-label'];\n const msg = usePireMessages();\n warnOnSlotOverflow(rawSeries, label);\n\n const series = alignToCategories(rawSeries, categories.length);\n const hasData = categories.length > 0 && series.length > 0;\n const withValues = showValues ?? series.length === 1;\n\n // Stacking compares totals, so the axis has to reach the tallest total rather than the\n // tallest single value.\n const scale = linearScale(\n stacked ? categories.map((_, index) => stackTotal(series, index)) : flatValues(series),\n );\n\n const sizeOf = (value: number) => `${scalePosition(value, scale) * 100}%`;\n\n /**\n * The figure in the right-hand column. A missing reading gets the \"no data\" wording rather\n * than a formatted zero — printing ₲ 0 for a month nobody has closed states a number that\n * was never measured.\n */\n const horizontalLabelFor = (categoryIndex: number) => {\n if (stacked) return formatValue(stackTotal(series, categoryIndex));\n const value = series[0].values[categoryIndex];\n return value == null ? msg.chartNoValue : formatValue(value);\n };\n\n return (\n <ChartFrame\n label={label} title={title} description={description} categories={categories}\n series={series} formatValue={formatValue} legend={seriesLegend(series)}\n showDataTable={showDataTable} className={className} style={style}\n >\n {!hasData ? (\n <div className=\"pire-chart-empty\">{emptyState ?? msg.chartEmpty}</div>\n ) : (\n <div\n className=\"pire-chart-bars\"\n data-orientation={orientation}\n data-stacked={String(stacked)}\n style={{ '--pire-chart-height': `${height}px` } as React.CSSProperties}\n >\n {categories.map((category, categoryIndex) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: categories are positional and repeat legitimately (two quarters both labelled \"Q1\").\n <div key={categoryIndex} className=\"pire-chart-group\">\n <span className=\"pire-chart-cat\">{category}</span>\n <div className=\"pire-chart-track\">\n {series.map((one, seriesIndex) => {\n const value = one.values[categoryIndex];\n if (value == null) return null;\n return (\n <div\n key={one.id}\n className=\"pire-chart-bar\"\n style={{\n '--pire-bar-size': sizeOf(value),\n '--pire-bar-color': seriesColor(one, seriesIndex),\n } as React.CSSProperties}\n >\n {/* Vertical bars label themselves. A shared column would put the number at\n a fixed height while the bar it belongs to ends somewhere else. */}\n {withValues && orientation === 'vertical' ? (\n <span className=\"pire-chart-barval\">{formatValue(value)}</span>\n ) : null}\n <span className=\"pire-chart-tip\" role=\"presentation\">\n {series.length > 1 ? `${one.label}: ` : ''}\n {formatValue(value)}\n </span>\n </div>\n );\n })}\n </div>\n {/* Horizontal keeps a shared right-hand column instead: the bars all end at\n different points, so aligned figures are far easier to compare down the list. */}\n {withValues && orientation === 'horizontal' ? (\n <span className=\"pire-chart-val\">{horizontalLabelFor(categoryIndex)}</span>\n ) : null}\n </div>\n ))}\n </div>\n )}\n </ChartFrame>\n );\n}\n","import * as React from 'react';\nimport type { ChartBaseProps } from './ChartFrame';\nimport { ChartFrame, defaultFormatValue, seriesLegend } from './ChartFrame';\nimport {\n alignToCategories, flatValues, linearScale, scalePosition, seriesColor, warnOnSlotOverflow,\n} from './chartGeometry';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\n\nexport interface LineChartProps extends ChartBaseProps {\n /**\n * Tint the area under each line. Reads well for one series; with several the fills overlap\n * and the lower ones are read as smaller than they are, so it is ignored past the first.\n */\n showArea?: boolean;\n /**\n * Draw a dot at every point. On by default under about twenty points, where the dots show\n * where the real readings are rather than implying data between them.\n */\n showMarkers?: boolean;\n /**\n * Let the axis start above zero, so a small movement in a large number stays visible.\n *\n * Legitimate for a line, which encodes change rather than length — but it does exaggerate,\n * so leave it off whenever the size of the number is part of the point.\n */\n zoomToData?: boolean;\n}\n\n/** Room for the axis labels, in CSS pixels. The plot is what is left inside these. */\nconst PLOT_INSET = { top: 10, right: 14, bottom: 24, left: 58 };\n\n/** Below this many points a dot per reading is informative; above it, it is a smear. */\nconst MARKER_LIMIT = 20;\n\n/**\n * `useLayoutEffect` where there is a DOM, `useEffect` where there is not.\n *\n * Server rendering warns about layout effects, but falling back to `useEffect` on the client\n * would measure after the first paint and show an empty plot frame for a frame.\n */\nconst useIsomorphicLayoutEffect =\n typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect;\n\n/** Tracks the rendered width, because a line's geometry cannot be expressed in percentages. */\nfunction useMeasuredWidth(): [React.RefObject<HTMLDivElement | null>, number] {\n const ref = React.useRef<HTMLDivElement | null>(null);\n const [width, setWidth] = React.useState(0);\n\n useIsomorphicLayoutEffect(() => {\n const element = ref.current;\n if (!element) return;\n // Measure once up front: ResizeObserver's first callback is asynchronous, so waiting for\n // it would paint an empty frame before the chart appears.\n setWidth(element.getBoundingClientRect().width);\n const observer = new ResizeObserver(([entry]) => setWidth(entry.contentRect.width));\n observer.observe(element);\n return () => observer.disconnect();\n }, []);\n\n return [ref, width];\n}\n\n/**\n * Change over time.\n *\n * Drawn in SVG at measured pixel coordinates rather than a scaled `viewBox`: scaling a viewBox\n * to fit stretches the type and turns markers into ellipses. Gaps in a series break the line\n * instead of interpolating across them — a missing month is not a straight line through it.\n */\nexport function LineChart({\n categories, series: rawSeries, title, description, formatValue = defaultFormatValue,\n height = 260, emptyState, showDataTable, showArea = false, showMarkers, zoomToData = false,\n className, style, ...rest\n}: LineChartProps) {\n const label = rest['aria-label'];\n const msg = usePireMessages();\n warnOnSlotOverflow(rawSeries, label);\n\n const [plotRef, width] = useMeasuredWidth();\n const series = alignToCategories(rawSeries, categories.length);\n const hasData = categories.length > 0 && series.length > 0;\n const withMarkers = showMarkers ?? categories.length <= MARKER_LIMIT;\n\n const scale = linearScale(flatValues(series), 4, !zoomToData);\n const innerWidth = Math.max(0, width - PLOT_INSET.left - PLOT_INSET.right);\n const innerHeight = Math.max(0, height - PLOT_INSET.top - PLOT_INSET.bottom);\n\n const xAt = (index: number) => PLOT_INSET.left + (categories.length <= 1\n ? innerWidth / 2\n : (index / (categories.length - 1)) * innerWidth);\n const yAt = (value: number) =>\n PLOT_INSET.top + innerHeight - scalePosition(value, scale) * innerHeight;\n\n /** One `M`-prefixed run per unbroken stretch, so nulls leave a hole rather than a shortcut. */\n const pathFor = (values: (number | null)[]) => {\n let path = '';\n let penIsDown = false;\n values.forEach((value, index) => {\n if (value == null) { penIsDown = false; return; }\n path += `${penIsDown ? 'L' : 'M'}${xAt(index)} ${yAt(value)} `;\n penIsDown = true;\n });\n return path.trim();\n };\n\n /** Closed back down to the baseline so the fill has a bottom edge. */\n const areaFor = (values: (number | null)[]) => {\n const present = values\n .map((value, index) => ({ value, index }))\n .filter((point): point is { value: number; index: number } => point.value != null);\n if (present.length < 2) return '';\n const baseline = PLOT_INSET.top + innerHeight;\n const line = present.map((point) => `${xAt(point.index)} ${yAt(point.value)}`).join(' L');\n const last = present[present.length - 1];\n return `M${xAt(present[0].index)} ${baseline} L${line} L${xAt(last.index)} ${baseline} Z`;\n };\n\n // Every third label at most, so ticks never collide on a narrow dashboard column.\n const labelEvery = Math.max(1, Math.ceil(categories.length / Math.max(2, Math.floor(innerWidth / 64))));\n\n return (\n <ChartFrame\n label={label} title={title} description={description} categories={categories}\n series={series} formatValue={formatValue} legend={seriesLegend(series)}\n showDataTable={showDataTable} className={className} style={style}\n >\n {!hasData ? (\n <div className=\"pire-chart-empty\">{emptyState ?? msg.chartEmpty}</div>\n ) : (\n <div className=\"pire-chart-lines\" ref={plotRef} style={{ height }}>\n {/* The SVG is decorative: the frame's data table carries these numbers, and reading a\n wall of SVG shapes aloud is worse than nothing. It also waits for the first measured\n width, since there is no correct geometry before then. */}\n {width > 0 ? (\n <svg width={width} height={height} className=\"pire-chart-svg\"\n aria-hidden=\"true\" focusable=\"false\">\n <g className=\"pire-chart-grid\">\n {scale.ticks.map((tick) => (\n <line key={tick} x1={PLOT_INSET.left} x2={width - PLOT_INSET.right}\n y1={yAt(tick)} y2={yAt(tick)} />\n ))}\n </g>\n <g className=\"pire-chart-tick\">\n {scale.ticks.map((tick) => (\n <text key={tick} x={PLOT_INSET.left - 8} y={yAt(tick)}\n textAnchor=\"end\" dominantBaseline=\"middle\">\n {formatValue(tick)}\n </text>\n ))}\n {categories.map((category, index) => (\n index % labelEvery === 0 ? (\n // biome-ignore lint/suspicious/noArrayIndexKey: categories are positional and repeat legitimately (two quarters both labelled \"Q1\").\n <text key={index} x={xAt(index)} y={height - 6} textAnchor=\"middle\">\n {category}\n </text>\n ) : null\n ))}\n </g>\n\n {showArea && series[0] ? (\n <path d={areaFor(series[0].values)} className=\"pire-chart-area\"\n style={{ fill: seriesColor(series[0], 0) }} />\n ) : null}\n\n <g className=\"pire-chart-line\" fill=\"none\">\n {series.map((one, index) => (\n <path key={one.id} d={pathFor(one.values)} stroke={seriesColor(one, index)} />\n ))}\n </g>\n\n {withMarkers ? (\n <g className=\"pire-chart-marker\">\n {series.map((one, seriesIndex) => one.values.map((value, index) => (\n value == null ? null : (\n // biome-ignore lint/suspicious/noArrayIndexKey: a series is positional — the index is the point's identity, and category labels repeat.\n <circle key={`${one.id}-${index}`} cx={xAt(index)} cy={yAt(value)}\n r={4} fill={seriesColor(one, seriesIndex)} />\n )\n )))}\n </g>\n ) : null}\n </svg>\n ) : null}\n\n {/* Hover bands sit above the SVG in HTML: a crosshair and a tooltip that inherits the\n type tokens, without hand-positioning text inside the SVG. */}\n <div className=\"pire-chart-hover\"\n style={{ inset: `${PLOT_INSET.top}px ${PLOT_INSET.right}px ${PLOT_INSET.bottom}px ${PLOT_INSET.left}px` }}>\n {categories.map((category, categoryIndex) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: categories are positional and repeat legitimately (two quarters both labelled \"Q1\").\n <div key={categoryIndex} className=\"pire-chart-band\">\n <span className=\"pire-chart-tip\" role=\"presentation\">\n <strong>{category}</strong>\n {series.map((one) => {\n const value = one.values[categoryIndex];\n return (\n <span key={one.id} className=\"pire-chart-tip-row\">\n {one.label}: {value == null ? 'No data' : formatValue(value)}\n </span>\n );\n })}\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n </ChartFrame>\n );\n}\n","import * as React from 'react';\nimport type { ChartBaseProps, ChartLegendItem } from './ChartFrame';\nimport { ChartFrame, defaultFormatValue } from './ChartFrame';\nimport { VIZ_SLOT_COUNT, warnOnDonutShape } from './chartGeometry';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\n\nexport interface DonutChartProps extends ChartBaseProps {\n /**\n * What sits in the hole. Defaults to the total of every segment, which is the number a\n * part-to-whole chart is implicitly about. Hovering a segment replaces it with that segment.\n */\n centerLabel?: React.ReactNode;\n /** Caption under the centre figure — \"Total\", \"Invoiced\", whatever the total means. */\n centerCaption?: React.ReactNode;\n /** Ring thickness in pixels. Thinner reads as a gauge, thicker as a pie. */\n thickness?: number;\n}\n\n/** Gap between segments, in degrees of arc — the spacer that stops two fills reading as one. */\nconst SEGMENT_GAP_DEGREES = 1.5;\n\n/**\n * Part-to-whole, at a glance.\n *\n * **Use this only when the reader needs the rough shape of a split, not the ranking.** People\n * compare angles far worse than they compare lengths, so any question of the form \"which is\n * bigger\" or \"by how much\" is a `BarChart`. Six segments is the ceiling, and it is a ceiling\n * rather than a target: past three or four the small slices stop being readable at all.\n *\n * Unlike the other charts, colour here follows the *segment*, not the series — a donut draws one\n * series, and its categories are what need telling apart. Pass exactly one series; anything after\n * the first is ignored, with a dev warning.\n */\nexport function DonutChart({\n categories, series, title, description, formatValue = defaultFormatValue, height = 220,\n emptyState, showDataTable, centerLabel, centerCaption, thickness = 28,\n className, style, ...rest\n}: DonutChartProps) {\n const label = rest['aria-label'];\n const msg = usePireMessages();\n const [hoveredIndex, setHoveredIndex] = React.useState<number | null>(null);\n\n warnOnDonutShape(series, categories.length, label);\n\n // A donut is single-series by definition; the frame's table still wants the array shape.\n const values = (series[0]?.values ?? []).slice(0, categories.length);\n const segments = categories\n .map((category, index) => ({ category, index, value: values[index] ?? 0 }))\n // Zero and missing readings are dropped rather than drawn: a zero-width arc is invisible\n // anyway, and it would still consume a colour slot and a legend row.\n .filter((segment) => segment.value > 0);\n\n const total = segments.reduce((sum, segment) => sum + segment.value, 0);\n const hasData = segments.length > 0 && total > 0;\n\n const size = height;\n const radius = (size - thickness) / 2;\n const circumference = 2 * Math.PI * radius;\n const gapLength = (SEGMENT_GAP_DEGREES / 360) * circumference;\n\n const legend: ChartLegendItem[] = segments.map((segment) => ({\n key: segment.category,\n label: segment.category,\n color: colorForSegment(segment.index),\n }));\n\n const hovered = hoveredIndex == null\n ? null\n : segments.find((segment) => segment.index === hoveredIndex) ?? null;\n\n let arcStart = 0;\n\n return (\n <ChartFrame\n label={label} title={title} description={description} categories={categories}\n series={series} formatValue={formatValue} legend={legend}\n showDataTable={showDataTable} className={className} style={style}\n >\n {!hasData ? (\n <div className=\"pire-chart-empty\">{emptyState ?? msg.chartEmpty}</div>\n ) : (\n <div className=\"pire-chart-donut\" style={{ height: size }}>\n {/* Fixed square rather than fluid: a ring scales uniformly, so there is nothing to\n gain from stretching it, and the centre figure stays at its real type size. */}\n <svg width={size} height={size} aria-hidden=\"true\" focusable=\"false\"\n onMouseLeave={() => setHoveredIndex(null)}>\n {/* -90° so the first segment starts at twelve o'clock, where a reader looks first. */}\n <g transform={`rotate(-90 ${size / 2} ${size / 2})`}>\n {segments.map((segment) => {\n const arcLength = (segment.value / total) * circumference;\n const offset = arcStart;\n arcStart += arcLength;\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: pointer-only enhancement inside an aria-hidden plot — the arcs carry nothing the data table does not, so there is nothing here for a keyboard to reach.\n <circle\n key={segment.category}\n className=\"pire-chart-arc\"\n cx={size / 2} cy={size / 2} r={radius}\n stroke={colorForSegment(segment.index)}\n strokeWidth={thickness}\n // The gap is taken off the arc rather than added between arcs, so the\n // segments still sum to the full circle.\n strokeDasharray={`${Math.max(0, arcLength - gapLength)} ${circumference}`}\n strokeDashoffset={-offset}\n data-hovered={hoveredIndex === segment.index ? 'true' : undefined}\n onMouseEnter={() => setHoveredIndex(segment.index)}\n />\n );\n })}\n </g>\n </svg>\n\n {/* HTML rather than SVG <text>: it inherits the type tokens and wraps on its own. */}\n <div className=\"pire-chart-donut-center\" style={{ width: size - thickness * 2 - 8 }}>\n <span className=\"pire-chart-donut-value\">\n {hovered ? formatValue(hovered.value) : centerLabel ?? formatValue(total)}\n </span>\n <span className=\"pire-chart-donut-caption\">\n {hovered ? hovered.category : centerCaption}\n </span>\n </div>\n </div>\n )}\n </ChartFrame>\n );\n}\n\n/** Colour follows the segment here, not the series — see the component note. */\nfunction colorForSegment(index: number): string {\n return index < VIZ_SLOT_COUNT ? `var(--viz-${index + 1})` : 'var(--viz-other)';\n}\n","import type * as React from 'react';\nimport { Button as AriaButton } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { cx } from '../utils/cx';\n\nexport interface LinkListItem {\n id: string;\n /** Technical key shown in mono — order number, material number. */\n key?: React.ReactNode;\n /** Secondary description, truncated. */\n text?: React.ReactNode;\n icon?: string;\n trailing?: React.ReactNode;\n}\n\nexport interface LinkListProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n items: LinkListItem[];\n onSelect?: (id: string) => void;\n /**\n * Which slot gets the primary treatment. `'key'` (the default) sets `key` in mono and `text`\n * in secondary — right for \"OC-2026-000004 · Alfa S.A.\", where the code is what you scan.\n *\n * Use `'text'` when the name is what you scan and the code is the qualifier — a supplier or\n * customer list. It swaps the two treatments only; the slots keep their meanings, so `key`\n * stays the technical key and sorting or copying it still works.\n */\n emphasis?: 'key' | 'text';\n /** Names the list for assistive tech, e.g. \"Recently viewed orders\". */\n 'aria-label': string;\n}\n\n/** Compact list of records that navigate somewhere: recently viewed, related documents, shortcuts. */\nexport function LinkList({ items, onSelect, emphasis = 'key', className, ...rest }: LinkListProps) {\n return (\n <div className={cx('pire-linklist', className)} role=\"list\" data-emphasis={emphasis} {...rest}>\n {/* `role=\"list\"` requires children with `role=\"listitem\"`, and a button is not one: without\n this wrapper a screen reader announces a list containing nothing. The wrapper is a real\n flex box rather than `display: contents`, which has a history of dropping elements from\n the accessibility tree and would undo the fix it appears to make. */}\n {items.map((item) => {\n const keySlot = item.key ? <span className=\"pire-linklist-key\">{item.key}</span> : null;\n const textSlot = item.text ? <span className=\"pire-linklist-text\">{item.text}</span> : null;\n // Reordered here rather than with CSS `order`, so what a screen reader reads matches what\n // is on screen. A visual-only swap would leave the two disagreeing (WCAG 1.3.2), and the\n // whole row is one button, so there is no focus order to preserve by keeping the markup\n // fixed. The `emphasis` attribute on the root still drives the typography.\n const [first, second] = emphasis === 'text' ? [textSlot, keySlot] : [keySlot, textSlot];\n return (\n <div key={item.id} role=\"listitem\" className=\"pire-linklist-row\">\n <AriaButton className=\"pire-linklist-item\" onPress={() => onSelect?.(item.id)}>\n {item.icon ? <Icon name={item.icon} size={16} style={{ color: 'var(--text-secondary)' }} /> : null}\n {first}\n {second}\n {item.trailing}\n </AriaButton>\n </div>\n );\n })}\n </div>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface PageBandProps extends React.HTMLAttributes<HTMLDivElement> {\n /** `card` for a header band, `page` for a filter band or the body behind the content. */\n surface?: 'card' | 'page';\n /** `false` when the band below continues the same block and a rule would cut it in two. */\n hasBorder?: boolean;\n children?: React.ReactNode;\n}\n\n/**\n * The full-bleed horizontal band an ERP screen is built from: header, filters, body.\n *\n * Holds a `PageHeader`, `ObjectHeader`, `FilterBar` or edge-to-edge `Tabs`, supplying the page\n * gutter and the surface those components deliberately leave to their container.\n */\nexport function PageBand({\n surface = 'card', hasBorder = true, children, className, ...rest\n}: PageBandProps) {\n return (\n <div\n className={cx('pire-pageband', className)}\n data-surface={surface}\n data-border={hasBorder ? 'true' : undefined}\n {...rest}\n >\n {children}\n </div>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface PageHeaderProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {\n title: React.ReactNode;\n /** One line of context: scope, plant, data timestamp. */\n subtitle?: React.ReactNode;\n actions?: React.ReactNode;\n}\n\n/** Heading block for pages that are not a single object — launchpads, settings, reports.\n * Object pages use ObjectHeader instead. */\nexport function PageHeader({ title, subtitle, actions, className, ...rest }: PageHeaderProps) {\n return (\n <header className={cx('pire-pageheader', className)} {...rest}>\n <div style={{ minWidth: 0 }}>\n <h1 className=\"pire-pageheader-title\">{title}</h1>\n {subtitle ? <p className=\"pire-pageheader-sub\">{subtitle}</p> : null}\n </div>\n {actions ? <div className=\"pire-pageheader-actions\">{actions}</div> : null}\n </header>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface SectionHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Uppercase micro-caps eyebrow — the space or group name. */\n title: React.ReactNode;\n /** Count or qualifier shown beside the title. */\n meta?: React.ReactNode;\n /** Usually one tertiary Button: \"Open space\", \"See all\". */\n actions?: React.ReactNode;\n}\n\n/** Divides a long page into named bands. Pairs with a KPI row or a card grid below it. */\nexport function SectionHeader({ title, meta, actions, className, ...rest }: SectionHeaderProps) {\n return (\n <div className={cx('pire-sectionhead', className)} {...rest}>\n <span className=\"pire-eyebrow\">{title}</span>\n {meta ? <span style={{ font: 'var(--type-caption)', color: 'var(--text-tertiary)' }}>{meta}</span> : null}\n {actions ? <div className=\"pire-sectionhead-actions\">{actions}</div> : null}\n </div>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface SelectionBarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Number of selected records. The bar renders nothing at 0. */\n count: number;\n /** Noun for the records, singular. Default \"record\". */\n noun?: string;\n /** What happens on commit — mass posting caveats belong here, not in a toast. */\n children?: React.ReactNode;\n /** Buttons, size=\"sm\". Destructive last. */\n actions?: React.ReactNode;\n}\n\n/** Appears above a table once rows are selected and states exactly how many.\n * The count is announced, so keyboard users know a selection changed. */\nexport function SelectionBar({ count, noun = 'record', children, actions, className, ...rest }: SelectionBarProps) {\n if (!count) return null;\n return (\n <div className={cx('pire-selectionbar', className)} role=\"status\" aria-live=\"polite\" {...rest}>\n <span className=\"pire-selectionbar-count\">\n {count.toLocaleString()} {noun}{count === 1 ? '' : 's'} selected\n </span>\n {children ? <span style={{ color: 'var(--text-secondary)', font: 'var(--type-caption)' }}>{children}</span> : null}\n {actions ? <div className=\"pire-selectionbar-actions\">{actions}</div> : null}\n </div>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface FooterBarProps extends React.HTMLAttributes<HTMLElement> {\n /** Left-hand status: validation summary, draft saved at, total. */\n note?: React.ReactNode;\n /** Commit actions. Cancel first, primary or danger last. */\n actions?: React.ReactNode;\n}\n\n/** Sticky commit bar for create and edit screens: the page scrolls, the decision stays visible.\n * Give the scrolling container bottom padding equal to the bar height. */\nexport function FooterBar({ note, actions, children, className, ...rest }: FooterBarProps) {\n return (\n <footer className={cx('pire-footerbar', className)} {...rest}>\n {note ? <span className=\"pire-footerbar-note\">{note}</span> : null}\n {children}\n {actions ? <div className=\"pire-footerbar-actions\">{actions}</div> : null}\n </footer>\n );\n}\n","import type * as React from 'react';\nimport { Button } from '../core/Button';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface SplitPaneProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** The narrow column: a list of records, kept in view while one of them is read. */\n list: React.ReactNode;\n /** The wide column. Leave it out when nothing is selected — `emptyDetail` fills the space. */\n detail?: React.ReactNode;\n /** Width of the list column. A number is pixels. */\n listWidth?: number | string;\n /** Names the list region for assistive tech. Both panes are landmarks, so both want a name. */\n listLabel?: string;\n detailLabel?: string;\n /** Shown in place of the detail column when there is no `detail`. */\n emptyDetail?: React.ReactNode;\n /**\n * Returns to the list on a narrow container, where only one column fits at a time.\n *\n * Without it a narrow layout can reach the detail and never leave it, so pass it whenever the\n * pane can be seen on a small screen.\n */\n onBack?: () => void;\n backLabel?: string;\n}\n\n/**\n * Two columns that live side by side and scroll independently — a list on the left, the selected\n * record on the right.\n *\n * Distinct from `SidePanel`, which is an overlay: this one is a layout, the panes coexist, and\n * nothing is dismissed to get back to the list.\n *\n * It fills the box it is given and owns the scrolling inside it, so give it a parent with a\n * definite height and no padding of its own. A wrapper that scrolls as well produces two nested\n * scrollbars, which is the usual way this pattern goes wrong.\n */\nexport function SplitPane({ list, detail, listWidth = '24rem', listLabel, detailLabel,\n emptyDetail, onBack, backLabel, className, style, ...rest }: SplitPaneProps) {\n const msg = usePireMessages();\n const width = typeof listWidth === 'number' ? `${listWidth}px` : listWidth;\n\n return (\n <div className={cx('pire-split', className)} data-has-detail={detail != null ? 'true' : undefined}\n style={{ ['--pire-split-list-w' as string]: width, ...style } as React.CSSProperties} {...rest}>\n <section className=\"pire-split-list\" aria-label={listLabel ?? msg.splitPaneList}>{list}</section>\n <section className=\"pire-split-detail\" aria-label={detailLabel ?? msg.splitPaneDetail}>\n {/* Rendered always and hidden by the container query on wide layouts, rather than switched\n on a measured width. Nothing here depends on JavaScript knowing the size. */}\n {onBack ? (\n <div className=\"pire-split-back\">\n <Button variant=\"tertiary\" size=\"sm\" icon=\"arrow-left\" onPress={onBack}>\n {backLabel ?? msg.splitPaneBack}\n </Button>\n </div>\n ) : null}\n {detail ?? <div className=\"pire-split-empty\">{emptyDetail}</div>}\n </section>\n </div>\n );\n}\n","import type * as React from 'react';\nimport { Dialog } from '../feedback/Dialog';\nimport { InlineMessage } from '../feedback/InlineMessage';\nimport { Button } from '../core/Button';\n\nexport interface ConfirmDialogProps {\n isOpen?: boolean;\n /** Question form, sentence case: \"Release purchase order?\" */\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n /** What will happen — rendered as a warning, or an error when tone is danger. */\n consequence?: React.ReactNode;\n /** Extra detail or an opt-in Checkbox. */\n children?: React.ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n /** danger = irreversible: red commit button, error-toned consequence. */\n tone?: 'primary' | 'danger';\n /** Disables both buttons and shows \"Working…\" on the commit button. */\n isBusy?: boolean;\n onConfirm?: () => void;\n onCancel?: () => void;\n}\n\n/** Interrupts one irreversible action. Never use for information — that is an InlineMessage. */\nexport function ConfirmDialog({ isOpen, title, subtitle, consequence, children, confirmLabel = 'Confirm',\n cancelLabel = 'Cancel', tone = 'primary', isBusy, onConfirm, onCancel }: ConfirmDialogProps) {\n return (\n <Dialog isOpen={isOpen} size=\"sm\" title={title} subtitle={subtitle} onClose={onCancel}\n isDismissable={!isBusy} showClose={false}\n footer={\n <>\n <Button variant=\"tertiary\" isDisabled={isBusy} onPress={onCancel}>{cancelLabel}</Button>\n <Button variant={tone === 'danger' ? 'danger' : 'primary'} isDisabled={isBusy} onPress={onConfirm}>\n {isBusy ? 'Working…' : confirmLabel}\n </Button>\n </>\n }>\n {consequence ? (\n <InlineMessage kind={tone === 'danger' ? 'error' : 'warning'} style={{ marginBottom: children ? 'var(--sp-3)' : 0 }}>\n {consequence}\n </InlineMessage>\n ) : null}\n {children}\n </Dialog>\n );\n}\n","import * as React from 'react';\nimport {\n Autocomplete, ModalOverlay, Modal, Dialog as AriaDialog, SearchField, Input as AriaInput,\n Menu as AriaMenu, MenuSection as AriaMenuSection, Header, useFilter,\n} from 'react-aria-components';\nimport type { Key } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { Kbd } from '../core/Kbd';\nimport { MenuItem } from '../navigation/Menu';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface CommandPaletteItem {\n /** Passed back to `onAction`. Must be unique across every group in the palette. */\n id: string;\n label: string;\n /** Second line — what the command does, or what identifies the record. */\n description?: string;\n /** Icon slug, same vocabulary as `Button.icon`. */\n icon?: string;\n /**\n * Painted on the right as key caps. Registers nothing; bind the key yourself.\n *\n * A string is split on `+` and spaces; pass an array when it cannot be — `['⌘', 'N']`.\n */\n shortcut?: string | string[];\n /**\n * Extra terms this item should match on, beyond its label. The place to put synonyms, the\n * English name of a Spanish command, and the abbreviations people actually type — a palette\n * that only matches the visible label makes users guess the wording.\n *\n * Matched against, never announced: the accessible name stays the label alone.\n */\n keywords?: string;\n isDisabled?: boolean;\n}\n\nexport interface CommandPaletteGroup {\n id: string;\n /** Heading above the group. Omit for a single unlabelled list. */\n label?: string;\n items: CommandPaletteItem[];\n}\n\nexport interface CommandPaletteProps {\n isOpen?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n /**\n * Static groups — navigation targets and actions. Filtered locally as the user types, so these\n * are the whole list, not a page of it.\n */\n groups?: CommandPaletteGroup[];\n /**\n * Server-backed results, appended after the static groups and **never filtered locally**: the\n * server already ranked them, and a local \"contains\" pass would drop fuzzy and synonym matches.\n * Feed it from `onSearch`.\n */\n resultsGroup?: CommandPaletteGroup;\n /** The chosen item's `id`. The palette does not close itself — decide in the handler. */\n onAction?: (id: string) => void;\n /**\n * The query on every keystroke. **Debounce before calling the server.**\n *\n * Only needed for `resultsGroup`; the static groups filter without it.\n */\n onSearch?: (query: string) => void;\n /** Shows a status row rather than an empty list while a request is in flight. */\n isLoading?: boolean;\n /** Overrides the dictionary's `commandPaletteEmpty`. */\n emptyLabel?: React.ReactNode;\n /** Overrides the dictionary's `commandPaletteLoading`. */\n loadingLabel?: string;\n placeholder?: string;\n /**\n * Replaces the default key hints along the bottom. Use it for a product-specific affordance —\n * a scope switch, a \"search everything\" toggle.\n */\n footer?: React.ReactNode;\n /** Drops the footer entirely. The hints are worth their space until an app teaches the keys elsewhere. */\n showFooter?: boolean;\n /** Names the dialog for assistive tech. Defaults to the dictionary's `commandPaletteLabel`. */\n 'aria-label'?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * The collection key of the section holding `resultsGroup`. Fixed rather than taken from the\n * consumer's group id, because the filter below has to recognise that section without trusting\n * user input.\n *\n * Deliberately not spelled like a `pire-*` class: it is a collection key, and `styles.css.test.ts`\n * reads `pire-*` string literals in component source as class references.\n */\nconst RESULTS_SECTION_KEY = '__pire_results__';\n\n/** Everything an item should match on. Kept out of `textValue` so screen readers announce the\n * label alone rather than the label plus a bag of synonyms. */\nconst searchableText = (item: CommandPaletteItem) =>\n [item.label, item.description, item.keywords].filter(Boolean).join(' ');\n\n/**\n * Application-wide search over commands, navigation targets and records — the Cmd/Ctrl+K surface.\n *\n * Behaviour is React Aria's `Autocomplete`: focus stays in the input while the arrow keys move\n * `aria-activedescendant` through the list, so typing and choosing never fight each other. Pire\n * supplies the overlay, the grouping and the empty/loading states.\n *\n * Open state is always the product's. Bind the shortcut with {@link useCommandPaletteShortcut},\n * or with anything else — an ERP may already own that key.\n */\nexport function CommandPalette({\n isOpen, onOpenChange, groups = [], resultsGroup, onAction, onSearch, isLoading,\n emptyLabel, loadingLabel, placeholder, footer, showFooter = true,\n 'aria-label': ariaLabel, className, style,\n}: CommandPaletteProps) {\n const msg = usePireMessages();\n const [query, setQuery] = React.useState('');\n // `contains` with base sensitivity so \"periodo\" finds \"Período\" and \"factura\" finds \"Factura\".\n // Accent- and case-sensitive matching makes a palette feel broken in Spanish.\n const { contains } = useFilter({ sensitivity: 'base' });\n\n // Reset on open, not on close: clearing on the way out is visible during the exit transition.\n React.useEffect(() => { if (isOpen) setQuery(''); }, [isOpen]);\n\n const searchableById = React.useMemo(() => {\n const byId = new Map<string, string>();\n for (const group of groups) for (const item of group.items) byId.set(item.id, searchableText(item));\n return byId;\n }, [groups]);\n\n /**\n * The node is typed structurally rather than as React Aria's `Node<T>`, which lives in\n * `@react-types/shared` — a transitive package Pire does not depend on and should not start\n * depending on for one type. A wider parameter type is safe here: the callback is only ever\n * called with a full node.\n */\n const filter = React.useCallback((textValue: string, inputValue: string,\n node: { key: Key; parentKey?: Key | null }) => {\n // The server's own ranking survives only if nothing filters it again.\n if (node.parentKey === RESULTS_SECTION_KEY) return true;\n return contains(searchableById.get(String(node.key)) ?? textValue, inputValue);\n }, [contains, searchableById]);\n\n const handleInputChange = (value: string) => { setQuery(value); onSearch?.(value); };\n\n const sections = [...groups, ...(resultsGroup ? [{ ...resultsGroup, id: RESULTS_SECTION_KEY }] : [])];\n const status = isLoading ? (loadingLabel ?? msg.commandPaletteLoading) : (emptyLabel ?? msg.commandPaletteEmpty);\n\n return (\n <ModalOverlay className=\"pire-cp-overlay\" isOpen={isOpen} isDismissable\n onOpenChange={(open) => { if (!open) onOpenChange?.(false); }}>\n <Modal className={cx('pire-cp-modal', className)} style={style}>\n <AriaDialog className=\"pire-cp-dialog\" aria-label={ariaLabel ?? msg.commandPaletteLabel}>\n <Autocomplete filter={filter} inputValue={query} onInputChange={handleInputChange}>\n <SearchField className=\"pire-cp-search\" aria-label={msg.commandPaletteSearchLabel}>\n <Icon name=\"search\" size={18} className=\"pire-cp-search-icon\" />\n {/* autoFocus is correct here specifically: the palette exists to be typed into, and\n it is a modal the user just chose to open, so taking the caret is what they asked\n for rather than a focus steal. */}\n <AriaInput className=\"pire-cp-input\" autoFocus\n placeholder={placeholder ?? msg.commandPalettePlaceholder} />\n </SearchField>\n {isLoading ? (\n <div className=\"pire-cp-loading\" role=\"status\" aria-live=\"polite\">\n {loadingLabel ?? msg.commandPaletteLoading}\n </div>\n ) : null}\n <AriaMenu className=\"pire-cp-list\" onAction={(key) => onAction?.(String(key))}\n renderEmptyState={() => <div className=\"pire-cp-status\">{status}</div>}>\n {sections.map((section) => (\n <AriaMenuSection key={section.id} id={section.id} className=\"pire-cp-section\">\n {section.label ? <Header className=\"pire-cp-section-title\">{section.label}</Header> : null}\n {section.items.map((item) => (\n <MenuItem key={item.id} id={item.id} textValue={item.label} icon={item.icon}\n description={item.description} shortcut={item.shortcut} isDisabled={item.isDisabled}>\n {item.label}\n </MenuItem>\n ))}\n </AriaMenuSection>\n ))}\n </AriaMenu>\n </Autocomplete>\n {showFooter ? (\n // aria-hidden: the glyphs are a sighted affordance for discovering the keys. A screen\n // reader already announces the listbox semantics that make those keys work, so reading\n // \"up arrow down arrow navigate\" out loud is noise on every open.\n <div className=\"pire-cp-foot\" aria-hidden=\"true\">\n {footer ?? (\n <>\n <span className=\"pire-cp-hint\"><Kbd>↑</Kbd><Kbd>↓</Kbd>{msg.commandPaletteHintNavigate}</span>\n <span className=\"pire-cp-hint\"><Kbd>↵</Kbd>{msg.commandPaletteHintSelect}</span>\n <span className=\"pire-cp-hint\"><Kbd>esc</Kbd>{msg.commandPaletteHintClose}</span>\n </>\n )}\n </div>\n ) : null}\n </AriaDialog>\n </Modal>\n </ModalOverlay>\n );\n}\n\nexport interface CommandPaletteShortcutOptions {\n /** The key pressed with Cmd (macOS) or Ctrl. Single character, matched case-insensitively. */\n key?: string;\n /** Stop listening — while a modal owns the keyboard, for instance. */\n isDisabled?: boolean;\n}\n\n/**\n * Binds Cmd+K / Ctrl+K to open the palette.\n *\n * Opt-in rather than built into {@link CommandPalette}, because a global key listener is the\n * component's to grant and the app's to own: an ERP may already bind that combination, and a\n * component that claims it on mount takes it silently.\n */\nexport function useCommandPaletteShortcut(\n onTrigger: () => void, { key = 'k', isDisabled }: CommandPaletteShortcutOptions = {},\n): void {\n const handler = React.useRef(onTrigger);\n handler.current = onTrigger;\n\n React.useEffect(() => {\n if (isDisabled) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (!(event.metaKey || event.ctrlKey) || event.altKey) return;\n if (event.key.toLowerCase() !== key.toLowerCase()) return;\n // Chrome and Firefox both use Ctrl/Cmd+K for the address bar; without this the palette\n // opens behind a focused omnibox.\n event.preventDefault();\n handler.current();\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [key, isDisabled]);\n}\n","import type * as React from 'react';\nimport { ModalOverlay, Modal, Dialog as AriaDialog, Heading } from 'react-aria-components';\nimport { IconButton } from '../core/IconButton';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface SidePanelProps {\n isOpen?: boolean;\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n /** Panel width in px. 400 default; 560 for editable forms. */\n width?: number;\n children?: React.ReactNode;\n footer?: React.ReactNode;\n onClose?: () => void;\n className?: string;\n}\n\n/** Right-hand overlay for details and edits that must keep the list in view. */\nexport function SidePanel({ isOpen, title, subtitle, width = 400, children, footer, onClose, className }: SidePanelProps) {\n const msg = usePireMessages();\n return (\n <ModalOverlay className=\"pire-sidepanel-overlay\" isOpen={isOpen} isDismissable\n onOpenChange={(o) => { if (!o) onClose?.(); }}>\n <Modal className={cx('pire-sidepanel', className)} style={{ width }}>\n <AriaDialog className=\"pire-dialog\" style={{ height: '100%' }}>\n <header className=\"pire-dialog-head\">\n <div style={{ flex: 1, minWidth: 0 }}>\n <Heading slot=\"title\" className=\"pire-dialog-title\">{title}</Heading>\n {subtitle ? <p className=\"pire-dialog-sub\" style={{ margin: 0 }}>{subtitle}</p> : null}\n </div>\n <IconButton icon=\"x\" label={msg.sidePanelClose} size=\"sm\" onPress={onClose} />\n </header>\n <div className=\"pire-dialog-body\" style={{ flex: 1 }}>{children}</div>\n {footer ? <footer className=\"pire-dialog-foot\">{footer}</footer> : null}\n </AriaDialog>\n </Modal>\n </ModalOverlay>\n );\n}\n","import type * as React from 'react';\nimport { Icon } from '../core/Icon';\nimport { cx } from '../utils/cx';\n\nexport interface EmptyStateProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Icon slug, 24px. Match the domain: \"search\" for no results, \"file-text\" for no records. */\n icon?: string;\n /** Headline. Rich content, not the DOM title/tooltip attribute. */\n title?: React.ReactNode;\n /** The single action that resolves the emptiness. */\n action?: React.ReactNode;\n /** Tighter padding, for inside cards and panels. */\n compact?: boolean;\n}\n\n/** Says what is missing, why, and the one thing to do about it. */\nexport function EmptyState({ icon = 'file-text', title, action, compact, children, className, ...rest }: EmptyStateProps) {\n return (\n <div className={cx('pire-empty', className)} data-compact={compact ? 'true' : undefined} {...rest}>\n <Icon name={icon} size={24} className=\"pire-empty-icon\" />\n {title ? <p className=\"pire-empty-title\" style={{ margin: 0 }}>{title}</p> : null}\n {children ? <p className=\"pire-empty-body\" style={{ margin: 0 }}>{children}</p> : null}\n {action}\n </div>\n );\n}\n","import * as React from 'react';\nimport { DropZone, FileTrigger, isFileDropItem } from 'react-aria-components';\nimport { Button } from '../core/Button';\nimport { Icon } from '../core/Icon';\nimport { IconButton } from '../core/IconButton';\nimport { ProgressBar } from '../feedback/ProgressBar';\nimport { formatFileSize, screenFiles, type FileUploadProps, type PireFile } from '../forms/FileUpload';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface FileDropZoneProps extends Omit<FileUploadProps, 'chooseLabel'> {\n /** Instruction inside the zone. Overrides the dictionary's `fileDropZonePrompt`. */\n promptLabel?: React.ReactNode;\n /** `compact` for an import modal, where the zone competes with a table for height. */\n height?: 'compact' | 'regular';\n}\n\nconst isImage = (file: File) => file.type.startsWith('image/');\n\n/**\n * The large drop surface, for import screens and anywhere a file is the point of the page.\n *\n * Built on React Aria's `DropZone`, so it is a real drop target for keyboard and assistive tech —\n * not a div with `onDragOver`. It still contains a `FileTrigger`, because drag-and-drop alone is\n * not an accessible way to supply a file.\n */\nexport function FileDropZone({\n label, value, defaultValue, onChange, acceptedFileTypes, allowsMultiple, maxSize, onError,\n showPreview = true, uploadProgress, promptLabel, height = 'regular', description, errorMessage,\n isInvalid, isDisabled, isReadOnly, isRequired, fullWidth = true, className, style,\n}: FileDropZoneProps) {\n const msg = usePireMessages();\n const [uncontrolled, setUncontrolled] = React.useState<PireFile[]>(defaultValue ?? []);\n const files = value ?? uncontrolled;\n\n const created = React.useRef<string[]>([]);\n React.useEffect(() => () => {\n for (const url of created.current) URL.revokeObjectURL(url);\n }, []);\n\n const commit = (next: PireFile[]) => {\n if (value === undefined) setUncontrolled(next);\n onChange?.(next);\n };\n\n const accept = (picked: File[]) => {\n if (isDisabled || isReadOnly || !picked.length) return;\n const { accepted, rejected } = screenFiles(picked, { maxSize, acceptedFileTypes });\n if (rejected.length) onError?.(rejected);\n if (!accepted.length) return;\n\n const wrapped = accepted.map((file) => {\n const previewUrl = showPreview && isImage(file) ? URL.createObjectURL(file) : undefined;\n if (previewUrl) created.current.push(previewUrl);\n return { file, previewUrl };\n });\n commit(allowsMultiple ? [...files, ...wrapped] : wrapped.slice(0, 1));\n };\n\n const remove = (target: File) => commit(files.filter((f) => f.file !== target));\n\n return (\n <div className={cx('pire-field', className)} style={style} data-full-width={String(fullWidth)}>\n {label ? (\n <span className=\"pire-field-label\">\n {label}{isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </span>\n ) : null}\n\n <DropZone\n className=\"pire-dropzone\"\n data-height={height}\n isDisabled={isDisabled || isReadOnly}\n onDrop={async (e) => {\n // Only file items: a drag can also carry text or a directory, and both would otherwise\n // resolve to nothing halfway through this list.\n const dropped = await Promise.all(\n e.items.filter(isFileDropItem).map((item) => item.getFile()),\n );\n accept(dropped);\n }}\n >\n <Icon name=\"download\" size={24} className=\"pire-dropzone-icon\" />\n <span className=\"pire-dropzone-prompt\">{promptLabel ?? msg.fileDropZonePrompt}</span>\n <FileTrigger acceptedFileTypes={acceptedFileTypes as string[] | undefined}\n allowsMultiple={allowsMultiple} onSelect={(list) => accept(list ? [...list] : [])}>\n <Button variant=\"secondary\" isDisabled={isDisabled || isReadOnly}>\n {msg.fileUploadChoose}\n </Button>\n </FileTrigger>\n </DropZone>\n\n {files.length ? (\n <ul className=\"pire-fileupload-list\">\n {files.map(({ file, previewUrl }) => (\n <li key={`${file.name}-${file.size}-${file.lastModified}`} className=\"pire-fileupload-item\">\n {previewUrl\n ? <img className=\"pire-fileupload-thumb\" src={previewUrl} alt=\"\" />\n : <Icon name=\"file-text\" size={16} className=\"pire-fileupload-icon\" />}\n <span className=\"pire-fileupload-name\">{file.name}</span>\n <span className=\"pire-fileupload-size\">{formatFileSize(file.size)}</span>\n {isDisabled || isReadOnly ? null : (\n <IconButton icon=\"x\" size=\"sm\"\n label={msg.fileUploadRemoveNamed.replace('{name}', file.name)}\n onPress={() => remove(file)} />\n )}\n </li>\n ))}\n </ul>\n ) : null}\n\n {uploadProgress != null ? (\n <ProgressBar value={uploadProgress} label={msg.fileUploadUploading} />\n ) : null}\n\n {description ? <span className=\"pire-field-hint\">{description}</span> : null}\n {isInvalid && errorMessage ? <span className=\"pire-field-error\">{errorMessage}</span> : null}\n </div>\n );\n}\n","/* @orianatech/pire — Pire Design System components.\n Styles are a separate import so they can be loaded once, ahead of the bundle:\n import '@orianatech/pire/styles.css'; */\n\nexport { Icon, configureIcons, type IconProps, type IconPack, type IconConfig } from './components/core/Icon';\nexport { Button, type ButtonProps } from './components/core/Button';\nexport { IconButton, type IconButtonProps } from './components/core/IconButton';\nexport { Badge, type BadgeProps, type BadgeStatus } from './components/core/Badge';\nexport { Tag, type TagProps } from './components/core/Tag';\nexport { Card, type CardProps } from './components/core/Card';\nexport { Avatar, type AvatarProps } from './components/core/Avatar';\nexport { SegmentedControl, type SegmentedControlProps, type SegmentOption } from './components/core/SegmentedControl';\nexport { Text, Strong, type TextProps, type StrongProps, type TextColor, type TextSize } from './components/core/Text';\nexport { Heading, type HeadingProps } from './components/core/Heading';\nexport { Link, type LinkProps } from './components/core/Link';\nexport { Separator, type SeparatorProps } from './components/core/Separator';\nexport { Kbd, type KbdProps } from './components/core/Kbd';\nexport { ICON_NAMES } from './components/core/icon-map';\n\nexport { FormField, type FormFieldProps } from './components/forms/FormField';\nexport { Input, type InputProps } from './components/forms/Input';\nexport { TextArea, type TextAreaProps } from './components/forms/TextArea';\nexport { Select, type SelectProps, type SelectOption } from './components/forms/Select';\nexport { Checkbox, type CheckboxProps } from './components/forms/Checkbox';\nexport { RadioGroup, Radio, type RadioGroupProps, type RadioProps } from './components/forms/Radio';\nexport { Switch, type SwitchProps } from './components/forms/Switch';\nexport { ComboBox, type ComboBoxProps, type ComboBoxOption } from './components/forms/ComboBox';\nexport { MultiComboBox, type MultiComboBoxProps } from './components/forms/MultiComboBox';\nexport { NumberField, type NumberFieldProps } from './components/forms/NumberField';\nexport { DatePicker, type DatePickerProps } from './components/forms/DatePicker';\nexport { DateRangePicker, rangeLengthInDays, type DateRangePickerProps, type DateRange,\n type DateRangePreset } from './components/forms/DateRangePicker';\nexport { ValueHelpField, type ValueHelpFieldProps } from './components/forms/ValueHelpField';\nexport { FileUpload, formatFileSize, type FileUploadProps, type PireFile,\n type FileRejection } from './components/forms/FileUpload';\n\nexport { ShellBar, type ShellBarProps } from './components/navigation/ShellBar';\nexport { SideNav, type SideNavProps, type SideNavItem, type SideNavChildItem,\n type SideNavGroup } from './components/navigation/SideNav';\nexport { Tabs, type TabsProps, type TabItem } from './components/navigation/Tabs';\nexport { Breadcrumb, type BreadcrumbProps, type BreadcrumbItem } from './components/navigation/Breadcrumb';\nexport { Pagination, type PaginationProps } from './components/navigation/Pagination';\nexport { Menu, MenuItem, MenuSection, MenuSeparator, type MenuProps, type MenuItemProps,\n type MenuSectionProps, type MenuSeparatorProps } from './components/navigation/Menu';\n\nexport { Dialog, DialogTitle, DialogDescription, DialogBody, DialogActions,\n type DialogProps, type DialogSlotProps } from './components/feedback/Dialog';\nexport { InlineMessage, type InlineMessageProps, type MessageKind } from './components/feedback/InlineMessage';\nexport { ProgressBar, type ProgressBarProps } from './components/feedback/ProgressBar';\nexport { Tooltip, type TooltipProps } from './components/feedback/Tooltip';\nexport { Toast, ToastProvider, useToast, type ToastProps, type ToastItem } from './components/feedback/Toast';\nexport { Skeleton, SkeletonTableRow, type SkeletonProps, type SkeletonShape, type SkeletonTableRowProps,\n type SkeletonTableColumn } from './components/feedback/Skeleton';\n\nexport { DataTable, type DataTableProps, type DataTableColumn, type DataTableSort,\n type DataTableRowProps } from './components/data/DataTable';\nexport { KpiTile, type KpiTileProps } from './components/data/KpiTile';\nexport { ObjectHeader, type ObjectHeaderProps, type ObjectFact } from './components/data/ObjectHeader';\nexport { FilterBar, type FilterBarProps, type ActiveFilter } from './components/data/FilterBar';\nexport { DescriptionList, type DescriptionListProps, type DescriptionItem } from './components/data/DescriptionList';\nexport { Timeline, type TimelineProps, type TimelineEntry } from './components/data/Timeline';\nexport { BarChart, type BarChartProps } from './components/data/BarChart';\nexport { LineChart, type LineChartProps } from './components/data/LineChart';\nexport { DonutChart, type DonutChartProps } from './components/data/DonutChart';\nexport type { ChartBaseProps, ChartLegendItem } from './components/data/ChartFrame';\nexport { VIZ_SLOT_COUNT, type ChartSeries } from './components/data/chartGeometry';\nexport { LinkList, type LinkListProps, type LinkListItem } from './components/data/LinkList';\n\nexport { PageBand, type PageBandProps } from './components/layout/PageBand';\nexport { PageHeader, type PageHeaderProps } from './components/layout/PageHeader';\nexport { SectionHeader, type SectionHeaderProps } from './components/layout/SectionHeader';\nexport { SelectionBar, type SelectionBarProps } from './components/layout/SelectionBar';\nexport { FooterBar, type FooterBarProps } from './components/layout/FooterBar';\nexport { SplitPane, type SplitPaneProps } from './components/layout/SplitPane';\n\nexport { ConfirmDialog, type ConfirmDialogProps } from './components/patterns/ConfirmDialog';\nexport { ValueHelpDialog, type ValueHelpDialogProps } from './components/patterns/ValueHelpDialog';\nexport { CommandPalette, useCommandPaletteShortcut, type CommandPaletteProps,\n type CommandPaletteItem, type CommandPaletteGroup,\n type CommandPaletteShortcutOptions } from './components/patterns/CommandPalette';\nexport { SidePanel, type SidePanelProps } from './components/patterns/SidePanel';\nexport { EmptyState, type EmptyStateProps } from './components/patterns/EmptyState';\nexport { FileDropZone, type FileDropZoneProps } from './components/patterns/FileDropZone';\n\n/** Re-exported so apps can compose overlays and collections without a second dependency. */\n/* Pire's own strings. React Aria's I18nProvider below localises React Aria's internals; this\n localises Pire's. Install both to fully translate the UI. */\nexport { PireIntlProvider, usePireMessages, type PireIntlProviderProps } from './i18n/PireIntlProvider';\nexport { enMessages, esMessages, type PireMessages } from './i18n/messages';\n\n/* Compose overlays and collections without a second dependency. `RouterProvider` takes the\n app's own `navigate`, so `href` on MenuItem, Link and Breadcrumb routes client-side. */\nexport { DialogTrigger, MenuTrigger, SubmenuTrigger, Popover, RouterProvider, I18nProvider } from 'react-aria-components';\n/* `Focusable` makes any single child focusable by cloning it — no wrapper element, so it never adds\n a tab stop to something that already had one. `Tooltip` applies it for you; this export is for the\n cases Pire does not cover, such as a custom trigger for a Popover or a MenuTrigger. */\nexport { Focusable } from 'react-aria-components';\nexport type { DateValue } from 'react-aria-components';\n"],"mappings":"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","names":["jsx","Button","React","AriaButton","React","jsx","jsxs","jsx","jsxs","IconButton","AriaButton","jsx","jsxs","AriaButton","jsx","jsxs","AriaButton","jsx","jsxs","React","jsx","React","jsx","jsxs","jsx","jsx","jsx","jsxs","jsx","jsx","jsx","jsxs","React","Text","AriaButton","React","jsx","jsx","jsxs","AriaButton","Text","React","TextField","Label","Group","Text","FieldError","jsx","jsxs","TextField","Label","Group","Text","FieldError","Label","AriaButton","Text","FieldError","jsx","jsxs","Label","AriaButton","Text","FieldError","jsx","jsxs","Label","Text","FieldError","jsx","jsxs","Label","Text","FieldError","jsx","jsxs","Label","AriaInput","AriaButton","Group","Popover","ListBox","ListBoxItem","Text","FieldError","jsx","jsxs","norm","Label","Group","AriaInput","AriaButton","Text","FieldError","Popover","ListBox","ListBoxItem","React","AriaComboBox","Label","AriaInput","AriaButton","Group","Popover","ListBox","ListBoxItem","Text","FieldError","jsx","jsxs","norm","AriaComboBox","Label","Group","AriaInput","AriaButton","Text","FieldError","Popover","ListBox","ListBoxItem","Label","AriaInput","Group","AriaButton","Text","FieldError","jsx","jsxs","Label","Group","AriaInput","AriaButton","Text","FieldError","Label","Group","AriaButton","Popover","Heading","Text","FieldError","jsx","jsxs","Label","Group","AriaButton","Text","FieldError","Popover","Heading","Label","Group","DateInput","DateSegment","AriaButton","Popover","AriaDialog","CalendarGrid","CalendarGridHeader","CalendarHeaderCell","CalendarGridBody","CalendarCell","Heading","Text","FieldError","jsx","jsxs","Label","Group","DateInput","DateSegment","AriaButton","Text","FieldError","Popover","AriaDialog","Heading","CalendarGrid","CalendarGridHeader","CalendarHeaderCell","CalendarGridBody","CalendarCell","React","React","React","AriaDialog","Heading","jsx","jsxs","Heading","AriaDialog","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","React","Text","Label","Fragment","jsx","jsxs","Label","jsx","jsxs","Text","AriaButton","Popover","jsx","jsxs","initials","AriaButton","Popover","React","AriaButton","MenuTrigger","Popover","AriaSeparator","jsx","jsxs","AriaSeparator","jsx","jsxs","AriaButton","MenuTrigger","Popover","jsx","jsxs","Link","jsx","jsxs","Link","jsx","jsxs","jsx","jsxs","React","jsx","jsxs","KIND_ICON","AriaButton","Fragment","jsx","jsxs","AriaButton","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","IS_DEV","jsx","jsxs","jsx","jsxs","React","jsx","jsxs","useIsomorphicLayoutEffect","React","jsx","jsxs","AriaButton","jsx","jsxs","AriaButton","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","React","ModalOverlay","Modal","AriaDialog","AriaInput","AriaMenu","AriaMenuSection","Header","Fragment","jsx","jsxs","ModalOverlay","Modal","AriaDialog","AriaInput","AriaMenu","AriaMenuSection","Header","ModalOverlay","Modal","AriaDialog","Heading","jsx","jsxs","ModalOverlay","Modal","AriaDialog","Heading","jsx","jsxs","React","FileTrigger","jsx","jsxs","isImage","FileTrigger","MenuTrigger","Popover","Focusable"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/core/icon-data.generated.ts","../src/components/core/icon-map.ts","../src/components/core/Icon.tsx","../src/components/core/Button.tsx","../src/components/utils/cx.ts","../src/components/core/IconButton.tsx","../src/components/feedback/Tooltip.tsx","../src/components/core/Badge.tsx","../src/components/core/Tag.tsx","../src/components/core/Card.tsx","../src/components/core/Avatar.tsx","../src/components/core/SegmentedControl.tsx","../src/components/core/Text.tsx","../src/components/core/Heading.tsx","../src/components/core/Link.tsx","../src/components/core/Separator.tsx","../src/components/core/Kbd.tsx","../src/components/forms/FormField.tsx","../src/components/forms/Input.tsx","../src/i18n/PireIntlProvider.tsx","../src/i18n/messages.ts","../src/components/forms/TextArea.tsx","../src/components/forms/Select.tsx","../src/components/forms/Checkbox.tsx","../src/components/forms/Radio.tsx","../src/components/forms/Switch.tsx","../src/components/forms/ComboBox.tsx","../src/components/forms/MultiComboBox.tsx","../src/components/forms/NumberField.tsx","../src/components/forms/DatePicker.tsx","../src/components/forms/DateRangePicker.tsx","../src/components/forms/ValueHelpField.tsx","../src/components/patterns/ValueHelpDialog.tsx","../src/components/feedback/Dialog.tsx","../src/components/data/DataTable.tsx","../src/components/feedback/Skeleton.tsx","../src/components/forms/FileUpload.tsx","../src/components/feedback/ProgressBar.tsx","../src/components/navigation/ShellBar.tsx","../src/components/navigation/SideNav.tsx","../src/components/navigation/Menu.tsx","../src/components/navigation/Tabs.tsx","../src/components/navigation/Breadcrumb.tsx","../src/components/navigation/Pagination.tsx","../src/components/feedback/InlineMessage.tsx","../src/components/feedback/Toast.tsx","../src/components/data/KpiTile.tsx","../src/components/data/ObjectHeader.tsx","../src/components/data/FilterBar.tsx","../src/components/data/DescriptionList.tsx","../src/components/data/Timeline.tsx","../src/components/data/chartGeometry.ts","../src/components/data/ChartFrame.tsx","../src/components/data/BarChart.tsx","../src/components/data/LineChart.tsx","../src/components/data/DonutChart.tsx","../src/components/data/LinkList.tsx","../src/components/layout/PageBand.tsx","../src/components/layout/PageHeader.tsx","../src/components/layout/SectionHeader.tsx","../src/components/layout/SelectionBar.tsx","../src/components/layout/FooterBar.tsx","../src/components/layout/SplitPane.tsx","../src/components/patterns/ConfirmDialog.tsx","../src/components/patterns/CommandPalette.tsx","../src/components/patterns/SidePanel.tsx","../src/components/patterns/EmptyState.tsx","../src/components/patterns/FileDropZone.tsx","../src/index.ts"],"sourcesContent":["// GENERATED FILE — do not edit by hand. Run `pnpm icons:generate` (or `pnpm build`).\n// Source: scripts/generate-icon-data.mjs, from @carbon/icons (devDependency) and the CARBON_MAP\n// in ./icon-map.ts. Committed so typecheck, lint, tests and Storybook work on a fresh clone\n// without a build step.\n//\n// Inner markup of each 32x32 Carbon glyph, keyed by Carbon slug. `Icon` drops it into\n// <svg viewBox=\"0 0 32 32\" fill=\"currentColor\">, so paths inherit text colour. Slugs are the\n// Carbon names; call sites use the canonical Lucide names in ./icon-map.ts.\nexport const ICON_MARKUP: Record<string, string> = {\n '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\"/>',\n 'apps': '<path d=\"M8,4V8H4V4Zm2-2H2v8h8Zm8,2V8H14V4Zm2-2H12v8h8Zm8,2V8H24V4Zm2-2H22v8h8ZM8,14v4H4V14Zm2-2H2v8h8Zm8,2v4H14V14Zm2-2H12v8h8Zm8,2v4H24V14Zm2-2H22v8h8ZM8,24v4H4V24Zm2-2H2v8h8Zm8,2v4H14V24Zm2-2H12v8h8Zm8,2v4H24V24Zm2-2H22v8h8Z\"/>',\n 'archive': '<path d=\"M14 19H18V21H14z\"/><path d=\"M6,2V28a2,2,0,0,0,2,2H24a2,2,0,0,0,2-2V2ZM24,28H8V16H24Zm0-14H8V10H24ZM8,8V4H24V8Z\"/>',\n '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\"/>',\n 'arrow--left': '<path d=\"M14 26 15.41 24.59 7.83 17 28 17 28 15 7.83 15 15.41 7.41 14 6 4 16 14 26z\"/>',\n '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\"/>',\n '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\"/>',\n '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\"/>',\n 'asterisk': '<path d=\"M28.316 13.949 27.684 12.051 17 15.612 17 4 15 4 15 15.612 4.316 12.051 3.684 13.949 14.368 17.51 7.2 27.066 8.8 28.267 16 18.667 23.2 28.267 24.8 27.066 17.632 17.51 28.316 13.949z\"/>',\n '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\tC3.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\tc0,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\tc-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\"/>',\n 'bank--vault': '<path d=\"M26,30h-2v-2H8v2h-2v-2h-2c-1.103,0-2-.8975-2-2V4c0-1.103.897-2,2-2h24c1.1025,0,2,.897,2,2v22c0,1.1025-.8975,2-2,2h-2v2ZM4,4v22h24.002l-.002-22H4ZM17,22h-2v-2.1006c-.626-.127-1.2207-.374-1.7573-.7285l-2.5356,2.5361-1.4141-1.4141,2.5366-2.5371c-.3555-.5371-.6021-1.1318-.729-1.7559h-2.1006v-2h2.1001c.1274-.626.374-1.2207.7285-1.7573l-2.5356-2.5356,1.4141-1.4141,2.5366,2.5366c.5376-.3555,1.1318-.6021,1.7563-.729v-2.1006h2v2.1006c.626.127,1.2207.3735,1.7568.728l2.5361-2.5356,1.4141,1.4141-2.5361,2.5356c.3545.5366.6016,1.1313.7285,1.7573h2.1006v2h-2.1006c-.127.626-.374,1.2207-.7285,1.7568l2.5361,2.5361-1.4141,1.4141-2.5371-2.5371c-.5371.3555-1.1318.6025-1.7559.7295v2.1006ZM16,12c-.7954,0-1.5513.3135-2.1279.8818-.5586.5669-.8721,1.3228-.8721,2.1182,0,.7949.3135,1.5508.8823,2.1279,1.1318,1.1162,3.0908,1.127,4.2456-.0098.5586-.5674.8721-1.3232.8721-2.1182,0-.793-.3115-1.5464-.877-2.1226-.5771-.5659-1.3306-.8774-2.123-.8774Z\"/>',\n 'barcode': '<path d=\"M2 6H4V28H2z\"/><path d=\"M12 6H14V26H12z\"/><path d=\"M6 6H10V26H6z\"/><path d=\"M16 6H20V26H16z\"/><path d=\"M22 6H26V26H22z\"/><path d=\"M28 6H30V28H28z\"/>',\n 'book': '<path d=\"M19 10H26V12H19z\"/><path d=\"M19 15H26V17H19z\"/><path d=\"M19 20H26V22H19z\"/><path d=\"M6 10H13V12H6z\"/><path d=\"M6 15H13V17H6z\"/><path d=\"M6 20H13V22H6z\"/><path d=\"M28,5H4A2.002,2.002,0,0,0,2,7V25a2.002,2.002,0,0,0,2,2H28a2.002,2.002,0,0,0,2-2V7A2.002,2.002,0,0,0,28,5ZM4,7H15V25H4ZM17,25V7H28V25Z\"/>',\n 'bookmark': '<path d=\"M24,4V26.75l-7.1-3.59-.9-.45-.9.45L8,26.75V4H24m0-2H8A2,2,0,0,0,6,4V30L16,25,26,30V4A2,2,0,0,0,24,2Z\"/>',\n '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\"/>',\n '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\"/>',\n '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\"/>',\n '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\"/>',\n '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\tV26z M26,10H6V6h4v2h2V6h8v2h2V6h4V10z\"/>',\n 'calendar--add': '<switch><foreignObject width=\"1\" height=\"1\" x=\"0\" y=\"0\" requiredExtensions=\"http://ns.adobe.com/AdobeIllustrator/10.0/\"/><g><path d=\"M30 22 24 22 24 16 22 16 22 22 16 22 16 24 22 24 22 30 24 30 24 24 30 24z\"/><path d=\"M28,6c0-1.1-0.9-2-2-2h-4V2h-2v2h-8V2h-2v2H6C4.9,4,4,4.9,4,6v20c0,1.1,0.9,2,2,2h8v-2H6V6h4v2h2V6h8v2h2V6h4v8h2V6z\"/></g></switch>',\n 'calendar--heat-map': '<path d=\"M26,4H22V2H20V4H12V2H10V4H6A2.0025,2.0025,0,0,0,4,6V26a2.0025,2.0025,0,0,0,2,2H26a2.0025,2.0025,0,0,0,2-2V6A2.0025,2.0025,0,0,0,26,4ZM6,6h4V8h2V6h8V8h2V6h4l0,4H6Zm0,6h5v6H6ZM19,26H13V20h6Zm0-8H13V12h6Zm2,8V20h5l.0012,6Z\"/>',\n 'chart--area': '<path d=\"M20.4761,8.0151,13.4473,4.2109a2.0076,2.0076,0,0,0-2.1158.2051L4,10.001V2H2V28a2,2,0,0,0,2,2H30V5.7354ZM28,20.209l-7.62,1.8022-7.0288-2.8838a1.99,1.99,0,0,0-2.022.37L4,25.8359v-4.455l8.375-9.4,7.0186,5.62a2.0155,2.0155,0,0,0,2.0459.2119L28,14.6025ZM12.5239,5.9849l7.03,3.8042a2.012,2.012,0,0,0,1.3408.16L28,8.2646v4.1138L20.6187,16.02,13.6,10.4a1.99,1.99,0,0,0-2.6885.2642L4,18.3838v-5.87ZM4.5513,28,12.62,20.9888l7.0288,2.8838a1.9977,1.9977,0,0,0,1.147.0771L28,22.2612V28Z\"/>',\n 'chart--bar': '<path d=\"M4,2H2V28a2,2,0,0,0,2,2H30V28H4V25H26V17H4V13H18V5H4ZM24,19v4H4V19ZM16,7v4H4V7Z\"/>',\n 'chart--column': '<path d=\"M27,28V6H19V28H15V14H7V28H4V2H2V28a2,2,0,0,0,2,2H30V28ZM13,28H9V16h4Zm12,0H21V8h4Z\"/>',\n 'chart--line': '<path d=\"M4.67,28l6.39-12,7.3,6.49a2,2,0,0,0,1.7.47,2,2,0,0,0,1.42-1.07L27,10.9,25.18,10,19.69,21l-7.3-6.49A2,2,0,0,0,10.71,14a2,2,0,0,0-1.42,1L4,25V2H2V28a2,2,0,0,0,2,2H30V28Z\"/>',\n 'chart--pie': '<path d=\"M16,4A12,12,0,1,0,28,16,12,12,0,0,0,16,4ZM26,15H17V6.05A10,10,0,0,1,26,15ZM15.42,26A10,10,0,0,1,15,6.05v9a2,2,0,0,0,2,2h9A10,10,0,0,1,15.42,26Z\"/>',\n 'checkmark': '<path d=\"M13 24 4 15 5.414 13.586 13 21.171 26.586 7.586 28 9 13 24z\"/>',\n '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\"/>',\n '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\"/>',\n 'chevron--down': '<path d=\"M16 22 6 12 7.4 10.6 16 19.2 24.6 10.6 26 12z\"/>',\n 'chevron--left': '<path d=\"M10 16 20 6 21.4 7.4 12.8 16 21.4 24.6 20 26z\"/>',\n 'chevron--right': '<path d=\"M22 16 12 26 10.6 24.6 19.2 16 10.6 7.4 12 6z\"/>',\n '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\"/>',\n 'chevron--up': '<path d=\"M16 10 26 20 24.6 21.4 16 12.8 7.4 21.4 6 20z\"/>',\n '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\"/>',\n '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\"/>',\n 'cloud--download': '<path d=\"M23.5,22H23V20h.5a4.5,4.5,0,0,0,.36-9L23,11l-.1-.82a7,7,0,0,0-13.88,0L9,11,8.14,11a4.5,4.5,0,0,0,.36,9H9v2H8.5A6.5,6.5,0,0,1,7.2,9.14a9,9,0,0,1,17.6,0A6.5,6.5,0,0,1,23.5,22Z\"/><path d=\"M17 26.17 17 14 15 14 15 26.17 12.41 23.59 11 25 16 30 21 25 19.59 23.59 17 26.17z\"/>',\n 'cloud--upload': '<path d=\"M11 18 12.41 19.41 15 16.83 15 29 17 29 17 16.83 19.59 19.41 21 18 16 13 11 18z\"/><path d=\"M23.5,22H23V20h.5a4.5,4.5,0,0,0,.36-9L23,11l-.1-.82a7,7,0,0,0-13.88,0L9,11,8.14,11a4.5,4.5,0,0,0,.36,9H9v2H8.5A6.5,6.5,0,0,1,7.2,9.14a9,9,0,0,1,17.6,0A6.5,6.5,0,0,1,23.5,22Z\"/>',\n '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\"/>',\n '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\"/>',\n 'currency': '<path d=\"M21,12V10H17V7H15v3H13a2.002,2.002,0,0,0-2,2v3a2.002,2.002,0,0,0,2,2h6v3H11v2h4v3h2V22h2a2.0023,2.0023,0,0,0,2-2V17a2.002,2.002,0,0,0-2-2H13V12Z\"/><path d=\"M16,4A12,12,0,1,1,4,16,12.0353,12.0353,0,0,1,16,4m0-2A14,14,0,1,0,30,16,14.0412,14.0412,0,0,0,16,2Z\"/>',\n 'currency--dollar': '<path d=\"M23,20.5151c0-4.6152-3.78-5.1411-6.8171-5.563-3.31-.4609-5.1829-.86-5.1829-3.71C11,8.8491,13.5071,8,15.6538,8a6.7538,6.7538,0,0,1,5.5681,2.6279l1.5562-1.2558A8.6508,8.6508,0,0,0,17,6.0962V3H15V6.022c-3.6152.2192-6,2.26-6,5.22,0,4.73,3.83,5.2627,6.9075,5.69C19.16,17.3848,21,17.7744,21,20.5151,21,23.5474,17.8674,24,16,24c-3.4294,0-4.8782-.9639-6.2219-2.6279L8.2219,22.6279A8.4382,8.4382,0,0,0,15,25.9648V29h2V25.9551C20.7256,25.6509,23,23.6279,23,20.5151Z\"/>',\n 'currency--euro': '<path d=\"M17,26c-3.6162,0-6.3328-2.2974-7.4456-6H19V18H9.1321A15.2782,15.2782,0,0,1,9,16c0-.33.01-.6641.0259-1H19V13H9.2371C9.8447,9.3525,11.81,6,17,6c3.8533,0,5.5315,1.6465,7.1282,4.4893l1.7436-.9786C24.2649,6.6484,22.0779,4,17,4,10.6448,4,7,8.374,7,16c0,7.0654,4.1121,12,10,12,5.0779,0,7.2649-2.6484,8.8718-5.5107l-1.7436-.9786C22.5315,24.3535,20.8533,26,17,26Z\"/>',\n 'data--base': '<path d=\"M24,3H8A2,2,0,0,0,6,5V27a2,2,0,0,0,2,2H24a2,2,0,0,0,2-2V5A2,2,0,0,0,24,3Zm0,2v6H8V5ZM8,19V13H24v6Zm0,8V21H24v6Z\"/><circle cx=\"11\" cy=\"8\" r=\"1\"/><circle cx=\"11\" cy=\"16\" r=\"1\"/><circle cx=\"11\" cy=\"24\" r=\"1\"/>',\n 'debug': '<path d=\"M29.83,20l.34-2L25,17.15V13c0-.08,0-.15,0-.23l5.06-1.36-.51-1.93-4.83,1.29A9,9,0,0,0,20,5V2H18V4.23a8.81,8.81,0,0,0-4,0V2H12V5a9,9,0,0,0-4.71,5.82L2.46,9.48,2,11.41,7,12.77c0,.08,0,.15,0,.23v4.15L1.84,18l.32,2L7,19.18a8.9,8.9,0,0,0,.82,3.57L3.29,27.29l1.42,1.42,4.19-4.2a9,9,0,0,0,14.2,0l4.19,4.2,1.42-1.42-4.54-4.54A8.9,8.9,0,0,0,25,19.18ZM15,25.92A7,7,0,0,1,9,19V13h6ZM9.29,11a7,7,0,0,1,13.42,0ZM23,19a7,7,0,0,1-6,6.92V13h6Z\"/>',\n 'delivery--parcel': '<path d=\"M29.4819,8.624l-10-5.5a1,1,0,0,0-.9638,0l-10,5.5a1,1,0,0,0,0,1.752L18,15.5913V26.3086l-3.0362-1.6693L14,26.3912l4.5181,2.4848a.9984.9984,0,0,0,.9638,0l10-5.5A1,1,0,0,0,30,22.5V9.5A1,1,0,0,0,29.4819,8.624ZM19,5.1416,26.9248,9.5,19,13.8584,11.0752,9.5Zm9,16.7671-8,4.4V15.5913l8-4.4Z\"/><path d=\"M2 14H10V16H2z\" transform=\"matrix(-1 0 0 -1 12 30)\"/><path d=\"M4 22H12V24H4z\" transform=\"matrix(-1 0 0 -1 16 46)\"/><path d=\"M6 18H14V20H6z\" transform=\"matrix(-1 0 0 -1 20 38)\"/>',\n '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\"/>',\n '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\tz M18,4.4l5.6,5.6H18V4.4z M24,28H8V4h8v6c0,1.1,0.9,2,2,2h6V28z\"/><path d=\"M10 22H22V24H10z\"/><path d=\"M10 16H22V18H10z\"/>',\n 'document--add': '<path d=\"M30 24 26 24 26 20 24 20 24 24 20 24 20 26 24 26 24 30 26 30 26 26 30 26 30 24z\"/><path d=\"M16,28H8V4h8v6a2.0058,2.0058,0,0,0,2,2h6v4h2V10a.9092.9092,0,0,0-.3-.7l-7-7A.9087.9087,0,0,0,18,2H8A2.0058,2.0058,0,0,0,6,4V28a2.0058,2.0058,0,0,0,2,2h8ZM18,4.4,23.6,10H18Z\"/>',\n '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\"/>',\n '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\tl-3,3L17.4,7L20.4,4z M6,22v-3.6l10-10l3.6,3.6l-10,10H6z\"/>',\n 'email': '<path d=\"M28,6H4A2,2,0,0,0,2,8V24a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V8A2,2,0,0,0,28,6ZM25.8,8,16,14.78,6.2,8ZM4,24V8.91l11.43,7.91a1,1,0,0,0,1.14,0L28,8.91V24Z\"/>',\n '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\"/>',\n 'events': '<path d=\"M26,14H24v2h2a3.0033,3.0033,0,0,1,3,3v4h2V19A5.0058,5.0058,0,0,0,26,14Z\"/><path d=\"M24,4a3,3,0,1,1-3,3,3,3,0,0,1,3-3m0-2a5,5,0,1,0,5,5A5,5,0,0,0,24,2Z\"/><path d=\"M23,30H21V28a3.0033,3.0033,0,0,0-3-3H14a3.0033,3.0033,0,0,0-3,3v2H9V28a5.0059,5.0059,0,0,1,5-5h4a5.0059,5.0059,0,0,1,5,5Z\"/><path d=\"M16,13a3,3,0,1,1-3,3,3,3,0,0,1,3-3m0-2a5,5,0,1,0,5,5A5,5,0,0,0,16,11Z\"/><path d=\"M8,14H6a5.0059,5.0059,0,0,0-5,5v4H3V19a3.0033,3.0033,0,0,1,3-3H8Z\"/><path d=\"M8,4A3,3,0,1,1,5,7,3,3,0,0,1,8,4M8,2a5,5,0,1,0,5,5A5,5,0,0,0,8,2Z\"/>',\n '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\"/>',\n 'filter--edit': '<path d=\"M26,6H4V9.17l7.41,7.42.59.58V26h4V24h2v2a2,2,0,0,1-2,2H12a2,2,0,0,1-2-2V18L2.59,10.59A2,2,0,0,1,2,9.17V6A2,2,0,0,1,4,4H26Z\"/><path d=\"M29.71,11.29l-3-3a1,1,0,0,0-1.42,0L16,17.59V22h4.41l9.3-9.29A1,1,0,0,0,29.71,11.29ZM19.59,20H18V18.41l5-5L24.59,15ZM26,13.59,24.41,12,26,10.41,27.59,12Z\"/>',\n '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\"/>',\n 'flow': '<path d=\"M27,22.14V17a2,2,0,0,0-2-2H17V9.86a4,4,0,1,0-2,0V15H7a2,2,0,0,0-2,2v5.14a4,4,0,1,0,2,0V17H25v5.14a4,4,0,1,0,2,0ZM8,26a2,2,0,1,1-2-2A2,2,0,0,1,8,26ZM14,6a2,2,0,1,1,2,2A2,2,0,0,1,14,6ZM26,28a2,2,0,1,1,2-2A2,2,0,0,1,26,28Z\"/>',\n 'folder': '<path d=\"M11.17,6l3.42,3.41.58.59H28V26H4V6h7.17m0-2H4A2,2,0,0,0,2,6V26a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10a2,2,0,0,0-2-2H16L12.59,4.59A2,2,0,0,0,11.17,4Z\"/>',\n 'function': '<path d=\"M19.6262,29.5256,19.11,27.5935A12.0035,12.0035,0,0,0,25.2312,8.3323l1.5376-1.2788a14.0033,14.0033,0,0,1-7.1426,22.4721Z\"/><path d=\"M10,29H8V25.18l.8037-.1607C10.2617,24.728,12,23.6206,12,20V18.6182l-4-2V14.3818l4-2V12c0-5.4673,3.9253-9,10-9h2V6.82l-.8037.1607C21.7383,7.272,20,8.3794,20,12v.3818l4,2v2.2364l-4,2V20C20,25.4673,16.0747,29,10,29Zm0-2c4.9346,0,8-2.6821,8-7V17.3818L21.7642,15.5,18,13.6182V12c0-4.5781,2.3853-6.1924,4-6.76V5c-4.9346,0-8,2.6821-8,7v1.6182L10.2358,15.5,14,17.3818V20c0,4.5781-2.3853,6.1924-4,6.76Z\"/><path d=\"M5.2312,24.9465A14.0032,14.0032,0,0,1,12.3779,2.4734l.5161,1.9321A12.0035,12.0035,0,0,0,6.7688,23.6677Z\"/>',\n 'globe': '<path d=\"M14,4a7,7,0,1,1-7,7,7,7,0,0,1,7-7m0-2a9,9,0,1,0,9,9A9,9,0,0,0,14,2Z\"/><path d=\"M28,11a13.9563,13.9563,0,0,0-4.1051-9.8949L22.4813,2.5187A11.9944,11.9944,0,0,1,5.5568,19.5194l-.0381-.0381L4.1051,20.8949A13.9563,13.9563,0,0,0,14,25v3H10v2H20V28H16V24.84A14.0094,14.0094,0,0,0,28,11Z\"/>',\n '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\"/>',\n 'hashtag': '<path d=\"M28,12V10H22V4H20v6H12V4H10v6H4v2h6v8H4v2h6v6h2V22h8v6h2V22h6V20H22V12Zm-8,8H12V12h8Z\"/>',\n '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\"/>',\n '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\"/>',\n 'idea': '<path d=\"M11 24H21V26H11z\"/><path d=\"M13 28H19V30H13z\"/><path d=\"M16,2A10,10,0,0,0,6,12a9.19,9.19,0,0,0,3.46,7.62c1,.93,1.54,1.46,1.54,2.38h2c0-1.84-1.11-2.87-2.19-3.86A7.2,7.2,0,0,1,8,12a8,8,0,0,1,16,0,7.2,7.2,0,0,1-2.82,6.14c-1.07,1-2.18,2-2.18,3.86h2c0-.92.53-1.45,1.54-2.39A9.18,9.18,0,0,0,26,12,10,10,0,0,0,16,2Z\"/>',\n 'identification': '<path d=\"M28,6V26H4V6H28m0-2H4A2,2,0,0,0,2,6V26a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V6a2,2,0,0,0-2-2Z\"/><path d=\"M6 10H13V12H6z\"/><path d=\"M6 14H10V16H6z\"/><path d=\"M23,18H17a3,3,0,0,0-3,3v2h2V21a1,1,0,0,1,1-1h6a1,1,0,0,1,1,1v2h2V21A3,3,0,0,0,23,18Z\"/><path d=\"M20,17a4,4,0,1,0-4-4A4,4,0,0,0,20,17Zm0-6a2,2,0,1,1-2,2A2,2,0,0,1,20,11Z\"/>',\n '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\"/>',\n 'information--square': '<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=\"M26,28H6a2.0023,2.0023,0,0,1-2-2V6A2.0023,2.0023,0,0,1,6,4H26a2.0023,2.0023,0,0,1,2,2V26A2.0023,2.0023,0,0,1,26,28ZM6,6V26H26V6Z\"/>',\n 'inventory-management': '<path d=\"M19 24H23V28H19z\"/><path d=\"M26 24H30V28H26z\"/><path d=\"M19 17H23V21H19z\"/><path d=\"M26 17H30V21H26z\"/><path d=\"M17,24H4V10H28v5h2V10a2.0023,2.0023,0,0,0-2-2H22V4a2.0023,2.0023,0,0,0-2-2H12a2.002,2.002,0,0,0-2,2V8H4a2.002,2.002,0,0,0-2,2V24a2.0023,2.0023,0,0,0,2,2H17ZM12,4h8V8H12Z\"/>',\n '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\"/>',\n '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\"/>',\n 'license': '<path d=\"M10 6H22V8H10z\"/><path d=\"M10 10H22V12H10z\"/><path d=\"M10 24H16V26H10z\"/><path d=\"M10 14H16V16H10z\"/><path d=\"M24,30H8a2.0023,2.0023,0,0,1-2-2V4A2.0023,2.0023,0,0,1,8,2H24a2.0023,2.0023,0,0,1,2,2V28A2.0023,2.0023,0,0,1,24,30ZM8,4V28H24V4Z\"/>',\n '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\"/>',\n '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\"/>',\n '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\"/>',\n '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\"/>',\n 'location--company': '<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,0,0,7,13a8.9054,8.9054,0,0,0,1.8125,5.395Z\"/><path d=\"M21,18H19V10H13v8H11V10a2.0021,2.0021,0,0,1,2-2h6a2.0021,2.0021,0,0,1,2,2Z\"/><path d=\"M15 16H17V18H15z\"/><path d=\"M15 12H17V14H15z\"/>',\n '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\"/>',\n 'login': '<path d=\"M26,30H14a2,2,0,0,1-2-2V25h2v3H26V4H14V7H12V4a2,2,0,0,1,2-2H26a2,2,0,0,1,2,2V28A2,2,0,0,1,26,30Z\"/><path d=\"M14.59 20.59 18.17 17 4 17 4 15 18.17 15 14.59 11.41 16 10 22 16 16 22 14.59 20.59z\"/>',\n 'logout': '<path d=\"M6,30H18a2.0023,2.0023,0,0,0,2-2V25H18v3H6V4H18V7h2V4a2.0023,2.0023,0,0,0-2-2H6A2.0023,2.0023,0,0,0,4,4V28A2.0023,2.0023,0,0,0,6,30Z\"/><path d=\"M20.586 20.586 24.172 17 10 17 10 15 24.172 15 20.586 11.414 22 10 28 16 22 22 20.586 20.586z\"/>',\n 'maximize': '<path d=\"M20 2 20 4 26.586 4 18 12.582 19.414 14 28 5.414 28 12 30 12 30 2 20 2z\"/><path d=\"M14 19.416 12.592 18 4 26.586 4 20 2 20 2 30 12 30 12 28 5.414 28 14 19.416z\"/>',\n 'menu': '<path d=\"M4 6H28V8H4z\"/><path d=\"M4 24H28V26H4z\"/><path d=\"M4 12H28V14H4z\"/><path d=\"M4 18H28V20H4z\"/>',\n '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\"/>',\n '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\tl5.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\tl5.4,5.4L21.4,23z\" data-icon-path=\"inner-path\" opacity=\"0\"/>',\n 'money': '<path d=\"M2 22H30V24H2z\"/><path d=\"M2 26H30V28H2z\"/><path d=\"M24,10a2,2,0,1,0,2,2,2,2,0,0,0-2-2Z\"/><path d=\"M16,16a4,4,0,1,1,4-4A4.0045,4.0045,0,0,1,16,16Zm0-6a2,2,0,1,0,2,2A2.002,2.002,0,0,0,16,10Z\"/><path d=\"M8,10a2,2,0,1,0,2,2,2,2,0,0,0-2-2Z\"/><path d=\"M28,20H4a2.0051,2.0051,0,0,1-2-2V6A2.0051,2.0051,0,0,1,4,4H28a2.0051,2.0051,0,0,1,2,2V18A2.0027,2.0027,0,0,1,28,20ZM28,6H4V18H28Z\"/>',\n 'notebook': '<path d=\"M19 10H26V12H19z\"/><path d=\"M19 15H26V17H19z\"/><path d=\"M19 20H26V22H19z\"/><path d=\"M28,5H4A2.002,2.002,0,0,0,2,7V25a2.0023,2.0023,0,0,0,2,2H28a2.0027,2.0027,0,0,0,2-2V7A2.0023,2.0023,0,0,0,28,5ZM4,7H15V25H4ZM17,25V7H28l.002,18Z\"/>',\n '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\"/>',\n 'overflow-menu--horizontal': '<circle cx=\"8\" cy=\"16\" r=\"2\"/><circle cx=\"16\" cy=\"16\" r=\"2\"/><circle cx=\"24\" cy=\"16\" r=\"2\"/>',\n 'overflow-menu--vertical': '<circle cx=\"16\" cy=\"8\" r=\"2\"/><circle cx=\"16\" cy=\"16\" r=\"2\"/><circle cx=\"16\" cy=\"24\" r=\"2\"/>',\n 'partnership': '<path d=\"M8,9a4,4,0,1,1,4-4A4,4,0,0,1,8,9ZM8,3a2,2,0,1,0,2,2A2,2,0,0,0,8,3Z\"/><path d=\"M24,9a4,4,0,1,1,4-4A4,4,0,0,1,24,9Zm0-6a2,2,0,1,0,2,2A2,2,0,0,0,24,3Z\"/><path d=\"M26,30H22a2,2,0,0,1-2-2V21h2v7h4V19h2V13a1,1,0,0,0-1-1H20.58L16,20l-4.58-8H5a1,1,0,0,0-1,1v6H6v9h4V21h2v7a2,2,0,0,1-2,2H6a2,2,0,0,1-2-2V21a2,2,0,0,1-2-2V13a3,3,0,0,1,3-3h7.58L16,16l3.42-6H27a3,3,0,0,1,3,3v6a2,2,0,0,1-2,2v7A2,2,0,0,1,26,30Z\"/>',\n 'payment--methods': '<path d=\"M5,26V15.8281l-3.5859,3.586L0,18l6-6,6,6-1.4141,1.4141-3.5859-3.586v10.1719h12v2H7c-1.104-.0013-1.9987-.896-2-2Z\"/><path d=\"M31,18h-3v-2h-2v2h-1c-1.1046,0-2,.8954-2,2v2c0,1.1046,.8954,2,2,2h4v2h-6s0,2,0,2h3v2h2v-2h1c1.1046,0,2-.8954,2-2v-2c0-1.1046-.8954-2-2-2h-4v-2h6v-2Z\"/><path d=\"M28,12V6c-.0012-1.104-.896-1.9988-2-2H12v2h14v6\"/><path d=\"M2 6H7V8H2z\"/><path d=\"M2 2H10V4H2z\"/>',\n 'percentage': '<path d=\"M9,14a5,5,0,1,1,5-5A5.0055,5.0055,0,0,1,9,14ZM9,6a3,3,0,1,0,3,3A3.0033,3.0033,0,0,0,9,6Z\"/><path d=\"M.029 15H31.97V17H.029z\" transform=\"rotate(-45 16 16)\"/><path d=\"M23,28a5,5,0,1,1,5-5A5.0055,5.0055,0,0,1,23,28Zm0-8a3,3,0,1,0,3,3A3.0033,3.0033,0,0,0,23,20Z\"/>',\n 'phone': '<path d=\"M26,29h-.17C6.18,27.87,3.39,11.29,3,6.23A3,3,0,0,1,5.76,3h5.51a2,2,0,0,1,1.86,1.26L14.65,8a2,2,0,0,1-.44,2.16l-2.13,2.15a9.37,9.37,0,0,0,7.58,7.6l2.17-2.15A2,2,0,0,1,24,17.35l3.77,1.51A2,2,0,0,1,29,20.72V26A3,3,0,0,1,26,29ZM6,5A1,1,0,0,0,5,6v.08C5.46,12,8.41,26,25.94,27A1,1,0,0,0,27,26.06V20.72l-3.77-1.51-2.87,2.85L19.88,22C11.18,20.91,10,12.21,10,12.12l-.06-.48,2.84-2.87L11.28,5Z\"/>',\n 'piggy-bank': '<path d=\"M16.5,14H20V12H18V11H16v1.0508A2.5,2.5,0,0,0,16.5,17h1a.5.5,0,0,1,0,1H14v2h2v1h2V19.9492A2.5,2.5,0,0,0,17.5,15h-1a.5.5,0,0,1,0-1Z\"/><path d=\"M29,13H26.98A5.7789,5.7789,0,0,0,25,8.8525V5a1,1,0,0,0-1.6-.8L19.6665,7H15c-5.5095,0-9.4634,3.2412-9.9485,8H5a1.0009,1.0009,0,0,1-1-1V12H2v2a3.0033,3.0033,0,0,0,3,3h.07A9.1733,9.1733,0,0,0,9,23.5566V27a1,1,0,0,0,1,1h4a1,1,0,0,0,1-1V25h3v2a1,1,0,0,0,1,1h4a1,1,0,0,0,1-1V23.6372A5.0926,5.0926,0,0,0,26.8188,20H29a1,1,0,0,0,1-1V14A1,1,0,0,0,29,13Zm-1,5H25.124c-.3052,2.7529-.8235,3.4854-3.124,4.3154V26H20V23H13v3H11V22.3779A7.013,7.013,0,0,1,7,16c0-4.8354,4.0181-7,8-7h5.3335L23,7V9.7764c2.4182,1.8593,1.9126,3.186,2.0183,5.2236H28Z\"/>',\n 'portfolio': '<path d=\"M28,10H22V6a2,2,0,0,0-2-2H12a2,2,0,0,0-2,2v4H4a2,2,0,0,0-2,2V26a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V12A2,2,0,0,0,28,10ZM12,6h8v4H12ZM4,26V12H28V26Z\"/>',\n '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\"/>',\n 'purchase': '<path d=\"M28,6H4A2,2,0,0,0,2,8V24a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V8A2,2,0,0,0,28,6Zm0,2v3H4V8ZM4,24V13H28V24Z\"/><path d=\"M6 20H16V22H6z\"/>',\n '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\"/>',\n 'receipt': '<path d=\"M21 16H23V18H21z\"/><path d=\"M9 16H17V18H9z\"/><path d=\"M21 12H23V14H21z\"/><path d=\"M9 12H17V14H9z\"/><path d=\"M9 8H23V10H9z\"/><path d=\"M25,2H7A2.002,2.002,0,0,0,5,4V29a1,1,0,0,0,1,1H7a.9987.9987,0,0,0,.8-.4L10,26.667,12.2,29.6a1.0353,1.0353,0,0,0,1.6,0L16,26.667,18.2,29.6a1.0353,1.0353,0,0,0,1.6,0L22,26.667,24.2,29.6a.9993.9993,0,0,0,.8.4h1a1,1,0,0,0,1-1V4A2.0023,2.0023,0,0,0,25,2Zm0,25.333L22.8,24.4a1.0353,1.0353,0,0,0-1.6,0L19,27.333,16.8,24.4a1.0353,1.0353,0,0,0-1.6,0L13,27.333,10.8,24.4a1.0353,1.0353,0,0,0-1.6,0L7,27.333V4H25Z\"/>',\n '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\"/>',\n 'redo': '<path d=\"M12,10H24.1851L20.5977,6.4141,22,5,28,11,22,17l-1.4023-1.4146L24.1821,12H12a6,6,0,0,0,0,12h8v2H12a8,8,0,0,1,0-16Z\"/>',\n '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\"/>',\n 'repeat': '<path d=\"M6,6H26.1719l-3.586-3.5859L24,1l6,6-6,6-1.4141-1.4141L26.1719,8H6v7H4V8A2.0024,2.0024,0,0,1,6,6Z\"/><path d=\"M9.4141,20.4141,5.8281,24H26V17h2v7a2.0024,2.0024,0,0,1-2,2H5.8281L9.414,29.5859,8,31,2,25l6-6Z\"/>',\n 'report': '<path d=\"M10 18H18V20H10z\"/><path d=\"M10 13H22V15H10z\"/><path d=\"M10 23H15V25H10z\"/><path d=\"M25,5H22V4a2,2,0,0,0-2-2H12a2,2,0,0,0-2,2V5H7A2,2,0,0,0,5,7V28a2,2,0,0,0,2,2H25a2,2,0,0,0,2-2V7A2,2,0,0,0,25,5ZM12,4h8V8H12ZM25,28H7V7h3v3H22V7h3Z\"/>',\n 'request-quote': '<path d=\"M22,22v6H6V4H16V2H6A2,2,0,0,0,4,4V28a2,2,0,0,0,2,2H22a2,2,0,0,0,2-2V22Z\"/><path d=\"M29.54,5.76l-3.3-3.3a1.6,1.6,0,0,0-2.24,0l-14,14V22h5.53l14-14a1.6,1.6,0,0,0,0-2.24ZM14.7,20H12V17.3l9.44-9.45,2.71,2.71ZM25.56,9.15,22.85,6.44l2.27-2.27,2.71,2.71Z\"/>',\n 'reset': '<path d=\"M18,28A12,12,0,1,0,6,16v6.2L2.4,18.6,1,20l6,6,6-6-1.4-1.4L8,22.2V16H8A10,10,0,1,1,18,26Z\"/>',\n 'rule': '<path d=\"M10 16H22V18H10z\"/><path d=\"M10 10H22V12H10z\"/><path d=\"M16,30,9.8242,26.7071A10.9815,10.9815,0,0,1,4,17V4A2.0022,2.0022,0,0,1,6,2H26a2.0022,2.0022,0,0,1,2,2V17a10.9815,10.9815,0,0,1-5.8242,9.7069ZM6,4V17a8.9852,8.9852,0,0,0,4.7656,7.9423L16,27.7333l5.2344-2.791A8.9852,8.9852,0,0,0,26,17V4Z\"/>',\n 'save': '<path d=\"M27.71,9.29l-5-5A1,1,0,0,0,22,4H6A2,2,0,0,0,4,6V26a2,2,0,0,0,2,2H26a2,2,0,0,0,2-2V10A1,1,0,0,0,27.71,9.29ZM12,6h8v4H12Zm8,20H12V18h8Zm2,0V18a2,2,0,0,0-2-2H12a2,2,0,0,0-2,2v8H6V6h4v4a2,2,0,0,0,2,2h8a2,2,0,0,0,2-2V6.41l4,4V26Z\"/>',\n 'scales': '<path d=\"M20,16a5,5,0,0,0,10,0,1,1,0,0,0-.1055-.4473L25.896,7.5562a.8913.8913,0,0,0-.0454-.0816A1,1,0,0,0,25,7H18.8218A3.0155,3.0155,0,0,0,17,5.1841V2H15V5.1841A3.0155,3.0155,0,0,0,13.1782,7H7a1,1,0,0,0-.8945.5527l-4,8A1,1,0,0,0,2,16a5,5,0,0,0,10,0,1,1,0,0,0-.1055-.4473L8.6182,9h4.56A3.0147,3.0147,0,0,0,15,10.8154V28H6v2H26V28H17V10.8159A3.0155,3.0155,0,0,0,18.8218,9h4.56l-3.2763,6.5527A1,1,0,0,0,20,16ZM7,19a2.9958,2.9958,0,0,1-2.8152-2h5.63A2.9956,2.9956,0,0,1,7,19Zm2.3821-4H4.6179L7,10.2363ZM16,9a1,1,0,1,1,1-1A1.0009,1.0009,0,0,1,16,9Zm9,10a2.9958,2.9958,0,0,1-2.8152-2h5.63A2.9956,2.9956,0,0,1,25,19Zm0-8.7637L27.3821,15H22.6179Z\"/>',\n '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\"/>',\n 'send': '<path d=\"M27.45,15.11l-22-11a1,1,0,0,0-1.08.12,1,1,0,0,0-.33,1L7,16,4,26.74A1,1,0,0,0,5,28a1,1,0,0,0,.45-.11l22-11a1,1,0,0,0,0-1.78Zm-20.9,10L8.76,17H18V15H8.76L6.55,6.89,24.76,16Z\"/>',\n '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\"/>',\n '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\ts1.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\ts-1.3,3-3,3s-3-1.3-3-3S9.3,20,11,20z\"/>',\n 'shopping--bag': '<path d=\"M28.76,11.35A1,1,0,0,0,28,11H22V7a3,3,0,0,0-3-3H13a3,3,0,0,0-3,3v4H4a1,1,0,0,0-1,1.15L4.88,24.3a2,2,0,0,0,2,1.7H25.14a2,2,0,0,0,2-1.7L29,12.15A1,1,0,0,0,28.76,11.35ZM12,7a1,1,0,0,1,1-1h6a1,1,0,0,1,1,1v4H12ZM25.14,24H6.86L5.17,13H26.83Z\"/>',\n '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\"/>',\n 'sort--ascending': '<path d=\"M18 22 19.414 20.586 23 24.172 23 4 25 4 25 24.172 28.586 20.586 30 22 24 28 18 22z\"/><path d=\"M2 18H16V20H2z\"/><path d=\"M6 12H16V14H6z\"/><path d=\"M10 6H16V8H10z\"/>',\n 'sort--descending': '<path d=\"M18 22 19.414 20.586 23 24.172 23 4 25 4 25 24.172 28.586 20.586 30 22 24 28 18 22z\"/><path d=\"M2 6H16V8H2z\"/><path d=\"M6 12H16V14H6z\"/><path d=\"M10 18H16V20H10z\"/>',\n 'star': '<path d=\"M16,6.52l2.76,5.58.46,1,1,.15,6.16.89L22,18.44l-.75.73.18,1,1.05,6.13-5.51-2.89L16,23l-.93.49L9.56,26.34l1-6.13.18-1L10,18.44,5.58,14.09l6.16-.89,1-.15.46-1L16,6.52M16,2l-4.55,9.22L1.28,12.69l7.36,7.18L6.9,30,16,25.22,25.1,30,23.36,19.87l7.36-7.17L20.55,11.22Z\"/>',\n 'star--filled': '<path d=\"M16,2l-4.55,9.22L1.28,12.69l7.36,7.18L6.9,30,16,25.22,25.1,30,23.36,19.87l7.36-7.17L20.55,11.22Z\"/>',\n 'subtract': '<path d=\"M8 15H24V17H8z\"/>',\n 'table--split': '<path d=\"M27,3H5A2,2,0,0,0,3,5V27a2,2,0,0,0,2,2H27a2,2,0,0,0,2-2V5A2,2,0,0,0,27,3Zm0,2V9H5V5ZM17,11H27v7H17Zm-2,7H5V11H15ZM5,20H15v7H5Zm12,7V20H27v7Z\"/>',\n 'tag': '<path d=\"M10,14a4,4,0,1,1,4-4A4.0045,4.0045,0,0,1,10,14Zm0-6a2,2,0,1,0,1.998,2.0044A2.002,2.002,0,0,0,10,8Z\"/><path d=\"M16.6436,29.4145,2.5858,15.3555A2,2,0,0,1,2,13.9414V4A2,2,0,0,1,4,2h9.9413a2,2,0,0,1,1.4142.5858L29.4144,16.6436a2.0005,2.0005,0,0,1,0,2.8285l-9.9424,9.9425a2.0008,2.0008,0,0,1-2.8285,0ZM4,4v9.9417L18.0578,28,28,18.0579,13.9416,4Z\"/>',\n 'task': '<path d=\"M14 20.18 10.41 16.59 9 18 14 23 23 14 21.59 12.58 14 20.18z\"/><path d=\"M25,5H22V4a2,2,0,0,0-2-2H12a2,2,0,0,0-2,2V5H7A2,2,0,0,0,5,7V28a2,2,0,0,0,2,2H25a2,2,0,0,0,2-2V7A2,2,0,0,0,25,5ZM12,4h8V8H12ZM25,28H7V7h3v3H22V7h3Z\"/>',\n 'task--complete': '<path d=\"M22 27.18 19.41 24.59 18 26 22 30 30 22 28.59 20.59 22 27.18z\"/><path d=\"M25,5H22V4a2.0058,2.0058,0,0,0-2-2H12a2.0058,2.0058,0,0,0-2,2V5H7A2.0058,2.0058,0,0,0,5,7V28a2.0058,2.0058,0,0,0,2,2h9V28H7V7h3v3H22V7h3V18h2V7A2.0058,2.0058,0,0,0,25,5ZM20,8H12V4h8Z\"/>',\n '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\"/>',\n '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\"/>',\n '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\"/>',\n 'undo': '<path d=\"M20,10H7.8149l3.5874-3.5859L10,5,4,11,10,17l1.4023-1.4146L7.8179,12H20a6,6,0,0,1,0,12H12v2h8a8,8,0,0,0,0-16Z\"/>',\n '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\"/>',\n 'user--admin': '<path d=\"M12,4A5,5,0,1,1,7,9a5,5,0,0,1,5-5m0-2a7,7,0,1,0,7,7A7,7,0,0,0,12,2Z\"/><path d=\"M22,30H20V25a5,5,0,0,0-5-5H9a5,5,0,0,0-5,5v5H2V25a7,7,0,0,1,7-7h6a7,7,0,0,1,7,7Z\"/><path d=\"M25 16.18 22.41 13.59 21 15 25 19 32 12 30.59 10.59 25 16.18z\"/>',\n 'user--follow': '<path d=\"M32 14 28 14 28 10 26 10 26 14 22 14 22 16 26 16 26 20 28 20 28 16 32 16 32 14z\"/><path d=\"M12,4A5,5,0,1,1,7,9a5,5,0,0,1,5-5m0-2a7,7,0,1,0,7,7A7,7,0,0,0,12,2Z\"/><path d=\"M22,30H20V25a5,5,0,0,0-5-5H9a5,5,0,0,0-5,5v5H2V25a7,7,0,0,1,7-7h6a7,7,0,0,1,7,7Z\"/>',\n 'user--multiple': '<path d=\"M30,30H28V25a5.0057,5.0057,0,0,0-5-5V18a7.0078,7.0078,0,0,1,7,7Z\"/><path d=\"M22,30H20V25a5.0059,5.0059,0,0,0-5-5H9a5.0059,5.0059,0,0,0-5,5v5H2V25a7.0082,7.0082,0,0,1,7-7h6a7.0082,7.0082,0,0,1,7,7Z\"/><path d=\"M20,2V4a5,5,0,0,1,0,10v2A7,7,0,0,0,20,2Z\"/><path d=\"M12,4A5,5,0,1,1,7,9a5,5,0,0,1,5-5m0-2a7,7,0,1,0,7,7A7,7,0,0,0,12,2Z\"/>',\n 'user--profile': '<path d=\"M12,4A5,5,0,1,1,7,9a5,5,0,0,1,5-5m0-2a7,7,0,1,0,7,7A7,7,0,0,0,12,2Z\"/><path d=\"M22,30H20V25a5,5,0,0,0-5-5H9a5,5,0,0,0-5,5v5H2V25a7,7,0,0,1,7-7h6a7,7,0,0,1,7,7Z\"/><path d=\"M22 4H32V6H22z\"/><path d=\"M22 9H32V11H22z\"/><path d=\"M22 14H29V16H22z\"/>',\n '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\"/>',\n 'wallet': '<path d=\"M22 17H24V19H22z\"/><path d=\"M28,8H4V5H26V3H4A2,2,0,0,0,2,5V26a2,2,0,0,0,2,2H28a2,2,0,0,0,2-2V10A2,2,0,0,0,28,8ZM4,26V10H28v3H20a2,2,0,0,0-2,2v6a2,2,0,0,0,2,2h8v3ZM28,15v6H20V15Z\"/>',\n '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\"/>',\n '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\tc-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\tC16.8,22,17.5,22.7,17.5,23.5z M17.1,8h-2.2v11h2.2V8z\" data-icon-path=\"inner-path\" opacity=\"0\"/>',\n};\n","/** Canonical Pire icon names are Lucide slugs; the shipped IBM Carbon pack is reached through\n * this map, so swapping packs never touches a call site. A new icon name used by a component\n * must be added here — that is the whole registration step.\n *\n * This file is also the single source of truth for *which glyphs get vendored*:\n * `scripts/generate-icon-data.mjs` reads it and inlines the matching SVG from\n * `@carbon/icons` into `icon-data.generated.ts`. The script cannot import TypeScript, so it\n * parses this object textually. **Every entry must stay a literal `'name': 'slug',` pair.**\n * A spread, a computed key or a template literal is invisible to the generator: the glyph\n * never gets vendored and `Icon` warns at runtime instead of rendering. Multiple names may\n * point at one slug (`boxes` and `package` both mean `box`); the generator de-duplicates.\n */\nexport const CARBON_MAP: Record<string, string> = {\n 'menu':'menu','search':'search','bell':'notification','help-circle':'help','grid-3x3':'grid',\n 'home':'home','file-text':'document','clipboard-list':'list--checked','building-2':'building',\n 'boxes':'box','truck':'delivery-truck','stamp':'checkmark--outline','check':'checkmark','x':'close',\n 'minus':'subtract','plus':'add','trash-2':'trash-can','printer':'printer','paperclip':'attachment',\n 'download':'download','calendar':'calendar','hash':'hashtag','history':'recently-viewed',\n 'calculator':'calculator','zap':'flash','palette':'color-palette','settings':'settings',\n 'sliders-horizontal':'settings--adjust','filter':'filter','rows-3':'list','align-justify':'list--boxes',\n 'more-vertical':'overflow-menu--vertical','alert-triangle':'warning--alt','alert-octagon':'error--filled',\n 'alert-circle':'warning--filled','check-circle-2':'checkmark--filled','x-circle':'misuse',\n 'info':'information','circle':'circle-dash','chevron-right':'chevron--right','chevron-left':'chevron--left',\n 'chevron-down':'chevron--down','chevrons-up-down':'chevron--sort','arrow-right':'arrow--right',\n 'arrow-up':'arrow--up','arrow-down':'arrow--down','trending-up':'arrow--up','trending-down':'arrow--down',\n 'shopping-cart':'shopping--cart','user':'user','shapes':'apps','type':'text--font',\n 'package':'box','warehouse':'building--insights-1','arrow-up-down':'arrows--vertical','scan-line':'qr-code',\n 'circle-alert':'warning--filled','clock':'time','layers':'layers','map-pin':'location','copy':'copy',\n 'refresh-cw':'renew','external-link':'launch','pencil':'edit','lock':'locked','eye':'view','minimize-2':'minimize',\n\n /* --- Direction and chrome, completing the sets above --------------------\n `chevron-up` and `arrow-left` were missing while their three siblings shipped, so a collapsible\n that pointed down had nothing to point back up with. */\n 'chevron-up':'chevron--up','arrow-left':'arrow--left','more-horizontal':'overflow-menu--horizontal',\n 'maximize-2':'maximize','log-out':'logout','log-in':'login','archive':'archive','folder':'folder',\n 'book':'book','notebook':'notebook','asterisk':'asterisk','bookmark':'bookmark','star':'star',\n 'star-filled':'star--filled','tag':'tag','repeat':'repeat','undo-2':'undo','redo-2':'redo',\n 'rotate-ccw':'reset','table':'table--split','database':'data--base','function-square':'function',\n\n /* --- Money -------------------------------------------------------------\n `credit-card` is here because its absence shipped: it resolved to nothing, rendered an empty\n box, and reached production on the payment notifications. Carbon spells it `payment--methods`,\n which is exactly the kind of mismatch this map exists to absorb. */\n 'credit-card':'payment--methods','wallet':'wallet','banknote':'money','coins':'currency',\n 'dollar-sign':'currency--dollar','euro':'currency--euro','receipt':'receipt','percent':'percentage',\n 'piggy-bank':'piggy-bank','landmark':'bank--vault','scale':'scales','purchase':'purchase',\n\n /* --- Documents and ERP objects ----------------------------------------- */\n 'file-signature':'request-quote','scroll-text':'license','file-plus':'document--add','save':'save',\n 'file-bar-chart':'report','list-todo':'task','check-square':'task--complete','gavel':'rule',\n 'id-card':'identification','briefcase':'portfolio','handshake':'partnership','lightbulb':'idea',\n 'inventory':'inventory-management','package-2':'delivery--parcel','shopping-bag':'shopping--bag',\n 'barcode':'barcode','qr-code':'qr-code','git-branch':'flow','bug':'debug',\n\n /* --- People and contact ------------------------------------------------- */\n 'users':'user--multiple','user-plus':'user--follow','user-cog':'user--admin','user-circle':'user--profile',\n 'mail':'email','phone':'phone','send':'send','globe':'globe','building':'location--company',\n\n /* --- Charts and time ---------------------------------------------------- */\n 'bar-chart-3':'chart--column','bar-chart-horizontal':'chart--bar','line-chart':'chart--line',\n 'pie-chart':'chart--pie','area-chart':'chart--area','calendar-days':'events','calendar-plus':'calendar--add',\n 'calendar-heatmap':'calendar--heat-map',\n\n /* --- Transfer ----------------------------------------------------------- */\n 'cloud-upload':'cloud--upload','cloud-download':'cloud--download','filter-x':'filter--edit',\n 'arrow-up-narrow-wide':'sort--ascending','arrow-down-wide-narrow':'sort--descending',\n 'badge-info':'information--square',\n};\n\n/**\n * Every name `Icon` can render, frozen and sorted.\n *\n * Exported because an unknown slug fails quietly — an empty box and one dev-only console warning,\n * which is easy to lose in a busy log. A consumer that generates icon names from data can assert\n * against this list at build time instead of discovering the gap in production, which is how\n * `credit-card` shipped as a blank square.\n */\nexport const ICON_NAMES: readonly string[] = Object.freeze(Object.keys(CARBON_MAP).sort());\n","import type * as React from 'react';\nimport { ICON_MARKUP } from './icon-data.generated';\nimport { CARBON_MAP } from './icon-map';\n\n/** The package has no `@types/node`, and it should not need one for a browser library — but the\n * literal token `process.env.NODE_ENV` has to survive into the output for a bundler to substitute\n * it. Declared inside the module rather than globally so it shadows, and cannot clash with, the\n * `process` that `@types/node` contributes when it is present in a consumer's graph. */\ndeclare const process: { env: { NODE_ENV?: string } };\n\n/** Dev-only diagnostics. Every bundler replaces `process.env.NODE_ENV` statically, so the warnings\n * and their registry are dead code a minifier drops from production builds. Do *not* wrap this in\n * `typeof process !== 'undefined'`: `process` is genuinely undefined in the browser, the `typeof`\n * test is not something a bundler substitutes, and the guard would evaluate false in development —\n * silencing the warnings this exists to emit. This is the same bare check react-aria-components\n * ships, so it is already in every consumer's bundle. */\nconst IS_DEV = process.env.NODE_ENV !== 'production';\n\nconst warned = new Set<string>();\n/** One warning per distinct cause. Icons re-render on every keystroke in a filter bar, so warning\n * per render would bury the message in its own repetitions. */\nfunction warnOnce(key: string, message: string): void {\n if (warned.has(key)) return;\n warned.add(key);\n console.warn(`[pire] ${message}`);\n}\n\n/** @deprecated Retained only so existing `pack` values still typecheck. Glyphs are bundled from\n * the Carbon pack; there is no second pack and no remote fetch, so the value is ignored. */\nexport type IconPack = 'carbon' | 'lucide';\n\nexport interface IconConfig {\n /** @deprecated Ignored. The bundled Carbon pack is the only pack — `lucide` was a remote-URL\n * pack and no longer exists. Setting this warns in development. */\n pack?: IconPack;\n /** @deprecated Ignored — glyphs are inlined in the bundle, so there is nothing to serve from a\n * folder. Apps that vendored `<slug>.svg` files into `public/` to survive offline can delete\n * both the files and this call. Setting it warns in development. */\n base?: string;\n /** Escape hatch for a glyph Pire does not bundle, or to override one. Return the *inner* markup\n * of a 32x32 SVG (`'<path d=\"…\"/>'`), or `undefined` to fall through to the bundled set. The\n * string is injected as-is, so it must be authored markup, never user input. */\n resolve?: (name: string) => string | undefined;\n}\n\nlet config: IconConfig = {};\n\n/** Optional. The bundled Carbon set needs no configuration — this exists only to register glyphs\n * Pire does not ship, once at startup. */\nexport function configureIcons(next: IconConfig): void {\n config = { ...config, ...next };\n if (!IS_DEV) return;\n if (next.base !== undefined) {\n warnOnce(\n 'config:base',\n '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.',\n );\n }\n if (next.pack !== undefined) {\n warnOnce(\n 'config:pack',\n 'configureIcons({ pack }) is ignored: the bundled Carbon pack is the only pack. Use configureIcons({ resolve }) to supply a glyph Pire does not ship.',\n );\n }\n}\n\nexport interface IconProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, 'children'> {\n /** Canonical (Lucide) slug, e.g. \"shopping-cart\". Translated to the Carbon pack automatically. */\n name: string;\n /** Pixel box. 16 in dense UI, 20 in headers, 24 in tiles. */\n size?: number;\n /** Accessible name. Omit for decorative icons — they are hidden from assistive tech. */\n label?: string;\n /** @deprecated Ignored. See {@link IconConfig.pack}. */\n pack?: IconPack;\n}\n\n/** Glyph rendered as inline SVG filled with `currentColor`, so it inherits text colour everywhere\n * and paints with no network at all — which the previous CDN-backed implementation did not, leaving\n * every icon blank offline in the PWAs that consume this library.\n *\n * An unknown name still renders nothing, so a typo cannot collapse a layout, but it warns in\n * development: the silent blank gap was the failure mode worth killing. */\nexport function Icon({ name, size = 16, label, pack, style, ...rest }: IconProps) {\n const markup = config.resolve?.(name) ?? ICON_MARKUP[CARBON_MAP[name] ?? name];\n if (IS_DEV) {\n if (pack !== undefined) {\n warnOnce(\n 'prop:pack',\n 'The Icon `pack` prop is ignored: the bundled Carbon pack is the only pack. Drop the prop.',\n );\n }\n if (markup === undefined) {\n warnOnce(\n `missing:${name}`,\n `Unknown icon name \"${name}\" — nothing will render. Add it to CARBON_MAP in src/components/core/icon-map.ts and rebuild, or register it with configureIcons({ resolve }).`,\n );\n }\n }\n return (\n <span\n role={label ? 'img' : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n data-icon={name}\n {...rest}\n style={{ display: 'inline-block', flex: '0 0 auto', width: size, height: size, ...style }}\n >\n {markup === undefined ? (\n // A broken icon has to look broken. In development the box gets a dashed outline so the\n // gap is visible on screen instead of only in a console warning that is easy to lose in a\n // busy log — which is how a missing `credit-card` reached production as a blank square.\n // Production still renders nothing at all: a dev diagnostic must never become a user's\n // first sight of a defect. Deliberately not an <svg>, so nothing reads it as a real glyph.\n IS_DEV ? <span className=\"pire-icon-missing\" title={`Unknown icon: ${name}`} /> : null\n ) : (\n <svg viewBox=\"0 0 32 32\" width={size} height={size} fill=\"currentColor\" focusable=\"false\"\n aria-hidden=\"true\" style={{ display: 'block' }}\n // The markup is build-time output of scripts/generate-icon-data.mjs, or a string the app\n // itself handed to configureIcons — never user input. Parsing it into React elements\n // would mean shipping an SVG parser to do what the browser already does.\n // biome-ignore lint/security/noDangerouslySetInnerHtml: build-time generated icon markup.\n dangerouslySetInnerHTML={{ __html: markup }}\n />\n )}\n </span>\n );\n}\n","import * as React from 'react';\nimport { Button as AriaButton, type ButtonProps as AriaButtonProps } from 'react-aria-components';\nimport { Icon } from './Icon';\nimport { cx } from '../utils/cx';\n\nexport interface ButtonProps extends Omit<AriaButtonProps, 'className' | 'children'> {\n children?: React.ReactNode;\n /** primary = one per view. secondary = default action. tertiary = low-stakes/inline.\n * danger = destructive. emphasized = on the dark shell. */\n variant?: 'primary' | 'secondary' | 'tertiary' | 'danger' | 'emphasized';\n /** sm = table rows & toolbars, md = default forms, lg = full-width CTAs. */\n size?: 'sm' | 'md' | 'lg';\n /** Icon slug rendered before the label. */\n icon?: string;\n /** Icon slug rendered after the label. */\n iconEnd?: string;\n fullWidth?: boolean;\n className?: string;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n { children, variant = 'secondary', size = 'md', icon, iconEnd, fullWidth, className, ...rest }, ref,\n) {\n return (\n <AriaButton ref={ref} className={cx('pire-btn', className)} data-variant={variant} data-size={size}\n data-full-width={fullWidth ? 'true' : undefined} {...rest}>\n {icon ? <Icon name={icon} size={16} /> : null}\n {children}\n {iconEnd ? <Icon name={iconEnd} size={16} /> : null}\n </AriaButton>\n );\n});\n","/** Joins truthy class names. Kept local so the package has no runtime class-name dependency. */\nexport function cx(...parts: Array<string | false | null | undefined>) {\n return parts.filter(Boolean).join(' ');\n}\n","import * as React from 'react';\nimport { Button as AriaButton, type ButtonProps as AriaButtonProps } from 'react-aria-components';\nimport { Icon } from './Icon';\nimport { Tooltip } from '../feedback/Tooltip';\nimport { cx } from '../utils/cx';\n\nexport interface IconButtonProps extends Omit<AriaButtonProps, 'className' | 'children' | 'aria-label'> {\n icon: string;\n /** Required accessible name — also the tooltip text. */\n label: string;\n size?: 'sm' | 'md' | 'lg';\n /** inverse = on the dark shell bar. outlined = standalone beside fields. */\n variant?: 'tertiary' | 'outlined' | 'inverse';\n selected?: boolean;\n /** Suppress the tooltip when the control already sits inside one. */\n hideTooltip?: boolean;\n /**\n * Indicator over the icon. `0` and `undefined` draw nothing — a badge reading \"0\" is noise.\n *\n * Drawn `aria-hidden`, so **`label` must carry the number itself** (\"Notifications, 3 unread\").\n * Pire cannot compose that sentence: it does not know the noun, and word order differs by\n * language. Passing `count` without putting it in `label` hides the count from screen readers.\n */\n count?: number;\n /** Cap before rendering \"N+\". Default 9. */\n countMax?: number;\n /** `dot` when \"something is new\" is the whole message and the number adds nothing. */\n countVariant?: 'number' | 'dot';\n className?: string;\n}\n\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { icon, label, size = 'md', variant = 'tertiary', selected, hideTooltip,\n count, countMax = 9, countVariant = 'number', className, ...rest }, ref,\n) {\n const showsCount = count != null && count > 0;\n const button = (\n <AriaButton ref={ref} aria-label={label} aria-pressed={selected} className={cx('pire-iconbtn', className)}\n data-size={size} data-variant={variant} data-selected={selected ? 'true' : undefined}\n data-has-count={showsCount ? 'true' : undefined} {...rest}>\n <Icon name={icon} size={size === 'lg' ? 20 : 16} />\n {showsCount ? (\n <span className=\"pire-iconbtn-count\" data-variant={countVariant} aria-hidden=\"true\">\n {countVariant === 'number' ? (count > countMax ? `${countMax}+` : count) : null}\n </span>\n ) : null}\n </AriaButton>\n );\n return hideTooltip ? button : <Tooltip label={label}>{button}</Tooltip>;\n});\n","import * as React from 'react';\nimport { TooltipTrigger, Tooltip as AriaTooltip, OverlayArrow, Focusable } from 'react-aria-components';\nimport { cx } from '../utils/cx';\n\nexport interface TooltipProps {\n /** Short clarifying text — never the only source of an instruction. */\n label: React.ReactNode;\n placement?: 'top' | 'bottom' | 'left' | 'right';\n /** Hover delay in ms. Keyboard focus always shows it immediately. */\n delay?: number;\n /**\n * Anything — a Button, a Badge, a span, plain text.\n *\n * A child that cannot take focus on its own is made focusable for you. That is the point: a\n * tooltip on something unreachable by keyboard is invisible to anyone not using a mouse, and it\n * fails silently — a dead tooltip is indistinguishable from a live one until somebody hovers it.\n */\n children: React.ReactNode;\n}\n\n/**\n * Explains something without adding a step. Shows on hover after `delay`, and immediately on\n * keyboard focus.\n *\n * Never put an instruction here that is not available elsewhere: there is no hover on touch.\n */\nexport function Tooltip({ label, placement = 'top', delay = 500, children }: TooltipProps) {\n /**\n * `Focusable` clones its child rather than wrapping it in a node, so an already-focusable child\n * keeps exactly one tab stop while a non-focusable one simply gains `tabindex=\"0\"`. That is what\n * makes this unconditional — no prop asking the caller whether their child takes focus, and no\n * guessing at render time.\n *\n * The class rides along so the focus ring can live in components.css. React Aria sets only\n * `tabindex` here, no `data-focus-visible`, so the ring would otherwise come from base.css's\n * `[tabindex]:focus-visible` — and base.css is the layer a consumer migrating off Tailwind skips.\n */\n const target = React.isValidElement<{ className?: string }>(children)\n ? React.cloneElement(children, { className: cx(children.props.className, 'pire-tooltip-target') })\n : <span className=\"pire-tooltip-target\">{children}</span>;\n\n return (\n <TooltipTrigger delay={delay} closeDelay={0}>\n <Focusable>{target}</Focusable>\n <AriaTooltip className=\"pire-tooltip\" placement={placement} offset={6}>\n <OverlayArrow><span /></OverlayArrow>\n {label}\n </AriaTooltip>\n </TooltipTrigger>\n );\n}\n","import type * as React from 'react';\nimport { Icon } from './Icon';\nimport { cx } from '../utils/cx';\n\nexport type BadgeStatus = 'positive' | 'critical' | 'negative' | 'informative' | 'neutral';\n\nconst STATUS_ICON: Record<BadgeStatus, string> = {\n positive: 'check-circle-2', critical: 'alert-triangle', negative: 'x-circle',\n informative: 'info', neutral: 'circle',\n};\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Semantic value state. Colour is never the only signal — the icon carries the same meaning. */\n status?: BadgeStatus;\n showIcon?: boolean;\n}\n\n/** Value state on an object or row. Text is the label, never a bare colour dot. */\nexport function Badge({ children, status = 'neutral', showIcon = true, className, ...rest }: BadgeProps) {\n return (\n <span className={cx('pire-badge', className)} data-status={status} {...rest}>\n {showIcon ? <Icon name={STATUS_ICON[status]} size={12} /> : null}\n {children}\n </span>\n );\n}\n","import type * as React from 'react';\nimport { Button as AriaButton } from 'react-aria-components';\nimport { Icon } from './Icon';\nimport { cx } from '../utils/cx';\n\nexport interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Provide to render the remove affordance — filter tokens, multi-select values. */\n onRemove?: () => void;\n isDisabled?: boolean;\n /**\n * Marks the tag as one of a set of **categories** — kinds of a thing, where none is good or bad.\n * Use it for payment kinds, document types, cost-centre groups.\n *\n * This is what `Badge` is not for. `Badge`'s five values are *states*: painting a category\n * \"negative\" says something went wrong when nothing did.\n *\n * The number is a slot in the shared `--viz` ramp, not a colour. Assign in order and do not\n * cycle past 6 — colour-blind separation is measured between adjacent slots, and a seventh\n * category implies a distinction the eye cannot recover. Fold the tail into one \"Other\".\n *\n * The colour rides on a swatch, never on the text: the label stays in normal ink so it keeps\n * its contrast, and the category is never carried by colour alone.\n */\n category?: 1 | 2 | 3 | 4 | 5 | 6;\n}\n\n/** A removable token: applied filters, multi-select values. */\nexport function Tag({ children, onRemove, isDisabled, category, className, ...rest }: TagProps) {\n return (\n <span className={cx('pire-tag', className)} data-disabled={isDisabled ? 'true' : undefined} {...rest}>\n {/* Hidden from assistive tech on purpose: the label already says which category this is, so\n announcing the swatch would repeat it without adding anything. */}\n {category ? <span className=\"pire-tag-swatch\" data-category={category} aria-hidden=\"true\" /> : null}\n {children}\n {onRemove ? (\n <AriaButton className=\"pire-tag-remove\" isDisabled={isDisabled} onPress={onRemove}\n aria-label={`Remove ${typeof children === 'string' ? children : 'filter'}`}>\n <Icon name=\"x\" size={12} />\n </AriaButton>\n ) : null}\n </span>\n );\n}\n","import type * as React from 'react';\nimport { Icon } from './Icon';\nimport { cx } from '../utils/cx';\n\nexport interface CardProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n icon?: string;\n /** Header-right actions — usually IconButtons. */\n actions?: React.ReactNode;\n /** Right-aligned footer actions, separated by a hairline. */\n footer?: React.ReactNode;\n /** Raises the shadow on hover and sets a pointer cursor. Pair with onClick and a heading link. */\n interactive?: boolean;\n}\n\nexport function Card({ title, subtitle, icon, actions, footer, interactive, children, className, ...rest }: CardProps) {\n return (\n <section className={cx('pire-card', className)} data-interactive={interactive ? 'true' : undefined} {...rest}>\n {title || actions ? (\n <header className=\"pire-card-head\">\n {icon ? <Icon name={icon} size={20} style={{ color: 'var(--text-secondary)' }} /> : null}\n <div style={{ flex: 1, minWidth: 0 }}>\n <h3 className=\"pire-card-title\">{title}</h3>\n {subtitle ? <p className=\"pire-card-sub\" style={{ margin: 0 }}>{subtitle}</p> : null}\n </div>\n {actions ? <div style={{ display: 'flex', gap: 'var(--sp-1)' }}>{actions}</div> : null}\n </header>\n ) : null}\n {children ? <div className=\"pire-card-body\">{children}</div> : null}\n {footer ? <footer className=\"pire-card-foot\">{footer}</footer> : null}\n </section>\n );\n}\n","import * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Full name — initials are derived from the first two words. */\n name: string;\n size?: 'sm' | 'md' | 'lg';\n /** Optional photo. Falls back to initials if it fails to load. */\n src?: string;\n}\n\nconst initials = (name: string) => name.trim().split(/\\s+/).slice(0, 2).map((p) => p[0]).join('').toUpperCase();\n\n/** Identity chip for the shell bar, approval lists and history rows. Never the only way a person\n * is named — always sits beside or is labelled with the full name. */\nexport function Avatar({ name, size = 'md', src, className, ...rest }: AvatarProps) {\n const [failed, setFailed] = React.useState(false);\n return (\n <span className={cx('pire-avatar', className)} data-size={size} role=\"img\" aria-label={name} {...rest}>\n {src && !failed\n ? <img src={src} alt=\"\" onError={() => setFailed(true)}\n style={{ width: '100%', height: '100%', borderRadius: 'inherit', objectFit: 'cover' }} />\n : initials(name)}\n </span>\n );\n}\n","import * as React from 'react';\nimport { ToggleButtonGroup, ToggleButton } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { cx } from '../utils/cx';\n\nexport interface SegmentOption { id: string; label: string; icon?: string; isDisabled?: boolean }\n\nexport interface SegmentedControlProps {\n /** Names the choice for assistive tech, e.g. \"Row density\". */\n 'aria-label': string;\n options: SegmentOption[];\n value?: string;\n defaultValue?: string;\n onChange?: (id: string) => void;\n /** Show icons only; labels move into the accessible name and the tooltip. */\n iconOnly?: boolean;\n size?: 'sm' | 'md';\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Two to four mutually exclusive view options that change how data is displayed, not what it is:\n * row density, list vs chart, period. For filtering, use Select or Tabs. */\nexport function SegmentedControl({ options, value, defaultValue, onChange, iconOnly, size = 'sm',\n className, style, ...rest }: SegmentedControlProps) {\n const selected = React.useMemo(() => new Set(value ? [value] : defaultValue ? [defaultValue] : []), [value, defaultValue]);\n return (\n <ToggleButtonGroup className={cx('pire-segmented', className)} data-size={size} style={style}\n aria-label={rest['aria-label']} selectionMode=\"single\" disallowEmptySelection\n selectedKeys={selected} onSelectionChange={(keys) => {\n const first = [...keys][0];\n if (first != null) onChange?.(String(first));\n }}>\n {options.map((option) => (\n <ToggleButton key={option.id} id={option.id} className=\"pire-segmented-item\"\n isDisabled={option.isDisabled} aria-label={iconOnly ? option.label : undefined}>\n {option.icon ? <Icon name={option.icon} size={16} /> : null}\n {iconOnly ? null : option.label}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\n/** Colour hierarchy, named after the `--text-*` token each value resolves to. */\nexport type TextColor = 'primary' | 'secondary' | 'tertiary' | 'disabled' | 'inverse';\n\n/** Typographic scale, named after the `--type-*` tokens. */\nexport type TextSize = 'body' | 'body-lg' | 'caption' | 'micro';\n\n// `color` shadows a DOM attribute, so it must be Omitted before being redeclared.\nexport interface TextProps extends Omit<React.HTMLAttributes<HTMLElement>, 'color'> {\n /** Typographic scale. `body` covers most copy. */\n size?: TextSize;\n /** `secondary` for supporting copy, `tertiary` for metadata. */\n color?: TextColor;\n /** Raises weight without changing size. Same effect as wrapping in `<Strong>`. */\n weight?: 'regular' | 'strong';\n /** Tabular mono, right-aligned. Use for every amount, quantity and ID. */\n numeric?: boolean;\n /** Uppercase label for a block. Replaces the `.pire-eyebrow` helper. */\n eyebrow?: boolean;\n /** `true` clamps to one line; a number clamps to that many. */\n truncate?: boolean | number;\n /** `span` when inline, `div` when wrapping, `dd`/`li` inside lists. */\n elementType?: 'p' | 'span' | 'div' | 'dd' | 'li';\n className?: string;\n}\n\n/** Body copy, captions, metadata and eyebrows — everything that is text but not a heading. */\nexport function Text({\n size = 'body', color = 'primary', weight = 'regular', numeric, eyebrow, truncate,\n elementType: Wrapper = 'p', className, style, ...rest\n}: TextProps) {\n const lineClamp = typeof truncate === 'number' ? truncate : truncate ? 1 : undefined;\n const clampStyle = lineClamp == null\n ? style\n : ({ ['--pire-text-clamp' as string]: lineClamp, ...style } as React.CSSProperties);\n\n return (\n <Wrapper\n className={cx('pire-text', className)}\n data-size={size}\n data-color={color}\n data-weight={weight === 'strong' ? 'strong' : undefined}\n data-numeric={numeric ? 'true' : undefined}\n data-eyebrow={eyebrow ? 'true' : undefined}\n data-truncate={lineClamp != null ? 'true' : undefined}\n style={clampStyle}\n {...rest}\n />\n );\n}\n\nexport interface StrongProps extends Omit<React.HTMLAttributes<HTMLElement>, 'color'> {\n className?: string;\n}\n\n/** Inline emphasis. Sugar over `<Text weight=\"strong\" elementType=\"span\">`. */\nexport function Strong({ className, ...rest }: StrongProps) {\n return <Text elementType=\"span\" weight=\"strong\" className={className} {...rest} />;\n}\n","import type * as React from 'react';\nimport { Heading as AriaHeading } from 'react-aria-components';\nimport { cx } from '../utils/cx';\nimport type { TextColor } from './Text';\n\n// `color` shadows a DOM attribute, so it must be Omitted before being redeclared.\nexport interface HeadingProps extends Omit<React.HTMLAttributes<HTMLHeadingElement>, 'color'> {\n /** Semantic level. Picks the h1–h4 element and defines the document outline. */\n level?: 1 | 2 | 3 | 4;\n /** Visual scale, independent of `level`. Set it when a correct outline needs a different size. */\n size?: 'display' | 'h1' | 'h2' | 'h3' | 'h4';\n /** `secondary` for a supporting title. Same vocabulary as `Text`. */\n color?: TextColor;\n /** `true` clamps to one line; a number clamps to that many. */\n truncate?: boolean | number;\n className?: string;\n}\n\n/** Section and page titles. Built on React Aria's `Heading` so a `Dialog` picks it up as its name. */\nexport function Heading({\n level = 2, size, color = 'primary', truncate, className, style, ...rest\n}: HeadingProps) {\n const lineClamp = typeof truncate === 'number' ? truncate : truncate ? 1 : undefined;\n const clampStyle = lineClamp == null\n ? style\n : ({ ['--pire-text-clamp' as string]: lineClamp, ...style } as React.CSSProperties);\n\n return (\n <AriaHeading\n level={level}\n className={cx('pire-heading', className)}\n data-size={size ?? `h${level}`}\n data-color={color}\n data-truncate={lineClamp != null ? 'true' : undefined}\n style={clampStyle}\n {...rest}\n />\n );\n}\n","import type * as React from 'react';\nimport { Link as AriaLink, type LinkProps as AriaLinkProps } from 'react-aria-components';\nimport { Icon } from './Icon';\nimport { cx } from '../utils/cx';\nimport type { TextSize } from './Text';\n\nexport interface LinkProps extends Omit<AriaLinkProps, 'className' | 'children'> {\n children?: React.ReactNode;\n /** Inherits the surrounding size by default. Set it when the link stands alone. */\n size?: TextSize;\n /** Adds the launch glyph and `rel=\"noopener noreferrer\"`. Does not set `target`. */\n isExternal?: boolean;\n className?: string;\n}\n\n/** A real anchor with the system's link styling. Honours a `RouterProvider` when the app supplies one. */\nexport function Link({ children, size, isExternal, className, rel, ...rest }: LinkProps) {\n return (\n <AriaLink\n className={cx('pire-link', className)}\n data-size={size}\n data-external={isExternal ? 'true' : undefined}\n rel={isExternal ? (rel ?? 'noopener noreferrer') : rel}\n {...rest}\n >\n {children}\n {isExternal ? <Icon name=\"external-link\" size={12} className=\"pire-link-external\" /> : null}\n </AriaLink>\n );\n}\n","import { Separator as AriaSeparator, type SeparatorProps as AriaSeparatorProps } from 'react-aria-components';\nimport { cx } from '../utils/cx';\n\nexport interface SeparatorProps extends Omit<AriaSeparatorProps, 'className'> {\n /** `vertical` to divide actions inside a toolbar. */\n orientation?: 'horizontal' | 'vertical';\n /** `subtle` divides inside a card without chopping it up. */\n emphasis?: 'default' | 'subtle';\n /** `none` when the container already provides the rhythm. */\n spacing?: 'none' | 'sm' | 'md';\n className?: string;\n}\n\n/** A page-level divider. For rules inside a menu use `MenuSeparator`, which follows the menu's rhythm. */\nexport function Separator({\n orientation = 'horizontal', emphasis = 'default', spacing = 'md', className, ...rest\n}: SeparatorProps) {\n return (\n <AriaSeparator\n orientation={orientation}\n className={cx('pire-separator', className)}\n data-orientation={orientation}\n data-emphasis={emphasis}\n data-spacing={spacing}\n {...rest}\n />\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface KbdProps extends React.HTMLAttributes<HTMLElement> {\n /** One key per element — compose several for a chord: `<Kbd>⌘</Kbd><Kbd>K</Kbd>`. */\n children: React.ReactNode;\n /** `sm` for inline use inside running text, where a full-size cap sits taller than the line. */\n size?: 'sm' | 'md';\n}\n\n/**\n * A single key, drawn as a key cap.\n *\n * Renders a real `<kbd>`, so assistive tech announces it as keyboard input rather than as loose\n * text. It is painted only — nothing here binds a shortcut; that stays with the app.\n *\n * One key per element. A chord is several of these side by side, which keeps each cap the size of\n * its own glyph instead of stretching one cap across \"Ctrl+Shift+K\".\n */\nexport function Kbd({ children, size = 'md', className, ...rest }: KbdProps) {\n return (\n <kbd className={cx('pire-kbd', className)} data-size={size} {...rest}>{children}</kbd>\n );\n}\n","import type * as React from 'react';\nimport { Icon } from '../core/Icon';\nimport { cx } from '../utils/cx';\n\nexport interface FormFieldProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n label: React.ReactNode;\n /** id of the control this label points at. Required when wrapping a bare control. */\n htmlFor?: string;\n isRequired?: boolean;\n /** Static help text. Hidden while an error is shown. */\n hint?: React.ReactNode;\n /** Error message; rendered in an alert row with an icon. */\n error?: React.ReactNode;\n /** horizontal = right-aligned 160px label column, the ERP detail-form default. */\n layout?: 'stacked' | 'horizontal';\n children?: React.ReactNode;\n}\n\n/** Label + control + hint/error wrapper for controls that do not manage their own label\n * (most Pire controls do — use their `label` prop first). */\nexport function FormField({ label, htmlFor, isRequired, hint, error, layout = 'stacked', children, className, ...rest }: FormFieldProps) {\n return (\n <div className={cx('pire-field', className)} data-layout={layout} {...rest}>\n <label className=\"pire-field-label\" htmlFor={htmlFor}>\n {label}{isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </label>\n {children}\n {error ? (\n <span className=\"pire-field-error\" role=\"alert\"><Icon name=\"alert-circle\" size={12} />{error}</span>\n ) : hint ? <span className=\"pire-field-hint\">{hint}</span> : null}\n </div>\n );\n}\n","import * as React from 'react';\nimport { TextField, Label, Input as AriaInput, Group, Text, FieldError,\n Button as AriaButton } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface InputProps {\n label?: React.ReactNode;\n value?: string;\n defaultValue?: string;\n /** Receives the raw string value. */\n onChange?: (value: string) => void;\n placeholder?: string;\n /**\n * `date` is accepted for compatibility but reaches for the browser's native picker, which\n * ignores the token palette and behaves differently per browser. Use `DatePicker`, or\n * `DateRangePicker` for two ends.\n */\n type?: 'text' | 'search' | 'email' | 'number' | 'date' | 'password' | 'tel' | 'url';\n /** Leading icon slug — \"search\", \"calendar\", \"hash\". */\n icon?: string;\n /** Trailing static text: unit, currency, \"of 40\". */\n suffix?: React.ReactNode;\n /**\n * Adds a clear affordance once the field has a value.\n *\n * Use it on every search field. `type=\"search\"` gets one from the browser for free, but only in\n * Chrome and Safari, and it cannot be styled or sized — Pire hides that one so a search box does\n * not look different per browser. This is the replacement, and it is a real button: focusable,\n * labelled, and the same shape everywhere.\n *\n * Works controlled or uncontrolled.\n */\n isClearable?: boolean;\n /**\n * The clear button's visible text. Defaults to the dictionary's `inputClear`.\n *\n * Deliberately a word rather than an icon: an \"x\" beside a dialog's own close \"x\" reads as a\n * second way to dismiss the dialog. Keep it short — it sits inside the field.\n */\n clearLabel?: string;\n /** Help text below the field. Replaced by errorMessage when invalid. */\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isReadOnly?: boolean;\n isRequired?: boolean;\n size?: 'sm' | 'md' | 'lg';\n /** Right-aligned tabular mono — use for every amount, quantity and ID. */\n numeric?: boolean;\n fullWidth?: boolean;\n name?: string;\n autoFocus?: boolean;\n className?: string;\n style?: React.CSSProperties;\n inputRef?: React.Ref<HTMLInputElement>;\n}\n\n/** Single-line text entry. Labels, descriptions and errors are wired to the input by React Aria,\n * so no manual aria-describedby is ever needed. */\nexport function Input({ label, icon, suffix, description, errorMessage, size = 'md', numeric,\n isClearable, clearLabel, fullWidth = true, className, style, inputRef, onChange, ...rest }: InputProps) {\n const msg = usePireMessages();\n const isControlled = rest.value !== undefined;\n const [ownValue, setOwnValue] = React.useState(rest.defaultValue ?? '');\n const currentValue = isControlled ? rest.value : ownValue;\n const handleChange = (next: string) => { setOwnValue(next); onChange?.(next); };\n\n /**\n * A clearable, uncontrolled field is driven by Pire rather than by React Aria. There is no\n * imperative \"clear\" on TextField, and writing to the DOM node directly would leave React Aria's\n * own state holding the old value. Scoped to `isClearable` so every other Input keeps exactly\n * the behaviour it has today.\n */\n const takesOverValue = isClearable && !isControlled;\n const valueProps = takesOverValue ? { value: ownValue, defaultValue: undefined } : {};\n const showsClear = isClearable && currentValue !== '' && !rest.isDisabled && !rest.isReadOnly;\n return (\n <TextField className={cx('pire-field', className)} style={style} onChange={handleChange}\n validationBehavior=\"aria\" {...rest} {...valueProps}>\n {label ? (\n <Label className=\"pire-field-label\">\n {label}{rest.isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </Label>\n ) : null}\n <Group className=\"pire-control\" data-size={size} data-full-width={String(fullWidth)}\n data-invalid={rest.isInvalid ? 'true' : undefined} data-readonly={rest.isReadOnly ? 'true' : undefined}>\n {icon ? <Icon name={icon} size={16} className=\"pire-leading-icon\" /> : null}\n <AriaInput ref={inputRef} className=\"pire-input\" data-numeric={numeric ? 'true' : undefined} />\n {/* A labelled text button, not an \"x\": inside a dialog an icon-only x sits next to the\n dialog's own close x and reads as a second dismiss. The word says what it clears. */}\n {showsClear ? (\n <AriaButton className=\"pire-input-clear\" onPress={() => handleChange('')}>\n {clearLabel ?? msg.inputClear}\n </AriaButton>\n ) : null}\n {suffix ? <span className=\"pire-affix\">{suffix}</span> : null}\n </Group>\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n </TextField>\n );\n}\n","import * as React from 'react';\nimport { type PireMessages, enMessages } from './messages';\n\nconst MessagesContext = React.createContext<PireMessages>(enMessages);\n\nexport interface PireIntlProviderProps {\n /** Overrides merged over the English defaults, so a partial dictionary is enough. */\n messages?: Partial<PireMessages>;\n children?: React.ReactNode;\n}\n\n/**\n * Supplies the strings Pire renders itself. Mount once near the app root, alongside React Aria's\n * `I18nProvider` — that one localises React Aria's internals, this one localises Pire's.\n */\nexport function PireIntlProvider({ messages, children }: PireIntlProviderProps) {\n const value = React.useMemo(\n () => (messages ? { ...enMessages, ...messages } : enMessages),\n [messages],\n );\n\n return <MessagesContext.Provider value={value}>{children}</MessagesContext.Provider>;\n}\n\n/** Reads the active dictionary. Without a provider this returns the English defaults. */\nexport function usePireMessages(): PireMessages {\n return React.useContext(MessagesContext);\n}\n\n/**\n * Resolves one string, letting an explicit prop win over the dictionary.\n *\n * Components call this so a per-instance override is always available — a screen with two navs\n * needs to name them differently even when the dictionary is correct.\n */\nexport function useMessage(key: keyof PireMessages, override?: string): string {\n // Read the context unconditionally — `override ?? useContext(...)` short-circuits, which\n // changes the hook call order between renders.\n const messages = React.useContext(MessagesContext);\n return override ?? messages[key];\n}\n","/**\n * Every string Pire renders that the consumer did not supply.\n *\n * Keys are `<component><thing>`. Values are the English defaults, so a consumer that installs\n * nothing keeps working exactly as before.\n *\n * React Aria localises its own internals (date field segments, table sort announcements) through\n * `I18nProvider`, which Pire re-exports. This dictionary is the parallel for Pire's own strings —\n * install both to fully translate the UI.\n */\nexport interface PireMessages {\n /** FilterBar's landmark name. */\n filterBarLabel: string;\n /** Visible text of the apply button. Filters apply explicitly, never live. */\n filterBarGo: string;\n /** Visible text of the button that removes every active filter. */\n filterBarClearAll: string;\n\n /** Accessible name of the header checkbox that selects every row. */\n dataTableSelectAll: string;\n /** Accessible name of a row's selection checkbox. */\n dataTableSelectRow: string;\n /** Announced while the table body is a skeleton. */\n dataTableLoading: string;\n /** Row header announced for the totals row when the first column carries no summary cell. */\n dataTableSummaryRow: string;\n\n /** Accessible name of the dialog's close affordance. */\n dialogClose: string;\n /** Accessible name of SidePanel's close affordance. */\n sidePanelClose: string;\n\n /** Accessible name of InlineMessage's dismiss affordance. */\n inlineMessageDismiss: string;\n /** Accessible name of a toast's dismiss affordance. */\n toastDismiss: string;\n /** Landmark name of the toast live region. */\n toastRegionLabel: string;\n\n /** Accessible name of the button that opens a ComboBox's list. */\n /** Shown inside the popover when a Select has no options at all. A Select whose list is empty\n * used not to open, so the field read as broken; this is the text that explains it instead. */\n selectEmpty: string;\n\n comboBoxShowSuggestions: string;\n /** Row shown in the popover while a server search is in flight. */\n comboBoxLoading: string;\n\n /** Accessible name of the button that opens the calendar popover. */\n datePickerOpenCalendar: string;\n datePickerPreviousMonth: string;\n datePickerNextMonth: string;\n /** Groups the shortcut buttons beside the range calendar. */\n dateRangePresetsLabel: string;\n\n /** Accessible names of the NumberField steppers. */\n numberFieldIncrease: string;\n numberFieldDecrease: string;\n\n /** Accessible name of the button that clears a ValueHelpField. */\n /** Accessible name of the clear affordance on a clearable Input. */\n inputClear: string;\n\n /** Placeholder in the closed value-help field when nothing is picked. */\n valueHelpFieldPlaceholder: string;\n valueHelpFieldClear: string;\n /** Opens the value-help dialog. `{label}` is replaced with the field's own label. */\n valueHelpFieldOpenNamed: string;\n /** Same button, when the field has no string label to name it with. */\n valueHelpFieldOpen: string;\n /** Accessible name of ValueHelpDialog's search field. */\n valueHelpDialogSearch: string;\n /** Default dialog heading when the field does not supply one. */\n valueHelpDialogTitle: string;\n /** Placeholder in the value-help search box. */\n valueHelpDialogSearchPlaceholder: string;\n /** Shown when the search returns nothing. */\n valueHelpDialogEmpty: string;\n /** Visible text of ValueHelpDialog's cancel button. */\n valueHelpDialogCancel: string;\n\n /** Pagination's landmark name and its controls. */\n paginationLabel: string;\n /** Record range. `{from}`, `{to}` and `{total}` are replaced with formatted numbers. */\n paginationRange: string;\n /** Current page. `{page}` and `{pages}` are replaced. */\n paginationPageOf: string;\n paginationPrevious: string;\n paginationNext: string;\n paginationRowsPerPage: string;\n\n /** Landmark name of the main SideNav. Override it when a screen has more than one nav. */\n sideNavLabel: string;\n /** Names SplitPane's list column. */\n splitPaneList: string;\n /** Names SplitPane's detail column. */\n splitPaneDetail: string;\n /** Returns to the list when SplitPane is narrow enough to show one column. */\n splitPaneBack: string;\n\n /** Button that opens the OS file picker. */\n fileUploadChoose: string;\n /** Removes one picked file. `{name}` is replaced with the file name. */\n fileUploadRemoveNamed: string;\n /** Label on the progress bar while the app uploads. */\n fileUploadUploading: string;\n /** Instruction inside the drop surface. */\n fileDropZonePrompt: string;\n\n /** Accessible name of the ShellBar avatar once it opens a menu. `{user}` is the person's name. */\n shellBarUserMenu: string;\n\n /** Names the command palette dialog. */\n commandPaletteLabel: string;\n /** Accessible name of the palette's search input. */\n commandPaletteSearchLabel: string;\n /** Placeholder in the palette's input. */\n commandPalettePlaceholder: string;\n /** Shown when nothing matches what was typed. */\n commandPaletteEmpty: string;\n /** Shown while a server-backed search is in flight. */\n commandPaletteLoading: string;\n /** Footer hint beside the arrow-key glyphs. */\n commandPaletteHintNavigate: string;\n /** Footer hint beside the Enter glyph. */\n commandPaletteHintSelect: string;\n /** Footer hint beside the Esc glyph. */\n commandPaletteHintClose: string;\n\n /** Heading of the category column in a chart's data table. */\n chartCategoryHeader: string;\n /** Cell text where a chart series has no reading for a category. Never \"0\" — a gap is not a zero. */\n chartNoValue: string;\n /** Shown in place of the plot when a chart has nothing to draw. */\n chartEmpty: string;\n}\n\nexport const enMessages: PireMessages = {\n filterBarLabel: 'Filters',\n filterBarGo: 'Go',\n filterBarClearAll: 'Clear all',\n\n dataTableSelectAll: 'Select all rows',\n dataTableSelectRow: 'Select row',\n dataTableLoading: 'Loading records',\n dataTableSummaryRow: 'Summary',\n\n dialogClose: 'Close',\n sidePanelClose: 'Close panel',\n\n inlineMessageDismiss: 'Dismiss message',\n toastDismiss: 'Dismiss',\n toastRegionLabel: 'Notifications',\n\n selectEmpty: 'No options available',\n\n comboBoxShowSuggestions: 'Show suggestions',\n comboBoxLoading: 'Searching…',\n\n datePickerOpenCalendar: 'Open calendar',\n datePickerPreviousMonth: 'Previous month',\n datePickerNextMonth: 'Next month',\n dateRangePresetsLabel: 'Date range shortcuts',\n\n numberFieldIncrease: 'Increase',\n numberFieldDecrease: 'Decrease',\n\n inputClear: 'Clear',\n\n valueHelpFieldPlaceholder: 'Not selected',\n valueHelpFieldClear: 'Clear selection',\n valueHelpFieldOpenNamed: 'Select {label}',\n valueHelpFieldOpen: 'Open value help',\n valueHelpDialogSearch: 'Search records',\n valueHelpDialogTitle: 'Select a record',\n valueHelpDialogSearchPlaceholder: 'Search by ID or name',\n valueHelpDialogEmpty: 'No records found',\n valueHelpDialogCancel: 'Cancel',\n\n paginationLabel: 'Pagination',\n paginationRange: '{from}–{to} of {total}',\n paginationPageOf: 'Page {page} of {pages}',\n paginationPrevious: 'Previous page',\n paginationNext: 'Next page',\n paginationRowsPerPage: 'Rows per page',\n\n sideNavLabel: 'Main navigation',\n splitPaneList: 'List',\n splitPaneDetail: 'Detail',\n splitPaneBack: 'Back to list',\n\n fileUploadChoose: 'Choose files',\n fileUploadRemoveNamed: 'Remove {name}',\n fileUploadUploading: 'Uploading',\n fileDropZonePrompt: 'Drag files here, or choose them',\n\n shellBarUserMenu: 'Account menu for {user}',\n\n commandPaletteLabel: 'Command palette',\n commandPaletteSearchLabel: 'Search commands and records',\n commandPalettePlaceholder: 'Search for a screen, an action or a record…',\n commandPaletteEmpty: 'Nothing matches that',\n commandPaletteLoading: 'Searching…',\n commandPaletteHintNavigate: 'navigate',\n commandPaletteHintSelect: 'open',\n commandPaletteHintClose: 'close',\n\n chartCategoryHeader: 'Category',\n chartNoValue: 'No data',\n chartEmpty: 'No data for this period',\n};\n\nexport const esMessages: PireMessages = {\n filterBarLabel: 'Filtros',\n filterBarGo: 'Buscar',\n filterBarClearAll: 'Limpiar todo',\n\n dataTableSelectAll: 'Seleccionar todas las filas',\n dataTableSelectRow: 'Seleccionar fila',\n dataTableLoading: 'Cargando registros',\n dataTableSummaryRow: 'Resumen',\n\n dialogClose: 'Cerrar',\n sidePanelClose: 'Cerrar panel',\n\n inlineMessageDismiss: 'Descartar mensaje',\n toastDismiss: 'Descartar',\n toastRegionLabel: 'Notificaciones',\n\n selectEmpty: 'Sin opciones disponibles',\n\n comboBoxShowSuggestions: 'Mostrar sugerencias',\n comboBoxLoading: 'Buscando…',\n\n datePickerOpenCalendar: 'Abrir calendario',\n datePickerPreviousMonth: 'Mes anterior',\n datePickerNextMonth: 'Mes siguiente',\n dateRangePresetsLabel: 'Atajos de rango de fechas',\n\n numberFieldIncrease: 'Aumentar',\n numberFieldDecrease: 'Disminuir',\n\n inputClear: 'Limpiar',\n\n valueHelpFieldPlaceholder: 'Sin seleccionar',\n valueHelpFieldClear: 'Limpiar selección',\n valueHelpFieldOpenNamed: 'Seleccionar {label}',\n valueHelpFieldOpen: 'Abrir ayuda de valores',\n valueHelpDialogSearch: 'Buscar registros',\n valueHelpDialogTitle: 'Seleccionar un registro',\n valueHelpDialogSearchPlaceholder: 'Buscar por código o nombre',\n valueHelpDialogEmpty: 'No se encontraron registros',\n valueHelpDialogCancel: 'Cancelar',\n\n paginationLabel: 'Paginación',\n paginationRange: '{from}–{to} de {total}',\n paginationPageOf: 'Página {page} de {pages}',\n paginationPrevious: 'Página anterior',\n paginationNext: 'Página siguiente',\n paginationRowsPerPage: 'Filas por página',\n\n sideNavLabel: 'Navegación principal',\n splitPaneList: 'Lista',\n splitPaneDetail: 'Detalle',\n splitPaneBack: 'Volver a la lista',\n\n fileUploadChoose: 'Elegir archivos',\n fileUploadRemoveNamed: 'Quitar {name}',\n fileUploadUploading: 'Subiendo',\n fileDropZonePrompt: 'Arrastrá archivos acá, o elegilos',\n\n shellBarUserMenu: 'Menú de cuenta de {user}',\n\n commandPaletteLabel: 'Paleta de comandos',\n commandPaletteSearchLabel: 'Buscar comandos y registros',\n commandPalettePlaceholder: 'Buscá una pantalla, una acción o un registro…',\n commandPaletteEmpty: 'No hay coincidencias',\n commandPaletteLoading: 'Buscando…',\n commandPaletteHintNavigate: 'navegar',\n commandPaletteHintSelect: 'abrir',\n commandPaletteHintClose: 'cerrar',\n\n chartCategoryHeader: 'Categoría',\n chartNoValue: 'Sin datos',\n chartEmpty: 'Sin datos para este período',\n};\n","import * as React from 'react';\nimport { TextField, Label, TextArea as AriaTextArea, Group, Text, FieldError } from 'react-aria-components';\nimport { cx } from '../utils/cx';\n\n/* Measuring before paint is the whole point of autoGrow — useEffect would show one frame at the\n wrong height — but useLayoutEffect warns when it runs during server rendering, where there is\n nothing to measure anyway. */\nconst useIsomorphicLayoutEffect = typeof document === 'undefined' ? React.useEffect : React.useLayoutEffect;\n\nexport interface TextAreaProps {\n label?: React.ReactNode;\n value?: string;\n defaultValue?: string;\n /** Receives the raw string value. */\n onChange?: (value: string) => void;\n placeholder?: string;\n /** Help text below the field. Replaced by errorMessage when invalid. */\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isReadOnly?: boolean;\n isRequired?: boolean;\n size?: 'sm' | 'md' | 'lg';\n /** Visible lines before scrolling. Three is the ERP default: an address or a short note. */\n rows?: number;\n /** Grow with the content instead of scrolling. Off by default — see the component note. */\n autoGrow?: boolean;\n /** Ceiling for `autoGrow`, in lines. Beyond it the field scrolls, so a pasted essay\n * cannot push the form's buttons off screen. */\n maxRows?: number;\n fullWidth?: boolean;\n name?: string;\n autoFocus?: boolean;\n className?: string;\n style?: React.CSSProperties;\n textAreaRef?: React.Ref<HTMLTextAreaElement>;\n}\n\n/** Multi-line text entry — notes, addresses, rejection reasons. The prop API is Input's, so a\n * field can be swapped between the two without relearning; labels, descriptions and errors are\n * wired up by React Aria, so no manual aria-describedby is ever needed.\n *\n * `autoGrow` is opt-in, not always-on, for two reasons. It costs a synchronous measure-and-write\n * on every keystroke, and in a dense form it makes every field below the one being typed in jump\n * — the wrong trade in a screen the user is tabbing through. Turn it on where the content length\n * is genuinely unknown (a long free-text comment) and leave it off everywhere else. When on, the\n * height is only written when it actually changed, so a keystroke that does not wrap costs no\n * layout; and the resize grip is removed, since a manual height would be overwritten on the next\n * keystroke anyway. */\nexport function TextArea({ label, description, errorMessage, size = 'md', rows = 3, autoGrow,\n maxRows, fullWidth = true, className, style, textAreaRef, onChange, ...rest }: TextAreaProps) {\n const innerRef = React.useRef<HTMLTextAreaElement>(null);\n const ref = React.useCallback((node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n if (typeof textAreaRef === 'function') textAreaRef(node);\n else if (textAreaRef) (textAreaRef as React.RefObject<HTMLTextAreaElement | null>).current = node;\n }, [textAreaRef]);\n\n // Read from the DOM rather than from `rest.value`: the same measure has to run for the\n // uncontrolled case, where no value ever reaches this component.\n const grow = React.useCallback(() => {\n const el = innerRef.current;\n if (!el || !autoGrow) return;\n const styles = getComputedStyle(el);\n const lineHeight = Number.parseFloat(styles.lineHeight) || Number.parseFloat(styles.fontSize) * 1.5;\n const chrome = el.offsetHeight - el.clientHeight; // borders, which scrollHeight excludes\n // Collapse first: scrollHeight can never report less than the current height, so without\n // this the field would only ever grow, never shrink back when text is deleted.\n el.style.height = 'auto';\n const wanted = maxRows ? Math.min(el.scrollHeight, Math.ceil(lineHeight * maxRows)) : el.scrollHeight;\n const next = `${wanted + chrome}px`;\n // Only write when it changed — a keystroke that does not wrap must not dirty layout.\n if (el.style.height !== next) el.style.height = next;\n }, [autoGrow, maxRows]);\n\n // Layout effect, not an onChange hook: it has to run for controlled values pushed in from the\n // outside (a reset, a loaded record) as well as for typing, and before paint so the field never\n // renders one frame at the wrong height.\n useIsomorphicLayoutEffect(() => {\n if (!autoGrow) {\n if (innerRef.current) innerRef.current.style.height = '';\n return;\n }\n grow();\n }, [autoGrow, grow, rest.value]);\n\n return (\n <TextField className={cx('pire-field', className)} style={style} onChange={onChange}\n validationBehavior=\"aria\" {...rest}>\n {label ? (\n <Label className=\"pire-field-label\">\n {label}{rest.isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </Label>\n ) : null}\n <Group className=\"pire-control\" data-size={size} data-full-width={String(fullWidth)}\n data-multiline=\"true\" data-invalid={rest.isInvalid ? 'true' : undefined}\n data-readonly={rest.isReadOnly ? 'true' : undefined}>\n <AriaTextArea ref={ref} rows={rows} onInput={autoGrow ? grow : undefined}\n className={cx('pire-input', 'pire-textarea')} data-auto-grow={autoGrow ? 'true' : undefined} />\n </Group>\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n </TextField>\n );\n}\n","import type * as React from 'react';\nimport { Select as AriaSelect, Label, Button as AriaButton, SelectValue, Popover, ListBox,\n ListBoxItem, Text, FieldError } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport type SelectOption = string | { value: string; label: string; isDisabled?: boolean };\n\nexport interface SelectProps {\n label?: React.ReactNode;\n value?: string | null;\n defaultValue?: string;\n onChange?: (value: string) => void;\n options?: SelectOption[];\n /** Shown when nothing is selected. */\n placeholder?: string;\n /**\n * Replaces the dictionary's `selectEmpty` inside the popover when `options` is empty. Worth\n * setting whenever you can say *why* the list is empty — \"Pick a company first\" beats the\n * generic default, and an empty reference table is the usual cause.\n */\n emptyLabel?: React.ReactNode;\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isRequired?: boolean;\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n name?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst norm = (o: SelectOption) => (typeof o === 'string' ? { value: o, label: o, isDisabled: false } : o);\n\n/** Single-choice picker. Uses a listbox popover rather than a native <select> so the option\n * rows can carry Pire typography and keyboard behaviour is identical across browsers. */\nexport function Select({ label, value, defaultValue, onChange, options = [], placeholder = 'Select…',\n description, errorMessage, emptyLabel, size = 'md', fullWidth = true, className, style, ...rest }: SelectProps) {\n const msg = usePireMessages();\n const items = options.map(norm);\n return (\n <AriaSelect className={cx('pire-field', className)} style={style} selectedKey={value}\n defaultSelectedKey={defaultValue} onSelectionChange={(k) => onChange?.(String(k))}\n // Without this React Aria refuses to open on an empty collection — `useSelectState.open()`\n // is guarded by `collection.size !== 0 || props.allowsEmptyCollection`. The trigger then\n // swallows the click while staying enabled and reporting aria-expanded=\"false\", so the\n // field reads as broken rather than as empty. That reached users twice as \"the dropdown\n // doesn't work\", both times an unseeded reference table behind a required field.\n allowsEmptyCollection\n placeholder={placeholder} validationBehavior=\"aria\" {...rest}>\n {label ? (\n <Label className=\"pire-field-label\">\n {label}{rest.isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </Label>\n ) : null}\n <AriaButton className=\"pire-control\" data-size={size} data-full-width={String(fullWidth)}\n data-invalid={rest.isInvalid ? 'true' : undefined}>\n <SelectValue className=\"pire-select-value\" />\n <Icon name=\"chevron-down\" size={16} className=\"pire-leading-icon\" />\n </AriaButton>\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n <Popover className=\"pire-popover\">\n <ListBox className=\"pire-listbox\" items={items}\n // Same treatment ComboBox gives a server that answered with nothing, so the two\n // components read alike. Announced, because an empty listbox is otherwise silent.\n renderEmptyState={() => (\n <div className=\"pire-listbox-status\" role=\"status\" aria-live=\"polite\">\n {emptyLabel ?? msg.selectEmpty}\n </div>\n )}>\n {(item) => (\n <ListBoxItem className=\"pire-option\" id={item.value} textValue={item.label} isDisabled={item.isDisabled}>\n {item.label}\n </ListBoxItem>\n )}\n </ListBox>\n </Popover>\n </AriaSelect>\n );\n}\n","import type * as React from 'react';\nimport { Checkbox as AriaCheckbox, type CheckboxProps as AriaCheckboxProps } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { cx } from '../utils/cx';\n\nexport interface CheckboxProps extends Omit<AriaCheckboxProps, 'className' | 'children'> {\n label?: React.ReactNode;\n hint?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n}\n\nexport function Checkbox({ label, hint, children, className, ...rest }: CheckboxProps) {\n return (\n <AriaCheckbox className={cx('pire-choice', className)} {...rest}>\n {({ isSelected, isIndeterminate }) => (\n <>\n <span className=\"pire-choice-box\" aria-hidden=\"true\">\n {isIndeterminate ? <Icon name=\"minus\" size={12} /> : isSelected ? <Icon name=\"check\" size={12} /> : null}\n </span>\n <span>\n {label ?? children}\n {hint ? <span className=\"pire-choice-hint\">{hint}</span> : null}\n </span>\n </>\n )}\n </AriaCheckbox>\n );\n}\n","import type * as React from 'react';\nimport { RadioGroup as AriaRadioGroup, Radio as AriaRadio, Label, Text, FieldError,\n type RadioGroupProps as AriaRadioGroupProps, type RadioProps as AriaRadioProps } from 'react-aria-components';\nimport { cx } from '../utils/cx';\n\nexport interface RadioGroupProps extends Omit<AriaRadioGroupProps, 'className' | 'children'> {\n label?: React.ReactNode;\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n}\n\n/** Radios must live in a group — that is what gives arrow-key navigation and a single tab stop. */\nexport function RadioGroup({ label, description, errorMessage, children, className, ...rest }: RadioGroupProps) {\n return (\n <AriaRadioGroup className={cx('pire-field', className)} validationBehavior=\"aria\" {...rest}>\n {label ? <Label className=\"pire-field-label\">{label}</Label> : null}\n <div className=\"pire-radiogroup\">{children}</div>\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n </AriaRadioGroup>\n );\n}\n\nexport interface RadioProps extends Omit<AriaRadioProps, 'className' | 'children'> {\n label?: React.ReactNode;\n hint?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n}\n\nexport function Radio({ label, hint, children, className, ...rest }: RadioProps) {\n return (\n <AriaRadio className={cx('pire-choice', className)} {...rest}>\n <span className=\"pire-choice-box\" data-radio=\"true\" aria-hidden=\"true\" />\n <span>\n {label ?? children}\n {hint ? <span className=\"pire-choice-hint\">{hint}</span> : null}\n </span>\n </AriaRadio>\n );\n}\n","import type * as React from 'react';\nimport { Switch as AriaSwitch, type SwitchProps as AriaSwitchProps } from 'react-aria-components';\nimport { cx } from '../utils/cx';\n\nexport interface SwitchProps extends Omit<AriaSwitchProps, 'className' | 'children'> {\n label?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n}\n\n/** Immediate-effect toggle. For settings that need a save step, use a Checkbox. */\nexport function Switch({ label, children, className, ...rest }: SwitchProps) {\n return (\n <AriaSwitch className={cx('pire-choice', className)} {...rest}>\n <span className=\"pire-switch-track\" aria-hidden=\"true\"><span className=\"pire-switch-thumb\" /></span>\n <span>{label ?? children}</span>\n </AriaSwitch>\n );\n}\n","import type * as React from 'react';\nimport { ComboBox as AriaComboBox, Label, Input as AriaInput, Button as AriaButton, Group,\n Popover, ListBox, ListBoxItem, Text, FieldError } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface ComboBoxOption { value: string; label: string; secondary?: string; isDisabled?: boolean }\n\nexport interface ComboBoxProps {\n label?: React.ReactNode;\n value?: string | null;\n defaultValue?: string;\n onChange?: (value: string | null) => void;\n /**\n * Free-text as typed, on every keystroke. Debounce it before calling the server.\n *\n * Without `isFilteredExternally`, React Aria also applies its own local \"contains\" filter,\n * so a result whose label does not literally contain the typed text is hidden client-side.\n */\n onInputChange?: (text: string) => void;\n /**\n * The text in the input, controlled. Pair it with `onInputChange` or typing stops working.\n *\n * Needed whenever the parent has to *impose* the text rather than read it: clearing the field\n * on a form reset or a context switch, and rehydrating an edited line whose key is known but\n * whose label is not in `options` until the search comes back. Remounting via `key` also\n * clears the field, but it drops focus.\n */\n inputValue?: string;\n options?: Array<string | ComboBoxOption>;\n /**\n * `options` is the final list and React Aria filters nothing locally. Required for server\n * search: fuzzy matches, synonyms, code-to-description and server ranking do not survive a\n * local \"contains\" pass.\n *\n * Turns `options` into a controlled collection, so the popover reflects exactly what you\n * pass — including an empty list, which is why `isLoading` and `emptyLabel` exist.\n */\n isFilteredExternally?: boolean;\n /**\n * Shows a loading row instead of closing the popover. Without it a 300ms debounce reads as\n * a menu that flickers open and shut.\n *\n * Also blocks selection while it is set: confirming here would commit an item from the\n * previous response.\n */\n isLoading?: boolean;\n /** Overrides the dictionary's `comboBoxLoading`. */\n loadingLabel?: string;\n /**\n * Shown when the server answered with nothing. Without it the popover closes and the user\n * cannot tell a bad query from a slow one.\n */\n emptyLabel?: React.ReactNode;\n /** Called when the list is scrolled near its end, for paginated results. */\n onLoadMore?: () => void;\n placeholder?: string;\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isRequired?: boolean;\n isReadOnly?: boolean;\n /** Allow committing free text that isn't in `options`, instead of reverting to the last valid selection. */\n allowsCustomValue?: boolean;\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n name?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst norm = (o: string | ComboBoxOption): ComboBoxOption =>\n typeof o === 'string' ? { value: o, label: o } : o;\n\n/** Type-ahead picker for lists too long to scroll — material, cost centre, G/L account.\n * Below ~10 fixed options use Select; for master-data search with several columns use ValueHelpField. */\nexport function ComboBox({ label, value, defaultValue, onChange, onInputChange, inputValue, options = [],\n description, errorMessage, size = 'md', fullWidth = true, isFilteredExternally, isLoading,\n loadingLabel, emptyLabel, onLoadMore, className, style, ...rest }: ComboBoxProps) {\n const msg = usePireMessages();\n const items = options.map(norm);\n\n // `items` (controlled) skips React Aria's local filter; `defaultItems` applies it. That single\n // choice is the whole feature — see useComboBoxState, which reads\n // `props.items != null || !defaultFilter ? collection : filterCollection(...)`.\n const collection = isFilteredExternally ? { items } : { defaultItems: items };\n const showsStatus = isLoading || (isFilteredExternally && items.length === 0 && emptyLabel != null);\n\n return (\n <AriaComboBox className={cx('pire-field', className)} style={style} selectedKey={value}\n defaultSelectedKey={defaultValue}\n onSelectionChange={(k) => {\n // Ignore confirmations mid-flight: the highlighted row still belongs to the last response.\n if (isLoading) return;\n onChange?.(k == null ? null : String(k));\n }}\n // Forwarded by name rather than left to `...rest`: it is part of Pire's contract, not an\n // accident of prop spreading, and a consumer should not have to know it reaches React Aria.\n inputValue={inputValue} onInputChange={onInputChange} {...collection}\n // Always true under external filtering, not just while a status row shows. Gating it on\n // showsStatus closes the popover at the moment results land, because the flag flips false\n // in the same render the collection fills.\n allowsEmptyCollection={isFilteredExternally || isLoading}\n menuTrigger=\"input\" validationBehavior=\"aria\" {...rest}>\n {label ? (\n <Label className=\"pire-field-label\">\n {label}{rest.isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </Label>\n ) : null}\n <Group className=\"pire-control\" data-size={size} data-full-width={String(fullWidth)}\n data-invalid={rest.isInvalid ? 'true' : undefined}>\n <Icon name=\"search\" size={16} className=\"pire-leading-icon\" />\n <AriaInput className=\"pire-input\" placeholder={rest.placeholder} />\n <AriaButton className=\"pire-iconbtn\" data-size=\"sm\" aria-label={msg.comboBoxShowSuggestions} style={{ width: 20, height: 20 }}>\n <Icon name=\"chevron-down\" size={16} />\n </AriaButton>\n </Group>\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n <Popover className=\"pire-popover\">\n <ListBox className=\"pire-listbox\"\n onScroll={onLoadMore ? (e) => {\n // Fires on scroll rather than on an intersection observer so nothing is added below\n // the virtual focus while the user is still moving through the list.\n const el = e.currentTarget;\n if (el.scrollHeight - el.scrollTop - el.clientHeight < 48) onLoadMore();\n } : undefined}\n // React Aria strips aria-busy from ListBox, so this live region is the whole\n // announcement: without it a screen-reader user gets silence while the request is in\n // flight and cannot tell pending from empty.\n renderEmptyState={showsStatus ? () => (\n <div className=\"pire-listbox-status\" role=\"status\" aria-live=\"polite\">\n {isLoading ? (loadingLabel ?? msg.comboBoxLoading) : emptyLabel}\n </div>\n ) : undefined}>\n {(item: ComboBoxOption) => (\n <ListBoxItem className=\"pire-option\" id={item.value} textValue={item.label} isDisabled={item.isDisabled}>\n <span className=\"pire-option-label\">{item.label}</span>\n {item.secondary ? <span className=\"pire-option-secondary\">{item.secondary}</span> : null}\n </ListBoxItem>\n )}\n </ListBox>\n </Popover>\n </AriaComboBox>\n );\n}\n","import * as React from 'react';\nimport { ComboBox as AriaComboBox, Label, Input as AriaInput, Button as AriaButton, ButtonContext,\n Group, Popover, ListBox, ListBoxItem, Text, FieldError, VisuallyHidden } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { Tag } from '../core/Tag';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\nimport type { ComboBoxOption } from './ComboBox';\n\nexport interface MultiComboBoxProps {\n label?: React.ReactNode;\n /** Selected values, in the order they were picked. */\n value?: string[];\n defaultValue?: string[];\n onChange?: (values: string[]) => void;\n /**\n * Free-text as typed, on every keystroke. Debounce it before calling the server.\n *\n * Without `isFilteredExternally`, React Aria also applies its own local \"contains\" filter,\n * so a result whose label does not literally contain the typed text is hidden client-side.\n */\n onInputChange?: (text: string) => void;\n options?: Array<string | ComboBoxOption>;\n /**\n * `options` is the final list and React Aria filters nothing locally. Same meaning and same\n * name as on `ComboBox`. Required for server search, where fuzzy matches, synonyms and\n * server ranking do not survive a local \"contains\" pass.\n */\n isFilteredExternally?: boolean;\n /** Shows a loading row instead of closing the popover, and blocks selection while set. */\n isLoading?: boolean;\n /** Overrides the dictionary's `comboBoxLoading`. */\n loadingLabel?: string;\n /** Shown when the server answered with nothing, so a bad query reads differently from a slow one. */\n emptyLabel?: React.ReactNode;\n /** Called when the list is scrolled near its end, for paginated results. */\n onLoadMore?: () => void;\n placeholder?: string;\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isRequired?: boolean;\n isReadOnly?: boolean;\n /** Let Enter commit text that is not in `options` — how product tags get coined. */\n allowsCustomValue?: boolean;\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n name?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst norm = (o: string | ComboBoxOption): ComboBoxOption =>\n typeof o === 'string' ? { value: o, label: o } : o;\n\n/** Multi-value type-ahead: pick several options, each shown as a removable chip, and — with\n * `allowsCustomValue` — coin new ones by typing. Product tags, cost-centre sets, watchers.\n *\n * A separate component rather than a mode on ComboBox: ComboBox's `value` is a `string | null`\n * and its `onChange` emits one key, while multi-select needs an array on both. Folding the two\n * together would put a discriminated union in front of every existing consumer of\n * `ComboBoxProps` — a breaking change in exchange for a purely additive feature.\n *\n * Three things worth knowing before you use it:\n *\n * - **Free text commits on Enter, never on blur.** React Aria treats the input text as\n * independent of the selection in multi-select mode, so leaving the field discards whatever\n * was typed but not committed. The chips are the only record of what was entered.\n * - **Backspace on an empty input removes the last chip.** The handler runs in the capture\n * phase because React Aria's own key handling sits on the same input and would otherwise act\n * on the same key.\n * - **The chips are plain `Tag`s, not a React Aria TagGroup.** React Aria's ComboBox builds its\n * listbox collection by shallow-rendering its entire subtree, which swallows any collection\n * component nested inside it — a TagGroup there registers its tags as listbox items and then\n * crashes looking for grid state. Each chip's remove button is an ordinary Tab stop instead,\n * and removals are announced through the live region below. */\nexport function MultiComboBox({ label, value, defaultValue, onChange, onInputChange, options = [],\n description, errorMessage, allowsCustomValue, size = 'md',\n isFilteredExternally, isLoading, loadingLabel, emptyLabel, onLoadMore,\n fullWidth = true, className, style, ...rest }: MultiComboBoxProps) {\n const msg = usePireMessages();\n const items = React.useMemo(() => options.map(norm), [options]);\n // `items` (controlled) skips React Aria's local filter; `defaultItems` applies it.\n const collection = isFilteredExternally ? { items } : { defaultItems: items };\n const showsStatus = isLoading || (isFilteredExternally && items.length === 0 && emptyLabel != null);\n const [uncontrolled, setUncontrolled] = React.useState<string[]>(defaultValue ?? []);\n const [announcement, setAnnouncement] = React.useState('');\n const inputRef = React.useRef<HTMLInputElement>(null);\n const raw = value ?? uncontrolled;\n\n // React Aria compares the value array by reference on every render to decide whether the\n // selection changed — and, when it thinks it did, clears the input. An inline `value={['a']}`\n // is a fresh array every render, which would wipe the text mid-typing, so identity here\n // follows the contents rather than the caller's literal.\n const contentKey = raw.join('\\u0000');\n // biome-ignore lint/correctness/useExhaustiveDependencies: keyed on contents by design — see above.\n const values = React.useMemo(() => raw, [contentKey]);\n\n const labelOf = (v: string) => items.find((o) => o.value === v)?.label ?? v;\n /* A read-only field still lists its chips, but nothing about it may be edited — neither by the\n remove buttons nor by Backspace, neither of which the input's readonly attribute covers. */\n const isEditable = !rest.isDisabled && !rest.isReadOnly;\n\n const commit = (next: string[]) => {\n /* Removing a chip is the only change a screen reader cannot infer from somewhere else: the\n listbox announces its own selected state, but a chip that disappears — by button or by\n Backspace — is silent otherwise. */\n const added = next.find((v) => !values.includes(v));\n const removed = values.find((v) => !next.includes(v));\n if (added) setAnnouncement(`${labelOf(added)} added. ${next.length} selected.`);\n else if (removed) setAnnouncement(`${labelOf(removed)} removed. ${next.length} selected.`);\n if (value === undefined) setUncontrolled(next);\n onChange?.(next);\n };\n\n const remove = (v: string) => {\n commit(values.filter((x) => x !== v));\n // The pressed button is about to unmount, and focus would fall to <body> with it.\n inputRef.current?.focus();\n };\n\n /* Capture phase: React Aria's input keydown handler is on the same element, and a bubble-phase\n handler cannot stop it from also acting on the key. */\n const onKeyDownCapture = (e: React.KeyboardEvent<HTMLInputElement>) => {\n const el = e.currentTarget;\n if (!isEditable) return;\n if (e.key === 'Backspace' && el.value === '' && values.length > 0) {\n e.preventDefault();\n e.stopPropagation();\n commit(values.slice(0, -1));\n return;\n }\n if (e.key !== 'Enter' || !allowsCustomValue) return;\n const text = el.value.trim();\n // An option is highlighted — this Enter belongs to React Aria, which will select it.\n if (text === '' || el.getAttribute('aria-activedescendant')) return;\n // Typing an option's label in full must resolve to that option, not coin a duplicate under a\n // different key — otherwise \"Fragile\" typed and \"Fragile\" clicked are two chips on one record.\n const match = items.find((o) => o.label.toLowerCase() === text.toLowerCase());\n const next = match ? match.value : text;\n e.preventDefault();\n e.stopPropagation();\n if (!values.includes(next)) commit([...values, next]);\n };\n\n return (\n <AriaComboBox className={cx('pire-field', className)} style={style} selectionMode=\"multiple\"\n value={values} onChange={(keys) => { if (!isLoading) commit(keys.map(String)); }}\n onInputChange={onInputChange} {...collection}\n // Always true under external filtering: gating on showsStatus closes the popover at the\n // moment results land, because the flag flips false as the collection fills.\n allowsEmptyCollection={isFilteredExternally || isLoading}\n menuTrigger=\"input\" validationBehavior=\"aria\" {...rest}>\n {label ? (\n <Label className=\"pire-field-label\">\n {label}{rest.isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </Label>\n ) : null}\n <Group className=\"pire-control\" data-size={size} data-full-width={String(fullWidth)}\n data-multiline=\"true\" data-invalid={rest.isInvalid ? 'true' : undefined}\n data-readonly={rest.isReadOnly ? 'true' : undefined}>\n <Icon name=\"search\" size={16} className=\"pire-leading-icon\" />\n <div className=\"pire-chipfield\">\n {/* React Aria's ComboBox publishes its trigger-button props through ButtonContext, and\n every Button under it — including each chip's remove button — picks them up: the\n trigger's id (duplicated three ways), aria-haspopup, an aria-labelledby that\n outranks the chip's own label, and tabindex=\"-1\", which takes the chips out of the\n keyboard order entirely. Clearing the context is React Aria's own idiom for this\n (see how Popover clears contexts on the way into an overlay). */}\n <ButtonContext.Provider value={null}>\n {values.map((v) => (\n /* Disabled follows the field, not `isEditable`: a read-only field's chips are\n real, current values and should read as such — they simply lose the × . */\n <Tag key={v} isDisabled={rest.isDisabled} onRemove={isEditable ? () => remove(v) : undefined}>\n {labelOf(v)}\n </Tag>\n ))}\n </ButtonContext.Provider>\n <AriaInput ref={inputRef} className={cx('pire-input', 'pire-chipinput')}\n placeholder={rest.placeholder} onKeyDownCapture={onKeyDownCapture} />\n </div>\n <AriaButton className=\"pire-iconbtn\" data-size=\"sm\" aria-label={msg.comboBoxShowSuggestions} style={{ width: 20, height: 20 }}>\n <Icon name=\"chevron-down\" size={16} />\n </AriaButton>\n </Group>\n <VisuallyHidden><span aria-live=\"polite\">{announcement}</span></VisuallyHidden>\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n <Popover className=\"pire-popover\">\n <ListBox className=\"pire-listbox\"\n onScroll={onLoadMore ? (e) => {\n const el = e.currentTarget;\n if (el.scrollHeight - el.scrollTop - el.clientHeight < 48) onLoadMore();\n } : undefined}\n // React Aria strips aria-busy from ListBox, so this live region is the whole\n // announcement: without it a screen-reader user gets silence while the request is in\n // flight and cannot tell pending from empty.\n renderEmptyState={showsStatus ? () => (\n <div className=\"pire-listbox-status\" role=\"status\" aria-live=\"polite\">\n {isLoading ? (loadingLabel ?? msg.comboBoxLoading) : emptyLabel}\n </div>\n ) : undefined}>\n {(item: ComboBoxOption) => (\n <ListBoxItem className=\"pire-option\" id={item.value} textValue={item.label} isDisabled={item.isDisabled}>\n <span className=\"pire-option-label\">{item.label}</span>\n {item.secondary ? <span className=\"pire-option-secondary\">{item.secondary}</span> : null}\n </ListBoxItem>\n )}\n </ListBox>\n </Popover>\n </AriaComboBox>\n );\n}\n","import type * as React from 'react';\nimport { NumberField as AriaNumberField, Label, Input as AriaInput, Group, Button as AriaButton,\n Text, FieldError } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface NumberFieldProps {\n label?: React.ReactNode;\n /** Accessible name when `label` is omitted — e.g. in a table cell where the column header\n * already carries the visible text. A field with neither is unnamed and fails axe. */\n 'aria-label'?: string;\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n minValue?: number;\n maxValue?: number;\n step?: number;\n /** Intl.NumberFormat options — currency, unit, decimals. Locale comes from the app's I18nProvider. */\n formatOptions?: Intl.NumberFormatOptions;\n /** Trailing unit shown after the figure: EA, KG, %. */\n suffix?: React.ReactNode;\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isReadOnly?: boolean;\n isRequired?: boolean;\n /** Hide the increment/decrement buttons — typical inside dense table cells. */\n hideStepper?: boolean;\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n name?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Quantities, prices and any figure the user edits. Always right-aligned tabular mono, with\n * arrow-key and scroll stepping supplied by React Aria. */\nexport function NumberField({ label, suffix, description, errorMessage, hideStepper, size = 'md',\n fullWidth = true, className, style, ...rest }: NumberFieldProps) {\n const msg = usePireMessages();\n return (\n <AriaNumberField className={cx('pire-field', className)} style={style} validationBehavior=\"aria\" {...rest}>\n {label ? (\n <Label className=\"pire-field-label\">\n {label}{rest.isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </Label>\n ) : null}\n <Group className=\"pire-control\" data-size={size} data-full-width={String(fullWidth)}\n data-invalid={rest.isInvalid ? 'true' : undefined} data-readonly={rest.isReadOnly ? 'true' : undefined}>\n <AriaInput className=\"pire-input\" data-numeric=\"true\" />\n {suffix ? <span className=\"pire-affix\">{suffix}</span> : null}\n {hideStepper ? null : (\n <span className=\"pire-stepper\">\n <AriaButton slot=\"increment\" className=\"pire-stepper-btn\" aria-label={msg.numberFieldIncrease}><Icon name=\"plus\" size={10} /></AriaButton>\n <AriaButton slot=\"decrement\" className=\"pire-stepper-btn\" aria-label={msg.numberFieldDecrease}><Icon name=\"minus\" size={10} /></AriaButton>\n </span>\n )}\n </Group>\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n </AriaNumberField>\n );\n}\n","import type * as React from 'react';\nimport { DatePicker as AriaDatePicker, Label, Group, DateInput, DateSegment, Button as AriaButton,\n Popover, Dialog as AriaDialog, Calendar, CalendarGrid, CalendarGridHeader, CalendarHeaderCell,\n CalendarGridBody, CalendarCell, Heading, Text, FieldError } from 'react-aria-components';\nimport type { DateValue } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface DatePickerProps {\n label?: React.ReactNode;\n value?: DateValue | null;\n defaultValue?: DateValue | null;\n onChange?: (value: DateValue | null) => void;\n minValue?: DateValue;\n maxValue?: DateValue;\n /** Return true for dates that cannot be picked — factory calendar, blocked periods. */\n isDateUnavailable?: (date: DateValue) => boolean;\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isReadOnly?: boolean;\n isRequired?: boolean;\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n name?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Date entry with a segmented field and a calendar popover. Segments follow the user's locale,\n * so a German user types dd.mm.yyyy without any prop change. Wrap the app in React Aria's\n * I18nProvider to pin a locale. */\nexport function DatePicker({ label, description, errorMessage, size = 'md', fullWidth = true,\n className, style, ...rest }: DatePickerProps) {\n const msg = usePireMessages();\n return (\n <AriaDatePicker className={cx('pire-field', className)} style={style} validationBehavior=\"aria\" {...rest}>\n {label ? (\n <Label className=\"pire-field-label\">\n {label}{rest.isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </Label>\n ) : null}\n <Group className=\"pire-control\" data-size={size} data-full-width={String(fullWidth)}\n data-invalid={rest.isInvalid ? 'true' : undefined} data-readonly={rest.isReadOnly ? 'true' : undefined}>\n <DateInput className=\"pire-datefield\">\n {(segment) => <DateSegment segment={segment} className=\"pire-datesegment\" />}\n </DateInput>\n <AriaButton className=\"pire-iconbtn\" data-size=\"sm\" aria-label={msg.datePickerOpenCalendar} style={{ width: 24, height: 24 }}>\n <Icon name=\"calendar\" size={16} />\n </AriaButton>\n </Group>\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n <Popover className=\"pire-popover\">\n <AriaDialog>\n <Calendar className=\"pire-calendar\">\n <header className=\"pire-calendar-head\">\n <AriaButton slot=\"previous\" className=\"pire-iconbtn\" data-size=\"sm\" aria-label={msg.datePickerPreviousMonth}>\n <Icon name=\"chevron-left\" size={16} />\n </AriaButton>\n <Heading className=\"pire-calendar-title\" />\n <AriaButton slot=\"next\" className=\"pire-iconbtn\" data-size=\"sm\" aria-label={msg.datePickerNextMonth}>\n <Icon name=\"chevron-right\" size={16} />\n </AriaButton>\n </header>\n <CalendarGrid className=\"pire-calendar-grid\">\n <CalendarGridHeader>\n {(day) => <CalendarHeaderCell>{day}</CalendarHeaderCell>}\n </CalendarGridHeader>\n <CalendarGridBody>\n {(date) => <CalendarCell date={date} className=\"pire-calendar-cell\" />}\n </CalendarGridBody>\n </CalendarGrid>\n </Calendar>\n </AriaDialog>\n </Popover>\n </AriaDatePicker>\n );\n}\n","import type * as React from 'react';\nimport {\n DateRangePicker as AriaDateRangePicker, Label, Group, DateInput, DateSegment,\n Button as AriaButton, Popover, Dialog as AriaDialog, RangeCalendar, CalendarGrid,\n CalendarGridHeader, CalendarHeaderCell, CalendarGridBody, CalendarCell, Heading, Text, FieldError,\n} from 'react-aria-components';\nimport type { DateValue } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface DateRange {\n start: DateValue;\n end: DateValue;\n}\n\nexport interface DateRangePreset {\n id: string;\n label: string;\n /** The app computes the range: Pire cannot know when a customer's fiscal year starts. */\n range: () => DateRange;\n}\n\nexport interface DateRangePickerProps {\n label?: React.ReactNode;\n value?: DateRange | null;\n defaultValue?: DateRange | null;\n onChange?: (value: DateRange | null) => void;\n minValue?: DateValue;\n maxValue?: DateValue;\n /** Return true for dates that cannot be picked — blocked periods, closed books. */\n isDateUnavailable?: (date: DateValue) => boolean;\n /**\n * Longest range the caller accepts, in days. Exceeding it marks the field invalid so\n * `errorMessage` shows — the wording is the app's, since only it knows the limit's reason.\n *\n * Days rather than a duration: \"12 months\" is not a fixed number of days, so pick the bound\n * that matches your rule rather than expecting a calendar-aware one.\n */\n maxRangeDays?: number;\n /** Shortcuts beside the calendar: \"This month\", \"Last 30 days\". */\n presets?: DateRangePreset[];\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isReadOnly?: boolean;\n isRequired?: boolean;\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n /** HTML submit names for the two ends. */\n startName?: string;\n endName?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Whole days between the two ends, inclusive of both. */\nexport function rangeLengthInDays(range: DateRange): number {\n return range.end.toDate('UTC').getTime() / 86_400_000\n - range.start.toDate('UTC').getTime() / 86_400_000 + 1;\n}\n\n/**\n * Two dates that belong together — the default filter on 24 ERP screens.\n *\n * Built on React Aria's `DateRangePicker`, which supplies the segmented ends, the ordering rules\n * between them, and locale-driven segment order. Wrap the app in `I18nProvider` to pin a locale:\n * `es-PY` reads dd/mm/yyyy and `en-US` mm/dd/yyyy off the same value.\n */\nexport function DateRangePicker({\n label, description, errorMessage, maxRangeDays, presets, size = 'md', fullWidth = true,\n startName, endName, className, style, ...rest\n}: DateRangePickerProps) {\n const msg = usePireMessages();\n const current = rest.value ?? rest.defaultValue ?? null;\n const tooLong = maxRangeDays != null && current != null\n && rangeLengthInDays(current) > maxRangeDays;\n\n return (\n <AriaDateRangePicker\n className={cx('pire-field', className)} style={style}\n startName={startName} endName={endName}\n validationBehavior=\"aria\"\n {...rest}\n isInvalid={rest.isInvalid || tooLong}\n >\n {label ? (\n <Label className=\"pire-field-label\">\n {label}{rest.isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </Label>\n ) : null}\n\n <Group className=\"pire-control pire-daterange-control\" data-size={size}\n data-full-width={String(fullWidth)}\n data-invalid={rest.isInvalid || tooLong ? 'true' : undefined}\n data-readonly={rest.isReadOnly ? 'true' : undefined}>\n {/* Two independent segment groups, each named by React Aria. Do not collapse them under a\n single aria-label: a screen reader then cannot say which end it is editing. */}\n <DateInput slot=\"start\" className=\"pire-datefield\">\n {(segment) => <DateSegment segment={segment} className=\"pire-datesegment\" />}\n </DateInput>\n <span aria-hidden=\"true\" className=\"pire-daterange-dash\">–</span>\n <DateInput slot=\"end\" className=\"pire-datefield\">\n {(segment) => <DateSegment segment={segment} className=\"pire-datesegment\" />}\n </DateInput>\n <AriaButton className=\"pire-iconbtn\" data-size=\"sm\" aria-label={msg.datePickerOpenCalendar}\n style={{ width: 24, height: 24 }}>\n <Icon name=\"calendar\" size={16} />\n </AriaButton>\n </Group>\n\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n <FieldError className=\"pire-field-error\">{errorMessage}</FieldError>\n\n <Popover className=\"pire-popover\">\n <AriaDialog className=\"pire-daterange-dialog\">\n {presets?.length ? (\n // Before the calendar in the DOM, so keyboard users reach the shortcut without\n // arrowing through a month first.\n <div className=\"pire-daterange-presets\" role=\"group\" aria-label={msg.dateRangePresetsLabel}>\n {presets.map((preset) => (\n <AriaButton key={preset.id} className=\"pire-daterange-preset\"\n onPress={() => rest.onChange?.(preset.range())}>\n {preset.label}\n </AriaButton>\n ))}\n </div>\n ) : null}\n <RangeCalendar className=\"pire-calendar\">\n <header className=\"pire-calendar-head\">\n <AriaButton slot=\"previous\" className=\"pire-iconbtn\" data-size=\"sm\"\n aria-label={msg.datePickerPreviousMonth}>\n <Icon name=\"chevron-left\" size={16} />\n </AriaButton>\n <Heading className=\"pire-calendar-title\" />\n <AriaButton slot=\"next\" className=\"pire-iconbtn\" data-size=\"sm\"\n aria-label={msg.datePickerNextMonth}>\n <Icon name=\"chevron-right\" size={16} />\n </AriaButton>\n </header>\n <CalendarGrid className=\"pire-calendar-grid\">\n <CalendarGridHeader>\n {(day) => <CalendarHeaderCell>{day}</CalendarHeaderCell>}\n </CalendarGridHeader>\n <CalendarGridBody>\n {(date) => <CalendarCell date={date} className=\"pire-calendar-cell\" />}\n </CalendarGridBody>\n </CalendarGrid>\n </RangeCalendar>\n </AriaDialog>\n </Popover>\n </AriaDateRangePicker>\n );\n}\n","import * as React from 'react';\nimport { Input } from './Input';\nimport { IconButton } from '../core/IconButton';\nimport { ValueHelpDialog } from '../patterns/ValueHelpDialog';\nimport type { DataTableColumn } from '../data/DataTable';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface ValueHelpFieldProps<T extends { id: string | number } = any> {\n label?: React.ReactNode;\n /** The picked record, or null. */\n value?: T | null;\n onChange?: (row: T | null) => void;\n /** How the picked record reads in the closed field. Default: \"id — name\". */\n format?: (row: T) => string;\n /** Records offered in the dialog, and the columns that identify them. */\n rows?: T[];\n columns?: DataTableColumn<T>[];\n dialogTitle?: React.ReactNode;\n /**\n * Forwarded to {@link ValueHelpDialog}. Set `isFilteredExternally` and feed `rows` from\n * `onSearch` when the list is too large to sit in the browser — which is the usual case for\n * suppliers, customers and products.\n */\n onSearch?: (query: string) => void;\n isFilteredExternally?: boolean;\n isLoading?: boolean;\n onLoadMore?: () => void;\n /** Shown in the dialog when the search returns nothing. */\n emptyLabel?: string;\n placeholder?: string;\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isRequired?: boolean;\n /** Provide to render a clear affordance once a record is picked. */\n allowsClear?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Falls back to \"<id> — <human label>\", probing the usual master-data label fields in order. */\nconst defaultFormat = (row: { id: string | number; [field: string]: unknown }) =>\n [row.id, row.name ?? row.label ?? row.text].filter(Boolean).join(' — ');\n\n/** The ERP field that cannot be typed: a read-only display of the picked master-data record plus\n * the value-help trigger. Pairs Input with ValueHelpDialog so screens stop rewiring both. */\nexport function ValueHelpField<T extends { id: string | number }>({ label, value, onChange, format = defaultFormat,\n rows = [], columns = [], dialogTitle, onSearch, isFilteredExternally, isLoading, onLoadMore,\n emptyLabel, placeholder, description, errorMessage,\n isInvalid, isDisabled, isRequired, allowsClear, className, style }: ValueHelpFieldProps<T>) {\n const msg = usePireMessages();\n const [open, setOpen] = React.useState(false);\n return (\n <div className={cx(className)} style={style}>\n {/* The triggers live inside the field's control rather than beside it. As siblings of Input\n they aligned to the bottom of the whole field — label, control *and* description — so any\n field with a description pushed them below the input. Inside the control they align to\n the input row by construction, at any size and however long the description runs, and the\n three read as one control instead of a field with two boxes parked next to it.\n Input keeps ownership of description and errorMessage, so React Aria's aria-describedby\n wiring is untouched; moving them out to fix the layout would have cost that. */}\n <Input label={label} isReadOnly isInvalid={isInvalid} isDisabled={isDisabled} isRequired={isRequired}\n value={value ? format(value) : ''} placeholder={placeholder ?? msg.valueHelpFieldPlaceholder}\n description={description} errorMessage={errorMessage}\n suffix={\n <span className=\"pire-valuehelp-actions\">\n {allowsClear && value ? (\n <IconButton icon=\"x\" label={msg.valueHelpFieldClear} isDisabled={isDisabled}\n onPress={() => onChange?.(null)} />\n ) : null}\n <IconButton icon=\"search\" label={typeof label === 'string'\n ? msg.valueHelpFieldOpenNamed.replace('{label}', label.toLowerCase())\n : msg.valueHelpFieldOpen}\n isDisabled={isDisabled} onPress={() => setOpen(true)} />\n </span>\n } />\n <ValueHelpDialog isOpen={open} onClose={() => setOpen(false)} title={dialogTitle ?? label}\n columns={columns} rows={rows} onSearch={onSearch} isFilteredExternally={isFilteredExternally}\n isLoading={isLoading} onLoadMore={onLoadMore} emptyLabel={emptyLabel}\n onSelect={(row) => onChange?.(row)} />\n </div>\n );\n}\n","import * as React from 'react';\nimport { Dialog } from '../feedback/Dialog';\nimport { Input } from '../forms/Input';\nimport { DataTable, type DataTableColumn } from '../data/DataTable';\nimport { Button } from '../core/Button';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\n\nexport interface ValueHelpDialogProps<T extends { id: string | number } = any> {\n isOpen?: boolean;\n title?: React.ReactNode;\n /** Show 2–4 identifying columns, not just the key. */\n columns?: DataTableColumn<T>[];\n rows?: T[];\n searchPlaceholder?: string;\n emptyLabel?: string;\n /**\n * The query on every keystroke. **Debounce before calling the server.**\n *\n * On its own this only observes; it does not change how `rows` is treated. Pair it with\n * `isFilteredExternally` to actually hand filtering to the server.\n */\n onSearch?: (query: string) => void;\n /**\n * `rows` is the final list and the dialog filters nothing locally. Required for server search:\n * fuzzy matches, synonyms, code-to-description and server ranking do not survive a local\n * \"contains\" pass over the fields that happen to be in the row.\n *\n * Named to match `ComboBox`, deliberately. The same idea under two names is worse than either\n * name — the ERP's supplier, customer, product and purchase-order pickers all need this, and\n * they already know the ComboBox spelling.\n */\n isFilteredExternally?: boolean;\n /** Keeps the table's skeleton up instead of showing \"no records\" while a request is in flight. */\n isLoading?: boolean;\n /** Called when the table is scrolled near its end, for paginated results. */\n onLoadMore?: () => void;\n /** Receives the picked row. */\n onSelect?: (row: T) => void;\n onClose?: () => void;\n}\n\n/** The ERP value help: search a master-data list and pick one record back into a field. */\nexport function ValueHelpDialog<T extends { id: string | number }>({ isOpen, title,\n columns = [], rows = [], searchPlaceholder, emptyLabel, onSearch, isFilteredExternally,\n isLoading, onLoadMore, onSelect, onClose }: ValueHelpDialogProps<T>) {\n const msg = usePireMessages();\n const [query, setQuery] = React.useState('');\n React.useEffect(() => { if (isOpen) setQuery(''); }, [isOpen]);\n\n const filtered = React.useMemo(() => {\n // Under external filtering `rows` is already the answer. Filtering it again is not merely\n // redundant: it drops every match the server made on something the row does not contain.\n if (isFilteredExternally) return rows;\n const q = query.trim().toLowerCase();\n if (!q) return rows;\n return rows.filter((row) => Object.values(row).some((v) => String(v).toLowerCase().includes(q)));\n }, [rows, query, isFilteredExternally]);\n\n const handleSearch = (value: string) => { setQuery(value); onSearch?.(value); };\n\n return (\n <Dialog isOpen={isOpen} size=\"lg\" title={title ?? msg.valueHelpDialogTitle} onClose={onClose}\n footer={<Button variant=\"tertiary\" onPress={onClose}>{msg.valueHelpDialogCancel}</Button>}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--sp-3)' }}>\n <Input aria-label={msg.valueHelpDialogSearch} icon=\"search\" type=\"search\" value={query}\n onChange={handleSearch} isClearable\n placeholder={searchPlaceholder ?? msg.valueHelpDialogSearchPlaceholder} autoFocus />\n <div onScroll={onLoadMore ? (event) => {\n const el = event.currentTarget;\n if (el.scrollHeight - el.scrollTop - el.clientHeight < 64) onLoadMore();\n } : undefined} style={{ overflow: 'auto', maxHeight: '48vh' }}>\n <DataTable aria-label={typeof title === 'string' ? title : msg.valueHelpDialogTitle}\n density=\"condensed\" columns={columns} rows={filtered} isLoading={isLoading}\n emptyLabel={emptyLabel ?? msg.valueHelpDialogEmpty}\n onRowAction={(row) => { onSelect?.(row); onClose?.(); }} />\n </div>\n </div>\n </Dialog>\n );\n}\n","import * as React from 'react';\nimport { ModalOverlay, Modal, Dialog as AriaDialog, Heading } from 'react-aria-components';\nimport { IconButton } from '../core/IconButton';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface DialogSlotProps {\n children?: React.ReactNode;\n className?: string;\n}\n\n/** The dialog's heading. Wires itself to the dialog's accessible name through React Aria's\n * `slot=\"title\"`, which is why it cannot be replaced by a bare heading element. */\nexport function DialogTitle({ children, className }: DialogSlotProps) {\n return <Heading slot=\"title\" className={cx('pire-dialog-title', className)}>{children}</Heading>;\n}\n\n/** One line under the title. Say what the action affects, not what the button is called. */\nexport function DialogDescription({ children, className }: DialogSlotProps) {\n return <p className={cx('pire-dialog-sub', className)} style={{ margin: 0 }}>{children}</p>;\n}\n\n/** The scrollable middle. Omit it entirely when the title and description say everything. */\nexport function DialogBody({ children, className }: DialogSlotProps) {\n return <div className={cx('pire-dialog-body', className)}>{children}</div>;\n}\n\n/** The action row. Cancel first, the commit or destructive action last. */\nexport function DialogActions({ children, className }: DialogSlotProps) {\n return <footer className={cx('pire-dialog-foot', className)}>{children}</footer>;\n}\n\nexport interface DialogProps {\n isOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n children?: React.ReactNode;\n /** Right-aligned actions: cancel first, primary or danger last. */\n footer?: React.ReactNode;\n onClose?: () => void;\n /** sm = confirm, md = edit form, lg = value help / table picker. */\n size?: 'sm' | 'md' | 'lg';\n /** Blocks dismiss on outside click / Esc — use only when data would be lost silently. */\n isDismissable?: boolean;\n showClose?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Modal dialog. Focus is trapped, the page behind is inert, and Esc closes unless\n * isDismissable is false — all handled by React Aria. */\nexport function Dialog({ isOpen, onOpenChange, title, subtitle, children, footer, onClose,\n size = 'md', isDismissable = true, showClose = true, className, style }: DialogProps) {\n const msg = usePireMessages();\n const close = () => { onClose?.(); onOpenChange?.(false); };\n\n /**\n * Both APIs are supported at once. The props form (`title`, `subtitle`, `footer`) is harder to\n * misuse and stays the default; the sub-components exist so a composed dialog can be written the\n * way it reads, and so a migration can change imports before it changes structure.\n *\n * Slots are hoisted rather than rendered where they sit, because the title and description belong\n * inside the header alongside the close button — a caller should not have to know that. Anything\n * that is not a slot falls through to the body, so mixing prose with a `DialogActions` works.\n */\n const parts = React.Children.toArray(children);\n const slotOf = (type: React.ElementType) =>\n parts.find((node) => React.isValidElement(node) && node.type === type);\n const titleSlot = slotOf(DialogTitle);\n const descriptionSlot = slotOf(DialogDescription);\n const bodySlot = slotOf(DialogBody);\n const actionsSlot = slotOf(DialogActions);\n const slots = [titleSlot, descriptionSlot, bodySlot, actionsSlot];\n const loose = parts.filter((node) => !slots.includes(node));\n\n // A slot always wins over the matching prop: passing both is a mistake, and the more specific\n // one is the better guess at intent.\n const heading = titleSlot\n ?? (title ? <Heading slot=\"title\" className=\"pire-dialog-title\">{title}</Heading> : null);\n const description = descriptionSlot\n ?? (subtitle ? <p className=\"pire-dialog-sub\" style={{ margin: 0 }}>{subtitle}</p> : null);\n const actions = actionsSlot\n ?? (footer ? <footer className=\"pire-dialog-foot\">{footer}</footer> : null);\n // The body keeps its conditional: it carries --sp-5 of padding, so rendering it empty leaves a\n // ~40px band between the description and the buttons. A confirmation that says everything in its\n // title and description is the normal case, not an edge one.\n const body = bodySlot ?? (loose.length ? <div className=\"pire-dialog-body\">{loose}</div> : null);\n\n return (\n <ModalOverlay className=\"pire-modal-overlay\" isOpen={isOpen} isDismissable={isDismissable}\n onOpenChange={(o) => { if (!o) close(); }}>\n <Modal className={cx('pire-modal', className)} data-size={size} style={style}>\n <AriaDialog className=\"pire-dialog\">\n {heading || description ? (\n <header className=\"pire-dialog-head\">\n <div style={{ flex: 1, minWidth: 0 }}>\n {heading}\n {description}\n </div>\n {showClose ? <IconButton icon=\"x\" label={msg.dialogClose} size=\"sm\" onPress={close} /> : null}\n </header>\n ) : null}\n {body}\n {actions}\n </AriaDialog>\n </Modal>\n </ModalOverlay>\n );\n}\n","import type * as React from 'react';\nimport { Table, TableHeader, TableBody, TableFooter, Column, Row, Cell, type Selection,\n type SortDescriptor } from 'react-aria-components';\nimport { Checkbox } from '../forms/Checkbox';\nimport { Icon } from '../core/Icon';\nimport { SkeletonTableRow } from '../feedback/Skeleton';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface DataTableColumn<T = any> {\n key: string;\n label: string;\n align?: 'left' | 'right' | 'center';\n width?: number | string;\n /** Right-aligns and switches to tabular mono. Use for every amount, quantity and ID. */\n numeric?: boolean;\n sortable?: boolean;\n /**\n * Keeps `label` for assistive tech but not on screen. For a utility column — a disclosure or\n * row-action column — where a visible header is noise. An *empty* label is not the answer: a\n * header with no text leaves its column unnamed for anyone using a screen reader.\n */\n hideLabel?: boolean;\n render?: (row: T) => React.ReactNode;\n}\n\nexport interface DataTableSort { key: string; dir: 'asc' | 'desc' }\n\nexport interface DataTableRowProps {\n /** Extra class on the `<tr>`. */\n className?: string;\n /**\n * Greys the row and takes it out of selection and row actions. Use it when a row is present for\n * context but cannot be acted on — and pair it with a cell that says *why*, since a greyed row\n * on its own does not explain itself.\n */\n isDisabled?: boolean;\n}\n\nexport interface DataTableProps<T extends { id: string | number } = any> {\n /** Accessible name for the grid — required. */\n 'aria-label': string;\n columns: DataTableColumn<T>[];\n rows: T[];\n /** Row height: 32 / 40 / 48px. Condensed is the analyst default. */\n density?: 'condensed' | 'regular' | 'comfortable';\n selectable?: boolean;\n selected?: Array<string | number>;\n onSelectionChange?: (ids: Array<string | number>) => void;\n sort?: DataTableSort;\n onSortChange?: (sort: DataTableSort) => void;\n onRowAction?: (row: T) => void;\n emptyLabel?: React.ReactNode;\n /**\n * Summary cells keyed by column, rendered in a real `<tfoot>`.\n *\n * Keyed rather than free-form so a total sits under the column it totals, and stays there when\n * columns are reordered or resized. Columns missing from the map get an empty cell. Hidden while\n * `isLoading`, since a total from the previous response next to skeleton rows reads as current.\n */\n footer?: Record<string, React.ReactNode>;\n /** Per-row presentation and interactivity. Called for every row on every render — keep it cheap. */\n rowProps?: (row: T) => DataTableRowProps;\n /**\n * Detail rendered in a full-width row beneath its parent, for the rows named by `expandedIds`.\n *\n * Expansion is controlled: put the trigger in a column's `render` and track the ids yourself.\n * The table has no opinion on what opens a row, because the affordance differs per screen.\n */\n renderExpanded?: (row: T) => React.ReactNode;\n /** Ids whose `renderExpanded` content is currently shown. */\n expandedIds?: Array<string | number>;\n /** Swaps the body for skeleton rows derived from `columns` and `density`, keeping the header. */\n isLoading?: boolean;\n /** Skeleton row count. Defaults to the current `rows` length, or 5 when there are none. */\n loadingRowCount?: number;\n /** Overrides the dictionary's `dataTableLoading`, announced while the body is a skeleton. */\n loadingLabel?: string;\n stickyHeader?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Records grid. React Aria supplies roving focus, type-ahead, shift-click ranges and\n * screen-reader row/column announcements — do not hand-roll a <table> in product code. */\nexport function DataTable<T extends { id: string | number }>({ columns, rows, density = 'regular',\n selectable, selected, onSelectionChange, sort, onSortChange, onRowAction, stickyHeader = true,\n emptyLabel = 'No records match the current filters.', isLoading, loadingRowCount, loadingLabel,\n footer, rowProps, renderExpanded, expandedIds, className, style, ...rest }: DataTableProps<T>) {\n const msg = usePireMessages();\n const sortDescriptor: SortDescriptor | undefined = sort\n ? { column: sort.key, direction: sort.dir === 'asc' ? 'ascending' : 'descending' } : undefined;\n const handleSelection = (keys: Selection) => {\n if (keys === 'all') return onSelectionChange?.(rows.map((r) => r.id));\n onSelectionChange?.([...keys] as Array<string | number>);\n };\n\n // Defaulting to the current row count keeps the grid the same height across a reload, so the\n // page does not jump under the pointer that just pressed Go.\n const skeletonRows = loadingRowCount ?? (rows.length || 5);\n const skeletonColumns = [\n ...(selectable ? [{ width: 44 }] : []),\n ...columns.map((c) => ({ width: c.width, align: c.align, numeric: c.numeric })),\n ];\n // SkeletonTableRow is not a <tr> and cannot live inside React Aria's collection. Feeding the\n // Table an empty collection and rendering the skeletons through renderEmptyState is what keeps\n // the real header — and its sort state — mounted while the body is a placeholder.\n const body = isLoading ? [] : rows;\n\n const presentation = new Map(rows.map((row) => [row.id, rowProps?.(row) ?? {}]));\n // Row disabling is a collection-level concern in React Aria, not a prop on Row: `disabledKeys`\n // is what removes a row from selection, row actions and the focus order in one go.\n const disabledKeys = rows.filter((row) => presentation.get(row.id)?.isDisabled).map((row) => row.id);\n const expanded = new Set((expandedIds ?? []).map(String));\n const spanAll = columns.length + (selectable ? 1 : 0);\n /**\n * Detail rows are siblings in the collection, so their keys must not collide with a record id.\n * Deliberately not spelled like a `pire-*` class: `styles.css.test.ts` reads `pire-*` string\n * literals in component source as class references.\n */\n const expandedKey = (id: string | number) => `${id}::__pire_expanded__`;\n\n return (\n <div className={cx('pire-table-wrap', className)} style={style}\n data-loading={isLoading ? 'true' : undefined} aria-busy={isLoading ? 'true' : undefined}>\n <Table className=\"pire-table\" data-density={density} data-sticky={String(stickyHeader)}\n aria-label={rest['aria-label']}\n disabledKeys={disabledKeys.length ? new Set(disabledKeys) : undefined}\n selectionMode={selectable ? 'multiple' : 'none'}\n selectedKeys={selected ? new Set(selected) : undefined}\n onSelectionChange={handleSelection}\n sortDescriptor={sortDescriptor}\n onSortChange={(d) => onSortChange?.({ key: String(d.column), dir: d.direction === 'ascending' ? 'asc' : 'desc' })}\n onRowAction={onRowAction ? (key) => {\n const row = rows.find((r) => String(r.id) === String(key));\n if (row) onRowAction(row);\n } : undefined}>\n <TableHeader className=\"pire-thead-row\">\n {selectable ? (\n <Column className=\"pire-th\" width={44}>\n <Checkbox slot=\"selection\" aria-label={msg.dataTableSelectAll} />\n </Column>\n ) : null}\n {columns.map((c, i) => (\n <Column key={c.key} id={c.key} className=\"pire-th\" isRowHeader={i === 0 && !selectable}\n allowsSorting={c.sortable} width={c.width as never}\n data-align={c.numeric || c.align === 'right' ? 'right' : c.align}\n data-allows-sorting={c.sortable ? 'true' : undefined}>\n <span className={cx('pire-th-inner', c.hideLabel && 'pire-sr-only')}>\n {c.label}\n {c.sortable ? (\n <Icon size={12} name={sort?.key === c.key ? (sort.dir === 'asc' ? 'arrow-up' : 'arrow-down') : 'chevrons-up-down'}\n style={{ color: sort?.key === c.key ? 'var(--accent-subtle-fg)' : 'var(--text-tertiary)' }} />\n ) : null}\n </span>\n </Column>\n ))}\n </TableHeader>\n <TableBody renderEmptyState={() => (isLoading ? (\n <div className=\"pire-table-loading\" role=\"status\" aria-live=\"polite\">\n <span className=\"pire-sr-only\">{loadingLabel ?? msg.dataTableLoading}</span>\n {Array.from({ length: skeletonRows }, (_, i) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: placeholder rows are positional.\n <SkeletonTableRow key={i} columns={skeletonColumns} density={density} />\n ))}\n </div>\n ) : (\n <div className=\"pire-table-empty\">{emptyLabel}</div>\n ))}>\n {body.flatMap((row) => {\n const rowIsDisabled = presentation.get(row.id)?.isDisabled;\n const record = (\n <Row key={row.id} id={row.id} className={cx('pire-tr', presentation.get(row.id)?.className)}\n data-pressable={onRowAction && !rowIsDisabled ? 'true' : undefined}>\n {selectable ? <Cell className=\"pire-td\"><Checkbox slot=\"selection\" aria-label={msg.dataTableSelectRow} /></Cell> : null}\n {columns.map((c) => (\n <Cell key={c.key} className=\"pire-td\" data-numeric={c.numeric ? 'true' : undefined}\n style={{ textAlign: c.align && !c.numeric ? c.align : undefined }}>\n {c.render ? c.render(row) : (row as Record<string, React.ReactNode>)[c.key]}\n </Cell>\n ))}\n </Row>\n );\n if (!renderExpanded || !expanded.has(String(row.id))) return [record];\n return [record, (\n <Row key={expandedKey(row.id)} id={expandedKey(row.id)} className=\"pire-tr-expanded\">\n <Cell className=\"pire-td-expanded\" colSpan={spanAll}>{renderExpanded(row)}</Cell>\n </Row>\n )];\n })}\n </TableBody>\n {footer && !isLoading ? (\n <TableFooter className=\"pire-tfoot\">\n <Row id=\"__pire_footer__\" className=\"pire-tr-footer\">\n {selectable ? <Cell className=\"pire-tf\" /> : null}\n {columns.map((c, i) => (\n <Cell key={c.key} className=\"pire-tf\" data-numeric={c.numeric ? 'true' : undefined}\n style={{ textAlign: c.align && !c.numeric ? c.align : undefined }}>\n {/* React Aria makes the row's first cell a rowheader, and an empty rowheader\n leaves every other cell in the row unnamed. Totals usually start in a later\n column, so the first cell falls back to an announced-only label rather than\n to nothing. */}\n {footer[c.key] ?? (i === 0 && !selectable\n ? <span className=\"pire-sr-only\">{msg.dataTableSummaryRow}</span> : null)}\n </Cell>\n ))}\n </Row>\n </TableFooter>\n ) : null}\n </Table>\n </div>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport type SkeletonShape = 'text' | 'block' | 'circle';\n\nexport interface SkeletonProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** text — a line of copy; block — a card, chart or image; circle — an avatar. */\n shape?: SkeletonShape;\n /** Overrides the shape's default. A percentage reads better than a pixel count in a\n * fluid layout, and keeps the placeholder honest when the real value is unknown. */\n width?: number | string;\n height?: number | string;\n}\n\n/** Loading placeholder for content whose shape is known before its value is.\n *\n * Deliberately `aria-hidden`: a screen reader gains nothing from \"graphic, graphic, graphic\",\n * and announcing placeholders as content is worse than silence. Announce the wait once, on the\n * region that is loading — `aria-busy=\"true\"` on the container, or a live-region message — and\n * let the skeleton be purely visual. Nothing inside is focusable, so keyboard order is\n * unaffected while the data is in flight.\n *\n * The shimmer is suppressed under `prefers-reduced-motion`; the placeholder still reads as one\n * because the shape and the surface contrast carry it, not the animation. */\nexport function Skeleton({ shape = 'text', width, height, className, style, ...rest }: SkeletonProps) {\n return (\n <div className={cx('pire-skeleton', className)} data-shape={shape} aria-hidden=\"true\"\n style={{ width, height, ...style }} {...rest} />\n );\n}\n\nexport interface SkeletonTableColumn {\n align?: 'left' | 'right' | 'center';\n /** Fixed column width. Omit to let the column share the free space, as DataTable does. */\n width?: number | string;\n /** Right-aligns the bar. Mirrors DataTable's column flag so a loading table and a loaded one\n * put their numbers in the same place. */\n numeric?: boolean;\n}\n\nexport interface SkeletonTableRowProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** A column count, or one descriptor per column when alignment or width matters. */\n columns: number | SkeletonTableColumn[];\n /** Must match the DataTable it stands in for, or the rows jump on load. */\n density?: 'condensed' | 'regular' | 'comfortable';\n}\n\n/* Bar widths cycle instead of being random: a random width would be a different number on every\n render, so the placeholder would twitch under any unrelated re-render. Four values is enough\n for the ragged look of real data without a visible repeat at normal column counts. */\nconst BAR_WIDTHS = ['72%', '54%', '86%', '63%'];\n\n/** One placeholder row, sized to line up with `DataTable` — same row height per density, same\n * cell padding, same bottom rule. Render a handful inside `.pire-table-wrap` (or above a real\n * table's body) while the first page loads, so the grid does not resize when it arrives.\n *\n * It is not a real `<tr>` and cannot be handed to `DataTable` as a row: DataTable builds its\n * collection from `rows`, and React Aria's table owns everything under it. Use it in place of\n * the table, not inside one. */\nexport function SkeletonTableRow({ columns, density = 'regular', className, style, ...rest }: SkeletonTableRowProps) {\n const cells: SkeletonTableColumn[] = typeof columns === 'number'\n ? Array.from({ length: columns }, () => ({}))\n : columns;\n return (\n <div className={cx('pire-skeleton-row', className)} data-density={density} aria-hidden=\"true\"\n style={style} {...rest}>\n {cells.map((c, i) => {\n const align = c.numeric ? 'right' : c.align ?? 'left';\n return (\n // biome-ignore lint/suspicious/noArrayIndexKey: columns are positional and never reordered.\n <div key={i} className=\"pire-skeleton-cell\" data-align={align}\n style={{ width: c.width, flex: c.width ? '0 0 auto' : undefined }}>\n <Skeleton width={BAR_WIDTHS[i % BAR_WIDTHS.length]} />\n </div>\n );\n })}\n </div>\n );\n}\n","import * as React from 'react';\nimport { FileTrigger, Text } from 'react-aria-components';\nimport { Button } from '../core/Button';\nimport { Icon } from '../core/Icon';\nimport { IconButton } from '../core/IconButton';\nimport { ProgressBar } from '../feedback/ProgressBar';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface PireFile {\n /** The browser's `File`. Pire uploads nothing — that is the app's job. */\n file: File;\n /** Object URL, only for images with `showPreview`. Revoked on unmount. */\n previewUrl?: string;\n}\n\nexport interface FileRejection {\n file: File;\n reason: 'size' | 'type';\n}\n\nexport interface FileUploadProps {\n label?: React.ReactNode;\n /** Controlled / uncontrolled, the same pair as `Tabs` and `MultiComboBox`. */\n value?: PireFile[];\n defaultValue?: PireFile[];\n onChange?: (files: PireFile[]) => void;\n /** Mime types or extensions, exactly as `FileTrigger.acceptedFileTypes` takes them. */\n acceptedFileTypes?: readonly string[];\n allowsMultiple?: boolean;\n /** Ceiling in bytes. Oversized files are rejected and reported, never held. */\n maxSize?: number;\n /** Rejections, so the app can word its own message. */\n onError?: (rejections: FileRejection[]) => void;\n /** Thumbnail for images. Turn it off for CSVs, where a thumbnail says nothing. */\n showPreview?: boolean;\n /** Upload progress 0–100, while the app is doing the uploading. */\n uploadProgress?: number;\n /** Overrides the dictionary's `fileUploadChoose`. */\n chooseLabel?: string;\n description?: React.ReactNode;\n errorMessage?: React.ReactNode;\n isInvalid?: boolean;\n isDisabled?: boolean;\n isRequired?: boolean;\n isReadOnly?: boolean;\n fullWidth?: boolean;\n name?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst isImage = (file: File) => file.type.startsWith('image/');\n\n/** Human-readable size. Deliberately not localised digits: `toLocaleString` on the number only. */\nexport function formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024).toLocaleString()} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/** Splits a picked list into keepers and rejections, without uploading or mutating anything. */\nexport function screenFiles(\n files: File[],\n { maxSize, acceptedFileTypes }: { maxSize?: number; acceptedFileTypes?: readonly string[] },\n): { accepted: File[]; rejected: FileRejection[] } {\n const accepted: File[] = [];\n const rejected: FileRejection[] = [];\n\n for (const file of files) {\n if (maxSize != null && file.size > maxSize) {\n rejected.push({ file, reason: 'size' });\n continue;\n }\n // `acceptedFileTypes` mirrors the input's accept attribute, which the OS picker already\n // enforces — but drag-and-drop bypasses that picker entirely, so it is checked here too.\n if (acceptedFileTypes?.length) {\n const ok = acceptedFileTypes.some((t) =>\n t.startsWith('.') ? file.name.toLowerCase().endsWith(t.toLowerCase())\n : t.endsWith('/*') ? file.type.startsWith(t.slice(0, -1))\n : file.type === t);\n if (!ok) {\n rejected.push({ file, reason: 'type' });\n continue;\n }\n }\n accepted.push(file);\n }\n return { accepted, rejected };\n}\n\n/**\n * File picker with a list of what was chosen. Pire hands back `File`s through `onChange` and\n * uploads nothing: the app owns the `FormData`, the request and the progress it reports back\n * through `uploadProgress`.\n */\nexport function FileUpload({\n label, value, defaultValue, onChange, acceptedFileTypes, allowsMultiple, maxSize, onError,\n showPreview = true, uploadProgress, chooseLabel, description, errorMessage,\n isInvalid, isDisabled, isReadOnly, isRequired, fullWidth = true, className, style,\n}: FileUploadProps) {\n const msg = usePireMessages();\n const [uncontrolled, setUncontrolled] = React.useState<PireFile[]>(defaultValue ?? []);\n const files = value ?? uncontrolled;\n\n // Object URLs leak until revoked, and the browser will not do it for us.\n const created = React.useRef<string[]>([]);\n React.useEffect(() => () => {\n for (const url of created.current) URL.revokeObjectURL(url);\n }, []);\n\n const commit = (next: PireFile[]) => {\n if (value === undefined) setUncontrolled(next);\n onChange?.(next);\n };\n\n const accept = (picked: FileList | null) => {\n if (!picked || isDisabled || isReadOnly) return;\n const { accepted, rejected } = screenFiles([...picked], { maxSize, acceptedFileTypes });\n if (rejected.length) onError?.(rejected);\n if (!accepted.length) return;\n\n const wrapped = accepted.map((file) => {\n const previewUrl = showPreview && isImage(file) ? URL.createObjectURL(file) : undefined;\n if (previewUrl) created.current.push(previewUrl);\n return { file, previewUrl };\n });\n commit(allowsMultiple ? [...files, ...wrapped] : wrapped.slice(0, 1));\n };\n\n const remove = (target: File) => commit(files.filter((f) => f.file !== target));\n\n return (\n <div className={cx('pire-field', 'pire-fileupload', className)} style={style}\n data-full-width={String(fullWidth)} data-invalid={isInvalid ? 'true' : undefined}>\n {label ? (\n <span className=\"pire-field-label\">\n {label}{isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </span>\n ) : null}\n\n <FileTrigger acceptedFileTypes={acceptedFileTypes as string[] | undefined}\n allowsMultiple={allowsMultiple} onSelect={accept}>\n <Button icon=\"paperclip\" isDisabled={isDisabled || isReadOnly}>\n {chooseLabel ?? msg.fileUploadChoose}\n </Button>\n </FileTrigger>\n\n {files.length ? (\n <ul className=\"pire-fileupload-list\">\n {files.map(({ file, previewUrl }) => (\n <li key={`${file.name}-${file.size}-${file.lastModified}`} className=\"pire-fileupload-item\">\n {previewUrl\n ? <img className=\"pire-fileupload-thumb\" src={previewUrl} alt=\"\" />\n : <Icon name=\"file-text\" size={16} className=\"pire-fileupload-icon\" />}\n <span className=\"pire-fileupload-name\">{file.name}</span>\n <span className=\"pire-fileupload-size\">{formatFileSize(file.size)}</span>\n {isDisabled || isReadOnly ? null : (\n <IconButton icon=\"x\" size=\"sm\"\n label={msg.fileUploadRemoveNamed.replace('{name}', file.name)}\n onPress={() => remove(file)} />\n )}\n </li>\n ))}\n </ul>\n ) : null}\n\n {uploadProgress != null ? (\n <ProgressBar value={uploadProgress} label={msg.fileUploadUploading} />\n ) : null}\n\n {description ? <Text slot=\"description\" className=\"pire-field-hint\">{description}</Text> : null}\n {isInvalid && errorMessage ? <span className=\"pire-field-error\">{errorMessage}</span> : null}\n </div>\n );\n}\n","import type * as React from 'react';\nimport { ProgressBar as AriaProgressBar, Label } from 'react-aria-components';\nimport { cx } from '../utils/cx';\n\nexport interface ProgressBarProps {\n value?: number;\n minValue?: number;\n maxValue?: number;\n label?: React.ReactNode;\n showValue?: boolean;\n /** Indeterminate work — no percentage is announced. */\n isIndeterminate?: boolean;\n /** Colours the fill — e.g. negative when a budget is overrun. */\n status?: 'informative' | 'positive' | 'critical' | 'negative';\n size?: 'sm' | 'md';\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function ProgressBar({ value = 0, minValue = 0, maxValue = 100, label, showValue = true,\n isIndeterminate, status = 'informative', size = 'md', className, style }: ProgressBarProps) {\n return (\n <AriaProgressBar className={cx('pire-progress', className)} data-status={status} data-size={size}\n value={value} minValue={minValue} maxValue={maxValue} isIndeterminate={isIndeterminate} style={style}>\n {({ percentage, valueText }) => (\n <>\n {label || showValue ? (\n <div className=\"pire-progress-head\">\n {label ? <Label>{label}</Label> : <span />}\n {showValue && !isIndeterminate ? <span className=\"pire-numeric\">{valueText}</span> : null}\n </div>\n ) : null}\n <div className=\"pire-progress-track\">\n <div className=\"pire-progress-fill\" style={{ width: `${isIndeterminate ? 40 : percentage}%` }} />\n </div>\n </>\n )}\n </AriaProgressBar>\n );\n}\n","import type * as React from 'react';\nimport { MenuTrigger, Button as AriaButton, Popover } from 'react-aria-components';\nimport { IconButton } from '../core/IconButton';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface ShellBarProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {\n /** Wordmark at far left, uppercase micro-caps. */\n product?: string;\n /** 1–3 letter monogram tile before the wordmark — stand-in for a customer logo. */\n monogram?: string;\n /** Current app or object title. */\n title?: React.ReactNode;\n onMenu?: () => void;\n onSearch?: () => void;\n /** Accessible name for the menu button. Defaults to English, and the bar has no access to the app's\n * catalogue — a Spanish product must pass its own or ship an English screen-reader label. */\n menuLabel?: string;\n /** Accessible name for the search button, for the same reason as {@link ShellBarProps.menuLabel}.\n * Until this existed the only way to localise it was to drop `onSearch` and re-render the icon by\n * hand, which is how a shell ends up with two search icons. */\n searchLabel?: string;\n /** IconButtons with variant=\"inverse\". */\n actions?: React.ReactNode;\n /** Full name — initials render into the avatar. */\n user?: string;\n /**\n * Turns the avatar into a menu trigger. Pass a `Menu` — the entries are the product's, because\n * they differ per app; only the trigger belongs here.\n *\n * Without it the avatar stays a plain `role=\"img\"`, so nothing that renders a bare `user` today\n * changes. With it the avatar becomes a real `<button>` carrying `aria-haspopup` and\n * `aria-expanded`.\n */\n userMenu?: React.ReactNode;\n /** Accessible name of the avatar button. `{user}` is replaced with the name. Defaults to the\n * dictionary's `shellBarUserMenu`, for the same reason as {@link ShellBarProps.menuLabel}. */\n userMenuLabel?: string;\n}\n\nconst initials = (name: string) => name.trim().split(/\\s+/).slice(0, 2).map((p) => p[0]).join('').toUpperCase();\n\n/** Fixed 48px application chrome. One per page, always the first landmark. */\nexport function ShellBar({ product, monogram, title, onMenu, onSearch, menuLabel = 'Open navigation',\n searchLabel = 'Search', actions, user, userMenu, userMenuLabel, className, ...rest }: ShellBarProps) {\n const msg = usePireMessages();\n return (\n <header className={cx('pire-shellbar', className)} {...rest}>\n {onMenu ? <IconButton icon=\"menu\" label={menuLabel} variant=\"inverse\" size=\"sm\" onPress={onMenu} /> : null}\n {monogram ? <span className=\"pire-shellbar-mono\" aria-hidden=\"true\">{monogram}</span> : null}\n {product ? <span className=\"pire-shellbar-product\">{product}</span> : null}\n {title ? <span className=\"pire-shellbar-title\">{title}</span> : null}\n <span className=\"pire-shellbar-spacer\" />\n {onSearch ? <IconButton icon=\"search\" label={searchLabel} variant=\"inverse\" size=\"sm\" onPress={onSearch} /> : null}\n {actions}\n {user && userMenu ? (\n // A real button, not the img-role span: the avatar is where \"my profile\", \"switch company\"\n // and \"sign out\" live in any ERP, and a span accepts neither focus nor onPress. Popover is\n // rendered here rather than expected from the consumer so the panel keeps shell placement.\n <MenuTrigger>\n <AriaButton className=\"pire-avatar pire-avatar-trigger\"\n aria-label={(userMenuLabel ?? msg.shellBarUserMenu).replace('{user}', user)}>\n {initials(user)}\n </AriaButton>\n <Popover className=\"pire-popover\">{userMenu}</Popover>\n </MenuTrigger>\n ) : user ? (\n <span className=\"pire-avatar\" title={user} aria-label={user} role=\"img\">{initials(user)}</span>\n ) : null}\n </header>\n );\n}\n","import * as React from 'react';\nimport { Icon } from '../core/Icon';\nimport { Tooltip } from '../feedback/Tooltip';\nimport { Button as AriaButton, Disclosure, DisclosureGroup, DisclosurePanel,\n MenuTrigger, Popover } from 'react-aria-components';\nimport { Menu, MenuItem } from './Menu';\nimport type { Key } from 'react-aria-components';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\n/** A second-level destination, nested under a first-level entry.\n *\n * Deliberately has no `icon`: only the first level carries one, so the second level reads as an\n * indented list of labels under a single glyph rather than a wall of decoration. Leaving `icon` off\n * the *type* is what stops that drifting back in one call site at a time. */\nexport interface SideNavChildItem { id: string; label: string; count?: number }\n\nexport interface SideNavItem {\n id: string;\n label: string;\n icon?: string;\n count?: number;\n /** Second-level destinations. Supplying this turns the entry into a collapsible group: it stops\n * being a destination itself (pressing it expands, never navigates) and `id` becomes the\n * expansion key used by `expandedIds` / `defaultExpandedIds`, not something `onChange` can ever\n * emit. Omit it and the entry behaves exactly as it always has. */\n items?: SideNavChildItem[];\n}\n\nexport interface SideNavGroup { label?: string; items: SideNavItem[] }\n\nexport interface SideNavProps extends Omit<React.HTMLAttributes<HTMLElement>, 'onChange'> {\n /** Spaces-and-pages hierarchy: one group per space. */\n groups: SideNavGroup[];\n value?: string;\n /** Fires with the selected item id — not a DOM change event. Only ever a destination id: a\n * first-level entry that owns `items` is a disclosure, and toggling it does not fire this. */\n onChange?: (id: string) => void;\n /** Expanded first-level entry ids — the controlled half of the pair. Pass it and you own expansion\n * outright, including expanding the group that holds `value`. */\n expandedIds?: string[];\n /** Initial expanded ids for the uncontrolled case. Omit it and the group holding `value` opens\n * itself; supply it and it is taken literally, so `value`'s group can start closed if that is\n * genuinely what you want. */\n defaultExpandedIds?: string[];\n /** Fires with every expanded id after a toggle, controlled or not. */\n onExpandedChange?: (ids: string[]) => void;\n /** 48px icon rail. Labels move into tooltips or, for a group, into its flyout. */\n collapsed?: boolean;\n /**\n * In the rail, a group opens its children in a flyout beside it. On by default: without it the\n * rail records an expansion nothing can draw, leaving second-level destinations reachable only\n * by expanding the nav again.\n *\n * Pass `false` for the previous behaviour, where a rail group toggles expansion invisibly.\n */\n railFlyout?: boolean;\n footer?: React.ReactNode;\n}\n\n/** Which first-level entry owns `value`, if any. Undefined when `value` is a first-level destination. */\nfunction findActiveParent(groups: SideNavGroup[], value: string | undefined): string | undefined {\n if (value == null) return undefined;\n for (const group of groups) {\n for (const item of group.items) {\n if (item.items?.some((child) => child.id === value)) return item.id;\n }\n }\n return undefined;\n}\n\n/** Primary navigation. A first-level entry is either a destination (icon + label, selectable) or a\n * collapsible group (icon + label + chevron) when it carries `items` — the two coexist in one list,\n * which is how a 35-destination ERP menu fits without showing all 35 at once.\n *\n * Both levels are plain `Button`s and the disclosure is React Aria's `Disclosure` /\n * `DisclosureGroup`, so `aria-expanded`, `aria-controls`, the panel's `role=\"group\"` and\n * `aria-labelledby`, and Enter/Space on the trigger all come from React Aria rather than from\n * hand-rolled ARIA here.\n *\n * Three things worth knowing before you use it:\n *\n * - **The panel is always in the DOM.** React Aria hides a collapsed panel with\n * `hidden=\"until-found\"`, applied imperatively in a layout effect, so find-in-page can reveal it.\n * A test asserting a collapsed child is *absent* will fail; assert `aria-expanded` on the trigger,\n * or visibility, instead. The corollary in CSS: any `display` we set on the panel would beat the\n * UA's `[hidden] { display: none }`, leaving collapsed children focusable under\n * `aria-hidden=\"true\"`. `.pire-sidenav-subnav[hidden]` in `components.css` is that guard.\n * - **`collapsed` and expansion are different axes, and the rail wins.** With `collapsed` set there\n * are no labels, and a second level is nothing *but* labels. A group therefore opens its children\n * in a flyout beside the rail (`railFlyout`, on by default) rather than inline. With\n * `railFlyout={false}` the row falls back to recording the expansion silently — which leaves\n * second-level destinations reachable only by expanding the nav again, so it is off the\n * accessible path and exists for compatibility.\n * - **Several groups can be open at once**, and there is no accordion mode. Closing the group you\n * are in to open another is the wrong trade in a nav whose whole job is showing where you are. */\nexport function SideNav({ groups, value, onChange, expandedIds, defaultExpandedIds, onExpandedChange,\n collapsed, railFlyout = true, footer, className, ...rest }: SideNavProps) {\n const msg = usePireMessages();\n const activeParent = findActiveParent(groups, value);\n const isControlled = expandedIds != null;\n const [ownExpanded, setOwnExpanded] = React.useState<Set<string>>(\n () => new Set(defaultExpandedIds ?? (activeParent ? [activeParent] : [])));\n const [lastValue, setLastValue] = React.useState(value);\n\n // Reveal the group owning a *newly* selected destination. Seeding state at mount is not enough in a\n // router-driven app: a breadcrumb or a deep link can move `value` into a closed group, and the\n // current location would then be invisible. Keyed off the change rather than off `value` itself, so\n // a group the user closed by hand stays closed. Adjust-state-during-render, not an effect — React\n // re-runs this render before committing, so the panel never paints closed and then open.\n if (value !== lastValue) {\n setLastValue(value);\n if (!isControlled && activeParent && !ownExpanded.has(activeParent)) {\n setOwnExpanded(new Set(ownExpanded).add(activeParent));\n }\n }\n\n const expanded = isControlled ? new Set(expandedIds) : ownExpanded;\n\n const commitExpanded = (next: Set<string>): void => {\n if (!isControlled) setOwnExpanded(next);\n onExpandedChange?.([...next]);\n };\n\n /** React Aria hands back the whole set, typed as `Key` (which widens to number). Ids are strings. */\n const handleExpandedChange = (keys: Set<Key>): void => commitExpanded(new Set([...keys].map(String)));\n\n const toggleExpanded = (id: string): void => {\n const next = new Set(expanded);\n if (!next.delete(id)) next.add(id);\n commitExpanded(next);\n };\n\n /** A first-level row: the leaf case, and the rail-mode rendering of a group. */\n const renderRow = (item: SideNavItem, onPress: () => void, isGroup: boolean) => {\n const selected = !isGroup && item.id === value;\n const button = (\n <AriaButton key={item.id} className=\"pire-sidenav-item\" data-selected={selected ? 'true' : undefined}\n data-active-child={isGroup && item.id === activeParent ? 'true' : undefined}\n aria-current={selected ? 'page' : undefined}\n // In the rail the visible label is dropped and the Icon is decorative, which left the\n // button with no accessible name at all. The Tooltip does not cover this: React Aria\n // wires it up as aria-describedby, and a description is not a name — a screen reader\n // announced these as an unlabelled \"button\". Expanded, the <span> below names it.\n aria-label={collapsed ? item.label : undefined}\n onPress={onPress}>\n {item.icon ? <Icon name={item.icon} size={16} /> : null}\n {collapsed ? null : <span>{item.label}</span>}\n {item.count != null && !collapsed ? <span className=\"pire-sidenav-count\">{item.count}</span> : null}\n </AriaButton>\n );\n // The Tooltip stays: it is the sighted affordance for the same missing label.\n return collapsed ? <Tooltip key={item.id} label={item.label} placement=\"right\">{button}</Tooltip> : button;\n };\n\n /** A rail group: the icon button, with its children in a flyout beside the rail.\n *\n * Built on MenuTrigger so roving focus, type-ahead and Escape-returns-focus come from React\n * Aria. The trade-off is that a child is a `menuitem` here and a `link` when the nav is\n * expanded — one destination with two roles depending on chrome state. That is deliberate:\n * the interaction genuinely differs, and the alternative was hand-rolling arrow-key handling. */\n const renderRailFlyout = (item: SideNavItem) => (\n <MenuTrigger key={item.id}>\n <AriaButton className=\"pire-sidenav-item\" aria-label={item.label}\n data-active-child={item.id === activeParent ? 'true' : undefined}>\n {item.icon ? <Icon name={item.icon} size={16} /> : null}\n </AriaButton>\n <Popover className=\"pire-popover\" placement=\"right top\" offset={4}>\n <Menu aria-label={item.label} className=\"pire-sidenav-flyout\"\n onAction={(key) => onChange?.(String(key))}>\n {(item.items ?? []).map((child) => (\n <MenuItem key={child.id} id={child.id}>{child.label}</MenuItem>\n ))}\n </Menu>\n </Popover>\n </MenuTrigger>\n );\n\n const renderSection = (item: SideNavItem) => (\n <Disclosure key={item.id} id={item.id} className=\"pire-sidenav-section\">\n {/* No onPress of our own: React Aria's ButtonContext supplies the toggle through\n slot=\"trigger\", and one here would navigate as a side effect of expanding. */}\n <AriaButton slot=\"trigger\" className=\"pire-sidenav-item\" data-kind=\"group\"\n data-active-child={item.id === activeParent ? 'true' : undefined}>\n {item.icon ? <Icon name={item.icon} size={16} /> : null}\n <span>{item.label}</span>\n {item.count != null ? <span className=\"pire-sidenav-count\">{item.count}</span> : null}\n <Icon name=\"chevron-down\" size={16} className=\"pire-sidenav-chevron\" />\n </AriaButton>\n <DisclosurePanel className=\"pire-sidenav-subnav\">\n {item.items?.map((child) => {\n const selected = child.id === value;\n return (\n <AriaButton key={child.id} className=\"pire-sidenav-item pire-sidenav-subitem\"\n data-selected={selected ? 'true' : undefined} aria-current={selected ? 'page' : undefined}\n onPress={() => onChange?.(child.id)}>\n <span>{child.label}</span>\n {child.count != null ? <span className=\"pire-sidenav-count\">{child.count}</span> : null}\n </AriaButton>\n );\n })}\n </DisclosurePanel>\n </Disclosure>\n );\n\n return (\n <nav className={cx('pire-sidenav', className)} data-collapsed={collapsed ? 'true' : undefined}\n aria-label={msg.sideNavLabel} {...rest}>\n {groups.map((group, gi) => {\n const hasSections = !collapsed && group.items.some((item) => item.items?.length);\n const rows = group.items.map((item) => {\n const isGroup = Boolean(item.items?.length);\n if (isGroup && !collapsed) return renderSection(item);\n if (isGroup && collapsed && railFlyout) return renderRailFlyout(item);\n return renderRow(item, () => (isGroup ? toggleExpanded(item.id) : onChange?.(item.id)), isGroup);\n });\n return (\n <div className=\"pire-sidenav-group\" key={group.label ?? gi}>\n {group.label && !collapsed ? <div className=\"pire-sidenav-label\">{group.label}</div> : null}\n {/* The DisclosureGroup wrapper appears only where something is actually collapsible, so a\n flat `groups` renders the DOM it rendered before any of this existed. */}\n {hasSections ? (\n <DisclosureGroup className=\"pire-sidenav-tree\" allowsMultipleExpanded\n expandedKeys={expanded} onExpandedChange={handleExpandedChange}>\n {rows}\n </DisclosureGroup>\n ) : rows}\n </div>\n );\n })}\n {footer ? <div className=\"pire-sidenav-footer\">{footer}</div> : null}\n </nav>\n );\n}\n","import type * as React from 'react';\nimport {\n Menu as AriaMenu, MenuItem as AriaMenuItem, MenuSection as AriaMenuSection,\n Separator as AriaSeparator, Header,\n type MenuProps as AriaMenuProps, type MenuItemProps as AriaMenuItemProps,\n} from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { Kbd } from '../core/Kbd';\nimport { cx } from '../utils/cx';\n\nexport interface MenuProps<T extends object = object>\n extends Omit<AriaMenuProps<T>, 'className' | 'style'> {\n /** Accessible name when the trigger does not supply one. `MenuTrigger` usually does. */\n 'aria-label'?: string;\n /** Floor for the panel width. The panel sizes to its content, not to the trigger. */\n minWidth?: number | string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** The surface inside a `MenuTrigger`. Wrap it in a `Popover`, the way `Select` does. */\nexport function Menu<T extends object = object>({ minWidth, className, style, ...rest }: MenuProps<T>) {\n const width = typeof minWidth === 'number' ? `${minWidth}px` : minWidth;\n const menuStyle = width == null\n ? style\n : ({ ['--pire-menu-min-w' as string]: width, ...style } as React.CSSProperties);\n\n return (\n <AriaMenu\n className={cx('pire-menu', className)}\n style={menuStyle}\n {...(rest as AriaMenuProps<T>)}\n />\n );\n}\n\nexport interface MenuItemProps extends Omit<AriaMenuItemProps, 'className' | 'children'> {\n children?: React.ReactNode;\n /** Icon slug before the label. Same vocabulary as `Button.icon`. */\n icon?: string;\n /** Second line, for an action whose effect is not obvious from its label. */\n description?: React.ReactNode;\n /**\n * Keyboard shortcut, right-aligned and drawn as key caps. Painted only — it registers nothing.\n *\n * A string is split on `+` and spaces, so `\"Ctrl+Shift+P\"` renders as three caps. Pass an array\n * when the split cannot be inferred: `['⌘', 'N']`, since `\"⌘N\"` has no separator to split on.\n */\n shortcut?: string | string[];\n /** `danger` for a destructive action. Put it last, behind a `MenuSeparator`. */\n tone?: 'default' | 'danger';\n className?: string;\n}\n\n/** Splits `\"Ctrl+Shift+P\"` into its caps. An array is taken as given, because a chord written\n * without separators — `\"⌘N\"` — cannot be split without guessing where one key ends. */\nconst shortcutKeys = (shortcut: string | string[] | undefined): string[] => {\n if (shortcut == null) return [];\n const parts = Array.isArray(shortcut) ? shortcut : shortcut.split(/[+\\s]+/);\n return parts.map((part) => part.trim()).filter(Boolean);\n};\n\n/** A single command. Accepts `href`, so navigation items render a real anchor. */\nexport function MenuItem({\n children, icon, description, shortcut, tone = 'default', className, ...rest\n}: MenuItemProps) {\n const keys = shortcutKeys(shortcut);\n return (\n <AriaMenuItem\n className={cx('pire-menu-item', className)}\n data-tone={tone === 'danger' ? 'danger' : undefined}\n {...rest}\n >\n {icon ? <Icon name={icon} size={16} className=\"pire-menu-item-icon\" /> : null}\n <span className=\"pire-menu-item-body\">\n <span className=\"pire-menu-item-label\">{children}</span>\n {description ? <span className=\"pire-menu-item-desc\">{description}</span> : null}\n </span>\n {keys.length ? (\n <span className=\"pire-menu-item-shortcut\">\n {/* biome-ignore lint/suspicious/noArrayIndexKey: position is the identity of a cap in a fixed chord, and a glyph may repeat */}\n {keys.map((cap, index) => <Kbd key={`${cap}-${index}`} size=\"sm\">{cap}</Kbd>)}\n </span>\n ) : null}\n </AriaMenuItem>\n );\n}\n\n// `title` shadows the DOM tooltip attribute, so it must be Omitted before being redeclared.\nexport interface MenuSectionProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {\n /** Section heading. Rendered as a `Header`, not as a focusable item. */\n title?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n}\n\n/** Groups related commands under an optional heading. */\nexport function MenuSection({ title, children, className, ...rest }: MenuSectionProps) {\n return (\n <AriaMenuSection className={cx('pire-menu-section', className)} {...rest}>\n {title ? <Header className=\"pire-menu-section-title\">{title}</Header> : null}\n {children}\n </AriaMenuSection>\n );\n}\n\nexport interface MenuSeparatorProps {\n className?: string;\n}\n\n/** Rule between groups of items, on the menu's rhythm rather than the page's. */\nexport function MenuSeparator({ className }: MenuSeparatorProps) {\n return <AriaSeparator className={cx('pire-menu-separator', className)} />;\n}\n","import type * as React from 'react';\nimport { Tabs as AriaTabs, TabList, Tab as AriaTab, TabPanel } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { cx } from '../utils/cx';\n\nexport interface TabItem { id: string; label: string; icon?: string; count?: number; isDisabled?: boolean }\n\nexport interface TabsProps {\n items: TabItem[];\n value?: string;\n defaultValue?: string;\n onChange?: (id: string) => void;\n /** Optional panel content keyed by tab id. Omit when the tabs drive an external region —\n * the panel element is still rendered (empty and unstyled) so the tab's `aria-controls`\n * has something to point at. */\n panels?: Record<string, React.ReactNode>;\n 'aria-label'?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** Peer views of one object. Arrow keys move between tabs; the panel is one tab stop away. */\nexport function Tabs({ items, value, defaultValue, onChange, panels, className, style, ...rest }: TabsProps) {\n return (\n <AriaTabs className={className} style={style} selectedKey={value} defaultSelectedKey={defaultValue}\n onSelectionChange={(k) => onChange?.(String(k))}>\n <TabList className=\"pire-tablist\" items={items} aria-label={rest['aria-label'] ?? 'Views'}>\n {(item) => (\n <AriaTab className={cx('pire-tab')} id={item.id} isDisabled={item.isDisabled}>\n {item.icon ? <Icon name={item.icon} size={16} /> : null}\n {item.label}\n {item.count != null ? <span className=\"pire-tab-count\">{item.count}</span> : null}\n </AriaTab>\n )}\n </TabList>\n {/* Rendered for every tab, with or without `panels`. React Aria puts `aria-controls` on\n the selected tab pointing at that tab's generated tabpanel id unconditionally, so\n omitting the panel leaves the reference dangling: invalid ARIA, and an axe\n `aria-valid-attr-value` failure in any consuming app that drives an external region.\n React Aria mounts only the selected panel, and with no content it is an empty,\n zero-height element — the padded `.pire-tabpanel` box is applied only when there is\n actually content to sit in it. */}\n {items.map((item) => (\n <TabPanel key={item.id} id={item.id} className={panels ? 'pire-tabpanel' : undefined}>\n {panels?.[item.id]}\n </TabPanel>\n ))}\n </AriaTabs>\n );\n}\n","import type * as React from 'react';\nimport { Breadcrumbs as AriaBreadcrumbs, Breadcrumb as AriaBreadcrumb, Link } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { cx } from '../utils/cx';\n\nexport interface BreadcrumbItem { id?: string; label: string; href?: string }\n\nexport interface BreadcrumbProps {\n /** Ordered trail, current page last. The last item is never a link. */\n items: BreadcrumbItem[];\n onNavigate?: (id: string) => void;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function Breadcrumb({ items, onNavigate, className, style }: BreadcrumbProps) {\n return (\n <AriaBreadcrumbs className={cx('pire-breadcrumbs', className)} style={style} items={items}\n onAction={(key) => onNavigate?.(String(key))}>\n {(item) => {\n const last = items[items.length - 1] === item;\n return (\n <AriaBreadcrumb className=\"pire-breadcrumb\" id={item.id ?? item.label}>\n {last ? item.label : <Link href={item.href}>{item.label}</Link>}\n {last ? null : <Icon name=\"chevron-right\" size={12} style={{ color: 'var(--text-tertiary)' }} />}\n </AriaBreadcrumb>\n );\n }}\n </AriaBreadcrumbs>\n );\n}\n","import type * as React from 'react';\nimport { IconButton } from '../core/IconButton';\nimport { Select } from '../forms/Select';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface PaginationProps {\n page?: number;\n pageSize?: number;\n /** Total record count — always shown, so users know the data set size. */\n total?: number;\n onPageChange?: (page: number) => void;\n onPageSizeChange?: (size: number) => void;\n pageSizes?: number[];\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function Pagination({ page = 1, pageSize = 25, total = 0, onPageChange, onPageSizeChange,\n pageSizes = [25, 50, 100], className, style }: PaginationProps) {\n const msg = usePireMessages();\n const pages = Math.max(1, Math.ceil(total / pageSize));\n const from = total === 0 ? 0 : (page - 1) * pageSize + 1;\n const to = Math.min(total, page * pageSize);\n return (\n <nav className={cx('pire-pagination', className)} style={style} aria-label={msg.paginationLabel}>\n <span className=\"pire-pagination-count\">\n {msg.paginationRange\n .replace('{from}', from.toLocaleString())\n .replace('{to}', to.toLocaleString())\n .replace('{total}', total.toLocaleString())}\n </span>\n <IconButton icon=\"chevron-left\" label={msg.paginationPrevious} size=\"sm\" variant=\"outlined\"\n isDisabled={page <= 1} onPress={() => onPageChange?.(page - 1)} />\n <span className=\"pire-pagination-count\" aria-live=\"polite\">\n {msg.paginationPageOf.replace('{page}', String(page)).replace('{pages}', String(pages))}\n </span>\n <IconButton icon=\"chevron-right\" label={msg.paginationNext} size=\"sm\" variant=\"outlined\"\n isDisabled={page >= pages} onPress={() => onPageChange?.(page + 1)} />\n {onPageSizeChange ? (\n <Select aria-label={msg.paginationRowsPerPage} size=\"sm\" fullWidth={false} value={String(pageSize)}\n options={pageSizes.map((s) => ({ value: String(s), label: `${s} rows` }))}\n onChange={(v) => onPageSizeChange(Number(v))} style={{ width: 120 }} />\n ) : null}\n </nav>\n );\n}\n","import type * as React from 'react';\nimport { Icon } from '../core/Icon';\nimport { IconButton } from '../core/IconButton';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport type MessageKind = 'info' | 'success' | 'warning' | 'error';\nconst KIND_ICON: Record<MessageKind, string> = {\n info: 'info', success: 'check-circle-2', warning: 'alert-triangle', error: 'alert-octagon',\n};\n\nexport interface InlineMessageProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n kind?: MessageKind;\n /** Message heading. Rich content, not the DOM title/tooltip attribute. */\n title?: React.ReactNode;\n /** Follow-up action, usually a tertiary Button. */\n action?: React.ReactNode;\n /** Provide to render a dismiss affordance. */\n onClose?: () => void;\n}\n\n/** In-page message tied to a region or form. Errors and warnings announce themselves. */\nexport function InlineMessage({ kind = 'info', title, action, onClose, children, className, ...rest }: InlineMessageProps) {\n const msg = usePireMessages();\n const assertive = kind === 'error' || kind === 'warning';\n return (\n <div className={cx('pire-msg', className)} data-kind={kind}\n role={assertive ? 'alert' : 'status'} aria-live={assertive ? 'assertive' : 'polite'} {...rest}>\n <Icon name={KIND_ICON[kind]} size={16} style={{ marginTop: 2 }} />\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', gap: 'var(--sp-1)' }}>\n {title ? <span className=\"pire-msg-title\">{title}</span> : null}\n {children ? <span className=\"pire-msg-body\">{children}</span> : null}\n {action}\n </div>\n {onClose ? <IconButton icon=\"x\" label={msg.inlineMessageDismiss} size=\"sm\" onPress={onClose} /> : null}\n </div>\n );\n}\n","import * as React from 'react';\nimport { Icon } from '../core/Icon';\nimport { IconButton } from '../core/IconButton';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\nimport type { MessageKind } from './InlineMessage';\n\nconst KIND_ICON: Record<MessageKind, string> = {\n info: 'info', success: 'check-circle-2', warning: 'alert-triangle', error: 'alert-octagon',\n};\n\nexport interface ToastProps extends React.HTMLAttributes<HTMLDivElement> {\n kind?: MessageKind;\n onClose?: () => void;\n position?: 'bottom-center' | 'bottom-right';\n}\n\n/** Transient confirmation of a completed action. Never use for errors the user must act on —\n * those belong in an InlineMessage next to the cause. */\nexport function Toast({ kind = 'success', onClose, position = 'bottom-center', children, className, ...rest }: ToastProps) {\n const msg = usePireMessages();\n return (\n <div className={cx('pire-toast', className)} data-position={position}\n role={kind === 'error' ? 'alert' : 'status'} aria-live={kind === 'error' ? 'assertive' : 'polite'} {...rest}>\n <Icon name={KIND_ICON[kind]} size={16} />\n <span style={{ flex: 1 }}>{children}</span>\n {onClose ? <IconButton icon=\"x\" label={msg.toastDismiss} size=\"sm\" variant=\"inverse\" onPress={onClose} /> : null}\n </div>\n );\n}\n\nexport interface ToastItem { id: string; kind?: MessageKind; message: React.ReactNode; timeout?: number }\n\ninterface ToastContextValue { add: (toast: Omit<ToastItem, 'id'>) => string; close: (id: string) => void }\nconst ToastContext = React.createContext<ToastContextValue | null>(null);\n\n/** Queue + live region. Mount once near the app root. */\nexport function ToastProvider({ children, timeout = 6000 }: { children?: React.ReactNode; timeout?: number }) {\n const msg = usePireMessages();\n const [toasts, setToasts] = React.useState<ToastItem[]>([]);\n const close = React.useCallback((id: string) => setToasts((t) => t.filter((x) => x.id !== id)), []);\n const add = React.useCallback((toast: Omit<ToastItem, 'id'>) => {\n const id = Math.random().toString(36).slice(2);\n setToasts((t) => [...t, { ...toast, id }]);\n const ms = toast.timeout ?? timeout;\n if (ms > 0) setTimeout(() => close(id), ms);\n return id;\n }, [close, timeout]);\n const value = React.useMemo(() => ({ add, close }), [add, close]);\n return (\n <ToastContext.Provider value={value}>\n {children}\n <div className=\"pire-toast-region\" role=\"region\" aria-label={msg.toastRegionLabel}>\n {toasts.map((t) => (\n <Toast key={t.id} kind={t.kind} onClose={() => close(t.id)} style={{ position: 'static', transform: 'none' }}>\n {t.message}\n </Toast>\n ))}\n </div>\n </ToastContext.Provider>\n );\n}\n\n/** `const toast = useToast(); toast.add({ kind: 'success', message: 'Order 4500012 released.' })` */\nexport function useToast() {\n const ctx = React.useContext(ToastContext);\n if (!ctx) throw new Error('useToast must be used inside <ToastProvider>');\n return ctx;\n}\n","import type * as React from 'react';\nimport { Button as AriaButton } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { cx } from '../utils/cx';\n\nexport interface KpiTileProps {\n /** Short metric name. Truncates — the tile shrinks with its grid track. */\n label: React.ReactNode;\n /** Pre-formatted figure — format in the caller's locale, not here. */\n value: React.ReactNode;\n unit?: React.ReactNode;\n /** Comparison figure, e.g. \"+4.2% vs last month\". */\n delta?: React.ReactNode;\n /** Which arrow to draw — purely the direction the number moved. */\n deltaDirection?: 'up' | 'down';\n /** Whether that movement is good news. A rising overdue-invoice count is\n * deltaDirection=\"up\" with deltaTone=\"negative\". Defaults to positive for up. */\n deltaTone?: 'positive' | 'negative' | 'neutral';\n footnote?: React.ReactNode;\n icon?: string;\n /** Tints the value when the KPI itself is out of tolerance. */\n status?: 'neutral' | 'positive' | 'critical' | 'negative';\n onPress?: () => void;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport function KpiTile({ label, value, unit, delta, deltaDirection, deltaTone, footnote, icon,\n status = 'neutral', onPress, className, style }: KpiTileProps) {\n const tone = deltaTone ?? (deltaDirection === 'down' ? 'negative' : 'positive');\n const body = (\n <>\n <span className=\"pire-kpi-label\">\n {icon ? <Icon name={icon} size={16} /> : null}{label}\n </span>\n <span className=\"pire-kpi-value\">{value}{unit ? <span className=\"pire-kpi-unit\">{unit}</span> : null}</span>\n {delta ? (\n <span className=\"pire-kpi-delta\" data-tone={tone}>\n {deltaDirection ? <Icon name={deltaDirection === 'up' ? 'trending-up' : 'trending-down'} size={12} /> : null}\n {delta}\n </span>\n ) : null}\n {footnote ? <span className=\"pire-kpi-foot\">{footnote}</span> : null}\n </>\n );\n const props = { className: cx('pire-kpi', className), 'data-status': status, style };\n return onPress\n ? <AriaButton {...props} data-pressable=\"true\" onPress={onPress}>{body}</AriaButton>\n : <div {...props}>{body}</div>;\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface ObjectFact { label: string; value: React.ReactNode; numeric?: boolean }\n\nexport interface ObjectHeaderProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title' | 'id'> {\n title: React.ReactNode;\n subtitle?: React.ReactNode;\n /** Technical key — rendered in mono next to the subtitle. Not the DOM id. */\n id?: React.ReactNode;\n /** A <Breadcrumb /> element. */\n breadcrumb?: React.ReactNode;\n /** A <Badge /> carrying the object's value state. */\n badge?: React.ReactNode;\n /** Key/value summary strip. Set numeric for amounts. */\n facts?: ObjectFact[];\n actions?: React.ReactNode;\n}\n\n/** The identity block at the top of any object page: who this record is, its state, its key figures. */\nexport function ObjectHeader({ title, subtitle, id, breadcrumb, badge, facts, actions, className, ...rest }: ObjectHeaderProps) {\n return (\n <header className={cx('pire-objheader', className)} {...rest}>\n {breadcrumb}\n <div className=\"pire-objheader-row\">\n <div style={{ minWidth: 0 }}>\n <h1 className=\"pire-objheader-title\">{title}</h1>\n {subtitle || id ? (\n <div className=\"pire-objheader-sub\">\n {subtitle}\n {id ? <span className=\"pire-objheader-id\">{id}</span> : null}\n </div>\n ) : null}\n </div>\n {badge}\n {actions ? <div className=\"pire-objheader-actions\">{actions}</div> : null}\n </div>\n {facts?.length ? (\n <dl className=\"pire-facts\" style={{ margin: 0 }}>\n {facts.map((fact) => (\n <div key={fact.label}>\n <dt className=\"pire-fact-label\">{fact.label}</dt>\n <dd className=\"pire-fact-value\" data-numeric={fact.numeric ? 'true' : undefined} style={{ margin: 0 }}>\n {fact.value}\n </dd>\n </div>\n ))}\n </dl>\n ) : null}\n </header>\n );\n}\n","import type * as React from 'react';\nimport { Button } from '../core/Button';\nimport { Tag } from '../core/Tag';\nimport { useMessage } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface ActiveFilter { id: string; label: string }\n\nexport interface FilterBarProps extends React.HTMLAttributes<HTMLElement> {\n /** Filter controls — Inputs and Selects with their own labels. */\n children?: React.ReactNode;\n /** Applied filters, shown as removable Tags. */\n activeFilters?: ActiveFilter[];\n onRemoveFilter?: (id: string) => void;\n onClear?: () => void;\n /** Provide to render the \"Go\" trigger. Pire filters apply explicitly, never live. */\n onGo?: () => void;\n /** e.g. \"1,284 orders\". Announced when it changes. */\n resultLabel?: React.ReactNode;\n actions?: React.ReactNode;\n /** Overrides the dictionary's `filterBarGo` for this bar only. */\n goLabel?: string;\n /** Overrides the dictionary's `filterBarClearAll` for this bar only. */\n clearAllLabel?: string;\n /** Overrides the dictionary's `filterBarLabel` — the landmark name. */\n 'aria-label'?: string;\n}\n\nexport function FilterBar({ children, activeFilters = [], onRemoveFilter, onClear, onGo,\n resultLabel, actions, goLabel, clearAllLabel, className, ...rest }: FilterBarProps) {\n const label = useMessage('filterBarLabel', rest['aria-label']);\n const go = useMessage('filterBarGo', goLabel);\n const clearAll = useMessage('filterBarClearAll', clearAllLabel);\n\n return (\n <section className={cx('pire-filterbar', className)} {...rest} aria-label={label}>\n <div className=\"pire-filterbar-controls\">\n {children}\n {onGo ? <Button variant=\"primary\" onPress={onGo}>{go}</Button> : null}\n </div>\n {activeFilters.length || resultLabel || actions ? (\n <div className=\"pire-filterbar-foot\">\n {activeFilters.map((filter) => (\n <Tag key={filter.id} onRemove={onRemoveFilter ? () => onRemoveFilter(filter.id) : undefined}>\n {filter.label}\n </Tag>\n ))}\n {activeFilters.length && onClear ? (\n <Button variant=\"tertiary\" size=\"sm\" onPress={onClear}>{clearAll}</Button>\n ) : null}\n {resultLabel ? <span className=\"pire-filterbar-result\" aria-live=\"polite\">{resultLabel}</span> : null}\n {actions ? <div className=\"pire-filterbar-actions\">{actions}</div> : null}\n </div>\n ) : null}\n </section>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface DescriptionItem {\n label: React.ReactNode;\n value: React.ReactNode;\n /** Tabular mono — use for every amount, quantity and ID. */\n numeric?: boolean;\n /** Separates and enlarges the row: totals, gross value, balance. */\n emphasis?: boolean;\n /** Rendered after the term — a Tooltip trigger explaining the figure. */\n hint?: React.ReactNode;\n}\n\nexport interface DescriptionListProps extends React.HTMLAttributes<HTMLDListElement> {\n items: DescriptionItem[];\n /** rows = label left / value right (totals panels). grid = caps label above value (detail facts). */\n layout?: 'rows' | 'grid';\n /** Columns when layout is grid. */\n columns?: number;\n}\n\n/** Key/value readout: order totals, stock figures, master-data summaries. Replaces the hand-rolled\n * <dl> that every ERP screen used to carry. */\nexport function DescriptionList({ items, layout = 'rows', columns = 3, className, style, ...rest }: DescriptionListProps) {\n return (\n <dl className={cx('pire-dl', className)} data-layout={layout}\n style={{ ...(layout === 'grid' ? { '--pire-dl-cols': columns } : null), ...style } as React.CSSProperties} {...rest}>\n {items.map((item, i) => (\n <div className=\"pire-dl-row\" key={i} data-emphasis={item.emphasis ? 'true' : undefined}>\n <dt className=\"pire-dl-term\">{item.label}{item.hint}</dt>\n <dd className=\"pire-dl-value\" data-numeric={item.numeric ? 'true' : undefined}>{item.value}</dd>\n </div>\n ))}\n </dl>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface TimelineEntry {\n id?: string;\n /** Pre-formatted timestamp — format in the caller's locale. */\n time: React.ReactNode;\n event: React.ReactNode;\n /** Who or what caused it: a user name, \"System\", an interface id. */\n actor?: React.ReactNode;\n}\n\nexport interface TimelineProps extends React.HTMLAttributes<HTMLOListElement> {\n entries: TimelineEntry[];\n /** Newest first. Default true — audit trails read top-down from now. */\n reverse?: boolean;\n}\n\n/** Document history and audit trail: what happened, when, and who did it. */\nexport function Timeline({ entries, reverse = false, className, ...rest }: TimelineProps) {\n const list = reverse ? [...entries].reverse() : entries;\n return (\n <ol className={cx('pire-timeline', className)} {...rest}>\n {list.map((entry, i) => (\n <li className=\"pire-timeline-item\" key={entry.id ?? i}>\n <span className=\"pire-timeline-time\">{entry.time}</span>\n <span className=\"pire-timeline-text\">{entry.event}</span>\n {entry.actor ? <span className=\"pire-timeline-actor\">{entry.actor}</span> : null}\n </li>\n ))}\n </ol>\n );\n}\n","/**\n * Scale maths and slot assignment shared by the chart components.\n *\n * Kept free of React and of the DOM so the arithmetic — which is where charts go quietly\n * wrong — can be tested directly rather than through a rendered SVG.\n */\n\n/** One measured thing, drawn across every category. */\nexport interface ChartSeries {\n /** Stable across re-renders and across filter changes. Colour follows this, not position. */\n id: string;\n /** Shown in the legend, the tooltip and the data table. */\n label: string;\n /** One entry per category, in the same order. `null` is a gap in the data, never a zero. */\n values: (number | null)[];\n /**\n * Pin this series to a specific `--viz` slot, 1–6. Without it slots are handed out in\n * order. Use it when the same entity appears on several charts and must keep one colour.\n */\n colorIndex?: number;\n}\n\n/** How many distinct series colours the palette defines. Validated as a set; do not extend. */\nexport const VIZ_SLOT_COUNT = 6;\n\nexport interface ChartScale {\n min: number;\n max: number;\n /** Ascending, always including `min` and `max`. */\n ticks: number[];\n}\n\nconst NICE_STEPS = [1, 2, 2.5, 5, 10];\n\n/** Rounds a rough step up to the nearest 1 / 2 / 2.5 / 5 / 10 × 10ⁿ, so axis labels stay readable. */\nfunction niceStep(rough: number): number {\n if (!(rough > 0)) return 1;\n const magnitude = 10 ** Math.floor(Math.log10(rough));\n const normalized = rough / magnitude;\n return (NICE_STEPS.find((candidate) => candidate >= normalized) ?? 10) * magnitude;\n}\n\n/**\n * A rounded axis covering `values`.\n *\n * `startAtZero` defaults to true because a bar's length is only readable when the axis starts\n * at zero — a truncated bar axis exaggerates differences, which is the commonest way a chart\n * misleads. Lines may pass false, since a line encodes change rather than magnitude.\n */\nexport function linearScale(\n values: (number | null | undefined)[], tickCount = 4, startAtZero = true,\n): ChartScale {\n const present = values.filter((value): value is number =>\n value != null && Number.isFinite(value));\n if (present.length === 0) return { min: 0, max: 1, ticks: [0, 1] };\n\n let low = Math.min(...present);\n let high = Math.max(...present);\n if (startAtZero) { low = Math.min(0, low); high = Math.max(0, high); }\n // A flat series still needs an axis with height, or every bar renders at zero pixels.\n if (low === high) { high = low === 0 ? 1 : low + Math.abs(low); }\n\n const step = niceStep((high - low) / Math.max(1, tickCount));\n\n // Two float defences, because both failures land straight on the axis labels.\n // The epsilon stops a value that is exactly on a step — 0.5 / 0.1 evaluating to\n // 5.000000000000001 — from rounding up to a whole extra tick. The decimal rounding stops\n // 3 × 0.1 from printing as \"0.30000000000000004\".\n const EDGE_TOLERANCE = 1e-9;\n const decimals = Math.max(0, 1 - Math.floor(Math.log10(step)));\n const toStepPrecision = (value: number) => Number(value.toFixed(decimals));\n\n const min = toStepPrecision(Math.floor(low / step + EDGE_TOLERANCE) * step);\n const max = toStepPrecision(Math.ceil(high / step - EDGE_TOLERANCE) * step);\n\n const stepCount = Math.round((max - min) / step);\n const ticks = Array.from({ length: stepCount + 1 },\n (_, index) => toStepPrecision(min + index * step));\n return { min, max, ticks };\n}\n\n/** Where `value` sits on `scale`, as 0–1 from the axis minimum. */\nexport function scalePosition(value: number, scale: ChartScale): number {\n const span = scale.max - scale.min;\n return span === 0 ? 0 : (value - scale.min) / span;\n}\n\n/**\n * The CSS colour for a series.\n *\n * Slots are handed out in declaration order and never cycled: past the sixth, identity by\n * colour alone stops being reliable, so the overflow folds into one \"other\" neutral instead\n * of inventing a seventh hue. Aggregate upstream when you have more than six.\n */\nexport function seriesColor(series: ChartSeries, index: number): string {\n const slot = series.colorIndex ?? index + 1;\n return slot >= 1 && slot <= VIZ_SLOT_COUNT ? `var(--viz-${slot})` : 'var(--viz-other)';\n}\n\n/** Declared locally for the same reason as in `Icon` — see the note there. The bare\n * `process.env.NODE_ENV` token has to survive into the output for a bundler to substitute it,\n * and the package deliberately carries no `@types/node`. */\ndeclare const process: { env: { NODE_ENV?: string } };\nconst IS_DEV = process.env.NODE_ENV !== 'production';\n\n/** Charts re-render on every filter change, so one warning per cause rather than per render. */\nconst warnedCharts = new Set<string>();\n\n/** Dev-only nudge: more series than the palette can tell apart is a data-shape problem. */\nexport function warnOnSlotOverflow(series: ChartSeries[], chartLabel: string): void {\n if (!IS_DEV || warnedCharts.has(chartLabel)) return;\n if (series.length <= VIZ_SLOT_COUNT) return;\n warnedCharts.add(chartLabel);\n console.warn(\n `[pire] \"${chartLabel}\" has ${series.length} series but the palette defines ` +\n `${VIZ_SLOT_COUNT} distinguishable colours. The extras render in one shared neutral. ` +\n 'Group the tail into an \"Other\" series, or split the chart into small multiples.',\n );\n}\n\n/**\n * Dev-only checks specific to a donut, where the failure modes are about shape rather than count.\n *\n * Negative values are the important one: an arc length cannot be negative, so a refund or a\n * reversal silently draws as its own absolute value and the chart reads as confidently wrong.\n */\nexport function warnOnDonutShape(\n series: ChartSeries[], categoryCount: number, chartLabel: string,\n): void {\n if (!IS_DEV || warnedCharts.has(`donut:${chartLabel}`)) return;\n\n const complaints: string[] = [];\n if (series.length > 1) {\n complaints.push(`it has ${series.length} series but a donut draws one — the rest are ignored`);\n }\n if (categoryCount > VIZ_SLOT_COUNT) {\n complaints.push(`it has ${categoryCount} segments and the palette defines ${VIZ_SLOT_COUNT}; `\n + 'past about four, slices stop being readable at all — group the tail into \"Other\"');\n }\n if (series[0]?.values.some((value) => value != null && value < 0)) {\n complaints.push('it contains negative values, which have no part-to-whole meaning — '\n + 'a signed measure belongs in a bar chart');\n }\n if (complaints.length === 0) return;\n\n warnedCharts.add(`donut:${chartLabel}`);\n console.warn(`[pire] DonutChart \"${chartLabel}\": ${complaints.join('; ')}.`);\n}\n\n/** Sum of a category's values across series, skipping gaps. Used for stacked totals. */\nexport function stackTotal(series: ChartSeries[], categoryIndex: number): number {\n return series.reduce((total, one) => total + (one.values[categoryIndex] ?? 0), 0);\n}\n\n/** Every plotted number in one flat list — what the scale is derived from. */\nexport function flatValues(series: ChartSeries[]): (number | null)[] {\n return series.flatMap((one) => one.values);\n}\n\n/**\n * Trims each series to the category count.\n *\n * A series longer than the axis would otherwise plot points past the last category, stacked on\n * top of each other at an undefined position. Shorter series need no padding — reading past the\n * end already yields `undefined`, which every call site treats as a gap.\n */\nexport function alignToCategories(series: ChartSeries[], categoryCount: number): ChartSeries[] {\n return series.map((one) => (one.values.length <= categoryCount\n ? one\n : { ...one, values: one.values.slice(0, categoryCount) }));\n}\n","import type * as React from 'react';\nimport type { ChartSeries } from './chartGeometry';\nimport { seriesColor } from './chartGeometry';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\n/** Props every chart shares. Each chart adds its own encoding options on top. */\nexport interface ChartBaseProps {\n /**\n * What the chart shows, in a sentence. Required: a chart with no accessible name is\n * an unlabelled image, and the visible title cannot be relied on — charts are often\n * placed under a heading that already says something different.\n */\n 'aria-label': string;\n /** Category axis labels. `series[].values` line up with these by index. */\n categories: string[];\n series: ChartSeries[];\n /** Shown above the plot. With a single series this is what names it, in place of a legend. */\n title?: React.ReactNode;\n /** Sits under the title in secondary ink — units, period, source. */\n description?: React.ReactNode;\n /**\n * Formats every number that reaches a human: axis ticks, tooltips, the data table.\n * Pire does not format — only the app knows the currency, the locale and the precision.\n */\n formatValue?: (value: number) => string;\n /** Plot height in pixels. Width always fills the container. */\n height?: number;\n /** Replaces the plot when there is nothing to draw. */\n emptyState?: React.ReactNode;\n /** Renders the underlying table visibly beneath the plot, instead of only for screen readers. */\n showDataTable?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/** One swatch in the legend. What it identifies differs by chart — see `ChartFrameProps.legend`. */\nexport interface ChartLegendItem {\n key: string;\n label: string;\n color: string;\n}\n\nexport interface ChartFrameProps extends\n Pick<ChartBaseProps, 'title' | 'description' | 'categories' | 'series' | 'showDataTable'\n | 'className' | 'style'> {\n label: string;\n formatValue: (value: number) => string;\n /**\n * Rendered only when there are at least two entries — one thing needs no key to tell it from\n * the others, and the title already names it.\n *\n * The chart decides what an entry stands for: bars and lines colour by series, a donut colours\n * by segment. Passing the list ready-made keeps that decision with the chart that made it.\n */\n legend?: ChartLegendItem[];\n children: React.ReactNode;\n}\n\n/** Legend entries for a chart that colours by series — bars and lines. */\nexport function seriesLegend(series: ChartSeries[]): ChartLegendItem[] {\n return series.map((one, index) => ({\n key: one.id, label: one.label, color: seriesColor(one, index),\n }));\n}\n\n/** Falls back to the browser's grouping so large figures stay readable without configuration. */\nexport const defaultFormatValue = (value: number): string => value.toLocaleString();\n\n/**\n * The shell around every Pire chart: heading, legend, plot, and the data table.\n *\n * The table is always in the DOM. A chart summarised in prose tells a screen-reader user what\n * someone else concluded; the table gives them the same numbers everyone else is looking at.\n * `showDataTable` only decides whether it is also visible.\n */\nexport function ChartFrame({\n label, title, description, categories, series, formatValue, legend, showDataTable,\n className, style, children,\n}: ChartFrameProps) {\n const msg = usePireMessages();\n return (\n <figure className={cx('pire-chart', className)} style={style}>\n {title || description ? (\n <figcaption className=\"pire-chart-head\">\n {title ? <span className=\"pire-chart-title\">{title}</span> : null}\n {description ? <span className=\"pire-chart-desc\">{description}</span> : null}\n </figcaption>\n ) : null}\n\n {legend && legend.length > 1 ? (\n <ul className=\"pire-chart-legend\">\n {legend.map((item) => (\n <li key={item.key} className=\"pire-chart-legend-item\">\n <span className=\"pire-chart-swatch\" style={{ background: item.color }} />\n {item.label}\n </li>\n ))}\n </ul>\n ) : null}\n\n {/* The plot is decorative to assistive tech — the table below carries the same data,\n and reading out a wall of SVG shapes is worse than nothing. */}\n <div className=\"pire-chart-plot\" aria-hidden=\"true\">{children}</div>\n\n <div className={showDataTable ? 'pire-chart-table' : 'pire-sr-only'}>\n <table>\n <caption>{label}</caption>\n <thead>\n <tr>\n <th scope=\"col\">{msg.chartCategoryHeader}</th>\n {series.map((one) => <th key={one.id} scope=\"col\">{one.label}</th>)}\n </tr>\n </thead>\n <tbody>\n {categories.map((category, categoryIndex) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: categories are positional and repeat legitimately (two quarters both labelled \"Q1\").\n <tr key={categoryIndex}>\n <th scope=\"row\">{category}</th>\n {series.map((one) => {\n const value = one.values[categoryIndex];\n return (\n <td key={one.id}>\n {value == null ? msg.chartNoValue : formatValue(value)}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </figure>\n );\n}\n","import type * as React from 'react';\nimport type { ChartBaseProps } from './ChartFrame';\nimport { ChartFrame, defaultFormatValue, seriesLegend } from './ChartFrame';\nimport {\n alignToCategories, flatValues, linearScale, scalePosition, seriesColor, stackTotal,\n warnOnSlotOverflow,\n} from './chartGeometry';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\n\nexport interface BarChartProps extends ChartBaseProps {\n /**\n * `horizontal` puts categories down the side, which is what long ERP labels need — product\n * names and account descriptions do not fit under a vertical bar without turning sideways.\n * Use `vertical` when the categories are periods and reading left-to-right means time.\n */\n orientation?: 'horizontal' | 'vertical';\n /**\n * Stack the series into one bar per category, for parts of a total.\n *\n * Only the first segment and the total are easy to compare across categories, because the\n * middle segments start at different offsets. If the comparison matters more than the total,\n * leave this off and let the bars sit side by side.\n */\n stacked?: boolean;\n /**\n * Print each value beside its bar. Defaults on for a single series — where the chart is a\n * ranking and the number is half the answer — and off beyond that, where a label per bar\n * turns into noise. The tooltip and the data table always carry every value.\n */\n showValues?: boolean;\n}\n\n/**\n * Magnitude and ranking — how big, and in what order.\n *\n * Laid out in HTML rather than SVG so category labels are real text: they wrap, truncate and\n * inherit type tokens, none of which survives a scaled `viewBox`. The bar axis always starts at\n * zero, since a bar encodes length, and a truncated axis overstates the difference.\n */\nexport function BarChart({\n categories, series: rawSeries, title, description, formatValue = defaultFormatValue,\n height = 260, emptyState, showDataTable, orientation = 'horizontal', stacked = false,\n showValues, className, style, ...rest\n}: BarChartProps) {\n const label = rest['aria-label'];\n const msg = usePireMessages();\n warnOnSlotOverflow(rawSeries, label);\n\n const series = alignToCategories(rawSeries, categories.length);\n const hasData = categories.length > 0 && series.length > 0;\n const withValues = showValues ?? series.length === 1;\n\n // Stacking compares totals, so the axis has to reach the tallest total rather than the\n // tallest single value.\n const scale = linearScale(\n stacked ? categories.map((_, index) => stackTotal(series, index)) : flatValues(series),\n );\n\n const sizeOf = (value: number) => `${scalePosition(value, scale) * 100}%`;\n\n /**\n * The figure in the right-hand column. A missing reading gets the \"no data\" wording rather\n * than a formatted zero — printing ₲ 0 for a month nobody has closed states a number that\n * was never measured.\n */\n const horizontalLabelFor = (categoryIndex: number) => {\n if (stacked) return formatValue(stackTotal(series, categoryIndex));\n const value = series[0].values[categoryIndex];\n return value == null ? msg.chartNoValue : formatValue(value);\n };\n\n return (\n <ChartFrame\n label={label} title={title} description={description} categories={categories}\n series={series} formatValue={formatValue} legend={seriesLegend(series)}\n showDataTable={showDataTable} className={className} style={style}\n >\n {!hasData ? (\n <div className=\"pire-chart-empty\">{emptyState ?? msg.chartEmpty}</div>\n ) : (\n <div\n className=\"pire-chart-bars\"\n data-orientation={orientation}\n data-stacked={String(stacked)}\n style={{ '--pire-chart-height': `${height}px` } as React.CSSProperties}\n >\n {categories.map((category, categoryIndex) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: categories are positional and repeat legitimately (two quarters both labelled \"Q1\").\n <div key={categoryIndex} className=\"pire-chart-group\">\n <span className=\"pire-chart-cat\">{category}</span>\n <div className=\"pire-chart-track\">\n {series.map((one, seriesIndex) => {\n const value = one.values[categoryIndex];\n if (value == null) return null;\n return (\n <div\n key={one.id}\n className=\"pire-chart-bar\"\n style={{\n '--pire-bar-size': sizeOf(value),\n '--pire-bar-color': seriesColor(one, seriesIndex),\n } as React.CSSProperties}\n >\n {/* Vertical bars label themselves. A shared column would put the number at\n a fixed height while the bar it belongs to ends somewhere else. */}\n {withValues && orientation === 'vertical' ? (\n <span className=\"pire-chart-barval\">{formatValue(value)}</span>\n ) : null}\n <span className=\"pire-chart-tip\" role=\"presentation\">\n {series.length > 1 ? `${one.label}: ` : ''}\n {formatValue(value)}\n </span>\n </div>\n );\n })}\n </div>\n {/* Horizontal keeps a shared right-hand column instead: the bars all end at\n different points, so aligned figures are far easier to compare down the list. */}\n {withValues && orientation === 'horizontal' ? (\n <span className=\"pire-chart-val\">{horizontalLabelFor(categoryIndex)}</span>\n ) : null}\n </div>\n ))}\n </div>\n )}\n </ChartFrame>\n );\n}\n","import * as React from 'react';\nimport type { ChartBaseProps } from './ChartFrame';\nimport { ChartFrame, defaultFormatValue, seriesLegend } from './ChartFrame';\nimport {\n alignToCategories, flatValues, linearScale, scalePosition, seriesColor, warnOnSlotOverflow,\n} from './chartGeometry';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\n\nexport interface LineChartProps extends ChartBaseProps {\n /**\n * Tint the area under each line. Reads well for one series; with several the fills overlap\n * and the lower ones are read as smaller than they are, so it is ignored past the first.\n */\n showArea?: boolean;\n /**\n * Draw a dot at every point. On by default under about twenty points, where the dots show\n * where the real readings are rather than implying data between them.\n */\n showMarkers?: boolean;\n /**\n * Let the axis start above zero, so a small movement in a large number stays visible.\n *\n * Legitimate for a line, which encodes change rather than length — but it does exaggerate,\n * so leave it off whenever the size of the number is part of the point.\n */\n zoomToData?: boolean;\n}\n\n/** Room for the axis labels, in CSS pixels. The plot is what is left inside these. */\nconst PLOT_INSET = { top: 10, right: 14, bottom: 24, left: 58 };\n\n/** Below this many points a dot per reading is informative; above it, it is a smear. */\nconst MARKER_LIMIT = 20;\n\n/**\n * `useLayoutEffect` where there is a DOM, `useEffect` where there is not.\n *\n * Server rendering warns about layout effects, but falling back to `useEffect` on the client\n * would measure after the first paint and show an empty plot frame for a frame.\n */\nconst useIsomorphicLayoutEffect =\n typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect;\n\n/** Tracks the rendered width, because a line's geometry cannot be expressed in percentages. */\nfunction useMeasuredWidth(): [React.RefObject<HTMLDivElement | null>, number] {\n const ref = React.useRef<HTMLDivElement | null>(null);\n const [width, setWidth] = React.useState(0);\n\n useIsomorphicLayoutEffect(() => {\n const element = ref.current;\n if (!element) return;\n // Measure once up front: ResizeObserver's first callback is asynchronous, so waiting for\n // it would paint an empty frame before the chart appears.\n setWidth(element.getBoundingClientRect().width);\n const observer = new ResizeObserver(([entry]) => setWidth(entry.contentRect.width));\n observer.observe(element);\n return () => observer.disconnect();\n }, []);\n\n return [ref, width];\n}\n\n/**\n * Change over time.\n *\n * Drawn in SVG at measured pixel coordinates rather than a scaled `viewBox`: scaling a viewBox\n * to fit stretches the type and turns markers into ellipses. Gaps in a series break the line\n * instead of interpolating across them — a missing month is not a straight line through it.\n */\nexport function LineChart({\n categories, series: rawSeries, title, description, formatValue = defaultFormatValue,\n height = 260, emptyState, showDataTable, showArea = false, showMarkers, zoomToData = false,\n className, style, ...rest\n}: LineChartProps) {\n const label = rest['aria-label'];\n const msg = usePireMessages();\n warnOnSlotOverflow(rawSeries, label);\n\n const [plotRef, width] = useMeasuredWidth();\n const series = alignToCategories(rawSeries, categories.length);\n const hasData = categories.length > 0 && series.length > 0;\n const withMarkers = showMarkers ?? categories.length <= MARKER_LIMIT;\n\n const scale = linearScale(flatValues(series), 4, !zoomToData);\n const innerWidth = Math.max(0, width - PLOT_INSET.left - PLOT_INSET.right);\n const innerHeight = Math.max(0, height - PLOT_INSET.top - PLOT_INSET.bottom);\n\n const xAt = (index: number) => PLOT_INSET.left + (categories.length <= 1\n ? innerWidth / 2\n : (index / (categories.length - 1)) * innerWidth);\n const yAt = (value: number) =>\n PLOT_INSET.top + innerHeight - scalePosition(value, scale) * innerHeight;\n\n /** One `M`-prefixed run per unbroken stretch, so nulls leave a hole rather than a shortcut. */\n const pathFor = (values: (number | null)[]) => {\n let path = '';\n let penIsDown = false;\n values.forEach((value, index) => {\n if (value == null) { penIsDown = false; return; }\n path += `${penIsDown ? 'L' : 'M'}${xAt(index)} ${yAt(value)} `;\n penIsDown = true;\n });\n return path.trim();\n };\n\n /** Closed back down to the baseline so the fill has a bottom edge. */\n const areaFor = (values: (number | null)[]) => {\n const present = values\n .map((value, index) => ({ value, index }))\n .filter((point): point is { value: number; index: number } => point.value != null);\n if (present.length < 2) return '';\n const baseline = PLOT_INSET.top + innerHeight;\n const line = present.map((point) => `${xAt(point.index)} ${yAt(point.value)}`).join(' L');\n const last = present[present.length - 1];\n return `M${xAt(present[0].index)} ${baseline} L${line} L${xAt(last.index)} ${baseline} Z`;\n };\n\n // Every third label at most, so ticks never collide on a narrow dashboard column.\n const labelEvery = Math.max(1, Math.ceil(categories.length / Math.max(2, Math.floor(innerWidth / 64))));\n\n return (\n <ChartFrame\n label={label} title={title} description={description} categories={categories}\n series={series} formatValue={formatValue} legend={seriesLegend(series)}\n showDataTable={showDataTable} className={className} style={style}\n >\n {!hasData ? (\n <div className=\"pire-chart-empty\">{emptyState ?? msg.chartEmpty}</div>\n ) : (\n <div className=\"pire-chart-lines\" ref={plotRef} style={{ height }}>\n {/* The SVG is decorative: the frame's data table carries these numbers, and reading a\n wall of SVG shapes aloud is worse than nothing. It also waits for the first measured\n width, since there is no correct geometry before then. */}\n {width > 0 ? (\n <svg width={width} height={height} className=\"pire-chart-svg\"\n aria-hidden=\"true\" focusable=\"false\">\n <g className=\"pire-chart-grid\">\n {scale.ticks.map((tick) => (\n <line key={tick} x1={PLOT_INSET.left} x2={width - PLOT_INSET.right}\n y1={yAt(tick)} y2={yAt(tick)} />\n ))}\n </g>\n <g className=\"pire-chart-tick\">\n {scale.ticks.map((tick) => (\n <text key={tick} x={PLOT_INSET.left - 8} y={yAt(tick)}\n textAnchor=\"end\" dominantBaseline=\"middle\">\n {formatValue(tick)}\n </text>\n ))}\n {categories.map((category, index) => (\n index % labelEvery === 0 ? (\n // biome-ignore lint/suspicious/noArrayIndexKey: categories are positional and repeat legitimately (two quarters both labelled \"Q1\").\n <text key={index} x={xAt(index)} y={height - 6} textAnchor=\"middle\">\n {category}\n </text>\n ) : null\n ))}\n </g>\n\n {showArea && series[0] ? (\n <path d={areaFor(series[0].values)} className=\"pire-chart-area\"\n style={{ fill: seriesColor(series[0], 0) }} />\n ) : null}\n\n <g className=\"pire-chart-line\" fill=\"none\">\n {series.map((one, index) => (\n <path key={one.id} d={pathFor(one.values)} stroke={seriesColor(one, index)} />\n ))}\n </g>\n\n {withMarkers ? (\n <g className=\"pire-chart-marker\">\n {series.map((one, seriesIndex) => one.values.map((value, index) => (\n value == null ? null : (\n // biome-ignore lint/suspicious/noArrayIndexKey: a series is positional — the index is the point's identity, and category labels repeat.\n <circle key={`${one.id}-${index}`} cx={xAt(index)} cy={yAt(value)}\n r={4} fill={seriesColor(one, seriesIndex)} />\n )\n )))}\n </g>\n ) : null}\n </svg>\n ) : null}\n\n {/* Hover bands sit above the SVG in HTML: a crosshair and a tooltip that inherits the\n type tokens, without hand-positioning text inside the SVG. */}\n <div className=\"pire-chart-hover\"\n style={{ inset: `${PLOT_INSET.top}px ${PLOT_INSET.right}px ${PLOT_INSET.bottom}px ${PLOT_INSET.left}px` }}>\n {categories.map((category, categoryIndex) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: categories are positional and repeat legitimately (two quarters both labelled \"Q1\").\n <div key={categoryIndex} className=\"pire-chart-band\">\n <span className=\"pire-chart-tip\" role=\"presentation\">\n <strong>{category}</strong>\n {series.map((one) => {\n const value = one.values[categoryIndex];\n return (\n <span key={one.id} className=\"pire-chart-tip-row\">\n {one.label}: {value == null ? 'No data' : formatValue(value)}\n </span>\n );\n })}\n </span>\n </div>\n ))}\n </div>\n </div>\n )}\n </ChartFrame>\n );\n}\n","import * as React from 'react';\nimport type { ChartBaseProps, ChartLegendItem } from './ChartFrame';\nimport { ChartFrame, defaultFormatValue } from './ChartFrame';\nimport { VIZ_SLOT_COUNT, warnOnDonutShape } from './chartGeometry';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\n\nexport interface DonutChartProps extends ChartBaseProps {\n /**\n * What sits in the hole. Defaults to the total of every segment, which is the number a\n * part-to-whole chart is implicitly about. Hovering a segment replaces it with that segment.\n */\n centerLabel?: React.ReactNode;\n /** Caption under the centre figure — \"Total\", \"Invoiced\", whatever the total means. */\n centerCaption?: React.ReactNode;\n /** Ring thickness in pixels. Thinner reads as a gauge, thicker as a pie. */\n thickness?: number;\n}\n\n/** Gap between segments, in degrees of arc — the spacer that stops two fills reading as one. */\nconst SEGMENT_GAP_DEGREES = 1.5;\n\n/**\n * Part-to-whole, at a glance.\n *\n * **Use this only when the reader needs the rough shape of a split, not the ranking.** People\n * compare angles far worse than they compare lengths, so any question of the form \"which is\n * bigger\" or \"by how much\" is a `BarChart`. Six segments is the ceiling, and it is a ceiling\n * rather than a target: past three or four the small slices stop being readable at all.\n *\n * Unlike the other charts, colour here follows the *segment*, not the series — a donut draws one\n * series, and its categories are what need telling apart. Pass exactly one series; anything after\n * the first is ignored, with a dev warning.\n */\nexport function DonutChart({\n categories, series, title, description, formatValue = defaultFormatValue, height = 220,\n emptyState, showDataTable, centerLabel, centerCaption, thickness = 28,\n className, style, ...rest\n}: DonutChartProps) {\n const label = rest['aria-label'];\n const msg = usePireMessages();\n const [hoveredIndex, setHoveredIndex] = React.useState<number | null>(null);\n\n warnOnDonutShape(series, categories.length, label);\n\n // A donut is single-series by definition; the frame's table still wants the array shape.\n const values = (series[0]?.values ?? []).slice(0, categories.length);\n const segments = categories\n .map((category, index) => ({ category, index, value: values[index] ?? 0 }))\n // Zero and missing readings are dropped rather than drawn: a zero-width arc is invisible\n // anyway, and it would still consume a colour slot and a legend row.\n .filter((segment) => segment.value > 0);\n\n const total = segments.reduce((sum, segment) => sum + segment.value, 0);\n const hasData = segments.length > 0 && total > 0;\n\n const size = height;\n const radius = (size - thickness) / 2;\n const circumference = 2 * Math.PI * radius;\n const gapLength = (SEGMENT_GAP_DEGREES / 360) * circumference;\n\n const legend: ChartLegendItem[] = segments.map((segment) => ({\n key: segment.category,\n label: segment.category,\n color: colorForSegment(segment.index),\n }));\n\n const hovered = hoveredIndex == null\n ? null\n : segments.find((segment) => segment.index === hoveredIndex) ?? null;\n\n let arcStart = 0;\n\n return (\n <ChartFrame\n label={label} title={title} description={description} categories={categories}\n series={series} formatValue={formatValue} legend={legend}\n showDataTable={showDataTable} className={className} style={style}\n >\n {!hasData ? (\n <div className=\"pire-chart-empty\">{emptyState ?? msg.chartEmpty}</div>\n ) : (\n <div className=\"pire-chart-donut\" style={{ height: size }}>\n {/* Fixed square rather than fluid: a ring scales uniformly, so there is nothing to\n gain from stretching it, and the centre figure stays at its real type size. */}\n <svg width={size} height={size} aria-hidden=\"true\" focusable=\"false\"\n onMouseLeave={() => setHoveredIndex(null)}>\n {/* -90° so the first segment starts at twelve o'clock, where a reader looks first. */}\n <g transform={`rotate(-90 ${size / 2} ${size / 2})`}>\n {segments.map((segment) => {\n const arcLength = (segment.value / total) * circumference;\n const offset = arcStart;\n arcStart += arcLength;\n return (\n // biome-ignore lint/a11y/noStaticElementInteractions: pointer-only enhancement inside an aria-hidden plot — the arcs carry nothing the data table does not, so there is nothing here for a keyboard to reach.\n <circle\n key={segment.category}\n className=\"pire-chart-arc\"\n cx={size / 2} cy={size / 2} r={radius}\n stroke={colorForSegment(segment.index)}\n strokeWidth={thickness}\n // The gap is taken off the arc rather than added between arcs, so the\n // segments still sum to the full circle.\n strokeDasharray={`${Math.max(0, arcLength - gapLength)} ${circumference}`}\n strokeDashoffset={-offset}\n data-hovered={hoveredIndex === segment.index ? 'true' : undefined}\n onMouseEnter={() => setHoveredIndex(segment.index)}\n />\n );\n })}\n </g>\n </svg>\n\n {/* HTML rather than SVG <text>: it inherits the type tokens and wraps on its own. */}\n <div className=\"pire-chart-donut-center\" style={{ width: size - thickness * 2 - 8 }}>\n <span className=\"pire-chart-donut-value\">\n {hovered ? formatValue(hovered.value) : centerLabel ?? formatValue(total)}\n </span>\n <span className=\"pire-chart-donut-caption\">\n {hovered ? hovered.category : centerCaption}\n </span>\n </div>\n </div>\n )}\n </ChartFrame>\n );\n}\n\n/** Colour follows the segment here, not the series — see the component note. */\nfunction colorForSegment(index: number): string {\n return index < VIZ_SLOT_COUNT ? `var(--viz-${index + 1})` : 'var(--viz-other)';\n}\n","import type * as React from 'react';\nimport { Button as AriaButton } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { cx } from '../utils/cx';\n\nexport interface LinkListItem {\n id: string;\n /** Technical key shown in mono — order number, material number. */\n key?: React.ReactNode;\n /** Secondary description, truncated. */\n text?: React.ReactNode;\n icon?: string;\n trailing?: React.ReactNode;\n}\n\nexport interface LinkListProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSelect'> {\n items: LinkListItem[];\n onSelect?: (id: string) => void;\n /**\n * Which slot gets the primary treatment. `'key'` (the default) sets `key` in mono and `text`\n * in secondary — right for \"OC-2026-000004 · Alfa S.A.\", where the code is what you scan.\n *\n * Use `'text'` when the name is what you scan and the code is the qualifier — a supplier or\n * customer list. It swaps the two treatments only; the slots keep their meanings, so `key`\n * stays the technical key and sorting or copying it still works.\n */\n emphasis?: 'key' | 'text';\n /** Names the list for assistive tech, e.g. \"Recently viewed orders\". */\n 'aria-label': string;\n}\n\n/** Compact list of records that navigate somewhere: recently viewed, related documents, shortcuts. */\nexport function LinkList({ items, onSelect, emphasis = 'key', className, ...rest }: LinkListProps) {\n return (\n <div className={cx('pire-linklist', className)} role=\"list\" data-emphasis={emphasis} {...rest}>\n {/* `role=\"list\"` requires children with `role=\"listitem\"`, and a button is not one: without\n this wrapper a screen reader announces a list containing nothing. The wrapper is a real\n flex box rather than `display: contents`, which has a history of dropping elements from\n the accessibility tree and would undo the fix it appears to make. */}\n {items.map((item) => {\n const keySlot = item.key ? <span className=\"pire-linklist-key\">{item.key}</span> : null;\n const textSlot = item.text ? <span className=\"pire-linklist-text\">{item.text}</span> : null;\n // Reordered here rather than with CSS `order`, so what a screen reader reads matches what\n // is on screen. A visual-only swap would leave the two disagreeing (WCAG 1.3.2), and the\n // whole row is one button, so there is no focus order to preserve by keeping the markup\n // fixed. The `emphasis` attribute on the root still drives the typography.\n const [first, second] = emphasis === 'text' ? [textSlot, keySlot] : [keySlot, textSlot];\n return (\n <div key={item.id} role=\"listitem\" className=\"pire-linklist-row\">\n <AriaButton className=\"pire-linklist-item\" onPress={() => onSelect?.(item.id)}>\n {item.icon ? <Icon name={item.icon} size={16} style={{ color: 'var(--text-secondary)' }} /> : null}\n {first}\n {second}\n {item.trailing}\n </AriaButton>\n </div>\n );\n })}\n </div>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface PageBandProps extends React.HTMLAttributes<HTMLDivElement> {\n /** `card` for a header band, `page` for a filter band or the body behind the content. */\n surface?: 'card' | 'page';\n /** `false` when the band below continues the same block and a rule would cut it in two. */\n hasBorder?: boolean;\n children?: React.ReactNode;\n}\n\n/**\n * The full-bleed horizontal band an ERP screen is built from: header, filters, body.\n *\n * Holds a `PageHeader`, `ObjectHeader`, `FilterBar` or edge-to-edge `Tabs`, supplying the page\n * gutter and the surface those components deliberately leave to their container.\n */\nexport function PageBand({\n surface = 'card', hasBorder = true, children, className, ...rest\n}: PageBandProps) {\n return (\n <div\n className={cx('pire-pageband', className)}\n data-surface={surface}\n data-border={hasBorder ? 'true' : undefined}\n {...rest}\n >\n {children}\n </div>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface PageHeaderProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {\n title: React.ReactNode;\n /** One line of context: scope, plant, data timestamp. */\n subtitle?: React.ReactNode;\n actions?: React.ReactNode;\n}\n\n/** Heading block for pages that are not a single object — launchpads, settings, reports.\n * Object pages use ObjectHeader instead. */\nexport function PageHeader({ title, subtitle, actions, className, ...rest }: PageHeaderProps) {\n return (\n <header className={cx('pire-pageheader', className)} {...rest}>\n <div style={{ minWidth: 0 }}>\n <h1 className=\"pire-pageheader-title\">{title}</h1>\n {subtitle ? <p className=\"pire-pageheader-sub\">{subtitle}</p> : null}\n </div>\n {actions ? <div className=\"pire-pageheader-actions\">{actions}</div> : null}\n </header>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface SectionHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Uppercase micro-caps eyebrow — the space or group name. */\n title: React.ReactNode;\n /** Count or qualifier shown beside the title. */\n meta?: React.ReactNode;\n /** Usually one tertiary Button: \"Open space\", \"See all\". */\n actions?: React.ReactNode;\n}\n\n/** Divides a long page into named bands. Pairs with a KPI row or a card grid below it. */\nexport function SectionHeader({ title, meta, actions, className, ...rest }: SectionHeaderProps) {\n return (\n <div className={cx('pire-sectionhead', className)} {...rest}>\n <span className=\"pire-eyebrow\">{title}</span>\n {meta ? <span style={{ font: 'var(--type-caption)', color: 'var(--text-tertiary)' }}>{meta}</span> : null}\n {actions ? <div className=\"pire-sectionhead-actions\">{actions}</div> : null}\n </div>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface SelectionBarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Number of selected records. The bar renders nothing at 0. */\n count: number;\n /** Noun for the records, singular. Default \"record\". */\n noun?: string;\n /** What happens on commit — mass posting caveats belong here, not in a toast. */\n children?: React.ReactNode;\n /** Buttons, size=\"sm\". Destructive last. */\n actions?: React.ReactNode;\n}\n\n/** Appears above a table once rows are selected and states exactly how many.\n * The count is announced, so keyboard users know a selection changed. */\nexport function SelectionBar({ count, noun = 'record', children, actions, className, ...rest }: SelectionBarProps) {\n if (!count) return null;\n return (\n <div className={cx('pire-selectionbar', className)} role=\"status\" aria-live=\"polite\" {...rest}>\n <span className=\"pire-selectionbar-count\">\n {count.toLocaleString()} {noun}{count === 1 ? '' : 's'} selected\n </span>\n {children ? <span style={{ color: 'var(--text-secondary)', font: 'var(--type-caption)' }}>{children}</span> : null}\n {actions ? <div className=\"pire-selectionbar-actions\">{actions}</div> : null}\n </div>\n );\n}\n","import type * as React from 'react';\nimport { cx } from '../utils/cx';\n\nexport interface FooterBarProps extends React.HTMLAttributes<HTMLElement> {\n /** Left-hand status: validation summary, draft saved at, total. */\n note?: React.ReactNode;\n /** Commit actions. Cancel first, primary or danger last. */\n actions?: React.ReactNode;\n}\n\n/** Sticky commit bar for create and edit screens: the page scrolls, the decision stays visible.\n * Give the scrolling container bottom padding equal to the bar height. */\nexport function FooterBar({ note, actions, children, className, ...rest }: FooterBarProps) {\n return (\n <footer className={cx('pire-footerbar', className)} {...rest}>\n {note ? <span className=\"pire-footerbar-note\">{note}</span> : null}\n {children}\n {actions ? <div className=\"pire-footerbar-actions\">{actions}</div> : null}\n </footer>\n );\n}\n","import type * as React from 'react';\nimport { Button } from '../core/Button';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface SplitPaneProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** The narrow column: a list of records, kept in view while one of them is read. */\n list: React.ReactNode;\n /** The wide column. Leave it out when nothing is selected — `emptyDetail` fills the space. */\n detail?: React.ReactNode;\n /** Width of the list column. A number is pixels. */\n listWidth?: number | string;\n /** Names the list region for assistive tech. Both panes are landmarks, so both want a name. */\n listLabel?: string;\n detailLabel?: string;\n /** Shown in place of the detail column when there is no `detail`. */\n emptyDetail?: React.ReactNode;\n /**\n * Returns to the list on a narrow container, where only one column fits at a time.\n *\n * Without it a narrow layout can reach the detail and never leave it, so pass it whenever the\n * pane can be seen on a small screen.\n */\n onBack?: () => void;\n backLabel?: string;\n}\n\n/**\n * Two columns that live side by side and scroll independently — a list on the left, the selected\n * record on the right.\n *\n * Distinct from `SidePanel`, which is an overlay: this one is a layout, the panes coexist, and\n * nothing is dismissed to get back to the list.\n *\n * It fills the box it is given and owns the scrolling inside it, so give it a parent with a\n * definite height and no padding of its own. A wrapper that scrolls as well produces two nested\n * scrollbars, which is the usual way this pattern goes wrong.\n */\nexport function SplitPane({ list, detail, listWidth = '24rem', listLabel, detailLabel,\n emptyDetail, onBack, backLabel, className, style, ...rest }: SplitPaneProps) {\n const msg = usePireMessages();\n const width = typeof listWidth === 'number' ? `${listWidth}px` : listWidth;\n\n return (\n <div className={cx('pire-split', className)} data-has-detail={detail != null ? 'true' : undefined}\n style={{ ['--pire-split-list-w' as string]: width, ...style } as React.CSSProperties} {...rest}>\n <section className=\"pire-split-list\" aria-label={listLabel ?? msg.splitPaneList}>{list}</section>\n <section className=\"pire-split-detail\" aria-label={detailLabel ?? msg.splitPaneDetail}>\n {/* Rendered always and hidden by the container query on wide layouts, rather than switched\n on a measured width. Nothing here depends on JavaScript knowing the size. */}\n {onBack ? (\n <div className=\"pire-split-back\">\n <Button variant=\"tertiary\" size=\"sm\" icon=\"arrow-left\" onPress={onBack}>\n {backLabel ?? msg.splitPaneBack}\n </Button>\n </div>\n ) : null}\n {detail ?? <div className=\"pire-split-empty\">{emptyDetail}</div>}\n </section>\n </div>\n );\n}\n","import type * as React from 'react';\nimport { Dialog } from '../feedback/Dialog';\nimport { InlineMessage } from '../feedback/InlineMessage';\nimport { Button } from '../core/Button';\n\nexport interface ConfirmDialogProps {\n isOpen?: boolean;\n /** Question form, sentence case: \"Release purchase order?\" */\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n /** What will happen — rendered as a warning, or an error when tone is danger. */\n consequence?: React.ReactNode;\n /** Extra detail or an opt-in Checkbox. */\n children?: React.ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n /** danger = irreversible: red commit button, error-toned consequence. */\n tone?: 'primary' | 'danger';\n /** Disables both buttons and shows \"Working…\" on the commit button. */\n isBusy?: boolean;\n onConfirm?: () => void;\n onCancel?: () => void;\n}\n\n/** Interrupts one irreversible action. Never use for information — that is an InlineMessage. */\nexport function ConfirmDialog({ isOpen, title, subtitle, consequence, children, confirmLabel = 'Confirm',\n cancelLabel = 'Cancel', tone = 'primary', isBusy, onConfirm, onCancel }: ConfirmDialogProps) {\n return (\n <Dialog isOpen={isOpen} size=\"sm\" title={title} subtitle={subtitle} onClose={onCancel}\n isDismissable={!isBusy} showClose={false}\n footer={\n <>\n <Button variant=\"tertiary\" isDisabled={isBusy} onPress={onCancel}>{cancelLabel}</Button>\n <Button variant={tone === 'danger' ? 'danger' : 'primary'} isDisabled={isBusy} onPress={onConfirm}>\n {isBusy ? 'Working…' : confirmLabel}\n </Button>\n </>\n }>\n {consequence ? (\n <InlineMessage kind={tone === 'danger' ? 'error' : 'warning'} style={{ marginBottom: children ? 'var(--sp-3)' : 0 }}>\n {consequence}\n </InlineMessage>\n ) : null}\n {children}\n </Dialog>\n );\n}\n","import * as React from 'react';\nimport {\n Autocomplete, ModalOverlay, Modal, Dialog as AriaDialog, SearchField, Input as AriaInput,\n Menu as AriaMenu, MenuSection as AriaMenuSection, Header, useFilter,\n} from 'react-aria-components';\nimport type { Key } from 'react-aria-components';\nimport { Icon } from '../core/Icon';\nimport { Kbd } from '../core/Kbd';\nimport { MenuItem } from '../navigation/Menu';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface CommandPaletteItem {\n /** Passed back to `onAction`. Must be unique across every group in the palette. */\n id: string;\n label: string;\n /** Second line — what the command does, or what identifies the record. */\n description?: string;\n /** Icon slug, same vocabulary as `Button.icon`. */\n icon?: string;\n /**\n * Painted on the right as key caps. Registers nothing; bind the key yourself.\n *\n * A string is split on `+` and spaces; pass an array when it cannot be — `['⌘', 'N']`.\n */\n shortcut?: string | string[];\n /**\n * Extra terms this item should match on, beyond its label. The place to put synonyms, the\n * English name of a Spanish command, and the abbreviations people actually type — a palette\n * that only matches the visible label makes users guess the wording.\n *\n * Matched against, never announced: the accessible name stays the label alone.\n */\n keywords?: string;\n isDisabled?: boolean;\n}\n\nexport interface CommandPaletteGroup {\n id: string;\n /** Heading above the group. Omit for a single unlabelled list. */\n label?: string;\n items: CommandPaletteItem[];\n}\n\nexport interface CommandPaletteProps {\n isOpen?: boolean;\n onOpenChange?: (isOpen: boolean) => void;\n /**\n * Static groups — navigation targets and actions. Filtered locally as the user types, so these\n * are the whole list, not a page of it.\n */\n groups?: CommandPaletteGroup[];\n /**\n * Server-backed results, appended after the static groups and **never filtered locally**: the\n * server already ranked them, and a local \"contains\" pass would drop fuzzy and synonym matches.\n * Feed it from `onSearch`.\n */\n resultsGroup?: CommandPaletteGroup;\n /** The chosen item's `id`. The palette does not close itself — decide in the handler. */\n onAction?: (id: string) => void;\n /**\n * The query on every keystroke. **Debounce before calling the server.**\n *\n * Only needed for `resultsGroup`; the static groups filter without it.\n */\n onSearch?: (query: string) => void;\n /** Shows a status row rather than an empty list while a request is in flight. */\n isLoading?: boolean;\n /** Overrides the dictionary's `commandPaletteEmpty`. */\n emptyLabel?: React.ReactNode;\n /** Overrides the dictionary's `commandPaletteLoading`. */\n loadingLabel?: string;\n placeholder?: string;\n /**\n * Replaces the default key hints along the bottom. Use it for a product-specific affordance —\n * a scope switch, a \"search everything\" toggle.\n */\n footer?: React.ReactNode;\n /** Drops the footer entirely. The hints are worth their space until an app teaches the keys elsewhere. */\n showFooter?: boolean;\n /** Names the dialog for assistive tech. Defaults to the dictionary's `commandPaletteLabel`. */\n 'aria-label'?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * The collection key of the section holding `resultsGroup`. Fixed rather than taken from the\n * consumer's group id, because the filter below has to recognise that section without trusting\n * user input.\n *\n * Deliberately not spelled like a `pire-*` class: it is a collection key, and `styles.css.test.ts`\n * reads `pire-*` string literals in component source as class references.\n */\nconst RESULTS_SECTION_KEY = '__pire_results__';\n\n/** Everything an item should match on. Kept out of `textValue` so screen readers announce the\n * label alone rather than the label plus a bag of synonyms. */\nconst searchableText = (item: CommandPaletteItem) =>\n [item.label, item.description, item.keywords].filter(Boolean).join(' ');\n\n/**\n * Application-wide search over commands, navigation targets and records — the Cmd/Ctrl+K surface.\n *\n * Behaviour is React Aria's `Autocomplete`: focus stays in the input while the arrow keys move\n * `aria-activedescendant` through the list, so typing and choosing never fight each other. Pire\n * supplies the overlay, the grouping and the empty/loading states.\n *\n * Open state is always the product's. Bind the shortcut with {@link useCommandPaletteShortcut},\n * or with anything else — an ERP may already own that key.\n */\nexport function CommandPalette({\n isOpen, onOpenChange, groups = [], resultsGroup, onAction, onSearch, isLoading,\n emptyLabel, loadingLabel, placeholder, footer, showFooter = true,\n 'aria-label': ariaLabel, className, style,\n}: CommandPaletteProps) {\n const msg = usePireMessages();\n const [query, setQuery] = React.useState('');\n // `contains` with base sensitivity so \"periodo\" finds \"Período\" and \"factura\" finds \"Factura\".\n // Accent- and case-sensitive matching makes a palette feel broken in Spanish.\n const { contains } = useFilter({ sensitivity: 'base' });\n\n // Reset on open, not on close: clearing on the way out is visible during the exit transition.\n React.useEffect(() => { if (isOpen) setQuery(''); }, [isOpen]);\n\n const searchableById = React.useMemo(() => {\n const byId = new Map<string, string>();\n for (const group of groups) for (const item of group.items) byId.set(item.id, searchableText(item));\n return byId;\n }, [groups]);\n\n /**\n * The node is typed structurally rather than as React Aria's `Node<T>`, which lives in\n * `@react-types/shared` — a transitive package Pire does not depend on and should not start\n * depending on for one type. A wider parameter type is safe here: the callback is only ever\n * called with a full node.\n */\n const filter = React.useCallback((textValue: string, inputValue: string,\n node: { key: Key; parentKey?: Key | null }) => {\n // The server's own ranking survives only if nothing filters it again.\n if (node.parentKey === RESULTS_SECTION_KEY) return true;\n return contains(searchableById.get(String(node.key)) ?? textValue, inputValue);\n }, [contains, searchableById]);\n\n const handleInputChange = (value: string) => { setQuery(value); onSearch?.(value); };\n\n const sections = [...groups, ...(resultsGroup ? [{ ...resultsGroup, id: RESULTS_SECTION_KEY }] : [])];\n const status = isLoading ? (loadingLabel ?? msg.commandPaletteLoading) : (emptyLabel ?? msg.commandPaletteEmpty);\n\n return (\n <ModalOverlay className=\"pire-cp-overlay\" isOpen={isOpen} isDismissable\n onOpenChange={(open) => { if (!open) onOpenChange?.(false); }}>\n <Modal className={cx('pire-cp-modal', className)} style={style}>\n <AriaDialog className=\"pire-cp-dialog\" aria-label={ariaLabel ?? msg.commandPaletteLabel}>\n <Autocomplete filter={filter} inputValue={query} onInputChange={handleInputChange}>\n <SearchField className=\"pire-cp-search\" aria-label={msg.commandPaletteSearchLabel}>\n <Icon name=\"search\" size={18} className=\"pire-cp-search-icon\" />\n {/* autoFocus is correct here specifically: the palette exists to be typed into, and\n it is a modal the user just chose to open, so taking the caret is what they asked\n for rather than a focus steal. */}\n <AriaInput className=\"pire-cp-input\" autoFocus\n placeholder={placeholder ?? msg.commandPalettePlaceholder} />\n </SearchField>\n {isLoading ? (\n <div className=\"pire-cp-loading\" role=\"status\" aria-live=\"polite\">\n {loadingLabel ?? msg.commandPaletteLoading}\n </div>\n ) : null}\n <AriaMenu className=\"pire-cp-list\" onAction={(key) => onAction?.(String(key))}\n renderEmptyState={() => <div className=\"pire-cp-status\">{status}</div>}>\n {sections.map((section) => (\n <AriaMenuSection key={section.id} id={section.id} className=\"pire-cp-section\">\n {section.label ? <Header className=\"pire-cp-section-title\">{section.label}</Header> : null}\n {section.items.map((item) => (\n <MenuItem key={item.id} id={item.id} textValue={item.label} icon={item.icon}\n description={item.description} shortcut={item.shortcut} isDisabled={item.isDisabled}>\n {item.label}\n </MenuItem>\n ))}\n </AriaMenuSection>\n ))}\n </AriaMenu>\n </Autocomplete>\n {showFooter ? (\n // aria-hidden: the glyphs are a sighted affordance for discovering the keys. A screen\n // reader already announces the listbox semantics that make those keys work, so reading\n // \"up arrow down arrow navigate\" out loud is noise on every open.\n <div className=\"pire-cp-foot\" aria-hidden=\"true\">\n {footer ?? (\n <>\n <span className=\"pire-cp-hint\"><Kbd>↑</Kbd><Kbd>↓</Kbd>{msg.commandPaletteHintNavigate}</span>\n <span className=\"pire-cp-hint\"><Kbd>↵</Kbd>{msg.commandPaletteHintSelect}</span>\n <span className=\"pire-cp-hint\"><Kbd>esc</Kbd>{msg.commandPaletteHintClose}</span>\n </>\n )}\n </div>\n ) : null}\n </AriaDialog>\n </Modal>\n </ModalOverlay>\n );\n}\n\nexport interface CommandPaletteShortcutOptions {\n /** The key pressed with Cmd (macOS) or Ctrl. Single character, matched case-insensitively. */\n key?: string;\n /** Stop listening — while a modal owns the keyboard, for instance. */\n isDisabled?: boolean;\n}\n\n/**\n * Binds Cmd+K / Ctrl+K to open the palette.\n *\n * Opt-in rather than built into {@link CommandPalette}, because a global key listener is the\n * component's to grant and the app's to own: an ERP may already bind that combination, and a\n * component that claims it on mount takes it silently.\n */\nexport function useCommandPaletteShortcut(\n onTrigger: () => void, { key = 'k', isDisabled }: CommandPaletteShortcutOptions = {},\n): void {\n const handler = React.useRef(onTrigger);\n handler.current = onTrigger;\n\n React.useEffect(() => {\n if (isDisabled) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (!(event.metaKey || event.ctrlKey) || event.altKey) return;\n if (event.key.toLowerCase() !== key.toLowerCase()) return;\n // Chrome and Firefox both use Ctrl/Cmd+K for the address bar; without this the palette\n // opens behind a focused omnibox.\n event.preventDefault();\n handler.current();\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [key, isDisabled]);\n}\n","import type * as React from 'react';\nimport { ModalOverlay, Modal, Dialog as AriaDialog, Heading } from 'react-aria-components';\nimport { IconButton } from '../core/IconButton';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface SidePanelProps {\n isOpen?: boolean;\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n /** Panel width in px. 400 default; 560 for editable forms. */\n width?: number;\n children?: React.ReactNode;\n footer?: React.ReactNode;\n onClose?: () => void;\n className?: string;\n}\n\n/** Right-hand overlay for details and edits that must keep the list in view. */\nexport function SidePanel({ isOpen, title, subtitle, width = 400, children, footer, onClose, className }: SidePanelProps) {\n const msg = usePireMessages();\n return (\n <ModalOverlay className=\"pire-sidepanel-overlay\" isOpen={isOpen} isDismissable\n onOpenChange={(o) => { if (!o) onClose?.(); }}>\n <Modal className={cx('pire-sidepanel', className)} style={{ width }}>\n <AriaDialog className=\"pire-dialog\" style={{ height: '100%' }}>\n <header className=\"pire-dialog-head\">\n <div style={{ flex: 1, minWidth: 0 }}>\n <Heading slot=\"title\" className=\"pire-dialog-title\">{title}</Heading>\n {subtitle ? <p className=\"pire-dialog-sub\" style={{ margin: 0 }}>{subtitle}</p> : null}\n </div>\n <IconButton icon=\"x\" label={msg.sidePanelClose} size=\"sm\" onPress={onClose} />\n </header>\n <div className=\"pire-dialog-body\" style={{ flex: 1 }}>{children}</div>\n {footer ? <footer className=\"pire-dialog-foot\">{footer}</footer> : null}\n </AriaDialog>\n </Modal>\n </ModalOverlay>\n );\n}\n","import type * as React from 'react';\nimport { Icon } from '../core/Icon';\nimport { cx } from '../utils/cx';\n\nexport interface EmptyStateProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Icon slug, 24px. Match the domain: \"search\" for no results, \"file-text\" for no records. */\n icon?: string;\n /** Headline. Rich content, not the DOM title/tooltip attribute. */\n title?: React.ReactNode;\n /** The single action that resolves the emptiness. */\n action?: React.ReactNode;\n /** Tighter padding, for inside cards and panels. */\n compact?: boolean;\n}\n\n/** Says what is missing, why, and the one thing to do about it. */\nexport function EmptyState({ icon = 'file-text', title, action, compact, children, className, ...rest }: EmptyStateProps) {\n return (\n <div className={cx('pire-empty', className)} data-compact={compact ? 'true' : undefined} {...rest}>\n <Icon name={icon} size={24} className=\"pire-empty-icon\" />\n {title ? <p className=\"pire-empty-title\" style={{ margin: 0 }}>{title}</p> : null}\n {children ? <p className=\"pire-empty-body\" style={{ margin: 0 }}>{children}</p> : null}\n {action}\n </div>\n );\n}\n","import * as React from 'react';\nimport { DropZone, FileTrigger, isFileDropItem } from 'react-aria-components';\nimport { Button } from '../core/Button';\nimport { Icon } from '../core/Icon';\nimport { IconButton } from '../core/IconButton';\nimport { ProgressBar } from '../feedback/ProgressBar';\nimport { formatFileSize, screenFiles, type FileUploadProps, type PireFile } from '../forms/FileUpload';\nimport { usePireMessages } from '../../i18n/PireIntlProvider';\nimport { cx } from '../utils/cx';\n\nexport interface FileDropZoneProps extends Omit<FileUploadProps, 'chooseLabel'> {\n /** Instruction inside the zone. Overrides the dictionary's `fileDropZonePrompt`. */\n promptLabel?: React.ReactNode;\n /** `compact` for an import modal, where the zone competes with a table for height. */\n height?: 'compact' | 'regular';\n}\n\nconst isImage = (file: File) => file.type.startsWith('image/');\n\n/**\n * The large drop surface, for import screens and anywhere a file is the point of the page.\n *\n * Built on React Aria's `DropZone`, so it is a real drop target for keyboard and assistive tech —\n * not a div with `onDragOver`. It still contains a `FileTrigger`, because drag-and-drop alone is\n * not an accessible way to supply a file.\n */\nexport function FileDropZone({\n label, value, defaultValue, onChange, acceptedFileTypes, allowsMultiple, maxSize, onError,\n showPreview = true, uploadProgress, promptLabel, height = 'regular', description, errorMessage,\n isInvalid, isDisabled, isReadOnly, isRequired, fullWidth = true, className, style,\n}: FileDropZoneProps) {\n const msg = usePireMessages();\n const [uncontrolled, setUncontrolled] = React.useState<PireFile[]>(defaultValue ?? []);\n const files = value ?? uncontrolled;\n\n const created = React.useRef<string[]>([]);\n React.useEffect(() => () => {\n for (const url of created.current) URL.revokeObjectURL(url);\n }, []);\n\n const commit = (next: PireFile[]) => {\n if (value === undefined) setUncontrolled(next);\n onChange?.(next);\n };\n\n const accept = (picked: File[]) => {\n if (isDisabled || isReadOnly || !picked.length) return;\n const { accepted, rejected } = screenFiles(picked, { maxSize, acceptedFileTypes });\n if (rejected.length) onError?.(rejected);\n if (!accepted.length) return;\n\n const wrapped = accepted.map((file) => {\n const previewUrl = showPreview && isImage(file) ? URL.createObjectURL(file) : undefined;\n if (previewUrl) created.current.push(previewUrl);\n return { file, previewUrl };\n });\n commit(allowsMultiple ? [...files, ...wrapped] : wrapped.slice(0, 1));\n };\n\n const remove = (target: File) => commit(files.filter((f) => f.file !== target));\n\n return (\n <div className={cx('pire-field', className)} style={style} data-full-width={String(fullWidth)}>\n {label ? (\n <span className=\"pire-field-label\">\n {label}{isRequired ? <span className=\"pire-field-req\" aria-hidden=\"true\">*</span> : null}\n </span>\n ) : null}\n\n <DropZone\n className=\"pire-dropzone\"\n data-height={height}\n isDisabled={isDisabled || isReadOnly}\n onDrop={async (e) => {\n // Only file items: a drag can also carry text or a directory, and both would otherwise\n // resolve to nothing halfway through this list.\n const dropped = await Promise.all(\n e.items.filter(isFileDropItem).map((item) => item.getFile()),\n );\n accept(dropped);\n }}\n >\n <Icon name=\"download\" size={24} className=\"pire-dropzone-icon\" />\n <span className=\"pire-dropzone-prompt\">{promptLabel ?? msg.fileDropZonePrompt}</span>\n <FileTrigger acceptedFileTypes={acceptedFileTypes as string[] | undefined}\n allowsMultiple={allowsMultiple} onSelect={(list) => accept(list ? [...list] : [])}>\n <Button variant=\"secondary\" isDisabled={isDisabled || isReadOnly}>\n {msg.fileUploadChoose}\n </Button>\n </FileTrigger>\n </DropZone>\n\n {files.length ? (\n <ul className=\"pire-fileupload-list\">\n {files.map(({ file, previewUrl }) => (\n <li key={`${file.name}-${file.size}-${file.lastModified}`} className=\"pire-fileupload-item\">\n {previewUrl\n ? <img className=\"pire-fileupload-thumb\" src={previewUrl} alt=\"\" />\n : <Icon name=\"file-text\" size={16} className=\"pire-fileupload-icon\" />}\n <span className=\"pire-fileupload-name\">{file.name}</span>\n <span className=\"pire-fileupload-size\">{formatFileSize(file.size)}</span>\n {isDisabled || isReadOnly ? null : (\n <IconButton icon=\"x\" size=\"sm\"\n label={msg.fileUploadRemoveNamed.replace('{name}', file.name)}\n onPress={() => remove(file)} />\n )}\n </li>\n ))}\n </ul>\n ) : null}\n\n {uploadProgress != null ? (\n <ProgressBar value={uploadProgress} label={msg.fileUploadUploading} />\n ) : null}\n\n {description ? <span className=\"pire-field-hint\">{description}</span> : null}\n {isInvalid && errorMessage ? <span className=\"pire-field-error\">{errorMessage}</span> : null}\n </div>\n );\n}\n","/* @orianatech/pire — Pire Design System components.\n Styles are a separate import so they can be loaded once, ahead of the bundle:\n import '@orianatech/pire/styles.css'; */\n\nexport { Icon, configureIcons, type IconProps, type IconPack, type IconConfig } from './components/core/Icon';\nexport { Button, type ButtonProps } from './components/core/Button';\nexport { IconButton, type IconButtonProps } from './components/core/IconButton';\nexport { Badge, type BadgeProps, type BadgeStatus } from './components/core/Badge';\nexport { Tag, type TagProps } from './components/core/Tag';\nexport { Card, type CardProps } from './components/core/Card';\nexport { Avatar, type AvatarProps } from './components/core/Avatar';\nexport { SegmentedControl, type SegmentedControlProps, type SegmentOption } from './components/core/SegmentedControl';\nexport { Text, Strong, type TextProps, type StrongProps, type TextColor, type TextSize } from './components/core/Text';\nexport { Heading, type HeadingProps } from './components/core/Heading';\nexport { Link, type LinkProps } from './components/core/Link';\nexport { Separator, type SeparatorProps } from './components/core/Separator';\nexport { Kbd, type KbdProps } from './components/core/Kbd';\nexport { ICON_NAMES } from './components/core/icon-map';\n\nexport { FormField, type FormFieldProps } from './components/forms/FormField';\nexport { Input, type InputProps } from './components/forms/Input';\nexport { TextArea, type TextAreaProps } from './components/forms/TextArea';\nexport { Select, type SelectProps, type SelectOption } from './components/forms/Select';\nexport { Checkbox, type CheckboxProps } from './components/forms/Checkbox';\nexport { RadioGroup, Radio, type RadioGroupProps, type RadioProps } from './components/forms/Radio';\nexport { Switch, type SwitchProps } from './components/forms/Switch';\nexport { ComboBox, type ComboBoxProps, type ComboBoxOption } from './components/forms/ComboBox';\nexport { MultiComboBox, type MultiComboBoxProps } from './components/forms/MultiComboBox';\nexport { NumberField, type NumberFieldProps } from './components/forms/NumberField';\nexport { DatePicker, type DatePickerProps } from './components/forms/DatePicker';\nexport { DateRangePicker, rangeLengthInDays, type DateRangePickerProps, type DateRange,\n type DateRangePreset } from './components/forms/DateRangePicker';\nexport { ValueHelpField, type ValueHelpFieldProps } from './components/forms/ValueHelpField';\nexport { FileUpload, formatFileSize, type FileUploadProps, type PireFile,\n type FileRejection } from './components/forms/FileUpload';\n\nexport { ShellBar, type ShellBarProps } from './components/navigation/ShellBar';\nexport { SideNav, type SideNavProps, type SideNavItem, type SideNavChildItem,\n type SideNavGroup } from './components/navigation/SideNav';\nexport { Tabs, type TabsProps, type TabItem } from './components/navigation/Tabs';\nexport { Breadcrumb, type BreadcrumbProps, type BreadcrumbItem } from './components/navigation/Breadcrumb';\nexport { Pagination, type PaginationProps } from './components/navigation/Pagination';\nexport { Menu, MenuItem, MenuSection, MenuSeparator, type MenuProps, type MenuItemProps,\n type MenuSectionProps, type MenuSeparatorProps } from './components/navigation/Menu';\n\nexport { Dialog, DialogTitle, DialogDescription, DialogBody, DialogActions,\n type DialogProps, type DialogSlotProps } from './components/feedback/Dialog';\nexport { InlineMessage, type InlineMessageProps, type MessageKind } from './components/feedback/InlineMessage';\nexport { ProgressBar, type ProgressBarProps } from './components/feedback/ProgressBar';\nexport { Tooltip, type TooltipProps } from './components/feedback/Tooltip';\nexport { Toast, ToastProvider, useToast, type ToastProps, type ToastItem } from './components/feedback/Toast';\nexport { Skeleton, SkeletonTableRow, type SkeletonProps, type SkeletonShape, type SkeletonTableRowProps,\n type SkeletonTableColumn } from './components/feedback/Skeleton';\n\nexport { DataTable, type DataTableProps, type DataTableColumn, type DataTableSort,\n type DataTableRowProps } from './components/data/DataTable';\nexport { KpiTile, type KpiTileProps } from './components/data/KpiTile';\nexport { ObjectHeader, type ObjectHeaderProps, type ObjectFact } from './components/data/ObjectHeader';\nexport { FilterBar, type FilterBarProps, type ActiveFilter } from './components/data/FilterBar';\nexport { DescriptionList, type DescriptionListProps, type DescriptionItem } from './components/data/DescriptionList';\nexport { Timeline, type TimelineProps, type TimelineEntry } from './components/data/Timeline';\nexport { BarChart, type BarChartProps } from './components/data/BarChart';\nexport { LineChart, type LineChartProps } from './components/data/LineChart';\nexport { DonutChart, type DonutChartProps } from './components/data/DonutChart';\nexport type { ChartBaseProps, ChartLegendItem } from './components/data/ChartFrame';\nexport { VIZ_SLOT_COUNT, type ChartSeries } from './components/data/chartGeometry';\nexport { LinkList, type LinkListProps, type LinkListItem } from './components/data/LinkList';\n\nexport { PageBand, type PageBandProps } from './components/layout/PageBand';\nexport { PageHeader, type PageHeaderProps } from './components/layout/PageHeader';\nexport { SectionHeader, type SectionHeaderProps } from './components/layout/SectionHeader';\nexport { SelectionBar, type SelectionBarProps } from './components/layout/SelectionBar';\nexport { FooterBar, type FooterBarProps } from './components/layout/FooterBar';\nexport { SplitPane, type SplitPaneProps } from './components/layout/SplitPane';\n\nexport { ConfirmDialog, type ConfirmDialogProps } from './components/patterns/ConfirmDialog';\nexport { ValueHelpDialog, type ValueHelpDialogProps } from './components/patterns/ValueHelpDialog';\nexport { CommandPalette, useCommandPaletteShortcut, type CommandPaletteProps,\n type CommandPaletteItem, type CommandPaletteGroup,\n type CommandPaletteShortcutOptions } from './components/patterns/CommandPalette';\nexport { SidePanel, type SidePanelProps } from './components/patterns/SidePanel';\nexport { EmptyState, type EmptyStateProps } from './components/patterns/EmptyState';\nexport { FileDropZone, type FileDropZoneProps } from './components/patterns/FileDropZone';\n\n/** Re-exported so apps can compose overlays and collections without a second dependency. */\n/* Pire's own strings. React Aria's I18nProvider below localises React Aria's internals; this\n localises Pire's. Install both to fully translate the UI. */\nexport { PireIntlProvider, usePireMessages, type PireIntlProviderProps } from './i18n/PireIntlProvider';\nexport { enMessages, esMessages, type PireMessages } from './i18n/messages';\n\n/* Compose overlays and collections without a second dependency. `RouterProvider` takes the\n app's own `navigate`, so `href` on MenuItem, Link and Breadcrumb routes client-side. */\nexport { DialogTrigger, MenuTrigger, SubmenuTrigger, Popover, RouterProvider, I18nProvider } from 'react-aria-components';\n/* `Focusable` makes any single child focusable by cloning it — no wrapper element, so it never adds\n a tab stop to something that already had one. `Tooltip` applies it for you; this export is for the\n cases Pire does not cover, such as a custom trigger for a Popover or a MenuTrigger. */\nexport { Focusable } from 'react-aria-components';\nexport type { DateValue } from 'react-aria-components';\n"],"mappings":"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","names":["jsx","Button","React","AriaButton","React","jsx","jsxs","jsx","jsxs","IconButton","AriaButton","jsx","jsxs","AriaButton","jsx","jsxs","AriaButton","jsx","jsxs","React","jsx","React","jsx","jsxs","jsx","jsx","jsx","jsxs","jsx","jsx","jsx","jsxs","React","Text","AriaButton","React","jsx","jsx","jsxs","AriaButton","Text","React","TextField","Label","Group","Text","FieldError","jsx","jsxs","TextField","Label","Group","Text","FieldError","Label","AriaButton","Text","FieldError","jsx","jsxs","Label","AriaButton","Text","FieldError","jsx","jsxs","Label","Text","FieldError","jsx","jsxs","Label","Text","FieldError","jsx","jsxs","Label","AriaInput","AriaButton","Group","Popover","ListBox","ListBoxItem","Text","FieldError","jsx","jsxs","norm","Label","Group","AriaInput","AriaButton","Text","FieldError","Popover","ListBox","ListBoxItem","React","AriaComboBox","Label","AriaInput","AriaButton","Group","Popover","ListBox","ListBoxItem","Text","FieldError","jsx","jsxs","norm","AriaComboBox","Label","Group","AriaInput","AriaButton","Text","FieldError","Popover","ListBox","ListBoxItem","Label","AriaInput","Group","AriaButton","Text","FieldError","jsx","jsxs","Label","Group","AriaInput","AriaButton","Text","FieldError","Label","Group","AriaButton","Popover","Heading","Text","FieldError","jsx","jsxs","Label","Group","AriaButton","Text","FieldError","Popover","Heading","Label","Group","DateInput","DateSegment","AriaButton","Popover","AriaDialog","CalendarGrid","CalendarGridHeader","CalendarHeaderCell","CalendarGridBody","CalendarCell","Heading","Text","FieldError","jsx","jsxs","Label","Group","DateInput","DateSegment","AriaButton","Text","FieldError","Popover","AriaDialog","Heading","CalendarGrid","CalendarGridHeader","CalendarHeaderCell","CalendarGridBody","CalendarCell","React","React","React","AriaDialog","Heading","jsx","jsxs","Heading","AriaDialog","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","React","Text","Label","Fragment","jsx","jsxs","Label","jsx","jsxs","Text","AriaButton","Popover","jsx","jsxs","initials","AriaButton","Popover","React","AriaButton","MenuTrigger","Popover","AriaSeparator","jsx","jsxs","AriaSeparator","jsx","jsxs","AriaButton","MenuTrigger","Popover","jsx","jsxs","Link","jsx","jsxs","Link","jsx","jsxs","jsx","jsxs","React","jsx","jsxs","KIND_ICON","AriaButton","Fragment","jsx","jsxs","AriaButton","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","IS_DEV","jsx","jsxs","jsx","jsxs","React","jsx","jsxs","useIsomorphicLayoutEffect","React","jsx","jsxs","AriaButton","jsx","jsxs","AriaButton","jsx","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","React","ModalOverlay","Modal","AriaDialog","AriaInput","AriaMenu","AriaMenuSection","Header","Fragment","jsx","jsxs","ModalOverlay","Modal","AriaDialog","AriaInput","AriaMenu","AriaMenuSection","Header","ModalOverlay","Modal","AriaDialog","Heading","jsx","jsxs","ModalOverlay","Modal","AriaDialog","Heading","jsx","jsxs","React","FileTrigger","jsx","jsxs","isImage","FileTrigger","MenuTrigger","Popover","Focusable"]}
|