@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/index.js CHANGED
@@ -27,6 +27,7 @@ __export(index_exports, {
27
27
  ArticleShell: () => ArticleShell,
28
28
  AuthShell: () => AuthShell,
29
29
  BrowseSurface: () => BrowseSurface,
30
+ ChartTokenPanel: () => ChartTokenPanel,
30
31
  ChoiceChip: () => ChoiceChip,
31
32
  ConfirmDialog: () => ConfirmDialog,
32
33
  ConsumerDashboardGrid: () => ConsumerDashboardGrid,
@@ -37,9 +38,11 @@ __export(index_exports, {
37
38
  DiscoveryShell: () => DiscoveryShell,
38
39
  DocsCodeBlock: () => DocsCodeBlock,
39
40
  DocsPageShell: () => DocsPageShell,
41
+ DocsShell: () => DocsShell,
40
42
  EditorialCard: () => EditorialCard,
41
43
  EditorialHero: () => EditorialHero,
42
44
  EmptyState: () => EmptyState,
45
+ EvidencePanel: () => EvidencePanel,
43
46
  FeatureBand: () => FeatureBand,
44
47
  FilterDrawer: () => FilterDrawer,
45
48
  FoodMenuSection: () => FoodMenuSection,
@@ -52,11 +55,15 @@ __export(index_exports, {
52
55
  MediaCard: () => MediaCard,
53
56
  MediaField: () => MediaField,
54
57
  MetricCard: () => MetricCard,
58
+ PROVIDER_IDENTITY_REGISTRY: () => PROVIDER_IDENTITY_REGISTRY,
55
59
  PageHeader: () => PageHeader,
60
+ PeriodSelector: () => PeriodSelector,
56
61
  PlaceholderPanel: () => PlaceholderPanel,
57
62
  PlaybackSurface: () => PlaybackSurface,
58
63
  ProductCard: () => ProductCard,
59
64
  ProgressCard: () => ProgressCard,
65
+ ProviderIdentityButton: () => ProviderIdentityButton,
66
+ ProviderIdentityButtonGroup: () => ProviderIdentityButtonGroup,
60
67
  PublicBrandFooter: () => PublicBrandFooter,
61
68
  PublicFlowShell: () => PublicFlowShell,
62
69
  PublicFoodCard: () => PublicFoodCard,
@@ -68,6 +75,7 @@ __export(index_exports, {
68
75
  ReferenceLocaleNotice: () => ReferenceLocaleNotice,
69
76
  ReferenceSection: () => ReferenceSection,
70
77
  ReferenceThemeExplorer: () => ReferenceThemeExplorer,
78
+ ReportingSection: () => ReportingSection,
71
79
  SectionPanel: () => SectionPanel,
72
80
  SemanticButton: () => SemanticButton,
73
81
  ShareButtonGroup: () => ShareButtonGroup,
@@ -89,14 +97,19 @@ __export(index_exports, {
89
97
  fr: () => fr,
90
98
  gdsLocales: () => gdsLocales,
91
99
  getGdsMessages: () => getGdsMessages,
100
+ getProviderIdentityLabel: () => getProviderIdentityLabel,
101
+ getProviderIdentityPolicy: () => getProviderIdentityPolicy,
92
102
  getSemanticActionConfig: () => getSemanticActionConfig,
93
103
  getSemanticActionLabel: () => getSemanticActionLabel,
104
+ getSupportedProviderIdentityIds: () => getSupportedProviderIdentityIds,
94
105
  he: () => he,
95
106
  hu: () => hu,
107
+ isPresentationMode: () => isPresentationMode,
96
108
  it: () => it,
97
109
  mergeGdsVocabularyPacks: () => mergeGdsVocabularyPacks,
98
110
  resolveAccentPanelStyles: () => resolveAccentPanelStyles,
99
111
  resolveSemanticActionConfig: () => resolveSemanticActionConfig,
112
+ resolveSurfacePresentationStyles: () => resolveSurfacePresentationStyles,
100
113
  ru: () => ru
101
114
  });
102
115
  module.exports = __toCommonJS(index_exports);
@@ -574,6 +587,51 @@ var import_core9 = require("@mantine/core");
574
587
 
575
588
  // src/SectionPanel.tsx
576
589
  var import_core8 = require("@mantine/core");
590
+
591
+ // src/SurfacePresentation.ts
592
+ var toCssLength = (value) => {
593
+ if (typeof value === "number") {
594
+ return `${value}px`;
595
+ }
596
+ return value;
597
+ };
598
+ function resolveSurfacePresentationStyles(props) {
599
+ const {
600
+ presentation = "inline",
601
+ minHeight,
602
+ contentAlign,
603
+ contentJustify
604
+ } = props;
605
+ if (presentation === "inline") {
606
+ return {
607
+ minHeight: toCssLength(minHeight)
608
+ };
609
+ }
610
+ const align = contentAlign ?? "center";
611
+ const justify = contentJustify ?? (presentation === "centered" ? "center" : "start");
612
+ if (presentation === "fill") {
613
+ return {
614
+ minHeight: toCssLength(minHeight),
615
+ display: "flex",
616
+ flex: 1,
617
+ flexDirection: "column",
618
+ alignItems: align === "center" ? "center" : "flex-start",
619
+ justifyContent: justify === "center" ? "center" : "flex-start"
620
+ };
621
+ }
622
+ return {
623
+ minHeight: toCssLength(minHeight),
624
+ display: "flex",
625
+ flexDirection: "column",
626
+ alignItems: align === "center" ? "center" : "flex-start",
627
+ justifyContent: justify === "center" ? "center" : "flex-start"
628
+ };
629
+ }
630
+ function isPresentationMode(value) {
631
+ return value === "inline" || value === "centered" || value === "fill";
632
+ }
633
+
634
+ // src/SectionPanel.tsx
577
635
  var import_jsx_runtime9 = require("react/jsx-runtime");
578
636
  var toneBackgrounds = {
579
637
  default: "var(--mantine-color-body)",
@@ -588,8 +646,18 @@ function SectionPanel({
588
646
  children,
589
647
  tone = "default",
590
648
  id,
591
- divided = true
649
+ divided = true,
650
+ presentation = "inline",
651
+ minHeight,
652
+ contentAlign,
653
+ contentJustify
592
654
  }) {
655
+ const bodyLayout = resolveSurfacePresentationStyles({
656
+ presentation,
657
+ minHeight,
658
+ contentAlign,
659
+ contentJustify
660
+ });
593
661
  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: [
594
662
  title || description || action ? /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
595
663
  /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_core8.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
@@ -601,7 +669,7 @@ function SectionPanel({
601
669
  ] }),
602
670
  divided ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core8.Divider, {}) : null
603
671
  ] }) : null,
604
- children
672
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core8.Box, { style: bodyLayout, children })
605
673
  ] }) });
606
674
  }
607
675
 
@@ -829,20 +897,34 @@ function StateBlock({
829
897
  description,
830
898
  action,
831
899
  icon,
832
- compact = false
900
+ compact = false,
901
+ presentation = "inline",
902
+ minHeight,
903
+ contentAlign,
904
+ contentJustify
833
905
  }) {
834
906
  const config = variantConfig[variant];
907
+ const layout = resolveSurfacePresentationStyles({
908
+ presentation,
909
+ minHeight,
910
+ contentAlign,
911
+ contentJustify
912
+ });
913
+ const centeredText = presentation !== "inline" ? (contentAlign ?? "center") === "center" : !compact;
914
+ const centeredAlign = presentation !== "inline" ? contentAlign ?? "center" : "start";
915
+ const headingAlign = presentation === "inline" ? compact ? "flex-start" : "center" : centeredAlign === "center" ? "center" : "flex-start";
835
916
  return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
836
917
  import_core13.Stack,
837
918
  {
838
- align: compact ? "flex-start" : "center",
839
- justify: "center",
919
+ align: headingAlign,
920
+ justify: presentation === "inline" ? "center" : void 0,
840
921
  gap: "md",
841
922
  py: compact ? "md" : "xl",
842
- ta: compact ? "left" : "center",
923
+ ta: centeredText ? "center" : "left",
924
+ style: layout,
843
925
  children: [
844
926
  /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.ThemeIcon, { variant: "light", color: config.color, size: compact ? "lg" : "xl", radius: "xl", children: icon ?? config.icon }),
845
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_core13.Stack, { gap: 6, align: compact ? "flex-start" : "center", children: [
927
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_core13.Stack, { gap: 6, align: headingAlign, children: [
846
928
  /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Title, { order: compact ? 4 : 3, children: title }),
847
929
  description ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Text, { c: "dimmed", maw: compact ? void 0 : 480, children: description }) : null
848
930
  ] }),
@@ -855,42 +937,77 @@ function StateBlock({
855
937
  // src/ReferenceThemeExplorer.tsx
856
938
  var import_gds_theme3 = require("@doneisbetter/gds-theme");
857
939
  var import_jsx_runtime15 = require("react/jsx-runtime");
940
+ function resolvePreviewColorScheme(presetId, requestedScheme) {
941
+ if (presetId === "dark-public") {
942
+ return "dark";
943
+ }
944
+ return requestedScheme;
945
+ }
858
946
  var themePresetCatalog = {
859
947
  default: {
860
948
  label: "Default runtime theme",
861
949
  bestFor: "Balanced multi-surface products that need the baseline GDS system.",
862
950
  summary: "The default shared runtime lane for most adopters.",
863
- themeKey: "gdsTheme"
951
+ themeKey: "gdsTheme",
952
+ supportedUse: "Starter products, hybrid public/admin apps, and teams adopting all canonical contracts.",
953
+ avoidFor: "Avoid for products requiring a distinct editorial voice or guaranteed dark-first brand contrast."
864
954
  },
865
955
  "dark-public": {
866
956
  label: "Dark public theme",
867
957
  bestFor: "Dark-first public experiences and campaign-style landing surfaces.",
868
958
  summary: "A darker public presentation lane with the shipped runtime rhythm intact.",
869
- themeKey: "gdsDarkPublicTheme"
959
+ themeKey: "gdsDarkPublicTheme",
960
+ supportedUse: "Products with a deliberate dark visual baseline, low-light UX, or premium media-first surfaces.",
961
+ avoidFor: "Avoid when mixed mode and editorial readability are core requirements."
870
962
  },
871
963
  "flat-surface": {
872
964
  label: "Flat surface theme",
873
965
  bestFor: "Operational products that prefer quieter elevation and flatter surface contrast.",
874
966
  summary: "Removes some visual weight without creating a second token authority.",
875
- themeKey: "gdsFlatSurfaceTheme"
967
+ themeKey: "gdsFlatSurfaceTheme",
968
+ supportedUse: "Dashboards, admin surfaces, and dense content where elevation becomes distracting.",
969
+ avoidFor: "Avoid for brand-first storytelling or high-expressiveness hero-first pages."
876
970
  },
877
971
  editorial: {
878
972
  label: "Editorial serif theme",
879
973
  bestFor: "Documentation, editorial, and content-led experiences.",
880
974
  summary: "Adds a more expressive public reading tone while staying inside GDS contracts.",
881
- themeKey: "gdsEditorialPublicTheme"
975
+ themeKey: "gdsEditorialPublicTheme",
976
+ supportedUse: "Guides, docs, and catalog content where reading comfort matters more than impact.",
977
+ avoidFor: "Avoid for dense transactional or data-first workflows with strict minimal contrast."
882
978
  },
883
979
  brand: {
884
980
  label: "Brand theme generator",
885
981
  bestFor: "Consumer teams that need controlled brand expression without forking the system.",
886
982
  summary: "Composes the shipped helpers into a governed product-authored theme lane.",
887
- themeKey: "createPublicBrandTheme(...)"
983
+ themeKey: "createPublicBrandTheme(...)",
984
+ supportedUse: "Whitelisted public branding programs with narrow product-authored intent and policy guardrails.",
985
+ avoidFor: "Avoid for local style experiments or temporary visual fixes without compliance approval."
888
986
  }
889
987
  };
988
+ var colorSchemeProof = [
989
+ {
990
+ id: "light",
991
+ label: "Light",
992
+ description: "Validates readable default surfaces, controls, badges, and focus states against light backgrounds."
993
+ },
994
+ {
995
+ id: "dark",
996
+ label: "Dark",
997
+ description: "Validates contrast for public, operational, and feedback surfaces when dark mode is active."
998
+ },
999
+ {
1000
+ id: "auto",
1001
+ label: "Auto",
1002
+ description: "Documents the adopter path for OS-controlled schemes while keeping the provider contract unchanged."
1003
+ }
1004
+ ];
890
1005
  function ThemePreviewSurface({
891
1006
  preset,
892
- colorScheme
1007
+ colorScheme,
1008
+ requestedColorScheme
893
1009
  }) {
1010
+ const forcedScheme = requestedColorScheme && requestedColorScheme !== colorScheme;
894
1011
  return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: "lg", children: [
895
1012
  /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Group, { justify: "space-between", align: "flex-start", wrap: "wrap", children: [
896
1013
  /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: 4, children: [
@@ -905,7 +1022,12 @@ function ThemePreviewSurface({
905
1022
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("strong", { children: "Color scheme:" }),
906
1023
  " ",
907
1024
  colorScheme
908
- ] })
1025
+ ] }),
1026
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Text, { size: "sm", children: [
1027
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("strong", { children: "Accessibility proof:" }),
1028
+ " status uses text, badge label, and placement, not color alone."
1029
+ ] }),
1030
+ forcedScheme ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "sm", c: "dimmed", children: "This lane always previews in dark mode so the runtime stays inside its sanctioned contrast contract." }) : null
909
1031
  ] }),
910
1032
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ThemeToggle, {})
911
1033
  ] }),
@@ -934,7 +1056,8 @@ function ThemePreviewSurface({
934
1056
  description: "This preview uses the real shipped design-system runtime rather than a docs-only styling lane.",
935
1057
  metadata: [
936
1058
  { id: "runtime", label: "Runtime lane", value: preset.themeKey },
937
- { id: "scheme", label: "Color scheme", value: colorScheme }
1059
+ { id: "scheme", label: "Color scheme", value: colorScheme },
1060
+ { id: "focus", label: "A11y proof", value: "Keyboard + readable states" }
938
1061
  ],
939
1062
  primaryAction: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Button, { size: "sm", children: "Inspect route" })
940
1063
  }
@@ -972,8 +1095,10 @@ function ReferenceThemeExplorer() {
972
1095
  const comparisonSummary = themePresetCatalog[comparisonPreset];
973
1096
  const selectedTheme = (0, import_react2.useMemo)(() => resolveTheme(preset), [preset, brandPrimary, brandFlatSurfaces, brandEditorialSerif]);
974
1097
  const comparedTheme = (0, import_react2.useMemo)(() => resolveTheme(comparisonPreset), [comparisonPreset, brandPrimary, brandFlatSurfaces, brandEditorialSerif]);
975
- const previewKey = `${preset}-${colorScheme}-${brandPrimary}-${brandFlatSurfaces}-${brandEditorialSerif}`;
976
- const comparisonPreviewKey = `${comparisonPreset}-${colorScheme}-${brandPrimary}-${brandFlatSurfaces}-${brandEditorialSerif}`;
1098
+ const effectiveColorScheme = resolvePreviewColorScheme(preset, colorScheme);
1099
+ const effectiveComparisonScheme = resolvePreviewColorScheme(comparisonPreset, colorScheme);
1100
+ const previewKey = `${preset}-${effectiveColorScheme}-${brandPrimary}-${brandFlatSurfaces}-${brandEditorialSerif}`;
1101
+ const comparisonPreviewKey = `${comparisonPreset}-${effectiveComparisonScheme}-${brandPrimary}-${brandFlatSurfaces}-${brandEditorialSerif}`;
977
1102
  const reset = () => {
978
1103
  setPreset("default");
979
1104
  setColorScheme("light");
@@ -1049,7 +1174,7 @@ function ReferenceThemeExplorer() {
1049
1174
  ),
1050
1175
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "sm", c: "dimmed", children: "The generator composes shipped helpers instead of creating a second theme authority inside the website." })
1051
1176
  ] }) }),
1052
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: "md", children: [
1177
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: "md", role: "status", "aria-live": "polite", children: [
1053
1178
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Title, { order: 4, children: "Current selection summary" }),
1054
1179
  /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: 6, children: [
1055
1180
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { fw: 700, children: selectionSummary.label }),
@@ -1068,7 +1193,8 @@ function ReferenceThemeExplorer() {
1068
1193
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("strong", { children: "Color scheme:" }),
1069
1194
  " ",
1070
1195
  colorScheme
1071
- ] })
1196
+ ] }),
1197
+ preset === "dark-public" && colorScheme !== effectiveColorScheme ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "sm", c: "dimmed", children: "gdsDarkPublicTheme always renders in dark mode inside the live preview." }) : null
1072
1198
  ] }),
1073
1199
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1074
1200
  import_core14.Checkbox,
