@doneisbetter/gds-core 2.6.6 → 3.0.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/server.js CHANGED
@@ -25,6 +25,7 @@ __export(server_exports, {
25
25
  ArticleShell: () => ArticleShell,
26
26
  AuthShell: () => AuthShell,
27
27
  BrowseSurface: () => BrowseSurface,
28
+ ChartTokenPanel: () => ChartTokenPanel,
28
29
  ChoiceChip: () => ChoiceChip,
29
30
  ConsumerDashboardGrid: () => ConsumerDashboardGrid,
30
31
  ConsumerSection: () => ConsumerSection,
@@ -35,6 +36,7 @@ __export(server_exports, {
35
36
  EditorialCard: () => EditorialCard,
36
37
  EditorialHero: () => EditorialHero,
37
38
  EmptyState: () => EmptyState,
39
+ EvidencePanel: () => EvidencePanel,
38
40
  FeatureBand: () => FeatureBand,
39
41
  FilterDrawer: () => FilterDrawer,
40
42
  FoodMenuSection: () => FoodMenuSection,
@@ -46,11 +48,15 @@ __export(server_exports, {
46
48
  MediaCard: () => MediaCard,
47
49
  MediaField: () => MediaField,
48
50
  MetricCard: () => MetricCard,
51
+ PROVIDER_IDENTITY_REGISTRY: () => PROVIDER_IDENTITY_REGISTRY,
49
52
  PageHeader: () => PageHeader,
53
+ PeriodSelector: () => PeriodSelector,
50
54
  PlaceholderPanel: () => PlaceholderPanel,
51
55
  PlaybackSurface: () => PlaybackSurface,
52
56
  ProductCard: () => ProductCard,
53
57
  ProgressCard: () => ProgressCard,
58
+ ProviderIdentityButton: () => ProviderIdentityButton,
59
+ ProviderIdentityButtonGroup: () => ProviderIdentityButtonGroup,
54
60
  PublicBrandFooter: () => PublicBrandFooter,
55
61
  PublicFlowShell: () => PublicFlowShell,
56
62
  PublicFoodCard: () => PublicFoodCard,
@@ -61,6 +67,7 @@ __export(server_exports, {
61
67
  ReferenceLinkGrid: () => ReferenceLinkGrid,
62
68
  ReferenceLocaleNotice: () => ReferenceLocaleNotice,
63
69
  ReferenceSection: () => ReferenceSection,
70
+ ReportingSection: () => ReportingSection,
64
71
  SectionPanel: () => SectionPanel,
65
72
  SimpleDataTable: () => SimpleDataTable,
66
73
  SocialAuthButtons: () => SocialAuthButtons,
@@ -75,14 +82,19 @@ __export(server_exports, {
75
82
  fr: () => fr,
76
83
  gdsLocales: () => gdsLocales,
77
84
  getGdsMessages: () => getGdsMessages,
85
+ getProviderIdentityLabel: () => getProviderIdentityLabel,
86
+ getProviderIdentityPolicy: () => getProviderIdentityPolicy,
78
87
  getSemanticActionConfig: () => getSemanticActionConfig,
79
88
  getSemanticActionLabel: () => getSemanticActionLabel,
89
+ getSupportedProviderIdentityIds: () => getSupportedProviderIdentityIds,
80
90
  he: () => he,
81
91
  hu: () => hu,
92
+ isPresentationMode: () => isPresentationMode,
82
93
  it: () => it,
83
94
  mergeGdsVocabularyPacks: () => mergeGdsVocabularyPacks,
84
95
  resolveAccentPanelStyles: () => resolveAccentPanelStyles,
85
96
  resolveSemanticActionConfig: () => resolveSemanticActionConfig,
97
+ resolveSurfacePresentationStyles: () => resolveSurfacePresentationStyles,
86
98
  ru: () => ru
87
99
  });
88
100
  module.exports = __toCommonJS(server_exports);
@@ -554,6 +566,51 @@ var import_core9 = require("@mantine/core");
554
566
 
555
567
  // src/SectionPanel.tsx
556
568
  var import_core8 = require("@mantine/core");
569
+
570
+ // src/SurfacePresentation.ts
571
+ var toCssLength = (value) => {
572
+ if (typeof value === "number") {
573
+ return `${value}px`;
574
+ }
575
+ return value;
576
+ };
577
+ function resolveSurfacePresentationStyles(props) {
578
+ const {
579
+ presentation = "inline",
580
+ minHeight,
581
+ contentAlign,
582
+ contentJustify
583
+ } = props;
584
+ if (presentation === "inline") {
585
+ return {
586
+ minHeight: toCssLength(minHeight)
587
+ };
588
+ }
589
+ const align = contentAlign ?? "center";
590
+ const justify = contentJustify ?? (presentation === "centered" ? "center" : "start");
591
+ if (presentation === "fill") {
592
+ return {
593
+ minHeight: toCssLength(minHeight),
594
+ display: "flex",
595
+ flex: 1,
596
+ flexDirection: "column",
597
+ alignItems: align === "center" ? "center" : "flex-start",
598
+ justifyContent: justify === "center" ? "center" : "flex-start"
599
+ };
600
+ }
601
+ return {
602
+ minHeight: toCssLength(minHeight),
603
+ display: "flex",
604
+ flexDirection: "column",
605
+ alignItems: align === "center" ? "center" : "flex-start",
606
+ justifyContent: justify === "center" ? "center" : "flex-start"
607
+ };
608
+ }
609
+ function isPresentationMode(value) {
610
+ return value === "inline" || value === "centered" || value === "fill";
611
+ }
612
+
613
+ // src/SectionPanel.tsx
557
614
  var import_jsx_runtime9 = require("react/jsx-runtime");
558
615
  var toneBackgrounds = {
559
616
  default: "var(--mantine-color-body)",
@@ -568,8 +625,18 @@ function SectionPanel({
568
625
  children,
569
626
  tone = "default",
570
627
  id,
571
- divided = true
628
+ divided = true,
629
+ presentation = "inline",
630
+ minHeight,
631
+ contentAlign,
632
+ contentJustify
572
633
  }) {
634
+ const bodyLayout = resolveSurfacePresentationStyles({
635
+ presentation,
636
+ minHeight,
637
+ contentAlign,
638
+ contentJustify
639
+ });
573
640
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core8.Paper, { id, withBorder: true, radius: "xl", p: "lg", style: { background: toneBackgrounds[tone] }, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_core8.Stack, { gap: "md", children: [
574
641
  title || description || action ? /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
575
642
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_core8.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
@@ -581,7 +648,7 @@ function SectionPanel({
581
648
  ] }),
582
649
  divided ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core8.Divider, {}) : null
583
650
  ] }) : null,
584
- children
651
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core8.Box, { style: bodyLayout, children })
585
652
  ] }) });
586
653
  }
587
654
 
@@ -1222,20 +1289,34 @@ function StateBlock({
1222
1289
  description,
1223
1290
  action,
1224
1291
  icon,
1225
- compact = false
1292
+ compact = false,
1293
+ presentation = "inline",
1294
+ minHeight,
1295
+ contentAlign,
1296
+ contentJustify
1226
1297
  }) {
1227
1298
  const config = variantConfig[variant];
1299
+ const layout = resolveSurfacePresentationStyles({
1300
+ presentation,
1301
+ minHeight,
1302
+ contentAlign,
1303
+ contentJustify
1304
+ });
1305
+ const centeredText = presentation !== "inline" ? (contentAlign ?? "center") === "center" : !compact;
1306
+ const centeredAlign = presentation !== "inline" ? contentAlign ?? "center" : "start";
1307
+ const headingAlign = presentation === "inline" ? compact ? "flex-start" : "center" : centeredAlign === "center" ? "center" : "flex-start";
1228
1308
  return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
1229
1309
  import_core18.Stack,
1230
1310
  {
1231
- align: compact ? "flex-start" : "center",
1232
- justify: "center",
1311
+ align: headingAlign,
1312
+ justify: presentation === "inline" ? "center" : void 0,
1233
1313
  gap: "md",
1234
1314
  py: compact ? "md" : "xl",
1235
- ta: compact ? "left" : "center",
1315
+ ta: centeredText ? "center" : "left",
1316
+ style: layout,
1236
1317
  children: [
1237
1318
  /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core18.ThemeIcon, { variant: "light", color: config.color, size: compact ? "lg" : "xl", radius: "xl", children: icon ?? config.icon }),
1238
- /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core18.Stack, { gap: 6, align: compact ? "flex-start" : "center", children: [
1319
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core18.Stack, { gap: 6, align: headingAlign, children: [
1239
1320
  /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core18.Title, { order: compact ? 4 : 3, children: title }),
1240
1321
  description ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core18.Text, { c: "dimmed", maw: compact ? void 0 : 480, children: description }) : null
1241
1322
  ] }),
@@ -1579,10 +1660,14 @@ var import_jsx_runtime27 = require("react/jsx-runtime");
1579
1660
  function AuthShell({
1580
1661
  title,
1581
1662
  description,
1663
+ intent = "sign-in",
1582
1664
  brand,
1583
1665
  headerActions,
1584
1666
  footer,
1585
1667
  helper,
1668
+ error,
1669
+ guestAction,
1670
+ supportAction,
1586
1671
  socialAuth,
1587
1672
  dividerLabel = "Or continue with your account",
1588
1673
  children
@@ -1594,12 +1679,18 @@ function AuthShell({
1594
1679
  ] }) : null,
1595
1680
  /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core25.Card, { withBorder: true, radius: "lg", padding: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_core25.Stack, { gap: "lg", children: [
1596
1681
  /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_core25.Stack, { gap: "xs", ta: "center", children: [
1682
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core25.Group, { justify: "center", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core25.Badge, { variant: "light", color: intent === "account-linking" ? "blue" : intent === "guest-entry" ? "gray" : "teal", children: intent.replace("-", " ") }) }),
1597
1683
  /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core25.Title, { order: 2, children: title }),
1598
1684
  description ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core25.Text, { c: "dimmed", size: "sm", children: description }) : null
1599
1685
  ] }),
1686
+ error ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core25.Alert, { color: "red", variant: "light", role: "alert", children: error }) : null,
1600
1687
  socialAuth ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core25.Box, { children: socialAuth }) : null,
1601
1688
  socialAuth ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core25.Divider, { label: dividerLabel, labelPosition: "center" }) : null,
1602
1689
  children,
1690
+ guestAction || supportAction ? /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_core25.Group, { justify: "center", gap: "sm", children: [
1691
+ guestAction,
1692
+ supportAction
1693
+ ] }) : null,
1603
1694
  helper ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core25.Text, { size: "sm", c: "dimmed", ta: "center", children: helper }) : null
1604
1695
  ] }) }),
1605
1696
  footer ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core25.Text, { size: "sm", c: "dimmed", ta: "center", children: footer }) : null
