@doneisbetter/gds-core 2.6.3 → 2.6.4

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/client.js CHANGED
@@ -23,6 +23,7 @@ __export(client_exports, {
23
23
  AccentPanel: () => AccentPanel,
24
24
  AccessRecoveryPanel: () => AccessRecoveryPanel,
25
25
  AccessSummary: () => AccessSummary,
26
+ ActionBar: () => ActionBar,
26
27
  ArticleShell: () => ArticleShell,
27
28
  AuthShell: () => AuthShell,
28
29
  BrowseSurface: () => BrowseSurface,
@@ -32,6 +33,8 @@ __export(client_exports, {
32
33
  ConsumerSection: () => ConsumerSection,
33
34
  CtaButtonGroup: () => CtaButtonGroup,
34
35
  DataToolbar: () => DataToolbar,
36
+ DetailProfileShell: () => DetailProfileShell,
37
+ DiscoveryShell: () => DiscoveryShell,
35
38
  DocsCodeBlock: () => DocsCodeBlock,
36
39
  DocsPageShell: () => DocsPageShell,
37
40
  EditorialCard: () => EditorialCard,
@@ -39,31 +42,43 @@ __export(client_exports, {
39
42
  EmptyState: () => EmptyState,
40
43
  FeatureBand: () => FeatureBand,
41
44
  FilterDrawer: () => FilterDrawer,
45
+ FoodMenuSection: () => FoodMenuSection,
42
46
  FormField: () => FormField,
43
47
  GameBoardTile: () => GameBoardTile,
44
48
  GdsIcons: () => GdsIcons,
45
49
  GdsVocabulary: () => GdsVocabulary,
50
+ ListingCard: () => ListingCard,
51
+ MapPanel: () => MapPanel,
46
52
  MediaCard: () => MediaCard,
47
53
  MediaField: () => MediaField,
48
54
  MetricCard: () => MetricCard,
49
55
  PageHeader: () => PageHeader,
50
56
  PlaceholderPanel: () => PlaceholderPanel,
57
+ PlaybackSurface: () => PlaybackSurface,
51
58
  ProductCard: () => ProductCard,
52
59
  ProgressCard: () => ProgressCard,
53
60
  PublicBrandFooter: () => PublicBrandFooter,
61
+ PublicFlowShell: () => PublicFlowShell,
62
+ PublicFoodCard: () => PublicFoodCard,
54
63
  PublicNav: () => PublicNav,
55
64
  PublicProductCard: () => PublicProductCard,
56
65
  PublicShell: () => PublicShell,
57
66
  PublicSiteFooter: () => PublicSiteFooter,
58
67
  SectionPanel: () => SectionPanel,
59
68
  SemanticButton: () => SemanticButton,
69
+ ShareButtonGroup: () => ShareButtonGroup,
70
+ SidebarNav: () => SidebarNav,
71
+ SidebarNavItem: () => SidebarNavItem,
72
+ SidebarNavSection: () => SidebarNavSection,
60
73
  SimpleDataTable: () => SimpleDataTable,
74
+ SocialAuthButtons: () => SocialAuthButtons,
61
75
  StateBlock: () => StateBlock,
62
76
  StatsSection: () => StatsSection,
63
77
  StatusBadge: () => StatusBadge,
64
78
  ThemeToggle: () => ThemeToggle,
65
79
  UploadDropzone: () => UploadDropzone,
66
80
  ar: () => ar,
81
+ createGdsVocabularyPack: () => createGdsVocabularyPack,
67
82
  de: () => de,
68
83
  en: () => en,
69
84
  es: () => es,
@@ -75,7 +90,9 @@ __export(client_exports, {
75
90
  he: () => he,
76
91
  hu: () => hu,
77
92
  it: () => it,
93
+ mergeGdsVocabularyPacks: () => mergeGdsVocabularyPacks,
78
94
  resolveAccentPanelStyles: () => resolveAccentPanelStyles,
95
+ resolveSemanticActionConfig: () => resolveSemanticActionConfig,
79
96
  ru: () => ru
80
97
  });
81
98
  module.exports = __toCommonJS(client_exports);
@@ -225,7 +242,6 @@ var GdsIcons = {
225
242
 
226
243
  // src/vocabulary.ts
227
244
  var GdsVocabulary = {
228
- // Base
229
245
  settings: { id: "gds.action.settings", defaultMessage: "Settings", icon: GdsIcons.Settings, feedback: { icon: GdsIcons.Settings, color: "teal", messageId: "gds.feedback.saved" } },
230
246
  analytics: { id: "gds.action.analytics", defaultMessage: "Analytics", icon: GdsIcons.Analytics, feedback: { icon: GdsIcons.Analytics, color: "teal", messageId: "gds.feedback.loaded" } },
231
247
  dashboard: { id: "gds.action.dashboard", defaultMessage: "Dashboard", icon: GdsIcons.Dashboard, feedback: { icon: GdsIcons.Dashboard, color: "teal", messageId: "gds.feedback.loaded" } },
@@ -241,14 +257,12 @@ var GdsVocabulary = {
241
257
  close: { id: "gds.action.close", defaultMessage: "Close", icon: GdsIcons.Close, feedback: { icon: GdsIcons.Close, color: "gray", messageId: "gds.feedback.closed" } },
242
258
  language: { id: "gds.action.language", defaultMessage: "Language", icon: GdsIcons.Language, feedback: { icon: GdsIcons.Language, color: "teal", messageId: "gds.feedback.changed" } },
243
259
  theme: { id: "gds.action.theme", defaultMessage: "Theme", icon: GdsIcons.Theme, feedback: { icon: GdsIcons.Theme, color: "teal", messageId: "gds.feedback.changed" } },
244
- // Navigation
245
260
  home: { id: "gds.action.home", defaultMessage: "Home", icon: GdsIcons.Home, feedback: { icon: GdsIcons.Home, color: "teal", messageId: "gds.feedback.opened" } },
246
261
  inbox: { id: "gds.action.inbox", defaultMessage: "Inbox", icon: GdsIcons.Inbox, feedback: { icon: GdsIcons.Inbox, color: "teal", messageId: "gds.feedback.opened" } },
247
262
  calendar: { id: "gds.action.calendar", defaultMessage: "Calendar", icon: GdsIcons.Calendar, feedback: { icon: GdsIcons.Calendar, color: "teal", messageId: "gds.feedback.opened" } },
248
263
  gallery: { id: "gds.action.gallery", defaultMessage: "Gallery", icon: GdsIcons.Gallery, feedback: { icon: GdsIcons.Gallery, color: "teal", messageId: "gds.feedback.opened" } },
249
264
  history: { id: "gds.action.history", defaultMessage: "History", icon: GdsIcons.History, feedback: { icon: GdsIcons.History, color: "teal", messageId: "gds.feedback.opened" } },
250
265
  profile: { id: "gds.action.profile", defaultMessage: "Profile", icon: GdsIcons.Profile, feedback: { icon: GdsIcons.Profile, color: "teal", messageId: "gds.feedback.opened" } },
251
- // Actions
252
266
  send: { id: "gds.action.send", defaultMessage: "Send", icon: GdsIcons.Send, feedback: { icon: GdsIcons.Send, color: "blue", messageId: "gds.feedback.sent" } },
253
267
  reply: { id: "gds.action.reply", defaultMessage: "Reply", icon: GdsIcons.Reply, feedback: { icon: GdsIcons.Reply, color: "blue", messageId: "gds.feedback.replied" } },
254
268
  forward: { id: "gds.action.forward", defaultMessage: "Forward", icon: GdsIcons.Forward, feedback: { icon: GdsIcons.Forward, color: "blue", messageId: "gds.feedback.forwarded" } },
@@ -262,12 +276,10 @@ var GdsVocabulary = {
262
276
  uncheck: { id: "gds.action.uncheck", defaultMessage: "Uncheck", icon: GdsIcons.Uncheck, feedback: { icon: GdsIcons.Uncheck, color: "red", messageId: "gds.feedback.unchecked" } },
263
277
  complete: { id: "gds.action.complete", defaultMessage: "Complete", icon: GdsIcons.Complete, feedback: { icon: GdsIcons.Complete, color: "teal", messageId: "gds.feedback.completed" } },
264
278
  clear: { id: "gds.action.clear", defaultMessage: "Clear", icon: GdsIcons.Clear, feedback: { icon: GdsIcons.Clear, color: "red", messageId: "gds.feedback.cleared" } },
265
- // Media (camera project)
266
279
  capture: { id: "gds.action.capture", defaultMessage: "Capture", icon: GdsIcons.Capture, feedback: { icon: GdsIcons.Capture, color: "teal", messageId: "gds.feedback.captured" } },
267
280
  record: { id: "gds.action.record", defaultMessage: "Record", icon: GdsIcons.Record, feedback: { icon: GdsIcons.Record, color: "teal", messageId: "gds.feedback.recorded" } },
268
281
  flip: { id: "gds.action.flip", defaultMessage: "Flip", icon: GdsIcons.Flip, feedback: { icon: GdsIcons.Flip, color: "teal", messageId: "gds.feedback.flipped" } },
269
282
  flash: { id: "gds.action.flash", defaultMessage: "Flash", icon: GdsIcons.Flash, feedback: { icon: GdsIcons.Flash, color: "teal", messageId: "gds.feedback.flashed" } },
270
- // Domain specific (amanoba, classscout, kidex, habigoal)
271
283
  course: { id: "gds.action.course", defaultMessage: "Course", icon: GdsIcons.Course, feedback: { icon: GdsIcons.Course, color: "teal", messageId: "gds.feedback.done" } },
272
284
  lesson: { id: "gds.action.lesson", defaultMessage: "Lesson", icon: GdsIcons.Lesson, feedback: { icon: GdsIcons.Lesson, color: "teal", messageId: "gds.feedback.done" } },
273
285
  certificate: { id: "gds.action.certificate", defaultMessage: "Certificate", icon: GdsIcons.Certificate, feedback: { icon: GdsIcons.Certificate, color: "teal", messageId: "gds.feedback.done" } },
@@ -280,7 +292,6 @@ var GdsVocabulary = {
280
292
  goal: { id: "gds.action.goal", defaultMessage: "Goal", icon: GdsIcons.Goal, feedback: { icon: GdsIcons.Goal, color: "teal", messageId: "gds.feedback.done" } },
281
293
  streak: { id: "gds.action.streak", defaultMessage: "Streak", icon: GdsIcons.Streak, feedback: { icon: GdsIcons.Streak, color: "teal", messageId: "gds.feedback.done" } },
282
294
  reward: { id: "gds.action.reward", defaultMessage: "Reward", icon: GdsIcons.Reward, feedback: { icon: GdsIcons.Reward, color: "yellow", messageId: "gds.feedback.rewarded" } },
283
- // Codebase analysis additions
284
295
  trophy: { id: "gds.action.trophy", defaultMessage: "Trophy", icon: GdsIcons.Trophy, feedback: { icon: GdsIcons.Trophy, color: "yellow", messageId: "gds.feedback.rewarded" } },
285
296
  crown: { id: "gds.action.crown", defaultMessage: "Crown", icon: GdsIcons.Crown, feedback: { icon: GdsIcons.Crown, color: "yellow", messageId: "gds.feedback.rewarded" } },
286
297
  pause: { id: "gds.action.pause", defaultMessage: "Pause", icon: GdsIcons.Pause, feedback: { icon: GdsIcons.Pause, color: "teal", messageId: "gds.feedback.paused" } },
@@ -300,7 +311,6 @@ var GdsVocabulary = {
300
311
  help: { id: "gds.action.help", defaultMessage: "Help", icon: GdsIcons.Help, feedback: { icon: GdsIcons.Help, color: "teal", messageId: "gds.feedback.done" } },
301
312
  filter: { id: "gds.action.filter", defaultMessage: "Filter", icon: GdsIcons.Filter, feedback: { icon: GdsIcons.Filter, color: "teal", messageId: "gds.feedback.filtered" } },
302
313
  sort: { id: "gds.action.sort", defaultMessage: "Sort", icon: GdsIcons.Sort, feedback: { icon: GdsIcons.Sort, color: "teal", messageId: "gds.feedback.sorted" } },
303
- // Audit-driven additions
304
314
  export: { id: "gds.action.export", defaultMessage: "Export", icon: GdsIcons.Export, feedback: { icon: GdsIcons.Export, color: "teal", messageId: "gds.feedback.exported" } },
305
315
  import: { id: "gds.action.import", defaultMessage: "Import", icon: GdsIcons.Import, feedback: { icon: GdsIcons.Import, color: "teal", messageId: "gds.feedback.imported" } },
306
316
  preview: { id: "gds.action.preview", defaultMessage: "Preview", icon: GdsIcons.Preview, feedback: { icon: GdsIcons.Preview, color: "teal", messageId: "gds.feedback.previewed" } },
@@ -318,19 +328,61 @@ var GdsVocabulary = {
318
328
  refer: { id: "gds.action.refer", defaultMessage: "Refer", icon: GdsIcons.Refer, feedback: { icon: GdsIcons.Refer, color: "teal", messageId: "gds.feedback.referred" } },
319
329
  evidence: { id: "gds.action.evidence", defaultMessage: "Evidence", icon: GdsIcons.Evidence, feedback: { icon: GdsIcons.Evidence, color: "teal", messageId: "gds.feedback.added" } }
320
330
  };
321
- function getSemanticActionConfig(action) {
322
- return GdsVocabulary[action];
331
+ function createGdsVocabularyPack(namespace, actions) {
332
+ return {
333
+ namespace,
334
+ actions: Object.fromEntries(
335
+ Object.entries(actions).map(([key, definition]) => [
336
+ `${namespace}:${key}`,
337
+ {
338
+ ...definition,
339
+ id: `gds.action.${namespace}.${key}`
340
+ }
341
+ ])
342
+ )
343
+ };
323
344
  }
324
- function getSemanticActionLabel(action, translate) {
325
- const config = getSemanticActionConfig(action);
345
+ function mergeGdsVocabularyPacks(packs = []) {
346
+ return packs.reduce((acc, pack) => {
347
+ for (const [key, definition] of Object.entries(pack.actions)) {
348
+ acc[key] = definition;
349
+ }
350
+ return acc;
351
+ }, {});
352
+ }
353
+ function resolveSemanticActionConfig(action, packs = []) {
354
+ const baseConfig = GdsVocabulary[action];
355
+ if (baseConfig) {
356
+ return baseConfig;
357
+ }
358
+ const merged = mergeGdsVocabularyPacks(packs);
359
+ const packConfig = merged[action];
360
+ if (packConfig) {
361
+ return packConfig;
362
+ }
363
+ throw new Error(`Unknown semantic action: ${action}`);
364
+ }
365
+ function getSemanticActionConfig(action, packs = []) {
366
+ return resolveSemanticActionConfig(action, packs);
367
+ }
368
+ function getSemanticActionLabel(action, translate, packs = []) {
369
+ const config = resolveSemanticActionConfig(action, packs);
326
370
  return translate ? translate(config.id, config.defaultMessage) : config.defaultMessage;
327
371
  }
328
372
 
329
373
  // src/SemanticButton.tsx
330
374
  var import_jsx_runtime3 = require("react/jsx-runtime");
331
- function SemanticButton({ action, loading, feedbackState, feedbackText, prerenderLabelOnly = true, ...props }) {
375
+ function SemanticButton({
376
+ action,
377
+ loading,
378
+ feedbackState,
379
+ feedbackText,
380
+ prerenderLabelOnly = true,
381
+ vocabularyPacks = [],
382
+ ...props
383
+ }) {
332
384
  const { t } = (0, import_gds_theme.useGdsTranslation)();
333
- const config = GdsVocabulary[action];
385
+ const config = resolveSemanticActionConfig(action, vocabularyPacks);
334
386
  const [mounted, setMounted] = (0, import_react.useState)(!prerenderLabelOnly);
335
387
  const [internalFeedback, setInternalFeedback] = (0, import_react.useState)(null);
336
388
  (0, import_react.useEffect)(() => {
@@ -346,14 +398,14 @@ function SemanticButton({ action, loading, feedbackState, feedbackText, prerende
346
398
  }
347
399
  }, [feedbackState]);
348
400
  let Icon = config.icon;
349
- let label = getSemanticActionLabel(action, t);
401
+ let label = getSemanticActionLabel(action, t, vocabularyPacks);
350
402
  let color = props.color;
351
403
  if (!mounted) {
352
404
  const { leftSection, ...buttonProps } = props;
353
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_core3.Button, { loading, color, ...buttonProps, children: getSemanticActionLabel(action) });
405
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_core3.Button, { loading, color, ...buttonProps, children: getSemanticActionLabel(action, void 0, vocabularyPacks) });
354
406
  }
355
407
  if (internalFeedback === "success") {
356
- const defaultFeedback = "feedback" in config && config.feedback ? config.feedback : { icon: import_icons_react2.IconCheck, color: "teal", messageId: "gds.feedback.saved" };
408
+ const defaultFeedback = config.feedback ?? { icon: import_icons_react2.IconCheck, color: "teal", messageId: "gds.feedback.saved" };
357
409
  Icon = defaultFeedback.icon;
358
410
  label = feedbackText || t(defaultFeedback.messageId, "Success");
359
411
  color = defaultFeedback.color;
@@ -467,34 +519,89 @@ function ChoiceChip({
467
519
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_core6.Badge, { ...sharedProps, children: label });
468
520
  }
469
521
 
470
- // src/MetricCard.tsx
522
+ // src/ActionBar.tsx
471
523
  var import_core7 = require("@mantine/core");
472
524
  var import_jsx_runtime7 = require("react/jsx-runtime");
525
+ function renderSemanticAction(action, slot, vocabularyPacks) {
526
+ const { action: actionId, variant, ariaLabel, ...props } = action;
527
+ const fallbackVariant = slot === "primary" ? "filled" : slot === "secondary" ? "default" : "subtle";
528
+ const config = resolveSemanticActionConfig(actionId, vocabularyPacks);
529
+ const Icon = config.icon;
530
+ const label = getSemanticActionLabel(actionId, void 0, vocabularyPacks);
531
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
532
+ import_core7.Button,
533
+ {
534
+ leftSection: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Icon, { size: "1rem", stroke: 1.75 }),
535
+ "aria-label": ariaLabel ?? label,
536
+ variant: variant ?? fallbackVariant,
537
+ ...props,
538
+ children: label
539
+ },
540
+ `${slot}-${actionId}`
541
+ );
542
+ }
543
+ function ActionBar({
544
+ primary,
545
+ secondary = [],
546
+ tertiary = [],
547
+ iconOnly = [],
548
+ gap = "sm",
549
+ vocabularyPacks = []
550
+ }) {
551
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_core7.Stack, { gap, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_core7.Group, { justify: "space-between", align: "center", gap, wrap: "wrap", children: [
552
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_core7.Group, { gap, wrap: "wrap", children: [
553
+ secondary.map((action) => renderSemanticAction(action, "secondary", vocabularyPacks)),
554
+ tertiary.map((action) => renderSemanticAction(action, "tertiary", vocabularyPacks))
555
+ ] }),
556
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_core7.Group, { gap, wrap: "wrap", justify: "flex-end", style: { marginInlineStart: "auto" }, children: [
557
+ iconOnly.map(({ action, ariaLabel, ...props }) => {
558
+ const config = resolveSemanticActionConfig(action, vocabularyPacks);
559
+ const Icon = config.icon;
560
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
561
+ import_core7.ActionIcon,
562
+ {
563
+ variant: "subtle",
564
+ size: "lg",
565
+ "aria-label": ariaLabel ?? getSemanticActionLabel(action, void 0, vocabularyPacks),
566
+ ...props,
567
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Icon, { size: "1rem", stroke: 1.75 })
568
+ },
569
+ `icon-${action}`
570
+ );
571
+ }),
572
+ primary ? renderSemanticAction(primary, "primary", vocabularyPacks) : null
573
+ ] })
574
+ ] }) });
575
+ }
576
+
577
+ // src/MetricCard.tsx
578
+ var import_core8 = require("@mantine/core");
579
+ var import_jsx_runtime8 = require("react/jsx-runtime");
473
580
  var trendColors = {
474
581
  positive: "teal",
475
582
  negative: "red",
476
583
  neutral: "gray"
477
584
  };
478
585
  function MetricCard({ label, value, description, trend, icon, footer }) {
479
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_core7.Card, { withBorder: true, radius: "lg", padding: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_core7.Stack, { gap: "md", children: [
480
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_core7.Group, { justify: "space-between", align: "flex-start", wrap: "nowrap", children: [
481
- /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_core7.Stack, { gap: 4, children: [
482
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_core7.Text, { size: "sm", c: "dimmed", fw: 600, children: label }),
483
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_core7.Title, { order: 3, children: value })
586
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core8.Card, { withBorder: true, radius: "lg", padding: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_core8.Stack, { gap: "md", children: [
587
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_core8.Group, { justify: "space-between", align: "flex-start", wrap: "nowrap", children: [
588
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_core8.Stack, { gap: 4, children: [
589
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core8.Text, { size: "sm", c: "dimmed", fw: 600, children: label }),
590
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core8.Title, { order: 3, children: value })
484
591
  ] }),
485
- icon ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_core7.ThemeIcon, { variant: "light", size: "xl", radius: "xl", "aria-hidden": true, children: icon }) : null
592
+ icon ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core8.ThemeIcon, { variant: "light", size: "xl", radius: "xl", "aria-hidden": true, children: icon }) : null
486
593
  ] }),
487
- description || trend ? /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_core7.Group, { justify: "space-between", align: "center", gap: "sm", children: [
488
- description ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_core7.Text, { size: "sm", c: "dimmed", flex: 1, children: description }) : /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("span", {}),
489
- trend ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_core7.Badge, { color: trendColors[trend.tone ?? "neutral"], variant: "light", children: trend.label }) : null
594
+ description || trend ? /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_core8.Group, { justify: "space-between", align: "center", gap: "sm", children: [
595
+ description ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core8.Text, { size: "sm", c: "dimmed", flex: 1, children: description }) : /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("span", {}),
596
+ trend ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core8.Badge, { color: trendColors[trend.tone ?? "neutral"], variant: "light", children: trend.label }) : null
490
597
  ] }) : null,
491
598
  footer
492
599
  ] }) });
493
600
  }
494
601
 
495
602
  // src/ProgressCard.tsx
496
- var import_core8 = require("@mantine/core");
497
- var import_jsx_runtime8 = require("react/jsx-runtime");
603
+ var import_core9 = require("@mantine/core");
604
+ var import_jsx_runtime9 = require("react/jsx-runtime");
498
605
  function ProgressCard({
499
606
  label,
500
607
  value,
@@ -503,31 +610,31 @@ function ProgressCard({
503
610
  description,
504
611
  action
505
612
  }) {
506
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core8.Card, { withBorder: true, radius: "lg", padding: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_core8.Stack, { gap: "md", children: [
507
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_core8.Group, { justify: "space-between", align: "flex-start", children: [
508
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_core8.Stack, { gap: 4, children: [
509
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core8.Text, { size: "sm", c: "dimmed", fw: 600, children: label }),
510
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core8.Title, { order: 3, children: value })
613
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core9.Card, { withBorder: true, radius: "lg", padding: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_core9.Stack, { gap: "md", children: [
614
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_core9.Group, { justify: "space-between", align: "flex-start", children: [
615
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_core9.Stack, { gap: 4, children: [
616
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core9.Text, { size: "sm", c: "dimmed", fw: 600, children: label }),
617
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core9.Title, { order: 3, children: value })
511
618
  ] }),
512
619
  action
513
620
  ] }),
514
- description ? /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core8.Text, { size: "sm", c: "dimmed", children: description }) : null,
515
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_core8.Stack, { gap: 6, children: [
516
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_core8.Group, { justify: "space-between", gap: "sm", children: [
517
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core8.Text, { size: "sm", fw: 500, children: progressLabel ?? "Progress" }),
518
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_core8.Text, { size: "sm", c: "dimmed", children: [
621
+ description ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core9.Text, { size: "sm", c: "dimmed", children: description }) : null,
622
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_core9.Stack, { gap: 6, children: [
623
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_core9.Group, { justify: "space-between", gap: "sm", children: [
624
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core9.Text, { size: "sm", fw: 500, children: progressLabel ?? "Progress" }),
625
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_core9.Text, { size: "sm", c: "dimmed", children: [
519
626
  Math.round(progress),
520
627
  "%"
521
628
  ] })
522
629
  ] }),
523
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_core8.Progress, { value: progress, radius: "xl", size: "md" })
630
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core9.Progress, { value: progress, radius: "xl", size: "md" })
524
631
  ] })
525
632
  ] }) });
526
633
  }
