"use client" /** * SettingsClient — System banner + coach mark utilities. * * Provides: * • System banner: edit copy, variant, action link, dismissibility; Apply / Discard / Reset * • Coach marks: list flows, reset, preview on target page */ import * as React from "react" import { Link, useNavigate } from "react-router-dom" import { useProductOrganizationSettingsHref } from "@/contexts/product-route-sync" import { Button } from "@/components/ui/button" import { Badge } from "@/components/ui/badge" import { Input } from "@/components/ui/input" import { Textarea } from "@/components/ui/textarea" import { ToggleSwitch } from "@/components/ui/toggle-switch" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { SystemBanner } from "@/components/ui/banner" import { Tip } from "@/components/ui/tip" import { cn } from "@/lib/utils" import { COACH_MARK_FLOWS, type CoachMarkFlowDef } from "@/lib/coach-mark-registry" import { resetCoachMarkFlow, resetAllCoachMarks, } from "@/hooks/use-coach-mark" import { useSystemBanner, type SystemBannerConfig, type SystemBannerVariant, } from "@/contexts/system-banner-context" import { SettingsAppearanceCard } from "@/components/settings-appearance-card" import { SettingsFormRow } from "@/components/settings-form-row" import { FieldGroup } from "@/components/ui/field" import { FilterTextValueInput } from "@/components/data-table/filter-text-value-input" import { useProductAuthoringEnabled } from "@exxatdesignux/ui/components/shell" import { getStorageItem, removeStorageItem, } from "@exxatdesignux/ui/lib/persisted-state" const BUILDER_ONBOARDING_COMPLETE_KEY = "builder:onboarding-complete:v1" const SYSTEM_BANNER_VARIANTS: SystemBannerVariant[] = [ "info", "warning", "error", "success", "promo", ] /* ── Helpers ─────────────────────────────────────────────────────────────── */ const STORAGE_PREFIX = "exxat-coach-mark:" function isFlowDismissed(flowId: string): boolean { if (typeof window === "undefined") return false try { return localStorage.getItem(`${STORAGE_PREFIX}${flowId}`) === "dismissed" } catch { return false } } /* ── Flow card ──────────────────────────────────────────────────────────── */ function FlowCard({ flow, dismissed, onReset, onPreview, }: { flow: CoachMarkFlowDef dismissed: boolean onReset: () => void onPreview: () => void }) { return (
{/* Icon */} {/* Content */}

{flow.name}

{dismissed ? "Completed" : "Active"}

{flow.description}