@@ -1607,45 +1698,196 @@ function AuthShell({
1607
1698
  }
1608
1699
 
1609
1700
  // src/SocialAuthButtons.tsx
1701
+ var import_core27 = require("@mantine/core");
1702
+
1703
+ // src/ProviderIdentityButtons.tsx
1610
1704
  var import_core26 = require("@mantine/core");
1611
1705
  var import_jsx_runtime28 = require("react/jsx-runtime");
1612
- var providerConfig = {
1613
- google: { label: "Google", mark: "G", color: "red" },
1614
- apple: { label: "Apple", mark: "A", color: "dark" },
1615
- github: { label: "GitHub", mark: "GH", color: "gray" },
1616
- facebook: { label: "Facebook", mark: "F", color: "blue" },
1617
- microsoft: { label: "Microsoft", mark: "M", color: "cyan" },
1618
- linkedin: { label: "LinkedIn", mark: "in", color: "blue" },
1619
- discord: { label: "Discord", mark: "D", color: "indigo" },
1620
- x: { label: "X", mark: "X", color: "dark" },
1621
- email: { label: "Email", mark: "@", color: "gray" }
1706
+ var PROVIDER_IDENTITY_REGISTRY = {
1707
+ google: {
1708
+ providerLabel: "Google",
1709
+ markLabel: "G",
1710
+ brandColor: "red"
1711
+ },
1712
+ apple: {
1713
+ providerLabel: "Apple",
1714
+ markLabel: "A",
1715
+ brandColor: "dark"
1716
+ },
1717
+ github: {
1718
+ providerLabel: "GitHub",
1719
+ markLabel: "GH",
1720
+ brandColor: "gray"
1721
+ },
1722
+ facebook: {
1723
+ providerLabel: "Facebook",
1724
+ markLabel: "F",
1725
+ brandColor: "blue"
1726
+ },
1727
+ microsoft: {
1728
+ providerLabel: "Microsoft",
1729
+ markLabel: "M",
1730
+ brandColor: "cyan"
1731
+ },
1732
+ linkedin: {
1733
+ providerLabel: "LinkedIn",
1734
+ markLabel: "in",
1735
+ brandColor: "blue"
1736
+ },
1737
+ discord: {
1738
+ providerLabel: "Discord",
1739
+ markLabel: "D",
1740
+ brandColor: "indigo"
1741
+ },
1742
+ x: {
1743
+ providerLabel: "X",
1744
+ markLabel: "X",
1745
+ brandColor: "dark"
1746
+ },
1747
+ email: {
1748
+ providerLabel: "Email",
1749
+ markLabel: "@",
1750
+ brandColor: "gray"
1751
+ }
1622
1752
  };
1623
- function ProviderMark({ id }) {
1624
- const config = providerConfig[id] ?? { label: id, mark: id.slice(0, 2).toUpperCase(), color: "gray" };
1625
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.ThemeIcon, { variant: "light", color: config.color, radius: "xl", size: "md", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.Text, { size: "xs", fw: 700, children: config.mark }) });
1626
- }
1627
- function SocialAuthButton({ provider, compact = false }) {
1628
- const config = providerConfig[provider.id] ?? { label: provider.id, mark: provider.id.slice(0, 2).toUpperCase(), color: "gray" };
1629
- const label = provider.label ?? `Continue with ${config.label}`;
1630
- const buttonProps = provider.href ? { component: "a", href: provider.href } : { onClick: provider.onClick };
1753
+ function normalizeProviderId(provider) {
1754
+ return (provider ?? "").trim().toLowerCase();
1755
+ }
1756
+ function isSupportedProviderId(provider) {
1757
+ return provider in PROVIDER_IDENTITY_REGISTRY;
1758
+ }
1759
+ function getProviderIdentityMeta(provider) {
1760
+ const normalized = normalizeProviderId(provider);
1761
+ if (isSupportedProviderId(normalized)) {
1762
+ return {
1763
+ id: normalized,
1764
+ supported: true,
1765
+ ...PROVIDER_IDENTITY_REGISTRY[normalized]
1766
+ };
1767
+ }
1768
+ return {
1769
+ id: normalized || "provider",
1770
+ supported: false,
1771
+ providerLabel: provider ? provider : "Provider",
1772
+ markLabel: (provider ?? "PR").slice(0, 2).toUpperCase(),
1773
+ brandColor: "gray"
1774
+ };
1775
+ }
1776
+ function resolveProviderLabel(provider, customLabel) {
1777
+ const meta = getProviderIdentityMeta(provider);
1778
+ if (customLabel != null) {
1779
+ return customLabel;
1780
+ }
1781
+ return `Continue with ${meta.providerLabel}`;
1782
+ }
1783
+ function mapVariant(variant = "neutral") {
1784
+ if (variant === "solid") {
1785
+ return "filled";
1786
+ }
1787
+ if (variant === "outline") {
1788
+ return "outline";
1789
+ }
1790
+ return "default";
1791
+ }
1792
+ function getProviderIdentityLabel(provider, fallbackOverride) {
1793
+ return resolveProviderLabel(provider, fallbackOverride);
1794
+ }
1795
+ function getSupportedProviderIdentityIds() {
1796
+ return Object.keys(PROVIDER_IDENTITY_REGISTRY);
1797
+ }
1798
+ function getProviderIdentityPolicy(provider) {
1799
+ const meta = getProviderIdentityMeta(provider);
1800
+ return {
1801
+ id: meta.id,
1802
+ supported: meta.supported,
1803
+ providerLabel: meta.providerLabel,
1804
+ colorAuthority: meta.supported ? "provider" : "gds-neutral",
1805
+ minTouchTargetPx: 44,
1806
+ allowedVariants: ["solid", "outline", "neutral"]
1807
+ };
1808
+ }
1809
+ function ProviderIdentityMark({ provider }) {
1810
+ const meta = getProviderIdentityMeta(provider);
1811
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1812
+ import_core26.ThemeIcon,
1813
+ {
1814
+ variant: "light",
1815
+ color: meta.brandColor,
1816
+ radius: "xl",
1817
+ size: "md",
1818
+ "aria-hidden": "true",
1819
+ children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.Text, { size: "xs", fw: 700, c: "inherit", children: meta.markLabel })
1820
+ }
1821
+ );
1822
+ }
1823
+ function ProviderIdentityButton({
1824
+ provider,
1825
+ label,
1826
+ description,
1827
+ policyNote,
1828
+ error,
1829
+ href,
1830
+ onClick,
1831
+ disabled,
1832
+ loading,
1833
+ tenantDisabledReason,
1834
+ fullWidth = true,
1835
+ size = "md",
1836
+ variant = "neutral",
1837
+ ariaLabel,
1838
+ describedBy,
1839
+ minTouchTargetPx = 44
1840
+ }) {
1841
+ const meta = getProviderIdentityMeta(provider);
1842
+ const buttonLabel = resolveProviderLabel(provider, label);
1843
+ const resolvedDisabled = disabled || Boolean(tenantDisabledReason);
1844
+ const buttonProps = href ? {
1845
+ component: "a",
1846
+ href
1847
+ } : {
1848
+ onClick
1849
+ };
1631
1850
  return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1632
1851
  import_core26.Button,
1633
1852
  {
1634
- variant: "default",
1853
+ variant: mapVariant(variant),
1854
+ color: variant === "solid" ? meta.brandColor : void 0,
1635
1855
  justify: "space-between",
1636
- fullWidth: true,
1637
- size: compact ? "sm" : "md",
1638
- leftSection: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ProviderMark, { id: provider.id }),
1639
- disabled: provider.disabled,
1640
- loading: provider.loading,
1856
+ fullWidth,
1857
+ size,
1858
+ "aria-label": ariaLabel ?? (typeof buttonLabel === "string" ? buttonLabel : void 0),
1859
+ "aria-describedby": describedBy,
1860
+ leftSection: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ProviderIdentityMark, { provider }),
1861
+ disabled: resolvedDisabled,
1862
+ loading,
1863
+ styles: { root: { minHeight: minTouchTargetPx } },
1641
1864
  ...buttonProps,
1642
1865
  children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_core26.Stack, { gap: 0, align: "flex-start", children: [
1643
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.Text, { inherit: true, children: label }),
1644
- provider.description ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.Text, { size: "xs", c: "dimmed", lh: 1.2, children: provider.description }) : null
1866
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.Text, { inherit: true, children: buttonLabel }),
1867
+ description ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.Text, { size: "xs", c: "dimmed", lh: 1.2, children: description }) : null,
1868
+ policyNote ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.Text, { size: "xs", c: "dimmed", lh: 1.2, children: policyNote }) : null,
1869
+ tenantDisabledReason ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.Text, { size: "xs", c: "orange.7", lh: 1.2, children: tenantDisabledReason }) : null,
1870
+ error ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.Text, { size: "xs", c: "red.7", lh: 1.2, role: "alert", children: error }) : null
1645
1871
  ] })
1646
1872
  }
1647
1873
  );
1648
1874
  }
1875
+ function ProviderIdentityButtonGroup({ providers, layout = "stack" }) {
1876
+ if (!providers.length) {
1877
+ return null;
1878
+ }
1879
+ const content = providers.map((entry, index) => {
1880
+ const key = `${normalizeProviderId(String(entry.provider)) || "provider"}-${index}`;
1881
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ProviderIdentityButton, { ...entry }, key);
1882
+ });
1883
+ if (layout === "grid") {
1884
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.SimpleGrid, { cols: { base: 1, sm: 2 }, spacing: "sm", children: content });
1885
+ }
1886
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.Stack, { gap: "sm", children: content });
1887
+ }
1888
+
1889
+ // src/SocialAuthButtons.tsx
1890
+ var import_jsx_runtime29 = require("react/jsx-runtime");
1649
1891
  function SocialAuthButtons({
1650
1892
  providers,
1651
1893
  title = "Continue with a trusted provider",
@@ -1656,54 +1898,67 @@ function SocialAuthButtons({
1656
1898
  if (!providers.length) {
1657
1899
  return null;
1658
1900
  }
1659
- const content = providers.map((provider) => /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(SocialAuthButton, { provider, compact }, provider.id));
1660
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_core26.Stack, { gap: "md", children: [
1661
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_core26.Stack, { gap: 4, ta: "center", children: [
1662
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_core26.Group, { justify: "center", gap: "xs", children: [
1663
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(GdsIcons.Login, { size: "1rem" }),
1664
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.Text, { fw: 600, children: title })
1901
+ const buttons = providers.map((provider) => ({
1902
+ provider: provider.id,
1903
+ label: provider.label,
1904
+ description: provider.description,
1905
+ policyNote: provider.policyNote,
1906
+ error: provider.error,
1907
+ href: provider.href,
1908
+ onClick: provider.onClick,
1909
+ disabled: provider.disabled,
1910
+ loading: provider.loading,
1911
+ tenantDisabledReason: provider.tenantDisabledReason,
1912
+ size: provider.size ?? (compact ? "sm" : "md"),
1913
+ variant: provider.variant
1914
+ }));
1915
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core27.Stack, { gap: "md", children: [
1916
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core27.Stack, { gap: 4, ta: "center", children: [
1917
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core27.Group, { justify: "center", gap: "xs", children: [
1918
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(GdsIcons.Login, { size: "1rem" }),
1919
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core27.Text, { fw: 600, children: title })
1665
1920
  ] }),
1666
- description ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.Text, { size: "sm", c: "dimmed", children: description }) : null
1921
+ description ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core27.Text, { size: "sm", c: "dimmed", children: description }) : null
1667
1922
  ] }),
1668
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.Divider, {}),
1669
- layout === "grid" ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.SimpleGrid, { cols: { base: 1, sm: 2 }, spacing: "sm", children: content }) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core26.Stack, { gap: "sm", children: content })
1923
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core27.Divider, {}),
1924
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(ProviderIdentityButtonGroup, { providers: buttons, layout })
1670
1925
  ] });
1671
1926
  }
1672
1927
 
1673
1928
  // src/ArticleShell.tsx