527
634
 
528
635
  // src/SectionPanel.tsx
529
- var import_core9 = require("@mantine/core");
530
- var import_jsx_runtime9 = require("react/jsx-runtime");
636
+ var import_core10 = require("@mantine/core");
637
+ var import_jsx_runtime10 = require("react/jsx-runtime");
531
638
  var toneBackgrounds = {
532
639
  default: "var(--mantine-color-body)",
533
640
  supporting: "light-dark(var(--mantine-color-gray-0), color-mix(in srgb, var(--mantine-color-dark-7) 92%, black))",
@@ -543,23 +650,23 @@ function SectionPanel({
543
650
  id,
544
651
  divided = true
545
652
  }) {
546
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core9.Paper, { id, withBorder: true, radius: "xl", p: "lg", style: { background: toneBackgrounds[tone] }, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_core9.Stack, { gap: "md", children: [
547
- title || description || action ? /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_jsx_runtime9.Fragment, { children: [
548
- /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_core9.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
549
- title || description ? /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_core9.Stack, { gap: 4, children: [
550
- title ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core9.Title, { order: 3, children: title }) : null,
551
- description ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core9.Text, { size: "sm", c: "dimmed", children: description }) : null
653
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_core10.Paper, { id, withBorder: true, radius: "xl", p: "lg", style: { background: toneBackgrounds[tone] }, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_core10.Stack, { gap: "md", children: [
654
+ title || description || action ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
655
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_core10.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
656
+ title || description ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_core10.Stack, { gap: 4, children: [
657
+ title ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_core10.Title, { order: 3, children: title }) : null,
658
+ description ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_core10.Text, { size: "sm", c: "dimmed", children: description }) : null
552
659
  ] }) : null,
553
660
  action
554
661
  ] }),
555
- divided ? /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_core9.Divider, {}) : null
662
+ divided ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_core10.Divider, {}) : null
556
663
  ] }) : null,
557
664
  children
558
665
  ] }) });
559
666
  }
560
667
 
561
668
  // src/ConsumerSection.tsx
562
- var import_jsx_runtime10 = require("react/jsx-runtime");
669
+ var import_jsx_runtime11 = require("react/jsx-runtime");
563
670
  function ConsumerSection({
564
671
  title,
565
672
  description,
@@ -567,23 +674,23 @@ function ConsumerSection({
567
674
  children,
568
675
  tone = "default"
569
676
  }) {
570
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(SectionPanel, { title, description, action, tone, children });
677
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(SectionPanel, { title, description, action, tone, children });
571
678
  }
572
679
 
573
680
  // src/ConsumerDashboardGrid.tsx
574
- var import_core10 = require("@mantine/core");
575
- var import_jsx_runtime11 = require("react/jsx-runtime");
681
+ var import_core11 = require("@mantine/core");
682
+ var import_jsx_runtime12 = require("react/jsx-runtime");
576
683
  function ConsumerDashboardGrid({
577
684
  children,
578
685
  columns = 3
579
686
  }) {
580
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_core10.SimpleGrid, { cols: { base: 1, sm: Math.min(columns, 2), lg: columns }, spacing: "lg", children });
687
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core11.SimpleGrid, { cols: { base: 1, sm: Math.min(columns, 2), lg: columns }, spacing: "lg", children });
581
688
  }
582
689
 
583
690
  // src/GameBoardTile.tsx
584
- var import_core11 = require("@mantine/core");
691
+ var import_core12 = require("@mantine/core");
585
692
  var import_hooks = require("@mantine/hooks");
586
- var import_jsx_runtime12 = require("react/jsx-runtime");
693
+ var import_jsx_runtime13 = require("react/jsx-runtime");
587
694
  function GameBoardTile({
588
695
  face,
589
696
  revealed,
@@ -592,12 +699,12 @@ function GameBoardTile({
592
699
  onPress,
593
700
  highlightColor
594
701
  }) {
595
- const theme = (0, import_core11.useMantineTheme)();
702
+ const theme = (0, import_core12.useMantineTheme)();
596
703
  const reduceMotion = (0, import_hooks.useMediaQuery)("(prefers-reduced-motion: reduce)");
597
704
  const highlighted = revealed && !matched;
598
705
  const revealBg = highlightColor ?? (typeof theme.primaryColor === "string" ? `${theme.primaryColor}.5` : "violet.5");
599
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core11.UnstyledButton, { w: "100%", disabled, onClick: onPress, "aria-pressed": revealed, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
600
- import_core11.Paper,
706
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_core12.UnstyledButton, { w: "100%", disabled, onClick: onPress, "aria-pressed": revealed, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
707
+ import_core12.Paper,
601
708
  {
602
709
  withBorder: true,
603
710
  radius: "md",
@@ -612,14 +719,14 @@ function GameBoardTile({
612
719
  transform: reduceMotion || !highlighted ? "scale(1)" : "scale(1.02)"
613
720
  }
614
721
  },
615
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core11.Center, { h: "100%", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_core11.Text, { size: "xl", fw: 700, children: face }) })
722
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_core12.Center, { h: "100%", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_core12.Text, { size: "xl", fw: 700, children: face }) })
616
723
  }
617
724
  ) });
618
725
  }
619
726
 
620
727
  // src/EditorialCard.tsx
621
- var import_core12 = require("@mantine/core");
622
- var import_jsx_runtime13 = require("react/jsx-runtime");
728
+ var import_core13 = require("@mantine/core");
729
+ var import_jsx_runtime14 = require("react/jsx-runtime");
623
730
  var tonePalette = {
624
731
  default: {
625
732
  accent: "violet",
@@ -639,8 +746,8 @@ var tonePalette = {
639
746
  }
640
747
  };
641
748
  function EditorialMediaFallback({ compact }) {
642
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_core12.AspectRatio, { ratio: compact ? 16 / 10 : 4 / 3, children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
643
- import_core12.Box,
749
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.AspectRatio, { ratio: compact ? 16 / 10 : 4 / 3, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
750
+ import_core13.Box,
644
751
  {
645
752
  style: {
646
753
  display: "grid",
@@ -650,7 +757,7 @@ function EditorialMediaFallback({ compact }) {
650
757
  background: "var(--mantine-color-gray-0)",
651
758
  borderRadius: "var(--mantine-radius-md)"
652
759
  },
653
- children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(GdsIcons.Gallery, { size: compact ? "1.5rem" : "2rem" })
760
+ children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(GdsIcons.Gallery, { size: compact ? "1.5rem" : "2rem" })
654
761
  }
655
762
  ) });
656
763
  }
@@ -673,8 +780,8 @@ function EditorialCard({
673
780
  const featured = variant === "featured";
674
781
  const palette = tonePalette[tone];
675
782
  const interactiveProps = href ? { component: "a", href } : onClick ? { component: "button", onClick, type: "button" } : {};
676
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
677
- import_core12.Card,
783
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
784
+ import_core13.Card,
678
785
  {
679
786
  className: classNames?.root,
680
787
  withBorder: true,
@@ -688,21 +795,21 @@ function EditorialCard({
688
795
  cursor: href || onClick ? "pointer" : "default"
689
796
  },
690
797
  children: [
691
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_core12.Card.Section, { className: classNames?.media, children: media ?? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(EditorialMediaFallback, { compact }) }),
692
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_core12.Stack, { gap: "md", p: compact ? "md" : "lg", className: classNames?.body, children: [
693
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_core12.Group, { justify: "space-between", align: "flex-start", gap: "sm", wrap: "wrap", children: [
694
- /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_core12.Stack, { gap: 4, flex: 1, children: [
695
- eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_core12.Text, { size: "xs", fw: 700, c: "dimmed", children: eyebrow }) : null,
696
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_core12.Title, { order: compact ? 4 : 3, className: classNames?.title, children: title })
798
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Card.Section, { className: classNames?.media, children: media ?? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(EditorialMediaFallback, { compact }) }),
799
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_core13.Stack, { gap: "md", p: compact ? "md" : "lg", className: classNames?.body, children: [
800
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_core13.Group, { justify: "space-between", align: "flex-start", gap: "sm", wrap: "wrap", children: [
801
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_core13.Stack, { gap: 4, flex: 1, children: [
802
+ eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Text, { size: "xs", fw: 700, c: "dimmed", children: eyebrow }) : null,
803
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Title, { order: compact ? 4 : 3, className: classNames?.title, children: title })
697
804
  ] }),
698
- badge ? typeof badge === "string" ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_core12.Badge, { color: palette.accent, variant: "light", children: badge }) : badge : null
805
+ badge ? typeof badge === "string" ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Badge, { color: palette.accent, variant: "light", children: badge }) : badge : null
699
806
  ] }),
700
- description ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_core12.Text, { size: "sm", c: "dimmed", children: description }) : null,
701
- meta ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_core12.Text, { size: "sm", c: "dimmed", className: classNames?.meta, children: meta }) : null,
702
- href || onClick || ctaLabel ? /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_core12.Group, { gap: 6, c: `${palette.accent}.7`, className: classNames?.action, children: [
703
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_core12.Text, { fw: 600, size: "sm", children: ctaLabel }),
704
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
705
- import_core12.Anchor,
807
+ description ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Text, { size: "sm", c: "dimmed", children: description }) : null,
808
+ meta ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Text, { size: "sm", c: "dimmed", className: classNames?.meta, children: meta }) : null,
809
+ href || onClick || ctaLabel ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_core13.Group, { gap: 6, c: `${palette.accent}.7`, className: classNames?.action, children: [
810
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Text, { fw: 600, size: "sm", children: ctaLabel }),
811
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
812
+ import_core13.Anchor,
706
813
  {
707
814
  component: "span",
708
815
  underline: "never",
@@ -719,8 +826,8 @@ function EditorialCard({
719
826
  }
720
827
 
721
828
  // src/ProductCard.tsx
722
- var import_core13 = require("@mantine/core");
723
- var import_jsx_runtime14 = require("react/jsx-runtime");
829
+ var import_core14 = require("@mantine/core");
830
+ var import_jsx_runtime15 = require("react/jsx-runtime");
724
831
  function ProductCard({
725
832
  title,
726
833
  description,
@@ -733,39 +840,39 @@ function ProductCard({
733
840
  footer
734
841
  }) {
735
842
  const MoreIcon = GdsIcons.Menu;
736
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Card, { withBorder: true, radius: "lg", padding: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_core13.Stack, { gap: "md", children: [
843
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Card, { withBorder: true, radius: "lg", padding: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: "md", children: [
737
844
  media,
738
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_core13.Group, { justify: "space-between", align: "flex-start", wrap: "nowrap", children: [
739
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_core13.Group, { align: "flex-start", gap: "sm", wrap: "nowrap", children: [
740
- icon ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.ThemeIcon, { variant: "light", size: "xl", radius: "xl", "aria-hidden": true, children: icon }) : null,
741
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_core13.Stack, { gap: 4, children: [
742
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Title, { order: 4, children: title }),
743
- description ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Text, { size: "sm", c: "dimmed", lineClamp: 3, children: description }) : null
845
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Group, { justify: "space-between", align: "flex-start", wrap: "nowrap", children: [
846
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Group, { align: "flex-start", gap: "sm", wrap: "nowrap", children: [
847
+ icon ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.ThemeIcon, { variant: "light", size: "xl", radius: "xl", "aria-hidden": true, children: icon }) : null,
848
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: 4, children: [
849
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Title, { order: 4, children: title }),
850
+ description ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "sm", c: "dimmed", lineClamp: 3, children: description }) : null
744
851
  ] })
745
852
  ] }),
746
- /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_core13.Group, { gap: "xs", align: "center", wrap: "nowrap", children: [
747
- typeof status === "string" ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Badge, { variant: "light", children: status }) : status,
748
- secondaryActions.length ? /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_core13.Menu, { position: "bottom-end", withinPortal: true, children: [
749
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Menu.Target, { children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.ActionIcon, { variant: "subtle", "aria-label": "More actions", children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(MoreIcon, { size: "1rem" }) }) }),
750
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Menu.Dropdown, { children: secondaryActions.map(
751
- (action) => action.href ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Menu.Item, { component: "a", href: action.href, color: action.color, children: action.label }, action.label) : /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Menu.Item, { onClick: action.onClick, color: action.color, children: action.label }, action.label)
853
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Group, { gap: "xs", align: "center", wrap: "nowrap", children: [
854
+ typeof status === "string" ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Badge, { variant: "light", children: status }) : status,
855
+ secondaryActions.length ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Menu, { position: "bottom-end", withinPortal: true, children: [
856
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Menu.Target, { children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.ActionIcon, { variant: "subtle", "aria-label": "More actions", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(MoreIcon, { size: "1rem" }) }) }),
857
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Menu.Dropdown, { children: secondaryActions.map(
858
+ (action) => action.href ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Menu.Item, { component: "a", href: action.href, color: action.color, children: action.label }, action.label) : /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Menu.Item, { onClick: action.onClick, color: action.color, children: action.label }, action.label)
752
859
  ) })
753
860
  ] }) : null
754
861
  ] })
755
862
  ] }),
756
- metadata.length ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Stack, { gap: 6, children: metadata.map((item) => /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_core13.Group, { justify: "space-between", gap: "sm", children: [
757
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Text, { size: "sm", c: "dimmed", children: item.label }),
758
- /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Text, { size: "sm", fw: 500, ta: "right", children: item.value })
863
+ metadata.length ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Stack, { gap: 6, children: metadata.map((item) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Group, { justify: "space-between", gap: "sm", children: [
864
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "sm", c: "dimmed", children: item.label }),
865
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "sm", fw: 500, ta: "right", children: item.value })
759
866
  ] }, item.label)) }) : null,
760
- primaryAction ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_core13.Group, { justify: "space-between", children: primaryAction }) : null,
867
+ primaryAction ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Group, { justify: "space-between", children: primaryAction }) : null,
761
868
  footer
762
869
  ] }) });
763
870
  }
764
871
 
765
872
  // src/PublicProductCard.tsx
766
873
  var import_react2 = require("react");
767
- var import_core14 = require("@mantine/core");
768
- var import_jsx_runtime15 = require("react/jsx-runtime");
874
+ var import_core15 = require("@mantine/core");
875
+ var import_jsx_runtime16 = require("react/jsx-runtime");
769
876
  var stateConfig = {
770
877
  available: { label: "Available", color: "teal" },
771
878
  limited: { label: "Limited", color: "yellow" },
@@ -782,29 +889,29 @@ function enhanceAction(action, disabled) {
782
889
  });
783
890
  }
784
891
  function ImageFallback({ compact }) {
785
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.AspectRatio, { ratio: compact ? 16 / 9 : 4 / 3, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
786
- import_core14.ThemeIcon,
892
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.AspectRatio, { ratio: compact ? 16 / 9 : 4 / 3, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
893
+ import_core15.ThemeIcon,
787
894
  {
788
895
  size: "100%",
789
896
  radius: "md",
790
897
  variant: "light",
791
898
  color: "gray",
792
899
  "aria-label": "No product image available",
793
- children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(GdsIcons.Gallery, { size: compact ? "1.5rem" : "2rem" })
900
+ children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(GdsIcons.Gallery, { size: compact ? "1.5rem" : "2rem" })
794
901
  }
795
902
  ) });
796
903
  }
797
904
  function LoadingCard({ compact }) {
798
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Card, { withBorder: true, radius: "lg", padding: compact ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: "md", children: [
799
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.AspectRatio, { ratio: compact ? 16 / 9 : 4 / 3, children: /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Skeleton, { radius: "md" }) }),
800
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: "xs", children: [
801
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Skeleton, { height: 20, radius: "sm", width: "70%" }),
802
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Skeleton, { height: 14, radius: "sm", width: "100%" }),
803
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Skeleton, { height: 14, radius: "sm", width: "85%" })
905
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Card, { withBorder: true, radius: "lg", padding: compact ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Stack, { gap: "md", children: [
906
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.AspectRatio, { ratio: compact ? 16 / 9 : 4 / 3, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Skeleton, { radius: "md" }) }),
907
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Stack, { gap: "xs", children: [
908
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Skeleton, { height: 20, radius: "sm", width: "70%" }),
909
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Skeleton, { height: 14, radius: "sm", width: "100%" }),
910
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Skeleton, { height: 14, radius: "sm", width: "85%" })
804
911
  ] }),
805
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Group, { justify: "space-between", align: "center", children: [
806
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Skeleton, { height: 18, radius: "sm", width: 72 }),
807
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Skeleton, { height: 36, radius: "md", width: 120 })
912
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Group, { justify: "space-between", align: "center", children: [
913
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Skeleton, { height: 18, radius: "sm", width: 72 }),
914
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Skeleton, { height: 36, radius: "md", width: 120 })
808
915
  ] })
809
916
  ] }) });
810
917
  }