@@ -1101,18 +1227,47 @@ function ReferenceThemeExplorer() {
1101
1227
  children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.SimpleGrid, { cols: { base: 1, md: 2, xl: 5 }, spacing: "md", children: Object.values(themePresetCatalog).map((lane) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Paper, { withBorder: true, radius: "lg", p: "md", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: 6, children: [
1102
1228
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { fw: 700, size: "sm", children: lane.label }),
1103
1229
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "sm", c: "dimmed", children: lane.summary }),
1104
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Code, { block: true, fz: "10px", children: lane.themeKey })
1230
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Text, { size: "xs", children: [
1231
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("strong", { children: "Best for:" }),
1232
+ " ",
1233
+ lane.supportedUse
1234
+ ] }),
1235
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Code, { block: true, fz: "10px", children: lane.themeKey }),
1236
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Text, { size: "xs", c: "dimmed", children: [
1237
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("strong", { children: "Avoid for:" }),
1238
+ " ",
1239
+ lane.avoidFor ?? "No special exclusion noted for this lane."
1240
+ ] })
1105
1241
  ] }) }, lane.themeKey)) })
1106
1242
  }
1107
1243
  ),
1244
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1245
+ ReferenceSection,
1246
+ {
1247
+ title: "Light, dark, and auto proof",
1248
+ description: "Every official lane must remain usable across explicit light, explicit dark, and OS-controlled auto modes. The dark-public lane is intentionally forced to dark in preview to preserve its contrast contract.",
1249
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.SimpleGrid, { cols: { base: 1, md: 3 }, spacing: "md", children: colorSchemeProof.map((item) => /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Paper, { withBorder: true, radius: "lg", p: "md", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: 6, children: [
1250
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Badge, { variant: "light", color: item.id === "dark" ? "violet" : item.id === "auto" ? "teal" : "blue", w: "fit-content", children: item.label }),
1251
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "sm", children: item.description }),
1252
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "xs", c: "dimmed", children: "Required proof: semantic text, visible focus, and contrast-safe state treatment." })
1253
+ ] }) }, item.id)) })
1254
+ }
1255
+ ),
1108
1256
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1109
1257
  ReferenceSection,
1110
1258
  {
1111
1259
  title: "Live Theme Preview",
1112
1260
  description: "Visitors can test the shipped presets, compare lanes, and inspect actual GDS surfaces under each theme.",
1113
1261
  children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.SimpleGrid, { cols: { base: 1, xl: comparisonEnabled ? 2 : 1 }, spacing: "lg", children: [
1114
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_gds_theme3.GdsProvider, { theme: selectedTheme, defaultColorScheme: colorScheme, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ThemePreviewSurface, { preset: selectionSummary, colorScheme }) }, previewKey),
1115
- comparisonEnabled ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_gds_theme3.GdsProvider, { theme: comparedTheme, defaultColorScheme: colorScheme, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: "md", children: [
1262
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_gds_theme3.GdsProvider, { theme: selectedTheme, defaultColorScheme: effectiveColorScheme, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1263
+ ThemePreviewSurface,
1264
+ {
1265
+ preset: selectionSummary,
1266
+ colorScheme: effectiveColorScheme,
1267
+ requestedColorScheme: colorScheme
1268
+ }
1269
+ ) }, previewKey),
1270
+ comparisonEnabled ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_gds_theme3.GdsProvider, { theme: comparedTheme, defaultColorScheme: effectiveComparisonScheme, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: "md", children: [
1116
1271
  /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Group, { justify: "space-between", align: "flex-start", wrap: "wrap", children: [
1117
1272
  /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: 4, children: [
1118
1273
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { fw: 700, children: "Comparison Preview Surface" }),
@@ -1120,7 +1275,14 @@ function ReferenceThemeExplorer() {
1120
1275
  ] }),
1121
1276
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Badge, { color: "violet", variant: "light", children: comparisonSummary.label })
1122
1277
  ] }),
1123
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ThemePreviewSurface, { preset: comparisonSummary, colorScheme })
1278
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1279
+ ThemePreviewSurface,
1280
+ {
1281
+ preset: comparisonSummary,
1282
+ colorScheme: effectiveComparisonScheme,
1283
+ requestedColorScheme: colorScheme
1284
+ }
1285
+ )
1124
1286
  ] }) }) }, comparisonPreviewKey) : null
1125
1287
  ] })
1126
1288
  }
@@ -1128,18 +1290,34 @@ function ReferenceThemeExplorer() {
1128
1290
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1129
1291
  ReferenceSection,
1130
1292
  {
1131
- title: "Creator-Authored Experience Boundary",
1132
- description: "Creator-authored expression is allowed only through the sanctioned theme helpers and narrow exception process.",
1293
+ title: "Unsupported lane boundary",
1294
+ description: "Unsupported local theme lanes are blocked by policy and compliance because they create parallel design-system authority.",
1133
1295
  tone: "supporting",
1134
- children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1135
- StateBlock,
1136
- {
1137
- variant: "info",
1138
- title: "Shipped first, custom second",
1139
- description: "The official site uses shipped presets and the public brand generator first. Product-authored overrides must stay reviewable, testable, and scoped.",
1140
- compact: true
1141
- }
1142
- )
1296
+ children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: "md", children: [
1297
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1298
+ StateBlock,
1299
+ {
1300
+ variant: "permission",
1301
+ title: "Do not create local branding-layer helpers",
1302
+ description: "If a consumer needs brand expression, use createPublicBrandTheme(...). If a lane is missing, request it for GDS instead of building extendGdsTheme(...), createTheme(...), or mergeMantineTheme(...) ownership locally.",
1303
+ compact: true
1304
+ }
1305
+ ),
1306
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.SimpleGrid, { cols: { base: 1, md: 2 }, spacing: "md", children: [
1307
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Paper, { withBorder: true, radius: "lg", p: "md", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: 6, children: [
1308
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { fw: 700, size: "sm", children: "Approved remediation" }),
1309
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Code, { block: true, children: [
1310
+ "createPublicBrandTheme(",
1311
+ `{ flatSurfaces: true, overrides: { primaryColor: 'blue' } }`,
1312
+ ")"
1313
+ ] })
1314
+ ] }) }),
1315
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Paper, { withBorder: true, radius: "lg", p: "md", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: 6, children: [
1316
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { fw: 700, size: "sm", children: "Prohibited ownership" }),
1317
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Code, { block: true, children: "extendGdsTheme(...) / createTheme(...) / mergeMantineTheme(...)" })
1318
+ ] }) })
1319
+ ] })
1320
+ ] })
1143
1321
  }
1144
1322
  )
1145
1323
  ] });
@@ -2105,21 +2283,97 @@ function DiscoveryShell({
2105
2283
  );
2106
2284
  }
2107
2285
 
2108
- // src/SidebarNav.tsx
2286
+ // src/DocsShell.tsx
2109
2287
  var import_react5 = require("react");
2110
2288
  var import_core31 = require("@mantine/core");
2111
- var import_gds_theme4 = require("@doneisbetter/gds-theme");
2112
2289
  var import_jsx_runtime33 = require("react/jsx-runtime");
2290
+ function DocsShellSidebar({ primaryNavigation, secondaryNavigation }) {
2291
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Stack, { gap: "md", h: "100%", children: [
2292
+ primaryNavigation ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Stack, { gap: "xs", children: [
2293
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Text, { size: "xs", fw: 700, c: "dimmed", children: "Primary" }),
2294
+ primaryNavigation
2295
+ ] }) : null,
2296
+ secondaryNavigation ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_jsx_runtime33.Fragment, { children: [
2297
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Divider, {}),
2298
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Stack, { gap: "xs", children: [
2299
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Text, { size: "xs", fw: 700, c: "dimmed", children: "More" }),
2300
+ secondaryNavigation
2301
+ ] })
2302
+ ] }) : null
2303
+ ] });
2304
+ }
2305
+ function resolveContentContainerSize(value) {
2306
+ if (value === "full") {
2307
+ return "100%";
2308
+ }
2309
+ return value ?? "lg";
2310
+ }
2311
+ function DocsShell({
2312
+ brand,
2313
+ primaryNavigation,
2314
+ secondaryNavigation,
2315
+ headerContext,
2316
+ actions,
2317
+ mobileNavigation,
2318
+ mobileNavigationMode = "drawer",
2319
+ footer,
2320
+ children,
2321
+ contentWidth = "full"
2322
+ }) {
2323
+ const [mobileNavOpen, setMobileNavOpen] = (0, import_react5.useState)(false);
2324
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2325
+ DiscoveryShell,
2326
+ {
2327
+ header: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Group, { h: "100%", justify: "space-between", align: "center", wrap: "nowrap", gap: "md", children: [
2328
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Group, { gap: "sm", align: "center", wrap: "nowrap", style: { minWidth: 0 }, children: [
2329
+ mobileNavigationMode === "inline-collapse" && mobileNavigation ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_jsx_runtime33.Fragment, { children: [
2330
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2331
+ import_core31.Burger,
2332
+ {
2333
+ opened: mobileNavOpen,
2334
+ onClick: () => setMobileNavOpen((value) => !value),
2335
+ hiddenFrom: "sm",
2336
+ size: "sm",
2337
+ "aria-label": "Toggle docs navigation"
2338
+ }
2339
+ ),
2340
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Transition, { mounted: mobileNavOpen, transition: "pop", duration: 120, children: (styles) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Box, { style: styles, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Box, { mt: "xs", p: "sm", style: { borderRadius: 8, border: "1px solid var(--mantine-color-default-border)" }, children: mobileNavigation }) }) })
2341
+ ] }) : null,
2342
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Box, { style: { minWidth: 0 }, children: brand }),
2343
+ headerContext ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Text, { size: "sm", c: "dimmed", lineClamp: 1, children: headerContext }) : null
2344
+ ] }),
2345
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Group, { gap: "sm", wrap: "nowrap", style: { minWidth: 0 }, children: actions })
2346
+ ] }),
2347
+ sidebar: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2348
+ DocsShellSidebar,
2349
+ {
2350
+ primaryNavigation,
2351
+ secondaryNavigation
2352
+ }
2353
+ ),
2354
+ footer,
2355
+ mobileNavigationLabel: "Open docs navigation",
2356
+ headerHeight: 72,
2357
+ children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Container, { size: resolveContentContainerSize(contentWidth), px: "md", py: "lg", w: "100%", children })
2358
+ }
2359
+ );
2360
+ }
2361
+
2362
+ // src/SidebarNav.tsx
2363
+ var import_react6 = require("react");
2364
+ var import_core32 = require("@mantine/core");
2365
+ var import_gds_theme4 = require("@doneisbetter/gds-theme");
2366
+ var import_jsx_runtime34 = require("react/jsx-runtime");
2113
2367
  function SidebarNav({ children, ariaLabel = "Primary navigation", gap = "md" }) {
2114
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Stack, { component: "nav", "aria-label": ariaLabel, gap, h: "100%", children });
2368
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Stack, { component: "nav", "aria-label": ariaLabel, gap, h: "100%", children });
2115
2369
  }
2116
2370
  function SidebarNavSection({ label, children, pushToBottom = false }) {
2117
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core31.Stack, { gap: "xs", mt: pushToBottom ? "auto" : void 0, children: [
2118
- label ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Text, { size: "xs", fw: 700, c: "dimmed", children: label }) : null,
2119
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Stack, { gap: 4, children })
2371
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core32.Stack, { gap: "xs", mt: pushToBottom ? "auto" : void 0, children: [
2372
+ label ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Text, { size: "xs", fw: 700, c: "dimmed", children: label }) : null,
2373
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Stack, { gap: 4, children })
2120
2374
  ] });
2121
2375
  }
2122
- var _SidebarNavItem = (0, import_react5.forwardRef)(
2376
+ var _SidebarNavItem = (0, import_react6.forwardRef)(
2123
2377
  ({
2124
2378
  action,
2125
2379
  label,
@@ -2135,14 +2389,14 @@ var _SidebarNavItem = (0, import_react5.forwardRef)(
2135
2389
  const config = action ? resolveSemanticActionConfig(action, vocabularyPacks) : null;
2136
2390
  const Icon = config?.icon;
2137
2391
  const resolvedLabel = label ?? (action ? getSemanticActionLabel(action, t, vocabularyPacks) : void 0);
2138
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2139
- import_core31.NavLink,
2392
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
2393
+ import_core32.NavLink,
2140
2394
  {
2141
2395
  ref,
2142
2396
  label: resolvedLabel,
2143
2397
  description,
2144
- leftSection: icon ?? (Icon ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(Icon, { size: "1rem", stroke: 1.5 }) : void 0),
2145
- rightSection: badge ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core31.Box, { children: badge }) : props.rightSection,
2398
+ leftSection: icon ?? (Icon ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(Icon, { size: "1rem", stroke: 1.5 }) : void 0),
2399
+ rightSection: badge ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Box, { children: badge }) : props.rightSection,
2146
2400
  "aria-label": ariaLabel ?? (typeof resolvedLabel === "string" ? resolvedLabel : void 0),
2147
2401
  "aria-current": props.active ? "page" : ariaCurrent,
2148
2402
  ...props
@@ -2150,21 +2404,21 @@ var _SidebarNavItem = (0, import_react5.forwardRef)(
2150
2404
  );
2151
2405
  }
2152
2406
  );
2153
- var SidebarNavItem = (0, import_core31.createPolymorphicComponent)(_SidebarNavItem);
2407
+ var SidebarNavItem = (0, import_core32.createPolymorphicComponent)(_SidebarNavItem);
2154
2408
 
2155
2409
  // src/PublicSiteFooter.tsx
2156
- var import_core32 = require("@mantine/core");
2157
- var import_jsx_runtime34 = require("react/jsx-runtime");
2410
+ var import_core33 = require("@mantine/core");
2411
+ var import_jsx_runtime35 = require("react/jsx-runtime");
2158
2412
  function PublicSiteFooter({ children, meta }) {
2159
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core32.Stack, { component: "footer", gap: "xs", children: [
2160
- children ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Text, { size: "sm", children }) : null,
2161
- meta ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Group, { gap: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core32.Text, { size: "xs", c: "dimmed", children: meta }) }) : null
2413
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Stack, { component: "footer", gap: "xs", children: [
2414
+ children ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Text, { size: "sm", children }) : null,
2415
+ meta ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Group, { gap: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Text, { size: "xs", c: "dimmed", children: meta }) }) : null
2162
2416
  ] });
2163
2417
  }
2164
2418
 
2165
2419
  // src/PublicBrandFooter.tsx
2166
- var import_core33 = require("@mantine/core");
2167
- var import_jsx_runtime35 = require("react/jsx-runtime");
2420
+ var import_core34 = require("@mantine/core");
2421
+ var import_jsx_runtime36 = require("react/jsx-runtime");
2168
2422
  function PublicBrandFooter({
2169
2423
  media,
2170
2424
  brandTitle,
@@ -2179,8 +2433,8 @@ function PublicBrandFooter({
2179
2433
  const mediaSpan = layoutVariant === "immersive-media" ? 5 : 4;
2180
2434
  const primarySpan = media ? layoutVariant === "balanced-quote" ? 4 : 4 : secondary ? 6 : 12;
2181
2435
  const secondarySpan = media ? Math.max(3, 12 - mediaSpan - primarySpan) : Math.max(4, 12 - primarySpan);
2182
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
2183
- import_core33.Paper,
2436
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2437
+ import_core34.Paper,
2184
2438
  {
2185
2439
  component: "footer",
2186
2440
  withBorder: true,
@@ -2188,19 +2442,19 @@ function PublicBrandFooter({
2188
2442
  p: compact ? "lg" : "xl",
2189
2443
  className: classNames?.root,
2190
2444
  "data-layout-variant": layoutVariant,
2191
- children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Stack, { gap: "lg", children: [
2192
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Grid, { gutter: compact ? "lg" : "xl", align: "flex-start", children: [
2193
- media ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Grid.Col, { span: { base: 12, md: mediaSpan }, children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Box, { className: classNames?.media, children: media }) }) : null,
2194
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Grid.Col, { span: { base: 12, md: primarySpan }, children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core33.Stack, { gap: compact ? "xs" : "sm", className: classNames?.primary, children: [
2195
- brandTitle ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Title, { order: 4, children: brandTitle }) : null,
2196
- description ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Text, { c: "dimmed", children: description }) : null,
2197
- actions ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Box, { children: actions }) : null
2445
+ children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { gap: "lg", children: [
2446
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Grid, { gutter: compact ? "lg" : "xl", align: "flex-start", children: [
2447
+ media ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Grid.Col, { span: { base: 12, md: mediaSpan }, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Box, { className: classNames?.media, children: media }) }) : null,
2448
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Grid.Col, { span: { base: 12, md: primarySpan }, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { gap: compact ? "xs" : "sm", className: classNames?.primary, children: [
2449
+ brandTitle ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Title, { order: 4, children: brandTitle }) : null,
2450
+ description ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Text, { c: "dimmed", children: description }) : null,
2451
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Box, { children: actions }) : null
2198
2452
  ] }) }),
2199
- secondary ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Grid.Col, { span: { base: 12, md: secondarySpan }, children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Stack, { gap: compact ? "xs" : "sm", className: classNames?.secondary, children: secondary }) }) : null
2453
+ secondary ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Grid.Col, { span: { base: 12, md: secondarySpan }, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Stack, { gap: compact ? "xs" : "sm", className: classNames?.secondary, children: secondary }) }) : null
2200
2454
  ] }),