1674
- var import_core27 = require("@mantine/core");
1675
- var import_jsx_runtime29 = require("react/jsx-runtime");
1929
+ var import_core28 = require("@mantine/core");
1930
+ var import_jsx_runtime30 = require("react/jsx-runtime");
1676
1931
  function ArticleShell({ eyebrow, title, lead, meta, sideRail, children }) {
1677
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core27.Container, { size: "lg", py: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core27.Group, { align: "flex-start", gap: "xl", wrap: "nowrap", children: [
1678
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core27.Stack, { gap: "lg", maw: 760, flex: 1, children: [
1679
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core27.Stack, { gap: "sm", children: [
1680
- eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core27.Text, { size: "sm", fw: 700, c: "dimmed", tt: "uppercase", children: eyebrow }) : null,
1681
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core27.Title, { order: 1, children: title }),
1682
- lead ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core27.Text, { size: "lg", c: "dimmed", children: lead }) : null,
1683
- meta ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core27.Group, { gap: "md", children: meta }) : null
1932
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Container, { size: "lg", py: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core28.Group, { align: "flex-start", gap: "xl", wrap: "nowrap", children: [
1933
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core28.Stack, { gap: "lg", maw: 760, flex: 1, children: [
1934
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core28.Stack, { gap: "sm", children: [
1935
+ eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Text, { size: "sm", fw: 700, c: "dimmed", tt: "uppercase", children: eyebrow }) : null,
1936
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Title, { order: 1, children: title }),
1937
+ lead ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Text, { size: "lg", c: "dimmed", children: lead }) : null,
1938
+ meta ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Group, { gap: "md", children: meta }) : null
1684
1939
  ] }),
1685
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core27.Stack, { gap: "md", children })
1940
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Stack, { gap: "md", children })
1686
1941
  ] }),
1687
- sideRail ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core27.Stack, { visibleFrom: "lg", gap: "md", w: 240, children: sideRail }) : null
1942
+ sideRail ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core28.Stack, { visibleFrom: "lg", gap: "md", w: 240, children: sideRail }) : null
1688
1943
  ] }) });
1689
1944
  }
1690
1945
 
1691
1946
  // src/CtaButtonGroup.tsx
1692
- var import_core28 = require("@mantine/core");
1693
- var import_jsx_runtime30 = require("react/jsx-runtime");
1947
+ var import_core29 = require("@mantine/core");
1948
+ var import_jsx_runtime31 = require("react/jsx-runtime");
1694
1949
  function CtaButtonGroup({ primary, secondary, tertiary }) {
1695
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core28.Stack, { gap: "sm", children: [
1696
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core28.Group, { gap: "sm", align: "stretch", children: [
1697
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { children: primary }),
1698
- secondary ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { children: secondary }) : null
1950
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Stack, { gap: "sm", children: [
1951
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Group, { gap: "sm", align: "stretch", children: [
1952
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { children: primary }),
1953
+ secondary ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { children: secondary }) : null
1699
1954
  ] }),
1700
- tertiary ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { children: tertiary }) : null
1955
+ tertiary ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { children: tertiary }) : null
1701
1956
  ] });
1702
1957
  }
1703
1958
 
1704
1959
  // src/DocsPageShell.tsx
1705
- var import_core29 = require("@mantine/core");
1706
- var import_jsx_runtime31 = require("react/jsx-runtime");
1960
+ var import_core30 = require("@mantine/core");
1961
+ var import_jsx_runtime32 = require("react/jsx-runtime");
1707
1962
  function DocsPageShell({
1708
1963
  breadcrumbs = [],
1709
1964
  title,
@@ -1714,27 +1969,27 @@ function DocsPageShell({
1714
1969
  footerNext,
1715
1970
  children
1716
1971
  }) {
1717
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Container, { fluid: true, py: "xl", px: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Group, { align: "flex-start", gap: "xl", wrap: "nowrap", children: [
1718
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Stack, { component: "article", gap: "lg", flex: 1, miw: 0, children: [
1719
- breadcrumbs.length ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Breadcrumbs, { children: breadcrumbs.map(
1720
- (crumb) => crumb.href ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Anchor, { href: crumb.href, children: crumb.label }, `${crumb.label}-${crumb.href}`) : /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Text, { children: crumb.label }, crumb.label)
1972
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Container, { fluid: true, py: "xl", px: { base: "md", md: "lg", lg: "xl" }, w: "100%", maw: "100%", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.Group, { align: "flex-start", gap: "xl", wrap: "nowrap", children: [
1973
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.Stack, { component: "article", gap: "lg", flex: 1, miw: 0, children: [
1974
+ breadcrumbs.length ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Breadcrumbs, { children: breadcrumbs.map(
1975
+ (crumb) => crumb.href ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Anchor, { href: crumb.href, children: crumb.label }, `${crumb.label}-${crumb.href}`) : /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Text, { children: crumb.label }, crumb.label)
1721
1976
  ) }) : null,
1722
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core29.Stack, { gap: "sm", children: [
1723
- eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Text, { size: "sm", fw: 700, c: "dimmed", children: eyebrow }) : null,
1724
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Title, { order: 1, children: title }),
1725
- lead ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Text, { size: "lg", c: "dimmed", maw: 920, children: lead }) : null,
1726
- meta ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Group, { gap: "md", children: meta }) : null
1977
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.Stack, { gap: "sm", children: [
1978
+ eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Text, { size: "sm", fw: 700, c: "dimmed", children: eyebrow }) : null,
1979
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Title, { order: 1, children: title }),
1980
+ lead ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Text, { size: "lg", c: "dimmed", children: lead }) : null,
1981
+ meta ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Group, { gap: "md", children: meta }) : null
1727
1982
  ] }),
1728
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Stack, { gap: "md", children }),
1729
- footerNext ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Anchor, { href: footerNext.href, fw: 600, children: footerNext.label }) : null
1983
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Stack, { gap: "md", children }),
1984
+ footerNext ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Anchor, { href: footerNext.href, fw: 600, children: footerNext.label }) : null
1730
1985
  ] }),
1731
- sideRail ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core29.Stack, { visibleFrom: "lg", gap: "md", w: 240, children: sideRail }) : null
1986
+ sideRail ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Stack, { visibleFrom: "lg", gap: "md", w: 240, children: sideRail }) : null
1732
1987
  ] }) });
1733
1988
  }
1734
1989
 
1735
1990
  // src/EditorialHero.tsx
1736
- var import_core30 = require("@mantine/core");
1737
- var import_jsx_runtime32 = require("react/jsx-runtime");
1991
+ var import_core31 = require("@mantine/core");
1992
+ var import_jsx_runtime33 = require("react/jsx-runtime");
1738
1993
  function resolveActionVariant(action, index, seenPrimary) {
1739
1994
  const requested = action.variant ?? (index === 0 ? "primary" : "secondary");
1740
1995
  if (requested === "primary" && !seenPrimary) {
@@ -1746,8 +2001,8 @@ function resolveActionVariant(action, index, seenPrimary) {
1746
2001
  return { variant: "default", seenPrimary };
1747
2002
  }
1748
2003
  function HeroAction({ action, variant }) {
1749
- const content = /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1750
- import_core30.Anchor,
2004
+ const content = /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2005
+ import_core31.Anchor,
1751
2006
  {
1752
2007
  href: action.href,
1753
2008
  onClick: action.onClick,
@@ -1771,8 +2026,8 @@ function HeroAction({ action, variant }) {
1771
2026
  }
1772
2027
  );
1773
2028
  if (!action.href) {
1774
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1775
- import_core30.Box,
2029
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2030
+ import_core31.Box,
1776
2031
  {
1777
2032
  component: "button",
1778
2033
  type: "button",
@@ -1799,30 +2054,30 @@ function HeroAction({ action, variant }) {
1799
2054
  return content;
1800
2055
  }
1801
2056
  function LoadingHero({ compact }) {
1802
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Paper, { withBorder: true, radius: "xl", p: compact ? "lg" : "xl", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.Grid, { gutter: compact ? "lg" : "xl", align: "center", children: [
1803
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Grid.Col, { span: { base: 12, md: 6 }, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.Stack, { gap: "md", children: [
1804
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Skeleton, { height: 16, width: 96, radius: "xl" }),
1805
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Skeleton, { height: 48, width: "90%", radius: "md" }),
1806
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Skeleton, { height: 18, width: "100%", radius: "md" }),
1807
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Skeleton, { height: 18, width: "82%", radius: "md" }),
1808
- /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.Group, { children: [
1809
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Skeleton, { height: 40, width: 140, radius: "md" }),
1810
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Skeleton, { height: 40, width: 140, radius: "md" })
2057
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Paper, { withBorder: true, radius: "xl", p: compact ? "lg" : "xl", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Grid, { gutter: compact ? "lg" : "xl", align: "center", children: [
2058
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Grid.Col, { span: { base: 12, md: 6 }, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Stack, { gap: "md", children: [
2059
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Skeleton, { height: 16, width: 96, radius: "xl" }),
2060
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Skeleton, { height: 48, width: "90%", radius: "md" }),
2061
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Skeleton, { height: 18, width: "100%", radius: "md" }),
2062
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Skeleton, { height: 18, width: "82%", radius: "md" }),
2063
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Group, { children: [
2064
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Skeleton, { height: 40, width: 140, radius: "md" }),
2065
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Skeleton, { height: 40, width: 140, radius: "md" })
1811
2066
  ] })
1812
2067
  ] }) }),
1813
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Grid.Col, { span: { base: 12, md: 6 }, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.AspectRatio, { ratio: 16 / 11, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Skeleton, { radius: "lg" }) }) })
2068
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Grid.Col, { span: { base: 12, md: 6 }, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.AspectRatio, { ratio: 16 / 11, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Skeleton, { radius: "lg" }) }) })
1814
2069
  ] }) });
1815
2070
  }
1816
2071
  function MediaFallback() {
1817
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.AspectRatio, { ratio: 16 / 11, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1818
- import_core30.ThemeIcon,
2072
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.AspectRatio, { ratio: 16 / 11, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2073
+ import_core31.ThemeIcon,
1819
2074
  {
1820
2075
  size: "100%",
1821
2076
  radius: "lg",
1822
2077
  color: "gray",
1823
2078
  variant: "light",
1824
2079
  "aria-label": "Hero media is unavailable",
1825
- children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(GdsIcons.Gallery, { size: "2.5rem" })
2080
+ children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(GdsIcons.Gallery, { size: "2.5rem" })
1826
2081
  }
1827
2082
  ) });
1828
2083
  }