@@ -827,7 +934,7 @@ function PublicProductCard({
827
934
  disabled = false
828
935
  }) {
829
936
  if (loading) {
830
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(LoadingCard, { compact });
937
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(LoadingCard, { compact });
831
938
  }
832
939
  const isActionDisabled = disabled || state === "sold-out";
833
940
  const resolvedPrimaryAction = enhanceAction(primaryAction, isActionDisabled);
@@ -840,46 +947,312 @@ function PublicProductCard({
840
947
  const pickupHelper = helperKind === "pickup" ? helperText : pickupNote;
841
948
  const inventoryHelper = helperKind === "inventory" ? helperText : inventoryNote;
842
949
  const hasSupportingRegion = Boolean(price || supportingHelper || pickupHelper || inventoryHelper);
843
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Card, { withBorder: true, radius: "lg", padding: compact ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: compact ? "sm" : "md", children: [
844
- image ?? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ImageFallback, { compact }),
845
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Group, { justify: "space-between", align: "flex-start", wrap: "nowrap", gap: "sm", children: [
846
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: 4, style: { minWidth: 0, flex: 1 }, children: [
847
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Title, { order: compact ? 5 : 4, lineClamp: 2, children: title }),
848
- description ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "sm", c: "dimmed", lineClamp: compact ? 2 : 3, children: description }) : null
950
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Card, { withBorder: true, radius: "lg", padding: compact ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Stack, { gap: compact ? "sm" : "md", children: [
951
+ image ?? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ImageFallback, { compact }),
952
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Group, { justify: "space-between", align: "flex-start", wrap: "nowrap", gap: "sm", children: [
953
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Stack, { gap: 4, style: { minWidth: 0, flex: 1 }, children: [
954
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Title, { order: compact ? 5 : 4, lineClamp: 2, children: title }),
955
+ description ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Text, { size: "sm", c: "dimmed", lineClamp: compact ? 2 : 3, children: description }) : null
849
956
  ] }),
850
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Badge, { variant: "light", color: stateBadge.color, children: stateBadge.label })
957
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Badge, { variant: "light", color: stateBadge.color, children: stateBadge.label })
851
958
  ] }),
852
- hasSupportingRegion ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Group, { justify: "space-between", align: "flex-end", gap: "sm", wrap: "nowrap", children: [
853
- /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: 2, style: { minWidth: 0, flex: 1 }, children: [
854
- price ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { fw: 700, size: compact ? "md" : "lg", children: price }) : null,
855
- supportingHelper ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "xs", c: "dimmed", children: supportingHelper }) : null
959
+ hasSupportingRegion ? /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Group, { justify: "space-between", align: "flex-end", gap: "sm", wrap: "nowrap", children: [
960
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Stack, { gap: 2, style: { minWidth: 0, flex: 1 }, children: [
961
+ price ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Text, { fw: 700, size: compact ? "md" : "lg", children: price }) : null,
962
+ supportingHelper ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Text, { size: "xs", c: "dimmed", children: supportingHelper }) : null
856
963
  ] }),
857
964
  resolvedPrimaryAction
858
- ] }) : resolvedPrimaryAction ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Group, { justify: "flex-end", children: resolvedPrimaryAction }) : null,
859
- pickupHelper || inventoryHelper || metadata.length ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Stack, { gap: 6, children: [
860
- pickupHelper ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Group, { justify: "space-between", gap: "sm", children: [
861
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "sm", c: "dimmed", children: "Pickup" }),
862
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "sm", fw: 500, ta: "right", children: pickupHelper })
965
+ ] }) : resolvedPrimaryAction ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Group, { justify: "flex-end", children: resolvedPrimaryAction }) : null,
966
+ pickupHelper || inventoryHelper || metadata.length ? /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Stack, { gap: 6, children: [
967
+ pickupHelper ? /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Group, { justify: "space-between", gap: "sm", children: [
968
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Text, { size: "sm", c: "dimmed", children: "Pickup" }),
969
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Text, { size: "sm", fw: 500, ta: "right", children: pickupHelper })
863
970
  ] }) : null,
864
- inventoryHelper ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Group, { justify: "space-between", gap: "sm", children: [
865
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "sm", c: "dimmed", children: "Availability" }),
866
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "sm", fw: 500, ta: "right", children: inventoryHelper })
971
+ inventoryHelper ? /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Group, { justify: "space-between", gap: "sm", children: [
972
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Text, { size: "sm", c: "dimmed", children: "Availability" }),
973
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Text, { size: "sm", fw: 500, ta: "right", children: inventoryHelper })
867
974
  ] }) : null,
868
- metadata.map((item) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(import_core14.Group, { justify: "space-between", gap: "sm", children: [
869
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "sm", c: "dimmed", children: item.label }),
870
- /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Text, { size: "sm", fw: 500, ta: "right", children: item.value })
975
+ metadata.map((item) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Group, { justify: "space-between", gap: "sm", children: [
976
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Text, { size: "sm", c: "dimmed", children: item.label }),
977
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Text, { size: "sm", fw: 500, ta: "right", children: item.value })
871
978
  ] }, item.label))
872
979
  ] }) : null,
873
- resolvedSecondaryAction ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_core14.Group, { justify: "flex-end", children: resolvedSecondaryAction }) : null
980
+ resolvedSecondaryAction ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Group, { justify: "flex-end", children: resolvedSecondaryAction }) : null
874
981
  ] }) });
875
982
  }
876
983
 
877
- // src/BrowseSurface.tsx
984
+ // src/PublicFoodCard.tsx
985
+ var import_react3 = require("react");
986
+ var import_core16 = require("@mantine/core");
987
+ var import_jsx_runtime17 = require("react/jsx-runtime");
988
+ var ratioMap = {
989
+ square: 1,
990
+ dish: 4 / 3,
991
+ landscape: 16 / 9
992
+ };
993
+ var stateConfig2 = {
994
+ available: { label: "Available", color: "teal" },
995
+ preorder: { label: "Preorder", color: "violet" },
996
+ limited: { label: "Limited batch", color: "yellow" },
997
+ "sold-out": { label: "Sold out", color: "red" },
998
+ "coming-soon": { label: "Coming soon", color: "gray" }
999
+ };
1000
+ var markerToneMap = {
1001
+ default: "gray",
1002
+ positive: "teal",
1003
+ warning: "orange",
1004
+ muted: "dark"
1005
+ };
1006
+ function enhanceAction2(action, disabled) {
1007
+ if (!(0, import_react3.isValidElement)(action)) {
1008
+ return action;
1009
+ }
1010
+ return (0, import_react3.cloneElement)(action, {
1011
+ disabled: disabled || Boolean(action.props.disabled),
1012
+ "aria-disabled": disabled || void 0
1013
+ });
1014
+ }
1015
+ function FoodImageFallback({ mediaRatio }) {
1016
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.AspectRatio, { ratio: ratioMap[mediaRatio], children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.ThemeIcon, { size: "100%", radius: "md", variant: "light", color: "gray", "aria-label": "No food image available", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(GdsIcons.Gallery, { size: "2rem" }) }) });
1017
+ }
1018
+ function LoadingFoodCard({ mediaRatio }) {
1019
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Card, { withBorder: true, radius: "lg", padding: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Stack, { gap: "md", children: [
1020
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.AspectRatio, { ratio: ratioMap[mediaRatio], children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Skeleton, { radius: "md" }) }),
1021
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Stack, { gap: "xs", children: [
1022
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Skeleton, { height: 20, radius: "sm", width: "72%" }),
1023
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Skeleton, { height: 14, radius: "sm", width: "96%" }),
1024
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Skeleton, { height: 14, radius: "sm", width: "78%" })
1025
+ ] }),
1026
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Group, { justify: "space-between", align: "center", children: [
1027
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Skeleton, { height: 18, radius: "sm", width: 96 }),
1028
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Skeleton, { height: 36, radius: "md", width: 112 })
1029
+ ] })
1030
+ ] }) });
1031
+ }
1032
+ function PublicFoodCard({
1033
+ title,
1034
+ description,
1035
+ image,
1036
+ price,
1037
+ priceNote,
1038
+ state,
1039
+ helperText,
1040
+ pickupNote,
1041
+ freshnessNote,
1042
+ markers = [],
1043
+ metadata = [],
1044
+ primaryAction,
1045
+ secondaryAction,
1046
+ quantityHint,
1047
+ mediaRatio = "dish",
1048
+ loading = false,
1049
+ disabled = false
1050
+ }) {
1051
+ if (loading) {
1052
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(LoadingFoodCard, { mediaRatio });
1053
+ }
1054
+ const stateBadge = stateConfig2[state];
1055
+ const isActionDisabled = disabled || state === "sold-out" || state === "coming-soon";
1056
+ const resolvedPrimaryAction = enhanceAction2(primaryAction, isActionDisabled);
1057
+ const resolvedSecondaryAction = enhanceAction2(secondaryAction, disabled);
1058
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Card, { withBorder: true, radius: "lg", padding: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Stack, { gap: "md", children: [
1059
+ image ?? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(FoodImageFallback, { mediaRatio }),
1060
+ markers.length > 0 || quantityHint ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Group, { justify: "space-between", align: "center", wrap: "wrap", gap: "xs", children: [
1061
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Group, { gap: "xs", wrap: "wrap", children: markers.map((marker) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Badge, { variant: "light", color: markerToneMap[marker.tone ?? "default"], children: marker.label }, marker.id)) }),
1062
+ quantityHint ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Text, { size: "xs", fw: 600, c: "dimmed", children: quantityHint }) : null
1063
+ ] }) : null,
1064
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Group, { justify: "space-between", align: "flex-start", gap: "sm", wrap: "nowrap", children: [
1065
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Stack, { gap: 4, style: { minWidth: 0, flex: 1 }, children: [
1066
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Title, { order: 4, lineClamp: 2, children: title }),
1067
+ description ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Text, { size: "sm", c: "dimmed", lineClamp: 3, children: description }) : null
1068
+ ] }),
1069
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Badge, { variant: "light", color: stateBadge.color, children: stateBadge.label })
1070
+ ] }),
1071
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Group, { justify: "space-between", align: "flex-end", gap: "sm", wrap: "nowrap", children: [
1072
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Stack, { gap: 2, style: { minWidth: 0, flex: 1 }, children: [
1073
+ price ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Text, { fw: 800, size: "lg", children: price }) : null,
1074
+ priceNote ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Text, { size: "xs", c: "dimmed", children: priceNote }) : null,
1075
+ helperText ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Text, { size: "sm", c: "dimmed", children: helperText }) : null
1076
+ ] }),
1077
+ resolvedPrimaryAction
1078
+ ] }),
1079
+ pickupNote || freshnessNote || metadata.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Stack, { gap: 6, children: [
1080
+ pickupNote ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Group, { justify: "space-between", align: "flex-start", gap: "sm", children: [
1081
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Text, { size: "sm", c: "dimmed", children: "Pickup" }),
1082
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Text, { size: "sm", fw: 500, ta: "right", children: pickupNote })
1083
+ ] }) : null,
1084
+ freshnessNote ? /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Group, { justify: "space-between", align: "flex-start", gap: "sm", children: [
1085
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Text, { size: "sm", c: "dimmed", children: "Freshness" }),
1086
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Text, { size: "sm", fw: 500, ta: "right", children: freshnessNote })
1087
+ ] }) : null,
1088
+ metadata.map((item) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Group, { justify: "space-between", align: "flex-start", gap: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Group, { gap: "xs", wrap: "nowrap", children: [
1089
+ item.icon,
1090
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Text, { size: "sm", c: "dimmed", children: item.label })
1091
+ ] }) }, item.id))
1092
+ ] }) : null,
1093
+ resolvedSecondaryAction ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Group, { justify: "flex-end", children: resolvedSecondaryAction }) : null
1094
+ ] }) });
1095
+ }
1096
+
1097
+ // src/FoodMenuSection.tsx
878
1098
  var import_core17 = require("@mantine/core");
1099
+ var import_jsx_runtime18 = require("react/jsx-runtime");
1100
+ function FoodMenuSection({
1101
+ title,
1102
+ description,
1103
+ eyebrow,
1104
+ categories,
1105
+ sectionNote,
1106
+ action,
1107
+ emptyState,
1108
+ columns = 3,
1109
+ showEmptyCategories = false
1110
+ }) {
1111
+ const normalizedCategories = (categories ?? []).filter(Boolean);
1112
+ const visibleCategories = showEmptyCategories ? normalizedCategories : normalizedCategories.filter((category) => category.items.length > 0);
1113
+ if (!visibleCategories.length) {
1114
+ return emptyState ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_jsx_runtime18.Fragment, { children: emptyState }) : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1115
+ EmptyState,
1116
+ {
1117
+ title: "No active menu available",
1118
+ description: "Publish grouped menu categories here when the current weekly or seasonal menu is ready."
1119
+ }
1120
+ );
1121
+ }
1122
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Box, { component: "section", "aria-label": typeof title === "string" ? title : "Food menu section", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { gap: "xl", children: [
1123
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
1124
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { gap: 4, children: [
1125
+ eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Text, { size: "xs", fw: 700, c: "dimmed", tt: "uppercase", children: eyebrow }) : null,
1126
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Title, { order: 2, children: title }),
1127
+ description ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Text, { size: "sm", c: "dimmed", maw: 760, children: description }) : null,
1128
+ sectionNote ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Text, { size: "sm", c: "dimmed", children: sectionNote }) : null
1129
+ ] }),
1130
+ action
1131
+ ] }),
1132
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Stack, { gap: "xl", children: visibleCategories.map((category) => /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { gap: "md", children: [
1133
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { gap: 4, children: [
1134
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Title, { order: 3, children: category.title }),
1135
+ category.description ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Text, { size: "sm", c: "dimmed", children: category.description }) : null,
1136
+ category.helperNote ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Text, { size: "sm", c: "dimmed", children: category.helperNote }) : null
1137
+ ] }),
1138
+ category.items.length ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.SimpleGrid, { cols: { base: 1, sm: Math.min(columns, 2), lg: columns }, spacing: "lg", children: category.items.map((item) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(PublicFoodCard, { ...item }, item.id)) }) : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1139
+ EmptyState,
1140
+ {
1141
+ title: "No items in this category",
1142
+ description: "This category is defined, but it does not currently have any visible dishes or bundles."
1143
+ }
1144
+ )
1145
+ ] }, category.id)) })
1146
+ ] }) });
1147
+ }
1148
+
1149
+ // src/ListingCard.tsx
1150
+ var import_core18 = require("@mantine/core");
1151
+ var import_jsx_runtime19 = require("react/jsx-runtime");
1152
+ var ratioMap2 = {
1153
+ "1:1": 1,
1154
+ "4:3": 4 / 3,
1155
+ "16:9": 16 / 9
1156
+ };
1157
+ var toneColorMap = {
1158
+ default: void 0,
1159
+ positive: "teal",
1160
+ warning: "orange",
1161
+ muted: "gray"
1162
+ };
1163
+ function ListingImageFallback({ mediaRatio }) {
1164
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.AspectRatio, { ratio: ratioMap2[mediaRatio], children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1165
+ import_core18.ThemeIcon,
1166
+ {
1167
+ size: "100%",
1168
+ radius: "md",
1169
+ variant: "light",
1170
+ color: "gray",
1171
+ "aria-label": "No listing image available",
1172
+ children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(GdsIcons.Gallery, { size: "2rem" })
1173
+ }
1174
+ ) });
1175
+ }
1176
+ function ListingAffordance({ affordance }) {
1177
+ const config = GdsVocabulary[affordance.action];
1178
+ const Icon = config.icon;
1179
+ const label = affordance.ariaLabel ?? getSemanticActionLabel(affordance.action);
1180
+ if (affordance.href) {
1181
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1182
+ import_core18.ActionIcon,
1183
+ {
1184
+ component: "a",
1185
+ href: affordance.href,
1186
+ variant: "subtle",
1187
+ size: "lg",
1188
+ "aria-label": label,
1189
+ disabled: affordance.disabled,
1190
+ children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Icon, { size: "1rem", stroke: 1.75 })
1191
+ }
1192
+ );
1193
+ }
1194
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1195
+ import_core18.ActionIcon,
1196
+ {
1197
+ variant: "subtle",
1198
+ size: "lg",
1199
+ "aria-label": label,
1200
+ onClick: affordance.onClick,
1201
+ disabled: affordance.disabled,
1202
+ children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(Icon, { size: "1rem", stroke: 1.75 })
1203
+ }
1204
+ );
1205
+ }
1206
+ function ListingCard({
1207
+ title,
1208
+ href,
1209
+ description,
1210
+ image,
1211
+ mediaRatio = "4:3",
1212
+ metadata = [],
1213
+ featured = false,
1214
+ sponsoredDisclosure,
1215
+ price,
1216
+ primaryAction,
1217
+ saveAction,
1218
+ shareAction,
1219
+ compact = false
1220
+ }) {
1221
+ const titleContent = href && typeof title === "string" ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Text, { component: "a", href, inherit: true, td: "none", children: title }) : title;
1222
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Card, { withBorder: true, radius: "lg", padding: compact ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Stack, { gap: compact ? "sm" : "md", children: [
1223
+ image ?? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(ListingImageFallback, { mediaRatio }),
1224
+ featured || sponsoredDisclosure ? /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Group, { justify: "space-between", gap: "sm", wrap: "wrap", children: [
1225
+ featured ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Badge, { variant: "light", color: "violet", children: "Featured" }) : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", {}),
1226
+ sponsoredDisclosure ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Text, { size: "xs", c: "dimmed", children: sponsoredDisclosure }) : null
1227
+ ] }) : null,
1228
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Stack, { gap: 4, children: [
1229
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Title, { order: compact ? 5 : 4, lineClamp: 2, children: titleContent }),
1230
+ description ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Text, { size: "sm", c: "dimmed", lineClamp: compact ? 2 : 3, children: description }) : null
1231
+ ] }),
1232
+ metadata.length ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Stack, { gap: "xs", children: metadata.map((item) => /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Group, { justify: "space-between", align: "flex-start", gap: "sm", wrap: "nowrap", children: [
1233
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Group, { gap: "xs", wrap: "nowrap", style: { minWidth: 0, flex: 1 }, children: [
1234
+ item.icon,
1235
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Text, { size: "sm", c: item.tone ? toneColorMap[item.tone] : "dimmed", lineClamp: 1, children: item.label })
1236
+ ] }),
1237
+ item.value ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Text, { size: "sm", fw: 500, ta: "right", children: item.value }) : null
1238
+ ] }, item.id)) }) : null,
1239
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Group, { justify: "space-between", align: "center", gap: "sm", wrap: "wrap", children: [
1240
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Stack, { gap: 2, style: { minWidth: 0, flex: 1 }, children: price ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Text, { fw: 700, size: compact ? "md" : "lg", children: price }) : null }),
1241
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Group, { gap: "xs", wrap: "nowrap", justify: "flex-end", style: { marginInlineStart: "auto" }, children: [
1242
+ saveAction ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(ListingAffordance, { affordance: saveAction }) : null,
1243
+ shareAction ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(ListingAffordance, { affordance: shareAction }) : null,
1244
+ primaryAction
1245
+ ] })
1246
+ ] })
1247
+ ] }) });
1248
+ }
1249
+
1250
+ // src/BrowseSurface.tsx
1251
+ var import_core21 = require("@mantine/core");
879
1252
 
880
1253
  // src/DataToolbar.tsx