2201
- legal ? /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_jsx_runtime35.Fragment, { children: [
2202
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Divider, {}),
2203
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Group, { justify: "space-between", gap: "sm", wrap: "wrap", className: classNames?.legal, children: typeof legal === "string" ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core33.Text, { size: "sm", c: "dimmed", children: legal }) : legal })
2455
+ legal ? /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_jsx_runtime36.Fragment, { children: [
2456
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Divider, {}),
2457
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Group, { justify: "space-between", gap: "sm", wrap: "wrap", className: classNames?.legal, children: typeof legal === "string" ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Text, { size: "sm", c: "dimmed", children: legal }) : legal })
2204
2458
  ] }) : null
2205
2459
  ] })
2206
2460
  }
@@ -2208,78 +2462,239 @@ function PublicBrandFooter({
2208
2462
  }
2209
2463
 
2210
2464
  // src/AuthShell.tsx
2211
- var import_core34 = require("@mantine/core");
2212
- var import_jsx_runtime36 = require("react/jsx-runtime");
2465
+ var import_core35 = require("@mantine/core");
2466
+ var import_jsx_runtime37 = require("react/jsx-runtime");
2213
2467
  function AuthShell({
2214
2468
  title,
2215
2469
  description,
2470
+ intent = "sign-in",
2216
2471
  brand,
2217
2472
  headerActions,
2218
2473
  footer,
2219
2474
  helper,
2475
+ error,
2476
+ guestAction,
2477
+ supportAction,
2220
2478
  socialAuth,
2221
2479
  dividerLabel = "Or continue with your account",
2222
2480
  children
2223
2481
  }) {
2224
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Box, { py: { base: "xl", md: "4rem" }, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Container, { size: "xs", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { gap: "xl", children: [
2225
- brand || headerActions ? /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Group, { justify: brand && headerActions ? "space-between" : "center", align: "center", children: [
2226
- brand ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Box, { children: brand }) : /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Box, {}),
2227
- headerActions ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Group, { gap: "sm", children: headerActions }) : null
2482
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Box, { py: { base: "xl", md: "4rem" }, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Container, { size: "xs", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { gap: "xl", children: [
2483
+ brand || headerActions ? /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Group, { justify: brand && headerActions ? "space-between" : "center", align: "center", children: [
2484
+ brand ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Box, { children: brand }) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Box, {}),
2485
+ headerActions ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Group, { gap: "sm", children: headerActions }) : null
2228
2486
  ] }) : null,
2229
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Card, { withBorder: true, radius: "lg", padding: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { gap: "lg", children: [
2230
- /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core34.Stack, { gap: "xs", ta: "center", children: [
2231
- /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Title, { order: 2, children: title }),
2232
- description ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Text, { c: "dimmed", size: "sm", children: description }) : null
2487
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Card, { withBorder: true, radius: "lg", padding: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { gap: "lg", children: [
2488
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { gap: "xs", ta: "center", children: [
2489
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Group, { justify: "center", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Badge, { variant: "light", color: intent === "account-linking" ? "blue" : intent === "guest-entry" ? "gray" : "teal", children: intent.replace("-", " ") }) }),
2490
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Title, { order: 2, children: title }),
2491
+ description ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Text, { c: "dimmed", size: "sm", children: description }) : null
2233
2492
  ] }),
2234
- socialAuth ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Box, { children: socialAuth }) : null,
2235
- socialAuth ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Divider, { label: dividerLabel, labelPosition: "center" }) : null,
2493
+ error ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Alert, { color: "red", variant: "light", role: "alert", children: error }) : null,
2494
+ socialAuth ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Box, { children: socialAuth }) : null,
2495
+ socialAuth ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Divider, { label: dividerLabel, labelPosition: "center" }) : null,
2236
2496
  children,
2237
- helper ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Text, { size: "sm", c: "dimmed", ta: "center", children: helper }) : null
2497
+ guestAction || supportAction ? /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Group, { justify: "center", gap: "sm", children: [
2498
+ guestAction,
2499
+ supportAction
2500
+ ] }) : null,
2501
+ helper ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Text, { size: "sm", c: "dimmed", ta: "center", children: helper }) : null
2238
2502
  ] }) }),
2239
- footer ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core34.Text, { size: "sm", c: "dimmed", ta: "center", children: footer }) : null
2503
+ footer ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Text, { size: "sm", c: "dimmed", ta: "center", children: footer }) : null
2240
2504
  ] }) }) });
2241
2505
  }
2242
2506
 
2243
2507
  // src/SocialAuthButtons.tsx
2244
- var import_core35 = require("@mantine/core");
2245
- var import_jsx_runtime37 = require("react/jsx-runtime");
2246
- var providerConfig = {
2247
- google: { label: "Google", mark: "G", color: "red" },
2248
- apple: { label: "Apple", mark: "A", color: "dark" },
2249
- github: { label: "GitHub", mark: "GH", color: "gray" },
2250
- facebook: { label: "Facebook", mark: "F", color: "blue" },
2251
- microsoft: { label: "Microsoft", mark: "M", color: "cyan" },
2252
- linkedin: { label: "LinkedIn", mark: "in", color: "blue" },
2253
- discord: { label: "Discord", mark: "D", color: "indigo" },
2254
- x: { label: "X", mark: "X", color: "dark" },
2255
- email: { label: "Email", mark: "@", color: "gray" }
2508
+ var import_core37 = require("@mantine/core");
2509
+
2510
+ // src/ProviderIdentityButtons.tsx
2511
+ var import_core36 = require("@mantine/core");
2512
+ var import_jsx_runtime38 = require("react/jsx-runtime");
2513
+ var PROVIDER_IDENTITY_REGISTRY = {
2514
+ google: {
2515
+ providerLabel: "Google",
2516
+ markLabel: "G",
2517
+ brandColor: "red"
2518
+ },
2519
+ apple: {
2520
+ providerLabel: "Apple",
2521
+ markLabel: "A",
2522
+ brandColor: "dark"
2523
+ },
2524
+ github: {
2525
+ providerLabel: "GitHub",
2526
+ markLabel: "GH",
2527
+ brandColor: "gray"
2528
+ },
2529
+ facebook: {
2530
+ providerLabel: "Facebook",
2531
+ markLabel: "F",
2532
+ brandColor: "blue"
2533
+ },
2534
+ microsoft: {
2535
+ providerLabel: "Microsoft",
2536
+ markLabel: "M",
2537
+ brandColor: "cyan"
2538
+ },
2539
+ linkedin: {
2540
+ providerLabel: "LinkedIn",
2541
+ markLabel: "in",
2542
+ brandColor: "blue"
2543
+ },
2544
+ discord: {
2545
+ providerLabel: "Discord",
2546
+ markLabel: "D",
2547
+ brandColor: "indigo"
2548
+ },
2549
+ x: {
2550
+ providerLabel: "X",
2551
+ markLabel: "X",
2552
+ brandColor: "dark"
2553
+ },
2554
+ email: {
2555
+ providerLabel: "Email",
2556
+ markLabel: "@",
2557
+ brandColor: "gray"
2558
+ }
2256
2559
  };
2257
- function ProviderMark({ id }) {
2258
- const config = providerConfig[id] ?? { label: id, mark: id.slice(0, 2).toUpperCase(), color: "gray" };
2259
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.ThemeIcon, { variant: "light", color: config.color, radius: "xl", size: "md", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Text, { size: "xs", fw: 700, children: config.mark }) });
2560
+ function normalizeProviderId(provider) {
2561
+ return (provider ?? "").trim().toLowerCase();
2562
+ }
2563
+ function isSupportedProviderId(provider) {
2564
+ return provider in PROVIDER_IDENTITY_REGISTRY;
2565
+ }
2566
+ function getProviderIdentityMeta(provider) {
2567
+ const normalized = normalizeProviderId(provider);
2568
+ if (isSupportedProviderId(normalized)) {
2569
+ return {
2570
+ id: normalized,
2571
+ supported: true,
2572
+ ...PROVIDER_IDENTITY_REGISTRY[normalized]
2573
+ };
2574
+ }
2575
+ return {
2576
+ id: normalized || "provider",
2577
+ supported: false,
2578
+ providerLabel: provider ? provider : "Provider",
2579
+ markLabel: (provider ?? "PR").slice(0, 2).toUpperCase(),
2580
+ brandColor: "gray"
2581
+ };
2582
+ }
2583
+ function resolveProviderLabel(provider, customLabel) {
2584
+ const meta = getProviderIdentityMeta(provider);
2585
+ if (customLabel != null) {
2586
+ return customLabel;
2587
+ }
2588
+ return `Continue with ${meta.providerLabel}`;
2260
2589
  }
2261
- function SocialAuthButton({ provider, compact = false }) {
2262
- const config = providerConfig[provider.id] ?? { label: provider.id, mark: provider.id.slice(0, 2).toUpperCase(), color: "gray" };
2263
- const label = provider.label ?? `Continue with ${config.label}`;
2264
- const buttonProps = provider.href ? { component: "a", href: provider.href } : { onClick: provider.onClick };
2265
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2266
- import_core35.Button,
2590
+ function mapVariant(variant = "neutral") {
2591
+ if (variant === "solid") {
2592
+ return "filled";
2593
+ }
2594
+ if (variant === "outline") {
2595
+ return "outline";
2596
+ }
2597
+ return "default";
2598
+ }
2599
+ function getProviderIdentityLabel(provider, fallbackOverride) {
2600
+ return resolveProviderLabel(provider, fallbackOverride);
2601
+ }
2602
+ function getSupportedProviderIdentityIds() {
2603
+ return Object.keys(PROVIDER_IDENTITY_REGISTRY);
2604
+ }
2605
+ function getProviderIdentityPolicy(provider) {
2606
+ const meta = getProviderIdentityMeta(provider);
2607
+ return {
2608
+ id: meta.id,
2609
+ supported: meta.supported,
2610
+ providerLabel: meta.providerLabel,
2611
+ colorAuthority: meta.supported ? "provider" : "gds-neutral",
2612
+ minTouchTargetPx: 44,
2613
+ allowedVariants: ["solid", "outline", "neutral"]
2614
+ };
2615
+ }
2616
+ function ProviderIdentityMark({ provider }) {
2617
+ const meta = getProviderIdentityMeta(provider);
2618
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2619
+ import_core36.ThemeIcon,
2267
2620
  {
2268
- variant: "default",
2621
+ variant: "light",
2622
+ color: meta.brandColor,
2623
+ radius: "xl",
2624
+ size: "md",
2625
+ "aria-hidden": "true",
2626
+ children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Text, { size: "xs", fw: 700, c: "inherit", children: meta.markLabel })
2627
+ }
2628
+ );
2629
+ }
2630
+ function ProviderIdentityButton({
2631
+ provider,
2632
+ label,
2633
+ description,
2634
+ policyNote,
2635
+ error,
2636
+ href,
2637
+ onClick,
2638
+ disabled,
2639
+ loading,
2640
+ tenantDisabledReason,
2641
+ fullWidth = true,
2642
+ size = "md",
2643
+ variant = "neutral",
2644
+ ariaLabel,
2645
+ describedBy,
2646
+ minTouchTargetPx = 44
2647
+ }) {
2648
+ const meta = getProviderIdentityMeta(provider);
2649
+ const buttonLabel = resolveProviderLabel(provider, label);
2650
+ const resolvedDisabled = disabled || Boolean(tenantDisabledReason);
2651
+ const buttonProps = href ? {
2652
+ component: "a",
2653
+ href
2654
+ } : {
2655
+ onClick
2656
+ };
2657
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2658
+ import_core36.Button,
2659
+ {
2660
+ variant: mapVariant(variant),
2661
+ color: variant === "solid" ? meta.brandColor : void 0,
2269
2662
  justify: "space-between",
2270
- fullWidth: true,
2271
- size: compact ? "sm" : "md",
2272
- leftSection: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(ProviderMark, { id: provider.id }),
2273
- disabled: provider.disabled,
2274
- loading: provider.loading,
2663
+ fullWidth,
2664
+ size,
2665
+ "aria-label": ariaLabel ?? (typeof buttonLabel === "string" ? buttonLabel : void 0),
2666
+ "aria-describedby": describedBy,
2667
+ leftSection: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(ProviderIdentityMark, { provider }),
2668
+ disabled: resolvedDisabled,
2669
+ loading,
2670
+ styles: { root: { minHeight: minTouchTargetPx } },
2275
2671
  ...buttonProps,
2276
- children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { gap: 0, align: "flex-start", children: [
2277
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Text, { inherit: true, children: label }),
2278
- provider.description ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Text, { size: "xs", c: "dimmed", lh: 1.2, children: provider.description }) : null
2672
+ children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core36.Stack, { gap: 0, align: "flex-start", children: [
2673
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Text, { inherit: true, children: buttonLabel }),
2674
+ description ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Text, { size: "xs", c: "dimmed", lh: 1.2, children: description }) : null,
2675
+ policyNote ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Text, { size: "xs", c: "dimmed", lh: 1.2, children: policyNote }) : null,
2676
+ tenantDisabledReason ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Text, { size: "xs", c: "orange.7", lh: 1.2, children: tenantDisabledReason }) : null,
2677
+ error ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Text, { size: "xs", c: "red.7", lh: 1.2, role: "alert", children: error }) : null
2279
2678
  ] })
2280
2679
  }
2281
2680
  );
2282
2681
  }
2682
+ function ProviderIdentityButtonGroup({ providers, layout = "stack" }) {
2683
+ if (!providers.length) {
2684
+ return null;
2685
+ }
2686
+ const content = providers.map((entry, index) => {
2687
+ const key = `${normalizeProviderId(String(entry.provider)) || "provider"}-${index}`;
2688
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(ProviderIdentityButton, { ...entry }, key);
2689
+ });
2690
+ if (layout === "grid") {
2691
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.SimpleGrid, { cols: { base: 1, sm: 2 }, spacing: "sm", children: content });
2692
+ }
2693
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Stack, { gap: "sm", children: content });
2694
+ }
2695
+
2696
+ // src/SocialAuthButtons.tsx
2697
+ var import_jsx_runtime39 = require("react/jsx-runtime");
2283
2698
  function SocialAuthButtons({
2284
2699
  providers,
2285
2700
  title = "Continue with a trusted provider",
@@ -2290,44 +2705,57 @@ function SocialAuthButtons({
2290
2705
  if (!providers.length) {
2291
2706
  return null;
2292
2707
  }
2293
- const content = providers.map((provider) => /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(SocialAuthButton, { provider, compact }, provider.id));
2294
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { gap: "md", children: [
2295
- /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Stack, { gap: 4, ta: "center", children: [
2296
- /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Group, { justify: "center", gap: "xs", children: [
2297
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(GdsIcons.Login, { size: "1rem" }),
2298
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Text, { fw: 600, children: title })
2708
+ const buttons = providers.map((provider) => ({
2709
+ provider: provider.id,
2710
+ label: provider.label,
2711
+ description: provider.description,
2712
+ policyNote: provider.policyNote,
2713
+ error: provider.error,
2714
+ href: provider.href,
2715
+ onClick: provider.onClick,
2716
+ disabled: provider.disabled,
2717
+ loading: provider.loading,
2718
+ tenantDisabledReason: provider.tenantDisabledReason,
2719
+ size: provider.size ?? (compact ? "sm" : "md"),
2720
+ variant: provider.variant
2721
+ }));
2722
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core37.Stack, { gap: "md", children: [
2723
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core37.Stack, { gap: 4, ta: "center", children: [
2724
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core37.Group, { justify: "center", gap: "xs", children: [
2725
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(GdsIcons.Login, { size: "1rem" }),
2726
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Text, { fw: 600, children: title })
2299
2727
  ] }),
2300
- description ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Text, { size: "sm", c: "dimmed", children: description }) : null
2728
+ description ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Text, { size: "sm", c: "dimmed", children: description }) : null
2301
2729
  ] }),
2302
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Divider, {}),
2303
- layout === "grid" ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.SimpleGrid, { cols: { base: 1, sm: 2 }, spacing: "sm", children: content }) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Stack, { gap: "sm", children: content })
2730
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Divider, {}),
2731
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(ProviderIdentityButtonGroup, { providers: buttons, layout })
2304
2732
  ] });
2305
2733
  }
2306
2734
 
