@doneisbetter/gds-core 2.6.7 → 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,
@@ -41,6 +42,7 @@ __export(index_exports, {
41
42
  EditorialCard: () => EditorialCard,
42
43
  EditorialHero: () => EditorialHero,
43
44
  EmptyState: () => EmptyState,
45
+ EvidencePanel: () => EvidencePanel,
44
46
  FeatureBand: () => FeatureBand,
45
47
  FilterDrawer: () => FilterDrawer,
46
48
  FoodMenuSection: () => FoodMenuSection,
@@ -55,6 +57,7 @@ __export(index_exports, {
55
57
  MetricCard: () => MetricCard,
56
58
  PROVIDER_IDENTITY_REGISTRY: () => PROVIDER_IDENTITY_REGISTRY,
57
59
  PageHeader: () => PageHeader,
60
+ PeriodSelector: () => PeriodSelector,
58
61
  PlaceholderPanel: () => PlaceholderPanel,
59
62
  PlaybackSurface: () => PlaybackSurface,
60
63
  ProductCard: () => ProductCard,
@@ -72,6 +75,7 @@ __export(index_exports, {
72
75
  ReferenceLocaleNotice: () => ReferenceLocaleNotice,
73
76
  ReferenceSection: () => ReferenceSection,
74
77
  ReferenceThemeExplorer: () => ReferenceThemeExplorer,
78
+ ReportingSection: () => ReportingSection,
75
79
  SectionPanel: () => SectionPanel,
76
80
  SemanticButton: () => SemanticButton,
77
81
  ShareButtonGroup: () => ShareButtonGroup,
@@ -94,8 +98,10 @@ __export(index_exports, {
94
98
  gdsLocales: () => gdsLocales,
95
99
  getGdsMessages: () => getGdsMessages,
96
100
  getProviderIdentityLabel: () => getProviderIdentityLabel,
101
+ getProviderIdentityPolicy: () => getProviderIdentityPolicy,
97
102
  getSemanticActionConfig: () => getSemanticActionConfig,
98
103
  getSemanticActionLabel: () => getSemanticActionLabel,
104
+ getSupportedProviderIdentityIds: () => getSupportedProviderIdentityIds,
99
105
  he: () => he,
100
106
  hu: () => hu,
101
107
  isPresentationMode: () => isPresentationMode,
@@ -979,6 +985,23 @@ var themePresetCatalog = {
979
985
  avoidFor: "Avoid for local style experiments or temporary visual fixes without compliance approval."
980
986
  }
981
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
+ ];
982
1005
  function ThemePreviewSurface({
983
1006
  preset,
984
1007
  colorScheme,
@@ -1000,6 +1023,10 @@ function ThemePreviewSurface({
1000
1023
  " ",
1001
1024
  colorScheme
1002
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
+ ] }),
1003
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
1004
1031
  ] }),
1005
1032
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ThemeToggle, {})
@@ -1029,7 +1056,8 @@ function ThemePreviewSurface({
1029
1056
  description: "This preview uses the real shipped design-system runtime rather than a docs-only styling lane.",
1030
1057
  metadata: [
1031
1058
  { id: "runtime", label: "Runtime lane", value: preset.themeKey },
1032
- { 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" }
1033
1061
  ],
1034
1062
  primaryAction: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Button, { size: "sm", children: "Inspect route" })
1035
1063
  }
@@ -1146,7 +1174,7 @@ function ReferenceThemeExplorer() {
1146
1174
  ),
1147
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." })
1148
1176
  ] }) }),
