@burdenoff/microfe-tours 2026.601.1 → 2026.624.1

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.
@@ -558,7 +558,7 @@ function g() {
558
558
  return y ? /* @__PURE__ */ u("div", {
559
559
  className: "flex h-full items-center justify-center p-3 sm:p-6",
560
560
  children: /* @__PURE__ */ u("p", {
561
- className: "text-sm text-muted-foreground",
561
+ className: "text-sm text-text-secondary",
562
562
  children: f("tourBuilder.loading")
563
563
  })
564
564
  }) : C ? /* @__PURE__ */ d("div", {
@@ -575,46 +575,46 @@ function g() {
575
575
  }), /* @__PURE__ */ d("div", {
576
576
  className: "flex-1",
577
577
  children: [/* @__PURE__ */ u("h1", {
578
- className: "text-xl sm:text-2xl font-bold text-foreground",
578
+ className: "text-xl sm:text-2xl font-bold text-text-primary",
579
579
  children: f(p && p !== "new" ? "tourBuilder.titleEdit" : "tourBuilder.titleCreate")
580
580
  }), /* @__PURE__ */ u("p", {
581
- className: "text-sm text-muted-foreground",
581
+ className: "text-sm text-text-secondary",
582
582
  children: f("tourBuilder.subtitle")
583
583
  })]
584
584
  })]
585
585
  }),
586
586
  b ? /* @__PURE__ */ d("div", {
587
- className: "rounded-md border border-border bg-card p-4 sm:p-6",
587
+ className: "rounded-md border border-border-subtle bg-bg-surface p-4 sm:p-6",
588
588
  children: [
589
589
  /* @__PURE__ */ d("div", {
590
590
  className: "flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between",
591
591
  children: [/* @__PURE__ */ d("div", {
592
592
  className: "space-y-1",
593
593
  children: [/* @__PURE__ */ u("h2", {
594
- className: "text-lg font-semibold text-foreground",
594
+ className: "text-lg font-semibold text-text-primary",
595
595
  children: f("tourBuilder.seedVibeControls.title")
596
596
  }), /* @__PURE__ */ u("p", {
597
- className: "text-sm text-muted-foreground",
597
+ className: "text-sm text-text-secondary",
598
598
  children: f("tourBuilder.seedVibeControls.description")
599
599
  })]
600
600
  }), /* @__PURE__ */ d("button", {
601
601
  type: "button",
602
602
  onClick: () => void Me(),
603
603
  disabled: B || !w,
604
- className: "inline-flex min-h-11 items-center justify-center gap-2 rounded-md border border-border bg-secondary px-4 py-2 text-sm font-medium text-secondary-foreground hover:bg-secondary/80 disabled:cursor-not-allowed disabled:opacity-50",
604
+ className: "inline-flex min-h-11 items-center justify-center gap-2 rounded-md border border-border-subtle bg-secondary px-4 py-2 text-sm font-medium text-secondary-foreground hover:bg-secondary/80 disabled:cursor-not-allowed disabled:opacity-50",
605
605
  children: [/* @__PURE__ */ u(ue, { size: 18 }), f(B ? "tourBuilder.seedVibeControls.loading" : "tourBuilder.seedVibeControls.button")]
606
606
  })]
607
607
  }),
608
608
  w ? null : /* @__PURE__ */ u("p", {
609
- className: "mt-3 text-sm text-muted-foreground",
609
+ className: "mt-3 text-sm text-text-secondary",
610
610
  children: f("tourBuilder.seedVibeControls.permissionHint")
611
611
  }),
612
612
  W ? /* @__PURE__ */ u("p", {
613
- className: "mt-3 text-sm text-destructive",
613
+ className: "mt-3 text-sm text-status-error-text",
614
614
  children: W
615
615
  }) : null,
616
616
  H ? /* @__PURE__ */ u("div", {
617
- className: "mt-3 rounded-md border border-border bg-background p-3 text-sm text-muted-foreground",
617
+ className: "mt-3 rounded-md border border-border-subtle bg-bg-surface p-3 text-sm text-text-secondary",
618
618
  children: f("tourBuilder.seedVibeControls.result", {
619
619
  totalCount: H.totalCount,
620
620
  productId: H.productId,
@@ -630,7 +630,7 @@ function g() {
630
630
  className: "space-y-6",
631
631
  children: [
632
632
  /* @__PURE__ */ d("div", {
633
- className: "border border-border rounded-md p-4 sm:p-6 bg-card",
633
+ className: "border border-border-subtle rounded-md p-4 sm:p-6 bg-bg-surface",
634
634
  children: [/* @__PURE__ */ u("h2", {
635
635
  className: "text-lg font-semibold mb-4",
636
636
  children: f("tourBuilder.sectionBasicInfo")
@@ -649,7 +649,7 @@ function g() {
649
649
  ...M,
650
650
  name: e.target.value
651
651
  }),
652
- className: "w-full px-3 py-2 border border-border rounded-md bg-background text-foreground",
652
+ className: "w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary",
653
653
  required: !0,
654
654
  "aria-label": f("tourBuilder.labelName")
655
655
  })] }),
@@ -665,7 +665,7 @@ function g() {
665
665
  description: e.target.value
666
666
  }),
667
667
  rows: 3,
668
- className: "w-full px-3 py-2 border border-border rounded-md bg-background text-foreground",
668
+ className: "w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary",
669
669
  "aria-label": f("tourBuilder.labelDescription")
670
670
  })] }),
671
671
  /* @__PURE__ */ d("div", { children: [
@@ -694,7 +694,7 @@ function g() {
694
694
  pageId: void 0
695
695
  });
696
696
  },
697
- className: "w-full px-3 py-2 border border-border rounded-md bg-background text-foreground",
697
+ className: "w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary",
698
698
  required: !0,
699
699
  "aria-label": f("tourBuilder.labelProductId"),
700
700
  children: [
@@ -736,7 +736,7 @@ function g() {
736
736
  moduleId: void 0,
737
737
  pageId: void 0
738
738
  }),
739
- className: "mt-2 w-full px-3 py-2 border border-border rounded-md bg-background text-foreground",
739
+ className: "mt-2 w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary",
740
740
  placeholder: "vibecontrols",
741
741
  required: !0
742
742
  }) : null
@@ -767,7 +767,7 @@ function g() {
767
767
  pageId: void 0
768
768
  });
769
769
  },
770
- className: "w-full px-3 py-2 border border-border rounded-md bg-background text-foreground",
770
+ className: "w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary",
771
771
  disabled: !M.productId,
772
772
  "aria-label": "Module ID",
773
773
  children: [
@@ -804,7 +804,7 @@ function g() {
804
804
  moduleId: e.target.value || void 0,
805
805
  pageId: void 0
806
806
  }),
807
- className: "mt-2 w-full px-3 py-2 border border-border rounded-md bg-background text-foreground",
807
+ className: "mt-2 w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary",
808
808
  placeholder: "vibecontrols"
809
809
  }) : null
810
810
  ] }), /* @__PURE__ */ d("div", { children: [
@@ -829,7 +829,7 @@ function g() {
829
829
  pageId: e.target.value || void 0
830
830
  });
831
831
  },
832
- className: "w-full px-3 py-2 border border-border rounded-md bg-background text-foreground",
832
+ className: "w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary",
833
833
  disabled: !M.productId,
834
834
  "aria-label": "Page ID",
835
835
  children: [
@@ -865,7 +865,7 @@ function g() {
865
865
  ...M,
866
866
  pageId: e.target.value || void 0
867
867
  }),
868
- className: "mt-2 w-full px-3 py-2 border border-border rounded-md bg-background text-foreground",
868
+ className: "mt-2 w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary",
869
869
  placeholder: "agents"
870
870
  }) : null
871
871
  ] })]
@@ -890,7 +890,7 @@ function g() {
890
890
  })]
891
891
  }),
892
892
  /* @__PURE__ */ d("div", {
893
- className: "border border-border rounded-md p-4 sm:p-6 bg-card",
893
+ className: "border border-border-subtle rounded-md p-4 sm:p-6 bg-bg-surface",
894
894
  children: [/* @__PURE__ */ u("h2", {
895
895
  className: "text-lg font-semibold mb-4",
896
896
  children: f("tourBuilder.sectionTriggerSettings")
@@ -908,7 +908,7 @@ function g() {
908
908
  ...M,
909
909
  triggerType: e.target.value
910
910
  }),
911
- className: "w-full px-3 py-2 border border-border rounded-md bg-background text-foreground",
911
+ className: "w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary",
912
912
  "aria-label": f("tourBuilder.labelTriggerType"),
913
913
  children: [
914
914
  /* @__PURE__ */ u("option", {
@@ -950,7 +950,7 @@ function g() {
950
950
  priority: t
951
951
  });
952
952
  },
953
- className: "w-full px-3 py-2 border border-border rounded-md bg-background text-foreground",
953
+ className: "w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary",
954
954
  "aria-label": f("tourBuilder.labelPriority")
955
955
  })] }),
956
956
  /* @__PURE__ */ d("div", {
@@ -967,7 +967,7 @@ function g() {
967
967
  ...M,
968
968
  startDate: e.target.value ? new Date(e.target.value).toISOString() : void 0
969
969
  }),
970
- className: "w-full px-3 py-2 border border-border rounded-md bg-background text-foreground",
970
+ className: "w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary",
971
971
  "aria-label": "Start Date"
972
972
  })] }), /* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("label", {
973
973
  className: "block text-sm font-medium mb-2",
@@ -981,7 +981,7 @@ function g() {
981
981
  ...M,
982
982
  endDate: e.target.value ? new Date(e.target.value).toISOString() : void 0
983
983
  }),
984
- className: "w-full px-3 py-2 border border-border rounded-md bg-background text-foreground",
984
+ className: "w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary",
985
985
  "aria-label": "End Date"
986
986
  })] })]
987
987
  })
@@ -989,24 +989,24 @@ function g() {
989
989
  })]
990
990
  }),
991
991
  k && /* @__PURE__ */ d("div", {
992
- className: "border border-destructive rounded-md p-4 bg-destructive/10",
992
+ className: "border border-status-error-border rounded-md p-4 bg-status-error-bg/10",
993
993
  children: [/* @__PURE__ */ u("h3", {
994
- className: "font-semibold text-destructive mb-2",
994
+ className: "font-semibold text-status-error-text mb-2",
995
995
  children: f("tourBuilder.errorTitle")
996
996
  }), /* @__PURE__ */ u("p", {
997
- className: "text-sm text-destructive",
997
+ className: "text-sm text-status-error-text",
998
998
  children: k.message
999
999
  })]
1000
1000
  }),