2307
2735
  // src/ArticleShell.tsx
2308
- var import_core36 = require("@mantine/core");
2309
- var import_jsx_runtime38 = require("react/jsx-runtime");
2736
+ var import_core38 = require("@mantine/core");
2737
+ var import_jsx_runtime40 = require("react/jsx-runtime");
2310
2738
  function ArticleShell({ eyebrow, title, lead, meta, sideRail, children }) {
2311
- return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Container, { size: "lg", py: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core36.Group, { align: "flex-start", gap: "xl", wrap: "nowrap", children: [
2312
- /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core36.Stack, { gap: "lg", maw: 760, flex: 1, children: [
2313
- /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core36.Stack, { gap: "sm", children: [
2314
- eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Text, { size: "sm", fw: 700, c: "dimmed", tt: "uppercase", children: eyebrow }) : null,
2315
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Title, { order: 1, children: title }),
2316
- lead ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Text, { size: "lg", c: "dimmed", children: lead }) : null,
2317
- meta ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Group, { gap: "md", children: meta }) : null
2739
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Container, { size: "lg", py: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Group, { align: "flex-start", gap: "xl", wrap: "nowrap", children: [
2740
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Stack, { gap: "lg", maw: 760, flex: 1, children: [
2741
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Stack, { gap: "sm", children: [
2742
+ eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Text, { size: "sm", fw: 700, c: "dimmed", tt: "uppercase", children: eyebrow }) : null,
2743
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Title, { order: 1, children: title }),
2744
+ lead ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Text, { size: "lg", c: "dimmed", children: lead }) : null,
2745
+ meta ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Group, { gap: "md", children: meta }) : null
2318
2746
  ] }),
2319
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Stack, { gap: "md", children })
2747
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Stack, { gap: "md", children })
2320
2748
  ] }),
2321
- sideRail ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Stack, { visibleFrom: "lg", gap: "md", w: 240, children: sideRail }) : null
2749
+ sideRail ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core38.Stack, { visibleFrom: "lg", gap: "md", w: 240, children: sideRail }) : null
2322
2750
  ] }) });
2323
2751
  }
2324
2752
 
2325
2753
  // src/DocsCodeBlock.tsx
2326
- var import_react6 = require("react");
2327
- var import_core37 = require("@mantine/core");
2328
- var import_jsx_runtime39 = require("react/jsx-runtime");
2754
+ var import_react7 = require("react");
2755
+ var import_core39 = require("@mantine/core");
2756
+ var import_jsx_runtime41 = require("react/jsx-runtime");
2329
2757
  function DocsCodeBlock({ code, language, title, withCopy = true }) {
2330
- const [copied, setCopied] = (0, import_react6.useState)(false);
2758
+ const [copied, setCopied] = (0, import_react7.useState)(false);
2331
2759
  const handleCopy = async () => {
2332
2760
  if (!navigator?.clipboard) {
2333
2761
  return;
@@ -2336,44 +2764,44 @@ function DocsCodeBlock({ code, language, title, withCopy = true }) {
2336
2764
  setCopied(true);
2337
2765
  window.setTimeout(() => setCopied(false), 1200);
2338
2766
  };
2339
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Paper, { withBorder: true, radius: "lg", p: "md", children: /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core37.Stack, { gap: "sm", children: [
2340
- title || withCopy ? /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core37.Group, { justify: "space-between", align: "center", children: [
2341
- /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core37.Stack, { gap: 0, children: [
2342
- title ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Text, { fw: 600, children: title }) : null,
2343
- language ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Text, { size: "xs", c: "dimmed", children: language }) : null
2767
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Paper, { withBorder: true, radius: "lg", p: "md", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core39.Stack, { gap: "sm", children: [
2768
+ title || withCopy ? /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core39.Group, { justify: "space-between", align: "center", children: [
2769
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core39.Stack, { gap: 0, children: [
2770
+ title ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Text, { fw: 600, children: title }) : null,
2771
+ language ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Text, { size: "xs", c: "dimmed", children: language }) : null
2344
2772
  ] }),
2345
- withCopy ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
2346
- import_core37.ActionIcon,
2773
+ withCopy ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
2774
+ import_core39.ActionIcon,
2347
2775
  {
2348
2776
  variant: "subtle",
2349
2777
  "aria-label": copied ? "Copied code block" : "Copy code block",
2350
2778
  onClick: () => {
2351
2779
  void handleCopy();
2352
2780
  },
2353
- children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(GdsIcons.Copy, { size: "1rem" })
2781
+ children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(GdsIcons.Copy, { size: "1rem" })
2354
2782
  }
2355
2783
  ) : null
2356
2784
  ] }) : null,
2357
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core37.Code, { block: true, children: code })
2785
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Code, { block: true, children: code })
2358
2786
  ] }) });
2359
2787
  }
2360
2788
 
2361
2789
  // src/CtaButtonGroup.tsx
2362
- var import_core38 = require("@mantine/core");
2363
- var import_jsx_runtime40 = require("react/jsx-runtime");
2790
+ var import_core40 = require("@mantine/core");
2791
+ var import_jsx_runtime42 = require("react/jsx-runtime");
2364
2792
  function CtaButtonGroup({ primary, secondary, tertiary }) {
2365
- return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Stack, { gap: "sm", children: [
2366
- /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core38.Group, { gap: "sm", align: "stretch", children: [
2367
- /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { children: primary }),
2368
- secondary ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { children: secondary }) : null
2793
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core40.Stack, { gap: "sm", children: [
2794
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core40.Group, { gap: "sm", align: "stretch", children: [
2795
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { children: primary }),
2796
+ secondary ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { children: secondary }) : null
2369
2797
  ] }),
2370
- tertiary ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("div", { children: tertiary }) : null
2798
+ tertiary ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { children: tertiary }) : null
2371
2799
  ] });
2372
2800
  }
2373
2801
 
2374
2802
  // src/DocsPageShell.tsx
2375
- var import_core39 = require("@mantine/core");
2376
- var import_jsx_runtime41 = require("react/jsx-runtime");
2803
+ var import_core41 = require("@mantine/core");
2804
+ var import_jsx_runtime43 = require("react/jsx-runtime");
2377
2805
  function DocsPageShell({
2378
2806
  breadcrumbs = [],
2379
2807
  title,
@@ -2384,27 +2812,27 @@ function DocsPageShell({
2384
2812
  footerNext,
2385
2813
  children
2386
2814
  }) {
2387
- return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Container, { fluid: true, py: "xl", px: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core39.Group, { align: "flex-start", gap: "xl", wrap: "nowrap", children: [
2388
- /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core39.Stack, { component: "article", gap: "lg", flex: 1, miw: 0, children: [
2389
- breadcrumbs.length ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Breadcrumbs, { children: breadcrumbs.map(
2390
- (crumb) => crumb.href ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Anchor, { href: crumb.href, children: crumb.label }, `${crumb.label}-${crumb.href}`) : /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Text, { children: crumb.label }, crumb.label)
2815
+ return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Container, { fluid: true, py: "xl", px: { base: "md", md: "lg", lg: "xl" }, w: "100%", maw: "100%", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_core41.Group, { align: "flex-start", gap: "xl", wrap: "nowrap", children: [
2816
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_core41.Stack, { component: "article", gap: "lg", flex: 1, miw: 0, children: [
2817
+ breadcrumbs.length ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Breadcrumbs, { children: breadcrumbs.map(
2818
+ (crumb) => crumb.href ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Anchor, { href: crumb.href, children: crumb.label }, `${crumb.label}-${crumb.href}`) : /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Text, { children: crumb.label }, crumb.label)
2391
2819
  ) }) : null,
2392
- /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core39.Stack, { gap: "sm", children: [
2393
- eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Text, { size: "sm", fw: 700, c: "dimmed", children: eyebrow }) : null,
2394
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Title, { order: 1, children: title }),
2395
- lead ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Text, { size: "lg", c: "dimmed", maw: 920, children: lead }) : null,
2396
- meta ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Group, { gap: "md", children: meta }) : null
2820
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_core41.Stack, { gap: "sm", children: [
2821
+ eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Text, { size: "sm", fw: 700, c: "dimmed", children: eyebrow }) : null,
2822
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Title, { order: 1, children: title }),
2823
+ lead ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Text, { size: "lg", c: "dimmed", children: lead }) : null,
2824
+ meta ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Group, { gap: "md", children: meta }) : null
2397
2825
  ] }),
2398
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Stack, { gap: "md", children }),
2399
- footerNext ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Anchor, { href: footerNext.href, fw: 600, children: footerNext.label }) : null
2826
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Stack, { gap: "md", children }),
2827
+ footerNext ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Anchor, { href: footerNext.href, fw: 600, children: footerNext.label }) : null
2400
2828
  ] }),
2401
- sideRail ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core39.Stack, { visibleFrom: "lg", gap: "md", w: 240, children: sideRail }) : null
2829
+ sideRail ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Stack, { visibleFrom: "lg", gap: "md", w: 240, children: sideRail }) : null
2402
2830
  ] }) });
2403
2831
  }
2404
2832
 
2405
2833
  // src/EditorialHero.tsx
2406
- var import_core40 = require("@mantine/core");
2407
- var import_jsx_runtime42 = require("react/jsx-runtime");
2834
+ var import_core42 = require("@mantine/core");
2835
+ var import_jsx_runtime44 = require("react/jsx-runtime");
2408
2836
  function resolveActionVariant(action, index, seenPrimary) {
2409
2837
  const requested = action.variant ?? (index === 0 ? "primary" : "secondary");
2410
2838
  if (requested === "primary" && !seenPrimary) {
@@ -2416,8 +2844,8 @@ function resolveActionVariant(action, index, seenPrimary) {
2416
2844
  return { variant: "default", seenPrimary };
2417
2845
  }
2418
2846
  function HeroAction({ action, variant }) {
2419
- const content = /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
2420
- import_core40.Anchor,
2847
+ const content = /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
2848
+ import_core42.Anchor,
2421
2849
  {
2422
2850
  href: action.href,
2423
2851
  onClick: action.onClick,
@@ -2441,8 +2869,8 @@ function HeroAction({ action, variant }) {
2441
2869
  }
2442
2870
  );
2443
2871
  if (!action.href) {
2444
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
2445
- import_core40.Box,
2872
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
2873
+ import_core42.Box,
2446
2874
  {
2447
2875
  component: "button",
2448
2876
  type: "button",
@@ -2469,30 +2897,30 @@ function HeroAction({ action, variant }) {
2469
2897
  return content;
2470
2898
  }
2471
2899
  function LoadingHero({ compact }) {
2472
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Paper, { withBorder: true, radius: "xl", p: compact ? "lg" : "xl", children: /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core40.Grid, { gutter: compact ? "lg" : "xl", align: "center", children: [
2473
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Grid.Col, { span: { base: 12, md: 6 }, children: /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core40.Stack, { gap: "md", children: [
2474
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Skeleton, { height: 16, width: 96, radius: "xl" }),
2475
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Skeleton, { height: 48, width: "90%", radius: "md" }),
2476
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Skeleton, { height: 18, width: "100%", radius: "md" }),
2477
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Skeleton, { height: 18, width: "82%", radius: "md" }),
2478
- /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core40.Group, { children: [
2479
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Skeleton, { height: 40, width: 140, radius: "md" }),
2480
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Skeleton, { height: 40, width: 140, radius: "md" })
2900
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Paper, { withBorder: true, radius: "xl", p: compact ? "lg" : "xl", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_core42.Grid, { gutter: compact ? "lg" : "xl", align: "center", children: [
2901
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Grid.Col, { span: { base: 12, md: 6 }, children: /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_core42.Stack, { gap: "md", children: [
2902
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Skeleton, { height: 16, width: 96, radius: "xl" }),
2903
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Skeleton, { height: 48, width: "90%", radius: "md" }),
2904
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Skeleton, { height: 18, width: "100%", radius: "md" }),
2905
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Skeleton, { height: 18, width: "82%", radius: "md" }),
2906
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_core42.Group, { children: [
2907
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Skeleton, { height: 40, width: 140, radius: "md" }),
2908
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Skeleton, { height: 40, width: 140, radius: "md" })
2481
2909
  ] })
2482
2910
  ] }) }),
2483
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Grid.Col, { span: { base: 12, md: 6 }, children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.AspectRatio, { ratio: 16 / 11, children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Skeleton, { radius: "lg" }) }) })
2911
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Grid.Col, { span: { base: 12, md: 6 }, children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.AspectRatio, { ratio: 16 / 11, children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Skeleton, { radius: "lg" }) }) })
2484
2912
  ] }) });
2485
2913
  }
2486
2914
  function MediaFallback() {
2487
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.AspectRatio, { ratio: 16 / 11, children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
2488
- import_core40.ThemeIcon,
2915
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.AspectRatio, { ratio: 16 / 11, children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
2916
+ import_core42.ThemeIcon,
2489
2917
  {
2490
2918
  size: "100%",
2491
2919
  radius: "lg",
2492
2920
  color: "gray",
2493
2921
  variant: "light",
2494
2922
  "aria-label": "Hero media is unavailable",
2495
- children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(GdsIcons.Gallery, { size: "2.5rem" })
2923
+ children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(GdsIcons.Gallery, { size: "2.5rem" })
2496
2924
  }
2497
2925
  ) });
2498
2926
  }
@@ -2512,8 +2940,8 @@ function MediaFrame({
2512
2940
  } else if (mediaFade === "soft-start") {
2513
2941
  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%)";
2514
2942
  }