881
- var import_core15 = require("@mantine/core");
882
- var import_jsx_runtime16 = require("react/jsx-runtime");
1254
+ var import_core19 = require("@mantine/core");
1255
+ var import_jsx_runtime20 = require("react/jsx-runtime");
883
1256
  function DataToolbar({
884
1257
  searchSlot,
885
1258
  filterSlot,
@@ -888,20 +1261,20 @@ function DataToolbar({
888
1261
  createAction,
889
1262
  activeFilters = []
890
1263
  }) {
891
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Stack, { gap: "sm", children: [
892
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Group, { justify: "space-between", align: "flex-start", gap: "sm", children: [
893
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Group, { flex: 1, align: "flex-start", gap: "sm", children: [
1264
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Stack, { gap: "sm", children: [
1265
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Group, { justify: "space-between", align: "flex-start", gap: "sm", children: [
1266
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Group, { flex: 1, align: "flex-start", gap: "sm", children: [
894
1267
  searchSlot,
895
1268
  filterSlot,
896
1269
  sortSlot
897
1270
  ] }),
898
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_core15.Group, { gap: "sm", children: [
1271
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_core19.Group, { gap: "sm", children: [
899
1272
  resetAction,
900
1273
  createAction
901
1274
  ] })
902
1275
  ] }),
903
- activeFilters.length ? /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_core15.Group, { gap: "xs", children: activeFilters.map((filter) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
904
- import_core15.Badge,
1276
+ activeFilters.length ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Group, { gap: "xs", children: activeFilters.map((filter) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1277
+ import_core19.Badge,
905
1278
  {
906
1279
  variant: "light",
907
1280
  rightSection: filter.onRemove ? "\xD7" : void 0,
@@ -915,17 +1288,17 @@ function DataToolbar({
915
1288
  }
916
1289
 
917
1290
  // src/StateBlock.tsx
918
- var import_core16 = require("@mantine/core");
919
- var import_jsx_runtime17 = require("react/jsx-runtime");
1291
+ var import_core20 = require("@mantine/core");
1292
+ var import_jsx_runtime21 = require("react/jsx-runtime");
920
1293
  var variantConfig = {
921
- loading: { color: "violet", icon: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Loader, { size: "sm" }) },
922
- empty: { color: "gray", icon: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(GdsIcons.Inbox, { size: "1.1rem" }) },
923
- error: { color: "red", icon: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(GdsIcons.Danger, { size: "1.1rem" }) },
924
- permission: { color: "orange", icon: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(GdsIcons.Verify, { size: "1.1rem" }) },
925
- disabled: { color: "gray", icon: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(GdsIcons.Toggle, { size: "1.1rem" }) },
926
- success: { color: "teal", icon: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(GdsIcons.Success, { size: "1.1rem" }) },
927
- info: { color: "blue", icon: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(GdsIcons.Info, { size: "1.1rem" }) },
928
- "not-enough-data": { color: "yellow", icon: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(GdsIcons.Analytics, { size: "1.1rem" }) }
1294
+ loading: { color: "violet", icon: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Loader, { size: "sm" }) },
1295
+ empty: { color: "gray", icon: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(GdsIcons.Inbox, { size: "1.1rem" }) },
1296
+ error: { color: "red", icon: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(GdsIcons.Danger, { size: "1.1rem" }) },
1297
+ permission: { color: "orange", icon: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(GdsIcons.Verify, { size: "1.1rem" }) },
1298
+ disabled: { color: "gray", icon: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(GdsIcons.Toggle, { size: "1.1rem" }) },
1299
+ success: { color: "teal", icon: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(GdsIcons.Success, { size: "1.1rem" }) },
1300
+ info: { color: "blue", icon: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(GdsIcons.Info, { size: "1.1rem" }) },
1301
+ "not-enough-data": { color: "yellow", icon: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(GdsIcons.Analytics, { size: "1.1rem" }) }
929
1302
  };
930
1303
  function StateBlock({
931
1304
  variant,
@@ -936,8 +1309,8 @@ function StateBlock({
936
1309
  compact = false
937
1310
  }) {
938
1311
  const config = variantConfig[variant];
939
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
940
- import_core16.Stack,
1312
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
1313
+ import_core20.Stack,
941
1314
  {
942
1315
  align: compact ? "flex-start" : "center",
943
1316
  justify: "center",
@@ -945,10 +1318,10 @@ function StateBlock({
945
1318
  py: compact ? "md" : "xl",
946
1319
  ta: compact ? "left" : "center",
947
1320
  children: [
948
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.ThemeIcon, { variant: "light", color: config.color, size: compact ? "lg" : "xl", radius: "xl", children: icon ?? config.icon }),
949
- /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(import_core16.Stack, { gap: 6, align: compact ? "flex-start" : "center", children: [
950
- /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Title, { order: compact ? 4 : 3, children: title }),
951
- description ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_core16.Text, { c: "dimmed", maw: compact ? void 0 : 480, children: description }) : null
1321
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.ThemeIcon, { variant: "light", color: config.color, size: compact ? "lg" : "xl", radius: "xl", children: icon ?? config.icon }),
1322
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Stack, { gap: 6, align: compact ? "flex-start" : "center", children: [
1323
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Title, { order: compact ? 4 : 3, children: title }),
1324
+ description ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Text, { c: "dimmed", maw: compact ? void 0 : 480, children: description }) : null
952
1325
  ] }),
953
1326
  action
954
1327
  ]
@@ -957,7 +1330,7 @@ function StateBlock({
957
1330
  }
958
1331
 
959
1332
  // src/BrowseSurface.tsx
960
- var import_jsx_runtime18 = require("react/jsx-runtime");
1333
+ var import_jsx_runtime22 = require("react/jsx-runtime");
961
1334
  function BrowseSurface({
962
1335
  eyebrow,
963
1336
  title,
@@ -991,22 +1364,22 @@ function BrowseSurface({
991
1364
  }));
992
1365
  let body = content;
993
1366
  if (loading) {
994
- body = /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(StateBlock, { variant: "loading", title: loadingTitle, description: loadingDescription, compact: true });
1367
+ body = /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(StateBlock, { variant: "loading", title: loadingTitle, description: loadingDescription, compact: true });
995
1368
  } else if (error) {
996
- body = /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(StateBlock, { variant: "error", title: errorTitle, description: error, action: errorAction ?? emptyAction, compact: true });
1369
+ body = /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(StateBlock, { variant: "error", title: errorTitle, description: error, action: errorAction ?? emptyAction, compact: true });
997
1370
  } else if (empty) {
998
- body = /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(StateBlock, { variant: "empty", title: emptyTitle, description: emptyDescription, action: emptyAction, compact: true });
1371
+ body = /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(StateBlock, { variant: "empty", title: emptyTitle, description: emptyDescription, action: emptyAction, compact: true });
999
1372
  }
1000
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { gap: "lg", children: [
1001
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Paper, { withBorder: true, radius: "xl", p: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { gap: "lg", children: [
1002
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Group, { justify: "space-between", align: "flex-start", gap: "md", children: [
1003
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { gap: "xs", maw: 760, children: [
1004
- eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Text, { size: "xs", fw: 700, tt: "uppercase", c: "dimmed", style: { letterSpacing: "0.18em" }, children: eyebrow }) : null,
1005
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Title, { order: 1, children: title }),
1006
- description ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Text, { size: "lg", c: "dimmed", children: description }) : null
1373
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { gap: "lg", children: [
1374
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Paper, { withBorder: true, radius: "xl", p: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { gap: "lg", children: [
1375
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Group, { justify: "space-between", align: "flex-start", gap: "md", children: [
1376
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { gap: "xs", maw: 760, children: [
1377
+ eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Text, { size: "xs", fw: 700, tt: "uppercase", c: "dimmed", style: { letterSpacing: "0.18em" }, children: eyebrow }) : null,
1378
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Title, { order: 1, children: title }),
1379
+ description ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Text, { size: "lg", c: "dimmed", children: description }) : null
1007
1380
  ] }),
1008
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { align: "flex-end", gap: "xs", children: [
1009
- typeof resultCount === "number" ? /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Badge, { size: "lg", radius: "xl", variant: "light", color: "violet", children: [
1381
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { align: "flex-end", gap: "xs", children: [
1382
+ typeof resultCount === "number" ? /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Badge, { size: "lg", radius: "xl", variant: "light", color: "violet", children: [
1010
1383
  resultCount,
1011
1384
  " ",
1012
1385
  resultLabel
@@ -1014,10 +1387,10 @@ function BrowseSurface({
1014
1387
  primaryControls
1015
1388
  ] })
1016
1389
  ] }),
1017
- scopeOptions.length ? /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { gap: "xs", children: [
1018
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Text, { size: "sm", fw: 600, c: "dimmed", children: scopeLabel }),
1019
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Group, { gap: "xs", wrap: "wrap", children: scopeOptions.map((option) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1020
- import_core17.Button,
1390
+ scopeOptions.length ? /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { gap: "xs", children: [
1391
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Text, { size: "sm", fw: 600, c: "dimmed", children: scopeLabel }),
1392
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Group, { gap: "xs", wrap: "wrap", children: scopeOptions.map((option) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1393
+ import_core21.Button,
1021
1394
  {
1022
1395
  variant: option.active ? "filled" : "default",
1023
1396
  color: option.active ? "violet" : "gray",
@@ -1029,30 +1402,30 @@ function BrowseSurface({
1029
1402
  option.id
1030
1403
  )) })
1031
1404
  ] }) : null,
1032
- locationControls ? /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { gap: "xs", children: [
1033
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Text, { size: "sm", fw: 600, c: "dimmed", children: "Location" }),
1405
+ locationControls ? /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { gap: "xs", children: [
1406
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Text, { size: "sm", fw: 600, c: "dimmed", children: "Location" }),
1034
1407
  locationControls
1035
1408
  ] }) : null,
1036
- toolbar || sortControl ? /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.SimpleGrid, { cols: { base: 1, lg: sortControl ? 2 : 1 }, spacing: "md", children: [
1037
- toolbar ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1409
+ toolbar || sortControl ? /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.SimpleGrid, { cols: { base: 1, lg: sortControl ? 2 : 1 }, spacing: "md", children: [
1410
+ toolbar ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1038
1411
  DataToolbar,
1039
1412
  {
1040
1413
  ...toolbar,
1041
1414
  activeFilters: toolbarFilters.length ? toolbarFilters : toolbar.fallbackActiveFilters
1042
1415
  }
1043
- ) : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Box, {}),
1044
- sortControl ? /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { gap: "xs", align: "stretch", children: [
1045
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Text, { size: "sm", fw: 600, c: "dimmed", children: "Sort" }),
1416
+ ) : /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Box, {}),
1417
+ sortControl ? /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { gap: "xs", align: "stretch", children: [
1418
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Text, { size: "sm", fw: 600, c: "dimmed", children: "Sort" }),
1046
1419
  sortControl
1047
1420
  ] }) : null
1048
1421
  ] }) : null,
1049
- mobileFilters ? /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(import_core17.Stack, { hiddenFrom: "lg", gap: "xs", children: [
1050
- /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Text, { size: "sm", fw: 600, c: "dimmed", children: "Filters" }),
1422
+ mobileFilters ? /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { hiddenFrom: "lg", gap: "xs", children: [
1423
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Text, { size: "sm", fw: 600, c: "dimmed", children: "Filters" }),
1051
1424
  mobileFilters
1052
1425
  ] }) : null,
1053
- filterDrawer ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Box, { hiddenFrom: "lg", children: filterDrawer }) : null,
1054
- activeFilters.length ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_core17.Group, { gap: "xs", wrap: "wrap", children: activeFilters.map((filter) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1055
- import_core17.Badge,
1426
+ filterDrawer ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Box, { hiddenFrom: "lg", children: filterDrawer }) : null,
1427
+ activeFilters.length ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Group, { gap: "xs", wrap: "wrap", children: activeFilters.map((filter) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1428
+ import_core21.Badge,
1056
1429
  {
1057
1430
  variant: "light",
1058
1431
  color: "violet",
@@ -1069,8 +1442,8 @@ function BrowseSurface({
1069
1442
  }
1070
1443
 
1071
1444
  // src/AccentPanel.tsx
1072
- var import_core18 = require("@mantine/core");
1073
- var import_jsx_runtime19 = require("react/jsx-runtime");
1445
+ var import_core22 = require("@mantine/core");
1446
+ var import_jsx_runtime23 = require("react/jsx-runtime");
1074
1447
  var toneStyles = {
1075
1448
  gray: {
1076
1449
  bg: "light-dark(var(--mantine-color-gray-0), color-mix(in srgb, var(--mantine-color-gray-7) 88%, black))",
@@ -1126,29 +1499,56 @@ function AccentPanel({
1126
1499
  children
1127
1500
  }) {
1128
1501
  const styles = resolveAccentPanelStyles(tone, variant);
1129
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Paper, { withBorder: true, radius: "lg", p: "lg", style: styles, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Stack, { gap: "sm", children: [
1130
- title || badge ? /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_core18.Group, { justify: "space-between", align: "flex-start", gap: "sm", wrap: "wrap", children: [
1131
- title ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Title, { order: 4, c: "inherit", children: title }) : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Box, {}),
1132
- badge ? typeof badge === "string" ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Badge, { color: tone === "amber" ? "yellow" : tone, variant: "filled", children: badge }) : badge : null
1502
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Paper, { withBorder: true, radius: "lg", p: "lg", style: styles, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Stack, { gap: "sm", children: [
1503
+ title || badge ? /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Group, { justify: "space-between", align: "flex-start", gap: "sm", wrap: "wrap", children: [
1504
+ title ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Title, { order: 4, c: "inherit", children: title }) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Box, {}),
1505
+ badge ? typeof badge === "string" ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Badge, { color: tone === "amber" ? "yellow" : tone, variant: "filled", children: badge }) : badge : null
1133
1506
  ] }) : null,
1134
- typeof children === "string" ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Text, { c: "inherit", children }) : /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_core18.Box, { c: "inherit", children })
1507
+ typeof children === "string" ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Text, { c: "inherit", children }) : /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Box, { c: "inherit", children })
1508
+ ] }) });
1509
+ }
1510
+
1511
+ // src/DetailProfileShell.tsx
1512
+ var import_core23 = require("@mantine/core");
1513
+ var import_jsx_runtime24 = require("react/jsx-runtime");
1514
+ function DetailProfileShell({
1515
+ mode = "page",
1516
+ hero,
1517
+ actions,
1518
+ sections,
1519
+ related,
1520
+ padding = "lg",
1521
+ showDividers = true
1522
+ }) {
1523
+ const content = sections.filter(Boolean);
1524
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Paper, { withBorder: mode === "drawer", radius: mode === "drawer" ? "xl" : "md", p: padding, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core23.Stack, { gap: "lg", children: [
1525
+ hero,
1526
+ actions,
1527
+ content.map((section, index) => /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core23.Stack, { gap: "lg", children: [
1528
+ index > 0 && showDividers ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Divider, {}) : null,
1529
+ section
1530
+ ] }, index)),
1531
+ related ? /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_jsx_runtime24.Fragment, { children: [
1532
+ content.length && showDividers ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Divider, {}) : null,
1533
+ related
1534
+ ] }) : null
1135
1535
  ] }) });
1136
1536
  }
1137
1537
 
1138
1538
  // src/PublicShell.tsx
1139
- var import_core20 = require("@mantine/core");
1539
+ var import_core25 = require("@mantine/core");
1140
1540
 
1141
1541
  // src/PublicNav.tsx
1142
- var import_core19 = require("@mantine/core");
1143
- var import_jsx_runtime20 = require("react/jsx-runtime");
1542
+ var import_core24 = require("@mantine/core");
1543
+ var import_jsx_runtime25 = require("react/jsx-runtime");
1144
1544
  function PublicNav({ items, activeId, renderLink }) {
1145
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_core19.Group, { component: "nav", "aria-label": "Primary", gap: "lg", wrap: "nowrap", children: items.map((item) => {
1545
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Group, { component: "nav", "aria-label": "Primary", gap: "lg", wrap: "nowrap", children: items.map((item) => {
1146
1546
  const active = item.id === activeId;
1147
1547
  if (renderLink) {
1148
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { children: renderLink(item, active) }, item.id);
1548
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { children: renderLink(item, active) }, item.id);
1149
1549
  }
1150
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1151
- import_core19.Anchor,
1550
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1551
+ import_core24.Anchor,
1152
1552
  {
1153
1553
  href: item.href,
1154
1554
  "aria-current": active ? "page" : void 0,
@@ -1165,15 +1565,15 @@ function PublicNav({ items, activeId, renderLink }) {
1165
1565
  }
1166
1566
 
1167
1567
  // src/PublicShell.tsx
1168
- var import_jsx_runtime21 = require("react/jsx-runtime");
1568
+ var import_jsx_runtime26 = require("react/jsx-runtime");
1169
1569
  function InlineMobileNavigation({
1170
1570
  mobileNavigation,
1171
1571
  className,
1172
1572
  mode
1173
1573
  }) {
1174
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Box, { component: "details", hiddenFrom: "sm", className, children: [
1175
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
1176
- import_core20.Box,
1574
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_core25.Box, { component: "details", hiddenFrom: "sm", className, children: [
1575
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1576
+ import_core25.Box,
1177
1577
  {
1178
1578
  component: "summary",
1179
1579
  "aria-label": mode === "drawer" ? "Open site navigation drawer" : "Open site navigation",
@@ -1185,13 +1585,13 @@ function InlineMobileNavigation({
1185
1585
  gap: "0.5rem"
1186
1586
  },
1187
1587
  children: [
1188
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Burger, { opened: false, "aria-hidden": true }),
1189
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Text, { size: "sm", fw: 600, children: "Menu" })
1588
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Burger, { opened: false, "aria-hidden": true }),
1589
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Text, { size: "sm", fw: 600, children: "Menu" })
1190
1590
  ]
1191
1591
  }
1192
1592
  ),
1193
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1194
- import_core20.Box,
1593
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1594
+ import_core25.Box,
1195
1595
  {
1196
1596
  mt: "sm",
1197
1597
  p: "sm",
@@ -1200,7 +1600,7 @@ function InlineMobileNavigation({
1200
1600
  border: "1px solid var(--mantine-color-default-border)",
1201
1601
  background: mode === "drawer" ? "light-dark(var(--mantine-color-white), color-mix(in srgb, var(--mantine-color-dark-7) 92%, black))" : "var(--mantine-color-body)"
1202
1602
  },
1203
- children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Stack, { gap: "sm", children: mobileNavigation })
1603
+ children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Stack, { gap: "sm", children: mobileNavigation })
1204
1604
  }
1205
1605
  )
1206
1606
  ] });
@@ -1221,30 +1621,30 @@ function PublicShell({
1221
1621
  mobileNavigationMode = "sheet",
1222
1622
  classNames
1223
1623
  }) {
1224
- const resolvedNavigation = navigation ?? (navItems ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(PublicNav, { items: navItems, activeId: activeNavId }) : null);
1624
+ const resolvedNavigation = navigation ?? (navItems ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(PublicNav, { items: navItems, activeId: activeNavId }) : null);
1225
1625
  const containerSize = maxContentWidth ?? (compact ? "md" : "lg");
1226
1626
  const headerHeight = headerVariant === "compact" ? 64 : headerVariant === "branded-quiet" ? 88 : 72;
1227
1627
  const mainPadding = headerVariant === "compact" ? "lg" : "xl";
1228
1628
  const usesInlineMobileNavigation = Boolean(mobileNavigation) && mobileNavigationMode !== "sheet";
1229
1629
  const usesSheetMobileNavigation = Boolean(mobileNavigation) && mobileNavigationMode === "sheet";
1230
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
1231
- import_core20.AppShell,
1630
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1631
+ import_core25.AppShell,
1232
1632
  {
1233
1633
  className: classNames?.root,
1234
1634
  header: { height: headerHeight },
1235
1635
  footer: usesSheetMobileNavigation ? { height: 68 } : void 0,
1236
1636
  padding: 0,
1237
1637
  children: [
1238
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.AppShell.Header, { withBorder: headerBordered, className: classNames?.header, "data-header-variant": headerVariant, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Container, { size: containerSize, h: "100%", py: headerVariant === "branded-quiet" ? "sm" : 0, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
1239
- import_core20.Group,
1638
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.AppShell.Header, { withBorder: headerBordered, className: classNames?.header, "data-header-variant": headerVariant, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Container, { size: containerSize, h: "100%", py: headerVariant === "branded-quiet" ? "sm" : 0, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
1639
+ import_core25.Group,
1240
1640
  {
1241
1641
  h: "100%",
1242
1642
  justify: "space-between",
1243
1643
  wrap: "nowrap",
1244
1644
  gap: headerVariant === "compact" ? "sm" : "lg",
1245
1645
  children: [
1246
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.Group, { wrap: "nowrap", gap: headerVariant === "compact" ? "xs" : "sm", className: classNames?.brand, children: [
1247
- usesInlineMobileNavigation ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1646
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_core25.Group, { wrap: "nowrap", gap: headerVariant === "compact" ? "xs" : "sm", className: classNames?.brand, children: [
1647
+ usesInlineMobileNavigation ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1248
1648
  InlineMobileNavigation,
1249
1649
  {
1250
1650
  mobileNavigation,
@@ -1252,36 +1652,144 @@ function PublicShell({
1252
1652
  mode: mobileNavigationMode
1253
1653
  }
1254
1654
  ) : null,
1255
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Box, { children: brand })
1655
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Box, { children: brand })
1256
1656
  ] }),
1257
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Group, { visibleFrom: "sm", gap: headerVariant === "compact" ? "md" : "lg", className: classNames?.navigation, children: resolvedNavigation }),
1258
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Group, { gap: "sm", className: classNames?.actions, children: actions })
1657
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Group, { visibleFrom: "sm", gap: headerVariant === "compact" ? "md" : "lg", className: classNames?.navigation, children: resolvedNavigation }),
1658
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Group, { gap: "sm", className: classNames?.actions, children: actions })
1259
1659
  ]
1260
1660
  }
1261
1661
  ) }) }),
1262
- usesSheetMobileNavigation ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.AppShell.Footer, { withBorder: true, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Container, { size: containerSize, h: "100%", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Group, { h: "100%", justify: "space-around", wrap: "nowrap", children: mobileNavigation }) }) }) : null,
1263
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_core20.AppShell.Main, { children: [
1264
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Container, { size: containerSize, py: mainPadding, className: classNames?.content, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Stack, { gap: "xl", children }) }),
1265
- footer ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Box, { component: typeof footer === "string" ? "footer" : "div", py: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Container, { size: containerSize, children: typeof footer === "string" ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_core20.Text, { size: "sm", c: "dimmed", children: footer }) : footer }) }) : null
1662
+ usesSheetMobileNavigation ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.AppShell.Footer, { withBorder: true, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Container, { size: containerSize, h: "100%", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Group, { h: "100%", justify: "space-around", wrap: "nowrap", children: mobileNavigation }) }) }) : null,
1663
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_core25.AppShell.Main, { children: [
1664
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Container, { size: containerSize, py: mainPadding, className: classNames?.content, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Stack, { gap: "xl", children }) }),
1665
+ footer ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Box, { component: typeof footer === "string" ? "footer" : "div", py: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Container, { size: containerSize, children: typeof footer === "string" ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Text, { size: "sm", c: "dimmed", children: footer }) : footer }) }) : null
1266
1666
  ] })
1267
1667
  ]
1268
1668
  }
1269
1669
  );
1270
1670
  }
1271
1671
 
1672
+ // src/DiscoveryShell.tsx
1673
+ var import_core26 = require("@mantine/core");
1674
+ var import_hooks2 = require("@mantine/hooks");
1675
+ var import_jsx_runtime27 = require("react/jsx-runtime");
1676
+ function DiscoveryShell({
1677
+ header,
1678
+ sidebar,
1679
+ footer,
1680
+ children,
1681
+ mobileNavigationLabel = "Toggle navigation",
1682
+ defaultSidebarOpen = false,
1683
+ stickySidebar = true,
1684
+ sidebarWidth = 280,
1685
+ headerHeight = 60,
1686
+ shellPadding = "md",
1687
+ collapseBreakpoint = "sm"
1688
+ }) {
1689
+ const [opened, { toggle, close }] = (0, import_hooks2.useDisclosure)(defaultSidebarOpen);
1690
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
1691
+ import_core26.AppShell,
1692
+ {
1693
+ header: { height: headerHeight },
1694
+ footer: footer ? { height: 68 } : void 0,
1695
+ navbar: {
1696
+ width: sidebarWidth,
1697
+ breakpoint: collapseBreakpoint,
1698
+ collapsed: { mobile: !opened }
1699
+ },
1700
+ padding: shellPadding,
1701
+ children: [
1702
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.AppShell.Header, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_core26.Group, { h: "100%", px: "md", gap: "sm", wrap: "nowrap", children: [
1703
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1704
+ import_core26.Burger,
1705
+ {
1706
+ opened,
1707
+ onClick: toggle,
1708
+ hiddenFrom: collapseBreakpoint,
1709
+ size: "sm",
1710
+ "aria-label": mobileNavigationLabel
1711
+ }
1712
+ ),
1713
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.Box, { style: { flex: 1, minWidth: 0 }, children: header })
1714
+ ] }) }),
1715
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.AppShell.Navbar, { p: "md", "data-sticky-sidebar": stickySidebar || void 0, children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.ScrollArea, { h: "100%", type: "auto", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1716
+ import_core26.Box,
1717
+ {
1718
+ h: "100%",
1719
+ style: stickySidebar ? {
1720
+ display: "flex",
1721
+ flexDirection: "column"
1722
+ } : void 0,
1723
+ children: sidebar
1724
+ }
1725
+ ) }) }),
1726
+ footer ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.AppShell.Footer, { children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.Group, { h: "100%", px: "md", justify: "space-around", wrap: "nowrap", children: footer }) }) : null,
1727
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_core26.AppShell.Main, { onClick: () => close(), children })
1728
+ ]
1729
+ }
1730
+ );
1731
+ }
1732
+
1733
+ // src/SidebarNav.tsx
1734
+ var import_react4 = require("react");
1735
+ var import_core27 = require("@mantine/core");
1736
+ var import_gds_theme3 = require("@doneisbetter/gds-theme");
1737
+ var import_jsx_runtime28 = require("react/jsx-runtime");
1738
+ function SidebarNav({ children, ariaLabel = "Primary navigation", gap = "md" }) {
1739
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Stack, { component: "nav", "aria-label": ariaLabel, gap, h: "100%", children });
1740
+ }
1741
+ function SidebarNavSection({ label, children, pushToBottom = false }) {
1742
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_core27.Stack, { gap: "xs", mt: pushToBottom ? "auto" : void 0, children: [
1743
+ label ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Text, { size: "xs", fw: 700, c: "dimmed", children: label }) : null,
1744
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Stack, { gap: 4, children })
1745
+ ] });
1746
+ }
1747
+ var _SidebarNavItem = (0, import_react4.forwardRef)(
1748
+ ({
1749
+ action,
1750
+ label,
1751
+ description,
1752
+ badge,
1753
+ icon,
1754
+ "aria-label": ariaLabel,
1755
+ "aria-current": ariaCurrent,
1756
+ vocabularyPacks = [],
1757
+ ...props
1758
+ }, ref) => {
1759
+ const { t } = (0, import_gds_theme3.useGdsTranslation)();
1760
+ const config = action ? resolveSemanticActionConfig(action, vocabularyPacks) : null;
1761
+ const Icon = config?.icon;
1762
+ const resolvedLabel = label ?? (action ? getSemanticActionLabel(action, t, vocabularyPacks) : void 0);
1763
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1764
+ import_core27.NavLink,
1765
+ {
1766
+ ref,
1767
+ label: resolvedLabel,
1768
+ description,
1769
+ leftSection: icon ?? (Icon ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(Icon, { size: "1rem", stroke: 1.5 }) : void 0),
1770
+ rightSection: badge ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Box, { children: badge }) : props.rightSection,
1771
+ "aria-label": ariaLabel ?? (typeof resolvedLabel === "string" ? resolvedLabel : void 0),
1772
+ "aria-current": props.active ? "page" : ariaCurrent,
1773
+ ...props
1774
+ }
1775
+ );
1776
+ }
1777
+ );
1778
+ var SidebarNavItem = (0, import_core27.createPolymorphicComponent)(_SidebarNavItem);
1779
+
1272
1780
  // src/PublicSiteFooter.tsx