@@ -1842,8 +2097,8 @@ function MediaFrame({
1842
2097
  } else if (mediaFade === "soft-start") {
1843
2098
  overlayBackground = "linear-gradient(90deg, light-dark(rgba(255,255,255,0.9), rgba(17,24,39,0.72)) 0%, rgba(255,255,255,0) 28%)";
1844
2099
  }
1845
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
1846
- import_core30.Box,
2100
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
2101
+ import_core31.Box,
1847
2102
  {
1848
2103
  component: "figure",
1849
2104
  m: 0,
@@ -1856,9 +2111,9 @@ function MediaFrame({
1856
2111
  },
1857
2112
  "aria-label": mediaAlt,
1858
2113
  children: [
1859
- media ?? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(MediaFallback, {}),
1860
- media && overlayBackground ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1861
- import_core30.Box,
2114
+ media ?? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MediaFallback, {}),
2115
+ media && overlayBackground ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2116
+ import_core31.Box,
1862
2117
  {
1863
2118
  "aria-hidden": true,
1864
2119
  style: {
@@ -1891,7 +2146,7 @@ function EditorialHero({
1891
2146
  classNames
1892
2147
  }) {
1893
2148
  if (loading) {
1894
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(LoadingHero, { compact });
2149
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(LoadingHero, { compact });
1895
2150
  }
1896
2151
  const stackAlign = align === "center" ? "center" : "flex-start";
1897
2152
  const textAlign = align === "center" ? "center" : "left";
@@ -1899,15 +2154,15 @@ function EditorialHero({
1899
2154
  const renderedActions = actions.slice(0, 3).map((action, index) => {
1900
2155
  const resolved = resolveActionVariant(action, index, seenPrimary);
1901
2156
  seenPrimary = resolved.seenPrimary;
1902
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(HeroAction, { action, variant: resolved.variant }, `${action.label}-${index}`);
2157
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(HeroAction, { action, variant: resolved.variant }, `${action.label}-${index}`);
1903
2158
  });
1904
- const textSlot = /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.Stack, { gap: compact ? "md" : "lg", justify: "center", h: "100%", className: classNames?.content, children: [
1905
- /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.Stack, { gap: "sm", align: stackAlign, children: [
1906
- eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Text, { size: "sm", fw: 700, c: "dimmed", ta: textAlign, children: eyebrow }) : null,
1907
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Title, { order: 1, maw: 760, ta: textAlign, children: title }),
1908
- description ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Text, { size: compact ? "md" : "lg", c: "dimmed", maw: 720, ta: textAlign, children: description }) : null
2159
+ const textSlot = /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Stack, { gap: compact ? "md" : "lg", justify: "center", h: "100%", className: classNames?.content, children: [
2160
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Stack, { gap: "sm", align: stackAlign, children: [
2161
+ eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Text, { size: "sm", fw: 700, c: "dimmed", ta: textAlign, children: eyebrow }) : null,
2162
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Title, { order: 1, maw: 760, ta: textAlign, children: title }),
2163
+ description ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Text, { size: compact ? "md" : "lg", c: "dimmed", maw: 720, ta: textAlign, children: description }) : null
1909
2164
  ] }),
1910
- renderedActions.length ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Box, { className: classNames?.actions, children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
2165
+ renderedActions.length ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Box, { className: classNames?.actions, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1911
2166
  CtaButtonGroup,
1912
2167
  {
1913
2168
  primary: renderedActions[0],
@@ -1915,8 +2170,8 @@ function EditorialHero({
1915
2170
  tertiary: renderedActions[2]
1916
2171
  }
1917
2172
  ) }) : null,
1918
- meta.length ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Group, { gap: "sm", wrap: "wrap", "aria-label": "Supporting details", className: classNames?.meta, children: meta.map((item) => /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(
1919
- import_core30.Group,
2173
+ meta.length ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Group, { gap: "sm", wrap: "wrap", "aria-label": "Supporting details", className: classNames?.meta, children: meta.map((item) => /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(
2174
+ import_core31.Group,
1920
2175
  {
1921
2176
  gap: 6,
1922
2177
  px: "sm",
@@ -1927,17 +2182,17 @@ function EditorialHero({
1927
2182
  },
1928
2183
  children: [
1929
2184
  item.icon,
1930
- /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Text, { size: "sm", c: "dimmed", children: item.label })
2185
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Text, { size: "sm", c: "dimmed", children: item.label })
1931
2186
  ]
1932
2187
  },
1933
2188
  item.id
1934
2189
  )) }) : null
1935
2190
  ] });
1936
- const mediaSlot = error ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(AccentPanel, { tone: "red", variant: "soft-outline", title: "Media unavailable", children: error }) : /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(MediaFrame, { media, mediaAlt, mediaFade, className: classNames?.media });
1937
- const textCol = /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Grid.Col, { span: { base: 12, md: 6 }, order: { base: 1, md: mediaPosition === "left" ? 2 : 1 }, children: textSlot });
1938
- const mediaCol = /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core30.Grid.Col, { span: { base: 12, md: 6 }, order: { base: 2, md: mediaPosition === "left" ? 1 : 2 }, children: mediaSlot });
1939
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1940
- import_core30.Paper,
2191
+ const mediaSlot = error ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(AccentPanel, { tone: "red", variant: "soft-outline", title: "Media unavailable", children: error }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(MediaFrame, { media, mediaAlt, mediaFade, className: classNames?.media });
2192
+ const textCol = /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Grid.Col, { span: { base: 12, md: 6 }, order: { base: 1, md: mediaPosition === "left" ? 2 : 1 }, children: textSlot });
2193
+ const mediaCol = /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Grid.Col, { span: { base: 12, md: 6 }, order: { base: 2, md: mediaPosition === "left" ? 1 : 2 }, children: mediaSlot });
2194
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2195
+ import_core31.Paper,
1941
2196
  {
1942
2197
  component: "section",
1943
2198
  withBorder: true,
@@ -1945,7 +2200,7 @@ function EditorialHero({
1945
2200
  p: compact ? "lg" : "xl",
1946
2201
  className: classNames?.root,
1947
2202
  style: surfaceVariant === "flat-public" ? { boxShadow: "none" } : void 0,
1948
- children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core30.Grid, { gutter: compact ? "lg" : "xl", align: "center", children: [
2203
+ children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Grid, { gutter: compact ? "lg" : "xl", align: "center", children: [
1949
2204
  textCol,
1950
2205
  mediaCol
1951
2206
  ] })
@@ -1954,19 +2209,19 @@ function EditorialHero({
1954
2209
  }
1955
2210
 
1956
2211
  // src/FeatureBand.tsx
1957
- var import_core31 = require("@mantine/core");
1958
- var import_jsx_runtime33 = require("react/jsx-runtime");
2212
+ var import_core32 = require("@mantine/core");
2213
+ var import_jsx_runtime34 = require("react/jsx-runtime");
1959
2214
  function FeatureBandSkeleton({
1960
2215
  columns = 3,
1961
2216
  bordered = true,
1962
2217
  variant = "default"
1963
2218
  }) {
1964
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.SimpleGrid, { cols: { base: 1, sm: Math.min(columns, 2), lg: columns }, spacing: "lg", children: Array.from({ length: columns }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Paper, { withBorder: bordered, radius: "lg", p: variant === "compact" ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Stack, { gap: "md", children: [
1965
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Skeleton, { height: variant === "process" ? 28 : 42, width: variant === "process" ? 72 : 42, radius: "xl" }),
1966
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Stack, { gap: "xs", children: [
1967
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Skeleton, { height: 20, width: "75%", radius: "md" }),
1968
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Skeleton, { height: 14, width: "100%", radius: "md" }),
1969
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Skeleton, { height: 14, width: "82%", radius: "md" })
2219
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.SimpleGrid, { cols: { base: 1, sm: Math.min(columns, 2), lg: columns }, spacing: "lg", children: Array.from({ length: columns }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Paper, { withBorder: bordered, radius: "lg", p: variant === "compact" ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core32.Stack, { gap: "md", children: [
2220
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Skeleton, { height: variant === "process" ? 28 : 42, width: variant === "process" ? 72 : 42, radius: "xl" }),
2221
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core32.Stack, { gap: "xs", children: [
2222
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Skeleton, { height: 20, width: "75%", radius: "md" }),
2223
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Skeleton, { height: 14, width: "100%", radius: "md" }),
2224
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Skeleton, { height: 14, width: "82%", radius: "md" })
1970
2225
  ] })
1971
2226
  ] }) }, index)) });
1972
2227
  }
@@ -1979,10 +2234,10 @@ function FeatureBand({
1979
2234
  variant = "default"
1980
2235
  }) {
1981
2236
  if (loading) {
1982
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(FeatureBandSkeleton, { columns, bordered, variant });
2237
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(FeatureBandSkeleton, { columns, bordered, variant });
1983
2238
  }
1984
2239
  if (!items.length) {
1985
- return emptyState ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_jsx_runtime33.Fragment, { children: emptyState }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2240
+ return emptyState ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_jsx_runtime34.Fragment, { children: emptyState }) : /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
1986
2241
  EmptyState,
1987
2242
  {
1988
2243
  title: "No supporting details available",
@@ -1990,9 +2245,9 @@ function FeatureBand({
1990
2245
  }
1991
2246
  );
1992
2247
  }
1993
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Box, { component: "section", "aria-label": "Supporting features", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.SimpleGrid, { cols: { base: 1, sm: Math.min(columns, 2), lg: columns }, spacing: "lg", children: items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Paper, { withBorder: bordered, radius: "lg", p: variant === "compact" ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Stack, { gap: "md", children: [
1994
- variant === "process" ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
1995
- import_core31.Text,
2248
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Box, { component: "section", "aria-label": "Supporting features", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.SimpleGrid, { cols: { base: 1, sm: Math.min(columns, 2), lg: columns }, spacing: "lg", children: items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Paper, { withBorder: bordered, radius: "lg", p: variant === "compact" ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core32.Stack, { gap: "md", children: [
2249
+ variant === "process" ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
2250
+ import_core32.Text,
1996
2251
  {
1997
2252
  fw: 800,
1998
2253
  size: "sm",
@@ -2004,31 +2259,31 @@ function FeatureBand({
2004
2259
  },
2005
2260
  children: item.stepLabel ?? `Step ${index + 1}`
2006
2261
  }
2007
- ) }) : item.media ? item.media : item.icon ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.ThemeIcon, { size: "xl", radius: "xl", variant: "light", color: "violet", children: item.icon }) }) : /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.ThemeIcon, { size: "xl", radius: "xl", variant: "light", color: "gray", "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(GdsIcons.Info, { size: "1.25rem" }) }) }),
2008
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Stack, { gap: "xs", children: [
2009
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Title, { order: 4, children: item.title }),
2010
- item.description ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Text, { c: "dimmed", children: item.description }) : null,
2011
- item.meta ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Text, { size: "sm", c: "dimmed", children: item.meta }) : null
2262
+ ) }) : item.media ? item.media : item.icon ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.ThemeIcon, { size: "xl", radius: "xl", variant: "light", color: "violet", children: item.icon }) }) : /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.ThemeIcon, { size: "xl", radius: "xl", variant: "light", color: "gray", "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(GdsIcons.Info, { size: "1.25rem" }) }) }),
2263
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core32.Stack, { gap: "xs", children: [
2264
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Title, { order: 4, children: item.title }),
2265
+ item.description ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Text, { c: "dimmed", children: item.description }) : null,
2266
+ item.meta ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Text, { size: "sm", c: "dimmed", children: item.meta }) : null
2012
2267
  ] })
2013
2268
  ] }) }, item.id)) }) });
2014
2269
  }
2015
2270
 
2016
2271
  // src/MapPanel.tsx
2017
- var import_core33 = require("@mantine/core");
2272
+ var import_core34 = require("@mantine/core");
2018
2273
 
2019
2274
  // src/ActionBar.tsx