2515
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
2516
- import_core40.Box,
2943
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
2944
+ import_core42.Box,
2517
2945
  {
2518
2946
  component: "figure",
2519
2947
  m: 0,
@@ -2526,9 +2954,9 @@ function MediaFrame({
2526
2954
  },
2527
2955
  "aria-label": mediaAlt,
2528
2956
  children: [
2529
- media ?? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(MediaFallback, {}),
2530
- media && overlayBackground ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
2531
- import_core40.Box,
2957
+ media ?? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(MediaFallback, {}),
2958
+ media && overlayBackground ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
2959
+ import_core42.Box,
2532
2960
  {
2533
2961
  "aria-hidden": true,
2534
2962
  style: {
@@ -2561,7 +2989,7 @@ function EditorialHero({
2561
2989
  classNames
2562
2990
  }) {
2563
2991
  if (loading) {
2564
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(LoadingHero, { compact });
2992
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(LoadingHero, { compact });
2565
2993
  }
2566
2994
  const stackAlign = align === "center" ? "center" : "flex-start";
2567
2995
  const textAlign = align === "center" ? "center" : "left";
@@ -2569,15 +2997,15 @@ function EditorialHero({
2569
2997
  const renderedActions = actions.slice(0, 3).map((action, index) => {
2570
2998
  const resolved = resolveActionVariant(action, index, seenPrimary);
2571
2999
  seenPrimary = resolved.seenPrimary;
2572
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(HeroAction, { action, variant: resolved.variant }, `${action.label}-${index}`);
3000
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(HeroAction, { action, variant: resolved.variant }, `${action.label}-${index}`);
2573
3001
  });
2574
- const textSlot = /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core40.Stack, { gap: compact ? "md" : "lg", justify: "center", h: "100%", className: classNames?.content, children: [
2575
- /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core40.Stack, { gap: "sm", align: stackAlign, children: [
2576
- eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Text, { size: "sm", fw: 700, c: "dimmed", ta: textAlign, children: eyebrow }) : null,
2577
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Title, { order: 1, maw: 760, ta: textAlign, children: title }),
2578
- description ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Text, { size: compact ? "md" : "lg", c: "dimmed", maw: 720, ta: textAlign, children: description }) : null
3002
+ const textSlot = /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_core42.Stack, { gap: compact ? "md" : "lg", justify: "center", h: "100%", className: classNames?.content, children: [
3003
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_core42.Stack, { gap: "sm", align: stackAlign, children: [
3004
+ eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Text, { size: "sm", fw: 700, c: "dimmed", ta: textAlign, children: eyebrow }) : null,
3005
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Title, { order: 1, maw: 760, ta: textAlign, children: title }),
3006
+ description ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Text, { size: compact ? "md" : "lg", c: "dimmed", maw: 720, ta: textAlign, children: description }) : null
2579
3007
  ] }),
2580
- renderedActions.length ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Box, { className: classNames?.actions, children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
3008
+ renderedActions.length ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Box, { className: classNames?.actions, children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
2581
3009
  CtaButtonGroup,
2582
3010
  {
2583
3011
  primary: renderedActions[0],
@@ -2585,8 +3013,8 @@ function EditorialHero({
2585
3013
  tertiary: renderedActions[2]
2586
3014
  }
2587
3015
  ) }) : null,
2588
- meta.length ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Group, { gap: "sm", wrap: "wrap", "aria-label": "Supporting details", className: classNames?.meta, children: meta.map((item) => /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(
2589
- import_core40.Group,
3016
+ meta.length ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Group, { gap: "sm", wrap: "wrap", "aria-label": "Supporting details", className: classNames?.meta, children: meta.map((item) => /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
3017
+ import_core42.Group,
2590
3018
  {
2591
3019
  gap: 6,
2592
3020
  px: "sm",
@@ -2597,17 +3025,17 @@ function EditorialHero({
2597
3025
  },
2598
3026
  children: [
2599
3027
  item.icon,
2600
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Text, { size: "sm", c: "dimmed", children: item.label })
3028
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Text, { size: "sm", c: "dimmed", children: item.label })
2601
3029
  ]
2602
3030
  },
2603
3031
  item.id
2604
3032
  )) }) : null
2605
3033
  ] });
2606
- const mediaSlot = error ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(AccentPanel, { tone: "red", variant: "soft-outline", title: "Media unavailable", children: error }) : /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(MediaFrame, { media, mediaAlt, mediaFade, className: classNames?.media });
2607
- const textCol = /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Grid.Col, { span: { base: 12, md: 6 }, order: { base: 1, md: mediaPosition === "left" ? 2 : 1 }, children: textSlot });
2608
- const mediaCol = /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core40.Grid.Col, { span: { base: 12, md: 6 }, order: { base: 2, md: mediaPosition === "left" ? 1 : 2 }, children: mediaSlot });
2609
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
2610
- import_core40.Paper,
3034
+ const mediaSlot = error ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(AccentPanel, { tone: "red", variant: "soft-outline", title: "Media unavailable", children: error }) : /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(MediaFrame, { media, mediaAlt, mediaFade, className: classNames?.media });
3035
+ const textCol = /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Grid.Col, { span: { base: 12, md: 6 }, order: { base: 1, md: mediaPosition === "left" ? 2 : 1 }, children: textSlot });
3036
+ const mediaCol = /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Grid.Col, { span: { base: 12, md: 6 }, order: { base: 2, md: mediaPosition === "left" ? 1 : 2 }, children: mediaSlot });
3037
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
3038
+ import_core42.Paper,
2611
3039
  {
2612
3040
  component: "section",
2613
3041
  withBorder: true,
@@ -2615,7 +3043,7 @@ function EditorialHero({
2615
3043
  p: compact ? "lg" : "xl",
2616
3044
  className: classNames?.root,
2617
3045
  style: surfaceVariant === "flat-public" ? { boxShadow: "none" } : void 0,
2618
- children: /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core40.Grid, { gutter: compact ? "lg" : "xl", align: "center", children: [
3046
+ children: /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_core42.Grid, { gutter: compact ? "lg" : "xl", align: "center", children: [
2619
3047
  textCol,
2620
3048
  mediaCol
2621
3049
  ] })
@@ -2624,19 +3052,19 @@ function EditorialHero({
2624
3052
  }
2625
3053
 
2626
3054
  // src/FeatureBand.tsx
2627
- var import_core41 = require("@mantine/core");
2628
- var import_jsx_runtime43 = require("react/jsx-runtime");
3055
+ var import_core43 = require("@mantine/core");
3056
+ var import_jsx_runtime45 = require("react/jsx-runtime");
2629
3057
  function FeatureBandSkeleton({
2630
3058
  columns = 3,
2631
3059
  bordered = true,
2632
3060
  variant = "default"
2633
3061
  }) {
2634
- return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.SimpleGrid, { cols: { base: 1, sm: Math.min(columns, 2), lg: columns }, spacing: "lg", children: Array.from({ length: columns }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Paper, { withBorder: bordered, radius: "lg", p: variant === "compact" ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_core41.Stack, { gap: "md", children: [
2635
- /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Skeleton, { height: variant === "process" ? 28 : 42, width: variant === "process" ? 72 : 42, radius: "xl" }),
2636
- /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_core41.Stack, { gap: "xs", children: [
2637
- /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Skeleton, { height: 20, width: "75%", radius: "md" }),
2638
- /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Skeleton, { height: 14, width: "100%", radius: "md" }),
2639
- /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Skeleton, { height: 14, width: "82%", radius: "md" })
3062
+ return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.SimpleGrid, { cols: { base: 1, sm: Math.min(columns, 2), lg: columns }, spacing: "lg", children: Array.from({ length: columns }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Paper, { withBorder: bordered, radius: "lg", p: variant === "compact" ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_core43.Stack, { gap: "md", children: [
3063
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Skeleton, { height: variant === "process" ? 28 : 42, width: variant === "process" ? 72 : 42, radius: "xl" }),
3064
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_core43.Stack, { gap: "xs", children: [
3065
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Skeleton, { height: 20, width: "75%", radius: "md" }),
3066
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Skeleton, { height: 14, width: "100%", radius: "md" }),
3067
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Skeleton, { height: 14, width: "82%", radius: "md" })
2640
3068
  ] })
2641
3069
  ] }) }, index)) });
2642
3070
  }
@@ -2649,10 +3077,10 @@ function FeatureBand({
2649
3077
  variant = "default"
2650
3078
  }) {
2651
3079
  if (loading) {
2652
- return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(FeatureBandSkeleton, { columns, bordered, variant });
3080
+ return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(FeatureBandSkeleton, { columns, bordered, variant });
2653
3081
  }
2654
3082
  if (!items.length) {
2655
- return emptyState ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_jsx_runtime43.Fragment, { children: emptyState }) : /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
3083
+ return emptyState ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_jsx_runtime45.Fragment, { children: emptyState }) : /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
2656
3084
  EmptyState,
2657
3085
  {
2658
3086
  title: "No supporting details available",
@@ -2660,9 +3088,9 @@ function FeatureBand({
2660
3088
  }
2661
3089
  );
2662
3090
  }
2663
- return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Box, { component: "section", "aria-label": "Supporting features", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.SimpleGrid, { cols: { base: 1, sm: Math.min(columns, 2), lg: columns }, spacing: "lg", children: items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Paper, { withBorder: bordered, radius: "lg", p: variant === "compact" ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_core41.Stack, { gap: "md", children: [
2664
- variant === "process" ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
2665
- import_core41.Text,
3091
+ return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Box, { component: "section", "aria-label": "Supporting features", children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.SimpleGrid, { cols: { base: 1, sm: Math.min(columns, 2), lg: columns }, spacing: "lg", children: items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Paper, { withBorder: bordered, radius: "lg", p: variant === "compact" ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_core43.Stack, { gap: "md", children: [
3092
+ variant === "process" ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
3093
+ import_core43.Text,
2666
3094
  {
2667
3095
  fw: 800,
2668
3096
  size: "sm",
@@ -2674,18 +3102,18 @@ function FeatureBand({
2674
3102
  },
2675
3103
  children: item.stepLabel ?? `Step ${index + 1}`
2676
3104
  }
2677
- ) }) : item.media ? item.media : item.icon ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.ThemeIcon, { size: "xl", radius: "xl", variant: "light", color: "violet", children: item.icon }) }) : /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.ThemeIcon, { size: "xl", radius: "xl", variant: "light", color: "gray", "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(GdsIcons.Info, { size: "1.25rem" }) }) }),
2678
- /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_core41.Stack, { gap: "xs", children: [
2679
- /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Title, { order: 4, children: item.title }),
2680
- item.description ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Text, { c: "dimmed", children: item.description }) : null,
2681
- item.meta ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core41.Text, { size: "sm", c: "dimmed", children: item.meta }) : null
3105
+ ) }) : item.media ? item.media : item.icon ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.ThemeIcon, { size: "xl", radius: "xl", variant: "light", color: "violet", children: item.icon }) }) : /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.ThemeIcon, { size: "xl", radius: "xl", variant: "light", color: "gray", "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(GdsIcons.Info, { size: "1.25rem" }) }) }),
3106
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_core43.Stack, { gap: "xs", children: [
3107
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Title, { order: 4, children: item.title }),
3108
+ item.description ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Text, { c: "dimmed", children: item.description }) : null,
3109
+ item.meta ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Text, { size: "sm", c: "dimmed", children: item.meta }) : null
2682
3110
  ] })
2683
3111
  ] }) }, item.id)) }) });
2684
3112
  }
2685
3113
 
2686
3114
  // src/MapPanel.tsx
2687
- var import_core42 = require("@mantine/core");
2688
- var import_jsx_runtime44 = require("react/jsx-runtime");
3115
+ var import_core44 = require("@mantine/core");
3116
+ var import_jsx_runtime46 = require("react/jsx-runtime");
2689
3117
  function MapPanel({
2690
3118
  title,
2691
3119
  description,
@@ -2701,7 +3129,7 @@ function MapPanel({
2701
3129
  }) {
2702
3130
  let body;
2703
3131
  if (loading) {
2704
- body = /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
3132
+ body = /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
2705
3133
  StateBlock,
2706
3134
  {
2707
3135
  variant: "loading",
@@ -2711,9 +3139,9 @@ function MapPanel({
2711
3139
  }
2712
3140
  );
2713
3141
  } else if (error) {
2714
- body = /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(StateBlock, { variant: "error", title: "Map unavailable", description: error, compact: true });
3142
+ body = /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(StateBlock, { variant: "error", title: "Map unavailable", description: error, compact: true });
2715
3143
  } else if (!iframeSrc && !renderMap) {
2716
- body = /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
3144
+ body = /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
2717
3145
  StateBlock,
2718
3146
  {
2719
3147
  variant: "empty",
@@ -2723,9 +3151,9 @@ function MapPanel({
2723
3151
  }
2724
3152
  );
2725
3153
  } else if (renderMap) {
2726
- body = /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Box, { style: { minHeight }, children: renderMap() });
3154
+ body = /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.Box, { style: { minHeight }, children: renderMap() });
2727
3155
  } else {
2728
- body = /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.AspectRatio, { ratio: 16 / 9, children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
3156
+ body = /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.AspectRatio, { ratio: 16 / 9, children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
2729
3157
  "iframe",
2730
3158
  {
2731
3159
  src: iframeSrc,
@@ -2737,21 +3165,21 @@ function MapPanel({
2737
3165
  }
2738
3166
  ) });
2739
3167
  }
2740
- return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_core42.Stack, { gap: "md", children: [
2741
- /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_core42.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
2742
- /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_core42.Stack, { gap: 4, children: [
2743
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Title, { order: 3, children: title }),
2744
- description ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core42.Text, { size: "sm", c: "dimmed", children: description }) : null
3168
+ return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_core44.Stack, { gap: "md", children: [
3169
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_core44.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
3170
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_core44.Stack, { gap: 4, children: [
3171
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.Title, { order: 3, children: title }),
3172
+ description ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.Text, { size: "sm", c: "dimmed", children: description }) : null
2745
3173
  ] }),
2746
- actions ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(ActionBar, { ...actions }) : null
3174
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(ActionBar, { ...actions }) : null
2747
3175
  ] }),
2748
3176
  body
2749
3177
  ] }) });
2750
3178
  }
2751
3179
 
2752
3180
  // src/PublicFlowShell.tsx
2753
- var import_core43 = require("@mantine/core");
2754
- var import_jsx_runtime45 = require("react/jsx-runtime");
3181
+ var import_core45 = require("@mantine/core");
3182
+ var import_jsx_runtime47 = require("react/jsx-runtime");
2755
3183
  var stageTone = {
2756
3184
  idle: { label: "Idle", color: "gray" },
2757
3185
  loading: { label: "Loading", color: "blue" },
@@ -2803,7 +3231,7 @@ function PublicFlowShell({
2803
3231
  const actionBar = toActionBar(stage.actions);
2804
3232
  let body = stage.body;
2805
3233
  if (stage.status === "loading") {
2806
- body = /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
3234
+ body = /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
2807
3235
  StateBlock,
2808
3236
  {
2809
3237
  variant: "loading",
@@ -2812,7 +3240,7 @@ function PublicFlowShell({
2812
3240
  }
2813
3241
  );
2814
3242
  } else if (stage.status === "error") {
2815
- body = errorState ?? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
3243
+ body = errorState ?? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
2816
3244
  StateBlock,
2817
3245
  {
2818
3246
  variant: "error",
@@ -2821,7 +3249,7 @@ function PublicFlowShell({
2821
3249
  }
2822
3250
  );
2823
3251
  } else if (!stage.body && !hardwareSurface) {
2824
- body = emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
3252
+ body = emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
2825
3253
  EmptyState,
2826
3254
  {
2827
3255
  title: "No stage content available",
@@ -2829,29 +3257,29 @@ function PublicFlowShell({
2829
3257
  }
2830
3258
  );
2831
3259
  }
2832
- return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_core43.Stack, { gap: "lg", children: [
2833
- /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_core43.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
2834
- /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_core43.Stack, { gap: 4, children: [
2835
- eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Text, { size: "xs", fw: 700, c: "dimmed", tt: "uppercase", children: eyebrow }) : null,
2836
- /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_core43.Group, { gap: "sm", wrap: "wrap", children: [
2837
- /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Title, { order: 2, children: stage.title }),
2838
- /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Badge, { variant: "light", color: tone.color, children: tone.label })
3260
+ return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core45.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(import_core45.Stack, { gap: "lg", children: [
3261
+ /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(import_core45.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
3262
+ /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(import_core45.Stack, { gap: 4, children: [
3263
+ eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core45.Text, { size: "xs", fw: 700, c: "dimmed", tt: "uppercase", children: eyebrow }) : null,
3264
+ /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(import_core45.Group, { gap: "sm", wrap: "wrap", children: [
3265
+ /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core45.Title, { order: 2, children: stage.title }),
3266
+ /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core45.Badge, { variant: "light", color: tone.color, children: tone.label })
2839
3267
  ] }),
2840
- stage.description ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Text, { size: "sm", c: "dimmed", children: stage.description }) : null
3268
+ stage.description ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core45.Text, { size: "sm", c: "dimmed", children: stage.description }) : null
2841
3269
  ] }),
2842
3270
  exitAction
2843
3271
  ] }),
2844
- stage.notice ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core43.Text, { size: "sm", c: "dimmed", children: stage.notice }) : null,
3272
+ stage.notice ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core45.Text, { size: "sm", c: "dimmed", children: stage.notice }) : null,
2845
3273
  body,
2846
3274
  hardwareSurface,
2847
3275
  stage.aside,
2848
- actionBar ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(ActionBar, { ...actionBar }) : null
3276
+ actionBar ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(ActionBar, { ...actionBar }) : null
2849
3277
  ] }) });
2850
3278
  }
2851
3279
 
2852
3280
  // src/PlaybackSurface.tsx