1273
- var import_core21 = require("@mantine/core");
1274
- var import_jsx_runtime22 = require("react/jsx-runtime");
1781
+ var import_core28 = require("@mantine/core");
1782
+ var import_jsx_runtime29 = require("react/jsx-runtime");
1275
1783
  function PublicSiteFooter({ children, meta }) {
1276
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_core21.Stack, { component: "footer", gap: "xs", children: [
1277
- children ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Text, { size: "sm", children }) : null,
1278
- meta ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Group, { gap: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_core21.Text, { size: "xs", c: "dimmed", children: meta }) }) : null
1784
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Stack, { component: "footer", gap: "xs", children: [
1785
+ children ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Text, { size: "sm", children }) : null,
1786
+ meta ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Group, { gap: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Text, { size: "xs", c: "dimmed", children: meta }) }) : null
1279
1787
  ] });
1280
1788
  }
1281
1789
 
1282
1790
  // src/PublicBrandFooter.tsx
1283
- var import_core22 = require("@mantine/core");
1284
- var import_jsx_runtime23 = require("react/jsx-runtime");
1791
+ var import_core29 = require("@mantine/core");
1792
+ var import_jsx_runtime30 = require("react/jsx-runtime");
1285
1793
  function PublicBrandFooter({
1286
1794
  media,
1287
1795
  brandTitle,
@@ -1296,8 +1804,8 @@ function PublicBrandFooter({
1296
1804
  const mediaSpan = layoutVariant === "immersive-media" ? 5 : 4;
1297
1805
  const primarySpan = media ? layoutVariant === "balanced-quote" ? 4 : 4 : secondary ? 6 : 12;
1298
1806
  const secondarySpan = media ? Math.max(3, 12 - mediaSpan - primarySpan) : Math.max(4, 12 - primarySpan);
1299
- return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
1300
- import_core22.Paper,
1807
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1808
+ import_core29.Paper,
1301
1809
  {
1302
1810
  component: "footer",
1303
1811
  withBorder: true,
@@ -1305,19 +1813,19 @@ function PublicBrandFooter({
1305
1813
  p: compact ? "lg" : "xl",
1306
1814
  className: classNames?.root,
1307
1815
  "data-layout-variant": layoutVariant,
1308
- children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Stack, { gap: "lg", children: [
1309
- /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Grid, { gutter: compact ? "lg" : "xl", align: "flex-start", children: [
1310
- media ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Grid.Col, { span: { base: 12, md: mediaSpan }, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Box, { className: classNames?.media, children: media }) }) : null,
1311
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Grid.Col, { span: { base: 12, md: primarySpan }, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_core22.Stack, { gap: compact ? "xs" : "sm", className: classNames?.primary, children: [
1312
- brandTitle ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Title, { order: 4, children: brandTitle }) : null,
1313
- description ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Text, { c: "dimmed", children: description }) : null,
1314
- actions ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Box, { children: actions }) : null
1816
+ children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Stack, { gap: "lg", children: [
1817
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Grid, { gutter: compact ? "lg" : "xl", align: "flex-start", children: [
1818
+ media ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Grid.Col, { span: { base: 12, md: mediaSpan }, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Box, { className: classNames?.media, children: media }) }) : null,
1819
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Grid.Col, { span: { base: 12, md: primarySpan }, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Stack, { gap: compact ? "xs" : "sm", className: classNames?.primary, children: [
1820
+ brandTitle ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Title, { order: 4, children: brandTitle }) : null,
1821
+ description ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Text, { c: "dimmed", children: description }) : null,
1822
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Box, { children: actions }) : null
1315
1823
  ] }) }),
1316
- secondary ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Grid.Col, { span: { base: 12, md: secondarySpan }, children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Stack, { gap: compact ? "xs" : "sm", className: classNames?.secondary, children: secondary }) }) : null
1824
+ secondary ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Grid.Col, { span: { base: 12, md: secondarySpan }, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Stack, { gap: compact ? "xs" : "sm", className: classNames?.secondary, children: secondary }) }) : null
1317
1825
  ] }),
1318
- legal ? /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_jsx_runtime23.Fragment, { children: [
1319
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Divider, {}),
1320
- /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Group, { justify: "space-between", gap: "sm", wrap: "wrap", className: classNames?.legal, children: typeof legal === "string" ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_core22.Text, { size: "sm", c: "dimmed", children: legal }) : legal })
1826
+ legal ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_jsx_runtime30.Fragment, { children: [
1827
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Divider, {}),
1828
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Group, { justify: "space-between", gap: "sm", wrap: "wrap", className: classNames?.legal, children: typeof legal === "string" ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Text, { size: "sm", c: "dimmed", children: legal }) : legal })
1321
1829
  ] }) : null
1322
1830
  ] })
1323
1831
  }
@@ -1325,50 +1833,126 @@ function PublicBrandFooter({
1325
1833
  }
1326
1834
 
1327
1835
  // src/AuthShell.tsx
1328
- var import_core23 = require("@mantine/core");
1329
- var import_jsx_runtime24 = require("react/jsx-runtime");
1330
- function AuthShell({ title, description, brand, headerActions, footer, helper, children }) {
1331
- return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Box, { py: { base: "xl", md: "4rem" }, children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Container, { size: "xs", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core23.Stack, { gap: "xl", children: [
1332
- brand || headerActions ? /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core23.Group, { justify: brand && headerActions ? "space-between" : "center", align: "center", children: [
1333
- brand ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Box, { children: brand }) : /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Box, {}),
1334
- headerActions ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Group, { gap: "sm", children: headerActions }) : null
1836
+ var import_core30 = require("@mantine/core");
1837
+ var import_jsx_runtime31 = require("react/jsx-runtime");
1838
+ function AuthShell({
1839
+ title,
1840
+ description,
1841
+ brand,
1842
+ headerActions,
1843
+ footer,
1844
+ helper,
1845
+ socialAuth,
1846
+ dividerLabel = "Or continue with your account",
1847
+ children
1848
+ }) {
1849
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Box, { py: { base: "xl", md: "4rem" }, children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Container, { size: "xs", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core30.Stack, { gap: "xl", children: [
1850
+ brand || headerActions ? /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core30.Group, { justify: brand && headerActions ? "space-between" : "center", align: "center", children: [
1851
+ brand ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Box, { children: brand }) : /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Box, {}),
1852
+ headerActions ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Group, { gap: "sm", children: headerActions }) : null
1335
1853
  ] }) : null,
1336
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Card, { withBorder: true, radius: "lg", padding: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core23.Stack, { gap: "lg", children: [
1337
- /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)(import_core23.Stack, { gap: "xs", ta: "center", children: [
1338
- /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Title, { order: 2, children: title }),
1339
- description ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Text, { c: "dimmed", size: "sm", children: description }) : null
1854
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Card, { withBorder: true, radius: "lg", padding: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core30.Stack, { gap: "lg", children: [
1855
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core30.Stack, { gap: "xs", ta: "center", children: [
1856
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Title, { order: 2, children: title }),
1857
+ description ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Text, { c: "dimmed", size: "sm", children: description }) : null
1340
1858
  ] }),
1859
+ socialAuth ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Box, { children: socialAuth }) : null,
1860
+ socialAuth ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Divider, { label: dividerLabel, labelPosition: "center" }) : null,
1341
1861
  children,
1342
- helper ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Text, { size: "sm", c: "dimmed", ta: "center", children: helper }) : null
1862
+ helper ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Text, { size: "sm", c: "dimmed", ta: "center", children: helper }) : null
1343
1863
  ] }) }),
1344
- footer ? /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(import_core23.Text, { size: "sm", c: "dimmed", ta: "center", children: footer }) : null
1864
+ footer ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Text, { size: "sm", c: "dimmed", ta: "center", children: footer }) : null
1345
1865
  ] }) }) });
1346
1866
  }
1347
1867
 
1868
+ // src/SocialAuthButtons.tsx
1869
+ var import_core31 = require("@mantine/core");
1870
+ var import_jsx_runtime32 = require("react/jsx-runtime");
1871
+ var providerConfig = {
1872
+ google: { label: "Google", mark: "G", color: "red" },
1873
+ apple: { label: "Apple", mark: "A", color: "dark" },
1874
+ github: { label: "GitHub", mark: "GH", color: "gray" },
1875
+ facebook: { label: "Facebook", mark: "F", color: "blue" },
1876
+ microsoft: { label: "Microsoft", mark: "M", color: "cyan" },
1877
+ linkedin: { label: "LinkedIn", mark: "in", color: "blue" },
1878
+ discord: { label: "Discord", mark: "D", color: "indigo" },
1879
+ x: { label: "X", mark: "X", color: "dark" },
1880
+ email: { label: "Email", mark: "@", color: "gray" }
1881
+ };
1882
+ function ProviderMark({ id }) {
1883
+ const config = providerConfig[id] ?? { label: id, mark: id.slice(0, 2).toUpperCase(), color: "gray" };
1884
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.ThemeIcon, { variant: "light", color: config.color, radius: "xl", size: "md", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.Text, { size: "xs", fw: 700, children: config.mark }) });
1885
+ }
1886
+ function SocialAuthButton({ provider, compact = false }) {
1887
+ const config = providerConfig[provider.id] ?? { label: provider.id, mark: provider.id.slice(0, 2).toUpperCase(), color: "gray" };
1888
+ const label = provider.label ?? `Continue with ${config.label}`;
1889
+ const buttonProps = provider.href ? { component: "a", href: provider.href } : { onClick: provider.onClick };
1890
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
1891
+ import_core31.Button,
1892
+ {
1893
+ variant: "default",
1894
+ justify: "space-between",
1895
+ fullWidth: true,
1896
+ size: compact ? "sm" : "md",
1897
+ leftSection: /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(ProviderMark, { id: provider.id }),
1898
+ disabled: provider.disabled,
1899
+ loading: provider.loading,
1900
+ ...buttonProps,
1901
+ children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core31.Stack, { gap: 0, align: "flex-start", children: [
1902
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.Text, { inherit: true, children: label }),
1903
+ provider.description ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.Text, { size: "xs", c: "dimmed", lh: 1.2, children: provider.description }) : null
1904
+ ] })
1905
+ }
1906
+ );
1907
+ }
1908
+ function SocialAuthButtons({
1909
+ providers,
1910
+ title = "Continue with a trusted provider",
1911
+ description,
1912
+ layout = "stack",
1913
+ compact = false
1914
+ }) {
1915
+ if (!providers.length) {
1916
+ return null;
1917
+ }
1918
+ const content = providers.map((provider) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(SocialAuthButton, { provider, compact }, provider.id));
1919
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core31.Stack, { gap: "md", children: [
1920
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core31.Stack, { gap: 4, ta: "center", children: [
1921
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core31.Group, { justify: "center", gap: "xs", children: [
1922
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(GdsIcons.Login, { size: "1rem" }),
1923
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.Text, { fw: 600, children: title })
1924
+ ] }),
1925
+ description ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.Text, { size: "sm", c: "dimmed", children: description }) : null
1926
+ ] }),
1927
+ /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.Divider, {}),
1928
+ layout === "grid" ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.SimpleGrid, { cols: { base: 1, sm: 2 }, spacing: "sm", children: content }) : /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.Stack, { gap: "sm", children: content })
1929
+ ] });
1930
+ }
1931
+
1348
1932
  // src/ArticleShell.tsx
1349
- var import_core24 = require("@mantine/core");
1350
- var import_jsx_runtime25 = require("react/jsx-runtime");
1933
+ var import_core32 = require("@mantine/core");
1934
+ var import_jsx_runtime33 = require("react/jsx-runtime");
1351
1935
  function ArticleShell({ eyebrow, title, lead, meta, sideRail, children }) {
1352
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Container, { size: "lg", py: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_core24.Group, { align: "flex-start", gap: "xl", wrap: "nowrap", children: [
1353
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_core24.Stack, { gap: "lg", maw: 760, flex: 1, children: [
1354
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_core24.Stack, { gap: "sm", children: [
1355
- eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Text, { size: "sm", fw: 700, c: "dimmed", tt: "uppercase", children: eyebrow }) : null,
1356
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Title, { order: 1, children: title }),
1357
- lead ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Text, { size: "lg", c: "dimmed", children: lead }) : null,
1358
- meta ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Group, { gap: "md", children: meta }) : null
1936
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Container, { size: "lg", py: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core32.Group, { align: "flex-start", gap: "xl", wrap: "nowrap", children: [
1937
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core32.Stack, { gap: "lg", maw: 760, flex: 1, children: [
1938
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core32.Stack, { gap: "sm", children: [
1939
+ eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Text, { size: "sm", fw: 700, c: "dimmed", tt: "uppercase", children: eyebrow }) : null,
1940
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Title, { order: 1, children: title }),
1941
+ lead ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Text, { size: "lg", c: "dimmed", children: lead }) : null,
1942
+ meta ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Group, { gap: "md", children: meta }) : null
1359
1943
  ] }),
1360
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Stack, { gap: "md", children })
1944
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Stack, { gap: "md", children })
1361
1945
  ] }),
1362
- sideRail ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_core24.Stack, { visibleFrom: "lg", gap: "md", w: 240, children: sideRail }) : null
1946
+ sideRail ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Stack, { visibleFrom: "lg", gap: "md", w: 240, children: sideRail }) : null
1363
1947
  ] }) });
1364
1948
  }
1365
1949
 
1366
1950
  // src/DocsCodeBlock.tsx
1367
- var import_react3 = require("react");
1368
- var import_core25 = require("@mantine/core");
1369
- var import_jsx_runtime26 = require("react/jsx-runtime");
1951
+ var import_react5 = require("react");
1952
+ var import_core33 = require("@mantine/core");
1953
+ var import_jsx_runtime34 = require("react/jsx-runtime");
1370
1954
  function DocsCodeBlock({ code, language, title, withCopy = true }) {
1371
- const [copied, setCopied] = (0, import_react3.useState)(false);
1955
+ const [copied, setCopied] = (0, import_react5.useState)(false);
1372
1956
  const handleCopy = async () => {
1373
1957
  if (!navigator?.clipboard) {
1374
1958
  return;
@@ -1377,44 +1961,44 @@ function DocsCodeBlock({ code, language, title, withCopy = true }) {
1377
1961
  setCopied(true);
1378
1962
  window.setTimeout(() => setCopied(false), 1200);
1379
1963
  };
1380
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Paper, { withBorder: true, radius: "lg", p: "md", children: /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_core25.Stack, { gap: "sm", children: [
1381
- title || withCopy ? /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_core25.Group, { justify: "space-between", align: "center", children: [
1382
- /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_core25.Stack, { gap: 0, children: [
1383
- title ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Text, { fw: 600, children: title }) : null,
1384
- language ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Text, { size: "xs", c: "dimmed", children: language }) : null
1964
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core33.Paper, { withBorder: true, radius: "lg", p: "md", children: /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Stack, { gap: "sm", children: [
1965
+ title || withCopy ? /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Group, { justify: "space-between", align: "center", children: [
1966
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Stack, { gap: 0, children: [
1967
+ title ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core33.Text, { fw: 600, children: title }) : null,
1968
+ language ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core33.Text, { size: "xs", c: "dimmed", children: language }) : null
1385
1969
  ] }),
1386
- withCopy ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1387
- import_core25.ActionIcon,
1970
+ withCopy ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
1971
+ import_core33.ActionIcon,
1388
1972
  {
1389
1973
  variant: "subtle",
1390
1974
  "aria-label": copied ? "Copied code block" : "Copy code block",
1391
1975
  onClick: () => {
1392
1976
  void handleCopy();
1393
1977
  },
1394
- children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(GdsIcons.Copy, { size: "1rem" })
1978
+ children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(GdsIcons.Copy, { size: "1rem" })
1395
1979
  }
1396
1980
  ) : null
1397
1981
  ] }) : null,
1398
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_core25.Code, { block: true, children: code })
1982
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core33.Code, { block: true, children: code })
1399
1983
  ] }) });
1400
1984
  }
1401
1985
 
1402
1986
  // src/CtaButtonGroup.tsx
1403
- var import_core26 = require("@mantine/core");
1404
- var import_jsx_runtime27 = require("react/jsx-runtime");
1987
+ var import_core34 = require("@mantine/core");
1988
+ var import_jsx_runtime35 = require("react/jsx-runtime");
1405
1989
  function CtaButtonGroup({ primary, secondary, tertiary }) {
1406
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_core26.Stack, { gap: "sm", children: [
1407
- /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(import_core26.Group, { gap: "sm", align: "stretch", children: [
1408
- /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { children: primary }),
1409
- secondary ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { children: secondary }) : null
1990
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core34.Stack, { gap: "sm", children: [
1991
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core34.Group, { gap: "sm", align: "stretch", children: [
1992
+ /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { children: primary }),
1993
+ secondary ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { children: secondary }) : null
1410
1994
  ] }),
1411
- tertiary ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { children: tertiary }) : null
1995
+ tertiary ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("div", { children: tertiary }) : null
1412
1996
  ] });