1001
1001
  O.length > 0 && /* @__PURE__ */ d("div", {
1002
- className: "border border-destructive rounded-md p-4 bg-destructive/10",
1002
+ className: "border border-status-error-border rounded-md p-4 bg-status-error-bg/10",
1003
1003
  children: [/* @__PURE__ */ u("h3", {
1004
- className: "font-semibold text-destructive mb-2",
1004
+ className: "font-semibold text-status-error-text mb-2",
1005
1005
  children: f("tourBuilder.validationErrorsTitle")
1006
1006
  }), /* @__PURE__ */ u("ul", {
1007
1007
  className: "list-disc list-inside space-y-1",
1008
1008
  children: O.map((e) => /* @__PURE__ */ u("li", {
1009
- className: "text-sm text-destructive",
1009
+ className: "text-sm text-status-error-text",
1010
1010
  children: e.message
1011
1011
  }, e.message))
1012
1012
  })]
@@ -1018,7 +1018,7 @@ function g() {
1018
1018
  children: /* @__PURE__ */ d("button", {
1019
1019
  type: "submit",
1020
1020
  disabled: D || !C,
1021
- className: "flex-1 min-w-[200px] px-4 py-2 bg-primary text-primary-foreground rounded-md hover:bg-primary/90 disabled:opacity-50 flex items-center justify-center gap-2",
1021
+ className: "flex-1 min-w-[200px] px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg/90 disabled:opacity-50 flex items-center justify-center gap-2",
1022
1022
  children: [/* @__PURE__ */ u(le, { size: 20 }), f(D ? "tourBuilder.saving" : p && p !== "new" ? "tourBuilder.updateTour" : "tourBuilder.createAndAddSteps")]
1023
1023
  })
1024
1024
  }), p && p !== "new" && /* @__PURE__ */ d(de, { children: [
@@ -1030,7 +1030,7 @@ function g() {
1030
1030
  /* @__PURE__ */ u(ce, { size: 20 }),
1031
1031
  f("tourBuilder.editSteps"),
1032
1032
  T?.steps && T.steps.length > 0 && /* @__PURE__ */ u("span", {
1033
- className: "ml-1 px-2 py-0.5 text-xs bg-primary/20 rounded-full",
1033
+ className: "ml-1 px-2 py-0.5 text-xs bg-action-primary-bg/20 rounded-full",
1034
1034
  children: T.steps.length
1035
1035
  })
1036
1036
  ]
@@ -1038,19 +1038,19 @@ function g() {
1038
1038
  /* @__PURE__ */ d("button", {
1039
1039
  type: "button",
1040
1040
  onClick: () => m(`${g}/${p}/preview`),
1041
- className: "px-4 py-2 border border-border rounded-md hover:bg-accent flex items-center gap-2",
1041
+ className: "px-4 py-2 border border-border-subtle rounded-md hover:bg-accent flex items-center gap-2",
1042
1042
  children: [/* @__PURE__ */ u(oe, { size: 20 }), f("tourBuilder.preview")]
1043
1043
  }),
1044
1044
  /* @__PURE__ */ d("button", {
1045
1045
  type: "button",
1046
1046
  onClick: () => m(`${g}/${p}/analytics`),
1047
- className: "px-4 py-2 border border-border rounded-md hover:bg-accent flex items-center gap-2",
1047
+ className: "px-4 py-2 border border-border-subtle rounded-md hover:bg-accent flex items-center gap-2",
1048
1048
  children: [/* @__PURE__ */ u(ie, { size: 20 }), f("tourBuilder.analytics")]
1049
1049
  }),
1050
1050
  /* @__PURE__ */ d("button", {
1051
1051
  type: "button",
1052
1052
  onClick: () => m(`${g}/${p}/schedule`),
1053
- className: "px-4 py-2 border border-border rounded-md hover:bg-accent flex items-center gap-2",
1053
+ className: "px-4 py-2 border border-border-subtle rounded-md hover:bg-accent flex items-center gap-2",
1054
1054
  children: [/* @__PURE__ */ u(ae, { size: 20 }), "Schedule"]
1055
1055
  }),
1056
1056
  /* @__PURE__ */ u(l, {
@@ -1059,7 +1059,7 @@ function g() {
1059
1059
  type: "button",
1060
1060
  onClick: je,
1061
1061
  disabled: !Se,
1062
- className: "px-4 py-2 border border-border rounded-md hover:bg-accent flex items-center gap-2 disabled:opacity-50",
1062
+ className: "px-4 py-2 border border-border-subtle rounded-md hover:bg-accent flex items-center gap-2 disabled:opacity-50",
1063
1063
  children: [/* @__PURE__ */ u(se, { size: 20 }), "Save as Template"]
1064
1064
  })
1065
1065
  })
@@ -1073,15 +1073,15 @@ function g() {
1073
1073
  children: /* @__PURE__ */ d("div", {
1074
1074
  className: "text-center space-y-4",
1075
1075
  children: [/* @__PURE__ */ d("div", { children: [/* @__PURE__ */ u("h2", {
1076
- className: "text-lg font-semibold text-foreground mb-2",
1076
+ className: "text-lg font-semibold text-text-primary mb-2",
1077
1077
  children: f("tourBuilder.accessDeniedTitle")
1078
1078
  }), /* @__PURE__ */ u("p", {
1079
- className: "text-sm text-muted-foreground",
1079
+ className: "text-sm text-text-secondary",
1080
1080
  children: f(b ? "tourBuilder.createAccessDeniedMessage" : "tourBuilder.updateAccessDeniedMessage")
1081
1081
  })] }), /* @__PURE__ */ u("button", {
1082
1082
  type: "button",
1083
1083
  onClick: Ae,
1084
- className: "inline-flex items-center justify-center rounded-md border border-border px-4 py-2 text-sm font-medium text-foreground hover:bg-accent",
1084
+ className: "inline-flex items-center justify-center rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent",
1085
1085
  children: f("tourBuilder.goBack")
1086
1086
  })]
1087
1087
  })
@@ -1 +1 @@
1
- {"version":3,"file":"TourBuilderPage.js","names":[],"sources":["../../../src/tours/pages/TourBuilderPage.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport {\n Save,\n ArrowLeft,\n Eye,\n ListOrdered,\n BarChart3,\n Calendar,\n LayoutTemplate,\n Sparkles,\n} from 'lucide-react';\nimport { gql } from '@apollo/client/core';\nimport { PermissionGate } from '@burdenoff/fe-libs/shared/components';\nimport { useEventBus } from '@burdenoff/fe-libs/shared/events';\nimport { useGatewayClient } from '@burdenoff/fe-libs/shared/graphql';\nimport { useTourBuilder } from '../hooks/useTourBuilder';\nimport { useTourLifecycle } from '../hooks/useTourLifecycle';\nimport { useToursPermissionAccess } from '../hooks/useToursPermissionAccess';\nimport { useToursContext } from '../providers/ToursProvider';\nimport { TOUR_PERMISSIONS } from '../../constants/permissions';\nimport type { Tour, TourTriggerType } from '../types';\nimport { useToursI18n } from '../i18n';\nimport { emitToursApiFailed } from '../telemetry';\nimport { useGetPlatformProductsForToursQuery } from '../../generated/global-operations';\n\n// Covers the current platform catalog with room for planned products; custom slug entry remains the fallback.\nconst PLATFORM_PRODUCTS_QUERY_LIMIT = 250;\n\nconst SEED_VIBECONTROLS_USER_TOURS = gql`\n mutation SeedVibeControlsUserTours {\n seedVibeControlsUserTours {\n productId\n workspaceId\n createdCount\n updatedCount\n totalCount\n tours {\n tourId\n slug\n name\n action\n stepCount\n }\n }\n }\n`;\n\ninterface SeededUserTourResult {\n tourId: string;\n slug: string;\n name: string;\n action: string;\n stepCount: number;\n}\n\ninterface SeedVibeControlsUserToursPayload {\n productId: string;\n workspaceId: string;\n createdCount: number;\n updatedCount: number;\n totalCount: number;\n tours: SeededUserTourResult[];\n}\n\ninterface SeedVibeControlsUserToursMutation {\n seedVibeControlsUserTours: SeedVibeControlsUserToursPayload;\n}\n\nfunction getMutationErrorMessage(result: unknown): string | null {\n if (!result || typeof result !== 'object') return null;\n\n const record = result as Record<string, unknown>;\n const singleError = record.error;\n if (singleError instanceof Error) return singleError.message;\n\n const errors = record.errors;\n if (!Array.isArray(errors) || errors.length === 0) return null;\n\n const messages = errors\n .map((error) => {\n if (error instanceof Error) return error.message;\n if (!error || typeof error !== 'object') return null;\n\n const message = (error as { message?: unknown }).message;\n return typeof message === 'string' ? message : null;\n })\n .filter((message): message is string => Boolean(message));\n\n return messages.length > 0 ? messages.join('; ') : 'Seed mutation returned errors.';\n}\n\ninterface TourRouteModuleOption {\n moduleId: string;\n label: string;\n path: string;\n}\n\ninterface TourRoutePageOption {\n pageId: string;\n label: string;\n path: string;\n}\n\ninterface TourRouteCatalogEntry {\n productId: string;\n moduleId: string;\n moduleLabel: string;\n pageId: string;\n pageLabel: string;\n path: string;\n isModuleHome?: boolean;\n}\n\nconst TOUR_ROUTE_CATALOG: readonly TourRouteCatalogEntry[] = [\n {\n productId: 'vibecontrols',\n moduleId: 'dashboard',\n moduleLabel: 'Dashboard',\n pageId: 'dashboard',\n pageLabel: 'Dashboard',\n path: '/dashboard',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'home',\n pageLabel: 'Overview',\n path: '/vibecontrols',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'agents',\n pageLabel: 'Targets & Agents',\n path: '/vibecontrols/agents',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'vibes',\n pageLabel: 'Vibes',\n path: '/vibecontrols/vibes',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'sessions',\n pageLabel: 'Sessions',\n path: '/vibecontrols/sessions',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'ai',\n pageLabel: 'AI',\n path: '/vibecontrols/ai',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'catalogs',\n pageLabel: 'Catalogs',\n path: '/vibecontrols/catalogs',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'components',\n pageLabel: 'Components',\n path: '/vibecontrols/components',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'templates',\n pageLabel: 'Templates',\n path: '/vibecontrols/templates',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'actions',\n pageLabel: 'Actions',\n path: '/vibecontrols/actions',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'vibedeck',\n pageLabel: 'Decks',\n path: '/vibecontrols/vibedeck',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'calendar',\n pageLabel: 'Calendar',\n path: '/vibecontrols/calendar',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'tunnels',\n pageLabel: 'Tunnels',\n path: '/vibecontrols/tunnels',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'analytics',\n pageLabel: 'Analytics',\n path: '/vibecontrols/analytics',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'audit',\n pageLabel: 'Audit Log',\n path: '/vibecontrols/audit',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'health',\n pageLabel: 'Health',\n path: '/vibecontrols/health',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'settings',\n pageLabel: 'Settings',\n path: '/vibecontrols/settings',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'scheduler',\n moduleLabel: 'Scheduler',\n pageId: 'scheduler',\n pageLabel: 'Scheduler',\n path: '/scheduler',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'sandbox',\n moduleLabel: 'Sandbox',\n pageId: 'sandbox',\n pageLabel: 'Sandbox',\n path: '/sandbox',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'support',\n moduleLabel: 'Support',\n pageId: 'tickets',\n pageLabel: 'Tickets',\n path: '/support/tickets',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'support',\n moduleLabel: 'Support',\n pageId: 'knowledge-base',\n pageLabel: 'Knowledge Base',\n path: '/support/kb',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'notifications',\n moduleLabel: 'Notifications',\n pageId: 'center',\n pageLabel: 'Notification Center',\n path: '/notifications/center',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'notifications',\n moduleLabel: 'Notifications',\n pageId: 'history',\n pageLabel: 'History',\n path: '/notifications/history',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'notifications',\n moduleLabel: 'Notifications',\n pageId: 'preferences',\n pageLabel: 'Preferences',\n path: '/notifications/preferences',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'conversations',\n moduleLabel: 'Conversations',\n pageId: 'home',\n pageLabel: 'All Conversations',\n path: '/conversations',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'conversations',\n moduleLabel: 'Conversations',\n pageId: 'list',\n pageLabel: 'Conversation List',\n path: '/conversations/list',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'conversations',\n moduleLabel: 'Conversations',\n pageId: 'new',\n pageLabel: 'New Conversation',\n path: '/conversations/new',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'conversations',\n moduleLabel: 'Conversations',\n pageId: 'settings',\n pageLabel: 'Settings',\n path: '/conversations/settings',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'auth',\n moduleLabel: 'Auth',\n pageId: 'home',\n pageLabel: 'Auth',\n path: '/auth/security',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'groups',\n moduleLabel: 'Groups and Teams',\n pageId: 'home',\n pageLabel: 'Groups and Teams',\n path: '/groups',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'tags',\n moduleLabel: 'Tags',\n pageId: 'home',\n pageLabel: 'Tags',\n path: '/tags',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'files',\n moduleLabel: 'Files',\n pageId: 'home',\n pageLabel: 'Files',\n path: '/files/browse',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'security',\n moduleLabel: 'Vault',\n pageId: 'home',\n pageLabel: 'Vault',\n path: '/security',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'integrations',\n moduleLabel: 'Integrations',\n pageId: 'home',\n pageLabel: 'Integrations',\n path: '/integrations',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'export',\n moduleLabel: 'Exports',\n pageId: 'home',\n pageLabel: 'Exports',\n path: '/export',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'organizations',\n moduleLabel: 'Organizations',\n pageId: 'home',\n pageLabel: 'Organizations',\n path: '/organizations',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'workspaces',\n moduleLabel: 'Workspaces',\n pageId: 'home',\n pageLabel: 'Workspaces',\n path: '/workspaces',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'billing',\n moduleLabel: 'Billing',\n pageId: 'home',\n pageLabel: 'Billing',\n path: '/billing/overview',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'store',\n moduleLabel: 'Marketplace',\n pageId: 'home',\n pageLabel: 'Marketplace',\n path: '/store/marketplace',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'channels',\n moduleLabel: 'Channels',\n pageId: 'home',\n pageLabel: 'Channels',\n path: '/channels',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'devportal',\n moduleLabel: 'Developer Portal',\n pageId: 'home',\n pageLabel: 'Developer Portal',\n path: '/devportal',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'feature-previews',\n moduleLabel: 'Feature Previews',\n pageId: 'home',\n pageLabel: 'Feature Previews',\n path: '/feature-previews',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'search',\n moduleLabel: 'Search',\n pageId: 'home',\n pageLabel: 'Search',\n path: '/search',\n isModuleHome: true,\n },\n] as const;\n\nfunction normalizeCatalogValue(value: string | null | undefined): string | undefined {\n const normalized = value?.trim();\n return normalized ? normalized : undefined;\n}\n\nfunction getRouteCatalog(productId: string | null | undefined): TourRouteCatalogEntry[] {\n const productKey = normalizeCatalogValue(productId);\n if (!productKey) return [];\n return TOUR_ROUTE_CATALOG.filter((entry) => entry.productId === productKey);\n}\n\nfunction getTourRouteModules(productId: string | null | undefined): TourRouteModuleOption[] {\n const modules = new Map<string, TourRouteModuleOption>();\n\n for (const entry of getRouteCatalog(productId)) {\n const existing = modules.get(entry.moduleId);\n if (!existing || entry.isModuleHome) {\n modules.set(entry.moduleId, {\n moduleId: entry.moduleId,\n label: entry.moduleLabel,\n path: entry.path,\n });\n }\n }\n\n return [...modules.values()];\n}\n\nfunction getTourRoutePages(\n productId: string | null | undefined,\n moduleId: string | null | undefined\n): TourRoutePageOption[] {\n const moduleKey = normalizeCatalogValue(moduleId);\n if (!moduleKey) return [];\n\n return getRouteCatalog(productId).flatMap((entry) =>\n entry.moduleId === moduleKey\n ? [{ pageId: entry.pageId, label: entry.pageLabel, path: entry.path }]\n : []\n );\n}\n\n/**\n * Tour builder page\n * Create or edit tour metadata\n */\nexport function TourBuilderPage() {\n const { tr } = useToursI18n();\n const { tourId } = useParams();\n const navigate = useNavigate();\n const toursContext = useToursContext();\n const { basePath = '/' } = toursContext;\n const eventBus = useEventBus();\n const globalClient = useGatewayClient('global');\n const { hasPermission, isLoading: permissionsLoading } = useToursPermissionAccess();\n const isNew = !tourId || tourId === 'new';\n const canCreate = hasPermission(TOUR_PERMISSIONS.TOUR_CREATE);\n const canUpdate = hasPermission(TOUR_PERMISSIONS.TOUR_UPDATE);\n const canCreateTemplate = hasPermission(TOUR_PERMISSIONS.TOUR_TEMPLATE_CREATE);\n const canSave = isNew ? canCreate : canUpdate;\n const canSeedVibeControlsUserTours = canCreate && canUpdate;\n\n const { tour, loadTour, createTour, updateTour, saving, validationErrors, error } =\n useTourBuilder(tourId);\n const { saveAsTemplate } = useTourLifecycle();\n const { data: productsData, loading: productsLoading } = useGetPlatformProductsForToursQuery({\n variables: { limit: PLATFORM_PRODUCTS_QUERY_LIMIT, offset: 0 },\n fetchPolicy: 'cache-and-network',\n skip: permissionsLoading || !canSave,\n });\n\n const defaultFormData = {\n name: '',\n description: '',\n productId: '',\n moduleId: '',\n pageId: '',\n isActive: true,\n status: 'DRAFT' as const,\n triggerType: 'MANUAL' as const,\n priority: 50,\n displayOrder: 1,\n startDate: '',\n endDate: '',\n };\n\n const [formData, setFormData] = useState<Partial<Tour>>(defaultFormData);\n const [customProductEntry, setCustomProductEntry] = useState(false);\n const [customModuleEntry, setCustomModuleEntry] = useState(false);\n const [customPageEntry, setCustomPageEntry] = useState(false);\n const [seedLoading, setSeedLoading] = useState(false);\n const [seedResult, setSeedResult] = useState<SeedVibeControlsUserToursPayload | null>(null);\n const [seedError, setSeedError] = useState<string | null>(null);\n\n const formInitializedRef = useRef(false);\n\n const productOptions = useMemo(() => {\n return [...(productsData?.platformProducts.items ?? [])].sort((a, b) =>\n a.name.localeCompare(b.name)\n );\n }, [productsData]);\n\n const productOptionSlugs = useMemo(\n () => new Set(productOptions.map((product) => product.slug)),\n [productOptions]\n );\n\n const moduleOptions = useMemo(\n () => getTourRouteModules(formData.productId),\n [formData.productId]\n );\n\n const moduleOptionIds = useMemo(\n () => new Set(moduleOptions.map((moduleOption) => moduleOption.moduleId)),\n [moduleOptions]\n );\n\n const pageOptions = useMemo(\n () => getTourRoutePages(formData.productId, formData.moduleId),\n [formData.moduleId, formData.productId]\n );\n\n const pageOptionIds = useMemo(\n () => new Set(pageOptions.map((pageOption) => pageOption.pageId)),\n [pageOptions]\n );\n\n useEffect(() => {\n if (formInitializedRef.current) return;\n if (!permissionsLoading && canSave && tourId && tourId !== 'new') {\n loadTour(tourId);\n }\n }, [canSave, loadTour, permissionsLoading, tourId]);\n\n useEffect(() => {\n if (tour && !formInitializedRef.current) {\n setFormData(tour);\n formInitializedRef.current = true;\n }\n }, [tour]);\n\n useEffect(() => {\n if (!formData.productId || productsLoading) {\n setCustomProductEntry(false);\n return;\n }\n setCustomProductEntry(productOptions.length > 0 && !productOptionSlugs.has(formData.productId));\n }, [formData.productId, productOptionSlugs, productOptions.length, productsLoading]);\n\n useEffect(() => {\n if (!formData.productId || !formData.moduleId) {\n setCustomModuleEntry(false);\n return;\n }\n setCustomModuleEntry(moduleOptions.length === 0 || !moduleOptionIds.has(formData.moduleId));\n }, [formData.moduleId, formData.productId, moduleOptionIds, moduleOptions.length]);\n\n useEffect(() => {\n if (!formData.productId || !formData.pageId) {\n setCustomPageEntry(false);\n return;\n }\n setCustomPageEntry(pageOptions.length === 0 || !pageOptionIds.has(formData.pageId));\n }, [formData.pageId, formData.productId, pageOptionIds, pageOptions.length]);\n\n const showCurrentProductOption = Boolean(\n formData.productId && !customProductEntry && !productOptionSlugs.has(formData.productId)\n );\n const showCurrentModuleOption = Boolean(\n formData.moduleId && !customModuleEntry && !moduleOptionIds.has(formData.moduleId)\n );\n const showCurrentPageOption = Boolean(\n formData.pageId && !customPageEntry && !pageOptionIds.has(formData.pageId)\n );\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n try {\n if (tourId && tourId !== 'new') {\n await updateTour(tourId, formData);\n } else {\n await createTour(formData);\n }\n } catch {\n emitToursApiFailed(eventBus, 'tour.save', toursContext);\n }\n };\n\n const handleBack = () => {\n navigate(`${basePath}/list`);\n };\n\n const formatDateTimeLocal = (value?: string) => {\n if (!value) return '';\n\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n\n return new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().slice(0, 16);\n };\n\n const handleSaveTemplate = async () => {\n if (!tourId || tourId === 'new') return;\n\n const defaultName = `${formData.name || tour?.name || 'Tour'} Template`;\n const name = window.prompt('Template name', defaultName);\n if (!name) return;\n\n const category =\n window.prompt(\n 'Template category (ONBOARDING, FEATURE_ANNOUNCEMENT, HELP, CUSTOM)',\n 'ONBOARDING'\n ) || 'ONBOARDING';\n\n try {\n await saveAsTemplate(tourId, {\n name,\n description: formData.description,\n category,\n isPublic: false,\n });\n navigate(`${basePath}/templates`);\n } catch {\n emitToursApiFailed(eventBus, 'template.save', toursContext);\n }\n };\n\n const handleSeedVibeControlsUserTours = async () => {\n const confirmed = window.confirm(tr('tourBuilder.seedVibeControls.confirm'));\n if (!confirmed) return;\n\n setSeedLoading(true);\n setSeedResult(null);\n setSeedError(null);\n\n try {\n const result = await globalClient.mutate<SeedVibeControlsUserToursMutation>({\n mutation: SEED_VIBECONTROLS_USER_TOURS,\n });\n\n const mutationErrorMessage = getMutationErrorMessage(result);\n if (mutationErrorMessage) {\n throw new Error(mutationErrorMessage);\n }\n\n const payload = result.data?.seedVibeControlsUserTours;\n if (!payload) {\n throw new Error('Seed mutation returned no result.');\n }\n\n setSeedResult(payload);\n } catch (seedMutationError) {\n const errorMessage =\n seedMutationError instanceof Error\n ? seedMutationError.message\n : tr('tourBuilder.seedVibeControls.error');\n setSeedError(errorMessage);\n eventBus.emit(\n 'tours.api.failed',\n {\n route: '/tours',\n operation: 'tour.seed_vibecontrols_user_tours',\n errorMessage,\n productId: toursContext.productId,\n workspaceId: toursContext.workspaceId,\n },\n { component: 'microfe-tours' }\n );\n } finally {\n setSeedLoading(false);\n }\n };\n\n if (permissionsLoading) {\n return (\n <div className=\"flex h-full items-center justify-center p-3 sm:p-6\">\n <p className=\"text-sm text-muted-foreground\">{tr('tourBuilder.loading')}</p>\n </div>\n );\n }\n\n if (!canSave) {\n return (\n <div className=\"flex h-full items-center justify-center p-3 sm:p-6\">\n <div className=\"text-center space-y-4\">\n <div>\n <h2 className=\"text-lg font-semibold text-foreground mb-2\">\n {tr('tourBuilder.accessDeniedTitle')}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {isNew\n ? tr('tourBuilder.createAccessDeniedMessage')\n : tr('tourBuilder.updateAccessDeniedMessage')}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"inline-flex items-center justify-center rounded-md border border-border px-4 py-2 text-sm font-medium text-foreground hover:bg-accent\"\n >\n {tr('tourBuilder.goBack')}\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6 max-w-4xl mx-auto\">\n {/* Header */}\n <div className=\"flex items-center gap-4\">\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"p-2 hover:bg-accent rounded-md\"\n aria-label={tr('tourBuilder.goBack')}\n >\n <ArrowLeft size={20} />\n </button>\n <div className=\"flex-1\">\n <h1 className=\"text-xl sm:text-2xl font-bold text-foreground\">\n {tourId && tourId !== 'new'\n ? tr('tourBuilder.titleEdit')\n : tr('tourBuilder.titleCreate')}\n </h1>\n <p className=\"text-sm text-muted-foreground\">{tr('tourBuilder.subtitle')}</p>\n </div>\n </div>\n\n {isNew ? (\n <div className=\"rounded-md border border-border bg-card p-4 sm:p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"space-y-1\">\n <h2 className=\"text-lg font-semibold text-foreground\">\n {tr('tourBuilder.seedVibeControls.title')}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {tr('tourBuilder.seedVibeControls.description')}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => void handleSeedVibeControlsUserTours()}\n disabled={seedLoading || !canSeedVibeControlsUserTours}\n className=\"inline-flex min-h-11 items-center justify-center gap-2 rounded-md border border-border bg-secondary px-4 py-2 text-sm font-medium text-secondary-foreground hover:bg-secondary/80 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <Sparkles size={18} />\n {seedLoading\n ? tr('tourBuilder.seedVibeControls.loading')\n : tr('tourBuilder.seedVibeControls.button')}\n </button>\n </div>\n {!canSeedVibeControlsUserTours ? (\n <p className=\"mt-3 text-sm text-muted-foreground\">\n {tr('tourBuilder.seedVibeControls.permissionHint')}\n </p>\n ) : null}\n {seedError ? <p className=\"mt-3 text-sm text-destructive\">{seedError}</p> : null}\n {seedResult ? (\n <div className=\"mt-3 rounded-md border border-border bg-background p-3 text-sm text-muted-foreground\">\n {tr('tourBuilder.seedVibeControls.result', {\n totalCount: seedResult.totalCount,\n productId: seedResult.productId,\n workspaceId: seedResult.workspaceId,\n createdCount: seedResult.createdCount,\n updatedCount: seedResult.updatedCount,\n })}\n </div>\n ) : null}\n </div>\n ) : null}\n\n {/* Form */}\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n {/* Basic Info */}\n <div className=\"border border-border rounded-md p-4 sm:p-6 bg-card\">\n <h2 className=\"text-lg font-semibold mb-4\">{tr('tourBuilder.sectionBasicInfo')}</h2>\n\n <div className=\"space-y-4\">\n {/* Name */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"tour-name\">\n {tr('tourBuilder.labelName')}\n </label>\n <input\n id=\"tour-name\"\n type=\"text\"\n value={formData.name || ''}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-foreground\"\n required\n aria-label={tr('tourBuilder.labelName')}\n />\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"tour-description\">\n {tr('tourBuilder.labelDescription')}\n </label>\n <textarea\n id=\"tour-description\"\n value={formData.description || ''}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-foreground\"\n aria-label={tr('tourBuilder.labelDescription')}\n />\n </div>\n\n {/* Product ID */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"product-id\">\n {tr('tourBuilder.labelProductId')}\n </label>\n <select\n id=\"product-id\"\n value={customProductEntry ? '__custom__' : formData.productId || ''}\n onChange={(e) => {\n if (e.target.value === '__custom__') {\n setCustomProductEntry(true);\n setFormData({\n ...formData,\n productId: '',\n moduleId: undefined,\n pageId: undefined,\n });\n return;\n }\n\n setCustomProductEntry(false);\n setCustomModuleEntry(false);\n setCustomPageEntry(false);\n setFormData({\n ...formData,\n productId: e.target.value,\n moduleId: undefined,\n pageId: undefined,\n });\n }}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-foreground\"\n required\n aria-label={tr('tourBuilder.labelProductId')}\n >\n <option value=\"\">Select product</option>\n {productsLoading ? <option disabled>Loading products…</option> : null}\n {productOptions.map((product) => (\n <option key={product.id} value={product.slug}>\n {product.name} ({product.slug})\n </option>\n ))}\n {showCurrentProductOption ? (\n <option value={formData.productId}>Current: {formData.productId}</option>\n ) : null}\n <option value=\"__custom__\">Custom product slug</option>\n </select>\n {customProductEntry ? (\n <input\n id=\"product-id-custom\"\n aria-label=\"Custom product slug\"\n type=\"text\"\n value={formData.productId || ''}\n onChange={(e) =>\n setFormData({\n ...formData,\n productId: e.target.value,\n moduleId: undefined,\n pageId: undefined,\n })\n }\n className=\"mt-2 w-full px-3 py-2 border border-border rounded-md bg-background text-foreground\"\n placeholder=\"vibecontrols\"\n required\n />\n ) : null}\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"module-id\">\n Module ID\n </label>\n <select\n id=\"module-id\"\n value={customModuleEntry ? '__custom__' : formData.moduleId || ''}\n onChange={(e) => {\n if (e.target.value === '__custom__') {\n setCustomModuleEntry(true);\n setFormData({ ...formData, moduleId: '', pageId: undefined });\n return;\n }\n\n setCustomModuleEntry(false);\n setCustomPageEntry(false);\n setFormData({\n ...formData,\n moduleId: e.target.value || undefined,\n pageId: undefined,\n });\n }}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-foreground\"\n disabled={!formData.productId}\n aria-label=\"Module ID\"\n >\n <option value=\"\">All modules</option>\n {moduleOptions.map((moduleOption) => (\n <option key={moduleOption.moduleId} value={moduleOption.moduleId}>\n {moduleOption.label} ({moduleOption.moduleId})\n </option>\n ))}\n {showCurrentModuleOption ? (\n <option value={formData.moduleId}>Current: {formData.moduleId}</option>\n ) : null}\n <option value=\"__custom__\">Custom module ID</option>\n </select>\n {customModuleEntry ? (\n <input\n id=\"module-id-custom\"\n aria-label=\"Custom module ID\"\n type=\"text\"\n value={formData.moduleId || ''}\n onChange={(e) =>\n setFormData({\n ...formData,\n moduleId: e.target.value || undefined,\n pageId: undefined,\n })\n }\n className=\"mt-2 w-full px-3 py-2 border border-border rounded-md bg-background text-foreground\"\n placeholder=\"vibecontrols\"\n />\n ) : null}\n </div>\n\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"page-id\">\n Page ID\n </label>\n <select\n id=\"page-id\"\n value={customPageEntry ? '__custom__' : formData.pageId || ''}\n onChange={(e) => {\n if (e.target.value === '__custom__') {\n setCustomPageEntry(true);\n setFormData({ ...formData, pageId: '' });\n return;\n }\n\n setCustomPageEntry(false);\n setFormData({ ...formData, pageId: e.target.value || undefined });\n }}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-foreground\"\n disabled={!formData.productId}\n aria-label=\"Page ID\"\n >\n <option value=\"\">All pages</option>\n {pageOptions.map((pageOption) => (\n <option key={pageOption.pageId} value={pageOption.pageId}>\n {pageOption.label} ({pageOption.pageId})\n </option>\n ))}\n {showCurrentPageOption ? (\n <option value={formData.pageId}>Current: {formData.pageId}</option>\n ) : null}\n <option value=\"__custom__\">Custom page ID</option>\n </select>\n {customPageEntry ? (\n <input\n id=\"page-id-custom\"\n aria-label=\"Custom page ID\"\n type=\"text\"\n value={formData.pageId || ''}\n onChange={(e) =>\n setFormData({ ...formData, pageId: e.target.value || undefined })\n }\n className=\"mt-2 w-full px-3 py-2 border border-border rounded-md bg-background text-foreground\"\n placeholder=\"agents\"\n />\n ) : null}\n </div>\n </div>\n\n <label className=\"flex items-center gap-3 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={formData.isActive ?? true}\n onChange={(e) => setFormData({ ...formData, isActive: e.target.checked })}\n className=\"size-4 rounded\"\n aria-label=\"Active\"\n />\n <span className=\"text-sm font-medium\">Active</span>\n </label>\n </div>\n </div>\n\n {/* Trigger Settings */}\n <div className=\"border border-border rounded-md p-4 sm:p-6 bg-card\">\n <h2 className=\"text-lg font-semibold mb-4\">{tr('tourBuilder.sectionTriggerSettings')}</h2>\n\n <div className=\"space-y-4\">\n {/* Trigger Type */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"trigger-type\">\n {tr('tourBuilder.labelTriggerType')}\n </label>\n <select\n id=\"trigger-type\"\n value={formData.triggerType || 'MANUAL'}\n onChange={(e) =>\n setFormData({ ...formData, triggerType: e.target.value as TourTriggerType })\n }\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-foreground\"\n aria-label={tr('tourBuilder.labelTriggerType')}\n >\n <option value=\"MANUAL\">{tr('tourBuilder.triggerManual')}</option>\n <option value=\"AUTO_FIRST_VISIT\">{tr('tourBuilder.triggerAutoFirstVisit')}</option>\n <option value=\"AUTO_ALWAYS\">{tr('tourBuilder.triggerAutoAlways')}</option>\n <option value=\"ON_EVENT\">{tr('tourBuilder.triggerOnEvent')}</option>\n <option value=\"SCHEDULED\">{tr('tourBuilder.triggerScheduled')}</option>\n </select>\n </div>\n\n {/* Priority */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"priority\">\n {tr('tourBuilder.labelPriority')}\n </label>\n <input\n id=\"priority\"\n type=\"number\"\n min=\"1\"\n max=\"100\"\n value={formData.priority || 50}\n onChange={(e) => {\n const priority = Number.parseInt(e.target.value, 10) || 50;\n setFormData({ ...formData, priority });\n }}\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-foreground\"\n aria-label={tr('tourBuilder.labelPriority')}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"tour-start-date\">\n Start Date\n </label>\n <input\n id=\"tour-start-date\"\n type=\"datetime-local\"\n value={formatDateTimeLocal(formData.startDate)}\n onChange={(e) =>\n setFormData({\n ...formData,\n startDate: e.target.value\n ? new Date(e.target.value).toISOString()\n : undefined,\n })\n }\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-foreground\"\n aria-label=\"Start Date\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"tour-end-date\">\n End Date\n </label>\n <input\n id=\"tour-end-date\"\n type=\"datetime-local\"\n value={formatDateTimeLocal(formData.endDate)}\n onChange={(e) =>\n setFormData({\n ...formData,\n endDate: e.target.value ? new Date(e.target.value).toISOString() : undefined,\n })\n }\n className=\"w-full px-3 py-2 border border-border rounded-md bg-background text-foreground\"\n aria-label=\"End Date\"\n />\n </div>\n </div>\n </div>\n </div>\n\n {/* API Error */}\n {error && (\n <div className=\"border border-destructive rounded-md p-4 bg-destructive/10\">\n <h3 className=\"font-semibold text-destructive mb-2\">{tr('tourBuilder.errorTitle')}</h3>\n <p className=\"text-sm text-destructive\">{error.message}</p>\n </div>\n )}\n\n {/* Validation Errors */}\n {validationErrors.length > 0 && (\n <div className=\"border border-destructive rounded-md p-4 bg-destructive/10\">\n <h3 className=\"font-semibold text-destructive mb-2\">\n {tr('tourBuilder.validationErrorsTitle')}\n </h3>\n <ul className=\"list-disc list-inside space-y-1\">\n {validationErrors.map((err) => (\n <li key={err.message} className=\"text-sm text-destructive\">\n {err.message}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex flex-wrap gap-3\">\n <PermissionGate\n permission={isNew ? TOUR_PERMISSIONS.TOUR_CREATE : TOUR_PERMISSIONS.TOUR_UPDATE}\n >\n <button\n type=\"submit\"\n disabled={saving || !canSave}\n className=\"flex-1 min-w-[200px] px-4 py-2 bg-primary text-primary-foreground rounded-md hover:bg-primary/90 disabled:opacity-50 flex items-center justify-center gap-2\"\n >\n <Save size={20} />\n {saving\n ? tr('tourBuilder.saving')\n : tourId && tourId !== 'new'\n ? tr('tourBuilder.updateTour')\n : tr('tourBuilder.createAndAddSteps')}\n </button>\n </PermissionGate>\n {tourId && tourId !== 'new' && (\n <>\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/${tourId}/steps`)}\n className=\"px-4 py-2 bg-secondary text-secondary-foreground rounded-md hover:bg-secondary/80 flex items-center gap-2\"\n >\n <ListOrdered size={20} />\n {tr('tourBuilder.editSteps')}\n {tour?.steps && tour.steps.length > 0 && (\n <span className=\"ml-1 px-2 py-0.5 text-xs bg-primary/20 rounded-full\">\n {tour.steps.length}\n </span>\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/${tourId}/preview`)}\n className=\"px-4 py-2 border border-border rounded-md hover:bg-accent flex items-center gap-2\"\n >\n <Eye size={20} />\n {tr('tourBuilder.preview')}\n </button>\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/${tourId}/analytics`)}\n className=\"px-4 py-2 border border-border rounded-md hover:bg-accent flex items-center gap-2\"\n >\n <BarChart3 size={20} />\n {tr('tourBuilder.analytics')}\n </button>\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/${tourId}/schedule`)}\n className=\"px-4 py-2 border border-border rounded-md hover:bg-accent flex items-center gap-2\"\n >\n <Calendar size={20} />\n Schedule\n </button>\n <PermissionGate permission={TOUR_PERMISSIONS.TOUR_TEMPLATE_CREATE}>\n <button\n type=\"button\"\n onClick={handleSaveTemplate}\n disabled={!canCreateTemplate}\n className=\"px-4 py-2 border border-border rounded-md hover:bg-accent flex items-center gap-2 disabled:opacity-50\"\n >\n <LayoutTemplate size={20} />\n Save as Template\n </button>\n </PermissionGate>\n </>\n )}\n </div>\n </form>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA2BA,IAAM,KAAgC,KAEhC,KAA+B,CAAG;;;;;;;;;;;;;;;;;;AAwCxC,SAAS,GAAwB,GAAgC;AAC/D,KAAI,CAAC,KAAU,OAAO,KAAW,SAAU,QAAO;CAElD,IAAM,IAAS,GACT,IAAc,EAAO;AAC3B,KAAI,aAAuB,MAAO,QAAO,EAAY;CAErD,IAAM,IAAS,EAAO;AACtB,KAAI,CAAC,MAAM,QAAQ,EAAO,IAAI,EAAO,WAAW,EAAG,QAAO;CAE1D,IAAM,IAAW,EACd,KAAK,MAAU;AACd,MAAI,aAAiB,MAAO,QAAO,EAAM;AACzC,MAAI,CAAC,KAAS,OAAO,KAAU,SAAU,QAAO;EAEhD,IAAM,IAAW,EAAgC;AACjD,SAAO,OAAO,KAAY,WAAW,IAAU;GAC/C,CACD,QAAQ,MAA+B,EAAQ,EAAS;AAE3D,QAAO,EAAS,SAAS,IAAI,EAAS,KAAK,KAAK,GAAG;;AAyBrD,IAAM,IAAuD;CAC3D;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CAC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"}
1
+ {"version":3,"file":"TourBuilderPage.js","names":[],"sources":["../../../src/tours/pages/TourBuilderPage.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport {\n Save,\n ArrowLeft,\n Eye,\n ListOrdered,\n BarChart3,\n Calendar,\n LayoutTemplate,\n Sparkles,\n} from 'lucide-react';\nimport { gql } from '@apollo/client/core';\nimport { PermissionGate } from '@burdenoff/fe-libs/shared/components';\nimport { useEventBus } from '@burdenoff/fe-libs/shared/events';\nimport { useGatewayClient } from '@burdenoff/fe-libs/shared/graphql';\nimport { useTourBuilder } from '../hooks/useTourBuilder';\nimport { useTourLifecycle } from '../hooks/useTourLifecycle';\nimport { useToursPermissionAccess } from '../hooks/useToursPermissionAccess';\nimport { useToursContext } from '../providers/ToursProvider';\nimport { TOUR_PERMISSIONS } from '../../constants/permissions';\nimport type { Tour, TourTriggerType } from '../types';\nimport { useToursI18n } from '../i18n';\nimport { emitToursApiFailed } from '../telemetry';\nimport { useGetPlatformProductsForToursQuery } from '../../generated/global-operations';\n\n// Covers the current platform catalog with room for planned products; custom slug entry remains the fallback.\nconst PLATFORM_PRODUCTS_QUERY_LIMIT = 250;\n\nconst SEED_VIBECONTROLS_USER_TOURS = gql`\n mutation SeedVibeControlsUserTours {\n seedVibeControlsUserTours {\n productId\n workspaceId\n createdCount\n updatedCount\n totalCount\n tours {\n tourId\n slug\n name\n action\n stepCount\n }\n }\n }\n`;\n\ninterface SeededUserTourResult {\n tourId: string;\n slug: string;\n name: string;\n action: string;\n stepCount: number;\n}\n\ninterface SeedVibeControlsUserToursPayload {\n productId: string;\n workspaceId: string;\n createdCount: number;\n updatedCount: number;\n totalCount: number;\n tours: SeededUserTourResult[];\n}\n\ninterface SeedVibeControlsUserToursMutation {\n seedVibeControlsUserTours: SeedVibeControlsUserToursPayload;\n}\n\nfunction getMutationErrorMessage(result: unknown): string | null {\n if (!result || typeof result !== 'object') return null;\n\n const record = result as Record<string, unknown>;\n const singleError = record.error;\n if (singleError instanceof Error) return singleError.message;\n\n const errors = record.errors;\n if (!Array.isArray(errors) || errors.length === 0) return null;\n\n const messages = errors\n .map((error) => {\n if (error instanceof Error) return error.message;\n if (!error || typeof error !== 'object') return null;\n\n const message = (error as { message?: unknown }).message;\n return typeof message === 'string' ? message : null;\n })\n .filter((message): message is string => Boolean(message));\n\n return messages.length > 0 ? messages.join('; ') : 'Seed mutation returned errors.';\n}\n\ninterface TourRouteModuleOption {\n moduleId: string;\n label: string;\n path: string;\n}\n\ninterface TourRoutePageOption {\n pageId: string;\n label: string;\n path: string;\n}\n\ninterface TourRouteCatalogEntry {\n productId: string;\n moduleId: string;\n moduleLabel: string;\n pageId: string;\n pageLabel: string;\n path: string;\n isModuleHome?: boolean;\n}\n\nconst TOUR_ROUTE_CATALOG: readonly TourRouteCatalogEntry[] = [\n {\n productId: 'vibecontrols',\n moduleId: 'dashboard',\n moduleLabel: 'Dashboard',\n pageId: 'dashboard',\n pageLabel: 'Dashboard',\n path: '/dashboard',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'home',\n pageLabel: 'Overview',\n path: '/vibecontrols',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'agents',\n pageLabel: 'Targets & Agents',\n path: '/vibecontrols/agents',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'vibes',\n pageLabel: 'Vibes',\n path: '/vibecontrols/vibes',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'sessions',\n pageLabel: 'Sessions',\n path: '/vibecontrols/sessions',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'ai',\n pageLabel: 'AI',\n path: '/vibecontrols/ai',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'catalogs',\n pageLabel: 'Catalogs',\n path: '/vibecontrols/catalogs',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'components',\n pageLabel: 'Components',\n path: '/vibecontrols/components',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'templates',\n pageLabel: 'Templates',\n path: '/vibecontrols/templates',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'actions',\n pageLabel: 'Actions',\n path: '/vibecontrols/actions',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'vibedeck',\n pageLabel: 'Decks',\n path: '/vibecontrols/vibedeck',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'calendar',\n pageLabel: 'Calendar',\n path: '/vibecontrols/calendar',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'tunnels',\n pageLabel: 'Tunnels',\n path: '/vibecontrols/tunnels',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'analytics',\n pageLabel: 'Analytics',\n path: '/vibecontrols/analytics',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'audit',\n pageLabel: 'Audit Log',\n path: '/vibecontrols/audit',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'health',\n pageLabel: 'Health',\n path: '/vibecontrols/health',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'vibecontrols',\n moduleLabel: 'VibeControls',\n pageId: 'settings',\n pageLabel: 'Settings',\n path: '/vibecontrols/settings',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'scheduler',\n moduleLabel: 'Scheduler',\n pageId: 'scheduler',\n pageLabel: 'Scheduler',\n path: '/scheduler',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'sandbox',\n moduleLabel: 'Sandbox',\n pageId: 'sandbox',\n pageLabel: 'Sandbox',\n path: '/sandbox',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'support',\n moduleLabel: 'Support',\n pageId: 'tickets',\n pageLabel: 'Tickets',\n path: '/support/tickets',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'support',\n moduleLabel: 'Support',\n pageId: 'knowledge-base',\n pageLabel: 'Knowledge Base',\n path: '/support/kb',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'notifications',\n moduleLabel: 'Notifications',\n pageId: 'center',\n pageLabel: 'Notification Center',\n path: '/notifications/center',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'notifications',\n moduleLabel: 'Notifications',\n pageId: 'history',\n pageLabel: 'History',\n path: '/notifications/history',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'notifications',\n moduleLabel: 'Notifications',\n pageId: 'preferences',\n pageLabel: 'Preferences',\n path: '/notifications/preferences',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'conversations',\n moduleLabel: 'Conversations',\n pageId: 'home',\n pageLabel: 'All Conversations',\n path: '/conversations',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'conversations',\n moduleLabel: 'Conversations',\n pageId: 'list',\n pageLabel: 'Conversation List',\n path: '/conversations/list',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'conversations',\n moduleLabel: 'Conversations',\n pageId: 'new',\n pageLabel: 'New Conversation',\n path: '/conversations/new',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'conversations',\n moduleLabel: 'Conversations',\n pageId: 'settings',\n pageLabel: 'Settings',\n path: '/conversations/settings',\n },\n {\n productId: 'vibecontrols',\n moduleId: 'auth',\n moduleLabel: 'Auth',\n pageId: 'home',\n pageLabel: 'Auth',\n path: '/auth/security',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'groups',\n moduleLabel: 'Groups and Teams',\n pageId: 'home',\n pageLabel: 'Groups and Teams',\n path: '/groups',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'tags',\n moduleLabel: 'Tags',\n pageId: 'home',\n pageLabel: 'Tags',\n path: '/tags',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'files',\n moduleLabel: 'Files',\n pageId: 'home',\n pageLabel: 'Files',\n path: '/files/browse',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'security',\n moduleLabel: 'Vault',\n pageId: 'home',\n pageLabel: 'Vault',\n path: '/security',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'integrations',\n moduleLabel: 'Integrations',\n pageId: 'home',\n pageLabel: 'Integrations',\n path: '/integrations',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'export',\n moduleLabel: 'Exports',\n pageId: 'home',\n pageLabel: 'Exports',\n path: '/export',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'organizations',\n moduleLabel: 'Organizations',\n pageId: 'home',\n pageLabel: 'Organizations',\n path: '/organizations',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'workspaces',\n moduleLabel: 'Workspaces',\n pageId: 'home',\n pageLabel: 'Workspaces',\n path: '/workspaces',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'billing',\n moduleLabel: 'Billing',\n pageId: 'home',\n pageLabel: 'Billing',\n path: '/billing/overview',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'store',\n moduleLabel: 'Marketplace',\n pageId: 'home',\n pageLabel: 'Marketplace',\n path: '/store/marketplace',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'channels',\n moduleLabel: 'Channels',\n pageId: 'home',\n pageLabel: 'Channels',\n path: '/channels',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'devportal',\n moduleLabel: 'Developer Portal',\n pageId: 'home',\n pageLabel: 'Developer Portal',\n path: '/devportal',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'feature-previews',\n moduleLabel: 'Feature Previews',\n pageId: 'home',\n pageLabel: 'Feature Previews',\n path: '/feature-previews',\n isModuleHome: true,\n },\n {\n productId: 'vibecontrols',\n moduleId: 'search',\n moduleLabel: 'Search',\n pageId: 'home',\n pageLabel: 'Search',\n path: '/search',\n isModuleHome: true,\n },\n] as const;\n\nfunction normalizeCatalogValue(value: string | null | undefined): string | undefined {\n const normalized = value?.trim();\n return normalized ? normalized : undefined;\n}\n\nfunction getRouteCatalog(productId: string | null | undefined): TourRouteCatalogEntry[] {\n const productKey = normalizeCatalogValue(productId);\n if (!productKey) return [];\n return TOUR_ROUTE_CATALOG.filter((entry) => entry.productId === productKey);\n}\n\nfunction getTourRouteModules(productId: string | null | undefined): TourRouteModuleOption[] {\n const modules = new Map<string, TourRouteModuleOption>();\n\n for (const entry of getRouteCatalog(productId)) {\n const existing = modules.get(entry.moduleId);\n if (!existing || entry.isModuleHome) {\n modules.set(entry.moduleId, {\n moduleId: entry.moduleId,\n label: entry.moduleLabel,\n path: entry.path,\n });\n }\n }\n\n return [...modules.values()];\n}\n\nfunction getTourRoutePages(\n productId: string | null | undefined,\n moduleId: string | null | undefined\n): TourRoutePageOption[] {\n const moduleKey = normalizeCatalogValue(moduleId);\n if (!moduleKey) return [];\n\n return getRouteCatalog(productId).flatMap((entry) =>\n entry.moduleId === moduleKey\n ? [{ pageId: entry.pageId, label: entry.pageLabel, path: entry.path }]\n : []\n );\n}\n\n/**\n * Tour builder page\n * Create or edit tour metadata\n */\nexport function TourBuilderPage() {\n const { tr } = useToursI18n();\n const { tourId } = useParams();\n const navigate = useNavigate();\n const toursContext = useToursContext();\n const { basePath = '/' } = toursContext;\n const eventBus = useEventBus();\n const globalClient = useGatewayClient('global');\n const { hasPermission, isLoading: permissionsLoading } = useToursPermissionAccess();\n const isNew = !tourId || tourId === 'new';\n const canCreate = hasPermission(TOUR_PERMISSIONS.TOUR_CREATE);\n const canUpdate = hasPermission(TOUR_PERMISSIONS.TOUR_UPDATE);\n const canCreateTemplate = hasPermission(TOUR_PERMISSIONS.TOUR_TEMPLATE_CREATE);\n const canSave = isNew ? canCreate : canUpdate;\n const canSeedVibeControlsUserTours = canCreate && canUpdate;\n\n const { tour, loadTour, createTour, updateTour, saving, validationErrors, error } =\n useTourBuilder(tourId);\n const { saveAsTemplate } = useTourLifecycle();\n const { data: productsData, loading: productsLoading } = useGetPlatformProductsForToursQuery({\n variables: { limit: PLATFORM_PRODUCTS_QUERY_LIMIT, offset: 0 },\n fetchPolicy: 'cache-and-network',\n skip: permissionsLoading || !canSave,\n });\n\n const defaultFormData = {\n name: '',\n description: '',\n productId: '',\n moduleId: '',\n pageId: '',\n isActive: true,\n status: 'DRAFT' as const,\n triggerType: 'MANUAL' as const,\n priority: 50,\n displayOrder: 1,\n startDate: '',\n endDate: '',\n };\n\n const [formData, setFormData] = useState<Partial<Tour>>(defaultFormData);\n const [customProductEntry, setCustomProductEntry] = useState(false);\n const [customModuleEntry, setCustomModuleEntry] = useState(false);\n const [customPageEntry, setCustomPageEntry] = useState(false);\n const [seedLoading, setSeedLoading] = useState(false);\n const [seedResult, setSeedResult] = useState<SeedVibeControlsUserToursPayload | null>(null);\n const [seedError, setSeedError] = useState<string | null>(null);\n\n const formInitializedRef = useRef(false);\n\n const productOptions = useMemo(() => {\n return [...(productsData?.platformProducts.items ?? [])].sort((a, b) =>\n a.name.localeCompare(b.name)\n );\n }, [productsData]);\n\n const productOptionSlugs = useMemo(\n () => new Set(productOptions.map((product) => product.slug)),\n [productOptions]\n );\n\n const moduleOptions = useMemo(\n () => getTourRouteModules(formData.productId),\n [formData.productId]\n );\n\n const moduleOptionIds = useMemo(\n () => new Set(moduleOptions.map((moduleOption) => moduleOption.moduleId)),\n [moduleOptions]\n );\n\n const pageOptions = useMemo(\n () => getTourRoutePages(formData.productId, formData.moduleId),\n [formData.moduleId, formData.productId]\n );\n\n const pageOptionIds = useMemo(\n () => new Set(pageOptions.map((pageOption) => pageOption.pageId)),\n [pageOptions]\n );\n\n useEffect(() => {\n if (formInitializedRef.current) return;\n if (!permissionsLoading && canSave && tourId && tourId !== 'new') {\n loadTour(tourId);\n }\n }, [canSave, loadTour, permissionsLoading, tourId]);\n\n useEffect(() => {\n if (tour && !formInitializedRef.current) {\n setFormData(tour);\n formInitializedRef.current = true;\n }\n }, [tour]);\n\n useEffect(() => {\n if (!formData.productId || productsLoading) {\n setCustomProductEntry(false);\n return;\n }\n setCustomProductEntry(productOptions.length > 0 && !productOptionSlugs.has(formData.productId));\n }, [formData.productId, productOptionSlugs, productOptions.length, productsLoading]);\n\n useEffect(() => {\n if (!formData.productId || !formData.moduleId) {\n setCustomModuleEntry(false);\n return;\n }\n setCustomModuleEntry(moduleOptions.length === 0 || !moduleOptionIds.has(formData.moduleId));\n }, [formData.moduleId, formData.productId, moduleOptionIds, moduleOptions.length]);\n\n useEffect(() => {\n if (!formData.productId || !formData.pageId) {\n setCustomPageEntry(false);\n return;\n }\n setCustomPageEntry(pageOptions.length === 0 || !pageOptionIds.has(formData.pageId));\n }, [formData.pageId, formData.productId, pageOptionIds, pageOptions.length]);\n\n const showCurrentProductOption = Boolean(\n formData.productId && !customProductEntry && !productOptionSlugs.has(formData.productId)\n );\n const showCurrentModuleOption = Boolean(\n formData.moduleId && !customModuleEntry && !moduleOptionIds.has(formData.moduleId)\n );\n const showCurrentPageOption = Boolean(\n formData.pageId && !customPageEntry && !pageOptionIds.has(formData.pageId)\n );\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n try {\n if (tourId && tourId !== 'new') {\n await updateTour(tourId, formData);\n } else {\n await createTour(formData);\n }\n } catch {\n emitToursApiFailed(eventBus, 'tour.save', toursContext);\n }\n };\n\n const handleBack = () => {\n navigate(`${basePath}/list`);\n };\n\n const formatDateTimeLocal = (value?: string) => {\n if (!value) return '';\n\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n\n return new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().slice(0, 16);\n };\n\n const handleSaveTemplate = async () => {\n if (!tourId || tourId === 'new') return;\n\n const defaultName = `${formData.name || tour?.name || 'Tour'} Template`;\n const name = window.prompt('Template name', defaultName);\n if (!name) return;\n\n const category =\n window.prompt(\n 'Template category (ONBOARDING, FEATURE_ANNOUNCEMENT, HELP, CUSTOM)',\n 'ONBOARDING'\n ) || 'ONBOARDING';\n\n try {\n await saveAsTemplate(tourId, {\n name,\n description: formData.description,\n category,\n isPublic: false,\n });\n navigate(`${basePath}/templates`);\n } catch {\n emitToursApiFailed(eventBus, 'template.save', toursContext);\n }\n };\n\n const handleSeedVibeControlsUserTours = async () => {\n const confirmed = window.confirm(tr('tourBuilder.seedVibeControls.confirm'));\n if (!confirmed) return;\n\n setSeedLoading(true);\n setSeedResult(null);\n setSeedError(null);\n\n try {\n const result = await globalClient.mutate<SeedVibeControlsUserToursMutation>({\n mutation: SEED_VIBECONTROLS_USER_TOURS,\n });\n\n const mutationErrorMessage = getMutationErrorMessage(result);\n if (mutationErrorMessage) {\n throw new Error(mutationErrorMessage);\n }\n\n const payload = result.data?.seedVibeControlsUserTours;\n if (!payload) {\n throw new Error('Seed mutation returned no result.');\n }\n\n setSeedResult(payload);\n } catch (seedMutationError) {\n const errorMessage =\n seedMutationError instanceof Error\n ? seedMutationError.message\n : tr('tourBuilder.seedVibeControls.error');\n setSeedError(errorMessage);\n eventBus.emit(\n 'tours.api.failed',\n {\n route: '/tours',\n operation: 'tour.seed_vibecontrols_user_tours',\n errorMessage,\n productId: toursContext.productId,\n workspaceId: toursContext.workspaceId,\n },\n { component: 'microfe-tours' }\n );\n } finally {\n setSeedLoading(false);\n }\n };\n\n if (permissionsLoading) {\n return (\n <div className=\"flex h-full items-center justify-center p-3 sm:p-6\">\n <p className=\"text-sm text-text-secondary\">{tr('tourBuilder.loading')}</p>\n </div>\n );\n }\n\n if (!canSave) {\n return (\n <div className=\"flex h-full items-center justify-center p-3 sm:p-6\">\n <div className=\"text-center space-y-4\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary mb-2\">\n {tr('tourBuilder.accessDeniedTitle')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {isNew\n ? tr('tourBuilder.createAccessDeniedMessage')\n : tr('tourBuilder.updateAccessDeniedMessage')}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"inline-flex items-center justify-center rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-accent\"\n >\n {tr('tourBuilder.goBack')}\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4 sm:space-y-6 p-3 sm:p-6 max-w-4xl mx-auto\">\n {/* Header */}\n <div className=\"flex items-center gap-4\">\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"p-2 hover:bg-accent rounded-md\"\n aria-label={tr('tourBuilder.goBack')}\n >\n <ArrowLeft size={20} />\n </button>\n <div className=\"flex-1\">\n <h1 className=\"text-xl sm:text-2xl font-bold text-text-primary\">\n {tourId && tourId !== 'new'\n ? tr('tourBuilder.titleEdit')\n : tr('tourBuilder.titleCreate')}\n </h1>\n <p className=\"text-sm text-text-secondary\">{tr('tourBuilder.subtitle')}</p>\n </div>\n </div>\n\n {isNew ? (\n <div className=\"rounded-md border border-border-subtle bg-bg-surface p-4 sm:p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"space-y-1\">\n <h2 className=\"text-lg font-semibold text-text-primary\">\n {tr('tourBuilder.seedVibeControls.title')}\n </h2>\n <p className=\"text-sm text-text-secondary\">\n {tr('tourBuilder.seedVibeControls.description')}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => void handleSeedVibeControlsUserTours()}\n disabled={seedLoading || !canSeedVibeControlsUserTours}\n className=\"inline-flex min-h-11 items-center justify-center gap-2 rounded-md border border-border-subtle bg-secondary px-4 py-2 text-sm font-medium text-secondary-foreground hover:bg-secondary/80 disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <Sparkles size={18} />\n {seedLoading\n ? tr('tourBuilder.seedVibeControls.loading')\n : tr('tourBuilder.seedVibeControls.button')}\n </button>\n </div>\n {!canSeedVibeControlsUserTours ? (\n <p className=\"mt-3 text-sm text-text-secondary\">\n {tr('tourBuilder.seedVibeControls.permissionHint')}\n </p>\n ) : null}\n {seedError ? <p className=\"mt-3 text-sm text-status-error-text\">{seedError}</p> : null}\n {seedResult ? (\n <div className=\"mt-3 rounded-md border border-border-subtle bg-bg-surface p-3 text-sm text-text-secondary\">\n {tr('tourBuilder.seedVibeControls.result', {\n totalCount: seedResult.totalCount,\n productId: seedResult.productId,\n workspaceId: seedResult.workspaceId,\n createdCount: seedResult.createdCount,\n updatedCount: seedResult.updatedCount,\n })}\n </div>\n ) : null}\n </div>\n ) : null}\n\n {/* Form */}\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n {/* Basic Info */}\n <div className=\"border border-border-subtle rounded-md p-4 sm:p-6 bg-bg-surface\">\n <h2 className=\"text-lg font-semibold mb-4\">{tr('tourBuilder.sectionBasicInfo')}</h2>\n\n <div className=\"space-y-4\">\n {/* Name */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"tour-name\">\n {tr('tourBuilder.labelName')}\n </label>\n <input\n id=\"tour-name\"\n type=\"text\"\n value={formData.name || ''}\n onChange={(e) => setFormData({ ...formData, name: e.target.value })}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n required\n aria-label={tr('tourBuilder.labelName')}\n />\n </div>\n\n {/* Description */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"tour-description\">\n {tr('tourBuilder.labelDescription')}\n </label>\n <textarea\n id=\"tour-description\"\n value={formData.description || ''}\n onChange={(e) => setFormData({ ...formData, description: e.target.value })}\n rows={3}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n aria-label={tr('tourBuilder.labelDescription')}\n />\n </div>\n\n {/* Product ID */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"product-id\">\n {tr('tourBuilder.labelProductId')}\n </label>\n <select\n id=\"product-id\"\n value={customProductEntry ? '__custom__' : formData.productId || ''}\n onChange={(e) => {\n if (e.target.value === '__custom__') {\n setCustomProductEntry(true);\n setFormData({\n ...formData,\n productId: '',\n moduleId: undefined,\n pageId: undefined,\n });\n return;\n }\n\n setCustomProductEntry(false);\n setCustomModuleEntry(false);\n setCustomPageEntry(false);\n setFormData({\n ...formData,\n productId: e.target.value,\n moduleId: undefined,\n pageId: undefined,\n });\n }}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n required\n aria-label={tr('tourBuilder.labelProductId')}\n >\n <option value=\"\">Select product</option>\n {productsLoading ? <option disabled>Loading products…</option> : null}\n {productOptions.map((product) => (\n <option key={product.id} value={product.slug}>\n {product.name} ({product.slug})\n </option>\n ))}\n {showCurrentProductOption ? (\n <option value={formData.productId}>Current: {formData.productId}</option>\n ) : null}\n <option value=\"__custom__\">Custom product slug</option>\n </select>\n {customProductEntry ? (\n <input\n id=\"product-id-custom\"\n aria-label=\"Custom product slug\"\n type=\"text\"\n value={formData.productId || ''}\n onChange={(e) =>\n setFormData({\n ...formData,\n productId: e.target.value,\n moduleId: undefined,\n pageId: undefined,\n })\n }\n className=\"mt-2 w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n placeholder=\"vibecontrols\"\n required\n />\n ) : null}\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"module-id\">\n Module ID\n </label>\n <select\n id=\"module-id\"\n value={customModuleEntry ? '__custom__' : formData.moduleId || ''}\n onChange={(e) => {\n if (e.target.value === '__custom__') {\n setCustomModuleEntry(true);\n setFormData({ ...formData, moduleId: '', pageId: undefined });\n return;\n }\n\n setCustomModuleEntry(false);\n setCustomPageEntry(false);\n setFormData({\n ...formData,\n moduleId: e.target.value || undefined,\n pageId: undefined,\n });\n }}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n disabled={!formData.productId}\n aria-label=\"Module ID\"\n >\n <option value=\"\">All modules</option>\n {moduleOptions.map((moduleOption) => (\n <option key={moduleOption.moduleId} value={moduleOption.moduleId}>\n {moduleOption.label} ({moduleOption.moduleId})\n </option>\n ))}\n {showCurrentModuleOption ? (\n <option value={formData.moduleId}>Current: {formData.moduleId}</option>\n ) : null}\n <option value=\"__custom__\">Custom module ID</option>\n </select>\n {customModuleEntry ? (\n <input\n id=\"module-id-custom\"\n aria-label=\"Custom module ID\"\n type=\"text\"\n value={formData.moduleId || ''}\n onChange={(e) =>\n setFormData({\n ...formData,\n moduleId: e.target.value || undefined,\n pageId: undefined,\n })\n }\n className=\"mt-2 w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n placeholder=\"vibecontrols\"\n />\n ) : null}\n </div>\n\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"page-id\">\n Page ID\n </label>\n <select\n id=\"page-id\"\n value={customPageEntry ? '__custom__' : formData.pageId || ''}\n onChange={(e) => {\n if (e.target.value === '__custom__') {\n setCustomPageEntry(true);\n setFormData({ ...formData, pageId: '' });\n return;\n }\n\n setCustomPageEntry(false);\n setFormData({ ...formData, pageId: e.target.value || undefined });\n }}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n disabled={!formData.productId}\n aria-label=\"Page ID\"\n >\n <option value=\"\">All pages</option>\n {pageOptions.map((pageOption) => (\n <option key={pageOption.pageId} value={pageOption.pageId}>\n {pageOption.label} ({pageOption.pageId})\n </option>\n ))}\n {showCurrentPageOption ? (\n <option value={formData.pageId}>Current: {formData.pageId}</option>\n ) : null}\n <option value=\"__custom__\">Custom page ID</option>\n </select>\n {customPageEntry ? (\n <input\n id=\"page-id-custom\"\n aria-label=\"Custom page ID\"\n type=\"text\"\n value={formData.pageId || ''}\n onChange={(e) =>\n setFormData({ ...formData, pageId: e.target.value || undefined })\n }\n className=\"mt-2 w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n placeholder=\"agents\"\n />\n ) : null}\n </div>\n </div>\n\n <label className=\"flex items-center gap-3 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={formData.isActive ?? true}\n onChange={(e) => setFormData({ ...formData, isActive: e.target.checked })}\n className=\"size-4 rounded\"\n aria-label=\"Active\"\n />\n <span className=\"text-sm font-medium\">Active</span>\n </label>\n </div>\n </div>\n\n {/* Trigger Settings */}\n <div className=\"border border-border-subtle rounded-md p-4 sm:p-6 bg-bg-surface\">\n <h2 className=\"text-lg font-semibold mb-4\">{tr('tourBuilder.sectionTriggerSettings')}</h2>\n\n <div className=\"space-y-4\">\n {/* Trigger Type */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"trigger-type\">\n {tr('tourBuilder.labelTriggerType')}\n </label>\n <select\n id=\"trigger-type\"\n value={formData.triggerType || 'MANUAL'}\n onChange={(e) =>\n setFormData({ ...formData, triggerType: e.target.value as TourTriggerType })\n }\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n aria-label={tr('tourBuilder.labelTriggerType')}\n >\n <option value=\"MANUAL\">{tr('tourBuilder.triggerManual')}</option>\n <option value=\"AUTO_FIRST_VISIT\">{tr('tourBuilder.triggerAutoFirstVisit')}</option>\n <option value=\"AUTO_ALWAYS\">{tr('tourBuilder.triggerAutoAlways')}</option>\n <option value=\"ON_EVENT\">{tr('tourBuilder.triggerOnEvent')}</option>\n <option value=\"SCHEDULED\">{tr('tourBuilder.triggerScheduled')}</option>\n </select>\n </div>\n\n {/* Priority */}\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"priority\">\n {tr('tourBuilder.labelPriority')}\n </label>\n <input\n id=\"priority\"\n type=\"number\"\n min=\"1\"\n max=\"100\"\n value={formData.priority || 50}\n onChange={(e) => {\n const priority = Number.parseInt(e.target.value, 10) || 50;\n setFormData({ ...formData, priority });\n }}\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n aria-label={tr('tourBuilder.labelPriority')}\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"tour-start-date\">\n Start Date\n </label>\n <input\n id=\"tour-start-date\"\n type=\"datetime-local\"\n value={formatDateTimeLocal(formData.startDate)}\n onChange={(e) =>\n setFormData({\n ...formData,\n startDate: e.target.value\n ? new Date(e.target.value).toISOString()\n : undefined,\n })\n }\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n aria-label=\"Start Date\"\n />\n </div>\n\n <div>\n <label className=\"block text-sm font-medium mb-2\" htmlFor=\"tour-end-date\">\n End Date\n </label>\n <input\n id=\"tour-end-date\"\n type=\"datetime-local\"\n value={formatDateTimeLocal(formData.endDate)}\n onChange={(e) =>\n setFormData({\n ...formData,\n endDate: e.target.value ? new Date(e.target.value).toISOString() : undefined,\n })\n }\n className=\"w-full px-3 py-2 border border-border-subtle rounded-md bg-bg-surface text-text-primary\"\n aria-label=\"End Date\"\n />\n </div>\n </div>\n </div>\n </div>\n\n {/* API Error */}\n {error && (\n <div className=\"border border-status-error-border rounded-md p-4 bg-status-error-bg/10\">\n <h3 className=\"font-semibold text-status-error-text mb-2\">{tr('tourBuilder.errorTitle')}</h3>\n <p className=\"text-sm text-status-error-text\">{error.message}</p>\n </div>\n )}\n\n {/* Validation Errors */}\n {validationErrors.length > 0 && (\n <div className=\"border border-status-error-border rounded-md p-4 bg-status-error-bg/10\">\n <h3 className=\"font-semibold text-status-error-text mb-2\">\n {tr('tourBuilder.validationErrorsTitle')}\n </h3>\n <ul className=\"list-disc list-inside space-y-1\">\n {validationErrors.map((err) => (\n <li key={err.message} className=\"text-sm text-status-error-text\">\n {err.message}\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex flex-wrap gap-3\">\n <PermissionGate\n permission={isNew ? TOUR_PERMISSIONS.TOUR_CREATE : TOUR_PERMISSIONS.TOUR_UPDATE}\n >\n <button\n type=\"submit\"\n disabled={saving || !canSave}\n className=\"flex-1 min-w-[200px] px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg/90 disabled:opacity-50 flex items-center justify-center gap-2\"\n >\n <Save size={20} />\n {saving\n ? tr('tourBuilder.saving')\n : tourId && tourId !== 'new'\n ? tr('tourBuilder.updateTour')\n : tr('tourBuilder.createAndAddSteps')}\n </button>\n </PermissionGate>\n {tourId && tourId !== 'new' && (\n <>\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/${tourId}/steps`)}\n className=\"px-4 py-2 bg-secondary text-secondary-foreground rounded-md hover:bg-secondary/80 flex items-center gap-2\"\n >\n <ListOrdered size={20} />\n {tr('tourBuilder.editSteps')}\n {tour?.steps && tour.steps.length > 0 && (\n <span className=\"ml-1 px-2 py-0.5 text-xs bg-action-primary-bg/20 rounded-full\">\n {tour.steps.length}\n </span>\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/${tourId}/preview`)}\n className=\"px-4 py-2 border border-border-subtle rounded-md hover:bg-accent flex items-center gap-2\"\n >\n <Eye size={20} />\n {tr('tourBuilder.preview')}\n </button>\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/${tourId}/analytics`)}\n className=\"px-4 py-2 border border-border-subtle rounded-md hover:bg-accent flex items-center gap-2\"\n >\n <BarChart3 size={20} />\n {tr('tourBuilder.analytics')}\n </button>\n <button\n type=\"button\"\n onClick={() => navigate(`${basePath}/${tourId}/schedule`)}\n className=\"px-4 py-2 border border-border-subtle rounded-md hover:bg-accent flex items-center gap-2\"\n >\n <Calendar size={20} />\n Schedule\n </button>\n <PermissionGate permission={TOUR_PERMISSIONS.TOUR_TEMPLATE_CREATE}>\n <button\n type=\"button\"\n onClick={handleSaveTemplate}\n disabled={!canCreateTemplate}\n className=\"px-4 py-2 border border-border-subtle rounded-md hover:bg-accent flex items-center gap-2 disabled:opacity-50\"\n >\n <LayoutTemplate size={20} />\n Save as Template\n </button>\n </PermissionGate>\n </>\n )}\n </div>\n </form>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA2BA,IAAM,KAAgC,KAEhC,KAA+B,CAAG;;;;;;;;;;;;;;;;;;AAwCxC,SAAS,GAAwB,GAAgC;AAC/D,KAAI,CAAC,KAAU,OAAO,KAAW,SAAU,QAAO;CAElD,IAAM,IAAS,GACT,IAAc,EAAO;AAC3B,KAAI,aAAuB,MAAO,QAAO,EAAY;CAErD,IAAM,IAAS,EAAO;AACtB,KAAI,CAAC,MAAM,QAAQ,EAAO,IAAI,EAAO,WAAW,EAAG,QAAO;CAE1D,IAAM,IAAW,EACd,KAAK,MAAU;AACd,MAAI,aAAiB,MAAO,QAAO,EAAM;AACzC,MAAI,CAAC,KAAS,OAAO,KAAU,SAAU,QAAO;EAEhD,IAAM,IAAW,EAAgC;AACjD,SAAO,OAAO,KAAY,WAAW,IAAU;GAC/C,CACD,QAAQ,MAA+B,EAAQ,EAAS;AAE3D,QAAO,EAAS,SAAS,IAAI,EAAS,KAAK,KAAK,GAAG;;AAyBrD,IAAM,IAAuD;CAC3D;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACP;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CACD;EACE,WAAW;EACX,UAAU;EACV,aAAa;EACb,QAAQ;EACR,WAAW;EACX,MAAM;EACN,cAAc;EACf;CAC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"}