2853
- var import_core44 = require("@mantine/core");
2854
- var import_jsx_runtime46 = require("react/jsx-runtime");
3281
+ var import_core46 = require("@mantine/core");
3282
+ var import_jsx_runtime48 = require("react/jsx-runtime");
2855
3283
  var stateTone = {
2856
3284
  loading: { label: "Loading", color: "blue" },
2857
3285
  ready: { label: "Ready", color: "teal" },
@@ -2874,7 +3302,7 @@ function PlaybackSurface({
2874
3302
  const tone = stateTone[state];
2875
3303
  let content;
2876
3304
  if (state === "loading") {
2877
- content = /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
3305
+ content = /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
2878
3306
  StateBlock,
2879
3307
  {
2880
3308
  variant: "loading",
@@ -2883,7 +3311,7 @@ function PlaybackSurface({
2883
3311
  }
2884
3312
  );
2885
3313
  } else if (state === "empty") {
2886
- content = emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
3314
+ content = emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
2887
3315
  EmptyState,
2888
3316
  {
2889
3317
  title: "No playback content available",
@@ -2891,7 +3319,7 @@ function PlaybackSurface({
2891
3319
  }
2892
3320
  );
2893
3321
  } else if (state === "error") {
2894
- content = errorState ?? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
3322
+ content = errorState ?? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
2895
3323
  StateBlock,
2896
3324
  {
2897
3325
  variant: "error",
@@ -2900,23 +3328,23 @@ function PlaybackSurface({
2900
3328
  }
2901
3329
  );
2902
3330
  } else {
2903
- content = /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_core44.Stack, { gap: "md", children: [
3331
+ content = /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(import_core46.Stack, { gap: "md", children: [
2904
3332
  media,
2905
3333
  overlays
2906
3334
  ] });
2907
3335
  }
2908
- return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.Paper, { withBorder: true, radius: "xl", p: "lg", "data-playback-mode": mode, children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_core44.Stack, { gap: "md", children: [
2909
- title || statusMessage || controls ? /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_core44.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
2910
- /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_core44.Stack, { gap: 4, children: [
2911
- title ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.Title, { order: 3, children: title }) : null,
2912
- statusMessage ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.Text, { size: "sm", c: "dimmed", children: statusMessage }) : null
3336
+ return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_core46.Paper, { withBorder: true, radius: "xl", p: "lg", "data-playback-mode": mode, children: /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(import_core46.Stack, { gap: "md", children: [
3337
+ title || statusMessage || controls ? /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(import_core46.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
3338
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(import_core46.Stack, { gap: 4, children: [
3339
+ title ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_core46.Title, { order: 3, children: title }) : null,
3340
+ statusMessage ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_core46.Text, { size: "sm", c: "dimmed", children: statusMessage }) : null
2913
3341
  ] }),
2914
- /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_core44.Group, { gap: "sm", align: "center", wrap: "wrap", children: [
2915
- /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core44.Badge, { variant: "light", color: tone.color, children: tone.label }),
3342
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(import_core46.Group, { gap: "sm", align: "center", wrap: "wrap", children: [
3343
+ /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_core46.Badge, { variant: "light", color: tone.color, children: tone.label }),
2916
3344
  controls
2917
3345
  ] })
2918
3346
  ] }) : null,
2919
- state === "degraded" ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
3347
+ state === "degraded" ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
2920
3348
  StateBlock,
2921
3349
  {
2922
3350
  variant: "info",
@@ -2930,9 +3358,9 @@ function PlaybackSurface({
2930
3358
  }
2931
3359
 
2932
3360
  // src/ShareButtonGroup.tsx
2933
- var import_react7 = require("react");
2934
- var import_core45 = require("@mantine/core");
2935
- var import_jsx_runtime47 = require("react/jsx-runtime");
3361
+ var import_react8 = require("react");
3362
+ var import_core47 = require("@mantine/core");
3363
+ var import_jsx_runtime49 = require("react/jsx-runtime");
2936
3364
  var channelLabels = {
2937
3365
  native: "Share",
2938
3366
  copy: "Copy link",
@@ -2967,9 +3395,9 @@ function ShareAction({
2967
3395
  const label = channelLabels[channel];
2968
3396
  const Icon = channel === "copy" ? GdsIcons.Copy : channel === "mail" ? GdsIcons.Mail : channel === "message" ? GdsIcons.Message : GdsIcons.Refer;
2969
3397
  if (compact) {
2970
- return href ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core45.ActionIcon, { component: "a", href, target: "_blank", rel: "noreferrer", variant: "subtle", size: "lg", "aria-label": label, children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Icon, { size: "1rem", stroke: 1.75 }) }) : /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core45.ActionIcon, { variant: "subtle", size: "lg", "aria-label": label, onClick, children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Icon, { size: "1rem", stroke: 1.75 }) });
3398
+ return href ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.ActionIcon, { component: "a", href, target: "_blank", rel: "noreferrer", variant: "subtle", size: "lg", "aria-label": label, children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Icon, { size: "1rem", stroke: 1.75 }) }) : /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.ActionIcon, { variant: "subtle", size: "lg", "aria-label": label, onClick, children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Icon, { size: "1rem", stroke: 1.75 }) });
2971
3399
  }
2972
- return href ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core45.Button, { component: "a", href, target: "_blank", rel: "noreferrer", variant: "default", leftSection: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Icon, { size: "1rem", stroke: 1.75 }), children: label }) : /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core45.Button, { variant: "default", leftSection: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Icon, { size: "1rem", stroke: 1.75 }), onClick, children: label });
3400
+ return href ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Button, { component: "a", href, target: "_blank", rel: "noreferrer", variant: "default", leftSection: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Icon, { size: "1rem", stroke: 1.75 }), children: label }) : /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Button, { variant: "default", leftSection: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Icon, { size: "1rem", stroke: 1.75 }), onClick, children: label });
2973
3401
  }
2974
3402
  function ShareButtonGroup({
2975
3403
  url,
@@ -2980,8 +3408,8 @@ function ShareButtonGroup({
2980
3408
  label = "Share this",
2981
3409
  description
2982
3410
  }) {
2983
- const [copied, setCopied] = (0, import_react7.useState)(false);
2984
- const [shared, setShared] = (0, import_react7.useState)(false);
3411
+ const [copied, setCopied] = (0, import_react8.useState)(false);
3412
+ const [shared, setShared] = (0, import_react8.useState)(false);
2985
3413
  const hrefs = encodeShare(url, title, text);
2986
3414
  async function handleCopy() {
2987
3415
  await navigator.clipboard?.writeText?.(url);
@@ -2997,52 +3425,67 @@ function ShareButtonGroup({
2997
3425
  }
2998
3426
  await handleCopy();
2999
3427
  }
3000
- return /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(import_core45.Stack, { gap: "sm", children: [
3001
- /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(import_core45.Stack, { gap: 2, children: [
3002
- /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core45.Text, { fw: 600, children: label }),
3003
- description ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core45.Text, { size: "sm", c: "dimmed", children: description }) : null
3428
+ return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_core47.Stack, { gap: "sm", children: [
3429
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_core47.Stack, { gap: 2, children: [
3430
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Text, { fw: 600, children: label }),
3431
+ description ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Text, { size: "sm", c: "dimmed", children: description }) : null
3004
3432
  ] }),
3005
- /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core45.Group, { gap: "sm", wrap: "wrap", children: channels.map((channel) => {
3433
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Group, { gap: "sm", wrap: "wrap", children: channels.map((channel) => {
3006
3434
  if (channel === "copy") {
3007
- return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(ShareAction, { channel, compact, onClick: () => void handleCopy() }, channel);
3435
+ return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(ShareAction, { channel, compact, onClick: () => void handleCopy() }, channel);
3008
3436
  }
3009
3437
  if (channel === "native") {
3010
- return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(ShareAction, { channel, compact, onClick: () => void handleNativeShare() }, channel);
3438
+ return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(ShareAction, { channel, compact, onClick: () => void handleNativeShare() }, channel);
3011
3439
  }
3012
- return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(ShareAction, { channel, compact, href: hrefs[channel] }, channel);
3440
+ return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(ShareAction, { channel, compact, href: hrefs[channel] }, channel);
3013
3441
  }) }),
3014
- copied ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core45.Text, { size: "sm", c: "teal", children: "Link copied." }) : null,
3015
- shared ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core45.Text, { size: "sm", c: "teal", children: "Share sheet opened." }) : null
3442
+ copied ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Text, { size: "sm", c: "teal", children: "Link copied." }) : null,
3443
+ shared ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Text, { size: "sm", c: "teal", children: "Share sheet opened." }) : null
3016
3444
  ] });
3017
3445
  }
3018
3446
 
3019
3447
  // src/UploadDropzone.tsx
3020
- var import_react8 = require("react");
3021
- var import_core46 = require("@mantine/core");
3022
- var import_jsx_runtime48 = require("react/jsx-runtime");
3448
+ var import_react9 = require("react");
3449
+ var import_core48 = require("@mantine/core");
3450
+ var import_jsx_runtime50 = require("react/jsx-runtime");
3023
3451
  function UploadDropzone({
3024
3452
  title,
3025
3453
  description,
3026
3454
  onFilesSelected,
3027
3455
  accept,
3456
+ acceptedTypesLabel,
3457
+ maxSizeLabel,
3028
3458
  multiple = true,
3029
3459
  actionLabel = "Choose files",
3030
- mode = "panel"
3460
+ mode = "panel",
3461
+ state = "idle",
3462
+ selectedFiles = [],
3463
+ error,
3464
+ policyText,
3465
+ retryAction,
3466
+ removeAction,
3467
+ readonly = false
3031
3468
  }) {
3032
- const inputRef = (0, import_react8.useRef)(null);
3033
- const [dragging, setDragging] = (0, import_react8.useState)(false);
3469
+ const inputRef = (0, import_react9.useRef)(null);
3470
+ const [dragging, setDragging] = (0, import_react9.useState)(false);
3034
3471
  const UploadIcon = GdsIcons.Upload;
3472
+ const effectiveState = readonly ? "readonly" : dragging ? "drag-active" : state;
3473
+ const isDisabled = readonly || effectiveState === "upload-pending";
3474
+ const isError = ["upload-failed", "unsupported-type", "too-large"].includes(effectiveState);
3035
3475
  const forwardFiles = (files) => {
3036
- if (!files?.length || !onFilesSelected) {
3476
+ if (isDisabled || !files?.length || !onFilesSelected) {
3037
3477
  return;
3038
3478
  }
3039
3479
  onFilesSelected(Array.from(files));
3040
3480
  };
3041
- return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
3042
- import_core46.Box,
3481
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(
3482
+ import_core48.Box,
3043
3483
  {
3044
3484
  onDragOver: (event) => {
3045
3485
  event.preventDefault();
3486
+ if (isDisabled) {
3487
+ return;
3488
+ }
3046
3489
  setDragging(true);
3047
3490
  },
3048
3491
  onDragLeave: () => setDragging(false),
@@ -3053,12 +3496,13 @@ function UploadDropzone({
3053
3496
  },
3054
3497
  p: mode === "inline" ? "md" : "xl",
3055
3498
  style: {
3056
- border: `1px dashed var(${dragging ? "--mantine-color-violet-6" : "--mantine-color-default-border"})`,
3499
+ border: `1px dashed var(${effectiveState === "drag-active" ? "--mantine-color-violet-6" : isError ? "--mantine-color-red-6" : "--mantine-color-default-border"})`,
3057
3500
  borderRadius: "var(--mantine-radius-lg)",
3058
- background: dragging ? "var(--mantine-color-violet-light)" : "transparent"
3501
+ background: effectiveState === "drag-active" ? "var(--mantine-color-violet-light)" : "transparent"
3059
3502
  },
3503
+ "aria-invalid": isError || void 0,
3060
3504
  children: [
3061
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
3505
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
3062
3506
  "input",
3063
3507
  {
3064
3508
  ref: inputRef,
@@ -3066,14 +3510,30 @@ function UploadDropzone({
3066
3510
  hidden: true,
3067
3511
  accept,
3068
3512
  multiple,
3513
+ disabled: isDisabled,
3069
3514
  onChange: (event) => forwardFiles(event.currentTarget.files)
3070
3515
  }
3071
3516
  ),
3072
- /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(import_core46.Stack, { align: mode === "inline" ? "flex-start" : "center", ta: mode === "inline" ? "left" : "center", gap: "sm", children: [
3073
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(UploadIcon, { size: "1.5rem" }),
3074
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_core46.Text, { fw: 600, children: title }),
3075
- description ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_core46.Text, { size: "sm", c: "dimmed", children: description }) : null,
3076
- /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_core46.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_core46.Button, { variant: "light", onClick: () => inputRef.current?.click(), children: actionLabel }) })
3517
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core48.Stack, { align: mode === "inline" ? "flex-start" : "center", ta: mode === "inline" ? "left" : "center", gap: "sm", children: [
3518
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(UploadIcon, { size: "1.5rem" }),
3519
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Badge, { variant: "light", color: isError ? "red" : effectiveState === "selected" ? "blue" : effectiveState === "upload-pending" ? "violet" : "gray", children: effectiveState.replace("-", " ") }),
3520
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Text, { fw: 600, children: title }),
3521
+ description ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Text, { size: "sm", c: "dimmed", children: description }) : null,
3522
+ acceptedTypesLabel || maxSizeLabel ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core48.Group, { gap: "xs", justify: mode === "inline" ? "flex-start" : "center", children: [
3523
+ acceptedTypesLabel ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Badge, { variant: "outline", color: "gray", children: acceptedTypesLabel }) : null,
3524
+ maxSizeLabel ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Badge, { variant: "outline", color: "gray", children: maxSizeLabel }) : null
3525
+ ] }) : null,
3526
+ selectedFiles.length ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core48.Text, { size: "sm", children: [
3527
+ "Selected: ",
3528
+ selectedFiles.join(", ")
3529
+ ] }) : null,
3530
+ policyText ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Text, { size: "sm", c: isError ? "red.7" : "dimmed", children: policyText }) : null,
3531
+ error ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Text, { size: "sm", c: "red.7", role: "alert", children: error }) : null,
3532
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core48.Group, { children: [
3533
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Button, { variant: "light", onClick: () => inputRef.current?.click(), disabled: isDisabled, children: actionLabel }),
3534
+ retryAction,
3535
+ removeAction
3536
+ ] })
3077
3537
  ] })
3078
3538
  ]
3079
3539
  }
@@ -3081,14 +3541,21 @@ function UploadDropzone({
3081
3541
  }
3082
3542
 
3083
3543
  // src/MediaField.tsx
3084
- var import_core47 = require("@mantine/core");
3085
- var import_jsx_runtime49 = require("react/jsx-runtime");
3544
+ var import_core49 = require("@mantine/core");
3545
+ var import_jsx_runtime51 = require("react/jsx-runtime");
3086
3546
  var stateLabels = {
3087
3547
  empty: { label: "Empty", color: "gray" },
3548
+ "drag-active": { label: "Drop to select", color: "violet" },
3088
3549
  selected: { label: "Selected", color: "blue" },
3550
+ "preview-loading": { label: "Preview loading", color: "violet" },
3089
3551
  saved: { label: "Saved", color: "teal" },
3090
3552
  invalid: { label: "Needs attention", color: "red" },
3091
- uploading: { label: "Uploading", color: "violet" }
3553
+ uploading: { label: "Uploading", color: "violet" },
3554
+ "upload-failed": { label: "Upload failed", color: "red" },
3555
+ "unsupported-type": { label: "Unsupported type", color: "red" },
3556
+ "too-large": { label: "Too large", color: "red" },
3557
+ removed: { label: "Removed", color: "gray" },
3558
+ readonly: { label: "Read only", color: "gray" }
3092
3559
  };
3093
3560
  function MediaField({
3094
3561
  label,
@@ -3101,41 +3568,60 @@ function MediaField({
3101
3568
  policyText,
3102
3569
  error,
3103
3570
  retryAction,
3571
+ replaceAction,
3104
3572
  onRemove,
3105
3573
  onReset,
3106
3574
  removeAction,
3107
3575
  resetAction,
3108
3576
  statusAction,
3577
+ acceptedTypes,
3578
+ maxSize,
3579
+ progress,
3580
+ readonly = false,
3109
3581
  state = "empty",
3110
3582
  mode = "stacked"
3111
3583
  }) {
3112
- const stateBadge = stateLabels[state];
3113
- const resolvedRemoveAction = removeAction ?? (onRemove ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Button, { type: "button", variant: "light", color: "red", onClick: onRemove, children: "Remove" }) : null);
3114
- const resolvedResetAction = resetAction ?? (onReset ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Button, { type: "button", variant: "default", onClick: onReset, children: "Reset" }) : null);
3115
- return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
3584
+ const resolvedState = readonly ? "readonly" : state;
3585
+ const stateBadge = stateLabels[resolvedState];
3586
+ const resolvedRemoveAction = removeAction ?? (!readonly && onRemove ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Button, { type: "button", variant: "light", color: "red", onClick: onRemove, children: "Remove" }) : null);
3587
+ const resolvedResetAction = resetAction ?? (!readonly && onReset ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Button, { type: "button", variant: "default", onClick: onReset, children: "Reset" }) : null);
3588
+ const boundedProgress = typeof progress === "number" ? Math.max(0, Math.min(100, progress)) : void 0;
3589
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
3116
3590
  FormField,