2020
- var import_core32 = require("@mantine/core");
2021
- var import_jsx_runtime34 = require("react/jsx-runtime");
2275
+ var import_core33 = require("@mantine/core");
2276
+ var import_jsx_runtime35 = require("react/jsx-runtime");
2022
2277
  function renderSemanticAction(action, slot, vocabularyPacks) {
2023
2278
  const { action: actionId, variant, ariaLabel, ...props } = action;
2024
2279
  const fallbackVariant = slot === "primary" ? "filled" : slot === "secondary" ? "default" : "subtle";
2025
2280
  const config = resolveSemanticActionConfig(actionId, vocabularyPacks);
2026
2281
  const Icon = config.icon;
2027
2282
  const label = getSemanticActionLabel(actionId, void 0, vocabularyPacks);
2028
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
2029
- import_core32.Button,
2283
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
2284
+ import_core33.Button,
2030
2285
  {
2031
- leftSection: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(Icon, { size: "1rem", stroke: 1.75 }),
2286
+ leftSection: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(Icon, { size: "1rem", stroke: 1.75 }),
2032
2287
  "aria-label": ariaLabel ?? label,
2033
2288
  variant: variant ?? fallbackVariant,
2034
2289
  ...props,
@@ -2045,23 +2300,23 @@ function ActionBar({
2045
2300
  gap = "sm",
2046
2301
  vocabularyPacks = []
2047
2302
  }) {
2048
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Stack, { gap, children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core32.Group, { justify: "space-between", align: "center", gap, wrap: "wrap", children: [
2049
- /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core32.Group, { gap, wrap: "wrap", children: [
2303
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Stack, { gap, children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Group, { justify: "space-between", align: "center", gap, wrap: "wrap", children: [
2304
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Group, { gap, wrap: "wrap", children: [
2050
2305
  secondary.map((action) => renderSemanticAction(action, "secondary", vocabularyPacks)),
2051
2306
  tertiary.map((action) => renderSemanticAction(action, "tertiary", vocabularyPacks))
2052
2307
  ] }),
2053
- /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core32.Group, { gap, wrap: "wrap", justify: "flex-end", style: { marginInlineStart: "auto" }, children: [
2308
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Group, { gap, wrap: "wrap", justify: "flex-end", style: { marginInlineStart: "auto" }, children: [
2054
2309
  iconOnly.map(({ action, ariaLabel, ...props }) => {
2055
2310
  const config = resolveSemanticActionConfig(action, vocabularyPacks);
2056
2311
  const Icon = config.icon;
2057
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
2058
- import_core32.ActionIcon,
2312
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
2313
+ import_core33.ActionIcon,
2059
2314
  {
2060
2315
  variant: "subtle",
2061
2316
  size: "lg",
2062
2317
  "aria-label": ariaLabel ?? getSemanticActionLabel(action, void 0, vocabularyPacks),
2063
2318
  ...props,
2064
- children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(Icon, { size: "1rem", stroke: 1.75 })
2319
+ children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(Icon, { size: "1rem", stroke: 1.75 })
2065
2320
  },
2066
2321
  `icon-${action}`
2067
2322
  );
@@ -2072,7 +2327,7 @@ function ActionBar({
2072
2327
  }
2073
2328
 
2074
2329
  // src/MapPanel.tsx
2075
- var import_jsx_runtime35 = require("react/jsx-runtime");
2330
+ var import_jsx_runtime36 = require("react/jsx-runtime");
2076
2331
  function MapPanel({
2077
2332
  title,
2078
2333
  description,
@@ -2088,7 +2343,7 @@ function MapPanel({
2088
2343
  }) {
2089
2344
  let body;
2090
2345
  if (loading) {
2091
- body = /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
2346
+ body = /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2092
2347
  StateBlock,
2093
2348
  {
2094
2349
  variant: "loading",
@@ -2098,9 +2353,9 @@ function MapPanel({
2098
2353
  }
2099
2354
  );
2100
2355
  } else if (error) {
2101
- body = /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(StateBlock, { variant: "error", title: "Map unavailable", description: error, compact: true });
2356
+ body = /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(StateBlock, { variant: "error", title: "Map unavailable", description: error, compact: true });
2102
2357
  } else if (!iframeSrc && !renderMap) {
2103
- body = /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
2358
+ body = /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2104
2359
  StateBlock,
2105
2360
  {
2106
2361
  variant: "empty",
@@ -2110,9 +2365,9 @@ function MapPanel({
2110
2365
  }
2111
2366
  );
2112
2367
  } else if (renderMap) {
2113
- body = /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Box, { style: { minHeight }, children: renderMap() });
2368
+ body = /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Box, { style: { minHeight }, children: renderMap() });
2114
2369
  } else {
2115
- body = /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.AspectRatio, { ratio: 16 / 9, children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
2370
+ body = /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.AspectRatio, { ratio: 16 / 9, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2116
2371
  "iframe",
2117
2372
  {
2118
2373
  src: iframeSrc,
@@ -2124,21 +2379,21 @@ function MapPanel({
2124
2379
  }
2125
2380
  ) });
2126
2381
  }
2127
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Stack, { gap: "md", children: [
2128
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
2129
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Stack, { gap: 4, children: [
2130
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Title, { order: 3, children: title }),
2131
- description ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Text, { size: "sm", c: "dimmed", children: description }) : null
2382
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { gap: "md", children: [
2383
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
2384
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { gap: 4, children: [
2385
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Title, { order: 3, children: title }),
2386
+ description ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Text, { size: "sm", c: "dimmed", children: description }) : null
2132
2387
  ] }),
2133
- actions ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(ActionBar, { ...actions }) : null
2388
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(ActionBar, { ...actions }) : null
2134
2389
  ] }),
2135
2390
  body
2136
2391
  ] }) });
2137
2392
  }
2138
2393
 
2139
2394
  // src/PublicFlowShell.tsx
2140
- var import_core34 = require("@mantine/core");
2141
- var import_jsx_runtime36 = require("react/jsx-runtime");
2395
+ var import_core35 = require("@mantine/core");
2396
+ var import_jsx_runtime37 = require("react/jsx-runtime");
2142
2397
  var stageTone = {
2143
2398
  idle: { label: "Idle", color: "gray" },
2144
2399
  loading: { label: "Loading", color: "blue" },
@@ -2190,7 +2445,7 @@ function PublicFlowShell({
2190
2445
  const actionBar = toActionBar(stage.actions);
2191
2446
  let body = stage.body;
2192
2447
  if (stage.status === "loading") {
2193
- body = /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2448
+ body = /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2194
2449
  StateBlock,
2195
2450
  {
2196
2451
  variant: "loading",
@@ -2199,7 +2454,7 @@ function PublicFlowShell({
2199
2454
  }
2200
2455
  );
2201
2456
  } else if (stage.status === "error") {
2202
- body = errorState ?? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2457
+ body = errorState ?? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2203
2458
  StateBlock,
2204
2459
  {
2205
2460
  variant: "error",
@@ -2208,7 +2463,7 @@ function PublicFlowShell({
2208
2463
  }
2209
2464
  );
2210
2465
  } else if (!stage.body && !hardwareSurface) {
2211
- body = emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2466
+ body = emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2212
2467
  EmptyState,
2213
2468
  {
2214
2469
  title: "No stage content available",
@@ -2216,29 +2471,29 @@ function PublicFlowShell({
2216
2471
  }
2217
2472
  );
2218
2473
  }
2219
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { gap: "lg", children: [
2220
- /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
2221
- /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { gap: 4, children: [
2222
- eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Text, { size: "xs", fw: 700, c: "dimmed", tt: "uppercase", children: eyebrow }) : null,
2223
- /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Group, { gap: "sm", wrap: "wrap", children: [
2224
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Title, { order: 2, children: stage.title }),
2225
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Badge, { variant: "light", color: tone.color, children: tone.label })
2474
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { gap: "lg", children: [
2475
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
2476
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { gap: 4, children: [
2477
+ eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Text, { size: "xs", fw: 700, c: "dimmed", tt: "uppercase", children: eyebrow }) : null,
2478
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Group, { gap: "sm", wrap: "wrap", children: [
2479
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Title, { order: 2, children: stage.title }),
2480
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Badge, { variant: "light", color: tone.color, children: tone.label })
2226
2481
  ] }),
2227
- stage.description ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Text, { size: "sm", c: "dimmed", children: stage.description }) : null
2482
+ stage.description ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Text, { size: "sm", c: "dimmed", children: stage.description }) : null
2228
2483
  ] }),
2229
2484
  exitAction
2230
2485
  ] }),
2231
- stage.notice ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Text, { size: "sm", c: "dimmed", children: stage.notice }) : null,
2486
+ stage.notice ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Text, { size: "sm", c: "dimmed", children: stage.notice }) : null,
2232
2487
  body,
2233
2488
  hardwareSurface,
2234
2489
  stage.aside,
2235
- actionBar ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(ActionBar, { ...actionBar }) : null
2490
+ actionBar ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(ActionBar, { ...actionBar }) : null
2236
2491
  ] }) });
2237
2492
  }
2238
2493
 
2239
2494
  // src/PlaybackSurface.tsx
2240
- var import_core35 = require("@mantine/core");
2241
- var import_jsx_runtime37 = require("react/jsx-runtime");
2495
+ var import_core36 = require("@mantine/core");
2496
+ var import_jsx_runtime38 = require("react/jsx-runtime");
2242
2497
  var stateTone = {
2243
2498
  loading: { label: "Loading", color: "blue" },
2244
2499
  ready: { label: "Ready", color: "teal" },
@@ -2261,7 +2516,7 @@ function PlaybackSurface({
2261
2516
  const tone = stateTone[state];
2262
2517
  let content;
2263
2518
  if (state === "loading") {
2264
- content = /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2519
+ content = /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2265
2520
  StateBlock,
2266
2521
  {
2267
2522
  variant: "loading",
@@ -2270,7 +2525,7 @@ function PlaybackSurface({
2270
2525
  }
2271
2526
  );
2272
2527
  } else if (state === "empty") {
2273
- content = emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2528
+ content = emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2274
2529
  EmptyState,
2275
2530
  {
2276
2531
  title: "No playback content available",
@@ -2278,7 +2533,7 @@ function PlaybackSurface({
2278
2533
  }
2279
2534
  );
2280
2535
  } else if (state === "error") {
2281
- content = errorState ?? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2536
+ content = errorState ?? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2282
2537
  StateBlock,
2283
2538
  {
2284
2539
  variant: "error",
@@ -2287,23 +2542,23 @@ function PlaybackSurface({
2287
2542
  }
2288
2543
  );
2289
2544
  } else {
2290
- content = /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { gap: "md", children: [
2545
+ content = /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core36.Stack, { gap: "md", children: [
2291
2546
  media,
2292
2547
  overlays
2293
2548
  ] });
2294
2549
  }
2295
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Paper, { withBorder: true, radius: "xl", p: "lg", "data-playback-mode": mode, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { gap: "md", children: [
2296
- title || statusMessage || controls ? /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
2297
- /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { gap: 4, children: [
2298
- title ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Title, { order: 3, children: title }) : null,
2299
- statusMessage ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Text, { size: "sm", c: "dimmed", children: statusMessage }) : null
2550
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Paper, { withBorder: true, radius: "xl", p: "lg", "data-playback-mode": mode, children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core36.Stack, { gap: "md", children: [
2551
+ title || statusMessage || controls ? /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core36.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
2552
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core36.Stack, { gap: 4, children: [
2553
+ title ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Title, { order: 3, children: title }) : null,
2554
+ statusMessage ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Text, { size: "sm", c: "dimmed", children: statusMessage }) : null
2300
2555
  ] }),
2301
- /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Group, { gap: "sm", align: "center", wrap: "wrap", children: [
2302
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Badge, { variant: "light", color: tone.color, children: tone.label }),
2556
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core36.Group, { gap: "sm", align: "center", wrap: "wrap", children: [
2557
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Badge, { variant: "light", color: tone.color, children: tone.label }),
2303
2558
  controls
2304
2559
  ] })
2305
2560
  ] }) : null,
2306
- state === "degraded" ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2561
+ state === "degraded" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2307
2562
  StateBlock,
2308
2563
  {
2309
2564
  variant: "info",
@@ -2317,28 +2572,35 @@ function PlaybackSurface({
2317
2572
  }
2318
2573
 
2319
2574
  // src/MediaField.tsx
2320
- var import_core37 = require("@mantine/core");
2575
+ var import_core38 = require("@mantine/core");
2321
2576
 
2322
2577
  // src/FormField.tsx
2323
- var import_core36 = require("@mantine/core");
2324
- var import_jsx_runtime38 = require("react/jsx-runtime");
2578
+ var import_core37 = require("@mantine/core");
2579
+ var import_jsx_runtime39 = require("react/jsx-runtime");
2325
2580
  function FormField({ label, description, error, children }) {
2326
- return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Box, { component: "label", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core36.Stack, { gap: 4, children: [
2327
- typeof label === "string" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Text, { size: "xs", fw: 600, c: "dimmed", children: label }) : label,
2328
- description ? typeof description === "string" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Text, { size: "xs", c: "dimmed", children: description }) : description : null,
2581
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Box, { component: "label", children: /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core37.Stack, { gap: 4, children: [
2582
+ typeof label === "string" ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Text, { size: "xs", fw: 600, c: "dimmed", children: label }) : label,
2583
+ description ? typeof description === "string" ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Text, { size: "xs", c: "dimmed", children: description }) : description : null,
2329
2584
  children,
2330
- error ? typeof error === "string" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Text, { size: "xs", c: "red.7", children: error }) : error : null
2585
+ error ? typeof error === "string" ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Text, { size: "xs", c: "red.7", children: error }) : error : null
2331
2586
  ] }) });
2332
2587
  }
2333
2588
 
2334
2589
  // src/MediaField.tsx
2335
- var import_jsx_runtime39 = require("react/jsx-runtime");
2590
+ var import_jsx_runtime40 = require("react/jsx-runtime");
2336
2591
  var stateLabels = {
2337
2592
  empty: { label: "Empty", color: "gray" },
2593
+ "drag-active": { label: "Drop to select", color: "violet" },
2338
2594
  selected: { label: "Selected", color: "blue" },
2595
+ "preview-loading": { label: "Preview loading", color: "violet" },
2339
2596
  saved: { label: "Saved", color: "teal" },
2340
2597
  invalid: { label: "Needs attention", color: "red" },
2341
- uploading: { label: "Uploading", color: "violet" }
2598
+ uploading: { label: "Uploading", color: "violet" },
2599
+ "upload-failed": { label: "Upload failed", color: "red" },
2600
+ "unsupported-type": { label: "Unsupported type", color: "red" },
2601
+ "too-large": { label: "Too large", color: "red" },
2602
+ removed: { label: "Removed", color: "gray" },
2603
+ readonly: { label: "Read only", color: "gray" }
2342
2604
  };
2343
2605
  function MediaField({
2344
2606
  label,
@@ -2351,41 +2613,60 @@ function MediaField({
2351
2613
  policyText,
2352
2614
  error,
2353
2615
  retryAction,
2616
+ replaceAction,
2354
2617
  onRemove,
2355
2618
  onReset,
2356
2619
  removeAction,
2357
2620
  resetAction,
2358
2621
  statusAction,
2622
+ acceptedTypes,
2623
+ maxSize,
2624
+ progress,
2625
+ readonly = false,
2359
2626
  state = "empty",
2360
2627
  mode = "stacked"
2361
2628
  }) {
2362
- const stateBadge = stateLabels[state];
2363
- const resolvedRemoveAction = removeAction ?? (onRemove ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Button, { type: "button", variant: "light", color: "red", onClick: onRemove, children: "Remove" }) : null);
2364
- const resolvedResetAction = resetAction ?? (onReset ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Button, { type: "button", variant: "default", onClick: onReset, children: "Reset" }) : null);
2365
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
2629
+ const resolvedState = readonly ? "readonly" : state;
2630
+ const stateBadge = stateLabels[resolvedState];
2631
+ const resolvedRemoveAction = removeAction ?? (!readonly && onRemove ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Button, { type: "button", variant: "light", color: "red", onClick: onRemove, children: "Remove" }) : null);
2632
+ const resolvedResetAction = resetAction ?? (!readonly && onReset ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Button, { type: "button", variant: "default", onClick: onReset, children: "Reset" }) : null);
2633
+ const boundedProgress = typeof progress === "number" ? Math.max(0, Math.min(100, progress)) : void 0;
2634
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
2366
2635
  FormField,
2367
2636
  {
2368
2637
  label,
2369
2638
  description,
2370
2639
  error,
2371
- children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core37.Stack, { gap: "md", children: [
2372
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Group, { justify: "flex-end", align: "center", gap: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core37.Group, { gap: "xs", justify: "flex-end", children: [
2373
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Badge, { variant: "light", color: stateBadge.color, children: stateBadge.label }),
2640
+ children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Stack, { gap: "md", children: [
2641
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Group, { justify: "flex-end", align: "center", gap: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Group, { gap: "xs", justify: "flex-end", children: [
2642
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Badge, { variant: "light", color: stateBadge.color, children: stateBadge.label }),
2374
2643
  statusAction
2375
2644
  ] }) }),
2376
2645
  preview ? preview : null,
2377
- uploadControl || urlInput ? /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_jsx_runtime39.Fragment, { children: [
2378
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Divider, {}),
2379
- /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core37.Stack, { gap: "sm", style: mode === "split" ? { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))" } : void 0, children: [
2646
+ typeof boundedProgress === "number" ? /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Stack, { gap: 4, children: [
2647
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Progress, { value: boundedProgress, "aria-label": "Upload progress" }),
2648
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Text, { size: "xs", c: "dimmed", children: [
2649
+ boundedProgress,
2650
+ "% complete"
2651
+ ] })
2652
+ ] }) : null,
2653
+ (uploadControl || urlInput) && !readonly ? /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_jsx_runtime40.Fragment, { children: [
2654
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Divider, {}),
2655
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Stack, { gap: "sm", style: mode === "split" ? { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))" } : void 0, children: [
2380
2656
  uploadControl,
2381
2657
  urlInput
2382
2658
  ] })
2383
2659
  ] }) : null,
2384
- value ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Text, { size: "sm", c: "dimmed", style: { wordBreak: "break-all" }, children: value }) : null,
2385
- helpText ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Text, { size: "sm", c: "dimmed", children: helpText }) : null,
2386
- policyText ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Text, { size: "sm", c: error ? "red.7" : "dimmed", children: policyText }) : null,
2660
+ value ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Text, { size: "sm", c: "dimmed", style: { wordBreak: "break-all" }, children: value }) : null,
2661
+ helpText ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Text, { size: "sm", c: "dimmed", children: helpText }) : null,
2662
+ acceptedTypes || maxSize ? /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Group, { gap: "xs", wrap: "wrap", children: [
2663
+ acceptedTypes ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Badge, { variant: "outline", color: "gray", children: acceptedTypes }) : null,
2664
+ maxSize ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Badge, { variant: "outline", color: "gray", children: maxSize }) : null
2665
+ ] }) : null,
2666
+ policyText ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Text, { size: "sm", c: error ? "red.7" : "dimmed", children: policyText }) : null,
2387
2667
  typeof error !== "string" && error ? error : null,