1413
1997
  }
1414
1998
 
1415
1999
  // src/DocsPageShell.tsx
1416
- var import_core27 = require("@mantine/core");
1417
- var import_jsx_runtime28 = require("react/jsx-runtime");
2000
+ var import_core35 = require("@mantine/core");
2001
+ var import_jsx_runtime36 = require("react/jsx-runtime");
1418
2002
  function DocsPageShell({
1419
2003
  breadcrumbs = [],
1420
2004
  title,
@@ -1425,27 +2009,27 @@ function DocsPageShell({
1425
2009
  footerNext,
1426
2010
  children
1427
2011
  }) {
1428
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Container, { size: "lg", py: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_core27.Group, { align: "flex-start", gap: "xl", wrap: "nowrap", children: [
1429
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_core27.Stack, { component: "article", gap: "lg", maw: 760, flex: 1, children: [
1430
- breadcrumbs.length ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Breadcrumbs, { children: breadcrumbs.map(
1431
- (crumb) => crumb.href ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Anchor, { href: crumb.href, children: crumb.label }, `${crumb.label}-${crumb.href}`) : /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Text, { children: crumb.label }, crumb.label)
2012
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Container, { size: "lg", py: "xl", children: /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core35.Group, { align: "flex-start", gap: "xl", wrap: "nowrap", children: [
2013
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core35.Stack, { component: "article", gap: "lg", maw: 760, flex: 1, children: [
2014
+ breadcrumbs.length ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Breadcrumbs, { children: breadcrumbs.map(
2015
+ (crumb) => crumb.href ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Anchor, { href: crumb.href, children: crumb.label }, `${crumb.label}-${crumb.href}`) : /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Text, { children: crumb.label }, crumb.label)
1432
2016
  ) }) : null,
1433
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_core27.Stack, { gap: "sm", children: [
1434
- eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Text, { size: "sm", fw: 700, c: "dimmed", children: eyebrow }) : null,
1435
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Title, { order: 1, children: title }),
1436
- lead ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Text, { size: "lg", c: "dimmed", children: lead }) : null,
1437
- meta ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Group, { gap: "md", children: meta }) : null
2017
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsxs)(import_core35.Stack, { gap: "sm", children: [
2018
+ eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Text, { size: "sm", fw: 700, c: "dimmed", children: eyebrow }) : null,
2019
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Title, { order: 1, children: title }),
2020
+ lead ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Text, { size: "lg", c: "dimmed", children: lead }) : null,
2021
+ meta ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Group, { gap: "md", children: meta }) : null
1438
2022
  ] }),
1439
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Stack, { gap: "md", children }),
1440
- footerNext ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Anchor, { href: footerNext.href, fw: 600, children: footerNext.label }) : null
2023
+ /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Stack, { gap: "md", children }),
2024
+ footerNext ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Anchor, { href: footerNext.href, fw: 600, children: footerNext.label }) : null
1441
2025
  ] }),
1442
- sideRail ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_core27.Stack, { visibleFrom: "lg", gap: "md", w: 240, children: sideRail }) : null
2026
+ sideRail ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Stack, { visibleFrom: "lg", gap: "md", w: 240, children: sideRail }) : null
1443
2027
  ] }) });
1444
2028
  }
1445
2029
 
1446
2030
  // src/EditorialHero.tsx
1447
- var import_core28 = require("@mantine/core");
1448
- var import_jsx_runtime29 = require("react/jsx-runtime");
2031
+ var import_core36 = require("@mantine/core");
2032
+ var import_jsx_runtime37 = require("react/jsx-runtime");
1449
2033
  function resolveActionVariant(action, index, seenPrimary) {
1450
2034
  const requested = action.variant ?? (index === 0 ? "primary" : "secondary");
1451
2035
  if (requested === "primary" && !seenPrimary) {
@@ -1457,8 +2041,8 @@ function resolveActionVariant(action, index, seenPrimary) {
1457
2041
  return { variant: "default", seenPrimary };
1458
2042
  }
1459
2043
  function HeroAction({ action, variant }) {
1460
- const content = /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1461
- import_core28.Anchor,
2044
+ const content = /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2045
+ import_core36.Anchor,
1462
2046
  {
1463
2047
  href: action.href,
1464
2048
  onClick: action.onClick,
@@ -1482,8 +2066,8 @@ function HeroAction({ action, variant }) {
1482
2066
  }
1483
2067
  );
1484
2068
  if (!action.href) {
1485
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1486
- import_core28.Box,
2069
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2070
+ import_core36.Box,
1487
2071
  {
1488
2072
  component: "button",
1489
2073
  type: "button",
@@ -1510,30 +2094,30 @@ function HeroAction({ action, variant }) {
1510
2094
  return content;
1511
2095
  }
1512
2096
  function LoadingHero({ compact }) {
1513
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Paper, { withBorder: true, radius: "xl", p: compact ? "lg" : "xl", children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Grid, { gutter: compact ? "lg" : "xl", align: "center", children: [
1514
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Grid.Col, { span: { base: 12, md: 6 }, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Stack, { gap: "md", children: [
1515
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Skeleton, { height: 16, width: 96, radius: "xl" }),
1516
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Skeleton, { height: 48, width: "90%", radius: "md" }),
1517
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Skeleton, { height: 18, width: "100%", radius: "md" }),
1518
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Skeleton, { height: 18, width: "82%", radius: "md" }),
1519
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Group, { children: [
1520
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Skeleton, { height: 40, width: 140, radius: "md" }),
1521
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Skeleton, { height: 40, width: 140, radius: "md" })
2097
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Paper, { withBorder: true, radius: "xl", p: compact ? "lg" : "xl", children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core36.Grid, { gutter: compact ? "lg" : "xl", align: "center", children: [
2098
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Grid.Col, { span: { base: 12, md: 6 }, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core36.Stack, { gap: "md", children: [
2099
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Skeleton, { height: 16, width: 96, radius: "xl" }),
2100
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Skeleton, { height: 48, width: "90%", radius: "md" }),
2101
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Skeleton, { height: 18, width: "100%", radius: "md" }),
2102
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Skeleton, { height: 18, width: "82%", radius: "md" }),
2103
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core36.Group, { children: [
2104
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Skeleton, { height: 40, width: 140, radius: "md" }),
2105
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Skeleton, { height: 40, width: 140, radius: "md" })
1522
2106
  ] })
1523
2107
  ] }) }),
1524
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Grid.Col, { span: { base: 12, md: 6 }, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.AspectRatio, { ratio: 16 / 11, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Skeleton, { radius: "lg" }) }) })
2108
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Grid.Col, { span: { base: 12, md: 6 }, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.AspectRatio, { ratio: 16 / 11, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Skeleton, { radius: "lg" }) }) })
1525
2109
  ] }) });
1526
2110
  }
1527
2111
  function MediaFallback() {
1528
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.AspectRatio, { ratio: 16 / 11, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1529
- import_core28.ThemeIcon,
2112
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.AspectRatio, { ratio: 16 / 11, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2113
+ import_core36.ThemeIcon,
1530
2114
  {
1531
2115
  size: "100%",
1532
2116
  radius: "lg",
1533
2117
  color: "gray",
1534
2118
  variant: "light",
1535
2119
  "aria-label": "Hero media is unavailable",
1536
- children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(GdsIcons.Gallery, { size: "2.5rem" })
2120
+ children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(GdsIcons.Gallery, { size: "2.5rem" })
1537
2121
  }
1538
2122
  ) });
1539
2123
  }
@@ -1553,8 +2137,8 @@ function MediaFrame({
1553
2137
  } else if (mediaFade === "soft-start") {
1554
2138
  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%)";
1555
2139
  }
1556
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
1557
- import_core28.Box,
2140
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
2141
+ import_core36.Box,
1558
2142
  {
1559
2143
  component: "figure",
1560
2144
  m: 0,
@@ -1567,9 +2151,9 @@ function MediaFrame({
1567
2151
  },
1568
2152
  "aria-label": mediaAlt,
1569
2153
  children: [
1570
- media ?? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(MediaFallback, {}),
1571
- media && overlayBackground ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1572
- import_core28.Box,
2154
+ media ?? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(MediaFallback, {}),
2155
+ media && overlayBackground ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2156
+ import_core36.Box,
1573
2157
  {
1574
2158
  "aria-hidden": true,
1575
2159
  style: {
@@ -1602,7 +2186,7 @@ function EditorialHero({
1602
2186
  classNames
1603
2187
  }) {
1604
2188
  if (loading) {
1605
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(LoadingHero, { compact });
2189
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(LoadingHero, { compact });
1606
2190
  }
1607
2191
  const stackAlign = align === "center" ? "center" : "flex-start";
1608
2192
  const textAlign = align === "center" ? "center" : "left";
@@ -1610,15 +2194,15 @@ function EditorialHero({
1610
2194
  const renderedActions = actions.slice(0, 3).map((action, index) => {
1611
2195
  const resolved = resolveActionVariant(action, index, seenPrimary);
1612
2196
  seenPrimary = resolved.seenPrimary;
1613
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(HeroAction, { action, variant: resolved.variant }, `${action.label}-${index}`);
2197
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(HeroAction, { action, variant: resolved.variant }, `${action.label}-${index}`);
1614
2198
  });
1615
- const textSlot = /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Stack, { gap: compact ? "md" : "lg", justify: "center", h: "100%", className: classNames?.content, children: [
1616
- /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Stack, { gap: "sm", align: stackAlign, children: [
1617
- eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Text, { size: "sm", fw: 700, c: "dimmed", ta: textAlign, children: eyebrow }) : null,
1618
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Title, { order: 1, maw: 760, ta: textAlign, children: title }),
1619
- description ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Text, { size: compact ? "md" : "lg", c: "dimmed", maw: 720, ta: textAlign, children: description }) : null
2199
+ const textSlot = /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core36.Stack, { gap: compact ? "md" : "lg", justify: "center", h: "100%", className: classNames?.content, children: [
2200
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core36.Stack, { gap: "sm", align: stackAlign, children: [
2201
+ eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Text, { size: "sm", fw: 700, c: "dimmed", ta: textAlign, children: eyebrow }) : null,
2202
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Title, { order: 1, maw: 760, ta: textAlign, children: title }),
2203
+ description ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Text, { size: compact ? "md" : "lg", c: "dimmed", maw: 720, ta: textAlign, children: description }) : null
1620
2204
  ] }),
1621
- renderedActions.length ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Box, { className: classNames?.actions, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
2205
+ renderedActions.length ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Box, { className: classNames?.actions, children: /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
1622
2206
  CtaButtonGroup,
1623
2207
  {
1624
2208
  primary: renderedActions[0],
@@ -1626,8 +2210,8 @@ function EditorialHero({
1626
2210
  tertiary: renderedActions[2]
1627
2211
  }
1628
2212
  ) }) : null,
1629
- meta.length ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Group, { gap: "sm", wrap: "wrap", "aria-label": "Supporting details", className: classNames?.meta, children: meta.map((item) => /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
1630
- import_core28.Group,
2213
+ meta.length ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Group, { gap: "sm", wrap: "wrap", "aria-label": "Supporting details", className: classNames?.meta, children: meta.map((item) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(
2214
+ import_core36.Group,
1631
2215
  {
1632
2216
  gap: 6,
1633
2217
  px: "sm",
@@ -1638,17 +2222,17 @@ function EditorialHero({
1638
2222
  },
1639
2223
  children: [
1640
2224
  item.icon,
1641
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Text, { size: "sm", c: "dimmed", children: item.label })
2225
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Text, { size: "sm", c: "dimmed", children: item.label })
1642
2226
  ]
1643
2227
  },
1644
2228
  item.id
1645
2229
  )) }) : null
1646
2230
  ] });
1647
- const mediaSlot = error ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(AccentPanel, { tone: "red", variant: "soft-outline", title: "Media unavailable", children: error }) : /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(MediaFrame, { media, mediaAlt, mediaFade, className: classNames?.media });
1648
- const textCol = /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Grid.Col, { span: { base: 12, md: 6 }, order: { base: 1, md: mediaPosition === "left" ? 2 : 1 }, children: textSlot });
1649
- const mediaCol = /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_core28.Grid.Col, { span: { base: 12, md: 6 }, order: { base: 2, md: mediaPosition === "left" ? 1 : 2 }, children: mediaSlot });
1650
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1651
- import_core28.Paper,
2231
+ const mediaSlot = error ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(AccentPanel, { tone: "red", variant: "soft-outline", title: "Media unavailable", children: error }) : /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(MediaFrame, { media, mediaAlt, mediaFade, className: classNames?.media });
2232
+ const textCol = /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Grid.Col, { span: { base: 12, md: 6 }, order: { base: 1, md: mediaPosition === "left" ? 2 : 1 }, children: textSlot });
2233
+ const mediaCol = /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Grid.Col, { span: { base: 12, md: 6 }, order: { base: 2, md: mediaPosition === "left" ? 1 : 2 }, children: mediaSlot });
2234
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(
2235
+ import_core36.Paper,
1652
2236
  {
1653
2237
  component: "section",
1654
2238
  withBorder: true,
@@ -1656,7 +2240,7 @@ function EditorialHero({
1656
2240
  p: compact ? "lg" : "xl",
1657
2241
  className: classNames?.root,
1658
2242
  style: surfaceVariant === "flat-public" ? { boxShadow: "none" } : void 0,
1659
- children: /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_core28.Grid, { gutter: compact ? "lg" : "xl", align: "center", children: [
2243
+ children: /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core36.Grid, { gutter: compact ? "lg" : "xl", align: "center", children: [
1660
2244
  textCol,
1661
2245
  mediaCol
1662
2246
  ] })
@@ -1665,19 +2249,19 @@ function EditorialHero({
1665
2249
  }
1666
2250
 
1667
2251
  // src/FeatureBand.tsx
1668
- var import_core29 = require("@mantine/core");
1669
- var import_jsx_runtime30 = require("react/jsx-runtime");
2252
+ var import_core37 = require("@mantine/core");
2253
+ var import_jsx_runtime38 = require("react/jsx-runtime");
1670
2254
  function FeatureBandSkeleton({
1671
2255
  columns = 3,
1672
2256
  bordered = true,
1673
2257
  variant = "default"
1674
2258
  }) {
1675
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.SimpleGrid, { cols: { base: 1, sm: Math.min(columns, 2), lg: columns }, spacing: "lg", children: Array.from({ length: columns }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Paper, { withBorder: bordered, radius: "lg", p: variant === "compact" ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Stack, { gap: "md", children: [
1676
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Skeleton, { height: variant === "process" ? 28 : 42, width: variant === "process" ? 72 : 42, radius: "xl" }),
1677
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Stack, { gap: "xs", children: [
1678
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Skeleton, { height: 20, width: "75%", radius: "md" }),
1679
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Skeleton, { height: 14, width: "100%", radius: "md" }),
1680
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Skeleton, { height: 14, width: "82%", radius: "md" })
2259
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.SimpleGrid, { cols: { base: 1, sm: Math.min(columns, 2), lg: columns }, spacing: "lg", children: Array.from({ length: columns }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.Paper, { withBorder: bordered, radius: "lg", p: variant === "compact" ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core37.Stack, { gap: "md", children: [
2260
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.Skeleton, { height: variant === "process" ? 28 : 42, width: variant === "process" ? 72 : 42, radius: "xl" }),
2261
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core37.Stack, { gap: "xs", children: [
2262
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.Skeleton, { height: 20, width: "75%", radius: "md" }),
2263
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.Skeleton, { height: 14, width: "100%", radius: "md" }),
2264
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.Skeleton, { height: 14, width: "82%", radius: "md" })
1681
2265
  ] })
1682
2266
  ] }) }, index)) });
1683
2267
  }
@@ -1690,10 +2274,10 @@ function FeatureBand({
1690
2274
  variant = "default"
1691
2275
  }) {
1692
2276
  if (loading) {
1693
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(FeatureBandSkeleton, { columns, bordered, variant });
2277
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(FeatureBandSkeleton, { columns, bordered, variant });
1694
2278
  }
1695
2279
  if (!items.length) {
1696
- return emptyState ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_jsx_runtime30.Fragment, { children: emptyState }) : /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
2280
+ return emptyState ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_jsx_runtime38.Fragment, { children: emptyState }) : /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
1697
2281
  EmptyState,
1698
2282
  {
1699
2283
  title: "No supporting details available",
@@ -1701,9 +2285,9 @@ function FeatureBand({
1701
2285
  }
1702
2286
  );
1703
2287
  }
1704
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Box, { component: "section", "aria-label": "Supporting features", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.SimpleGrid, { cols: { base: 1, sm: Math.min(columns, 2), lg: columns }, spacing: "lg", children: items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Paper, { withBorder: bordered, radius: "lg", p: variant === "compact" ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Stack, { gap: "md", children: [
1705
- variant === "process" ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
1706
- import_core29.Text,
2288
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.Box, { component: "section", "aria-label": "Supporting features", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.SimpleGrid, { cols: { base: 1, sm: Math.min(columns, 2), lg: columns }, spacing: "lg", children: items.map((item, index) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.Paper, { withBorder: bordered, radius: "lg", p: variant === "compact" ? "md" : "lg", children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core37.Stack, { gap: "md", children: [
2289
+ variant === "process" ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2290
+ import_core37.Text,
1707
2291
  {
1708
2292
  fw: 800,
1709
2293
  size: "sm",
@@ -1715,19 +2299,352 @@ function FeatureBand({
1715
2299
  },
1716
2300
  children: item.stepLabel ?? `Step ${index + 1}`
1717
2301
  }
1718
- ) }) : item.media ? item.media : item.icon ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.ThemeIcon, { size: "xl", radius: "xl", variant: "light", color: "violet", children: item.icon }) }) : /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.ThemeIcon, { size: "xl", radius: "xl", variant: "light", color: "gray", "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(GdsIcons.Info, { size: "1.25rem" }) }) }),
1719
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_core29.Stack, { gap: "xs", children: [
1720
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Title, { order: 4, children: item.title }),
1721
- item.description ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Text, { c: "dimmed", children: item.description }) : null,
1722
- item.meta ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_core29.Text, { size: "sm", c: "dimmed", children: item.meta }) : null
2302
+ ) }) : item.media ? item.media : item.icon ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.ThemeIcon, { size: "xl", radius: "xl", variant: "light", color: "violet", children: item.icon }) }) : /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.ThemeIcon, { size: "xl", radius: "xl", variant: "light", color: "gray", "aria-hidden": true, children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(GdsIcons.Info, { size: "1.25rem" }) }) }),
2303
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core37.Stack, { gap: "xs", children: [
2304
+ /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.Title, { order: 4, children: item.title }),
2305
+ item.description ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.Text, { c: "dimmed", children: item.description }) : null,
2306
+ item.meta ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.Text, { size: "sm", c: "dimmed", children: item.meta }) : null
1723
2307
  ] })
1724
2308
  ] }) }, item.id)) }) });
1725
2309
  }
1726
2310
 