1149
- /* @__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: [
1150
1178
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Title, { order: 4, children: "Current selection summary" }),
1151
1179
  /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: 6, children: [
1152
1180
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { fw: 700, children: selectionSummary.label }),
@@ -1213,6 +1241,18 @@ function ReferenceThemeExplorer() {
1213
1241
  ] }) }, lane.themeKey)) })
1214
1242
  }
1215
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
+ ),
1216
1256
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1217
1257
  ReferenceSection,
1218
1258
  {
@@ -1250,18 +1290,34 @@ function ReferenceThemeExplorer() {
1250
1290
  /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1251
1291
  ReferenceSection,
1252
1292
  {
1253
- title: "Creator-Authored Experience Boundary",
1254
- 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.",
1255
1295
  tone: "supporting",
1256
- children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1257
- StateBlock,
1258
- {
1259
- variant: "info",
1260
- title: "Shipped first, custom second",
1261
- description: "The official site uses shipped presets and the public brand generator first. Product-authored overrides must stay reviewable, testable, and scoped.",
1262
- compact: true
1263
- }
1264
- )
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
+ ] })
1265
1321
  }
1266
1322
  )
1267
1323
  ] });
@@ -2411,10 +2467,14 @@ var import_jsx_runtime37 = require("react/jsx-runtime");
2411
2467
  function AuthShell({
2412
2468
  title,
2413
2469
  description,
2470
+ intent = "sign-in",
2414
2471
  brand,
2415
2472
  headerActions,
2416
2473
  footer,
2417
2474
  helper,
2475
+ error,
2476
+ guestAction,
2477
+ supportAction,
2418
2478
  socialAuth,
2419
2479
  dividerLabel = "Or continue with your account",
2420
2480
  children
@@ -2426,12 +2486,18 @@ function AuthShell({
2426
2486
  ] }) : null,
2427
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: [
2428
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("-", " ") }) }),
2429
2490
  /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Title, { order: 2, children: title }),
2430
2491
  description ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Text, { c: "dimmed", size: "sm", children: description }) : null
2431
2492
  ] }),
2493
+ error ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Alert, { color: "red", variant: "light", role: "alert", children: error }) : null,
2432
2494
  socialAuth ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Box, { children: socialAuth }) : null,
2433
2495
  socialAuth ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Divider, { label: dividerLabel, labelPosition: "center" }) : null,
2434
2496
  children,
2497
+ guestAction || supportAction ? /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core35.Group, { justify: "center", gap: "sm", children: [
2498
+ guestAction,
2499
+ supportAction
2500
+ ] }) : null,
2435
2501
  helper ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Text, { size: "sm", c: "dimmed", ta: "center", children: helper }) : null
2436
2502
  ] }) }),
2437
2503
  footer ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core35.Text, { size: "sm", c: "dimmed", ta: "center", children: footer }) : null
@@ -2533,6 +2599,20 @@ function mapVariant(variant = "neutral") {
2533
2599
  function getProviderIdentityLabel(provider, fallbackOverride) {
2534
2600
  return resolveProviderLabel(provider, fallbackOverride);
2535
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
+ }
2536
2616
  function ProviderIdentityMark({ provider }) {
2537
2617
  const meta = getProviderIdentityMeta(provider);
2538
2618
  return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
@@ -2551,10 +2631,13 @@ function ProviderIdentityButton({
2551
2631
  provider,
2552
2632
  label,
2553
2633
  description,
2634
+ policyNote,
2635
+ error,
2554
2636
  href,
2555
2637
  onClick,
2556
2638
  disabled,
2557
2639
  loading,
2640
+ tenantDisabledReason,
2558
2641
  fullWidth = true,
2559
2642
  size = "md",
2560
2643
  variant = "neutral",
@@ -2564,6 +2647,7 @@ function ProviderIdentityButton({
2564
2647
  }) {
2565
2648
  const meta = getProviderIdentityMeta(provider);
2566
2649
  const buttonLabel = resolveProviderLabel(provider, label);
2650
+ const resolvedDisabled = disabled || Boolean(tenantDisabledReason);
2567
2651
  const buttonProps = href ? {
2568
2652
  component: "a",
2569
2653
  href
@@ -2581,13 +2665,16 @@ function ProviderIdentityButton({
2581
2665
  "aria-label": ariaLabel ?? (typeof buttonLabel === "string" ? buttonLabel : void 0),
2582
2666
  "aria-describedby": describedBy,
2583
2667
  leftSection: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(ProviderIdentityMark, { provider }),
2584
- disabled,
2668
+ disabled: resolvedDisabled,
2585
2669
  loading,
2586
2670
  styles: { root: { minHeight: minTouchTargetPx } },
2587
2671
  ...buttonProps,
2588
2672
  children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core36.Stack, { gap: 0, align: "flex-start", children: [
2589
2673
  /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Text, { inherit: true, children: buttonLabel }),
2590
- description ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core36.Text, { size: "xs", c: "dimmed", lh: 1.2, children: description }) : null
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
2591
2678
  ] })
2592
2679
  }
2593
2680
  );
@@ -2622,10 +2709,13 @@ function SocialAuthButtons({
2622
2709
  provider: provider.id,
2623
2710
  label: provider.label,
2624
2711
  description: provider.description,
2712
+ policyNote: provider.policyNote,
2713
+ error: provider.error,
2625
2714
  href: provider.href,
2626
2715
  onClick: provider.onClick,
2627
2716
  disabled: provider.disabled,
2628
2717
  loading: provider.loading,
2718
+ tenantDisabledReason: provider.tenantDisabledReason,
2629
2719
  size: provider.size ?? (compact ? "sm" : "md"),
2630
2720
  variant: provider.variant
2631
2721
  }));
@@ -3363,15 +3453,27 @@ function UploadDropzone({
3363
3453
  description,
3364
3454
  onFilesSelected,
3365
3455
  accept,
3456
+ acceptedTypesLabel,
3457
+ maxSizeLabel,
3366
3458
  multiple = true,
3367
3459
  actionLabel = "Choose files",
3368
- mode = "panel"
3460
+ mode = "panel",
3461
+ state = "idle",
3462
+ selectedFiles = [],
3463
+ error,
3464
+ policyText,
3465
+ retryAction,
3466
+ removeAction,
3467
+ readonly = false
3369
3468
  }) {
3370
3469
  const inputRef = (0, import_react9.useRef)(null);
3371
3470
  const [dragging, setDragging] = (0, import_react9.useState)(false);
3372
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);
3373
3475
  const forwardFiles = (files) => {
3374
- if (!files?.length || !onFilesSelected) {
3476
+ if (isDisabled || !files?.length || !onFilesSelected) {
3375
3477
  return;
3376
3478
  }
3377
3479
  onFilesSelected(Array.from(files));
@@ -3381,6 +3483,9 @@ function UploadDropzone({
3381
3483
  {
3382
3484
  onDragOver: (event) => {
3383
3485
  event.preventDefault();
3486
+ if (isDisabled) {
3487
+ return;
3488
+ }
3384
3489
  setDragging(true);
3385
3490
  },
3386
3491
  onDragLeave: () => setDragging(false),
@@ -3391,10 +3496,11 @@ function UploadDropzone({
3391
3496
  },
3392
3497
  p: mode === "inline" ? "md" : "xl",
3393
3498
  style: {
3394
- 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"})`,
3395
3500
  borderRadius: "var(--mantine-radius-lg)",
3396
- background: dragging ? "var(--mantine-color-violet-light)" : "transparent"
3501
+ background: effectiveState === "drag-active" ? "var(--mantine-color-violet-light)" : "transparent"
3397
3502
  },
3503
+ "aria-invalid": isError || void 0,
3398
3504
  children: [
3399
3505
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
3400
3506
  "input",
@@ -3404,14 +3510,30 @@ function UploadDropzone({
3404
3510
  hidden: true,
3405
3511
  accept,
3406
3512
  multiple,
3513
+ disabled: isDisabled,
3407
3514
  onChange: (event) => forwardFiles(event.currentTarget.files)
3408
3515
  }
3409
3516
  ),
3410
3517
  /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core48.Stack, { align: mode === "inline" ? "flex-start" : "center", ta: mode === "inline" ? "left" : "center", gap: "sm", children: [
3411
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("-", " ") }),
3412
3520
  /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Text, { fw: 600, children: title }),
3413
3521
  description ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Text, { size: "sm", c: "dimmed", children: description }) : null,
3414
- /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core48.Button, { variant: "light", onClick: () => inputRef.current?.click(), children: actionLabel }) })
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
+ ] })
3415
3537
  ] })
3416
3538
  ]
3417
3539
  }
@@ -3423,10 +3545,17 @@ var import_core49 = require("@mantine/core");
3423
3545
  var import_jsx_runtime51 = require("react/jsx-runtime");
3424
3546
  var stateLabels = {
3425
3547
  empty: { label: "Empty", color: "gray" },
3548
+ "drag-active": { label: "Drop to select", color: "violet" },
3426
3549
  selected: { label: "Selected", color: "blue" },
3550
+ "preview-loading": { label: "Preview loading", color: "violet" },
3427
3551
  saved: { label: "Saved", color: "teal" },
3428
3552
  invalid: { label: "Needs attention", color: "red" },
3429
- 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" }
3430
3559
  };
3431
3560
  function MediaField({
3432
3561
  label,
@@ -3439,17 +3568,24 @@ function MediaField({
3439
3568
  policyText,
3440
3569
  error,
3441
3570
  retryAction,
3571
+ replaceAction,
3442
3572
  onRemove,
3443
3573
  onReset,
3444
3574
  removeAction,
3445
3575
  resetAction,
3446
3576
  statusAction,
3577
+ acceptedTypes,
3578
+ maxSize,
3579
+ progress,
3580
+ readonly = false,
3447
3581
  state = "empty",
3448
3582
  mode = "stacked"
3449
3583
  }) {
3450
- const stateBadge = stateLabels[state];
3451
- const resolvedRemoveAction = removeAction ?? (onRemove ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Button, { type: "button", variant: "light", color: "red", onClick: onRemove, children: "Remove" }) : null);
3452
- const resolvedResetAction = resetAction ?? (onReset ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Button, { type: "button", variant: "default", onClick: onReset, children: "Reset" }) : null);
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;
3453
3589
  return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
3454
3590
  FormField,
3455
3591
  {
@@ -3462,7 +3598,14 @@ function MediaField({
3462
3598
  statusAction
3463
3599
  ] }) }),
3464
3600
  preview ? preview : null,
3465
- uploadControl || urlInput ? /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_jsx_runtime51.Fragment, { 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: [
3466
3609
  /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Divider, {}),
3467
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: [
3468
3611
  uploadControl,
@@ -3471,9 +3614,14 @@ function MediaField({
3471
3614
  ] }) : null,
3472
3615
  value ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Text, { size: "sm", c: "dimmed", style: { wordBreak: "break-all" }, children: value }) : null,
3473
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,
3474
3621
  policyText ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core49.Text, { size: "sm", c: error ? "red.7" : "dimmed", children: policyText }) : null,
3475
3622
  typeof error !== "string" && error ? error : null,
3476
- resolvedRemoveAction || resolvedResetAction ? /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_core49.Group, { gap: "sm", children: [
3623
+ replaceAction || resolvedRemoveAction || resolvedResetAction || retryAction ? /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_core49.Group, { gap: "sm", children: [
3624
+ replaceAction,
3477
3625
  resolvedResetAction,
3478
3626
  retryAction,
3479
3627
  resolvedRemoveAction
@@ -3509,17 +3657,31 @@ function MediaCard({ title, image, description, status, overlay, actions = [] })
3509
3657
  // src/AccessSummary.tsx
3510
3658
  var import_core51 = require("@mantine/core");
3511
3659
  var import_jsx_runtime53 = require("react/jsx-runtime");
3512
- function AccessSummary({ title, roles, scope, blocked = false, description }) {
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];
3513
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: [
3514
3671
  /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_core51.Group, { justify: "space-between", align: "center", children: [
3515
3672
  /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_core51.Title, { order: 4, children: title }),
3516
- /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_core51.Badge, { color: blocked ? "red" : "teal", variant: "light", children: blocked ? "Blocked" : "Allowed" })
3673
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_core51.Badge, { color: meta.color, variant: "light", children: meta.label })
3517
3674
  ] }),
3518
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)) }),
3519
3676
  scope ? /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_core51.Text, { size: "sm", c: "dimmed", children: [
3520
3677
  "Scope: ",
3521
3678
  scope
3522
3679
  ] }) : 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,
3523
3685
  description ? /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_core51.Text, { size: "sm", children: description }) : null
3524
3686
  ] }) });
3525
3687
  }
@@ -3531,6 +3693,7 @@ var import_jsx_runtime54 = require("react/jsx-runtime");
3531
3693
  var stateBlockVariantByState = {
3532
3694
  unauthenticated: "permission",
3533
3695
  "expired-session": "info",
3696
+ timeout: "error",
3534
3697
  forbidden: "permission",
3535
3698
  missing: "error",
3536
3699
  unavailable: "error"
@@ -3544,6 +3707,10 @@ var defaultCopyByState = {
3544
3707
  title: "Session expired",
3545
3708
  description: "Sign in again or retry to continue where you left off."
3546
3709
  },
3710
+ timeout: {
3711
+ title: "Request timed out",
3712
+ description: "The recovery action took too long. Retry or choose a safe destination."
3713
+ },
3547
3714
  forbidden: {
3548
3715
  title: "You do not have access",
3549
3716
  description: "This content is outside your current permissions or scope."
@@ -3575,6 +3742,12 @@ function defaultActionsForState(state, {
3575
3742
  secondary: retryAction && signInAction ? retryAction : backAction,
3576
3743
  tertiary: supportAction ?? null
3577
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
+ };
3578
3751
  case "forbidden":
3579
3752
  return { primary: backAction, secondary: supportAction ?? null, tertiary: null };
3580
3753
  case "missing":
@@ -3810,6 +3983,202 @@ function StatsSection({
3810
3983
  ] });
3811
3984
  }
3812
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
+
3813
4182
  // src/locales/ar.ts
3814
4183
  var ar = {
3815
4184
  "gds.action.settings": "\u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A",
@@ -5121,6 +5490,7 @@ function getGdsMessages(locale) {
5121
5490
  ArticleShell,
5122
5491
  AuthShell,
5123
5492
  BrowseSurface,
5493
+ ChartTokenPanel,
5124
5494
  ChoiceChip,
5125
5495
  ConfirmDialog,
5126
5496
  ConsumerDashboardGrid,
@@ -5135,6 +5505,7 @@ function getGdsMessages(locale) {
5135
5505
  EditorialCard,
5136
5506
  EditorialHero,
5137
5507
  EmptyState,
5508
+ EvidencePanel,
5138
5509
  FeatureBand,
5139
5510
  FilterDrawer,
5140
5511
  FoodMenuSection,
@@ -5149,6 +5520,7 @@ function getGdsMessages(locale) {
5149
5520
  MetricCard,
5150
5521
  PROVIDER_IDENTITY_REGISTRY,
5151
5522
  PageHeader,
5523
+ PeriodSelector,
5152
5524
  PlaceholderPanel,
5153
5525
  PlaybackSurface,
5154
5526
  ProductCard,
@@ -5166,6 +5538,7 @@ function getGdsMessages(locale) {
5166
5538
  ReferenceLocaleNotice,
5167
5539
  ReferenceSection,
5168
5540
  ReferenceThemeExplorer,
5541
+ ReportingSection,
5169
5542
  SectionPanel,
5170
5543
  SemanticButton,
5171
5544
  ShareButtonGroup,
@@ -5188,8 +5561,10 @@ function getGdsMessages(locale) {
5188
5561
  gdsLocales,
5189
5562
  getGdsMessages,
5190
5563
  getProviderIdentityLabel,
5564
+ getProviderIdentityPolicy,
5191
5565
  getSemanticActionConfig,
5192
5566
  getSemanticActionLabel,
5567
+ getSupportedProviderIdentityIds,
5193
5568
  he,
5194
5569
  hu,
5195
5570
  isPresentationMode,