2388
- resolvedRemoveAction || resolvedResetAction ? /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core37.Group, { gap: "sm", children: [
2668
+ replaceAction || resolvedRemoveAction || resolvedResetAction || retryAction ? /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Group, { gap: "sm", children: [
2669
+ replaceAction,
2389
2670
  resolvedResetAction,
2390
2671
  retryAction,
2391
2672
  resolvedRemoveAction
@@ -2396,49 +2677,63 @@ function MediaField({
2396
2677
  }
2397
2678
 
2398
2679
  // src/MediaCard.tsx
2399
- var import_core38 = require("@mantine/core");
2400
- var import_jsx_runtime40 = require("react/jsx-runtime");
2680
+ var import_core39 = require("@mantine/core");
2681
+ var import_jsx_runtime41 = require("react/jsx-runtime");
2401
2682
  function MediaCard({ title, image, description, status, overlay, actions = [] }) {
2402
2683
  const EyeIcon = GdsIcons.Eye;
2403
- return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Card, { withBorder: true, radius: "lg", padding: "md", children: [
2404
- /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Card.Section, { pos: "relative", children: [
2684
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core39.Card, { withBorder: true, radius: "lg", padding: "md", children: [
2685
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core39.Card.Section, { pos: "relative", children: [
2405
2686
  image,
2406
- overlay ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { style: { position: "absolute", inset: 12, display: "flex", justifyContent: "flex-end", alignItems: "flex-start" }, children: overlay }) : null
2687
+ overlay ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)("div", { style: { position: "absolute", inset: 12, display: "flex", justifyContent: "flex-end", alignItems: "flex-start" }, children: overlay }) : null
2407
2688
  ] }),
2408
- /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Stack, { gap: "sm", mt: "md", children: [
2409
- /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Group, { justify: "space-between", align: "flex-start", children: [
2410
- /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Stack, { gap: 4, children: [
2411
- /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Title, { order: 4, children: title }),
2412
- description ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Text, { size: "sm", c: "dimmed", lineClamp: 2, children: description }) : null
2689
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core39.Stack, { gap: "sm", mt: "md", children: [
2690
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core39.Group, { justify: "space-between", align: "flex-start", children: [
2691
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core39.Stack, { gap: 4, children: [
2692
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Title, { order: 4, children: title }),
2693
+ description ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Text, { size: "sm", c: "dimmed", lineClamp: 2, children: description }) : null
2413
2694
  ] }),
2414
- status ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Badge, { variant: "light", children: status }) : null
2695
+ status ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Badge, { variant: "light", children: status }) : null
2415
2696
  ] }),
2416
- actions.length ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Group, { justify: "flex-end", gap: "xs", children: actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.ActionIcon, { variant: "light", "aria-label": action.label, onClick: action.onClick, children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(EyeIcon, { size: "1rem" }) }, action.label)) }) : null
2697
+ actions.length ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Group, { justify: "flex-end", gap: "xs", children: actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.ActionIcon, { variant: "light", "aria-label": action.label, onClick: action.onClick, children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(EyeIcon, { size: "1rem" }) }, action.label)) }) : null
2417
2698
  ] })
2418
2699
  ] });
2419
2700
  }
2420
2701
 
2421
2702
  // src/AccessSummary.tsx
2422
- var import_core39 = require("@mantine/core");
2423
- var import_jsx_runtime41 = require("react/jsx-runtime");
2424
- function AccessSummary({ title, roles, scope, blocked = false, description }) {
2425
- return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Card, { withBorder: true, radius: "lg", padding: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core39.Stack, { gap: "sm", children: [
2426
- /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core39.Group, { justify: "space-between", align: "center", children: [
2427
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Title, { order: 4, children: title }),
2428
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Badge, { color: blocked ? "red" : "teal", variant: "light", children: blocked ? "Blocked" : "Allowed" })
2703
+ var import_core40 = require("@mantine/core");
2704
+ var import_jsx_runtime42 = require("react/jsx-runtime");
2705
+ var accessStateMeta = {
2706
+ allowed: { label: "Allowed", color: "teal" },
2707
+ blocked: { label: "Blocked", color: "red" },
2708
+ forbidden: { label: "Forbidden", color: "red" },
2709
+ expired: { label: "Expired", color: "orange" },
2710
+ "permission-limited": { label: "Permission limited", color: "grape" }
2711
+ };
2712
+ function AccessSummary({ title, roles, scope, blocked = false, state, owner, recoveryHint, description }) {
2713
+ const resolvedState = state ?? (blocked ? "blocked" : "allowed");
2714
+ const meta = accessStateMeta[resolvedState];
2715
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Card, { withBorder: true, radius: "lg", padding: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core40.Stack, { gap: "sm", children: [
2716
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core40.Group, { justify: "space-between", align: "center", children: [
2717
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Title, { order: 4, children: title }),
2718
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Badge, { color: meta.color, variant: "light", children: meta.label })
2429
2719
  ] }),
2430
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Group, { gap: "xs", children: roles.map((role) => /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Badge, { variant: "outline", children: role }, role)) }),
2431
- scope ? /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core39.Text, { size: "sm", c: "dimmed", children: [
2720
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Group, { gap: "xs", children: roles.map((role) => /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Badge, { variant: "outline", children: role }, role)) }),
2721
+ scope ? /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core40.Text, { size: "sm", c: "dimmed", children: [
2432
2722
  "Scope: ",
2433
2723
  scope
2434
2724
  ] }) : null,
2435
- description ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Text, { size: "sm", children: description }) : null
2725
+ owner ? /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core40.Text, { size: "sm", c: "dimmed", children: [
2726
+ "Owner: ",
2727
+ owner
2728
+ ] }) : null,
2729
+ recoveryHint ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Text, { size: "sm", c: resolvedState === "allowed" ? "dimmed" : "red.7", children: recoveryHint }) : null,
2730
+ description ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Text, { size: "sm", children: description }) : null
2436
2731
  ] }) });