2311
+ // src/MapPanel.tsx
2312
+ var import_core38 = require("@mantine/core");
2313
+ var import_jsx_runtime39 = require("react/jsx-runtime");
2314
+ function MapPanel({
2315
+ title,
2316
+ description,
2317
+ actions,
2318
+ loading = false,
2319
+ empty,
2320
+ error,
2321
+ embedTitle,
2322
+ iframeSrc,
2323
+ iframeSandbox = "allow-scripts allow-same-origin allow-popups",
2324
+ renderMap,
2325
+ minHeight = 320
2326
+ }) {
2327
+ let body;
2328
+ if (loading) {
2329
+ body = /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
2330
+ StateBlock,
2331
+ {
2332
+ variant: "loading",
2333
+ title: "Loading map",
2334
+ description: "The shared map panel is still preparing the embedded surface.",
2335
+ compact: true
2336
+ }
2337
+ );
2338
+ } else if (error) {
2339
+ body = /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(StateBlock, { variant: "error", title: "Map unavailable", description: error, compact: true });
2340
+ } else if (!iframeSrc && !renderMap) {
2341
+ body = /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
2342
+ StateBlock,
2343
+ {
2344
+ variant: "empty",
2345
+ title: "No map available",
2346
+ description: empty ?? "Add coordinates or a sanctioned embed source to render this panel.",
2347
+ compact: true
2348
+ }
2349
+ );
2350
+ } else if (renderMap) {
2351
+ body = /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core38.Box, { style: { minHeight }, children: renderMap() });
2352
+ } else {
2353
+ body = /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core38.AspectRatio, { ratio: 16 / 9, children: /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
2354
+ "iframe",
2355
+ {
2356
+ src: iframeSrc,
2357
+ title: embedTitle ?? "Embedded map",
2358
+ sandbox: iframeSandbox,
2359
+ loading: "lazy",
2360
+ referrerPolicy: "no-referrer-when-downgrade",
2361
+ style: { width: "100%", height: "100%", border: 0, borderRadius: 12 }
2362
+ }
2363
+ ) });
2364
+ }
2365
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core38.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core38.Stack, { gap: "md", children: [
2366
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core38.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
2367
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core38.Stack, { gap: 4, children: [
2368
+ /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core38.Title, { order: 3, children: title }),
2369
+ description ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core38.Text, { size: "sm", c: "dimmed", children: description }) : null
2370
+ ] }),
2371
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(ActionBar, { ...actions }) : null
2372
+ ] }),
2373
+ body
2374
+ ] }) });
2375
+ }
2376
+
2377
+ // src/PublicFlowShell.tsx
2378
+ var import_core39 = require("@mantine/core");
2379
+ var import_jsx_runtime40 = require("react/jsx-runtime");
2380
+ var stageTone = {
2381
+ idle: { label: "Idle", color: "gray" },
2382
+ loading: { label: "Loading", color: "blue" },
2383
+ ready: { label: "Ready", color: "teal" },
2384
+ error: { label: "Error", color: "red" },
2385
+ complete: { label: "Complete", color: "teal" }
2386
+ };
2387
+ function toActionBar(actions = []) {
2388
+ if (!actions.length) {
2389
+ return void 0;
2390
+ }
2391
+ const ordered = [...actions].sort((left, right) => {
2392
+ const rank = { primary: 0, secondary: 1, tertiary: 2 };
2393
+ return rank[left.priority] - rank[right.priority];
2394
+ });
2395
+ const primary = ordered.find((action) => action.priority === "primary");
2396
+ const secondary = ordered.filter((action) => action.priority === "secondary");
2397
+ const tertiary = ordered.filter((action) => action.priority === "tertiary");
2398
+ return {
2399
+ primary: primary ? {
2400
+ action: primary.action,
2401
+ disabled: primary.disabled,
2402
+ loading: primary.loading,
2403
+ onClick: primary.onClick
2404
+ } : void 0,
2405
+ secondary: secondary.map((action) => ({
2406
+ action: action.action,
2407
+ disabled: action.disabled,
2408
+ loading: action.loading,
2409
+ onClick: action.onClick
2410
+ })),
2411
+ tertiary: tertiary.map((action) => ({
2412
+ action: action.action,
2413
+ disabled: action.disabled,
2414
+ loading: action.loading,
2415
+ onClick: action.onClick
2416
+ }))
2417
+ };
2418
+ }
2419
+ function PublicFlowShell({
2420
+ stage,
2421
+ eyebrow,
2422
+ exitAction,
2423
+ hardwareSurface,
2424
+ emptyState,
2425
+ errorState
2426
+ }) {
2427
+ const tone = stageTone[stage.status];
2428
+ const actionBar = toActionBar(stage.actions);
2429
+ let body = stage.body;
2430
+ if (stage.status === "loading") {
2431
+ body = /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
2432
+ StateBlock,
2433
+ {
2434
+ variant: "loading",
2435
+ title: "Preparing flow",
2436
+ description: stage.description ?? "The current public flow stage is still loading."
2437
+ }
2438
+ );
2439
+ } else if (stage.status === "error") {
2440
+ body = errorState ?? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
2441
+ StateBlock,
2442
+ {
2443
+ variant: "error",
2444
+ title: "Flow unavailable",
2445
+ description: stage.description ?? "This public flow could not continue safely."
2446
+ }
2447
+ );
2448
+ } else if (!stage.body && !hardwareSurface) {
2449
+ body = emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
2450
+ EmptyState,
2451
+ {
2452
+ title: "No stage content available",
2453
+ description: "Add the current flow stage body or a bounded hardware surface to render this contract."
2454
+ }
2455
+ );
2456
+ }
2457
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core39.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core39.Stack, { gap: "lg", children: [
2458
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core39.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
2459
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core39.Stack, { gap: 4, children: [
2460
+ eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core39.Text, { size: "xs", fw: 700, c: "dimmed", tt: "uppercase", children: eyebrow }) : null,
2461
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core39.Group, { gap: "sm", wrap: "wrap", children: [
2462
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core39.Title, { order: 2, children: stage.title }),
2463
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core39.Badge, { variant: "light", color: tone.color, children: tone.label })
2464
+ ] }),
2465
+ stage.description ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core39.Text, { size: "sm", c: "dimmed", children: stage.description }) : null
2466
+ ] }),
2467
+ exitAction
2468
+ ] }),
2469
+ stage.notice ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core39.Text, { size: "sm", c: "dimmed", children: stage.notice }) : null,
2470
+ body,
2471
+ hardwareSurface,
2472
+ stage.aside,
2473
+ actionBar ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(ActionBar, { ...actionBar }) : null
2474
+ ] }) });
2475
+ }
2476
+
2477
+ // src/PlaybackSurface.tsx
2478
+ var import_core40 = require("@mantine/core");
2479
+ var import_jsx_runtime41 = require("react/jsx-runtime");
2480
+ var stateTone = {
2481
+ loading: { label: "Loading", color: "blue" },
2482
+ ready: { label: "Ready", color: "teal" },
2483
+ playing: { label: "Playing", color: "teal" },
2484
+ empty: { label: "Empty", color: "gray" },
2485
+ error: { label: "Error", color: "red" },
2486
+ degraded: { label: "Degraded", color: "orange" }
2487
+ };
2488
+ function PlaybackSurface({
2489
+ title,
2490
+ state,
2491
+ media,
2492
+ statusMessage,
2493
+ controls,
2494
+ emptyState,
2495
+ errorState,
2496
+ overlays,
2497
+ mode = "embedded"
2498
+ }) {
2499
+ const tone = stateTone[state];
2500
+ let content;
2501
+ if (state === "loading") {
2502
+ content = /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
2503
+ StateBlock,
2504
+ {
2505
+ variant: "loading",
2506
+ title: "Loading playback",
2507
+ description: "The playback surface is still preparing timed or fullscreen media."
2508
+ }
2509
+ );
2510
+ } else if (state === "empty") {
2511
+ content = emptyState ?? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
2512
+ EmptyState,
2513
+ {
2514
+ title: "No playback content available",
2515
+ description: "Add media assets or a playlist to render this playback surface."
2516
+ }
2517
+ );
2518
+ } else if (state === "error") {
2519
+ content = errorState ?? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
2520
+ StateBlock,
2521
+ {
2522
+ variant: "error",
2523
+ title: "Playback unavailable",
2524
+ description: "The playback surface could not render the current media safely."
2525
+ }
2526
+ );
2527
+ } else {
2528
+ content = /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core40.Stack, { gap: "md", children: [
2529
+ media,
2530
+ overlays
2531
+ ] });
2532
+ }
2533
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core40.Paper, { withBorder: true, radius: "xl", p: "lg", "data-playback-mode": mode, children: /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core40.Stack, { gap: "md", children: [
2534
+ title || statusMessage || controls ? /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core40.Group, { justify: "space-between", align: "flex-start", gap: "md", wrap: "wrap", children: [
2535
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core40.Stack, { gap: 4, children: [
2536
+ title ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core40.Title, { order: 3, children: title }) : null,
2537
+ statusMessage ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core40.Text, { size: "sm", c: "dimmed", children: statusMessage }) : null
2538
+ ] }),
2539
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core40.Group, { gap: "sm", align: "center", wrap: "wrap", children: [
2540
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core40.Badge, { variant: "light", color: tone.color, children: tone.label }),
2541
+ controls
2542
+ ] })
2543
+ ] }) : null,
2544
+ state === "degraded" ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
2545
+ StateBlock,
2546
+ {
2547
+ variant: "info",
2548
+ title: "Playback degraded",
2549
+ description: statusMessage ?? "Playback is continuing with reduced fidelity or recoverable media failures.",
2550
+ compact: true
2551
+ }
2552
+ ) : null,
2553
+ content
2554
+ ] }) });
2555
+ }
2556
+
2557
+ // src/ShareButtonGroup.tsx
2558
+ var import_react6 = require("react");
2559
+ var import_core41 = require("@mantine/core");
2560
+ var import_jsx_runtime42 = require("react/jsx-runtime");
2561
+ var channelLabels = {
2562
+ native: "Share",
2563
+ copy: "Copy link",
2564
+ mail: "Email",
2565
+ message: "Message",
2566
+ x: "Share on X",
2567
+ facebook: "Share on Facebook",
2568
+ linkedin: "Share on LinkedIn",
2569
+ whatsapp: "Share on WhatsApp",
2570
+ telegram: "Share on Telegram"
2571
+ };
2572
+ function encodeShare(url, title, text) {
2573
+ const safeUrl = encodeURIComponent(url);
2574
+ const safeTitle = encodeURIComponent(title ?? "");
2575
+ const safeText = encodeURIComponent(text ?? title ?? "");
2576
+ return {
2577
+ mail: `mailto:?subject=${safeTitle}&body=${safeText ? `${safeText}%0A%0A` : ""}${safeUrl}`,
2578
+ message: `sms:?&body=${safeText ? `${safeText}%20` : ""}${safeUrl}`,
2579
+ x: `https://x.com/intent/tweet?text=${safeText ? `${safeText}%20` : ""}${safeUrl}`,
2580
+ facebook: `https://www.facebook.com/sharer/sharer.php?u=${safeUrl}`,
2581
+ linkedin: `https://www.linkedin.com/sharing/share-offsite/?url=${safeUrl}`,
2582
+ whatsapp: `https://wa.me/?text=${safeText ? `${safeText}%20` : ""}${safeUrl}`,
2583
+ telegram: `https://t.me/share/url?url=${safeUrl}&text=${safeText}`
2584
+ };
2585
+ }
2586
+ function ShareAction({
2587
+ channel,
2588
+ compact,
2589
+ href,
2590
+ onClick
2591
+ }) {
2592
+ const label = channelLabels[channel];
2593
+ const Icon = channel === "copy" ? GdsIcons.Copy : channel === "mail" ? GdsIcons.Mail : channel === "message" ? GdsIcons.Message : GdsIcons.Refer;
2594
+ if (compact) {
2595
+ return href ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core41.ActionIcon, { component: "a", href, target: "_blank", rel: "noreferrer", variant: "subtle", size: "lg", "aria-label": label, children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Icon, { size: "1rem", stroke: 1.75 }) }) : /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core41.ActionIcon, { variant: "subtle", size: "lg", "aria-label": label, onClick, children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Icon, { size: "1rem", stroke: 1.75 }) });
2596
+ }
2597
+ return href ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core41.Button, { component: "a", href, target: "_blank", rel: "noreferrer", variant: "default", leftSection: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Icon, { size: "1rem", stroke: 1.75 }), children: label }) : /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core41.Button, { variant: "default", leftSection: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(Icon, { size: "1rem", stroke: 1.75 }), onClick, children: label });
2598
+ }
2599
+ function ShareButtonGroup({
2600
+ url,
2601
+ title,
2602
+ text,
2603
+ channels = ["native", "copy", "mail"],
2604
+ compact = false,
2605
+ label = "Share this",
2606
+ description
2607
+ }) {
2608
+ const [copied, setCopied] = (0, import_react6.useState)(false);
2609
+ const [shared, setShared] = (0, import_react6.useState)(false);
2610
+ const hrefs = encodeShare(url, title, text);
2611
+ async function handleCopy() {
2612
+ await navigator.clipboard?.writeText?.(url);
2613
+ setCopied(true);
2614
+ setTimeout(() => setCopied(false), 1800);
2615
+ }
2616
+ async function handleNativeShare() {
2617
+ if (navigator.share) {
2618
+ await navigator.share({ url, title, text });
2619
+ setShared(true);
2620
+ setTimeout(() => setShared(false), 1800);
2621
+ return;
2622
+ }
2623
+ await handleCopy();
2624
+ }
2625
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core41.Stack, { gap: "sm", children: [
2626
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_core41.Stack, { gap: 2, children: [
2627
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core41.Text, { fw: 600, children: label }),
2628
+ description ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core41.Text, { size: "sm", c: "dimmed", children: description }) : null
2629
+ ] }),
2630
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core41.Group, { gap: "sm", wrap: "wrap", children: channels.map((channel) => {
2631
+ if (channel === "copy") {
2632
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(ShareAction, { channel, compact, onClick: () => void handleCopy() }, channel);
2633
+ }
2634
+ if (channel === "native") {
2635
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(ShareAction, { channel, compact, onClick: () => void handleNativeShare() }, channel);
2636
+ }
2637
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(ShareAction, { channel, compact, href: hrefs[channel] }, channel);
2638
+ }) }),
2639
+ copied ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core41.Text, { size: "sm", c: "teal", children: "Link copied." }) : null,
2640
+ shared ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_core41.Text, { size: "sm", c: "teal", children: "Share sheet opened." }) : null
2641
+ ] });
2642
+ }
2643
+
1727
2644
  // src/UploadDropzone.tsx
1728
- var import_react4 = require("react");
1729
- var import_core30 = require("@mantine/core");
1730
- var import_jsx_runtime31 = require("react/jsx-runtime");
2645
+ var import_react7 = require("react");
2646
+ var import_core42 = require("@mantine/core");
2647
+ var import_jsx_runtime43 = require("react/jsx-runtime");
1731
2648
  function UploadDropzone({
1732
2649
  title,
1733
2650
  description,
@@ -1737,8 +2654,8 @@ function UploadDropzone({
1737
2654
  actionLabel = "Choose files",
1738
2655
  mode = "panel"
1739
2656
  }) {
1740
- const inputRef = (0, import_react4.useRef)(null);
1741
- const [dragging, setDragging] = (0, import_react4.useState)(false);
2657
+ const inputRef = (0, import_react7.useRef)(null);
2658
+ const [dragging, setDragging] = (0, import_react7.useState)(false);
1742
2659
  const UploadIcon = GdsIcons.Upload;
1743
2660
  const forwardFiles = (files) => {
1744
2661
  if (!files?.length || !onFilesSelected) {
@@ -1746,8 +2663,8 @@ function UploadDropzone({
1746
2663
  }
1747
2664
  onFilesSelected(Array.from(files));
1748
2665
  };
1749
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
1750
- import_core30.Box,
2666
+ return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
2667
+ import_core42.Box,
1751
2668
  {
1752
2669
  onDragOver: (event) => {
1753
2670
  event.preventDefault();
@@ -1766,7 +2683,7 @@ function UploadDropzone({
1766
2683
  background: dragging ? "var(--mantine-color-violet-light)" : "transparent"
1767
2684
  },
1768
2685
  children: [
1769
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
2686
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
1770
2687
  "input",
1771
2688
  {
1772
2689
  ref: inputRef,
@@ -1777,11 +2694,11 @@ function UploadDropzone({
1777
2694
  onChange: (event) => forwardFiles(event.currentTarget.files)
1778
2695
  }
1779
2696
  ),
1780
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(import_core30.Stack, { align: mode === "inline" ? "flex-start" : "center", ta: mode === "inline" ? "left" : "center", gap: "sm", children: [
1781
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(UploadIcon, { size: "1.5rem" }),
1782
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Text, { fw: 600, children: title }),
1783
- description ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Text, { size: "sm", c: "dimmed", children: description }) : null,
1784
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_core30.Button, { variant: "light", onClick: () => inputRef.current?.click(), children: actionLabel }) })
2697
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(import_core42.Stack, { align: mode === "inline" ? "flex-start" : "center", ta: mode === "inline" ? "left" : "center", gap: "sm", children: [
2698
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(UploadIcon, { size: "1.5rem" }),
2699
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core42.Text, { fw: 600, children: title }),
2700
+ description ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core42.Text, { size: "sm", c: "dimmed", children: description }) : null,
2701
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core42.Group, { children: /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_core42.Button, { variant: "light", onClick: () => inputRef.current?.click(), children: actionLabel }) })
1785
2702
  ] })
1786
2703
  ]
1787
2704
  }
@@ -1789,22 +2706,22 @@ function UploadDropzone({
1789
2706
  }
1790
2707
 
1791
2708
  // src/MediaField.tsx
1792
- var import_core32 = require("@mantine/core");
2709
+ var import_core44 = require("@mantine/core");
1793
2710
 
1794
2711
  // src/FormField.tsx
1795
- var import_core31 = require("@mantine/core");
1796
- var import_jsx_runtime32 = require("react/jsx-runtime");
2712
+ var import_core43 = require("@mantine/core");
2713
+ var import_jsx_runtime44 = require("react/jsx-runtime");
1797
2714
  function FormField({ label, description, error, children }) {
1798
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.Box, { component: "label", children: /* @__PURE__ */ (0, import_jsx_runtime32.jsxs)(import_core31.Stack, { gap: 4, children: [
1799
- typeof label === "string" ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.Text, { size: "xs", fw: 600, c: "dimmed", children: label }) : label,
1800
- description ? typeof description === "string" ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.Text, { size: "xs", c: "dimmed", children: description }) : description : null,
2715
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core43.Box, { component: "label", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_core43.Stack, { gap: 4, children: [
2716
+ typeof label === "string" ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core43.Text, { size: "xs", fw: 600, c: "dimmed", children: label }) : label,
2717
+ description ? typeof description === "string" ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core43.Text, { size: "xs", c: "dimmed", children: description }) : description : null,
1801
2718
  children,
1802
- error ? typeof error === "string" ? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_core31.Text, { size: "xs", c: "red.7", children: error }) : error : null
2719
+ error ? typeof error === "string" ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_core43.Text, { size: "xs", c: "red.7", children: error }) : error : null
1803
2720
  ] }) });
1804
2721
  }
1805
2722
 
1806
2723
  // src/MediaField.tsx
1807
- var import_jsx_runtime33 = require("react/jsx-runtime");
2724
+ var import_jsx_runtime45 = require("react/jsx-runtime");
1808
2725
  var stateLabels = {
1809
2726
  empty: { label: "Empty", color: "gray" },
1810
2727
  selected: { label: "Selected", color: "blue" },
@@ -1832,32 +2749,32 @@ function MediaField({
1832
2749
  mode = "stacked"
1833
2750
  }) {
1834
2751
  const stateBadge = stateLabels[state];
1835
- const resolvedRemoveAction = removeAction ?? (onRemove ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Button, { type: "button", variant: "light", color: "red", onClick: onRemove, children: "Remove" }) : null);
1836
- const resolvedResetAction = resetAction ?? (onReset ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Button, { type: "button", variant: "default", onClick: onReset, children: "Reset" }) : null);
1837
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2752
+ const resolvedRemoveAction = removeAction ?? (onRemove ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core44.Button, { type: "button", variant: "light", color: "red", onClick: onRemove, children: "Remove" }) : null);
2753
+ const resolvedResetAction = resetAction ?? (onReset ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core44.Button, { type: "button", variant: "default", onClick: onReset, children: "Reset" }) : null);
2754
+ return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
1838
2755
  FormField,
1839
2756
  {
1840
2757
  label,
1841
2758
  description,
1842
2759
  error,
1843
- children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core32.Stack, { gap: "md", children: [
1844
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Group, { justify: "flex-end", align: "center", gap: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core32.Group, { gap: "xs", justify: "flex-end", children: [
1845
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Badge, { variant: "light", color: stateBadge.color, children: stateBadge.label }),
2760
+ children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core44.Paper, { withBorder: true, radius: "xl", p: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_core44.Stack, { gap: "md", children: [
2761
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core44.Group, { justify: "flex-end", align: "center", gap: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_core44.Group, { gap: "xs", justify: "flex-end", children: [
2762
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core44.Badge, { variant: "light", color: stateBadge.color, children: stateBadge.label }),
1846
2763
  statusAction
1847
2764
  ] }) }),
1848
2765
  preview ? preview : null,
1849
- uploadControl || urlInput ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_jsx_runtime33.Fragment, { children: [
1850
- /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Divider, {}),
1851
- /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core32.Stack, { gap: "sm", style: mode === "split" ? { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))" } : void 0, children: [
2766
+ uploadControl || urlInput ? /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_jsx_runtime45.Fragment, { children: [
2767
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core44.Divider, {}),
2768
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_core44.Stack, { gap: "sm", style: mode === "split" ? { display: "grid", gridTemplateColumns: "repeat(auto-fit, minmax(220px, 1fr))" } : void 0, children: [
1852
2769
  uploadControl,
1853
2770
  urlInput
1854
2771
  ] })
1855
2772
  ] }) : null,
1856
- value ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Text, { size: "sm", c: "dimmed", style: { wordBreak: "break-all" }, children: value }) : null,
1857
- helpText ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Text, { size: "sm", c: "dimmed", children: helpText }) : null,
1858
- policyText ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_core32.Text, { size: "sm", c: error ? "red.7" : "dimmed", children: policyText }) : null,
2773
+ value ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core44.Text, { size: "sm", c: "dimmed", style: { wordBreak: "break-all" }, children: value }) : null,
2774
+ helpText ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core44.Text, { size: "sm", c: "dimmed", children: helpText }) : null,
2775
+ policyText ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_core44.Text, { size: "sm", c: error ? "red.7" : "dimmed", children: policyText }) : null,
1859
2776
  typeof error !== "string" && error ? error : null,