3117
3591
  {
3118
3592
  label,
3119
3593
  description,
3120
3594
  error,
3121
- children: /* @__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: [
3122
- /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Group, { justify: "flex-end", align: "center", gap: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_core47.Group, { gap: "xs", justify: "flex-end", children: [
3123
- /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Badge, { variant: "light", color: stateBadge.color, children: stateBadge.label }),
3595
+ children: /* @__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: "md", children: [
3596
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Group, { justify: "flex-end", align: "center", gap: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_core49.Group, { gap: "xs", justify: "flex-end", children: [
3597
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Badge, { variant: "light", color: stateBadge.color, children: stateBadge.label }),
3124
3598
  statusAction
3125
3599
  ] }) }),
3126
3600
  preview ? preview : null,
3127
- uploadControl || urlInput ? /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_jsx_runtime49.Fragment, { children: [
3128
- /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Divider, {}),
3129
- /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_core47.Stack, { gap: "sm", style: mode === "split" ? { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))" } : void 0, children: [
3601
+ typeof boundedProgress === "number" ? /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_core49.Stack, { gap: 4, children: [
3602
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Progress, { value: boundedProgress, "aria-label": "Upload progress" }),
3603
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_core49.Text, { size: "xs", c: "dimmed", children: [
3604
+ boundedProgress,
3605
+ "% complete"
3606
+ ] })
3607
+ ] }) : null,
3608
+ (uploadControl || urlInput) && !readonly ? /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_jsx_runtime51.Fragment, { children: [
3609
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Divider, {}),
3610
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_core49.Stack, { gap: "sm", style: mode === "split" ? { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))" } : void 0, children: [
3130
3611
  uploadControl,
3131
3612
  urlInput
3132
3613
  ] })
3133
3614
  ] }) : null,
3134
- value ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Text, { size: "sm", c: "dimmed", style: { wordBreak: "break-all" }, children: value }) : null,
3135
- helpText ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Text, { size: "sm", c: "dimmed", children: helpText }) : null,
3136
- policyText ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core47.Text, { size: "sm", c: error ? "red.7" : "dimmed", children: policyText }) : null,
3615
+ value ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Text, { size: "sm", c: "dimmed", style: { wordBreak: "break-all" }, children: value }) : null,
3616
+ helpText ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Text, { size: "sm", c: "dimmed", children: helpText }) : null,
3617
+ acceptedTypes || maxSize ? /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_core49.Group, { gap: "xs", wrap: "wrap", children: [
3618
+ acceptedTypes ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Badge, { variant: "outline", color: "gray", children: acceptedTypes }) : null,
3619
+ maxSize ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Badge, { variant: "outline", color: "gray", children: maxSize }) : null
3620
+ ] }) : null,
3621
+ policyText ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Text, { size: "sm", c: error ? "red.7" : "dimmed", children: policyText }) : null,
3137
3622
  typeof error !== "string" && error ? error : null,
3138
- resolvedRemoveAction || resolvedResetAction ? /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_core47.Group, { gap: "sm", children: [
3623
+ replaceAction || resolvedRemoveAction || resolvedResetAction || retryAction ? /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_core49.Group, { gap: "sm", children: [
3624
+ replaceAction,
3139
3625
  resolvedResetAction,
3140
3626
  retryAction,
3141
3627
  resolvedRemoveAction
@@ -3146,53 +3632,68 @@ function MediaField({
3146
3632
  }
3147
3633
 
3148
3634
  // src/MediaCard.tsx
3149
- var import_core48 = require("@mantine/core");
3150
- var import_jsx_runtime50 = require("react/jsx-runtime");
3635
+ var import_core50 = require("@mantine/core");
3636
+ var import_jsx_runtime52 = require("react/jsx-runtime");
3151
3637
  function MediaCard({ title, image, description, status, overlay, actions = [] }) {
3152
3638
  const EyeIcon = GdsIcons.Eye;
3153
- return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core48.Card, { withBorder: true, radius: "lg", padding: "md", children: [
3154
- /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core48.Card.Section, { pos: "relative", children: [
3639
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_core50.Card, { withBorder: true, radius: "lg", padding: "md", children: [
3640
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_core50.Card.Section, { pos: "relative", children: [
3155
3641
  image,
3156
- overlay ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("div", { style: { position: "absolute", inset: 12, display: "flex", justifyContent: "flex-end", alignItems: "flex-start" }, children: overlay }) : null
3642
+ overlay ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { style: { position: "absolute", inset: 12, display: "flex", justifyContent: "flex-end", alignItems: "flex-start" }, children: overlay }) : null
3157
3643
  ] }),
3158
- /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core48.Stack, { gap: "sm", mt: "md", children: [
3159
- /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core48.Group, { justify: "space-between", align: "flex-start", children: [
3160
- /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core48.Stack, { gap: 4, children: [
3161
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Title, { order: 4, children: title }),
3162
- description ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Text, { size: "sm", c: "dimmed", lineClamp: 2, children: description }) : null
3644
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_core50.Stack, { gap: "sm", mt: "md", children: [
3645
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_core50.Group, { justify: "space-between", align: "flex-start", children: [
3646
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_core50.Stack, { gap: 4, children: [
3647
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_core50.Title, { order: 4, children: title }),
3648
+ description ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_core50.Text, { size: "sm", c: "dimmed", lineClamp: 2, children: description }) : null
3163
3649
  ] }),
3164
- status ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Badge, { variant: "light", children: status }) : null
3650
+ status ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_core50.Badge, { variant: "light", children: status }) : null
3165
3651
  ] }),
3166
- actions.length ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Group, { justify: "flex-end", gap: "xs", children: actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.ActionIcon, { variant: "light", "aria-label": action.label, onClick: action.onClick, children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(EyeIcon, { size: "1rem" }) }, action.label)) }) : null
3652
+ actions.length ? /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_core50.Group, { justify: "flex-end", gap: "xs", children: actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_core50.ActionIcon, { variant: "light", "aria-label": action.label, onClick: action.onClick, children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(EyeIcon, { size: "1rem" }) }, action.label)) }) : null
3167
3653
  ] })
3168
3654
  ] });
3169
3655
  }
3170
3656
 
3171
3657
  // src/AccessSummary.tsx
3172
- var import_core49 = require("@mantine/core");
3173
- var import_jsx_runtime51 = require("react/jsx-runtime");
3174
- function AccessSummary({ title, roles, scope, blocked = false, description }) {
3175
- return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Card, { withBorder: true, radius: "lg", padding: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_core49.Stack, { gap: "sm", children: [
3176
- /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_core49.Group, { justify: "space-between", align: "center", children: [
3177
- /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Title, { order: 4, children: title }),
3178
- /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Badge, { color: blocked ? "red" : "teal", variant: "light", children: blocked ? "Blocked" : "Allowed" })
3658
+ var import_core51 = require("@mantine/core");
3659
+ var import_jsx_runtime53 = require("react/jsx-runtime");
3660
+ var accessStateMeta = {
3661
+ allowed: { label: "Allowed", color: "teal" },
3662
+ blocked: { label: "Blocked", color: "red" },
3663
+ forbidden: { label: "Forbidden", color: "red" },
3664
+ expired: { label: "Expired", color: "orange" },
3665
+ "permission-limited": { label: "Permission limited", color: "grape" }
3666
+ };
3667
+ function AccessSummary({ title, roles, scope, blocked = false, state, owner, recoveryHint, description }) {
3668
+ const resolvedState = state ?? (blocked ? "blocked" : "allowed");
3669
+ const meta = accessStateMeta[resolvedState];
3670
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_core51.Card, { withBorder: true, radius: "lg", padding: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_core51.Stack, { gap: "sm", children: [
3671
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_core51.Group, { justify: "space-between", align: "center", children: [
3672
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_core51.Title, { order: 4, children: title }),
3673
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_core51.Badge, { color: meta.color, variant: "light", children: meta.label })
3179
3674
  ] }),
3180
- /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Group, { gap: "xs", children: roles.map((role) => /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Badge, { variant: "outline", children: role }, role)) }),
3181
- scope ? /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_core49.Text, { size: "sm", c: "dimmed", children: [
3675
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_core51.Group, { gap: "xs", children: roles.map((role) => /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_core51.Badge, { variant: "outline", children: role }, role)) }),
3676
+ scope ? /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_core51.Text, { size: "sm", c: "dimmed", children: [
3182
3677
  "Scope: ",
3183
3678
  scope
3184
3679
  ] }) : null,
3185
- description ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Text, { size: "sm", children: description }) : null
3680
+ owner ? /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_core51.Text, { size: "sm", c: "dimmed", children: [
3681
+ "Owner: ",
3682
+ owner
3683
+ ] }) : null,
3684
+ recoveryHint ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_core51.Text, { size: "sm", c: resolvedState === "allowed" ? "dimmed" : "red.7", children: recoveryHint }) : null,
3685
+ description ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_core51.Text, { size: "sm", children: description }) : null
3186
3686
  ] }) });
3187
3687
  }
3188
3688
 
3189
3689
  // src/AccessRecoveryPanel.tsx
3190
- var import_core50 = require("@mantine/core");
3690
+ var import_core52 = require("@mantine/core");
3191
3691
  var import_gds_theme5 = require("@doneisbetter/gds-theme");
3192
- var import_jsx_runtime52 = require("react/jsx-runtime");
3692
+ var import_jsx_runtime54 = require("react/jsx-runtime");
3193
3693
  var stateBlockVariantByState = {
3194
3694
  unauthenticated: "permission",
3195
3695
  "expired-session": "info",
3696
+ timeout: "error",
3196
3697
  forbidden: "permission",
3197
3698
  missing: "error",
3198
3699
  unavailable: "error"
@@ -3206,6 +3707,10 @@ var defaultCopyByState = {
3206
3707
  title: "Session expired",
3207
3708
  description: "Sign in again or retry to continue where you left off."
3208
3709
  },
3710
+ timeout: {
3711
+ title: "Request timed out",
3712
+ description: "The recovery action took too long. Retry or choose a safe destination."
3713
+ },
3209
3714
  forbidden: {
3210
3715
  title: "You do not have access",
3211
3716
  description: "This content is outside your current permissions or scope."
@@ -3237,6 +3742,12 @@ function defaultActionsForState(state, {
3237
3742
  secondary: retryAction && signInAction ? retryAction : backAction,
3238
3743
  tertiary: supportAction ?? null
3239
3744
  };
3745
+ case "timeout":
3746
+ return {
3747
+ primary: retryAction ?? backAction,
3748
+ secondary: retryAction && backAction ? backAction : supportAction ?? null,
3749
+ tertiary: retryAction && backAction ? supportAction ?? null : null
3750
+ };
3240
3751
  case "forbidden":
3241
3752
  return { primary: backAction, secondary: supportAction ?? null, tertiary: null };
3242
3753
  case "missing":
@@ -3258,7 +3769,7 @@ function ActionGroup({
3258
3769
  if (actions.length === 0) {
3259
3770
  return null;
3260
3771
  }
3261
- return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_core50.Group, { gap: "sm", justify: "center", wrap: "wrap", children: actions.map((actionConfig, index) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
3772
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_core52.Group, { gap: "sm", justify: "center", wrap: "wrap", children: actions.map((actionConfig, index) => /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
3262
3773
  SemanticButton,
3263
3774
  {
3264
3775
  action: actionConfig.action,
@@ -3292,14 +3803,14 @@ function AccessRecoveryPanel({
3292
3803
  onBack,
3293
3804
  supportAction
3294
3805
  });
3295
- return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
3806
+ return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
3296
3807
  StateBlock,
3297
3808
  {
3298
3809
  variant: stateBlockVariantByState[state],
3299
3810
  compact,
3300
3811
  title: title ?? t(`gds.accessRecovery.${state}.title`, defaultCopy.title),
3301
3812
  description: description ?? t(`gds.accessRecovery.${state}.description`, defaultCopy.description),
3302
- action: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
3813
+ action: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
3303
3814
  ActionGroup,
3304
3815
  {
3305
3816
  primaryAction: primaryAction ?? defaults.primary,
@@ -3312,8 +3823,8 @@ function AccessRecoveryPanel({
3312
3823
  }
3313
3824
 
3314
3825
  // src/PageHeader.tsx
3315
- var import_core51 = require("@mantine/core");
3316
- var import_jsx_runtime53 = require("react/jsx-runtime");
3826
+ var import_core53 = require("@mantine/core");
3827
+ var import_jsx_runtime55 = require("react/jsx-runtime");
3317
3828
  function PageHeader({
3318
3829
  title,
3319
3830
  description,
@@ -3324,19 +3835,19 @@ function PageHeader({
3324
3835
  }) {
3325
3836
  const resolvedDescription = description ?? subtitle;
3326
3837
  const eyebrowProps = eyebrowVariant === "ornamental" ? { tt: "uppercase", style: { letterSpacing: "0.12em" } } : {};
3327
- return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_core51.Group, { justify: "space-between", align: "flex-start", gap: "lg", wrap: "wrap", children: [
3328
- /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_core51.Stack, { gap: "xs", children: [
3329
- eyebrow && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_core51.Text, { size: "xs", fw: 700, c: "dimmed", ...eyebrowProps, children: eyebrow }),
3330
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_core51.Title, { order: 1, children: title }),
3331
- resolvedDescription && /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_core51.Text, { c: "dimmed", maw: 720, children: resolvedDescription })
3838
+ return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(import_core53.Group, { justify: "space-between", align: "flex-start", gap: "lg", wrap: "wrap", children: [
3839
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(import_core53.Stack, { gap: "xs", children: [
3840
+ eyebrow && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_core53.Text, { size: "xs", fw: 700, c: "dimmed", ...eyebrowProps, children: eyebrow }),
3841
+ /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_core53.Title, { order: 1, children: title }),
3842
+ resolvedDescription && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_core53.Text, { c: "dimmed", maw: 720, children: resolvedDescription })
3332
3843
  ] }),
3333
- actions ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_core51.Box, { children: actions }) : null
3844
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_core53.Box, { children: actions }) : null
3334
3845
  ] });
3335
3846
  }
3336
3847
 
3337
3848
  // src/FilterDrawer.tsx
3338
- var import_core52 = require("@mantine/core");
3339
- var import_jsx_runtime54 = require("react/jsx-runtime");
3849
+ var import_core54 = require("@mantine/core");
3850
+ var import_jsx_runtime56 = require("react/jsx-runtime");
3340
3851
  function FilterDrawer({
3341
3852
  opened,
3342
3853
  onClose,
@@ -3352,8 +3863,8 @@ function FilterDrawer({
3352
3863
  }) {
3353
3864
  const resolvedPrimaryAction = applyAction ?? primaryAction;
3354
3865
  const resolvedSecondaryAction = resetAction ?? secondaryAction;
3355
- return /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
3356
- import_core52.Drawer,
3866
+ return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
3867
+ import_core54.Drawer,
3357
3868
  {
3358
3869
  opened,
3359
3870
  onClose,
@@ -3361,11 +3872,11 @@ function FilterDrawer({
3361
3872
  position: mode === "bottom-sheet" ? "bottom" : "right",
3362
3873
  size: mode === "bottom-sheet" ? "auto" : "md",
3363
3874
  radius: mode === "bottom-sheet" ? "xl" : void 0,
3364
- children: /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_core52.Stack, { gap: "md", children: [
3365
- description ? /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_core52.Text, { size: "sm", c: "dimmed", children: description }) : null,
3875
+ children: /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(import_core54.Stack, { gap: "md", children: [
3876
+ description ? /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_core54.Text, { size: "sm", c: "dimmed", children: description }) : null,
3366
3877
  children,
3367
- resolvedPrimaryAction || resolvedSecondaryAction || closeAction ? /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_core52.Group, { justify: "space-between", mt: "md", children: [
3368
- /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_core52.Group, { gap: "sm", children: [
3878
+ resolvedPrimaryAction || resolvedSecondaryAction || closeAction ? /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(import_core54.Group, { justify: "space-between", mt: "md", children: [
3879
+ /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(import_core54.Group, { gap: "sm", children: [
3369
3880
  closeAction,
3370
3881
  resolvedSecondaryAction
3371
3882
  ] }),
@@ -3377,8 +3888,8 @@ function FilterDrawer({
3377
3888
  }
3378
3889
 
3379
3890
  // src/PlaceholderPanel.tsx
3380
- var import_core53 = require("@mantine/core");
3381
- var import_jsx_runtime55 = require("react/jsx-runtime");
3891
+ var import_core55 = require("@mantine/core");
3892
+ var import_jsx_runtime57 = require("react/jsx-runtime");
3382
3893
  function PlaceholderPanel({
3383
3894
  title,
3384
3895
  description,
@@ -3388,16 +3899,16 @@ function PlaceholderPanel({
3388
3899
  mode
3389
3900
  }) {
3390
3901
  if (mode === "live" && children) {
3391
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_jsx_runtime55.Fragment, { children });
3902
+ return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_jsx_runtime57.Fragment, { children });
3392
3903
  }
3393
- return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_core53.Card, { children: /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(import_core53.Stack, { gap: "md", children: [
3394
- badge ? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_core53.Badge, { variant: "light", color: "blue", w: "fit-content", children: badge }) : null,
3395
- /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(import_core53.Stack, { gap: "xs", children: [
3396
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_core53.Title, { order: 4, children: title }),
3397
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_core53.Text, { c: "dimmed", children: description })
3904
+ return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_core55.Card, { children: /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_core55.Stack, { gap: "md", children: [
3905
+ badge ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_core55.Badge, { variant: "light", color: "blue", w: "fit-content", children: badge }) : null,
3906
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_core55.Stack, { gap: "xs", children: [
3907
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_core55.Title, { order: 4, children: title }),
3908
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_core55.Text, { c: "dimmed", children: description })
3398
3909
  ] }),
3399
- footer ? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_core53.Text, { size: "sm", children: footer }) : null,
3400
- /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
3910
+ footer ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_core55.Text, { size: "sm", children: footer }) : null,
3911
+ /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
3401
3912
  StateBlock,
3402
3913
  {
3403
3914
  variant: "not-enough-data",
@@ -3410,8 +3921,8 @@ function PlaceholderPanel({
3410
3921
  }
3411
3922
 
3412
3923
  // src/SimpleDataTable.tsx
3413
- var import_core54 = require("@mantine/core");
3414
- var import_jsx_runtime56 = require("react/jsx-runtime");
3924
+ var import_core56 = require("@mantine/core");
3925
+ var import_jsx_runtime58 = require("react/jsx-runtime");
3415
3926
  function SimpleDataTable({
3416
3927
  columns,
3417
3928
  rows,
@@ -3422,23 +3933,23 @@ function SimpleDataTable({
3422
3933
  getRowKey
3423
3934
  }) {
3424
3935
  if (error) {
3425
- return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(StateBlock, { variant: "error", title: "Unable to load data", description: error, compact: true });
3936
+ return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(StateBlock, { variant: "error", title: "Unable to load data", description: error, compact: true });
3426
3937
  }
3427
3938
  if (loading) {
3428
- return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(StateBlock, { variant: "loading", title: "Loading data", description: "Please wait while the shared dataset is prepared.", compact: true });
3939
+ return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(StateBlock, { variant: "loading", title: "Loading data", description: "Please wait while the shared dataset is prepared.", compact: true });
3429
3940
  }
3430
3941
  if (!rows.length) {
3431
- return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(StateBlock, { variant: "empty", title: emptyTitle, description: emptyDescription, compact: true });
3942
+ return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(StateBlock, { variant: "empty", title: emptyTitle, description: emptyDescription, compact: true });
3432
3943
  }
3433
- return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_core54.ScrollArea, { children: /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(import_core54.Table, { striped: true, highlightOnHover: true, withTableBorder: true, withColumnBorders: true, children: [
3434
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_core54.Table.Thead, { children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_core54.Table.Tr, { children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_core54.Table.Th, { children: column.header }, String(column.key))) }) }),
3435
- /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_core54.Table.Tbody, { children: rows.map((row, index) => /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_core54.Table.Tr, { children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_core54.Table.Td, { children: column.render ? column.render(row) : String(row[column.key] ?? "") }, String(column.key))) }, getRowKey ? getRowKey(row, index) : index)) })
3944
+ return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_core56.ScrollArea, { children: /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_core56.Table, { striped: true, highlightOnHover: true, withTableBorder: true, withColumnBorders: true, children: [
3945
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_core56.Table.Thead, { children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_core56.Table.Tr, { children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_core56.Table.Th, { children: column.header }, String(column.key))) }) }),
3946
+ /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_core56.Table.Tbody, { children: rows.map((row, index) => /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_core56.Table.Tr, { children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_core56.Table.Td, { children: column.render ? column.render(row) : String(row[column.key] ?? "") }, String(column.key))) }, getRowKey ? getRowKey(row, index) : index)) })
3436
3947
  ] }) });
3437
3948
  }
3438
3949
 
3439
3950
  // src/StatsSection.tsx
3440
- var import_core55 = require("@mantine/core");
3441
- var import_jsx_runtime57 = require("react/jsx-runtime");
3951
+ var import_core57 = require("@mantine/core");
3952
+ var import_jsx_runtime59 = require("react/jsx-runtime");
3442
3953
  function StatsSection({
3443
3954
  title,
3444
3955
  loading = false,
@@ -3450,11 +3961,11 @@ function StatsSection({
3450
3961
  }) {
3451
3962
  let content = children;
3452
3963
  if (error) {
3453
- content = /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(StateBlock, { variant: "error", title: "Unable to load statistics", description: error, compact: true });
3964
+ content = /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(StateBlock, { variant: "error", title: "Unable to load statistics", description: error, compact: true });
3454
3965
  } else if (loading) {
3455
- content = /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(StateBlock, { variant: "loading", title: "Loading statistics", description: "This shared data surface is still synchronizing.", compact: true });
3966
+ content = /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(StateBlock, { variant: "loading", title: "Loading statistics", description: "This shared data surface is still synchronizing.", compact: true });
3456
3967
  } else if (belowThreshold) {
3457
- content = /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
3968
+ content = /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
3458
3969
  StateBlock,
3459
3970
  {
3460
3971
  variant: "not-enough-data",
@@ -3464,14 +3975,210 @@ function StatsSection({
3464
3975
  }
3465
3976
  );
3466
3977
  } else if (placeholder) {
3467
- content = /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(PlaceholderPanel, { ...placeholder, mode: "placeholder" });
3978
+ content = /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(PlaceholderPanel, { ...placeholder, mode: "placeholder" });
3468
3979
  }
3469
- return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_core55.Stack, { gap: "md", children: [
3470
- /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_core55.Title, { order: 3, children: title }),
3980
+ return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(import_core57.Stack, { gap: "md", children: [
3981
+ /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_core57.Title, { order: 3, children: title }),
3471
3982
  content
3472
3983
  ] });
3473
3984
  }
3474
3985
 
3986
+ // src/PeriodSelector.tsx
3987
+ var import_core58 = require("@mantine/core");
3988
+ var import_jsx_runtime60 = require("react/jsx-runtime");
3989
+ function PeriodSelector({
3990
+ label,
3991
+ description,
3992
+ value,
3993
+ options,
3994
+ onChange,
3995
+ timezone,
3996
+ scope,
3997
+ helperText,
3998
+ error,
3999
+ stale = false,
4000
+ filtered = false,
4001
+ disabled = false
4002
+ }) {
4003
+ const selectedOption = options.find((option) => option.value === value);
4004
+ return /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(FormField, { label, description, error, children: /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(import_core58.Stack, { gap: "sm", children: [
4005
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
4006
+ "select",
4007
+ {
4008
+ "aria-label": typeof label === "string" ? label : "Reporting period",
4009
+ value,
4010
+ disabled,
4011
+ onChange: (event) => onChange?.(event.currentTarget.value),
4012
+ children: options.map((option) => /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("option", { value: option.value, children: option.label }, option.value))
4013
+ }
4014
+ ),
4015
+ /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(import_core58.Group, { gap: "xs", wrap: "wrap", children: [
4016
+ timezone ? /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(import_core58.Badge, { variant: "outline", color: "gray", children: [
4017
+ "Timezone: ",
4018
+ timezone
4019
+ ] }) : null,
4020
+ filtered ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_core58.Badge, { variant: "light", color: "blue", children: "Filtered" }) : null,
4021
+ stale ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_core58.Badge, { variant: "light", color: "orange", children: "Stale data" }) : null,
4022
+ scope ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_core58.Badge, { variant: "outline", color: "gray", children: scope }) : null
4023
+ ] }),
4024
+ selectedOption?.description ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_core58.Text, { size: "sm", c: "dimmed", children: selectedOption.description }) : null,
4025
+ helperText ? /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(import_core58.Text, { size: "sm", c: "dimmed", children: helperText }) : null
4026
+ ] }) });
4027
+ }
4028
+
4029
+ // src/EvidencePanel.tsx
4030
+ var import_core59 = require("@mantine/core");
4031
+ var import_jsx_runtime61 = require("react/jsx-runtime");
4032
+ var stateTone2 = {
4033
+ current: { label: "Current", color: "teal" },
4034
+ stale: { label: "Stale", color: "orange" },
4035
+ partial: { label: "Partial data", color: "yellow" },
4036
+ "permission-limited": { label: "Permission limited", color: "grape" },
4037
+ loading: { label: "Loading", color: "blue" },
4038
+ empty: { label: "No evidence", color: "gray" },
4039
+ error: { label: "Needs attention", color: "red" }
4040
+ };
4041
+ function EvidencePanel({
4042
+ title,
4043
+ description,
4044
+ source,
4045
+ freshness,
4046
+ confidence,
4047
+ state = "current",
4048
+ evidenceCount,
4049
+ permissionNote,
4050
+ retryAction,
4051
+ details,
4052
+ children
4053
+ }) {
4054
+ const tone = stateTone2[state];
4055
+ const isProblem = state === "error" || state === "permission-limited" || state === "stale" || state === "partial";
4056
+ return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_core59.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_core59.Stack, { gap: "md", children: [
4057
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_core59.Group, { justify: "space-between", align: "flex-start", gap: "sm", children: [
4058
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_core59.Stack, { gap: 4, children: [
4059
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_core59.Title, { order: 4, children: title }),
4060
+ description ? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_core59.Text, { size: "sm", c: "dimmed", children: description }) : null
4061
+ ] }),
4062
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_core59.Badge, { variant: "light", color: tone.color, children: tone.label })
4063
+ ] }),
4064
+ /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_core59.Group, { gap: "xs", wrap: "wrap", children: [
4065
+ source ? /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_core59.Badge, { variant: "outline", color: "gray", children: [
4066
+ "Source: ",
4067
+ source
4068
+ ] }) : null,
4069
+ freshness ? /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_core59.Badge, { variant: "outline", color: "gray", children: [
4070
+ "Freshness: ",
4071
+ freshness
4072
+ ] }) : null,
4073
+ confidence ? /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_core59.Badge, { variant: "outline", color: "gray", children: [
4074
+ "Confidence: ",
4075
+ confidence
4076
+ ] }) : null,
4077
+ typeof evidenceCount === "number" ? /* @__PURE__ */ (0, import_jsx_runtime61.jsxs)(import_core59.Badge, { variant: "outline", color: "gray", children: [
4078
+ "Evidence: ",
4079
+ evidenceCount
4080
+ ] }) : null
4081
+ ] }),
4082
+ permissionNote ? /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_core59.Alert, { color: isProblem ? tone.color : "gray", variant: "light", children: permissionNote }) : null,
4083
+ details,
4084
+ children,
4085
+ retryAction
4086
+ ] }) });
4087
+ }
4088
+
4089
+ // src/ChartTokenPanel.tsx
4090
+ var import_core60 = require("@mantine/core");
4091
+ var import_jsx_runtime62 = require("react/jsx-runtime");
4092
+ function ChartTokenPanel({
4093
+ title,
4094
+ description,
4095
+ summary,
4096
+ state = "ready",
4097
+ legend = [],
4098
+ children,
4099
+ tableFallback,
4100
+ retryAction
4101
+ }) {
4102
+ if (state === "loading") {
4103
+ return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(StateBlock, { variant: "loading", title: "Loading chart", description: summary, compact: true, action: retryAction });
4104
+ }
4105
+ if (state === "empty") {
4106
+ return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(StateBlock, { variant: "empty", title: "No chart data", description: summary, compact: true, action: retryAction });
4107
+ }
4108
+ if (state === "below-threshold") {
4109
+ return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(StateBlock, { variant: "not-enough-data", title: "Not enough data for chart", description: summary, compact: true, action: retryAction });
4110
+ }
4111
+ if (state === "error") {
4112
+ return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(StateBlock, { variant: "error", title: "Unable to load chart", description: summary, compact: true, action: retryAction });
4113
+ }
4114
+ return /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_core60.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_core60.Stack, { gap: "md", children: [
4115
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_core60.Group, { justify: "space-between", align: "flex-start", gap: "sm", children: [
4116
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_core60.Stack, { gap: 4, children: [
4117
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_core60.Title, { order: 4, children: title }),
4118
+ description ? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_core60.Text, { size: "sm", c: "dimmed", children: description }) : null
4119
+ ] }),
4120
+ state !== "ready" ? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_core60.Badge, { variant: "light", color: state === "permission-limited" ? "grape" : "yellow", children: state.replace("-", " ") }) : null
4121
+ ] }),
4122
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_core60.Text, { size: "sm", children: summary }),
4123
+ legend.length ? /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_core60.Group, { gap: "xs", wrap: "wrap", "aria-label": "Chart legend", children: legend.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_core60.Badge, { variant: "outline", color: "gray", title: typeof item.description === "string" ? item.description : void 0, children: [
4124
+ item.label,
4125
+ ": ",
4126
+ item.token
4127
+ ] }, `${String(item.label)}-${index}`)) }) : null,
4128
+ children,
4129
+ tableFallback ? /* @__PURE__ */ (0, import_jsx_runtime62.jsxs)(import_core60.Stack, { gap: "xs", children: [
4130
+ /* @__PURE__ */ (0, import_jsx_runtime62.jsx)(import_core60.Text, { size: "sm", fw: 600, children: "Accessible data fallback" }),
4131
+ tableFallback
4132
+ ] }) : null
4133
+ ] }) });
4134
+ }
4135
+
4136
+ // src/ReportingSection.tsx
4137
+ var import_core61 = require("@mantine/core");
4138
+ var import_jsx_runtime63 = require("react/jsx-runtime");
4139
+ function ReportingSection({
4140
+ title,
4141
+ description,
4142
+ state = "ready",
4143
+ periodControl,
4144
+ evidence,
4145
+ metrics,
4146
+ chart,
4147
+ table,
4148
+ action,
4149
+ stateMessage,
4150
+ retryAction
4151
+ }) {
4152
+ let stateBlock = null;
4153
+ if (state === "loading") {
4154
+ stateBlock = /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(StateBlock, { variant: "loading", title: "Loading report", description: stateMessage ?? "The reporting surface is synchronizing.", compact: true });
4155
+ } else if (state === "empty") {
4156
+ stateBlock = /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(StateBlock, { variant: "empty", title: "No report data", description: stateMessage ?? "No records match this reporting scope yet.", compact: true });
4157
+ } else if (state === "error") {
4158
+ stateBlock = /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(StateBlock, { variant: "error", title: "Unable to load report", description: stateMessage ?? "The report could not be prepared.", compact: true, action: retryAction });
4159
+ } else if (state === "below-threshold") {
4160
+ stateBlock = /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(StateBlock, { variant: "not-enough-data", title: "Not enough data", description: stateMessage ?? "This report is hidden until the threshold is met.", compact: true });
4161
+ } else if (state === "permission-limited") {
4162
+ stateBlock = /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(StateBlock, { variant: "permission", title: "Permission-limited report", description: stateMessage ?? "Some evidence is hidden by access rules.", compact: true, action: retryAction });
4163
+ }
4164
+ return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_core61.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_core61.Stack, { gap: "lg", children: [
4165
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_core61.Group, { justify: "space-between", align: "flex-start", gap: "md", children: [
4166
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(import_core61.Stack, { gap: 4, children: [
4167
+ /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_core61.Title, { order: 3, children: title }),
4168
+ description ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(import_core61.Text, { size: "sm", c: "dimmed", children: description }) : null
4169
+ ] }),
4170
+ action
4171
+ ] }),
4172
+ periodControl,
4173
+ (state === "partial" || state === "stale" || state === "filtered") && stateMessage ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(StateBlock, { variant: "info", title: state === "partial" ? "Partial report" : state === "stale" ? "Stale report" : "Filtered report", description: stateMessage, compact: true }) : null,
4174
+ stateBlock,
4175
+ metrics,
4176
+ chart,
4177
+ table,
4178
+ evidence
4179
+ ] }) });
4180
+ }
4181
+
3475
4182
  // src/locales/ar.ts