2437
2732
  }
2438
2733
 
2439
2734
  // src/PageHeader.tsx
2440
- var import_core40 = require("@mantine/core");
2441
- var import_jsx_runtime42 = require("react/jsx-runtime");
2735
+ var import_core41 = require("@mantine/core");
2736
+ var import_jsx_runtime43 = require("react/jsx-runtime");
2442
2737
  function PageHeader({
2443
2738
  title,
2444
2739
  description,
@@ -2449,19 +2744,19 @@ function PageHeader({
2449
2744
  }) {
2450
2745
  const resolvedDescription = description ?? subtitle;
2451
2746
  const eyebrowProps = eyebrowVariant === "ornamental" ? { tt: "uppercase", style: { letterSpacing: "0.12em" } } : {};
2452
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core40.Group, { justify: "space-between", align: "flex-start", gap: "lg", wrap: "wrap", children: [
2453
- /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core40.Stack, { gap: "xs", children: [
2454
- eyebrow && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Text, { size: "xs", fw: 700, c: "dimmed", ...eyebrowProps, children: eyebrow }),
2455
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Title, { order: 1, children: title }),
2456
- resolvedDescription && /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Text, { c: "dimmed", maw: 720, children: resolvedDescription })
2747
+ return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_core41.Group, { justify: "space-between", align: "flex-start", gap: "lg", wrap: "wrap", children: [
2748
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_core41.Stack, { gap: "xs", children: [
2749
+ eyebrow && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Text, { size: "xs", fw: 700, c: "dimmed", ...eyebrowProps, children: eyebrow }),
2750
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Title, { order: 1, children: title }),
2751
+ resolvedDescription && /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Text, { c: "dimmed", maw: 720, children: resolvedDescription })
2457
2752
  ] }),
2458
- actions ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Box, { children: actions }) : null
2753
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Box, { children: actions }) : null
2459
2754
  ] });
2460
2755
  }
2461
2756
 
2462
2757
  // src/FilterDrawer.tsx
2463
- var import_core41 = require("@mantine/core");
2464
- var import_jsx_runtime43 = require("react/jsx-runtime");
2758
+ var import_core42 = require("@mantine/core");
2759
+ var import_jsx_runtime44 = require("react/jsx-runtime");
2465
2760
  function FilterDrawer({
2466
2761
  opened,
2467
2762
  onClose,
@@ -2477,8 +2772,8 @@ function FilterDrawer({
2477
2772
  }) {
2478
2773
  const resolvedPrimaryAction = applyAction ?? primaryAction;
2479
2774
  const resolvedSecondaryAction = resetAction ?? secondaryAction;
2480
- return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
2481
- import_core41.Drawer,
2775
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
2776
+ import_core42.Drawer,
2482
2777
  {
2483
2778
  opened,
2484
2779
  onClose,
@@ -2486,11 +2781,11 @@ function FilterDrawer({
2486
2781
  position: mode === "bottom-sheet" ? "bottom" : "right",
2487
2782
  size: mode === "bottom-sheet" ? "auto" : "md",
2488
2783
  radius: mode === "bottom-sheet" ? "xl" : void 0,
2489
- children: /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_core41.Stack, { gap: "md", children: [
2490
- description ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Text, { size: "sm", c: "dimmed", children: description }) : null,
2784
+ children: /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_core42.Stack, { gap: "md", children: [
2785
+ description ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Text, { size: "sm", c: "dimmed", children: description }) : null,
2491
2786
  children,
2492
- resolvedPrimaryAction || resolvedSecondaryAction || closeAction ? /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_core41.Group, { justify: "space-between", mt: "md", children: [
2493
- /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_core41.Group, { gap: "sm", children: [
2787
+ resolvedPrimaryAction || resolvedSecondaryAction || closeAction ? /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_core42.Group, { justify: "space-between", mt: "md", children: [
2788
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_core42.Group, { gap: "sm", children: [
2494
2789
  closeAction,
2495
2790
  resolvedSecondaryAction
2496
2791
  ] }),
@@ -2502,8 +2797,8 @@ function FilterDrawer({
2502
2797
  }
2503
2798
 
2504
2799
  // src/PlaceholderPanel.tsx
2505
- var import_core42 = require("@mantine/core");
2506
- var import_jsx_runtime44 = require("react/jsx-runtime");
2800
+ var import_core43 = require("@mantine/core");
2801
+ var import_jsx_runtime45 = require("react/jsx-runtime");
2507
2802
  function PlaceholderPanel({
2508
2803
  title,
2509
2804
  description,
@@ -2513,16 +2808,16 @@ function PlaceholderPanel({
2513
2808
  mode
2514
2809
  }) {
2515
2810
  if (mode === "live" && children) {
2516
- return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_jsx_runtime44.Fragment, { children });
2811
+ return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_jsx_runtime45.Fragment, { children });
2517
2812
  }
2518
- return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Card, { children: /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_core42.Stack, { gap: "md", children: [
2519
- badge ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Badge, { variant: "light", color: "blue", w: "fit-content", children: badge }) : null,
2520
- /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_core42.Stack, { gap: "xs", children: [
2521
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Title, { order: 4, children: title }),
2522
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Text, { c: "dimmed", children: description })
2813
+ return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Card, { children: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_core43.Stack, { gap: "md", children: [
2814
+ badge ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Badge, { variant: "light", color: "blue", w: "fit-content", children: badge }) : null,
2815
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_core43.Stack, { gap: "xs", children: [
2816
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Title, { order: 4, children: title }),
2817
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Text, { c: "dimmed", children: description })
2523
2818
  ] }),
2524
- footer ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Text, { size: "sm", children: footer }) : null,
2525
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
2819
+ footer ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Text, { size: "sm", children: footer }) : null,
2820
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
2526
2821
  StateBlock,
2527
2822
  {
2528
2823
  variant: "not-enough-data",
@@ -2535,8 +2830,8 @@ function PlaceholderPanel({
2535
2830
  }
2536
2831
 
2537
2832
  // src/SimpleDataTable.tsx
2538
- var import_core43 = require("@mantine/core");
2539
- var import_jsx_runtime45 = require("react/jsx-runtime");
2833
+ var import_core44 = require("@mantine/core");
2834
+ var import_jsx_runtime46 = require("react/jsx-runtime");
2540
2835
  function SimpleDataTable({
2541
2836
  columns,
2542
2837
  rows,
@@ -2547,23 +2842,23 @@ function SimpleDataTable({
2547
2842
  getRowKey
2548
2843
  }) {
2549
2844
  if (error) {
2550
- return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(StateBlock, { variant: "error", title: "Unable to load data", description: error, compact: true });
2845
+ return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(StateBlock, { variant: "error", title: "Unable to load data", description: error, compact: true });
2551
2846
  }
2552
2847
  if (loading) {
2553
- return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(StateBlock, { variant: "loading", title: "Loading data", description: "Please wait while the shared dataset is prepared.", compact: true });
2848
+ return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(StateBlock, { variant: "loading", title: "Loading data", description: "Please wait while the shared dataset is prepared.", compact: true });
2554
2849
  }
2555
2850
  if (!rows.length) {
2556
- return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(StateBlock, { variant: "empty", title: emptyTitle, description: emptyDescription, compact: true });
2851
+ return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(StateBlock, { variant: "empty", title: emptyTitle, description: emptyDescription, compact: true });
2557
2852
  }
2558
- return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.ScrollArea, { children: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_core43.Table, { striped: true, highlightOnHover: true, withTableBorder: true, withColumnBorders: true, children: [
2559
- /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Table.Thead, { children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Table.Tr, { children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Table.Th, { children: column.header }, String(column.key))) }) }),
2560
- /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Table.Tbody, { children: rows.map((row, index) => /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Table.Tr, { children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Table.Td, { children: column.render ? column.render(row) : String(row[column.key] ?? "") }, String(column.key))) }, getRowKey ? getRowKey(row, index) : index)) })
2853
+ return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.ScrollArea, { children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_core44.Table, { striped: true, highlightOnHover: true, withTableBorder: true, withColumnBorders: true, children: [
2854
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.Table.Thead, { children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.Table.Tr, { children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.Table.Th, { children: column.header }, String(column.key))) }) }),
2855
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.Table.Tbody, { children: rows.map((row, index) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.Table.Tr, { children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.Table.Td, { children: column.render ? column.render(row) : String(row[column.key] ?? "") }, String(column.key))) }, getRowKey ? getRowKey(row, index) : index)) })
2561
2856
  ] }) });
2562
2857
  }
2563
2858
 
2564
2859
  // src/StatsSection.tsx
2565
- var import_core44 = require("@mantine/core");
2566
- var import_jsx_runtime46 = require("react/jsx-runtime");
2860
+ var import_core45 = require("@mantine/core");
2861
+ var import_jsx_runtime47 = require("react/jsx-runtime");
2567
2862
  function StatsSection({
2568
2863
  title,
2569
2864
  loading = false,
@@ -2575,11 +2870,11 @@ function StatsSection({
2575
2870
  }) {
2576
2871
  let content = children;
2577
2872
  if (error) {
2578
- content = /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(StateBlock, { variant: "error", title: "Unable to load statistics", description: error, compact: true });
2873
+ content = /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(StateBlock, { variant: "error", title: "Unable to load statistics", description: error, compact: true });
2579
2874
  } else if (loading) {
2580
- content = /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(StateBlock, { variant: "loading", title: "Loading statistics", description: "This shared data surface is still synchronizing.", compact: true });
2875
+ content = /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(StateBlock, { variant: "loading", title: "Loading statistics", description: "This shared data surface is still synchronizing.", compact: true });
2581
2876
  } else if (belowThreshold) {
2582
- content = /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
2877
+ content = /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
2583
2878
  StateBlock,
2584
2879
  {
2585
2880
  variant: "not-enough-data",
@@ -2589,14 +2884,210 @@ function StatsSection({
2589
2884
  }
2590
2885
  );
2591
2886
  } else if (placeholder) {
2592
- content = /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(PlaceholderPanel, { ...placeholder, mode: "placeholder" });
2887
+ content = /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(PlaceholderPanel, { ...placeholder, mode: "placeholder" });
2593
2888
  }
2594
- return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_core44.Stack, { gap: "md", children: [
2595
- /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.Title, { order: 3, children: title }),
2889
+ return /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(import_core45.Stack, { gap: "md", children: [
2890
+ /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core45.Title, { order: 3, children: title }),
2596
2891
  content
2597
2892
  ] });
2598
2893
  }
2599
2894
 
2895
+ // src/PeriodSelector.tsx
2896
+ var import_core46 = require("@mantine/core");
2897
+ var import_jsx_runtime48 = require("react/jsx-runtime");
2898
+ function PeriodSelector({
2899
+ label,
2900
+ description,
2901
+ value,
2902
+ options,
2903
+ onChange,
2904
+ timezone,
2905
+ scope,
2906
+ helperText,
2907
+ error,
2908
+ stale = false,
2909
+ filtered = false,
2910
+ disabled = false
2911
+ }) {
2912
+ const selectedOption = options.find((option) => option.value === value);
2913
+ return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(FormField, { label, description, error, children: /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(import_core46.Stack, { gap: "sm", children: [
2914
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
2915
+ "select",
2916
+ {
2917
+ "aria-label": typeof label === "string" ? label : "Reporting period",
2918
+ value,
2919
+ disabled,
2920
+ onChange: (event) => onChange?.(event.currentTarget.value),
2921
+ children: options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("option", { value: option.value, children: option.label }, option.value))
2922
+ }
2923
+ ),
2924
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(import_core46.Group, { gap: "xs", wrap: "wrap", children: [
2925
+ timezone ? /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(import_core46.Badge, { variant: "outline", color: "gray", children: [
2926
+ "Timezone: ",
2927
+ timezone
2928
+ ] }) : null,
2929
+ filtered ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_core46.Badge, { variant: "light", color: "blue", children: "Filtered" }) : null,
2930
+ stale ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_core46.Badge, { variant: "light", color: "orange", children: "Stale data" }) : null,
2931
+ scope ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_core46.Badge, { variant: "outline", color: "gray", children: scope }) : null
2932
+ ] }),
2933
+ selectedOption?.description ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_core46.Text, { size: "sm", c: "dimmed", children: selectedOption.description }) : null,
2934
+ helperText ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_core46.Text, { size: "sm", c: "dimmed", children: helperText }) : null
2935
+ ] }) });
2936
+ }
2937
+
2938
+ // src/EvidencePanel.tsx
2939
+ var import_core47 = require("@mantine/core");
2940
+ var import_jsx_runtime49 = require("react/jsx-runtime");
2941
+ var stateTone2 = {
2942
+ current: { label: "Current", color: "teal" },
2943
+ stale: { label: "Stale", color: "orange" },
2944
+ partial: { label: "Partial data", color: "yellow" },
2945
+ "permission-limited": { label: "Permission limited", color: "grape" },
2946
+ loading: { label: "Loading", color: "blue" },
2947
+ empty: { label: "No evidence", color: "gray" },
2948
+ error: { label: "Needs attention", color: "red" }
2949
+ };
2950
+ function EvidencePanel({
2951
+ title,
2952
+ description,
2953
+ source,
2954
+ freshness,
2955
+ confidence,
2956
+ state = "current",
2957
+ evidenceCount,
2958
+ permissionNote,
2959
+ retryAction,
2960
+ details,
2961
+ children
2962
+ }) {
2963
+ const tone = stateTone2[state];
2964
+ const isProblem = state === "error" || state === "permission-limited" || state === "stale" || state === "partial";
2965
+ return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_core47.Stack, { gap: "md", children: [
2966
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_core47.Group, { justify: "space-between", align: "flex-start", gap: "sm", children: [
2967
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_core47.Stack, { gap: 4, children: [
2968
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Title, { order: 4, children: title }),
2969
+ description ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Text, { size: "sm", c: "dimmed", children: description }) : null
2970
+ ] }),
2971
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Badge, { variant: "light", color: tone.color, children: tone.label })
2972
+ ] }),
2973
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_core47.Group, { gap: "xs", wrap: "wrap", children: [
2974
+ source ? /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_core47.Badge, { variant: "outline", color: "gray", children: [
2975
+ "Source: ",
2976
+ source
2977
+ ] }) : null,
2978
+ freshness ? /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_core47.Badge, { variant: "outline", color: "gray", children: [
2979
+ "Freshness: ",
2980
+ freshness
2981
+ ] }) : null,
2982
+ confidence ? /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_core47.Badge, { variant: "outline", color: "gray", children: [
2983
+ "Confidence: ",
2984
+ confidence
2985
+ ] }) : null,
2986
+ typeof evidenceCount === "number" ? /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_core47.Badge, { variant: "outline", color: "gray", children: [
2987
+ "Evidence: ",
2988
+ evidenceCount
2989
+ ] }) : null
2990
+ ] }),
2991
+ permissionNote ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Alert, { color: isProblem ? tone.color : "gray", variant: "light", children: permissionNote }) : null,
2992
+ details,
2993
+ children,
2994
+ retryAction
2995
+ ] }) });
2996
+ }
2997
+
2998
+ // src/ChartTokenPanel.tsx
2999
+ var import_core48 = require("@mantine/core");
3000
+ var import_jsx_runtime50 = require("react/jsx-runtime");
3001
+ function ChartTokenPanel({
3002
+ title,
3003
+ description,
3004
+ summary,
3005
+ state = "ready",
3006
+ legend = [],
3007
+ children,
3008
+ tableFallback,
3009
+ retryAction
3010
+ }) {
3011
+ if (state === "loading") {
3012
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(StateBlock, { variant: "loading", title: "Loading chart", description: summary, compact: true, action: retryAction });
3013
+ }
3014
+ if (state === "empty") {
3015
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(StateBlock, { variant: "empty", title: "No chart data", description: summary, compact: true, action: retryAction });
3016
+ }
3017
+ if (state === "below-threshold") {
3018
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(StateBlock, { variant: "not-enough-data", title: "Not enough data for chart", description: summary, compact: true, action: retryAction });
3019
+ }
3020
+ if (state === "error") {
3021
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(StateBlock, { variant: "error", title: "Unable to load chart", description: summary, compact: true, action: retryAction });
3022
+ }
3023
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core48.Stack, { gap: "md", children: [
3024
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core48.Group, { justify: "space-between", align: "flex-start", gap: "sm", children: [
3025
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core48.Stack, { gap: 4, children: [
3026
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Title, { order: 4, children: title }),
3027
+ description ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Text, { size: "sm", c: "dimmed", children: description }) : null
3028
+ ] }),
3029
+ state !== "ready" ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Badge, { variant: "light", color: state === "permission-limited" ? "grape" : "yellow", children: state.replace("-", " ") }) : null
3030
+ ] }),
3031
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Text, { size: "sm", children: summary }),
3032
+ legend.length ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Group, { gap: "xs", wrap: "wrap", "aria-label": "Chart legend", children: legend.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core48.Badge, { variant: "outline", color: "gray", title: typeof item.description === "string" ? item.description : void 0, children: [
3033
+ item.label,
3034
+ ": ",
3035
+ item.token
3036
+ ] }, `${String(item.label)}-${index}`)) }) : null,
3037
+ children,
3038
+ tableFallback ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core48.Stack, { gap: "xs", children: [
3039
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Text, { size: "sm", fw: 600, children: "Accessible data fallback" }),
3040
+ tableFallback
3041
+ ] }) : null
3042
+ ] }) });
3043
+ }
3044
+
3045
+ // src/ReportingSection.tsx
3046
+ var import_core49 = require("@mantine/core");
3047
+ var import_jsx_runtime51 = require("react/jsx-runtime");
3048
+ function ReportingSection({
3049
+ title,
3050
+ description,
3051
+ state = "ready",
3052
+ periodControl,
3053
+ evidence,
3054
+ metrics,
3055
+ chart,
3056
+ table,
3057
+ action,
3058
+ stateMessage,
3059
+ retryAction
3060
+ }) {
3061
+ let stateBlock = null;
3062
+ if (state === "loading") {
3063
+ stateBlock = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(StateBlock, { variant: "loading", title: "Loading report", description: stateMessage ?? "The reporting surface is synchronizing.", compact: true });
3064
+ } else if (state === "empty") {
3065
+ stateBlock = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(StateBlock, { variant: "empty", title: "No report data", description: stateMessage ?? "No records match this reporting scope yet.", compact: true });
3066
+ } else if (state === "error") {
3067
+ stateBlock = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(StateBlock, { variant: "error", title: "Unable to load report", description: stateMessage ?? "The report could not be prepared.", compact: true, action: retryAction });
3068
+ } else if (state === "below-threshold") {
3069
+ stateBlock = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(StateBlock, { variant: "not-enough-data", title: "Not enough data", description: stateMessage ?? "This report is hidden until the threshold is met.", compact: true });
3070
+ } else if (state === "permission-limited") {
3071
+ stateBlock = /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(StateBlock, { variant: "permission", title: "Permission-limited report", description: stateMessage ?? "Some evidence is hidden by access rules.", compact: true, action: retryAction });
3072
+ }
3073
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_core49.Stack, { gap: "lg", children: [
3074
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_core49.Group, { justify: "space-between", align: "flex-start", gap: "md", children: [
3075
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_core49.Stack, { gap: 4, children: [
3076
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Title, { order: 3, children: title }),
3077
+ description ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Text, { size: "sm", c: "dimmed", children: description }) : null
3078
+ ] }),
3079
+ action
3080
+ ] }),
3081
+ periodControl,
3082
+ (state === "partial" || state === "stale" || state === "filtered") && stateMessage ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(StateBlock, { variant: "info", title: state === "partial" ? "Partial report" : state === "stale" ? "Stale report" : "Filtered report", description: stateMessage, compact: true }) : null,
3083
+ stateBlock,
3084
+ metrics,
3085
+ chart,
3086
+ table,
3087
+ evidence
3088
+ ] }) });
3089
+ }
3090
+
2600
3091
  // src/locales/ar.ts
