@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/{chunk-IUYPELGQ.mjs → chunk-NBCULITN.mjs} +113 -20
- package/dist/{chunk-LH2KMMXT.mjs → chunk-P7ICTEEB.mjs} +299 -23
- package/dist/client.d.mts +15 -5
- package/dist/client.d.ts +15 -5
- package/dist/client.js +403 -28
- package/dist/client.mjs +14 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +403 -28
- package/dist/index.mjs +14 -2
- package/dist/{server-BSuY9Qx6.d.mts → server-woziKWie.d.mts} +105 -6
- package/dist/{server-BSuY9Qx6.d.ts → server-woziKWie.d.ts} +105 -6
- package/dist/server.d.mts +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +292 -10
- package/dist/server.mjs +13 -1
- package/package.json +2 -2
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: "
|
|
1254
|
-
description: "
|
|
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.
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
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(${
|
|
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:
|
|
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.
|
|
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
|
|
3451
|
-
const
|
|
3452
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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,
|