3476
4183
  var ar = {
3477
4184
  "gds.action.settings": "\u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A",
@@ -4783,6 +5490,7 @@ function getGdsMessages(locale) {
4783
5490
  ArticleShell,
4784
5491
  AuthShell,
4785
5492
  BrowseSurface,
5493
+ ChartTokenPanel,
4786
5494
  ChoiceChip,
4787
5495
  ConfirmDialog,
4788
5496
  ConsumerDashboardGrid,
@@ -4793,9 +5501,11 @@ function getGdsMessages(locale) {
4793
5501
  DiscoveryShell,
4794
5502
  DocsCodeBlock,
4795
5503
  DocsPageShell,
5504
+ DocsShell,
4796
5505
  EditorialCard,
4797
5506
  EditorialHero,
4798
5507
  EmptyState,
5508
+ EvidencePanel,
4799
5509
  FeatureBand,
4800
5510
  FilterDrawer,
4801
5511
  FoodMenuSection,
@@ -4808,11 +5518,15 @@ function getGdsMessages(locale) {
4808
5518
  MediaCard,
4809
5519
  MediaField,
4810
5520
  MetricCard,
5521
+ PROVIDER_IDENTITY_REGISTRY,
4811
5522
  PageHeader,
5523
+ PeriodSelector,
4812
5524
  PlaceholderPanel,
4813
5525
  PlaybackSurface,
4814
5526
  ProductCard,
4815
5527
  ProgressCard,
5528
+ ProviderIdentityButton,
5529
+ ProviderIdentityButtonGroup,
4816
5530
  PublicBrandFooter,
4817
5531
  PublicFlowShell,
4818
5532
  PublicFoodCard,
@@ -4824,6 +5538,7 @@ function getGdsMessages(locale) {
4824
5538
  ReferenceLocaleNotice,
4825
5539
  ReferenceSection,
4826
5540
  ReferenceThemeExplorer,
5541
+ ReportingSection,
4827
5542
  SectionPanel,
4828
5543
  SemanticButton,
4829
5544
  ShareButtonGroup,
@@ -4845,13 +5560,18 @@ function getGdsMessages(locale) {
4845
5560
  fr,
4846
5561
  gdsLocales,
4847
5562
  getGdsMessages,
5563
+ getProviderIdentityLabel,
5564
+ getProviderIdentityPolicy,
4848
5565
  getSemanticActionConfig,
4849
5566
  getSemanticActionLabel,
5567
+ getSupportedProviderIdentityIds,
4850
5568
  he,
4851
5569
  hu,
5570
+ isPresentationMode,
4852
5571
  it,
4853
5572
  mergeGdsVocabularyPacks,
4854
5573
  resolveAccentPanelStyles,
4855
5574
  resolveSemanticActionConfig,
5575
+ resolveSurfacePresentationStyles,
4856
5576
  ru
4857
5577
  });