2601
3092
  var ar = {
2602
3093
  "gds.action.settings": "\u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A",
@@ -3906,6 +4397,7 @@ function getGdsMessages(locale) {
3906
4397
  ArticleShell,
3907
4398
  AuthShell,
3908
4399
  BrowseSurface,
4400
+ ChartTokenPanel,
3909
4401
  ChoiceChip,
3910
4402
  ConsumerDashboardGrid,
3911
4403
  ConsumerSection,
@@ -3916,6 +4408,7 @@ function getGdsMessages(locale) {
3916
4408
  EditorialCard,
3917
4409
  EditorialHero,
3918
4410
  EmptyState,
4411
+ EvidencePanel,
3919
4412
  FeatureBand,
3920
4413
  FilterDrawer,
3921
4414
  FoodMenuSection,
@@ -3927,11 +4420,15 @@ function getGdsMessages(locale) {
3927
4420
  MediaCard,
3928
4421
  MediaField,
3929
4422
  MetricCard,
4423
+ PROVIDER_IDENTITY_REGISTRY,
3930
4424
  PageHeader,
4425
+ PeriodSelector,
3931
4426
  PlaceholderPanel,
3932
4427
  PlaybackSurface,
3933
4428
  ProductCard,
3934
4429
  ProgressCard,
4430
+ ProviderIdentityButton,
4431
+ ProviderIdentityButtonGroup,
3935
4432
  PublicBrandFooter,
3936
4433
  PublicFlowShell,
3937
4434
  PublicFoodCard,
@@ -3942,6 +4439,7 @@ function getGdsMessages(locale) {
3942
4439
  ReferenceLinkGrid,
3943
4440
  ReferenceLocaleNotice,
3944
4441
  ReferenceSection,
4442
+ ReportingSection,
3945
4443
  SectionPanel,
3946
4444
  SimpleDataTable,
3947
4445
  SocialAuthButtons,
@@ -3956,13 +4454,18 @@ function getGdsMessages(locale) {
3956
4454
  fr,
3957
4455
  gdsLocales,
3958
4456
  getGdsMessages,
4457
+ getProviderIdentityLabel,
4458
+ getProviderIdentityPolicy,
3959
4459
  getSemanticActionConfig,
3960
4460
  getSemanticActionLabel,
4461
+ getSupportedProviderIdentityIds,
3961
4462
  he,
3962
4463
  hu,
4464
+ isPresentationMode,
3963
4465
  it,
3964
4466
  mergeGdsVocabularyPacks,
3965
4467
  resolveAccentPanelStyles,
3966
4468
  resolveSemanticActionConfig,
4469
+ resolveSurfacePresentationStyles,
3967
4470
  ru
3968
4471
  });