1860
- resolvedRemoveAction || resolvedResetAction ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_core32.Group, { gap: "sm", children: [
2777
+ resolvedRemoveAction || resolvedResetAction ? /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_core44.Group, { gap: "sm", children: [
1861
2778
  resolvedResetAction,
1862
2779
  retryAction,
1863
2780
  resolvedRemoveAction
@@ -1868,50 +2785,50 @@ function MediaField({
1868
2785
  }
1869
2786
 
1870
2787
  // src/MediaCard.tsx
1871
- var import_core33 = require("@mantine/core");
1872
- var import_jsx_runtime34 = require("react/jsx-runtime");
2788
+ var import_core45 = require("@mantine/core");
2789
+ var import_jsx_runtime46 = require("react/jsx-runtime");
1873
2790
  function MediaCard({ title, image, description, status, overlay, actions = [] }) {
1874
2791
  const EyeIcon = GdsIcons.Eye;
1875
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Card, { withBorder: true, radius: "lg", padding: "md", children: [
1876
- /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Card.Section, { pos: "relative", children: [
2792
+ return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_core45.Card, { withBorder: true, radius: "lg", padding: "md", children: [
2793
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_core45.Card.Section, { pos: "relative", children: [
1877
2794
  image,
1878
- overlay ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { style: { position: "absolute", inset: 12, display: "flex", justifyContent: "flex-end", alignItems: "flex-start" }, children: overlay }) : null
2795
+ overlay ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { style: { position: "absolute", inset: 12, display: "flex", justifyContent: "flex-end", alignItems: "flex-start" }, children: overlay }) : null
1879
2796
  ] }),
1880
- /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Stack, { gap: "sm", mt: "md", children: [
1881
- /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Group, { justify: "space-between", align: "flex-start", children: [
1882
- /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(import_core33.Stack, { gap: 4, children: [
1883
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core33.Title, { order: 4, children: title }),
1884
- description ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core33.Text, { size: "sm", c: "dimmed", lineClamp: 2, children: description }) : null
2797
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_core45.Stack, { gap: "sm", mt: "md", children: [
2798
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_core45.Group, { justify: "space-between", align: "flex-start", children: [
2799
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(import_core45.Stack, { gap: 4, children: [
2800
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core45.Title, { order: 4, children: title }),
2801
+ description ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core45.Text, { size: "sm", c: "dimmed", lineClamp: 2, children: description }) : null
1885
2802
  ] }),
1886
- status ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core33.Badge, { variant: "light", children: status }) : null
2803
+ status ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core45.Badge, { variant: "light", children: status }) : null
1887
2804
  ] }),
1888
- actions.length ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core33.Group, { justify: "flex-end", gap: "xs", children: actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_core33.ActionIcon, { variant: "light", "aria-label": action.label, onClick: action.onClick, children: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(EyeIcon, { size: "1rem" }) }, action.label)) }) : null
2805
+ actions.length ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core45.Group, { justify: "flex-end", gap: "xs", children: actions.map((action) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_core45.ActionIcon, { variant: "light", "aria-label": action.label, onClick: action.onClick, children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(EyeIcon, { size: "1rem" }) }, action.label)) }) : null
1889
2806
  ] })
1890
2807
  ] });
1891
2808
  }
1892
2809
 
1893
2810
  // src/AccessSummary.tsx
1894
- var import_core34 = require("@mantine/core");
1895
- var import_jsx_runtime35 = require("react/jsx-runtime");
2811
+ var import_core46 = require("@mantine/core");
2812
+ var import_jsx_runtime47 = require("react/jsx-runtime");
1896
2813
  function AccessSummary({ title, roles, scope, blocked = false, description }) {
1897
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.Card, { withBorder: true, radius: "lg", padding: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core34.Stack, { gap: "sm", children: [
1898
- /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core34.Group, { justify: "space-between", align: "center", children: [
1899
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.Title, { order: 4, children: title }),
1900
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.Badge, { color: blocked ? "red" : "teal", variant: "light", children: blocked ? "Blocked" : "Allowed" })
2814
+ return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core46.Card, { withBorder: true, radius: "lg", padding: "lg", children: /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(import_core46.Stack, { gap: "sm", children: [
2815
+ /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(import_core46.Group, { justify: "space-between", align: "center", children: [
2816
+ /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core46.Title, { order: 4, children: title }),
2817
+ /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core46.Badge, { color: blocked ? "red" : "teal", variant: "light", children: blocked ? "Blocked" : "Allowed" })
1901
2818
  ] }),
1902
- /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.Group, { gap: "xs", children: roles.map((role) => /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.Badge, { variant: "outline", children: role }, role)) }),
1903
- scope ? /* @__PURE__ */ (0, import_jsx_runtime35.jsxs)(import_core34.Text, { size: "sm", c: "dimmed", children: [
2819
+ /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core46.Group, { gap: "xs", children: roles.map((role) => /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core46.Badge, { variant: "outline", children: role }, role)) }),
2820
+ scope ? /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(import_core46.Text, { size: "sm", c: "dimmed", children: [
1904
2821
  "Scope: ",
1905
2822
  scope
1906
2823
  ] }) : null,
1907
- description ? /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(import_core34.Text, { size: "sm", children: description }) : null
2824
+ description ? /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_core46.Text, { size: "sm", children: description }) : null
1908
2825
  ] }) });
1909
2826
  }
1910
2827
 
1911
2828
  // src/AccessRecoveryPanel.tsx
1912
- var import_core35 = require("@mantine/core");
1913
- var import_gds_theme3 = require("@doneisbetter/gds-theme");
1914
- var import_jsx_runtime36 = require("react/jsx-runtime");
2829
+ var import_core47 = require("@mantine/core");
2830
+ var import_gds_theme4 = require("@doneisbetter/gds-theme");
2831
+ var import_jsx_runtime48 = require("react/jsx-runtime");
1915
2832
  var stateBlockVariantByState = {
1916
2833
  unauthenticated: "permission",
1917
2834
  "expired-session": "info",
@@ -1980,7 +2897,7 @@ function ActionGroup({
1980
2897
  if (actions.length === 0) {
1981
2898
  return null;
1982
2899
  }
1983
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_core35.Group, { gap: "sm", justify: "center", wrap: "wrap", children: actions.map((actionConfig, index) => /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2900
+ return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_core47.Group, { gap: "sm", justify: "center", wrap: "wrap", children: actions.map((actionConfig, index) => /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
1984
2901
  SemanticButton,
1985
2902
  {
1986
2903
  action: actionConfig.action,
@@ -2006,7 +2923,7 @@ function AccessRecoveryPanel({
2006
2923
  supportAction,
2007
2924
  compact = false
2008
2925
  }) {
2009
- const { t } = (0, import_gds_theme3.useGdsTranslation)();
2926
+ const { t } = (0, import_gds_theme4.useGdsTranslation)();
2010
2927
  const defaultCopy = defaultCopyByState[state];
2011
2928
  const defaults = defaultActionsForState(state, {
2012
2929
  onRetry,
@@ -2014,14 +2931,14 @@ function AccessRecoveryPanel({
2014
2931
  onBack,
2015
2932
  supportAction
2016
2933
  });
2017
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2934
+ return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
2018
2935
  StateBlock,
2019
2936
  {
2020
2937
  variant: stateBlockVariantByState[state],
2021
2938
  compact,
2022
2939
  title: title ?? t(`gds.accessRecovery.${state}.title`, defaultCopy.title),
2023
2940
  description: description ?? t(`gds.accessRecovery.${state}.description`, defaultCopy.description),
2024
- action: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2941
+ action: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
2025
2942
  ActionGroup,
2026
2943
  {
2027
2944
  primaryAction: primaryAction ?? defaults.primary,
@@ -2034,8 +2951,8 @@ function AccessRecoveryPanel({
2034
2951
  }
2035
2952
 
2036
2953
  // src/PageHeader.tsx
2037
- var import_core36 = require("@mantine/core");
2038
- var import_jsx_runtime37 = require("react/jsx-runtime");
2954
+ var import_core48 = require("@mantine/core");
2955
+ var import_jsx_runtime49 = require("react/jsx-runtime");
2039
2956
  function PageHeader({
2040
2957
  title,
2041
2958
  description,
@@ -2046,19 +2963,19 @@ function PageHeader({
2046
2963
  }) {
2047
2964
  const resolvedDescription = description ?? subtitle;
2048
2965
  const eyebrowProps = eyebrowVariant === "ornamental" ? { tt: "uppercase", style: { letterSpacing: "0.12em" } } : {};
2049
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core36.Group, { justify: "space-between", align: "flex-start", gap: "lg", wrap: "wrap", children: [
2050
- /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(import_core36.Stack, { gap: "xs", children: [
2051
- eyebrow && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Text, { size: "xs", fw: 700, c: "dimmed", ...eyebrowProps, children: eyebrow }),
2052
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Title, { order: 1, children: title }),
2053
- resolvedDescription && /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Text, { c: "dimmed", maw: 720, children: resolvedDescription })
2966
+ return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_core48.Group, { justify: "space-between", align: "flex-start", gap: "lg", wrap: "wrap", children: [
2967
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_core48.Stack, { gap: "xs", children: [
2968
+ eyebrow && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core48.Text, { size: "xs", fw: 700, c: "dimmed", ...eyebrowProps, children: eyebrow }),
2969
+ /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core48.Title, { order: 1, children: title }),
2970
+ resolvedDescription && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core48.Text, { c: "dimmed", maw: 720, children: resolvedDescription })
2054
2971
  ] }),
2055
- actions ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_core36.Box, { children: actions }) : null
2972
+ actions ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_core48.Box, { children: actions }) : null
2056
2973
  ] });
2057
2974
  }
2058
2975
 
2059
2976
  // src/FilterDrawer.tsx
2060
- var import_core37 = require("@mantine/core");
2061
- var import_jsx_runtime38 = require("react/jsx-runtime");
2977
+ var import_core49 = require("@mantine/core");
2978
+ var import_jsx_runtime50 = require("react/jsx-runtime");
2062
2979
  function FilterDrawer({
2063
2980
  opened,
2064
2981
  onClose,
@@ -2074,8 +2991,8 @@ function FilterDrawer({
2074
2991
  }) {
2075
2992
  const resolvedPrimaryAction = applyAction ?? primaryAction;
2076
2993
  const resolvedSecondaryAction = resetAction ?? secondaryAction;
2077
- return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2078
- import_core37.Drawer,
2994
+ return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
2995
+ import_core49.Drawer,
2079
2996
  {
2080
2997
  opened,
2081
2998
  onClose,
@@ -2083,11 +3000,11 @@ function FilterDrawer({
2083
3000
  position: mode === "bottom-sheet" ? "bottom" : "right",
2084
3001
  size: mode === "bottom-sheet" ? "auto" : "md",
2085
3002
  radius: mode === "bottom-sheet" ? "xl" : void 0,
2086
- children: /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core37.Stack, { gap: "md", children: [
2087
- description ? /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_core37.Text, { size: "sm", c: "dimmed", children: description }) : null,
3003
+ children: /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core49.Stack, { gap: "md", children: [
3004
+ description ? /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_core49.Text, { size: "sm", c: "dimmed", children: description }) : null,
2088
3005
  children,
2089
- resolvedPrimaryAction || resolvedSecondaryAction || closeAction ? /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core37.Group, { justify: "space-between", mt: "md", children: [
2090
- /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)(import_core37.Group, { gap: "sm", children: [
3006
+ resolvedPrimaryAction || resolvedSecondaryAction || closeAction ? /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core49.Group, { justify: "space-between", mt: "md", children: [
3007
+ /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(import_core49.Group, { gap: "sm", children: [
2091
3008
  closeAction,
2092
3009
  resolvedSecondaryAction
2093
3010
  ] }),
@@ -2099,8 +3016,8 @@ function FilterDrawer({
2099
3016
  }
2100
3017
 
2101
3018
  // src/PlaceholderPanel.tsx
2102
- var import_core38 = require("@mantine/core");
2103
- var import_jsx_runtime39 = require("react/jsx-runtime");
3019
+ var import_core50 = require("@mantine/core");
3020
+ var import_jsx_runtime51 = require("react/jsx-runtime");
2104
3021
  function PlaceholderPanel({
2105
3022
  title,
2106
3023
  description,
@@ -2110,16 +3027,16 @@ function PlaceholderPanel({
2110
3027
  mode
2111
3028
  }) {
2112
3029
  if (mode === "live" && children) {
2113
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_jsx_runtime39.Fragment, { children });
3030
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_jsx_runtime51.Fragment, { children });
2114
3031
  }
2115
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core38.Card, { children: /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core38.Stack, { gap: "md", children: [
2116
- badge ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core38.Badge, { variant: "light", color: "blue", w: "fit-content", children: badge }) : null,
2117
- /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(import_core38.Stack, { gap: "xs", children: [
2118
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core38.Title, { order: 4, children: title }),
2119
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core38.Text, { c: "dimmed", children: description })
3032
+ return /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core50.Card, { children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_core50.Stack, { gap: "md", children: [
3033
+ badge ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core50.Badge, { variant: "light", color: "blue", w: "fit-content", children: badge }) : null,
3034
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(import_core50.Stack, { gap: "xs", children: [
3035
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core50.Title, { order: 4, children: title }),
3036
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core50.Text, { c: "dimmed", children: description })
2120
3037
  ] }),
2121
- footer ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_core38.Text, { size: "sm", children: footer }) : null,
2122
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
3038
+ footer ? /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_core50.Text, { size: "sm", children: footer }) : null,
3039
+ /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
2123
3040
  StateBlock,
2124
3041
  {
2125
3042
  variant: "not-enough-data",
@@ -2132,8 +3049,8 @@ function PlaceholderPanel({
2132
3049
  }
2133
3050
 
2134
3051
  // src/SimpleDataTable.tsx
2135
- var import_core39 = require("@mantine/core");
2136
- var import_jsx_runtime40 = require("react/jsx-runtime");
3052
+ var import_core51 = require("@mantine/core");
3053
+ var import_jsx_runtime52 = require("react/jsx-runtime");
2137
3054
  function SimpleDataTable({
2138
3055
  columns,
2139
3056
  rows,
@@ -2144,23 +3061,23 @@ function SimpleDataTable({
2144
3061
  getRowKey
2145
3062
  }) {
2146
3063
  if (error) {
2147
- return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(StateBlock, { variant: "error", title: "Unable to load data", description: error, compact: true });
3064
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(StateBlock, { variant: "error", title: "Unable to load data", description: error, compact: true });
2148
3065
  }
2149
3066
  if (loading) {
2150
- return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(StateBlock, { variant: "loading", title: "Loading data", description: "Please wait while the shared dataset is prepared.", compact: true });
3067
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(StateBlock, { variant: "loading", title: "Loading data", description: "Please wait while the shared dataset is prepared.", compact: true });
2151
3068
  }
2152
3069
  if (!rows.length) {
2153
- return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(StateBlock, { variant: "empty", title: emptyTitle, description: emptyDescription, compact: true });
3070
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(StateBlock, { variant: "empty", title: emptyTitle, description: emptyDescription, compact: true });
2154
3071
  }
2155
- return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core39.ScrollArea, { children: /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(import_core39.Table, { striped: true, highlightOnHover: true, withTableBorder: true, withColumnBorders: true, children: [
2156
- /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core39.Table.Thead, { children: /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core39.Table.Tr, { children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core39.Table.Th, { children: column.header }, String(column.key))) }) }),
2157
- /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core39.Table.Tbody, { children: rows.map((row, index) => /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core39.Table.Tr, { children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_core39.Table.Td, { children: column.render ? column.render(row) : String(row[column.key] ?? "") }, String(column.key))) }, getRowKey ? getRowKey(row, index) : index)) })
3072
+ return /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_core51.ScrollArea, { children: /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(import_core51.Table, { striped: true, highlightOnHover: true, withTableBorder: true, withColumnBorders: true, children: [
3073
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_core51.Table.Thead, { children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_core51.Table.Tr, { children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_core51.Table.Th, { children: column.header }, String(column.key))) }) }),
3074
+ /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_core51.Table.Tbody, { children: rows.map((row, index) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_core51.Table.Tr, { children: columns.map((column) => /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(import_core51.Table.Td, { children: column.render ? column.render(row) : String(row[column.key] ?? "") }, String(column.key))) }, getRowKey ? getRowKey(row, index) : index)) })
2158
3075
  ] }) });
2159
3076
  }
2160
3077
 
2161
3078
  // src/StatsSection.tsx
2162
- var import_core40 = require("@mantine/core");
2163
- var import_jsx_runtime41 = require("react/jsx-runtime");
3079
+ var import_core52 = require("@mantine/core");
3080
+ var import_jsx_runtime53 = require("react/jsx-runtime");
2164
3081
  function StatsSection({
2165
3082
  title,
2166
3083
  loading = false,
@@ -2172,11 +3089,11 @@ function StatsSection({
2172
3089
  }) {
2173
3090
  let content = children;
2174
3091
  if (error) {
2175
- content = /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(StateBlock, { variant: "error", title: "Unable to load statistics", description: error, compact: true });
3092
+ content = /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(StateBlock, { variant: "error", title: "Unable to load statistics", description: error, compact: true });
2176
3093
  } else if (loading) {
2177
- content = /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(StateBlock, { variant: "loading", title: "Loading statistics", description: "This shared data surface is still synchronizing.", compact: true });
3094
+ content = /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(StateBlock, { variant: "loading", title: "Loading statistics", description: "This shared data surface is still synchronizing.", compact: true });
2178
3095
  } else if (belowThreshold) {
2179
- content = /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(
3096
+ content = /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(
2180
3097
  StateBlock,
2181
3098
  {
2182
3099
  variant: "not-enough-data",
@@ -2186,10 +3103,10 @@ function StatsSection({
2186
3103
  }
2187
3104
  );
2188
3105
  } else if (placeholder) {
2189
- content = /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(PlaceholderPanel, { ...placeholder, mode: "placeholder" });
3106
+ content = /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(PlaceholderPanel, { ...placeholder, mode: "placeholder" });
2190
3107
  }
2191
- return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_core40.Stack, { gap: "md", children: [
2192
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_core40.Title, { order: 3, children: title }),
3108
+ return /* @__PURE__ */ (0, import_jsx_runtime53.jsxs)(import_core52.Stack, { gap: "md", children: [
3109
+ /* @__PURE__ */ (0, import_jsx_runtime53.jsx)(import_core52.Title, { order: 3, children: title }),
2193
3110
  content
2194
3111
  ] });
2195
3112
  }
@@ -3501,6 +4418,7 @@ function getGdsMessages(locale) {
3501
4418
  AccentPanel,
3502
4419
  AccessRecoveryPanel,
3503
4420
  AccessSummary,
4421
+ ActionBar,
3504
4422
  ArticleShell,
3505
4423
  AuthShell,
3506
4424
  BrowseSurface,
@@ -3510,6 +4428,8 @@ function getGdsMessages(locale) {
3510
4428
  ConsumerSection,
3511
4429
  CtaButtonGroup,
3512
4430
  DataToolbar,
4431
+ DetailProfileShell,
4432
+ DiscoveryShell,
3513
4433
  DocsCodeBlock,
3514
4434
  DocsPageShell,
3515
4435
  EditorialCard,
@@ -3517,31 +4437,43 @@ function getGdsMessages(locale) {
3517
4437
  EmptyState,
3518
4438
  FeatureBand,
3519
4439
  FilterDrawer,
4440
+ FoodMenuSection,
3520
4441
  FormField,
3521
4442
  GameBoardTile,
3522
4443
  GdsIcons,
3523
4444
  GdsVocabulary,
4445
+ ListingCard,
4446
+ MapPanel,
3524
4447
  MediaCard,
3525
4448
  MediaField,
3526
4449
  MetricCard,
3527
4450
  PageHeader,
3528
4451
  PlaceholderPanel,
4452
+ PlaybackSurface,
3529
4453
  ProductCard,
3530
4454
  ProgressCard,
3531
4455
  PublicBrandFooter,
4456
+ PublicFlowShell,
4457
+ PublicFoodCard,
3532
4458
  PublicNav,
3533
4459
  PublicProductCard,
3534
4460
  PublicShell,
3535
4461
  PublicSiteFooter,
3536
4462
  SectionPanel,
3537
4463
  SemanticButton,
4464
+ ShareButtonGroup,
4465
+ SidebarNav,
4466
+ SidebarNavItem,
4467
+ SidebarNavSection,
3538
4468
  SimpleDataTable,
4469
+ SocialAuthButtons,
3539
4470
  StateBlock,
3540
4471
  StatsSection,
3541
4472
  StatusBadge,
3542
4473
  ThemeToggle,
3543
4474
  UploadDropzone,
3544
4475
  ar,
4476
+ createGdsVocabularyPack,
3545
4477
  de,
3546
4478
  en,
3547
4479
  es,
@@ -3553,6 +4485,8 @@ function getGdsMessages(locale) {
3553
4485
  he,
3554
4486
  hu,
3555
4487
  it,
4488
+ mergeGdsVocabularyPacks,
3556
4489
  resolveAccentPanelStyles,
4490
+ resolveSemanticActionConfig,
3557
4491
  ru
3558
4492
  });