@togo-framework/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/status/EmptyState.tsx","../src/components/status/ServiceUnavailable.tsx","../src/components/status/SessionExpired.tsx","../src/components/status/PageHeader.tsx","../src/components/status/StatCard.tsx","../src/components/status/StatusBadge.tsx","../src/components/status/DataState.tsx","../src/components/data-table/DataTable.tsx","../src/components/data-table/CardGrid.tsx","../src/components/charts/MiniBarChart.tsx","../src/components/auth/AuthFlow.tsx","../src/components/auth/AuthCard.tsx","../src/components/auth/LoginForm.tsx","../src/components/auth/AuthErrorAlert.tsx","../src/components/auth/AuthStepHeader.tsx","../src/components/auth/PasswordInput.tsx","../src/components/auth/OTPBoxGroup.tsx","../src/components/auth/ForgotForm.tsx","../src/components/auth/ResetForm.tsx","../src/components/auth/PasswordStrengthMeter.tsx","../src/components/auth/TwoFAForm.tsx","../src/components/auth/LockScreen.tsx","../src/components/auth/PasswordLockScreen.tsx","../src/components/layout/AppSidebar.tsx","../src/components/layout/AppPageShell.tsx","../src/components/layout/ViewToggle.tsx","../src/components/layout/RouteProgress.tsx","../src/components/layout/AppLayout.tsx","../src/components/layout/AdminLayout.tsx","../src/components/nav/DynamicIcon.tsx","../src/components/profile/ProfileView.tsx","../src/components/pickers/ColorPicker.tsx","../src/components/pickers/IconPicker.tsx","../src/components/map/MapView.tsx","../src/components/map/MapLegend.tsx","../src/components/map/mapDefaults.ts","../src/components/map/MapLayersPanel.tsx","../src/components/map/MapPanel.tsx","../src/components/map/EventMapPanel.tsx","../src/components/entity/NetworkGraph.tsx","../src/components/entity/EntityNetworkGraph.tsx","../src/components/plugin/PluginCard.tsx","../src/components/plugin/PluginSparkline.tsx","../src/components/plugin/PluginPageHeader.tsx","../src/components/plugin/PluginSectionCard.tsx","../src/components/plugin/SourceBadge.tsx","../src/components/plugin-detail/icon-resolver.ts","../src/components/plugin-detail/WorkflowStepNode.tsx","../src/components/plugin-detail/WorkflowPipeline.tsx","../src/components/plugin-detail/WorkflowEditor.tsx","../src/components/plugin-detail/NestedStepsEditor.tsx","../src/components/plugin-detail/StepOptionsDialog.tsx","../src/components/plugin-detail/PluginAppearanceSection.tsx","../src/components/plugin-detail/TestRunPanel.tsx","../src/components/plugin-detail/PluginDetailLayout.tsx","../src/components/plugin-detail/Workflow.tsx","../src/components/logs/LogsView.tsx","../src/hooks/useDebounce.ts","../src/hooks/useInfiniteScroll.ts","../src/components/errors/IssuesList.tsx","../src/components/errors/shared.ts","../src/components/errors/IssueDetail.tsx","../src/components/errors/ErrorTrackingPage.tsx","../src/components/ui/sentra-loading.tsx","../src/components/brand/Logo.tsx","../src/components/ui/contextual-skeleton.tsx","../src/components/ui/section-skeleton.tsx","../src/i18n/LanguageProvider.tsx","../src/i18n/index.ts","../src/i18n/locales/en.json","../src/i18n/locales/ar.json","../src/components/copilot/artifacts/ArtifactTable.tsx","../src/components/copilot/artifacts/ArtifactChart.tsx","../src/components/copilot/artifacts/ArtifactCard.tsx","../src/components/intel/SeverityChip.tsx","../src/components/copilot/artifacts/ArtifactActions.tsx","../src/components/markdown/MarkdownRenderer.tsx","../src/components/chat/MarkdownContent.tsx","../src/components/copilot/artifacts/ArtifactMarkdown.tsx","../src/components/copilot/artifacts/ArtifactClientCandidates.tsx","../src/components/copilot/artifacts/ArtifactClientFieldPicker.tsx","../src/components/copilot/artifacts/ArtifactClientDiffConfirm.tsx","../src/components/copilot/artifacts/ArtifactPersonaStarters.tsx","../src/components/copilot/artifacts/ArtifactRenderer.tsx","../src/components/feedback/FeedbackButton.tsx","../src/components/feedback/FeedbackHub.tsx","../src/components/issues/meta.ts","../src/components/feedback/MotorFeedbackLauncher.tsx","../src/components/feedback/FeedbackWidget.tsx","../src/components/brand/Wordmark.tsx","../src/components/sections/SectionBoard.tsx","../src/components/markdown/MarkdownEditor.tsx","../src/components/copilot/CopilotProvider.tsx","../src/components/copilot/UnifiedCopilotDock.tsx","../src/components/copilot/copilotStrings.ts","../src/components/copilot/AgentSteps.tsx","../src/components/copilot/StreamErrorBanner.tsx","../src/components/chat/ChatToolbar.tsx","../src/components/chat/FilePreviewChip.tsx","../src/components/chat/CompareFactorsCard.tsx","../src/components/chat/ChatStructuredData.tsx","../src/components/copilot/CopilotLauncher.tsx","../src/components/copilot/CopilotSelectionTrigger.tsx","../src/components/copilot/ChatThread.tsx","../src/components/copilot/StreamingMessage.tsx","../src/components/copilot/ArtifactViewer.tsx"],"sourcesContent":["'use client'\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\n/**\n * EmptyState — a centered \"no data\" placeholder for tables / lists / panels.\n *\n * Pure + product-agnostic (Rule 25): takes a pre-resolved `title`/`description`\n * (the consumer picks EN/AR via its `language`) and an optional `icon` + action\n * slot. Semantic tokens only; RTL-clean (logical centering).\n */\nexport type EmptyStateProps = {\n /** Pre-resolved title string (consumer selects EN/AR). */\n title: string;\n /** Optional pre-resolved supporting line. */\n description?: string;\n /** Optional leading icon (e.g. a lucide-react element). */\n icon?: React.ReactNode;\n /** Optional action slot (button / link) rendered below the text. */\n action?: React.ReactNode;\n className?: string;\n};\n\nconst EmptyState = ({ title, description, icon, action, className }: EmptyStateProps) => (\n <div\n className={cn(\n \"flex flex-col items-center justify-center rounded-xl border border-dashed bg-card/40 px-6 py-12 text-center transition-colors duration-base ease-standard\",\n className,\n )}\n >\n {icon ? (\n <div className=\"mb-3 flex size-10 items-center justify-center rounded-full bg-muted text-muted-foreground [&>svg]:size-5\">\n {icon}\n </div>\n ) : null}\n <p className=\"text-sm font-medium text-foreground\">{title}</p>\n {description ? (\n <p className=\"mt-1 max-w-sm text-xs text-muted-foreground\">{description}</p>\n ) : null}\n {action ? <div className=\"mt-4\">{action}</div> : null}\n </div>\n);\nEmptyState.displayName = \"EmptyState\";\n\nexport { EmptyState };\n","'use client'\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\n/**\n * ServiceUnavailable — the graceful \"this service/backend dependency is not\n * connected\" card. Rendered when an API returns 503 (a DB / NATS / Fort the\n * page depends on is down or unconfigured).\n *\n * This is an EXPECTED state, not an error — styled calm (amber-tinted, not\n * destructive). Pure + product-agnostic: pre-resolved strings in, optional\n * `hint` (e.g. which env var to set) and an action slot.\n */\nexport type ServiceUnavailableProps = {\n /** Pre-resolved headline, e.g. \"Service not connected\". */\n title: string;\n /** Pre-resolved explanation line. */\n description?: string;\n /** Optional secondary hint (e.g. a config key) rendered muted/mono. */\n hint?: React.ReactNode;\n /** Optional leading icon. */\n icon?: React.ReactNode;\n /** Optional action slot (e.g. a retry / docs button). */\n action?: React.ReactNode;\n className?: string;\n};\n\nconst ServiceUnavailable = ({\n title,\n description,\n hint,\n icon,\n action,\n className,\n}: ServiceUnavailableProps) => (\n <div\n className={cn(\n \"rounded-xl border border-alert-amber/30 bg-alert-amber/5 p-5 shadow-sm transition-shadow duration-base ease-standard\",\n className,\n )}\n >\n <div className=\"flex items-start gap-3\">\n {icon ? (\n <div className=\"mt-0.5 text-alert-amber [&>svg]:size-5\">{icon}</div>\n ) : null}\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-sm font-semibold text-foreground\">{title}</p>\n {description ? (\n <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>\n ) : null}\n {hint ? (\n <p className=\"mt-2 text-xs text-muted-foreground\">{hint}</p>\n ) : null}\n {action ? <div className=\"mt-3\">{action}</div> : null}\n </div>\n </div>\n </div>\n);\nServiceUnavailable.displayName = \"ServiceUnavailable\";\n\nexport { ServiceUnavailable };\n","'use client'\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\n/**\n * SessionExpired — the graceful \"your session expired, sign in again\" card,\n * rendered when an API returns 401. Product-agnostic: the consumer passes a\n * pre-resolved title/description/CTA label and a `loginHref` (the library does\n * not import next/link — it renders a plain anchor so it works in any app).\n */\nexport type SessionExpiredProps = {\n /** Pre-resolved headline, e.g. \"Session expired\". */\n title: string;\n /** Pre-resolved explanation line. */\n description?: string;\n /** Pre-resolved CTA label, e.g. \"Sign in again\". */\n ctaLabel: string;\n /** Where the CTA links (defaults to \"/login\"). */\n loginHref?: string;\n /** Optional leading icon. */\n icon?: React.ReactNode;\n className?: string;\n};\n\nconst SessionExpired = ({\n title,\n description,\n ctaLabel,\n loginHref = \"/login\",\n icon,\n className,\n}: SessionExpiredProps) => (\n <div\n className={cn(\n \"flex flex-col items-center justify-center rounded-xl border bg-card px-6 py-12 text-center shadow-sm transition-shadow duration-base ease-standard\",\n className,\n )}\n >\n {icon ? (\n <div className=\"mb-3 flex size-10 items-center justify-center rounded-full bg-muted text-muted-foreground [&>svg]:size-5\">\n {icon}\n </div>\n ) : null}\n <p className=\"text-sm font-semibold text-foreground\">{title}</p>\n {description ? (\n <p className=\"mt-1 max-w-sm text-xs text-muted-foreground\">{description}</p>\n ) : null}\n <a\n href={loginHref}\n className=\"mt-4 inline-flex h-9 items-center justify-center rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground shadow-sm transition-all duration-fast ease-standard hover:bg-primary/90 hover:shadow-md active:scale-[0.98] focus-visible:outline-none focus-visible:shadow-focus\"\n >\n {ctaLabel}\n </a>\n </div>\n);\nSessionExpired.displayName = \"SessionExpired\";\n\nexport { SessionExpired };\n","'use client'\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\n/**\n * PageHeader — the standard page title row for admin/ops dashboard pages: an\n * optional leading icon, a title, an optional description line, and an optional\n * trailing `actions` slot (filters, buttons). RTL-clean (logical gap/justify).\n *\n * Pure + product-agnostic: pre-resolved `title`/`description` strings in.\n */\nexport type PageHeaderProps = {\n /** Pre-resolved page title (consumer selects EN/AR). */\n title: string;\n /** Optional pre-resolved subtitle. */\n description?: string;\n /** Optional leading icon (sized to ~1.25rem). */\n icon?: React.ReactNode;\n /** Optional trailing actions (filters, buttons) — placed at the inline end. */\n actions?: React.ReactNode;\n className?: string;\n};\n\nconst PageHeader = ({ title, description, icon, actions, className }: PageHeaderProps) => (\n <div className={cn(\"flex flex-wrap items-center justify-between gap-4\", className)}>\n <div className=\"min-w-0\">\n <h1 className=\"flex items-center gap-2 text-2xl font-bold text-foreground\">\n {icon ? <span className=\"text-muted-foreground [&>svg]:size-5\">{icon}</span> : null}\n {title}\n </h1>\n {description ? (\n <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>\n ) : null}\n </div>\n {actions ? <div className=\"flex items-center gap-2\">{actions}</div> : null}\n </div>\n);\nPageHeader.displayName = \"PageHeader\";\n\nexport { PageHeader };\n","'use client'\n\nimport * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\nimport { Card, CardContent, CardHeader, CardDescription } from \"../ui/card\";\n\n/**\n * StatCard — a compact metric tile (label + big value) for dashboard summary\n * strips. `tone` colors the value via semantic tokens (no hex literals).\n *\n * Pure + product-agnostic: pre-resolved `label` string + a value node in.\n */\nconst statValueVariants = cva(\"text-2xl font-bold font-mono tabular-nums\", {\n variants: {\n tone: {\n default: \"text-foreground\",\n muted: \"text-muted-foreground\",\n success: \"text-success\",\n warning: \"text-warning\",\n danger: \"text-destructive\",\n info: \"text-info\",\n },\n },\n defaultVariants: { tone: \"default\" },\n});\n\nexport type StatCardProps = VariantProps<typeof statValueVariants> & {\n /** Pre-resolved metric label (consumer selects EN/AR). */\n label: string;\n /** The metric value — string or number. */\n value: React.ReactNode;\n className?: string;\n};\n\nconst StatCard = ({ label, value, tone, className }: StatCardProps) => (\n <Card className={cn(\"transition-all duration-base ease-standard hover:shadow-md\", className)}>\n <CardHeader className=\"px-4 pb-1 pt-4\">\n <CardDescription className=\"text-xs\">{label}</CardDescription>\n </CardHeader>\n <CardContent className=\"px-4 pb-4\">\n <p className={cn(statValueVariants({ tone }))}>{value}</p>\n </CardContent>\n </Card>\n);\nStatCard.displayName = \"StatCard\";\n\nexport { StatCard, statValueVariants };\n","'use client'\n\nimport * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\n\n/**\n * StatusBadge — a small tinted status pill driven by semantic tokens instead of\n * hardcoded `bg-emerald-500/15` color literals. Use for health / level / state\n * (running, ok, down, error, warn, info, …). Pure + product-agnostic.\n *\n * The consumer maps its domain status → a `tone` and passes a pre-resolved\n * label (EN/AR). This keeps colors centralised and RTL-/theme-safe.\n */\nconst statusBadgeVariants = cva(\n \"inline-flex items-center gap-1 rounded-md border px-2 py-0.5 text-xs font-medium transition-colors duration-fast ease-standard\",\n {\n variants: {\n tone: {\n neutral: \"border-border bg-muted text-muted-foreground\",\n success: \"border-success/30 bg-success/15 text-success\",\n warning: \"border-warning/30 bg-warning/15 text-warning\",\n danger: \"border-destructive/30 bg-destructive/15 text-destructive\",\n info: \"border-info/30 bg-info/15 text-info\",\n },\n },\n defaultVariants: { tone: \"neutral\" },\n },\n);\n\nexport type StatusBadgeTone = NonNullable<\n VariantProps<typeof statusBadgeVariants>[\"tone\"]\n>;\n\nexport type StatusBadgeProps = VariantProps<typeof statusBadgeVariants> & {\n /** Pre-resolved label (consumer selects EN/AR). */\n children: React.ReactNode;\n className?: string;\n};\n\nconst StatusBadge = ({ tone, children, className }: StatusBadgeProps) => (\n <span className={cn(statusBadgeVariants({ tone }), className)}>{children}</span>\n);\nStatusBadge.displayName = \"StatusBadge\";\n\nexport { StatusBadge, statusBadgeVariants };\n","'use client'\n\nimport * as React from \"react\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport { Alert, AlertDescription, AlertTitle } from \"../ui/alert\";\nimport { EmptyState } from \"./EmptyState\";\nimport { ServiceUnavailable } from \"./ServiceUnavailable\";\nimport { SessionExpired } from \"./SessionExpired\";\n\n/**\n * DataState — the single wrapper that guarantees a data page renders ONE of the\n * canonical states and NEVER a raw error string. Precedence:\n *\n * loading → unauthorized (401) → unavailable (503) → error → empty → children\n *\n * Pure + product-agnostic (Rule 25): the consumer passes booleans + pre-resolved\n * EN/AR label bundles. The library never fetches and never reads a language\n * context — it just renders the resolved strings.\n */\nexport type DataStateLabels = {\n /** Unauthorized (401) card. */\n sessionExpiredTitle: string;\n sessionExpiredDescription?: string;\n signInLabel: string;\n loginHref?: string;\n /** Unavailable (503) card. */\n unavailableTitle: string;\n unavailableDescription?: string;\n unavailableHint?: React.ReactNode;\n /** Generic error card. */\n errorTitle: string;\n /** Empty card. */\n emptyTitle: string;\n emptyDescription?: string;\n};\n\nexport type DataStateProps = {\n loading?: boolean;\n unauthorized?: boolean;\n unavailable?: boolean;\n /** Pre-resolved error detail (e.g. \"HTTP 500\"); shown under errorTitle. */\n error?: string | null;\n /** True when the request succeeded but returned no rows. */\n empty?: boolean;\n labels: DataStateLabels;\n /** Optional icon reused across empty/unavailable/session cards. */\n icon?: React.ReactNode;\n /** Optional action slot for the empty state (e.g. a \"Create\" button). */\n emptyAction?: React.ReactNode;\n /** Skeleton rendered while `loading`. Defaults to three bars. */\n loadingFallback?: React.ReactNode;\n /** The populated content, rendered only when no special state applies. */\n children?: React.ReactNode;\n};\n\nconst DefaultSkeleton = () => (\n <div className=\"space-y-2\">\n <Skeleton className=\"h-9 w-full\" />\n <Skeleton className=\"h-9 w-full\" />\n <Skeleton className=\"h-9 w-full\" />\n </div>\n);\nDefaultSkeleton.displayName = \"DefaultSkeleton\";\n\nconst DataState = ({\n loading,\n unauthorized,\n unavailable,\n error,\n empty,\n labels,\n icon,\n emptyAction,\n loadingFallback,\n children,\n}: DataStateProps) => {\n if (loading) return <>{loadingFallback ?? <DefaultSkeleton />}</>;\n\n if (unauthorized) {\n return (\n <SessionExpired\n title={labels.sessionExpiredTitle}\n description={labels.sessionExpiredDescription}\n ctaLabel={labels.signInLabel}\n loginHref={labels.loginHref}\n icon={icon}\n />\n );\n }\n\n if (unavailable) {\n return (\n <ServiceUnavailable\n title={labels.unavailableTitle}\n description={labels.unavailableDescription}\n hint={labels.unavailableHint}\n icon={icon}\n />\n );\n }\n\n if (error) {\n return (\n <Alert variant=\"destructive\">\n <AlertTitle>{labels.errorTitle}</AlertTitle>\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n );\n }\n\n if (empty) {\n return (\n <EmptyState\n title={labels.emptyTitle}\n description={labels.emptyDescription}\n icon={icon}\n action={emptyAction}\n />\n );\n }\n\n return <>{children}</>;\n};\nDataState.displayName = \"DataState\";\n\nexport { DataState };\n","'use client'\n\n/**\n * DataTable — flagship grid component for the Sentra Design System.\n *\n * Built on @tanstack/react-table over the existing shadcn/ui Table primitive.\n *\n * Features:\n * - Multi-column sorting (keyboard-navigable aria-sort headers)\n * - Per-column filters: text / select / date-range / number-range\n * - Global search box\n * - Column visibility toggle\n * - Column pinning (start/end)\n * - Client-side pagination + controlled server-side mode\n * - Row selection (checkbox) + bulk-action slot\n * - Row click handler + expandable row slot\n * - Density toggle (compact / comfortable)\n * - Sticky header\n * - Loading skeleton (SectionSkeleton)\n * - Empty + error states\n * - CSV export of current view (client-side)\n * - Full RTL (logical props, dir-aware sort icons)\n * - Bilingual: all chrome strings translated EN/AR internally via `language` prop\n * - WCAG 2.1 AA: visible focus rings, aria-sort, aria-label on all controls\n *\n * Design rules:\n * - Rule 8 — bilingual (EN/AR), RTL logical properties\n * - Rule 16 — Sentra app style: semantic tokens only\n * - Rule 25 — product-agnostic: NEVER fetches; data arrives entirely via props\n */\n\nimport * as React from 'react'\nimport {\n useReactTable,\n getCoreRowModel,\n getSortedRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n flexRender,\n type SortingState,\n type ColumnFiltersState,\n type VisibilityState,\n type RowSelectionState,\n type PaginationState,\n type ColumnPinningState,\n} from '@tanstack/react-table'\nimport {\n ChevronDown,\n ChevronUp,\n ChevronsUpDown,\n ChevronLeft,\n ChevronRight,\n ChevronsLeft,\n ChevronsRight,\n Download,\n Search,\n X,\n Eye,\n EyeOff,\n AlignJustify,\n AlignCenter,\n} from 'lucide-react'\n\nimport { cn } from '../../lib/utils'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../ui/table'\nimport { Button } from '../ui/button'\nimport { Input } from '../ui/input'\nimport { Checkbox } from '../ui/checkbox'\nimport { Badge } from '../ui/badge'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuCheckboxItem,\n DropdownMenuTrigger,\n DropdownMenuItem,\n DropdownMenuSeparator,\n} from '../ui/dropdown-menu'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../ui/select'\nimport { Skeleton } from '../ui/skeleton'\nimport { SectionSkeleton } from '../ui/section-skeleton'\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover'\nimport { Calendar } from '../ui/calendar'\nimport { Separator } from '../ui/separator'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip'\n\nimport type {\n DataTableProps,\n DataTableLanguage,\n DataTableDensity,\n DataTableColumnFilter,\n DataTableSelectOption,\n} from './types'\n\n// ── I18n strings ──────────────────────────────────────────────────────────────\n\nconst STRINGS = {\n en: {\n search: 'Search…',\n noResults: 'No results found.',\n noData: 'No data available.',\n error: 'Failed to load data.',\n rowsPerPage: 'Rows per page',\n of: 'of',\n page: 'Page',\n columns: 'Columns',\n export: 'Export CSV',\n filters: 'Filters',\n clearFilters: 'Clear filters',\n selectAll: 'Select all',\n deselectAll: 'Deselect all',\n selected: 'selected',\n actions: 'Actions',\n first: 'First page',\n previous: 'Previous page',\n next: 'Next page',\n last: 'Last page',\n sortAsc: 'Sort ascending',\n sortDesc: 'Sort descending',\n removeSort: 'Remove sort',\n loading: 'Loading…',\n compact: 'Compact',\n comfortable: 'Comfortable',\n density: 'Density',\n from: 'From',\n to: 'To',\n all: 'All',\n pin: 'Pin column',\n unpin: 'Unpin',\n pinStart: 'Pin to start',\n pinEnd: 'Pin to end',\n },\n ar: {\n search: 'بحث…',\n noResults: 'لا توجد نتائج.',\n noData: 'لا تتوفر بيانات.',\n error: 'فشل تحميل البيانات.',\n rowsPerPage: 'صفوف في الصفحة',\n of: 'من',\n page: 'صفحة',\n columns: 'الأعمدة',\n export: 'تصدير CSV',\n filters: 'تصفية',\n clearFilters: 'مسح التصفية',\n selectAll: 'تحديد الكل',\n deselectAll: 'إلغاء الكل',\n selected: 'محدد',\n actions: 'إجراءات',\n first: 'الصفحة الأولى',\n previous: 'الصفحة السابقة',\n next: 'الصفحة التالية',\n last: 'الصفحة الأخيرة',\n sortAsc: 'ترتيب تصاعدي',\n sortDesc: 'ترتيب تنازلي',\n removeSort: 'إزالة الترتيب',\n loading: 'جارٍ التحميل…',\n compact: 'مضغوط',\n comfortable: 'مريح',\n density: 'الكثافة',\n from: 'من',\n to: 'إلى',\n all: 'الكل',\n pin: 'تثبيت العمود',\n unpin: 'إلغاء التثبيت',\n pinStart: 'تثبيت في البداية',\n pinEnd: 'تثبيت في النهاية',\n },\n} as const\n\ntype Strings = typeof STRINGS['en']\n\nfunction useT(language: DataTableLanguage): Strings {\n return STRINGS[language] as Strings\n}\n\n// ── CSV export helper ─────────────────────────────────────────────────────────\n\nfunction exportToCsv<TData>(\n rows: TData[],\n headers: { id: string; label: string }[],\n filename: string,\n) {\n const headerRow = headers.map((h) => `\"${h.label}\"`).join(',')\n const dataRows = rows.map((row) => {\n return headers\n .map((h) => {\n const val = (row as Record<string, unknown>)[h.id]\n const str = val === null || val === undefined ? '' : String(val)\n return `\"${str.replace(/\"/g, '\"\"')}\"`\n })\n .join(',')\n })\n const csv = [headerRow, ...dataRows].join('\\n')\n const blob = new Blob(['' + csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = `${filename}.csv`\n link.click()\n URL.revokeObjectURL(url)\n}\n\n// ── Sort icon ─────────────────────────────────────────────────────────────────\n\nconst SortIcon = ({ sorted, isRTL }: { sorted: false | 'asc' | 'desc'; isRTL: boolean }) => {\n if (sorted === 'asc') return <ChevronUp className=\"ms-1 size-3.5 shrink-0\" aria-hidden=\"true\" />\n if (sorted === 'desc') return <ChevronDown className=\"ms-1 size-3.5 shrink-0\" aria-hidden=\"true\" />\n return <ChevronsUpDown className=\"ms-1 size-3.5 shrink-0 text-muted-foreground/50\" aria-hidden=\"true\" />\n}\n\n// ── DateRangeFilter ───────────────────────────────────────────────────────────\n\nconst DateRangeFilter = ({\n value,\n onChange,\n language,\n t,\n}: {\n value: { from?: Date; to?: Date } | undefined\n onChange: (v: { from?: Date; to?: Date } | undefined) => void\n language: DataTableLanguage\n t: (typeof STRINGS)['en']\n}) => {\n const [open, setOpen] = React.useState(false)\n const fromLabel = value?.from ? value.from.toLocaleDateString() : t.from\n const toLabel = value?.to ? value.to.toLocaleDateString() : t.to\n const hasValue = !!(value?.from || value?.to)\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className={cn('h-8 text-xs gap-1', hasValue && 'border-primary text-primary')}\n aria-label={`${t.from} / ${t.to}`}\n >\n {fromLabel} — {toLabel}\n {hasValue && (\n <X\n className=\"ms-1 size-3.5\"\n onClick={(e) => { e.stopPropagation(); onChange(undefined) }}\n aria-label={t.clearFilters}\n />\n )}\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto p-0\" align=\"start\">\n <Calendar\n mode=\"range\"\n selected={{ from: value?.from, to: value?.to }}\n onSelect={(range) => onChange(range ? { from: range.from, to: range.to } : undefined)}\n numberOfMonths={2}\n dir={language === 'ar' ? 'rtl' : 'ltr'}\n />\n </PopoverContent>\n </Popover>\n )\n}\n\n// ── NumberRangeFilter ─────────────────────────────────────────────────────────\n\nconst NumberRangeFilter = ({\n value,\n onChange,\n t,\n}: {\n value: { min?: number; max?: number } | undefined\n onChange: (v: { min?: number; max?: number } | undefined) => void\n t: (typeof STRINGS)['en']\n}) => {\n const [min, setMin] = React.useState(value?.min !== undefined ? String(value.min) : '')\n const [max, setMax] = React.useState(value?.max !== undefined ? String(value.max) : '')\n\n const commit = () => {\n const minVal = min !== '' ? Number(min) : undefined\n const maxVal = max !== '' ? Number(max) : undefined\n if (minVal === undefined && maxVal === undefined) {\n onChange(undefined)\n } else {\n onChange({ min: minVal, max: maxVal })\n }\n }\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <Input\n type=\"number\"\n className=\"h-8 w-20 text-xs\"\n placeholder={t.from}\n value={min}\n onChange={(e) => setMin(e.target.value)}\n onBlur={commit}\n aria-label={t.from}\n />\n <span className=\"text-xs text-muted-foreground\">–</span>\n <Input\n type=\"number\"\n className=\"h-8 w-20 text-xs\"\n placeholder={t.to}\n value={max}\n onChange={(e) => setMax(e.target.value)}\n onBlur={commit}\n aria-label={t.to}\n />\n </div>\n )\n}\n\n// ── Loading skeleton rows ─────────────────────────────────────────────────────\n\nconst LoadingSkeleton = ({ columns, rows = 5 }: { columns: number; rows?: number }) => (\n <>\n {Array.from({ length: rows }).map((_, ri) => (\n <TableRow key={ri} aria-hidden=\"true\">\n {Array.from({ length: columns }).map((_, ci) => (\n <TableCell key={ci}>\n <Skeleton className=\"h-4 w-full\" />\n </TableCell>\n ))}\n </TableRow>\n ))}\n </>\n)\n\n// ── Main component ────────────────────────────────────────────────────────────\n\nfunction DataTable<TData>({\n data,\n columns,\n getRowId,\n language = 'en',\n filterDefs,\n showGlobalSearch = true,\n pageSize: initialPageSize = 20,\n pageSizeOptions = [10, 20, 50, 100],\n totalRows,\n serverCallbacks,\n loading = false,\n error = null,\n onRowClick,\n enableRowSelection = false,\n bulkActions,\n renderExpandedRow,\n enableColumnVisibility = true,\n enableColumnPinning = true,\n enableColumnResizing = false,\n enableSorting = true,\n enableMultiSort = true,\n showDensityToggle = true,\n defaultDensity = 'comfortable',\n showCsvExport = true,\n csvFilename = 'export',\n className,\n stickyHeader = true,\n}: DataTableProps<TData>) {\n const t = useT(language)\n const isRTL = language === 'ar'\n const isServerMode = !!serverCallbacks\n\n // ── State ──────────────────────────────────────────────────────────────────\n const [sorting, setSorting] = React.useState<SortingState>([])\n const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>([])\n const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>({})\n const [rowSelection, setRowSelection] = React.useState<RowSelectionState>({})\n const [columnPinning, setColumnPinning] = React.useState<ColumnPinningState>({})\n const [globalFilter, setGlobalFilter] = React.useState('')\n const [density, setDensity] = React.useState<DataTableDensity>(defaultDensity)\n const [expandedRows, setExpandedRows] = React.useState<Record<string, boolean>>({})\n const [pagination, setPagination] = React.useState<PaginationState>({\n pageIndex: 0,\n pageSize: initialPageSize,\n })\n\n // ── Server-side: fire callback on state change ────────────────────────────\n const prevServerState = React.useRef<string>('')\n React.useEffect(() => {\n if (!isServerMode) return\n const state = { sorting, columnFilters, pagination, globalFilter }\n const serialized = JSON.stringify(state)\n if (serialized !== prevServerState.current) {\n prevServerState.current = serialized\n serverCallbacks!.onStateChange(state)\n }\n }, [sorting, columnFilters, pagination, globalFilter, isServerMode, serverCallbacks])\n\n // ── Selection column ──────────────────────────────────────────────────────\n const selectionColumn = React.useMemo(() => {\n if (!enableRowSelection) return []\n return [{\n id: '__select__',\n header: ({ table }: { table: import('@tanstack/react-table').Table<TData> }) => (\n <Checkbox\n checked={table.getIsAllPageRowsSelected() ? true : table.getIsSomePageRowsSelected() ? 'indeterminate' : false}\n onCheckedChange={(v) => table.toggleAllPageRowsSelected(!!v)}\n aria-label={t.selectAll}\n />\n ),\n cell: ({ row }: { row: import('@tanstack/react-table').Row<TData> }) => (\n <Checkbox\n checked={row.getIsSelected()}\n onCheckedChange={(v) => row.toggleSelected(!!v)}\n aria-label={`Select row ${row.index + 1}`}\n onClick={(e) => e.stopPropagation()}\n />\n ),\n enableSorting: false,\n enableHiding: false,\n size: 44,\n }] as import('@tanstack/react-table').ColumnDef<TData>[]\n }, [enableRowSelection, t.selectAll])\n\n const allColumns = React.useMemo(\n () => [...selectionColumn, ...columns],\n [selectionColumn, columns],\n )\n\n // ── Table instance ────────────────────────────────────────────────────────\n const table = useReactTable({\n data,\n columns: allColumns,\n getRowId,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: enableSorting ? getSortedRowModel() : undefined,\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n onSortingChange: setSorting,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n onRowSelectionChange: setRowSelection,\n onColumnPinningChange: setColumnPinning,\n onGlobalFilterChange: setGlobalFilter,\n onPaginationChange: setPagination,\n state: {\n sorting,\n columnFilters,\n columnVisibility,\n rowSelection,\n columnPinning,\n globalFilter,\n pagination,\n },\n enableMultiSort,\n enableColumnPinning,\n enableColumnResizing,\n // Server-side: disable client-side counts when totalRows is provided\n manualPagination: isServerMode,\n manualSorting: isServerMode,\n manualFiltering: isServerMode,\n pageCount: isServerMode && totalRows !== undefined ? Math.ceil(totalRows / pagination.pageSize) : undefined,\n columnResizeMode: enableColumnResizing ? 'onChange' : undefined,\n })\n\n // ── Selection info ────────────────────────────────────────────────────────\n const selectedRowIds = Object.keys(rowSelection).filter((k) => rowSelection[k])\n const hasSelection = selectedRowIds.length > 0\n const hasFilters = columnFilters.length > 0 || globalFilter.length > 0\n\n // ── Density classes ───────────────────────────────────────────────────────\n const cellCls = density === 'compact' ? 'py-1.5 px-3 text-xs' : 'py-3 px-4 text-sm'\n const headCls = density === 'compact' ? 'h-8 px-3 text-xs' : 'h-11 px-4 text-sm'\n\n // ── CSV export ────────────────────────────────────────────────────────────\n const handleExport = () => {\n const visibleColumns = table\n .getAllLeafColumns()\n .filter((col) => col.getIsVisible() && col.id !== '__select__')\n const headers = visibleColumns.map((col) => {\n const meta = col.columnDef.meta as import('./types').DataTableColumnMeta | undefined\n const label =\n (language === 'ar' ? meta?.header_ar : undefined) ??\n meta?.header_en ??\n (typeof col.columnDef.header === 'string' ? col.columnDef.header : col.id)\n return { id: col.id, label }\n })\n const rows = table.getFilteredRowModel().rows.map((r) => r.original)\n exportToCsv(rows, headers, csvFilename)\n }\n\n // ── Filter component for a given filter def ───────────────────────────────\n const renderFilterControl = (fd: DataTableColumnFilter<TData>) => {\n const column = table.getColumn(fd.columnId)\n if (!column) return null\n\n const filterValue = column.getFilterValue()\n\n if (fd.type === 'text') {\n return (\n <div key={fd.columnId} className=\"relative\">\n <Search className=\"absolute start-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground pointer-events-none\" aria-hidden=\"true\" />\n <Input\n className=\"h-8 ps-7 text-xs w-40\"\n placeholder={language === 'ar' ? fd.placeholder_ar : fd.placeholder_en}\n value={(filterValue as string) ?? ''}\n onChange={(e) => column.setFilterValue(e.target.value)}\n aria-label={language === 'ar' ? fd.placeholder_ar : fd.placeholder_en}\n />\n </div>\n )\n }\n\n if (fd.type === 'select') {\n const options = fd.options ?? []\n return (\n <Select\n key={fd.columnId}\n value={(filterValue as string) ?? ''}\n onValueChange={(v) => column.setFilterValue(v === '' ? undefined : v)}\n >\n <SelectTrigger className=\"h-8 text-xs w-36\" aria-label={fd.columnId}>\n <SelectValue placeholder={t.all} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"\">{t.all}</SelectItem>\n {options.map((opt: DataTableSelectOption) => (\n <SelectItem key={opt.value} value={opt.value}>\n {language === 'ar' ? (opt.label_ar ?? opt.label_en) : opt.label_en}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )\n }\n\n if (fd.type === 'date-range') {\n return (\n <DateRangeFilter\n key={fd.columnId}\n value={filterValue as { from?: Date; to?: Date } | undefined}\n onChange={(v) => column.setFilterValue(v)}\n language={language}\n t={t}\n />\n )\n }\n\n if (fd.type === 'number-range') {\n return (\n <NumberRangeFilter\n key={fd.columnId}\n value={filterValue as { min?: number; max?: number } | undefined}\n onChange={(v) => column.setFilterValue(v)}\n t={t}\n />\n )\n }\n\n return null\n }\n\n // ── Toolbar ────────────────────────────────────────────────────────────────\n\n const toolbar = (\n <div\n className=\"flex flex-wrap items-center gap-2 pb-3\"\n dir={isRTL ? 'rtl' : 'ltr'}\n >\n {/* Global search */}\n {showGlobalSearch && (\n <div className=\"relative flex-1 min-w-[180px] max-w-xs\">\n <Search className=\"absolute start-2 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground pointer-events-none\" aria-hidden=\"true\" />\n <Input\n className=\"h-8 ps-7 text-xs\"\n placeholder={t.search}\n value={globalFilter}\n onChange={(e) => setGlobalFilter(e.target.value)}\n aria-label={t.search}\n />\n {globalFilter && (\n <button\n className=\"absolute end-2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground\"\n onClick={() => setGlobalFilter('')}\n aria-label={t.clearFilters}\n >\n <X className=\"size-3.5\" />\n </button>\n )}\n </div>\n )}\n\n {/* Per-column filter controls */}\n {filterDefs && filterDefs.map((fd) => renderFilterControl(fd))}\n\n {/* Clear filters */}\n {hasFilters && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 text-xs text-muted-foreground\"\n onClick={() => {\n setColumnFilters([])\n setGlobalFilter('')\n }}\n aria-label={t.clearFilters}\n >\n <X className=\"size-3.5 me-1\" aria-hidden=\"true\" />\n {t.clearFilters}\n </Button>\n )}\n\n <div className=\"flex items-center gap-1.5 ms-auto\">\n {/* Bulk actions */}\n {hasSelection && bulkActions && bulkActions.length > 0 && (\n <>\n <Badge variant=\"secondary\" className=\"text-xs h-8 px-2.5 rounded-md font-normal\">\n {selectedRowIds.length} {t.selected}\n </Badge>\n {bulkActions.map((action) => (\n <Button\n key={action.id}\n variant={action.variant ?? 'outline'}\n size=\"sm\"\n className=\"h-8 text-xs\"\n onClick={() => action.onAction(selectedRowIds)}\n >\n {action.icon && <span className=\"me-1\">{action.icon}</span>}\n {language === 'ar' ? (action.label_ar ?? action.label_en) : action.label_en}\n </Button>\n ))}\n <Separator orientation=\"vertical\" className=\"h-5\" />\n </>\n )}\n\n {/* Density toggle */}\n {showDensityToggle && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 w-8 p-0\"\n onClick={() => setDensity(density === 'compact' ? 'comfortable' : 'compact')}\n aria-label={t.density}\n >\n {density === 'compact' ? (\n <AlignJustify className=\"size-4\" aria-hidden=\"true\" />\n ) : (\n <AlignCenter className=\"size-4\" aria-hidden=\"true\" />\n )}\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {density === 'compact' ? t.comfortable : t.compact}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n\n {/* Column visibility */}\n {enableColumnVisibility && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"h-8 text-xs gap-1\">\n <Eye className=\"size-3.5\" aria-hidden=\"true\" />\n {t.columns}\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align={isRTL ? 'start' : 'end'}>\n {table\n .getAllLeafColumns()\n .filter((col) => col.id !== '__select__' && col.getCanHide())\n .map((col) => {\n const meta = col.columnDef.meta as import('./types').DataTableColumnMeta | undefined\n const label =\n (language === 'ar' ? meta?.header_ar : undefined) ??\n meta?.header_en ??\n (typeof col.columnDef.header === 'string' ? col.columnDef.header : col.id)\n return (\n <DropdownMenuCheckboxItem\n key={col.id}\n checked={col.getIsVisible()}\n onCheckedChange={(v) => col.toggleVisibility(!!v)}\n >\n {label}\n </DropdownMenuCheckboxItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n\n {/* CSV export */}\n {showCsvExport && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 w-8 p-0\"\n onClick={handleExport}\n aria-label={t.export}\n >\n <Download className=\"size-4\" aria-hidden=\"true\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">{t.export}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n </div>\n )\n\n // ── Error state ────────────────────────────────────────────────────────────\n if (error) {\n return (\n <div\n className={cn('rounded-lg border border-destructive/30 bg-card p-8 text-center', className)}\n role=\"alert\"\n aria-live=\"assertive\"\n >\n <p className=\"text-sm text-destructive\">{error || t.error}</p>\n </div>\n )\n }\n\n // ── Table ─────────────────────────────────────────────────────────────────\n\n const headerRows = table.getHeaderGroups()\n const bodyRows = table.getRowModel().rows\n\n // Pagination info\n const pageIndex = table.getState().pagination.pageIndex\n const pageCount = table.getPageCount()\n const totalCount = isServerMode\n ? (totalRows ?? data.length)\n : table.getFilteredRowModel().rows.length\n const rowFrom = pageIndex * pagination.pageSize + 1\n const rowTo = Math.min(rowFrom + pagination.pageSize - 1, totalCount)\n\n return (\n <div className={cn('flex flex-col gap-0', className)} dir={isRTL ? 'rtl' : 'ltr'}>\n {toolbar}\n\n {/* Table wrapper — sticky header */}\n <div\n className={cn(\n 'rounded-lg border border-border bg-card overflow-auto shadow-sm',\n stickyHeader && 'relative',\n )}\n style={{ maxHeight: stickyHeader ? '65vh' : undefined }}\n >\n <Table>\n <TableHeader\n className={cn(\n stickyHeader && 'sticky top-0 z-10 bg-card shadow-sm',\n )}\n >\n {headerRows.map((headerGroup) => (\n <TableRow key={headerGroup.id} className=\"hover:bg-transparent border-b border-border\">\n {headerGroup.headers.map((header) => {\n const meta = header.column.columnDef.meta as import('./types').DataTableColumnMeta | undefined\n const isSortable = header.column.getCanSort()\n const sorted = header.column.getIsSorted()\n const ariaSort = sorted === 'asc' ? 'ascending' : sorted === 'desc' ? 'descending' : 'none'\n const isPinned = header.column.getIsPinned()\n\n // Bilingual header label\n const headerContent = header.isPlaceholder ? null : (() => {\n if (meta?.header_en || meta?.header_ar) {\n return language === 'ar' ? (meta.header_ar ?? meta.header_en) : meta.header_en\n }\n return flexRender(header.column.columnDef.header, header.getContext())\n })()\n\n return (\n <TableHead\n key={header.id}\n colSpan={header.colSpan}\n className={cn(\n headCls,\n 'font-semibold text-muted-foreground select-none whitespace-nowrap',\n isSortable && 'cursor-pointer hover:text-foreground transition-colors duration-fast ease-standard',\n isPinned === 'left' && 'sticky start-0 bg-card z-20 shadow-[inset_-1px_0_0_hsl(var(--border))]',\n isPinned === 'right' && 'sticky end-0 bg-card z-20 shadow-[inset_1px_0_0_hsl(var(--border))]',\n )}\n style={{\n width: header.getSize() !== 150 ? header.getSize() : undefined,\n }}\n aria-sort={isSortable ? ariaSort : undefined}\n onClick={isSortable ? header.column.getToggleSortingHandler() : undefined}\n onKeyDown={isSortable ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n header.column.getToggleSortingHandler()?.(e)\n }\n } : undefined}\n tabIndex={isSortable ? 0 : undefined}\n role={isSortable ? 'button' : undefined}\n aria-label={\n isSortable\n ? `${sorted === 'asc' ? t.sortDesc : sorted === 'desc' ? t.removeSort : t.sortAsc}: ${typeof headerContent === 'string' ? headerContent : header.id}`\n : undefined\n }\n >\n <div className=\"flex items-center\">\n {headerContent}\n {isSortable && (\n <SortIcon sorted={sorted} isRTL={isRTL} />\n )}\n {/* Column resizer */}\n {enableColumnResizing && header.column.getCanResize() && (\n <div\n className={cn(\n 'absolute end-0 top-0 h-full w-1 cursor-col-resize touch-none select-none bg-border opacity-0 hover:opacity-100',\n header.column.getIsResizing() && 'opacity-100 bg-primary',\n )}\n onMouseDown={header.getResizeHandler()}\n onTouchStart={header.getResizeHandler()}\n onClick={(e) => e.stopPropagation()}\n aria-hidden=\"true\"\n />\n )}\n </div>\n </TableHead>\n )\n })}\n </TableRow>\n ))}\n </TableHeader>\n\n <TableBody>\n {loading ? (\n <LoadingSkeleton\n columns={table.getAllLeafColumns().filter((c) => c.getIsVisible()).length}\n rows={pagination.pageSize > 10 ? 8 : pagination.pageSize}\n />\n ) : bodyRows.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={allColumns.length}\n className=\"h-32 text-center text-sm text-muted-foreground\"\n >\n {hasFilters ? t.noResults : t.noData}\n </TableCell>\n </TableRow>\n ) : (\n bodyRows.map((row) => {\n const rowId = getRowId ? getRowId(row.original) : String(row.index)\n const isExpanded = expandedRows[rowId] ?? false\n\n return (\n <React.Fragment key={row.id}>\n <TableRow\n data-state={row.getIsSelected() ? 'selected' : undefined}\n className={cn(\n 'border-b border-border',\n onRowClick && 'cursor-pointer hover:bg-muted/50 transition-colors duration-fast ease-standard',\n row.getIsSelected() && 'bg-primary/5',\n renderExpandedRow && 'cursor-pointer',\n )}\n onClick={() => {\n onRowClick?.(row.original)\n if (renderExpandedRow) {\n setExpandedRows((prev) => ({\n ...prev,\n [rowId]: !prev[rowId],\n }))\n }\n }}\n aria-selected={row.getIsSelected()}\n >\n {row.getVisibleCells().map((cell) => {\n const isPinned = cell.column.getIsPinned()\n return (\n <TableCell\n key={cell.id}\n className={cn(\n cellCls,\n isPinned === 'left' && 'sticky start-0 bg-card z-10 shadow-[inset_-1px_0_0_hsl(var(--border))]',\n isPinned === 'right' && 'sticky end-0 bg-card z-10 shadow-[inset_1px_0_0_hsl(var(--border))]',\n )}\n style={{\n width: cell.column.getSize() !== 150 ? cell.column.getSize() : undefined,\n }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n )\n })}\n </TableRow>\n\n {/* Expanded row slot */}\n {renderExpandedRow && isExpanded && (\n <TableRow key={`${row.id}-expanded`} className=\"bg-muted/30\">\n <TableCell\n colSpan={allColumns.length}\n className=\"p-4\"\n >\n {renderExpandedRow(row.original)}\n </TableCell>\n </TableRow>\n )}\n </React.Fragment>\n )\n })\n )}\n </TableBody>\n </Table>\n </div>\n\n {/* Pagination footer */}\n <div\n className=\"flex flex-wrap items-center justify-between gap-3 pt-3 text-xs text-muted-foreground\"\n dir={isRTL ? 'rtl' : 'ltr'}\n >\n {/* Rows per page */}\n <div className=\"flex items-center gap-2\">\n <span className=\"whitespace-nowrap\">{t.rowsPerPage}</span>\n <Select\n value={String(pagination.pageSize)}\n onValueChange={(v) => {\n table.setPageSize(Number(v))\n table.setPageIndex(0)\n }}\n >\n <SelectTrigger className=\"h-7 text-xs w-16\" aria-label={t.rowsPerPage}>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {pageSizeOptions.map((size) => (\n <SelectItem key={size} value={String(size)} className=\"text-xs\">\n {size}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n\n {/* Row count info */}\n <span className=\"whitespace-nowrap tabular-nums\">\n {totalCount > 0\n ? `${rowFrom}–${rowTo} ${t.of} ${totalCount}`\n : '0'}\n </span>\n\n {/* Page navigation */}\n <div className=\"flex items-center gap-0.5\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n aria-label={t.first}\n >\n {isRTL ? <ChevronsRight className=\"size-3.5\" aria-hidden=\"true\" /> : <ChevronsLeft className=\"size-3.5\" aria-hidden=\"true\" />}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n aria-label={t.previous}\n >\n {isRTL ? <ChevronRight className=\"size-3.5\" aria-hidden=\"true\" /> : <ChevronLeft className=\"size-3.5\" aria-hidden=\"true\" />}\n </Button>\n\n <span className=\"mx-1 tabular-nums whitespace-nowrap\">\n {t.page} {pageIndex + 1} {t.of} {Math.max(1, pageCount)}\n </span>\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n aria-label={t.next}\n >\n {isRTL ? <ChevronLeft className=\"size-3.5\" aria-hidden=\"true\" /> : <ChevronRight className=\"size-3.5\" aria-hidden=\"true\" />}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n onClick={() => table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n aria-label={t.last}\n >\n {isRTL ? <ChevronsLeft className=\"size-3.5\" aria-hidden=\"true\" /> : <ChevronsRight className=\"size-3.5\" aria-hidden=\"true\" />}\n </Button>\n </div>\n </div>\n </div>\n )\n}\n\nDataTable.displayName = 'DataTable'\n\nexport { DataTable }\n","'use client'\n\n/**\n * CardGrid — a reusable searchable / filterable responsive card grid. Same\n * toolbar UX as DataTable (global search + faceted dropdown filters + result\n * count + empty state) but renders a grid of cards via a `renderCard`\n * render-prop instead of table rows. Caller passes already-localised labels\n * (Rule 8). Promoted into @prism/ui from motor-web (product-agnostic).\n */\n\nimport { useMemo, useState } from 'react'\nimport { Search, Inbox } from 'lucide-react'\nimport { Input } from '../ui/input'\nimport { NativeSelect } from '../ui/native-select'\nimport { EmptyState } from '../status/EmptyState'\n\nexport type CardFilter<T> = {\n /** Stable id for the dropdown. */\n key: string\n /** Localised label, e.g. \"Product\". */\n label: string\n /** Value extractor for an item (compared exactly to the selected option). */\n value: (item: T) => string\n /** Options; the \"all\" choice is injected automatically. */\n options: { value: string; label: string }[]\n}\n\nexport type CardGridLabels = {\n searchPlaceholder: string\n all: string\n emptyTitle: string\n emptyDescription: string\n countLabel: (shown: number, total: number) => string\n}\n\ntype CardGridProps<T> = {\n items: T[]\n getKey: (item: T, index: number) => string\n renderCard: (item: T) => React.ReactNode\n /** Concatenated searchable text for an item (lower-cased match). */\n searchText: (item: T) => string\n filters?: CardFilter<T>[]\n labels: CardGridLabels\n emptyIcon?: React.ReactNode\n /** Tailwind grid column classes; sensible default if omitted. */\n gridClassName?: string\n}\n\nexport function CardGrid<T>({\n items,\n getKey,\n renderCard,\n searchText,\n filters = [],\n labels,\n emptyIcon,\n gridClassName = 'grid gap-4 sm:grid-cols-2 lg:grid-cols-3',\n}: CardGridProps<T>) {\n const [query, setQuery] = useState('')\n const [selected, setSelected] = useState<Record<string, string>>({})\n\n const handleFilter = (key: string, value: string) =>\n setSelected((s) => ({ ...s, [key]: value }))\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase()\n return items.filter((item) => {\n if (q && !searchText(item).toLowerCase().includes(q)) return false\n for (const f of filters) {\n const sel = selected[f.key]\n if (sel && f.value(item) !== sel) return false\n }\n return true\n })\n }, [items, query, selected, filters, searchText])\n\n return (\n <div className=\"space-y-4\">\n {/* Toolbar: search + faceted filters */}\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"relative w-full sm:max-w-xs\">\n <Search className=\"pointer-events-none absolute inset-block-0 my-auto ms-2.5 size-4 text-muted-foreground\" />\n <Input\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={labels.searchPlaceholder}\n className=\"ps-8\"\n aria-label={labels.searchPlaceholder}\n />\n </div>\n {filters.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-2\">\n {filters.map((f) => (\n <NativeSelect\n key={f.key}\n value={selected[f.key] ?? ''}\n onChange={(e) => handleFilter(f.key, e.target.value)}\n aria-label={f.label}\n className=\"h-9 w-auto min-w-[8rem]\"\n >\n <option value=\"\">\n {f.label}: {labels.all}\n </option>\n {f.options.map((o) => (\n <option key={o.value} value={o.value}>\n {o.label}\n </option>\n ))}\n </NativeSelect>\n ))}\n </div>\n )}\n </div>\n\n {filtered.length === 0 ? (\n <EmptyState\n title={labels.emptyTitle}\n description={labels.emptyDescription}\n icon={emptyIcon ?? <Inbox />}\n />\n ) : (\n <>\n <div className={gridClassName}>\n {filtered.map((item, i) => (\n <div key={getKey(item, i)}>{renderCard(item)}</div>\n ))}\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {labels.countLabel(filtered.length, items.length)}\n </p>\n </>\n )}\n </div>\n )\n}\nCardGrid.displayName = 'CardGrid'\n","'use client'\n\n/**\n * MiniBarChart — a dependency-free SVG/flex bar chart.\n *\n * Recharts (via ChartContainer) is overkill for a small sparkline-style chart,\n * so this renders a clean, responsive, semantic-token-styled bar chart from\n * plain data, RTL-safe (flips with `dir`), with an accessible title.\n * Promoted into @prism/ui from motor-web (product-agnostic).\n */\n\nexport type BarPoint = { label: string; value: number; sublabel?: string }\n\nexport const MiniBarChart = ({\n data,\n height = 140,\n valueFormatter = (n) => n.toLocaleString(),\n}: {\n data: BarPoint[]\n height?: number\n valueFormatter?: (n: number) => string\n}) => {\n if (data.length === 0) {\n return (\n <div\n className=\"flex items-center justify-center rounded-md border border-dashed text-xs text-muted-foreground\"\n style={{ height }}\n >\n —\n </div>\n )\n }\n\n const max = Math.max(...data.map((d) => d.value), 1)\n const barH = (v: number) => Math.max(2, Math.round((v / max) * (height - 28)))\n\n return (\n <div className=\"flex items-end gap-1.5\" style={{ height }} role=\"img\">\n {data.map((d, i) => (\n <div key={`${d.label}-${i}`} className=\"flex flex-1 flex-col items-center justify-end gap-1\">\n <span className=\"text-[10px] font-medium text-muted-foreground\">\n {d.value > 0 ? valueFormatter(d.value) : ''}\n </span>\n <div\n className=\"w-full rounded-t bg-primary/80 transition-all duration-fast ease-standard hover:bg-primary\"\n style={{ height: barH(d.value) }}\n title={`${d.sublabel ?? d.label}: ${valueFormatter(d.value)}`}\n />\n <span className=\"max-w-full truncate text-[9px] text-muted-foreground\">{d.label}</span>\n </div>\n ))}\n </div>\n )\n}\nMiniBarChart.displayName = 'MiniBarChart'\n","'use client'\n\n// AuthFlow — convenience wrapper that orchestrates the full auth flow:\n// login → OTP → 2FA → forgot → reset\n// in a single component, managing step state and rendering the correct form.\n//\n// Fort's web can use either:\n// A) <AuthFlow authClient={...} onSuccess={...} /> (full flow, one component)\n// B) Individual forms — LoginForm, ForgotForm, ResetForm, TwoFAForm — for\n// page-per-step architectures (Next.js pages router, etc.).\n//\n// AuthFlow is best for embedded auth panels (modals, sidebars) where you don't\n// want to navigate between pages.\n\nimport { useState, useEffect } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport type { AuthClient, AuthCardBrand } from './index'\nimport AuthCard, { type AuthLayout } from './AuthCard'\nimport LoginForm from './LoginForm'\nimport ForgotForm from './ForgotForm'\nimport ResetForm from './ResetForm'\nimport TwoFAForm from './TwoFAForm'\n\ntype FlowStep =\n | { name: 'login' }\n | { name: 'twofa'; challengeToken?: string }\n | { name: 'forgot' }\n | { name: 'reset'; token: string }\n\ninterface AuthFlowProps {\n /** Transport seam — Fort's web passes its concrete implementation. */\n authClient: AuthClient\n /**\n * Reset token from URL query param.\n * When provided, flow starts at the 'reset' step directly.\n */\n resetToken?: string\n /** Called after the user is fully authenticated. */\n onSuccess?: () => void\n /**\n * Display language. Default: 'en'.\n * Toggling is handled internally unless you pass `onLanguageToggle`.\n */\n language?: 'en' | 'ar'\n /**\n * Override the language toggle handler.\n * If omitted, AuthFlow toggles internally between 'en' and 'ar'.\n * If `null`, the toggle button is hidden.\n */\n onLanguageToggle?: (() => void) | null\n /** Brand customisation forwarded to AuthCard. */\n brand?: AuthCardBrand\n /**\n * AuthCard layout variant forwarded to AuthCard.\n * 'split' | 'split-reverse' | 'centered' | 'minimal'. Default: 'split'.\n * Lets Fort pick a brand-panel layout (or a panel-less centered card).\n */\n layout?: AuthLayout\n /** If true, wraps the flow in an AuthCard (brand panel + card). Default: true. */\n withCard?: boolean\n /**\n * Whether to show the \"Remember me\" checkbox on the login step.\n *\n * Forwarded directly to `LoginForm`. Set to `false` when the server's\n * `session.remember_me_enabled` setting is disabled so the checkbox is\n * hidden and `login` is always called with `rememberMe = false`.\n *\n * Default: `true`.\n */\n showRememberMe?: boolean\n /**\n * @deprecated — Email-first is now the default and only flow.\n * This prop is accepted but ignored; kept for back-compat so existing\n * callers that pass `emailFirst={true}` continue to compile.\n */\n emailFirst?: boolean\n}\n\nconst AuthFlow = ({\n authClient,\n resetToken,\n onSuccess,\n language: languageProp = 'en',\n onLanguageToggle,\n brand,\n layout = 'split',\n withCard = true,\n showRememberMe = true,\n // emailFirst is accepted but ignored — email-first is now always on\n emailFirst: _emailFirst = false,\n}: AuthFlowProps) => {\n // Language is rendered from internal state so the built-in toggle actually\n // switches the UI (uncontrolled mode). When the caller drives language via the\n // `language` prop (controlled mode, e.g. Fort's FortProvider), the effect below\n // syncs the prop into internal state. Previously `effectiveLanguage` read the\n // prop directly (default 'en'), so the internal toggle was a no-op — the\n // language switch did nothing. This restores it for both modes.\n const [internalLanguage, setInternalLanguage] = useState<'en' | 'ar'>(languageProp)\n useEffect(() => {\n setInternalLanguage(languageProp)\n }, [languageProp])\n const effectiveLanguage = internalLanguage\n\n const [step, setStep] = useState<FlowStep>(\n resetToken ? { name: 'reset', token: resetToken } : { name: 'login' }\n )\n\n // Terminal \"signing you in\" state. After the auth API succeeds, the caller's\n // onSuccess typically triggers a router navigation whose destination can take\n // a long time to compile/load (20-50s in dev). Without this state the form\n // snaps back to idle and the screen \"looks stuck\" until the new page paints.\n // Once set, this is never reset — the navigation unmounts the component, so\n // the spinner persists exactly until the page actually unloads.\n const [isRedirecting, setIsRedirecting] = useState(false)\n\n const handleAuthSuccess = () => {\n setIsRedirecting(true)\n onSuccess?.()\n }\n\n const handleToggleLanguage = () => {\n setInternalLanguage(prev => (prev === 'en' ? 'ar' : 'en'))\n }\n\n const languageToggleCallback =\n onLanguageToggle === null\n ? undefined\n : onLanguageToggle ?? handleToggleLanguage\n\n const content = (() => {\n // Full-form post-login state — replaces the form (button included) so\n // nothing on screen looks idle while the destination page loads (Rule 8:\n // bilingual). aria-live announces the transition to screen readers.\n if (isRedirecting) {\n return (\n <div\n className=\"flex min-h-[280px] flex-col items-center justify-center gap-4 text-center\"\n role=\"status\"\n aria-live=\"polite\"\n >\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" aria-hidden=\"true\" />\n <div className=\"flex flex-col gap-1\">\n <p className=\"text-base font-semibold text-foreground\">\n {effectiveLanguage === 'ar' ? 'جارٍ تسجيل الدخول...' : 'Signing you in...'}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {effectiveLanguage === 'ar'\n ? 'لحظات من فضلك — يتم تجهيز لوحتك.'\n : 'One moment — preparing your dashboard.'}\n </p>\n </div>\n </div>\n )\n }\n\n if (step.name === 'reset' && step.token) {\n return (\n <ResetForm\n token={step.token}\n authClient={authClient}\n language={effectiveLanguage}\n onSuccess={() => setStep({ name: 'login' })}\n onRequestNewLink={() => setStep({ name: 'forgot' })}\n />\n )\n }\n\n if (step.name === 'forgot') {\n return (\n <ForgotForm\n authClient={authClient}\n language={effectiveLanguage}\n onBack={() => setStep({ name: 'login' })}\n />\n )\n }\n\n if (step.name === 'twofa') {\n return (\n <TwoFAForm\n authClient={authClient}\n challengeToken={step.challengeToken}\n language={effectiveLanguage}\n onSuccess={handleAuthSuccess}\n onTooManyAttempts={() => setStep({ name: 'login' })}\n />\n )\n }\n\n // default: 'login'\n return (\n <LoginForm\n authClient={authClient}\n language={effectiveLanguage}\n onSuccess={handleAuthSuccess}\n on2FA={(challengeToken) => setStep({ name: 'twofa', challengeToken })}\n onForgotPassword={() => setStep({ name: 'forgot' })}\n showRememberMe={showRememberMe}\n />\n )\n })()\n\n if (!withCard) return <>{content}</>\n\n return (\n <AuthCard\n language={effectiveLanguage}\n layout={layout}\n onLanguageToggle={languageToggleCallback}\n brand={brand}\n >\n {content}\n </AuthCard>\n )\n}\nAuthFlow.displayName = 'AuthFlow'\n\nexport default AuthFlow","'use client'\n\n// AuthCard — the auth-screen layout shell used by Fort + every product login.\n//\n// Renders a brand panel + a form card in one of four layouts (split,\n// split-reverse, centered, minimal). All branding (name, tagline, bullets,\n// logo, footer) is prop-driven so Fort can swap its own brand with zero forking.\n//\n// Product-agnostic (Rule 25): no context, no fetching — `language`/`dir` and\n// brand copy are injected by the caller. Full RTL (Rule 8/16): the panel order\n// flips with `dir`, and all spacing uses logical properties.\n\nimport * as React from 'react'\nimport { ShieldCheck } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { Card, CardContent } from '../ui/card'\nimport { cn } from '../../lib/utils'\n\nexport type AuthLayout = 'split' | 'split-reverse' | 'centered' | 'minimal'\n\nexport interface AuthCardBrand {\n /**\n * Optional logo image URL — the preferred brand mark. When provided it\n * replaces the default icon crest.\n */\n logoUrl?: string\n /**\n * Optional icon element (e.g. a lucide icon) shown in the crest when no\n * `logoUrl` is given. Defaults to a ShieldCheck mark. Pass `null` to fall\n * back to the text `initial`.\n */\n icon?: React.ReactNode | null\n /** Text initial — only used when `icon` is explicitly `null` and no logoUrl. */\n initial?: string\n /**\n * Product name shown in the panel and mobile header. Default: 'Sentra Insight Hub'.\n * Pass a `{ en, ar }` pair to localize the title per language (operator\n * 2026-06-05: the AR title wasn't switching). A bare string is used as-is.\n */\n name?: string | { en: string; ar: string }\n /** Tagline shown under the name. Provide both locales. */\n tagline?: { en: string; ar: string }\n /** Feature bullets shown in the brand panel. Provide both locales for each. */\n bullets?: Array<{ en: string; ar: string }>\n /** Footer note in the brand panel. Default: lock icon + 'Secure & Encrypted'. */\n secureNote?: { en: string; ar: string }\n}\n\ntype ResolvedBrand = Required<Omit<AuthCardBrand, 'logoUrl' | 'icon'>> & {\n logoUrl?: string\n icon?: React.ReactNode | null\n}\n\ninterface AuthCardProps {\n children: React.ReactNode\n /** Current display language. Default: 'en'. */\n language?: 'en' | 'ar'\n /**\n * Layout variant. Default: 'split'.\n * - split brand panel on the leading side (start), form trailing.\n * - split-reverse brand panel on the trailing side (end), form leading.\n * - centered no brand panel; a single centered card with a compact\n * brand header above it. Good for minimal Fort tenants.\n * - minimal like centered but without the card chrome (bare form,\n * only the brand crest + name). Smallest footprint.\n */\n layout?: AuthLayout\n /**\n * Called when the user clicks the language toggle button.\n * If omitted the toggle is hidden.\n */\n onLanguageToggle?: () => void\n /** Brand customisation. Defaults to Sentra copy if omitted. */\n brand?: AuthCardBrand\n /** Optional extra class on the outer wrapper. */\n className?: string\n}\n\nconst DEFAULT_BRAND: ResolvedBrand = {\n initial: 'S',\n logoUrl: undefined,\n // Default brand mark is an icon (not the \"S\" initial). Products override with\n // `logoUrl` (image) or a custom `icon`.\n icon: <ShieldCheck className=\"h-1/2 w-1/2\" strokeWidth={1.75} />,\n name: 'Sentra Insight Hub',\n tagline: {\n en: 'National Intelligence Analysis Platform',\n ar: 'منصة التحليل الاستخباراتي الوطني',\n },\n // No feature bullets by default — keeps the brand panel clean (mofa.id look).\n // Products that want them pass `bullets` explicitly.\n bullets: [],\n secureNote: { en: 'Secure & Encrypted', ar: 'مؤمّن ومشفّر' },\n}\n\n// brandName — resolve the (possibly bilingual) brand name for the active language.\nconst brandName = (brand: ResolvedBrand, ar: boolean): string => {\n const n = brand.name\n if (typeof n === 'string') return n\n return (ar ? n.ar || n.en : n.en || n.ar) ?? ''\n}\n\n// ── Brand crest (logo image or initial) ────────────────────────────────────────\n\nconst BrandCrest = ({\n brand,\n size,\n onPanel,\n}: {\n brand: ResolvedBrand\n size: 'lg' | 'md'\n onPanel: boolean\n}) => {\n const box = size === 'lg' ? 'h-20 w-20' : 'h-12 w-12'\n const text = size === 'lg' ? 'text-3xl' : 'text-xl'\n\n // Track logo-image load failure. A non-empty-but-broken logo_url (404, bad\n // host, deleted asset) would otherwise render as a BROKEN IMAGE instead of\n // falling through to the icon. On error we flip this flag and fall back to the\n // icon crest below — so \"no usable logo\" always lands on the platform icon.\n // (operator 2026-06-05: \"still see the [broken] image even if it doesn't exist\n // — that must show up the icon\".)\n const [logoFailed, setLogoFailed] = React.useState(false)\n\n // Reset the failure flag when the URL changes (a new logo deserves a retry).\n React.useEffect(() => {\n setLogoFailed(false)\n }, [brand.logoUrl])\n\n // Is there a REAL logo to show? Treat empty/whitespace AND the Sentra default\n // placeholder as \"no logo\" so the platform ICON wins (operator 2026-06-05: an\n // empty DB logo must NOT render /sentra-logo-full.png — show the icon).\n const rawLogo = (brand.logoUrl ?? '').trim()\n const hasRealLogo =\n rawLogo !== '' && !rawLogo.endsWith('/sentra-logo-full.png')\n\n // Preferred: logo image — only when there's a real logo and it hasn't failed.\n if (hasRealLogo && !logoFailed) {\n return (\n <div className={cn('flex items-center justify-center', box)}>\n <img\n src={brand.logoUrl}\n alt={typeof brand.name === 'string' ? brand.name : brand.name.en}\n className=\"h-full w-full rounded-2xl object-contain\"\n onError={() => setLogoFailed(true)}\n />\n </div>\n )\n }\n\n const crestChrome = cn(\n 'flex items-center justify-center rounded-2xl',\n box,\n onPanel ? 'border-2 border-primary-foreground/30 bg-primary-foreground/10' : 'bg-primary/10',\n onPanel ? 'text-primary-foreground' : 'text-primary',\n )\n\n // Fallback when there is no usable logo (none set, OR set-but-broken/404):\n // ALWAYS render the ICON. The brand carries the platform's DB icon (resolved\n // from platform_branding.icon by the caller); when a caller does not provide\n // one, brand.icon defaults to ShieldCheck. The icon is NEVER skipped in favour\n // of a text initial — a broken/missing logo must show the icon, not an \"S\".\n // (operator 2026-06-05: \"you have an icon in the database, use it if the image\n // doesn't exist\".)\n if (brand.icon !== null && brand.icon !== undefined) {\n return (\n <div className={crestChrome} aria-hidden=\"true\">\n {brand.icon}\n </div>\n )\n }\n\n // Last resort ONLY when a caller EXPLICITLY opts out of any icon by passing\n // `icon: null` AND there is no logo. Default callers never reach here because\n // brand.icon defaults to ShieldCheck.\n return (\n <div className={crestChrome}>\n <span className={cn('font-bold tracking-tight', text)}>{brand.initial}</span>\n </div>\n )\n}\nBrandCrest.displayName = 'BrandCrest'\n\n// ── Brand panel (the \"sidebar\") ─────────────────────────────────────────────────\n\nconst BrandPanel = ({ brand, ar }: { brand: ResolvedBrand; ar: boolean }) => (\n <div className=\"relative hidden lg:flex lg:w-1/2 flex-col items-center justify-center overflow-hidden px-12 py-16 bg-primary\">\n {/* Subtle dot-grid texture — keeps the flat solid panel from feeling empty */}\n <div\n className=\"absolute inset-0 opacity-[0.08]\"\n style={{\n backgroundImage:\n 'radial-gradient(circle, hsl(var(--primary-foreground)) 1px, transparent 1px)',\n backgroundSize: '24px 24px',\n }}\n aria-hidden=\"true\"\n />\n\n <div className=\"relative z-10 flex w-full max-w-sm flex-col items-center gap-7 text-center text-primary-foreground\">\n <BrandCrest brand={brand} size=\"lg\" onPanel />\n <div className=\"flex flex-col gap-2.5\">\n <h1 className=\"text-[2rem] font-bold leading-tight tracking-tight\">{brandName(brand, ar)}</h1>\n <p className=\"text-sm leading-relaxed text-primary-foreground/75\">\n {ar ? brand.tagline.ar : brand.tagline.en}\n </p>\n </div>\n\n {/* Feature bullets — only rendered when the product supplies them.\n Default brand omits them for the clean mofa.id look. */}\n {brand.bullets.length > 0 && (\n <ul className=\"mt-1 flex w-full flex-col items-center gap-3.5 text-center text-sm text-primary-foreground/85\">\n {brand.bullets.map((bullet, i) => (\n <li key={i} className=\"flex items-center justify-center gap-2.5\">\n <span\n className=\"flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-primary-foreground/15\"\n aria-hidden=\"true\"\n >\n <svg className=\"h-2.5 w-2.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3\">\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n </span>\n <span className=\"leading-snug\">{ar ? bullet.ar : bullet.en}</span>\n </li>\n ))}\n </ul>\n )}\n\n <div className=\"mt-3 flex items-center gap-2 text-xs text-primary-foreground/55\">\n <svg className=\"h-3.5 w-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n {ar ? brand.secureNote.ar : brand.secureNote.en}\n </div>\n </div>\n </div>\n)\nBrandPanel.displayName = 'BrandPanel'\n\n// ── Component ───────────────────────────────────────────────────────────────────\n\nconst AuthCard = ({\n children,\n language = 'en',\n layout = 'split',\n onLanguageToggle,\n brand: brandProp,\n className,\n}: AuthCardProps) => {\n const ar = language === 'ar'\n const dir = ar ? 'rtl' : 'ltr'\n\n const brand: ResolvedBrand = {\n ...DEFAULT_BRAND,\n ...brandProp,\n // Preserve the default icon unless the caller explicitly set `icon` (incl. null).\n icon: brandProp && 'icon' in brandProp ? brandProp.icon : DEFAULT_BRAND.icon,\n tagline: { ...DEFAULT_BRAND.tagline, ...brandProp?.tagline },\n bullets: brandProp?.bullets ?? DEFAULT_BRAND.bullets,\n secureNote: { ...DEFAULT_BRAND.secureNote, ...brandProp?.secureNote },\n }\n\n const langToggle = onLanguageToggle && (\n <div className=\"absolute end-4 top-4 z-20\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onLanguageToggle}\n className=\"text-xs font-medium\"\n aria-label={ar ? 'Switch to English' : 'التبديل إلى العربية'}\n >\n {ar ? 'EN' : 'ع'}\n </Button>\n </div>\n )\n\n // ── Centered / minimal: single column, compact brand header, no side panel ──\n if (layout === 'centered' || layout === 'minimal') {\n const bare = layout === 'minimal'\n return (\n <div\n dir={dir}\n className={cn(\n 'relative flex min-h-screen w-full flex-col items-center justify-center bg-background px-4 py-12',\n className,\n )}\n >\n {langToggle}\n <div className=\"mb-8 flex flex-col items-center gap-3\">\n <BrandCrest brand={brand} size=\"md\" onPanel={false} />\n <div className=\"flex flex-col items-center gap-1 text-center\">\n <span className=\"text-base font-semibold text-foreground\">{brandName(brand, ar)}</span>\n <span className=\"text-xs text-muted-foreground\">\n {ar ? brand.tagline.ar : brand.tagline.en}\n </span>\n </div>\n </div>\n {bare ? (\n <div className=\"w-full max-w-sm\">{children}</div>\n ) : (\n <Card className=\"w-full max-w-sm shadow-lg\">\n <CardContent className=\"pt-6\">{children}</CardContent>\n </Card>\n )}\n </div>\n )\n }\n\n // ── Split / split-reverse: brand panel + form card ──────────────────────────\n // `split` puts the brand on the leading (start) side, `split-reverse` on the\n // trailing (end) side. flex-row-reverse swaps the visual order; with dir=rtl\n // the row already mirrors, so reverse composes correctly either way.\n const reverse = layout === 'split-reverse'\n\n return (\n <div\n dir={dir}\n className={cn(\n 'relative flex min-h-screen w-full',\n reverse ? 'flex-row-reverse' : 'flex-row',\n className,\n )}\n >\n {langToggle}\n\n <BrandPanel brand={brand} ar={ar} />\n\n {/* Form side — bare on the background (no card chrome) for the clean,\n flat mofa.id look. Full width on mobile, half-width lg+. */}\n <div className=\"flex flex-1 flex-col items-center justify-center bg-background px-6 py-12 lg:w-1/2\">\n {/* Mobile brand header — shown below lg */}\n <div className=\"mb-8 flex flex-col items-center gap-2 lg:hidden\">\n <BrandCrest brand={brand} size=\"md\" onPanel={false} />\n <span className=\"text-sm font-semibold text-foreground\">{brandName(brand, ar)}</span>\n </div>\n\n <div className=\"w-full max-w-sm\">{children}</div>\n </div>\n </div>\n )\n}\nAuthCard.displayName = 'AuthCard'\n\nexport default AuthCard\n","'use client'\n\n// LoginForm — email-first / progressive flow.\n//\n// Step A 'email': Email field + Continue button.\n// Step B 'credentials': Methods resolved via getLoginMethods(email).\n// Renders exactly the options the platform allows:\n// email_password → PasswordInput + Sign-in + Remember me\n// magic_link → \"Send magic link\" button\n// otp → \"Email me a code\" button\n// google_oauth → Google button\n// github → GitHub button\n// azure → Microsoft button\n// + \"Use a different email\" back link.\n// Step C 'otp': OTPBoxGroup verification (reused for both post-password OTP\n// and passwordless email-code path).\n//\n// Fail-open: if getLoginMethods is undefined or throws, methods defaults to\n// DEFAULT_LOGIN_METHODS — which includes magic-link and email-OTP alongside\n// password, so those flows stay visible on the auth page even when the server\n// can't resolve per-email methods. The server still rejects any method a given\n// user isn't actually allowed to use.\n\nimport { useState, useEffect, useRef, useCallback } from 'react'\nimport { Mail, ArrowLeft, Loader2, Github, Terminal } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { Checkbox } from '../ui/checkbox'\nimport { Input } from '../ui/input'\nimport { Label } from '../ui/label'\nimport { Separator } from '../ui/separator'\nimport type { AuthClient } from './AuthClient'\nimport AuthErrorAlert from './AuthErrorAlert'\nimport AuthStepHeader from './AuthStepHeader'\nimport PasswordInput from './PasswordInput'\nimport OTPBoxGroup from './OTPBoxGroup'\n\ntype Step = 'email' | 'credentials' | 'otp'\n\n// Where did the OTP step originate?\n// 'post-password' → server returned otp challenge after password login\n// 'passwordless' → user clicked \"Email me a code\" or \"Send magic link\"\n// Both back-links return to 'credentials' (email already resolved).\ntype OtpSource = 'post-password' | 'passwordless'\n\n// Fail-open default — keeps password + magic-link + email-OTP visible when the\n// server can't resolve per-email methods. The server enforces what's actually\n// allowed for each user; this only governs which buttons the UI offers.\nconst DEFAULT_LOGIN_METHODS = ['email_password', 'magic_link', 'otp']\n\ninterface LoginFormProps {\n authClient: AuthClient\n onSuccess?: () => void\n on2FA?: (challengeToken?: string) => void\n onOAuthRedirect?: (url: string) => void\n onForgotPassword?: () => void\n language?: 'en' | 'ar'\n showRememberMe?: boolean\n}\n\n// ─── OAuth provider icons ──────────────────────────────────────────────────────\n\nconst GoogleIcon = () => (\n <svg className=\"h-4 w-4\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" fill=\"#4285F4\" />\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\" />\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\" />\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\" />\n </svg>\n)\nGoogleIcon.displayName = 'GoogleIcon'\n\nconst MicrosoftIcon = () => (\n <svg className=\"h-4 w-4\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M11.4 2H2v9.4h9.4V2z\" fill=\"#F25022\" />\n <path d=\"M22 2h-9.4v9.4H22V2z\" fill=\"#7FBA00\" />\n <path d=\"M11.4 12.6H2V22h9.4v-9.4z\" fill=\"#00A4EF\" />\n <path d=\"M22 12.6h-9.4V22H22v-9.4z\" fill=\"#FFB900\" />\n </svg>\n)\nMicrosoftIcon.displayName = 'MicrosoftIcon'\n\n// ─── Component ─────────────────────────────────────────────────────────────────\n\nconst LoginForm = ({\n authClient,\n onSuccess,\n on2FA,\n onOAuthRedirect,\n onForgotPassword,\n language = 'en',\n showRememberMe = true,\n}: LoginFormProps) => {\n const ar = language === 'ar'\n\n const [step, setStep] = useState<Step>('email')\n const [otpSource, setOtpSource] = useState<OtpSource>('post-password')\n\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const [otpValue, setOtpValue] = useState('')\n const [challengeToken, setChallengeToken] = useState<string | undefined>()\n\n // Fail-open default: 'email_password' always works.\n const [resolvedMethods, setResolvedMethods] = useState<string[]>(DEFAULT_LOGIN_METHODS)\n const [isResolvingMethods, setIsResolvingMethods] = useState(false)\n\n const [emailError, setEmailError] = useState('')\n const [error, setError] = useState('')\n const [hideSocialButtons, setHideSocialButtons] = useState(false)\n\n const [countdown, setCountdown] = useState(0)\n const countdownRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n const [rememberMe, setRememberMe] = useState(false)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [isSendingOtp, setIsSendingOtp] = useState(false)\n const [isVerifying, setIsVerifying] = useState(false)\n const [isDevLoggingIn, setIsDevLoggingIn] = useState(false)\n\n const liveRef = useRef<HTMLParagraphElement | null>(null)\n\n const startCountdown = useCallback((seconds = 30) => {\n setCountdown(seconds)\n if (countdownRef.current) clearInterval(countdownRef.current)\n countdownRef.current = setInterval(() => {\n setCountdown(prev => {\n if (prev <= 1) {\n if (countdownRef.current) clearInterval(countdownRef.current)\n return 0\n }\n return prev - 1\n })\n }, 1000)\n }, [])\n\n useEffect(() => () => {\n if (countdownRef.current) clearInterval(countdownRef.current)\n }, [])\n\n // sendLoginOtp with sendOtp fallback (back-compat)\n const dispatchLoginOtp = useCallback(async (emailAddr: string): Promise<void> => {\n if (authClient.sendLoginOtp) {\n return authClient.sendLoginOtp(emailAddr)\n }\n return authClient.sendOtp(emailAddr)\n }, [authClient])\n\n // ── Step A: Continue ──────────────────────────────────────────────────────────\n const handleEmailContinue = async (e: React.FormEvent) => {\n e.preventDefault()\n setError('')\n setEmailError('')\n\n const trimmed = email.trim()\n if (!trimmed || !trimmed.includes('@')) {\n setEmailError(ar ? 'يرجى إدخال بريد إلكتروني صحيح.' : 'Please enter a valid email address.')\n return\n }\n\n setIsResolvingMethods(true)\n try {\n if (authClient.getLoginMethods) {\n const resp = await authClient.getLoginMethods(trimmed)\n const methods = resp?.methods\n if (Array.isArray(methods) && methods.length > 0) {\n setResolvedMethods(methods)\n setHideSocialButtons(false)\n } else {\n setResolvedMethods([])\n setHideSocialButtons(true)\n }\n } else {\n setResolvedMethods(DEFAULT_LOGIN_METHODS)\n }\n } catch {\n // Fail-open on error\n setResolvedMethods(DEFAULT_LOGIN_METHODS)\n } finally {\n setIsResolvingMethods(false)\n }\n\n setStep('credentials')\n }\n\n // ── Step B: Password submit ───────────────────────────────────────────────────\n const handleCredentialsSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n setError('')\n setIsSubmitting(true)\n try {\n const result = await authClient.login(email.trim(), password, showRememberMe ? rememberMe : false)\n if (result.challenge === 'otp') {\n setChallengeToken(result.challenge_token)\n setOtpSource('post-password')\n setStep('otp')\n startCountdown(30)\n setOtpValue('')\n } else if (result.challenge === '2fa') {\n on2FA?.(result.challenge_token)\n } else {\n onSuccess?.()\n }\n } catch (err: unknown) {\n const message = (err as { status?: number; message?: string })?.message || ''\n const status = (err as { status?: number })?.status\n if (status === 403) {\n setHideSocialButtons(true)\n setError(ar ? 'طريقة تسجيل الدخول هذه غير مفعّلة لحسابك.' : 'This login method is not enabled for your account.')\n } else if (message.includes('locked') || status === 423) {\n const minutes = message.match(/(\\d+)/)?.[1] || '?'\n setError(ar ? `الحساب مقفل. حاول مجدداً بعد ${minutes} دقيقة.` : `Account locked. Try again in ${minutes} minutes.`)\n } else if (status === 0 || message.toLowerCase().includes('network') || message.toLowerCase().includes('fetch')) {\n setError(ar ? 'خطأ في الاتصال. يرجى المحاولة مرة أخرى.' : 'Connection error. Please try again.')\n } else {\n setError(ar ? 'البريد الإلكتروني أو كلمة المرور غير صحيحة.' : 'Email or password incorrect.')\n }\n } finally {\n setIsSubmitting(false)\n }\n }\n\n // ── Step B → C: passwordless paths ───────────────────────────────────────────\n const handleSendEmailCode = async () => {\n setError('')\n setIsSendingOtp(true)\n try {\n await dispatchLoginOtp(email.trim())\n setChallengeToken(undefined)\n setOtpSource('passwordless')\n setStep('otp')\n startCountdown(30)\n setOtpValue('')\n } catch {\n setError(ar ? 'خطأ في الاتصال. يرجى المحاولة مرة أخرى.' : 'Connection error. Please try again.')\n } finally {\n setIsSendingOtp(false)\n }\n }\n\n const handleSendMagicLink = async () => {\n setError('')\n setIsSendingOtp(true)\n try {\n await dispatchLoginOtp(email.trim())\n setChallengeToken(undefined)\n setOtpSource('passwordless')\n setStep('otp')\n startCountdown(30)\n setOtpValue('')\n } catch {\n setError(ar ? 'خطأ في الاتصال. يرجى المحاولة مرة أخرى.' : 'Connection error. Please try again.')\n } finally {\n setIsSendingOtp(false)\n }\n }\n\n // ── OTP step ──────────────────────────────────────────────────────────────────\n const handleOtpComplete = useCallback(async (value: string) => {\n if (liveRef.current) {\n liveRef.current.textContent = ar ? 'جارٍ إرسال الرمز...' : 'Submitting code...'\n }\n await handleOtpSubmit(value)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [challengeToken, ar])\n\n const handleOtpSubmit = async (codeOverride?: string) => {\n const code = codeOverride ?? otpValue\n if (code.length < 6) return\n setError('')\n setIsVerifying(true)\n try {\n const result = await authClient.verifyOtp(email.trim(), code, challengeToken)\n if (result.challenge === '2fa') {\n on2FA?.(result.challenge_token)\n } else {\n onSuccess?.()\n }\n } catch (err: unknown) {\n const message = (err as { message?: string })?.message || ''\n setOtpValue('')\n if (message.includes('expired')) {\n setError(ar ? 'انتهت صلاحية الرمز. اطلب رمزاً جديداً.' : 'Code has expired. Request a new one.')\n } else if (message.includes('too_many') || message.includes('attempts')) {\n setError(ar ? 'محاولات كثيرة جداً. يرجى تسجيل الدخول من جديد.' : 'Too many attempts. Please sign in again.')\n setTimeout(() => { setStep('email'); setOtpValue('') }, 2500)\n } else {\n setError(ar ? 'الرمز غير صحيح. يرجى المحاولة مرة أخرى.' : 'Incorrect code. Please try again.')\n }\n } finally {\n setIsVerifying(false)\n }\n }\n\n const handleResendOtp = async () => {\n if (countdown > 0) return\n setError('')\n setIsSendingOtp(true)\n try {\n await authClient.sendOtp(email.trim())\n startCountdown(30)\n setOtpValue('')\n } catch {\n setError(ar ? 'خطأ في الاتصال. يرجى المحاولة مرة أخرى.' : 'Connection error. Please try again.')\n } finally {\n setIsSendingOtp(false)\n }\n }\n\n // ── Dev login (one-click, dev env only) ──────────────────────────────────────\n // Renders only when authClient.devLogin is defined. The concrete implementation\n // omits it entirely in non-dev environments — this is the UI gate.\n const handleDevLogin = async () => {\n if (!authClient.devLogin) return\n setError('')\n setIsDevLoggingIn(true)\n try {\n await authClient.devLogin()\n onSuccess?.()\n } catch {\n setError(ar ? 'خطأ في تسجيل الدخول كمطوّر. يرجى المحاولة مرة أخرى.' : 'Dev login failed. Please try again.')\n } finally {\n setIsDevLoggingIn(false)\n }\n }\n\n // ── OAuth helper ──────────────────────────────────────────────────────────────\n const handleOAuth = (provider: string) => {\n if (!authClient.getOAuthUrl) return\n const url = authClient.getOAuthUrl(provider)\n if (!url) return\n if (onOAuthRedirect) {\n onOAuthRedirect(url)\n } else {\n window.location.href = url\n }\n }\n\n // ── Derived flags ─────────────────────────────────────────────────────────────\n const hasEmailPassword = resolvedMethods.includes('email_password')\n const hasMagicLink = resolvedMethods.includes('magic_link')\n const hasEmailOtp = resolvedMethods.includes('otp')\n const hasGoogle = !hideSocialButtons && resolvedMethods.includes('google_oauth') && !!authClient.getOAuthUrl\n const hasGitHub = !hideSocialButtons && resolvedMethods.includes('github') && !!authClient.getOAuthUrl\n const hasAzure = !hideSocialButtons && resolvedMethods.includes('azure') && !!authClient.getOAuthUrl\n const hasSocialButtons = hasGoogle || hasGitHub || hasAzure\n const isBlocked = resolvedMethods.length === 0\n\n const resetToEmail = () => {\n setStep('email')\n setError('')\n setPassword('')\n setOtpValue('')\n setHideSocialButtons(false)\n }\n\n // ══ Step C: OTP ════════════════════════════════════════════════════════════════\n if (step === 'otp') {\n return (\n <div className=\"flex flex-col gap-6\">\n <AuthStepHeader\n icon={<Mail className=\"h-7 w-7\" aria-hidden=\"true\" />}\n title={ar ? 'تحقق من بريدك الإلكتروني' : 'Check your email'}\n subtitle={\n <>\n {ar ? 'أرسلنا رمزاً مكوناً من 6 أرقام إلى ' : 'We sent a 6-digit code to '}\n <span className=\"font-medium text-foreground\" dir=\"ltr\">{email}</span>\n </>\n }\n centered\n />\n\n <p ref={liveRef} aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\" />\n\n <AuthErrorAlert error={error} />\n\n <div className=\"flex flex-col gap-2\">\n <Label className=\"sr-only\">{ar ? 'أدخل الرمز' : 'Enter code'}</Label>\n <OTPBoxGroup\n value={otpValue}\n onChange={setOtpValue}\n onComplete={handleOtpComplete}\n disabled={isVerifying}\n ariaLabel={ar ? 'أدخل الرمز' : 'Enter code'}\n autoFocus\n />\n <p className=\"text-xs text-muted-foreground text-center tabular-nums\" aria-live=\"polite\" aria-atomic=\"true\">\n {ar ? 'ينتهي خلال 5:00' : 'Expires in 5:00'}\n </p>\n </div>\n\n <Button\n type=\"button\"\n className=\"w-full\"\n disabled={otpValue.length < 6 || isVerifying}\n onClick={() => handleOtpSubmit()}\n >\n {isVerifying ? (\n <span className=\"flex items-center gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n {ar ? 'جارٍ التحقق...' : 'Verifying...'}\n </span>\n ) : (\n ar ? 'التحقق من الرمز' : 'Verify code'\n )}\n </Button>\n\n <div className=\"flex flex-col items-center gap-1 text-center\">\n <p className=\"text-xs text-muted-foreground\">{ar ? 'لم تستلمه؟' : \"Didn't receive it?\"}</p>\n <button\n type=\"button\"\n onClick={handleResendOtp}\n disabled={countdown > 0 || isSendingOtp}\n className=\"text-xs font-medium text-primary hover:underline disabled:text-muted-foreground disabled:no-underline disabled:cursor-not-allowed focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\"\n >\n {ar ? 'إعادة إرسال الرمز' : 'Resend code'}\n </button>\n {countdown > 0 && (\n <p className=\"text-xs text-muted-foreground tabular-nums\" aria-live=\"polite\" aria-atomic=\"true\">\n {ar ? `إعادة إرسال بعد ${countdown} ثانية` : `Resend in ${countdown}s`}\n </p>\n )}\n </div>\n\n {/* Back to methods step — otpSource preserved for future extension */}\n <button\n type=\"button\"\n onClick={() => { setStep('credentials'); setError(''); setOtpValue('') }}\n data-otp-source={otpSource}\n className=\"flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard self-center mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5 rtl:rotate-180\" aria-hidden=\"true\" />\n {ar ? 'العودة' : 'Back'}\n </button>\n </div>\n )\n }\n\n // ══ Step B: Credentials / methods ══════════════════════════════════════════════\n if (step === 'credentials') {\n return (\n <div className=\"flex flex-col gap-6\">\n <AuthStepHeader\n title={ar ? 'تسجيل الدخول' : 'Sign in'}\n subtitle={\n <>\n {ar ? 'كـ ' : 'as '}\n <span className=\"font-medium text-foreground\" dir=\"ltr\">{email}</span>\n </>\n }\n />\n\n <AuthErrorAlert error={error} />\n\n {isBlocked && (\n <p className=\"text-sm text-muted-foreground text-center py-2\">\n {ar\n ? 'لا يمكن تسجيل الدخول بهذا الحساب هنا. تواصل مع المسؤول.'\n : \"This account can't sign in here. Contact your administrator.\"}\n </p>\n )}\n\n {!isBlocked && hasEmailPassword && (\n <form noValidate onSubmit={handleCredentialsSubmit} className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-center justify-between\">\n <Label htmlFor=\"login-password\" className=\"text-sm font-medium text-foreground text-start\">\n {ar ? 'كلمة المرور' : 'Password'}\n </Label>\n {onForgotPassword ? (\n <button\n type=\"button\"\n onClick={onForgotPassword}\n className=\"text-xs text-primary hover:underline text-end self-end focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\"\n >\n {ar ? 'نسيت كلمة المرور؟' : 'Forgot password?'}\n </button>\n ) : (\n <a href=\"#\" tabIndex={-1} className=\"text-xs text-primary hover:underline text-end self-end focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\">\n {ar ? 'نسيت كلمة المرور؟' : 'Forgot password?'}\n </a>\n )}\n </div>\n <PasswordInput\n id=\"login-password\"\n language={language}\n autoComplete=\"current-password\"\n placeholder={ar ? 'أدخل كلمة المرور' : 'Enter your password'}\n value={password}\n onChange={e => setPassword((e as React.ChangeEvent<HTMLInputElement>).target.value)}\n disabled={isSubmitting}\n autoFocus\n />\n </div>\n\n {showRememberMe && (\n <div className=\"flex items-center gap-2\">\n <Checkbox\n id=\"login-remember-me\"\n checked={rememberMe}\n onCheckedChange={(checked) => setRememberMe(checked === true)}\n disabled={isSubmitting}\n aria-label={ar ? 'تذكرني' : 'Remember me'}\n />\n <Label htmlFor=\"login-remember-me\" className=\"text-sm text-foreground cursor-pointer select-none ms-1\">\n {ar ? 'تذكرني' : 'Remember me'}\n </Label>\n </div>\n )}\n\n <Button type=\"submit\" className=\"w-full\" disabled={isSubmitting}>\n {isSubmitting ? (\n <span className=\"flex items-center gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n {ar ? 'جارٍ تسجيل الدخول...' : 'Signing in...'}\n </span>\n ) : (\n ar ? 'تسجيل الدخول' : 'Sign in'\n )}\n </Button>\n </form>\n )}\n\n {!isBlocked && hasEmailPassword && (hasMagicLink || hasEmailOtp || hasSocialButtons) && (\n <div className=\"flex items-center gap-3\">\n <Separator className=\"flex-1\" />\n <span className=\"text-xs text-muted-foreground shrink-0\">\n {ar ? 'أو تابع عبر' : 'or continue with'}\n </span>\n <Separator className=\"flex-1\" />\n </div>\n )}\n\n {!isBlocked && !hasEmailPassword && (hasMagicLink || hasEmailOtp || hasSocialButtons) && (\n <p className=\"text-xs text-muted-foreground text-center\">\n {ar ? 'اختر طريقة تسجيل الدخول' : 'Choose a sign-in method'}\n </p>\n )}\n\n {!isBlocked && (hasMagicLink || hasEmailOtp || hasSocialButtons) && (\n <div className=\"flex flex-col gap-2\">\n {hasMagicLink && (\n <Button type=\"button\" variant=\"outline\" className=\"w-full gap-2\" onClick={handleSendMagicLink} disabled={isSendingOtp || isSubmitting}>\n {isSendingOtp ? <Loader2 className=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" /> : <Mail className=\"h-4 w-4\" aria-hidden=\"true\" />}\n {ar ? 'إرسال رابط الدخول' : 'Send magic link'}\n </Button>\n )}\n\n {hasEmailOtp && (\n <Button type=\"button\" variant=\"outline\" className=\"w-full gap-2\" onClick={handleSendEmailCode} disabled={isSendingOtp || isSubmitting}>\n {isSendingOtp ? <Loader2 className=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" /> : <Mail className=\"h-4 w-4\" aria-hidden=\"true\" />}\n {ar ? 'أرسل لي رمزاً عبر البريد' : 'Email me a code'}\n </Button>\n )}\n\n {hasGoogle && (\n <Button type=\"button\" variant=\"outline\" className=\"w-full gap-2\" onClick={() => handleOAuth('google')} disabled={isSubmitting || isSendingOtp}>\n <GoogleIcon />\n {ar ? 'تسجيل الدخول عبر Google' : 'Sign in with Google'}\n </Button>\n )}\n\n {hasGitHub && (\n <Button type=\"button\" variant=\"outline\" className=\"w-full gap-2\" onClick={() => handleOAuth('github')} disabled={isSubmitting || isSendingOtp}>\n <Github className=\"h-4 w-4\" aria-hidden=\"true\" />\n {ar ? 'تسجيل الدخول عبر GitHub' : 'Sign in with GitHub'}\n </Button>\n )}\n\n {hasAzure && (\n <Button type=\"button\" variant=\"outline\" className=\"w-full gap-2\" onClick={() => handleOAuth('azure')} disabled={isSubmitting || isSendingOtp}>\n <MicrosoftIcon />\n {ar ? 'تسجيل الدخول عبر Microsoft' : 'Sign in with Microsoft'}\n </Button>\n )}\n </div>\n )}\n\n <button\n type=\"button\"\n onClick={resetToEmail}\n className=\"flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard self-center mt-2 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5 rtl:rotate-180\" aria-hidden=\"true\" />\n {ar ? 'استخدام بريد إلكتروني مختلف' : 'Use a different email'}\n </button>\n </div>\n )\n }\n\n // ══ Step A: Email ══════════════════════════════════════════════════════════════\n return (\n <div className=\"flex flex-col gap-6\">\n {/* Dev login — one-click, shown only when authClient.devLogin is defined.\n The concrete implementation omits devLogin() in production, so this\n button is invisible to production users. Rule 14: server hard-gates on\n APP_ENV independently. */}\n {!!authClient.devLogin && (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"w-full gap-2 border-dashed text-muted-foreground hover:text-foreground hover:border-solid\"\n onClick={handleDevLogin}\n disabled={isDevLoggingIn}\n aria-label={ar ? 'الدخول كمطوّر' : 'Continue as dev'}\n >\n {isDevLoggingIn ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n ) : (\n <Terminal className=\"h-4 w-4\" aria-hidden=\"true\" />\n )}\n {ar ? 'الدخول كمطوّر' : 'Continue as dev'}\n </Button>\n\n <div className=\"flex items-center gap-3\" aria-hidden=\"true\">\n <Separator className=\"flex-1\" />\n <span className=\"text-xs text-muted-foreground shrink-0\">\n {ar ? 'أو سجّل الدخول بالبريد الإلكتروني' : 'or sign in with email'}\n </span>\n <Separator className=\"flex-1\" />\n </div>\n </>\n )}\n\n <form noValidate onSubmit={handleEmailContinue} className=\"flex flex-col gap-6\">\n <AuthStepHeader\n title={ar ? 'تسجيل الدخول' : 'Sign in'}\n subtitle={ar ? 'أدخل بريدك الإلكتروني للمتابعة' : 'Enter your email to continue'}\n />\n\n <AuthErrorAlert error={error} />\n\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"login-email\" className=\"text-sm font-medium text-foreground text-start\">\n {ar ? 'البريد الإلكتروني' : 'Email address'}\n </Label>\n <Input\n id=\"login-email\"\n type=\"email\"\n /* Email text is LTR (addresses read left-to-right), but in an RTL form\n the field must visually match: right-align the LTR text + placeholder\n so it sits under the right-aligned label, not orphaned on the left. */\n dir=\"ltr\"\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n value={email}\n onChange={e => { setEmail(e.target.value); setEmailError('') }}\n disabled={isResolvingMethods}\n aria-invalid={!!emailError}\n aria-describedby={emailError ? 'login-email-error' : undefined}\n className={`${ar ? 'text-end' : ''} ${emailError ? 'border-destructive ring-destructive/30' : ''}`}\n autoFocus\n />\n {emailError && (\n <p id=\"login-email-error\" role=\"alert\" className=\"text-xs text-destructive mt-1\">\n {emailError}\n </p>\n )}\n </div>\n\n <Button type=\"submit\" className=\"w-full\" disabled={isResolvingMethods}>\n {isResolvingMethods ? (\n <span className=\"flex items-center gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n {ar ? 'جارٍ التحقق...' : 'Checking...'}\n </span>\n ) : (\n ar ? 'متابعة' : 'Continue'\n )}\n </Button>\n\n {/* Provider-level OAuth is available before the email is resolved, so the\n social buttons show on the email step too (magic-link / email-OTP need\n the resolved email, so those stay on the credentials step). */}\n {!hideSocialButtons && !!authClient.getOAuthUrl && (\n <>\n <div className=\"flex items-center gap-3\" aria-hidden=\"true\">\n <Separator className=\"flex-1\" />\n <span className=\"text-xs text-muted-foreground\">\n {ar ? 'أو تابع عبر' : 'or continue with'}\n </span>\n <Separator className=\"flex-1\" />\n </div>\n\n <div className=\"flex flex-col gap-2.5\">\n <Button type=\"button\" variant=\"outline\" className=\"w-full gap-2\" onClick={() => handleOAuth('google')} disabled={isResolvingMethods}>\n <GoogleIcon />\n {ar ? 'تسجيل الدخول عبر Google' : 'Sign in with Google'}\n </Button>\n </div>\n </>\n )}\n\n <p className=\"text-xs text-muted-foreground text-center\">\n {ar ? 'مستخدم جديد؟ تواصل مع المسؤول.' : 'New here? Contact your administrator.'}\n </p>\n </form>\n </div>\n )\n}\nLoginForm.displayName = 'LoginForm'\n\nexport default LoginForm\n","'use client'\n\n// AuthErrorAlert — role=\"alert\" error banner shared across all auth screens.\n// Renders nothing when error is falsy — conditionally mount at call site.\n\ninterface AuthErrorAlertProps {\n error: string | null | undefined\n}\n\nconst AuthErrorAlert = ({ error }: AuthErrorAlertProps) => {\n if (!error) return null\n return (\n <div\n role=\"alert\"\n className=\"rounded-md border border-destructive/50 bg-destructive/10 px-4 py-3 text-sm text-destructive text-start\"\n >\n {error}\n </div>\n )\n}\nAuthErrorAlert.displayName = 'AuthErrorAlert'\n\nexport default AuthErrorAlert\n","'use client'\n\n// AuthStepHeader — icon + title + subtitle used across all auth form steps.\n// Adapts to the `centered` flag for OTP / 2FA screens vs form screens.\n\nimport * as React from 'react'\n\ninterface AuthStepHeaderProps {\n icon?: React.ReactNode\n title: string\n subtitle?: React.ReactNode\n centered?: boolean\n}\n\nconst AuthStepHeader = ({ icon, title, subtitle, centered = false }: AuthStepHeaderProps) => {\n return (\n <div className={`flex flex-col gap-1 ${centered ? 'items-center text-center' : ''}`}>\n {icon && (\n // Icon alignment must follow the text: centered when `centered`, else\n // aligned to the start (matches the start-aligned title) instead of mx-auto.\n <div\n className={`mb-2 flex h-14 w-14 items-center justify-center rounded-full bg-primary/10 text-primary ${\n centered ? 'mx-auto' : 'me-auto'\n }`}\n >\n {icon}\n </div>\n )}\n <h2 className={`text-2xl font-bold text-foreground ${centered ? 'text-center' : 'text-start'}`}>\n {title}\n </h2>\n {subtitle && (\n <p className={`text-sm text-muted-foreground ${centered ? 'text-center' : 'text-start'}`}>\n {subtitle}\n </p>\n )}\n </div>\n )\n}\nAuthStepHeader.displayName = 'AuthStepHeader'\n\nexport default AuthStepHeader\n","'use client'\n\n// PasswordInput — password field with show/hide toggle.\n// Forwarded ref so react-hook-form can register it directly.\n// language prop replaces useLanguage context — callers inject from props.\n\nimport { forwardRef, useState } from 'react'\nimport { Eye, EyeOff } from 'lucide-react'\nimport { Input } from '../ui/input'\nimport { cn } from '../../lib/utils'\n\ninterface PasswordInputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n language?: 'en' | 'ar'\n}\n\nconst PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n ({ className, language = 'en', dir, ...props }, ref) => {\n const [showPassword, setShowPassword] = useState(false)\n\n const ariaLabelShow = language === 'ar' ? 'إظهار كلمة المرور' : 'Show password'\n const ariaLabelHide = language === 'ar' ? 'إخفاء كلمة المرور' : 'Hide password'\n\n const handleToggle = () => setShowPassword(prev => !prev)\n\n return (\n <div className=\"relative\">\n {/* No hardcoded dir — the password field follows the form direction so\n its text + placeholder + the trailing eye button all align in RTL.\n The eye button uses `end-3` + the input `pe-10` (logical), so it sits\n on the correct side in both LTR and RTL. A caller may still force a\n dir via the `dir` prop. */}\n <Input\n ref={ref}\n type={showPassword ? 'text' : 'password'}\n dir={dir}\n className={cn('pe-10', className)}\n {...props}\n />\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-label={showPassword ? ariaLabelHide : ariaLabelShow}\n aria-controls={props.id}\n aria-pressed={showPassword}\n className=\"absolute end-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\"\n tabIndex={0}\n >\n {showPassword ? (\n <EyeOff className=\"h-4 w-4\" aria-hidden=\"true\" />\n ) : (\n <Eye className=\"h-4 w-4\" aria-hidden=\"true\" />\n )}\n </button>\n </div>\n )\n }\n)\nPasswordInput.displayName = 'PasswordInput'\n\nexport default PasswordInput","'use client'\n\n// OTPBoxGroup — 6-slot OTP input shared across login OTP step and 2FA challenge.\n// Auto-submits once all 6 digits are filled (one-shot guard per fill cycle).\n\nimport { useEffect, useRef } from 'react'\nimport {\n InputOTP,\n InputOTPGroup,\n InputOTPSlot,\n} from '../ui/input-otp'\nimport { REGEXP_ONLY_DIGITS } from 'input-otp'\n\ninterface OTPBoxGroupProps {\n value: string\n onChange: (value: string) => void\n onComplete?: (value: string) => void\n disabled?: boolean\n ariaLabel?: string\n autoFocus?: boolean\n}\n\nconst OTPBoxGroup = ({\n value,\n onChange,\n onComplete,\n disabled = false,\n ariaLabel,\n autoFocus = false,\n}: OTPBoxGroupProps) => {\n const hasCalledComplete = useRef(false)\n\n // Auto-submit guard: only fire once per fill cycle.\n useEffect(() => {\n if (value.length === 6 && !hasCalledComplete.current) {\n hasCalledComplete.current = true\n onComplete?.(value)\n }\n if (value.length < 6) {\n hasCalledComplete.current = false\n }\n }, [value, onComplete])\n\n return (\n <div className=\"flex justify-center my-2\">\n <InputOTP\n maxLength={6}\n value={value}\n onChange={onChange}\n disabled={disabled}\n pattern={REGEXP_ONLY_DIGITS}\n autoFocus={autoFocus}\n aria-label={ariaLabel}\n containerClassName=\"gap-2\"\n dir=\"ltr\"\n >\n <InputOTPGroup>\n {[0, 1, 2, 3, 4, 5].map(i => (\n <InputOTPSlot\n key={i}\n index={i}\n className=\"h-12 w-12 text-lg font-mono border-border first:rounded-s-md last:rounded-e-md sm:h-12 sm:w-12\"\n />\n ))}\n </InputOTPGroup>\n </InputOTP>\n </div>\n )\n}\nOTPBoxGroup.displayName = 'OTPBoxGroup'\n\nexport default OTPBoxGroup","'use client'\n\n// ForgotForm — forgot password.\n// State machine: 'form' → 'sent' (always, no enumeration — same response whether\n// the account exists or not).\n// All transport removed: calls props.authClient.forgotPassword.\n\nimport { useState } from 'react'\nimport { Mail, ArrowLeft, Loader2 } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { Input } from '../ui/input'\nimport { Label } from '../ui/label'\nimport type { AuthClient } from './AuthClient'\nimport AuthErrorAlert from './AuthErrorAlert'\nimport AuthStepHeader from './AuthStepHeader'\n\ntype ForgotState = 'form' | 'sent'\n\ninterface ForgotFormProps {\n /** Transport seam. */\n authClient: AuthClient\n /** Called when the user clicks \"Back to sign in\". Fort's router handles navigation. */\n onBack?: () => void\n /** Display language. Default: 'en'. */\n language?: 'en' | 'ar'\n}\n\nconst ForgotForm = ({ authClient, onBack, language = 'en' }: ForgotFormProps) => {\n const ar = language === 'ar'\n\n const [formState, setFormState] = useState<ForgotState>('form')\n const [email, setEmail] = useState('')\n const [emailError, setEmailError] = useState('')\n const [error, setError] = useState('')\n const [isPending, setIsPending] = useState(false)\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n setError('')\n setEmailError('')\n\n if (!email || !email.includes('@')) {\n setEmailError(ar ? 'يرجى إدخال بريد إلكتروني صحيح.' : 'Please enter a valid email address.')\n return\n }\n\n setIsPending(true)\n try {\n await authClient.forgotPassword(email)\n setFormState('sent')\n } catch (err: unknown) {\n const message = (err as { message?: string })?.message || ''\n if (message.toLowerCase().includes('network') || message.toLowerCase().includes('fetch')) {\n setError(ar ? 'خطأ في الاتصال. يرجى المحاولة مرة أخرى.' : 'Connection error. Please try again.')\n } else {\n // Even on server error show sent state (no enumeration)\n setFormState('sent')\n }\n } finally {\n setIsPending(false)\n }\n }\n\n const handleBack = () => {\n if (onBack) {\n onBack()\n }\n }\n\n // ── Sent state ─────────────────────────────────────────────────────────────\n if (formState === 'sent') {\n return (\n <div className=\"flex flex-col gap-6\">\n <AuthStepHeader\n icon={<Mail className=\"h-7 w-7\" aria-hidden=\"true\" />}\n title={ar ? 'تحقق من بريدك الإلكتروني' : 'Check your email'}\n subtitle={\n ar\n ? 'إذا كان هناك حساب بهذا البريد، ستستلم رابط الإعادة قريباً.'\n : \"If an account with that email exists, you'll receive a reset link shortly.\"\n }\n centered\n />\n <p className=\"text-xs text-muted-foreground text-center\">\n {ar ? 'ينتهي الرابط خلال 15 دقيقة.' : 'The link expires in 15 minutes.'}\n </p>\n\n <Button variant=\"outline\" className=\"w-full\" asChild>\n <a href=\"mailto:\" aria-label={ar ? 'فتح تطبيق البريد' : 'Open email app'}>\n {ar ? 'فتح تطبيق البريد' : 'Open email app'}\n </a>\n </Button>\n\n <p className=\"text-xs text-muted-foreground text-center\">\n {ar ? 'لم تستلمه؟ تحقق من مجلد البريد غير المرغوب أو ' : \"Didn't receive it? Check your spam folder or \"}\n <button\n type=\"button\"\n onClick={() => setFormState('form')}\n className=\"text-xs text-primary hover:underline cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\"\n >\n {ar ? 'حاول مجدداً' : 'try again'}\n </button>\n </p>\n\n {onBack && (\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard self-center focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5 rtl:rotate-180\" aria-hidden=\"true\" />\n {ar ? 'العودة إلى تسجيل الدخول' : 'Back to sign in'}\n </button>\n )}\n </div>\n )\n }\n\n // ── Form state ─────────────────────────────────────────────────────────────\n return (\n <form noValidate onSubmit={handleSubmit} className=\"flex flex-col gap-6\">\n <AuthStepHeader\n title={ar ? 'نسيت كلمة المرور؟' : 'Forgot your password?'}\n subtitle={\n ar\n ? 'أدخل بريدك الإلكتروني وسنرسل رابط الإعادة إذا كان الحساب موجوداً.'\n : \"Enter your email and we'll send a reset link if an account exists.\"\n }\n />\n\n <AuthErrorAlert error={error} />\n\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"forgot-email\" className=\"text-sm font-medium text-foreground text-start\">\n {ar ? 'البريد الإلكتروني' : 'Email address'}\n </Label>\n <Input\n id=\"forgot-email\"\n type=\"email\"\n /* LTR email content, but right-aligned in RTL so it matches the\n right-aligned label (Rule 8 — full RTL). */\n dir=\"ltr\"\n autoComplete=\"email\"\n placeholder=\"you@example.com\"\n value={email}\n onChange={e => { setEmail(e.target.value); setEmailError('') }}\n disabled={isPending}\n aria-invalid={!!emailError}\n aria-describedby={emailError ? 'forgot-email-error' : undefined}\n className={`${ar ? 'text-end' : ''} ${emailError ? 'border-destructive ring-destructive/30' : ''}`}\n />\n {emailError && (\n <p id=\"forgot-email-error\" role=\"alert\" className=\"text-xs text-destructive mt-1\">\n {emailError}\n </p>\n )}\n </div>\n\n <Button type=\"submit\" className=\"w-full\" disabled={isPending}>\n {isPending ? (\n <span className=\"flex items-center gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n {ar ? 'جارٍ الإرسال...' : 'Sending...'}\n </span>\n ) : (\n ar ? 'إرسال رابط الإعادة' : 'Send reset link'\n )}\n </Button>\n\n {onBack && (\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard self-center focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5 rtl:rotate-180\" aria-hidden=\"true\" />\n {ar ? 'العودة إلى تسجيل الدخول' : 'Back to sign in'}\n </button>\n )}\n </form>\n )\n}\nForgotForm.displayName = 'ForgotForm'\n\nexport default ForgotForm","'use client'\n\n// ResetForm — set a new password using the token from the reset magic link URL.\n// States: 'form' | 'success' | 'invalid'.\n// Token validity discovered on submit (no pre-check that would enumerate tokens).\n// All transport removed: calls props.authClient.resetPassword.\n\nimport { useState } from 'react'\nimport { Lock, Check, Loader2, ArrowLeft } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { Label } from '../ui/label'\nimport type { AuthClient } from './AuthClient'\nimport { computeRules, computeScore } from './PasswordStrengthMeter'\nimport AuthErrorAlert from './AuthErrorAlert'\nimport AuthStepHeader from './AuthStepHeader'\nimport PasswordInput from './PasswordInput'\nimport PasswordStrengthMeter from './PasswordStrengthMeter'\n\ninterface ResetFormProps {\n /** Reset token extracted from the magic link URL query param. */\n token: string\n /** Transport seam. */\n authClient: AuthClient\n /** Called after password is successfully reset. Fort's router may navigate to sign-in. */\n onSuccess?: () => void\n /** Called when the user clicks \"Request a new link\". */\n onRequestNewLink?: () => void\n /** Display language. Default: 'en'. */\n language?: 'en' | 'ar'\n}\n\ntype ResetState = 'form' | 'success' | 'invalid'\n\nconst ResetForm = ({\n token,\n authClient,\n onSuccess,\n onRequestNewLink,\n language = 'en',\n}: ResetFormProps) => {\n const ar = language === 'ar'\n\n const [state, setState] = useState<ResetState>('form')\n const [newPassword, setNewPassword] = useState('')\n const [confirmPassword, setConfirmPassword] = useState('')\n const [confirmError, setConfirmError] = useState('')\n const [error, setError] = useState('')\n const [isPending, setIsPending] = useState(false)\n\n const rules = computeRules(newPassword)\n const score = computeScore(rules)\n void score // used by PasswordStrengthMeter via prop — suppress unused warning\n const allRulesMet = rules.every(r => r.met)\n const passwordsMatch = newPassword === confirmPassword\n const canSubmit = allRulesMet && passwordsMatch && newPassword.length > 0 && confirmPassword.length > 0\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n setError('')\n setConfirmError('')\n\n if (!allRulesMet) {\n setError(ar ? 'كلمة المرور لا تستوفي متطلبات القوة.' : 'Password does not meet strength requirements.')\n return\n }\n if (!passwordsMatch) {\n setConfirmError(ar ? 'كلمتا المرور غير متطابقتين.' : 'Passwords do not match.')\n return\n }\n\n setIsPending(true)\n try {\n await authClient.resetPassword(token, newPassword)\n setState('success')\n } catch (err: unknown) {\n const status = (err as { status?: number })?.status\n const message = (err as { message?: string })?.message || ''\n if (status === 401 || status === 400 || message.includes('invalid') || message.includes('expired')) {\n setState('invalid')\n } else if (message.toLowerCase().includes('network') || message.toLowerCase().includes('fetch')) {\n setError(ar ? 'خطأ في الاتصال. يرجى المحاولة مرة أخرى.' : 'Connection error. Please try again.')\n } else {\n setError(ar ? 'حدث خطأ ما. يرجى المحاولة مرة أخرى.' : 'Something went wrong. Please try again.')\n }\n } finally {\n setIsPending(false)\n }\n }\n\n // ── Success state ──────────────────────────────────────────────────────────\n if (state === 'success') {\n return (\n <div className=\"flex flex-col gap-6\">\n <div className=\"mx-auto mb-2 flex h-14 w-14 items-center justify-center rounded-full bg-green-500/10 text-green-600\">\n <Check className=\"h-7 w-7\" aria-hidden=\"true\" />\n </div>\n <AuthStepHeader\n title={ar ? 'تم تحديث كلمة المرور' : 'Password updated'}\n subtitle={ar\n ? 'تم تغيير كلمة مرورك بنجاح. يمكنك الآن تسجيل الدخول.'\n : 'Your password has been changed successfully. You can now sign in.'\n }\n centered\n />\n <Button className=\"w-full\" onClick={onSuccess}>\n {ar ? 'الانتقال إلى تسجيل الدخول' : 'Go to sign in'}\n </Button>\n </div>\n )\n }\n\n // ── Invalid token state ────────────────────────────────────────────────────\n if (state === 'invalid') {\n return (\n <div className=\"flex flex-col gap-6\">\n <AuthStepHeader\n icon={<Lock className=\"h-7 w-7\" aria-hidden=\"true\" />}\n title={ar ? 'تعيين كلمة مرور جديدة' : 'Set a new password'}\n />\n <AuthErrorAlert\n error={ar\n ? 'هذا الرابط غير صالح أو منتهي الصلاحية. يرجى طلب رابط جديد.'\n : 'This link is invalid or has expired. Please request a new one.'\n }\n />\n {onRequestNewLink && (\n <button\n type=\"button\"\n onClick={onRequestNewLink}\n className=\"flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard self-center focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5 rtl:rotate-180\" aria-hidden=\"true\" />\n {ar ? 'طلب رابط جديد' : 'Request a new link'}\n </button>\n )}\n </div>\n )\n }\n\n // ── Form state ─────────────────────────────────────────────────────────────\n return (\n <form noValidate onSubmit={handleSubmit} className=\"flex flex-col gap-6\">\n <AuthStepHeader\n icon={<Lock className=\"h-7 w-7\" aria-hidden=\"true\" />}\n title={ar ? 'تعيين كلمة مرور جديدة' : 'Set a new password'}\n subtitle={ar ? 'اختر كلمة مرور قوية لحسابك.' : 'Choose a strong password for your account.'}\n />\n\n <AuthErrorAlert error={error} />\n\n {/* New password */}\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"new-password\" className=\"text-sm font-medium text-foreground text-start\">\n {ar ? 'كلمة المرور الجديدة' : 'New password'}\n </Label>\n <PasswordInput\n id=\"new-password\"\n language={language}\n autoComplete=\"new-password\"\n value={newPassword}\n onChange={e => setNewPassword((e as React.ChangeEvent<HTMLInputElement>).target.value)}\n disabled={isPending}\n aria-invalid={newPassword.length > 0 && !allRulesMet}\n />\n {newPassword.length > 0 && (\n <PasswordStrengthMeter password={newPassword} language={language} />\n )}\n </div>\n\n {/* Confirm password */}\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"confirm-password\" className=\"text-sm font-medium text-foreground text-start\">\n {ar ? 'تأكيد كلمة المرور' : 'Confirm password'}\n </Label>\n <PasswordInput\n id=\"confirm-password\"\n language={language}\n autoComplete=\"new-password\"\n value={confirmPassword}\n onChange={e => {\n setConfirmPassword((e as React.ChangeEvent<HTMLInputElement>).target.value)\n setConfirmError('')\n }}\n disabled={isPending}\n aria-invalid={!!confirmError}\n aria-describedby={confirmError ? 'confirm-password-error' : undefined}\n className={confirmError ? 'border-destructive ring-destructive/30' : ''}\n />\n {confirmError && (\n <p id=\"confirm-password-error\" role=\"alert\" className=\"text-xs text-destructive mt-1\">\n {confirmError}\n </p>\n )}\n </div>\n\n <Button type=\"submit\" className=\"w-full\" disabled={!canSubmit || isPending}>\n {isPending ? (\n <span className=\"flex items-center gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n {ar ? 'جارٍ التحديث...' : 'Updating...'}\n </span>\n ) : (\n ar ? 'تعيين كلمة المرور' : 'Set new password'\n )}\n </Button>\n </form>\n )\n}\nResetForm.displayName = 'ResetForm'\n\nexport default ResetForm","'use client'\n\n// PasswordStrengthMeter — visual password strength bar + rules checklist.\n// Shared between ResetForm and any change-password flow.\n// Score 0–4 = count of rules passed (length gate is required; others are bonus).\n// language prop replaces useLanguage context — callers inject from props.\n\nimport { Check, Minus } from 'lucide-react'\n\nexport interface PasswordRule {\n id: string\n label_en: string\n label_ar: string\n met: boolean\n}\n\ninterface PasswordStrengthMeterProps {\n password: string\n language?: 'en' | 'ar'\n}\n\nexport function computeRules(password: string): PasswordRule[] {\n return [\n {\n id: 'rule-length',\n label_en: 'At least 12 characters',\n label_ar: '12 حرفاً على الأقل',\n met: password.length >= 12,\n },\n {\n id: 'rule-upper',\n label_en: 'Uppercase letter',\n label_ar: 'حرف كبير',\n met: /[A-Z]/.test(password),\n },\n {\n id: 'rule-lower',\n label_en: 'Lowercase letter',\n label_ar: 'حرف صغير',\n met: /[a-z]/.test(password),\n },\n {\n id: 'rule-digit',\n label_en: 'Number',\n label_ar: 'رقم',\n met: /[0-9]/.test(password),\n },\n {\n id: 'rule-symbol',\n label_en: 'Symbol',\n label_ar: 'رمز',\n met: /[^A-Za-z0-9]/.test(password),\n },\n ]\n}\n\nexport function computeScore(rules: PasswordRule[]): number {\n // Length rule is mandatory; additional rules each add 1 point up to 4.\n const lengthMet = rules.find(r => r.id === 'rule-length')?.met ?? false\n if (!lengthMet) return 0\n const bonusMet = rules.filter(r => r.id !== 'rule-length' && r.met).length\n return Math.min(4, 1 + bonusMet)\n}\n\nconst SCORE_CONFIG = [\n { width: 'w-0', color: 'bg-destructive', label_en: 'Too weak', label_ar: 'ضعيفة جداً' },\n { width: 'w-1/4', color: 'bg-destructive', label_en: 'Weak', label_ar: 'ضعيفة' },\n { width: 'w-2/4', color: 'bg-yellow-500', label_en: 'Fair', label_ar: 'مقبولة' },\n { width: 'w-3/4', color: 'bg-accent', label_en: 'Strong', label_ar: 'قوية' },\n { width: 'w-full', color: 'bg-green-500', label_en: 'Very strong', label_ar: 'قوية جداً' },\n]\n\nconst PasswordStrengthMeter = ({ password, language = 'en' }: PasswordStrengthMeterProps) => {\n const rules = computeRules(password)\n const score = computeScore(rules)\n const cfg = SCORE_CONFIG[score]\n const strengthLabel = language === 'ar' ? cfg.label_ar : cfg.label_en\n const ariaLabel = language === 'ar' ? 'قوة كلمة المرور' : 'Password strength'\n\n return (\n <div className=\"flex flex-col gap-2 mt-1\">\n {/* Strength bar */}\n <div className=\"flex items-center gap-2\">\n <div className=\"h-1.5 flex-1 rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full rounded-full transition-[width] duration-300 ease-in-out ${cfg.width} ${cfg.color}`}\n role=\"progressbar\"\n aria-valuenow={score * 25}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={ariaLabel}\n />\n </div>\n <span className=\"text-xs text-muted-foreground text-end shrink-0 min-w-[4.5rem]\">\n {strengthLabel}\n </span>\n </div>\n\n {/* Rules checklist */}\n <ul\n className=\"flex flex-col gap-0.5 mt-1\"\n aria-live=\"polite\"\n aria-label={language === 'ar' ? 'متطلبات كلمة المرور' : 'Password requirements'}\n >\n {rules.map(rule => (\n <li\n key={rule.id}\n className={`flex items-center gap-1.5 text-xs ${rule.met ? 'text-green-600' : 'text-muted-foreground'}`}\n aria-checked={rule.met}\n >\n {rule.met ? (\n <Check className=\"h-3 w-3 shrink-0\" aria-hidden=\"true\" />\n ) : (\n <Minus className=\"h-3 w-3 shrink-0\" aria-hidden=\"true\" />\n )}\n {language === 'ar' ? rule.label_ar : rule.label_en}\n </li>\n ))}\n </ul>\n </div>\n )\n}\nPasswordStrengthMeter.displayName = 'PasswordStrengthMeter'\n\nexport default PasswordStrengthMeter\n","'use client'\n\n// TwoFAForm — 2FA login challenge.\n// Two views: 'totp' (6-digit OTP boxes, auto-submit) and 'recovery' (plain text input).\n// All transport removed: calls props.authClient.verify2FA.\n// challengeToken is passed as a prop (callers store it in their own state after\n// LoginForm fires on2FA — no sessionStorage dependency).\n\nimport { useState, useCallback } from 'react'\nimport { Shield, KeyRound, ArrowLeft, Loader2 } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { Input } from '../ui/input'\nimport { Label } from '../ui/label'\nimport type { AuthClient } from './AuthClient'\nimport AuthErrorAlert from './AuthErrorAlert'\nimport AuthStepHeader from './AuthStepHeader'\nimport OTPBoxGroup from './OTPBoxGroup'\n\ntype View = 'totp' | 'recovery'\n\ninterface TwoFAFormProps {\n /** Transport seam. */\n authClient: AuthClient\n /**\n * Opaque challenge token from LoginForm's on2FA callback.\n * Pass it directly — the form forwards it to authClient.verify2FA.\n */\n challengeToken?: string\n /** Called after successful 2FA verification. */\n onSuccess?: () => void\n /** Called when the server rejects the code with \"too many attempts\". */\n onTooManyAttempts?: () => void\n /** Display language. Default: 'en'. */\n language?: 'en' | 'ar'\n}\n\nconst TwoFAForm = ({\n authClient,\n challengeToken,\n onSuccess,\n onTooManyAttempts,\n language = 'en',\n}: TwoFAFormProps) => {\n const ar = language === 'ar'\n\n const [view, setView] = useState<View>('totp')\n const [totpValue, setTotpValue] = useState('')\n const [recoveryCode, setRecoveryCode] = useState('')\n const [error, setError] = useState('')\n const [isVerifying, setIsVerifying] = useState(false)\n\n const submitVerify = useCallback(async (codeOverride?: string) => {\n const code = codeOverride ?? (view === 'totp' ? totpValue : recoveryCode)\n if (!code) return\n setError('')\n setIsVerifying(true)\n try {\n await authClient.verify2FA(code, challengeToken)\n onSuccess?.()\n } catch (err: unknown) {\n const message = (err as { message?: string })?.message || ''\n if (view === 'totp') setTotpValue('')\n else setRecoveryCode('')\n\n if (message.includes('too_many') || message.includes('attempts')) {\n setError(ar ? 'محاولات كثيرة جداً. يرجى تسجيل الدخول من جديد.' : 'Too many attempts. Please sign in again.')\n setTimeout(() => onTooManyAttempts?.(), 2500)\n } else if (message.includes('used')) {\n setError(ar ? 'تم استخدام هذا الرمز مسبقاً.' : 'This code has already been used.')\n } else if (view === 'recovery') {\n setError(ar ? 'رمز الاسترداد غير معروف.' : 'Recovery code not recognised.')\n } else {\n setError(ar ? 'الرمز غير صحيح. يرجى المحاولة مرة أخرى.' : 'Code incorrect. Please try again.')\n }\n } finally {\n setIsVerifying(false)\n }\n }, [view, totpValue, recoveryCode, challengeToken, ar, authClient, onSuccess, onTooManyAttempts])\n\n const handleTotpComplete = useCallback(async (value: string) => {\n await submitVerify(value)\n }, [submitVerify])\n\n // ── Recovery view ──────────────────────────────────────────────────────────\n if (view === 'recovery') {\n return (\n <div className=\"flex flex-col gap-6\">\n <AuthStepHeader\n icon={<KeyRound className=\"h-7 w-7\" aria-hidden=\"true\" />}\n title={ar ? 'استخدام رمز الاسترداد' : 'Use a recovery code'}\n subtitle={ar\n ? 'أدخل أحد رموز الاسترداد المحفوظة. يمكن استخدام كل رمز مرة واحدة فقط.'\n : 'Enter one of your saved recovery codes. Each code can only be used once.'\n }\n centered\n />\n\n <AuthErrorAlert error={error} />\n\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"recovery-code\" className=\"text-sm font-medium text-foreground text-start\">\n {ar ? 'رمز الاسترداد' : 'Recovery code'}\n </Label>\n <Input\n id=\"recovery-code\"\n type=\"text\"\n /* Recovery codes are LTR/monospace, but right-align in RTL so the\n placeholder sits under the right-aligned label (Rule 8). */\n dir=\"ltr\"\n autoComplete=\"off\"\n placeholder=\"XXXX-XXXXXX\"\n value={recoveryCode}\n onChange={e => setRecoveryCode(e.target.value)}\n disabled={isVerifying}\n className={`font-mono ${ar ? 'text-end' : ''}`}\n />\n </div>\n\n <Button\n type=\"button\"\n className=\"w-full\"\n disabled={!recoveryCode.trim() || isVerifying}\n onClick={() => submitVerify()}\n >\n {isVerifying ? (\n <span className=\"flex items-center gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n {ar ? 'جارٍ التحقق...' : 'Verifying...'}\n </span>\n ) : (\n ar ? 'تحقق' : 'Verify'\n )}\n </Button>\n\n <button\n type=\"button\"\n onClick={() => { setView('totp'); setError(''); setRecoveryCode('') }}\n className=\"flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard self-center focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\"\n >\n <ArrowLeft className=\"h-3.5 w-3.5 rtl:rotate-180\" aria-hidden=\"true\" />\n {ar ? 'العودة إلى رمز المصادقة' : 'Back to authenticator code'}\n </button>\n </div>\n )\n }\n\n // ── TOTP view ──────────────────────────────────────────────────────────────\n return (\n <div className=\"flex flex-col gap-6\">\n <AuthStepHeader\n icon={<Shield className=\"h-7 w-7\" aria-hidden=\"true\" />}\n title={ar ? 'التحقق بخطوتين' : 'Two-factor authentication'}\n subtitle={ar\n ? 'أدخل الرمز المكوّن من 6 أرقام من تطبيق المصادقة.'\n : 'Enter the 6-digit code from your authenticator app.'\n }\n centered\n />\n\n <AuthErrorAlert error={error} />\n\n <div className=\"flex flex-col gap-2\">\n <Label className=\"sr-only\">\n {ar ? 'رمز المصادقة' : 'Authenticator code'}\n </Label>\n <OTPBoxGroup\n value={totpValue}\n onChange={setTotpValue}\n onComplete={handleTotpComplete}\n disabled={isVerifying}\n ariaLabel={ar ? 'التحقق بخطوتين' : 'Two-factor authentication'}\n autoFocus\n />\n </div>\n\n <Button\n type=\"button\"\n className=\"w-full\"\n disabled={totpValue.length < 6 || isVerifying}\n onClick={() => submitVerify()}\n >\n {isVerifying ? (\n <span className=\"flex items-center gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin\" aria-hidden=\"true\" />\n {ar ? 'جارٍ التحقق...' : 'Verifying...'}\n </span>\n ) : (\n ar ? 'تحقق' : 'Verify'\n )}\n </Button>\n\n <div className=\"text-center\">\n <p className=\"text-xs text-muted-foreground\">\n {ar ? 'فقدت الوصول إلى تطبيق المصادقة؟' : 'Lost access to your authenticator?'}\n </p>\n <button\n type=\"button\"\n onClick={() => { setView('recovery'); setError(''); setTotpValue('') }}\n className=\"text-xs text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\"\n >\n {ar ? 'استخدام رمز الاسترداد بدلاً من ذلك' : 'Use a recovery code instead'}\n </button>\n </div>\n </div>\n )\n}\nTwoFAForm.displayName = 'TwoFAForm'\n\nexport default TwoFAForm","'use client'\n\n/**\n * LockScreen — full-screen PIN unlock overlay.\n *\n * Used when a user has locked their session (manually or via idle timeout).\n * Renders as a full-screen overlay matching the AuthCard/centered aesthetic:\n * - User avatar + display name + email\n * - PIN entry via OTPBoxGroup (4-6 digits; auto-submits on 6 digits)\n * - \"Unlock\" action button\n * - Wrong-PIN error state with attempt counter; hard lockout after maxAttempts\n * - \"Not you? Sign out\" escape hatch\n *\n * Bilingual EN/AR with full RTL support (Rule 8/16).\n * Accessible: ARIA labels, focus management, role=\"alert\" for errors.\n *\n * Props:\n * user — { name, email, avatarUrl } for the avatar row.\n * onUnlock — async callback given the entered PIN; should throw on failure\n * (the component catches and shows error + increments attempts).\n * onSignOut — called when the user clicks \"Not you? Sign out\".\n * language — 'en' | 'ar'. Default: 'en'.\n * pinLength — exact PIN length expected. Default: 6. Accepts 4-6.\n * maxAttempts — failed attempts before \"too many attempts\" lockout. Default: 5.\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { Lock, LogOut } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar'\nimport { Button } from '../ui/button'\nimport OTPBoxGroup from './OTPBoxGroup'\nimport { cn } from '../../lib/utils'\n\n// ── i18n ──────────────────────────────────────────────────────────────────────\n\nconst STRINGS = {\n locked: { en: 'Screen Locked', ar: 'الشاشة مقفلة' },\n enterPin: { en: 'Enter your PIN to continue', ar: 'أدخل رمز PIN للمتابعة' },\n unlock: { en: 'Unlock', ar: 'فتح القفل' },\n unlocking: { en: 'Verifying…', ar: 'جارٍ التحقق…' },\n wrongPin: { en: 'Incorrect PIN. Please try again.', ar: 'رمز PIN غير صحيح. حاول مجددًا.' },\n attemptsLeft: {\n en: (n: number) => `${n} attempt${n === 1 ? '' : 's'} remaining.`,\n ar: (n: number) => `متبقٍ ${n} ${n === 1 ? 'محاولة' : 'محاولات'}.`,\n },\n tooManyAttempts: {\n en: 'Too many failed attempts. Please sign out and sign in again.',\n ar: 'محاولات خاطئة كثيرة. يُرجى تسجيل الخروج وإعادة تسجيل الدخول.',\n },\n signOut: { en: 'Not you? Sign out', ar: 'لست أنت؟ تسجيل الخروج' },\n} as const\n\ntype Lang = 'en' | 'ar'\n\nfunction tr(key: keyof typeof STRINGS, lang: Lang): string {\n const val = STRINGS[key][lang]\n return typeof val === 'string' ? val : ''\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface LockScreenUser {\n /** Display name (language-resolved by caller). */\n name?: string | null\n email: string\n avatarUrl?: string | null\n}\n\nexport interface LockScreenProps {\n user: LockScreenUser\n /**\n * Called with the entered PIN when the user submits.\n * Should throw (or reject) if the PIN is wrong so the component can count\n * failed attempts. On success it should resolve without throwing.\n */\n onUnlock: (pin: string) => Promise<void>\n /** Called when the user clicks \"Not you? Sign out\". */\n onSignOut: () => void\n /** Current UI language. Default: 'en'. */\n language?: Lang\n /**\n * Exact PIN length expected. Accepts 4-6. Default: 6.\n * NOTE: OTPBoxGroup always renders 6 slots; when pinLength < 6 the component\n * auto-submits on the Nth digit instead of the 6th.\n */\n pinLength?: 4 | 5 | 6\n /** Max failed attempts before the lockout state. Default: 5. */\n maxAttempts?: number\n /** Optional extra class on the outer wrapper. */\n className?: string\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction computeInitials(name?: string | null, email?: string): string {\n if (name) {\n return name\n .split(' ')\n .slice(0, 2)\n .map((w) => w[0] ?? '')\n .join('')\n .toUpperCase() || '?'\n }\n return (email?.[0] ?? '?').toUpperCase()\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nconst LockScreen = ({\n user,\n onUnlock,\n onSignOut,\n language = 'en',\n pinLength = 6,\n maxAttempts = 5,\n className,\n}: LockScreenProps) => {\n const isRTL = language === 'ar'\n const dir = isRTL ? 'rtl' : 'ltr'\n\n const [pin, setPin] = useState('')\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [errorMsg, setErrorMsg] = useState<string | null>(null)\n const [failedAttempts, setFailedAttempts] = useState(0)\n const isLockedOut = failedAttempts >= maxAttempts\n\n // Focus the OTP input when the lock screen mounts.\n const containerRef = useRef<HTMLDivElement>(null)\n useEffect(() => {\n const timer = setTimeout(() => {\n const firstInput = containerRef.current?.querySelector<HTMLInputElement>(\n 'input[type=\"text\"], input[inputmode=\"numeric\"]',\n )\n firstInput?.focus()\n }, 80)\n return () => clearTimeout(timer)\n }, [])\n\n // ── Submit handler ────────────────────────────────────────────────────────\n\n const handleSubmit = useCallback(\n async (submittedPin: string) => {\n if (isLockedOut || isSubmitting) return\n if (submittedPin.length < pinLength) return\n\n setIsSubmitting(true)\n setErrorMsg(null)\n\n try {\n await onUnlock(submittedPin)\n // onUnlock resolved → caller will clear the lock; no local state change needed.\n } catch {\n const newFailed = failedAttempts + 1\n setFailedAttempts(newFailed)\n setPin('')\n\n if (newFailed >= maxAttempts) {\n setErrorMsg(tr('tooManyAttempts', language))\n } else {\n const left = maxAttempts - newFailed\n const attemptsStr =\n language === 'en'\n ? STRINGS.attemptsLeft.en(left)\n : STRINGS.attemptsLeft.ar(left)\n setErrorMsg(`${tr('wrongPin', language)} ${attemptsStr}`)\n }\n } finally {\n setIsSubmitting(false)\n }\n },\n [isLockedOut, isSubmitting, pinLength, onUnlock, failedAttempts, maxAttempts, language],\n )\n\n const handlePinComplete = useCallback(\n (value: string) => {\n void handleSubmit(value)\n },\n [handleSubmit],\n )\n\n const handleUnlockClick = useCallback(() => {\n void handleSubmit(pin)\n }, [handleSubmit, pin])\n\n // ── Render ────────────────────────────────────────────────────────────────\n\n const initials = computeInitials(user.name, user.email)\n const displayName = user.name ?? user.email\n\n return (\n // Full-screen overlay — sits above everything via z-[9999].\n <div\n dir={dir}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={tr('locked', language)}\n className={cn(\n 'fixed inset-0 z-[9999] flex flex-col items-center justify-center',\n 'bg-background/95 backdrop-blur-sm',\n className,\n )}\n ref={containerRef}\n >\n {/* Inner card */}\n <div className=\"flex w-full max-w-sm flex-col items-center gap-6 rounded-2xl border border-border bg-background-surface p-8 shadow-2xl\">\n\n {/* Lock icon header */}\n <div className=\"flex h-14 w-14 items-center justify-center rounded-full bg-primary/10 text-primary\" aria-hidden=\"true\">\n <Lock className=\"h-7 w-7\" strokeWidth={1.75} />\n </div>\n\n {/* Title */}\n <div className=\"flex flex-col items-center gap-1 text-center\">\n <h2 className=\"text-xl font-bold text-foreground\">\n {tr('locked', language)}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {tr('enterPin', language)}\n </p>\n </div>\n\n {/* User identity row */}\n <div className=\"flex items-center gap-3\" aria-label={`${displayName} ${user.email}`}>\n <Avatar className=\"h-11 w-11 shrink-0\">\n {user.avatarUrl && (\n <AvatarImage src={user.avatarUrl} alt={displayName} />\n )}\n <AvatarFallback className=\"text-sm font-semibold\" aria-hidden=\"true\">\n {initials}\n </AvatarFallback>\n </Avatar>\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"truncate text-sm font-medium text-foreground\">\n {displayName}\n </span>\n <span className=\"truncate text-xs text-muted-foreground\" dir=\"ltr\">\n {user.email}\n </span>\n </div>\n </div>\n\n {/* PIN input */}\n <div className=\"w-full\">\n <OTPBoxGroup\n value={pin}\n onChange={setPin}\n onComplete={handlePinComplete}\n disabled={isSubmitting || isLockedOut}\n ariaLabel={tr('enterPin', language)}\n autoFocus\n />\n </div>\n\n {/* Error message */}\n {errorMsg && (\n <p\n role=\"alert\"\n className={cn(\n 'text-center text-sm',\n isLockedOut ? 'font-medium text-destructive' : 'text-destructive',\n )}\n >\n {errorMsg}\n </p>\n )}\n\n {/* Unlock button */}\n {!isLockedOut && (\n <Button\n type=\"button\"\n className=\"w-full\"\n onClick={handleUnlockClick}\n disabled={pin.length < pinLength || isSubmitting}\n aria-busy={isSubmitting}\n >\n {isSubmitting ? tr('unlocking', language) : tr('unlock', language)}\n </Button>\n )}\n\n {/* Sign-out escape hatch — always visible */}\n <button\n type=\"button\"\n onClick={onSignOut}\n className=\"flex items-center gap-1.5 text-xs text-muted-foreground transition-colors duration-fast ease-standard hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:rounded-sm\"\n >\n <LogOut className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {tr('signOut', language)}\n </button>\n </div>\n </div>\n )\n}\n\nLockScreen.displayName = 'LockScreen'\n\nexport default LockScreen\n","'use client'\n\n/**\n * PasswordLockScreen — full-screen password + TOTP unlock overlay.\n *\n * Used by FortProvider's idle-lock feature when the platform is configured with\n * lock_screen.enabled = true. Unlike the PIN-based LockScreen, this screen\n * verifies the user's account password (and TOTP code when 2FA is enrolled)\n * via POST /v1/auth/unlock.\n *\n * Design:\n * - Full-screen overlay matching the AuthCard/centered aesthetic.\n * - Platform brand icon + \"Screen Locked\" title.\n * - Signed-in user's email shown for context.\n * - Password field (PasswordInput component — show/hide toggle).\n * - TOTP field (6-digit OTPBoxGroup) rendered only when hasTOTP=true or when\n * the server returns a totp_required error on the first attempt.\n * - \"Unlock\" button; loading state.\n * - Error messages: wrong password, TOTP required, TOTP wrong, rate-limited.\n * - \"Switch account\" (sign out) link — always visible.\n * - 5 failed attempts → parent receives onForceLogout (server has already\n * cleared the session via force-logout).\n *\n * Bilingual EN/AR + full RTL support (Rule 8/16).\n * Accessible: ARIA labels, role=\"alert\" for errors, focus management.\n *\n * Props:\n * user — { name, email, avatarUrl }\n * onUnlock — async ({password, totp?}) → throws on failure with an\n * error code string as the message\n * onSignOut — called when the user clicks \"Switch account\"\n * onForceLogout — called when max attempts exceeded (session already cleared)\n * language — 'en' | 'ar'. Default: 'en'\n * maxAttempts — hard lock-out threshold. Default: 5\n * hasTOTP — whether the user has TOTP enrolled. Default: false.\n * When false, TOTP field is hidden until server says totp_required.\n * className — optional extra class on the outer wrapper\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { Lock, LogOut, ShieldCheck } from 'lucide-react'\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar'\nimport { Button } from '../ui/button'\nimport { Label } from '../ui/label'\nimport OTPBoxGroup from './OTPBoxGroup'\nimport PasswordInput from './PasswordInput'\nimport { cn } from '../../lib/utils'\n\n// ── i18n ──────────────────────────────────────────────────────────────────────\n\nconst STRINGS = {\n locked: { en: 'Screen Locked', ar: 'الشاشة مقفلة' },\n lockedDesc: {\n en: 'Enter your password to continue',\n ar: 'أدخل كلمة المرور للمتابعة',\n },\n password: { en: 'Password', ar: 'كلمة المرور' },\n totpLabel: { en: 'Two-factor code', ar: 'رمز التحقق الثنائي' },\n totpPlaceholder: { en: '6-digit code', ar: 'رمز مكوّن من 6 أرقام' },\n unlock: { en: 'Unlock', ar: 'فتح القفل' },\n unlocking: { en: 'Verifying…', ar: 'جارٍ التحقق…' },\n switchAccount: { en: 'Switch account', ar: 'تبديل الحساب' },\n // Error messages\n errInvalidCredentials: {\n en: 'Incorrect password. Please try again.',\n ar: 'كلمة المرور غير صحيحة. حاول مجددًا.',\n },\n errTotpRequired: {\n en: 'Enter your two-factor code to continue.',\n ar: 'أدخل رمز التحقق الثنائي للمتابعة.',\n },\n errInvalidTotp: {\n en: 'Incorrect two-factor code. Please try again.',\n ar: 'رمز التحقق الثنائي غير صحيح. حاول مجددًا.',\n },\n errTooMany: {\n en: 'Too many failed attempts. You have been signed out for security.',\n ar: 'محاولات فاشلة كثيرة. تم تسجيل خروجك لأسباب أمنية.',\n },\n errServer: {\n en: 'An error occurred. Please try again.',\n ar: 'حدث خطأ. حاول مجددًا.',\n },\n attemptsLeft: {\n en: (n: number) => `${n} attempt${n === 1 ? '' : 's'} remaining.`,\n ar: (n: number) => `متبقٍ ${n} ${n === 1 ? 'محاولة' : 'محاولات'}.`,\n },\n} as const\n\ntype Lang = 'en' | 'ar'\n\nfunction t(key: keyof typeof STRINGS, lang: Lang): string {\n const val = STRINGS[key][lang]\n return typeof val === 'string' ? val : ''\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface PasswordLockScreenUser {\n name?: string | null\n email: string\n avatarUrl?: string | null\n}\n\nexport interface UnlockCredentials {\n password: string\n totp?: string\n}\n\nexport interface PasswordLockScreenProps {\n user: PasswordLockScreenUser\n /**\n * Called with the entered credentials. Should throw an Error whose message is\n * the server error code (e.g. \"invalid_credentials\", \"totp_required\",\n * \"invalid_totp\", \"too_many_attempts\").\n */\n onUnlock: (creds: UnlockCredentials) => Promise<void>\n /** Called when user clicks \"Switch account\". */\n onSignOut: () => void\n /**\n * Called when the server has force-logged-out after too many failures.\n * The session cookies are already cleared; the caller should redirect to login.\n */\n onForceLogout?: () => void\n /** UI language. Default: 'en'. */\n language?: Lang\n /** Max failed attempts before lockout state. Default: 5. */\n maxAttempts?: number\n /**\n * Whether the user has TOTP enrolled. When true the TOTP field is always\n * visible. When false (default), it appears only after a totp_required error.\n */\n hasTOTP?: boolean\n /** Optional extra class on the outer wrapper. */\n className?: string\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction initials(name?: string | null, email?: string): string {\n if (name) {\n return name\n .split(' ')\n .slice(0, 2)\n .map((w) => w[0] ?? '')\n .join('')\n .toUpperCase() || '?'\n }\n return (email?.[0] ?? '?').toUpperCase()\n}\n\nfunction resolveError(\n code: string,\n lang: Lang,\n attemptsLeft: number,\n maxAttempts: number,\n): string {\n const baseMsg = (() => {\n switch (code) {\n case 'invalid_credentials':\n return t('errInvalidCredentials', lang)\n case 'totp_required':\n return t('errTotpRequired', lang)\n case 'invalid_totp':\n return t('errInvalidTotp', lang)\n case 'too_many_attempts':\n return t('errTooMany', lang)\n default:\n return t('errServer', lang)\n }\n })()\n\n if (attemptsLeft > 0 && attemptsLeft < maxAttempts && code !== 'too_many_attempts' && code !== 'totp_required') {\n const suffix =\n lang === 'en'\n ? STRINGS.attemptsLeft.en(attemptsLeft)\n : STRINGS.attemptsLeft.ar(attemptsLeft)\n return `${baseMsg} ${suffix}`\n }\n return baseMsg\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nconst PasswordLockScreen = ({\n user,\n onUnlock,\n onSignOut,\n onForceLogout,\n language = 'en',\n maxAttempts = 5,\n hasTOTP: hasTOTPProp = false,\n className,\n}: PasswordLockScreenProps) => {\n const isRTL = language === 'ar'\n const dir = isRTL ? 'rtl' : 'ltr'\n\n const [password, setPassword] = useState('')\n const [totp, setTotp] = useState('')\n const [showTOTP, setShowTOTP] = useState(hasTOTPProp)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [errorMsg, setErrorMsg] = useState<string | null>(null)\n const [failedAttempts, setFailedAttempts] = useState(0)\n const [isForceLoggedOut, setIsForceLoggedOut] = useState(false)\n\n const isLockedOut = failedAttempts >= maxAttempts\n\n // Focus password field on mount.\n const passwordRef = useRef<HTMLInputElement>(null)\n useEffect(() => {\n const timer = setTimeout(() => passwordRef.current?.focus(), 80)\n return () => clearTimeout(timer)\n }, [])\n\n // ── Submit handler ──────────────────────────────────────────────────────────\n\n const handleSubmit = useCallback(\n async (e?: React.FormEvent) => {\n e?.preventDefault()\n if (isLockedOut || isSubmitting || isForceLoggedOut) return\n if (!password) return\n\n setIsSubmitting(true)\n setErrorMsg(null)\n\n try {\n const creds: UnlockCredentials = { password }\n if (showTOTP && totp.length === 6) {\n creds.totp = totp\n }\n await onUnlock(creds)\n // onUnlock resolved → caller will clear the lock\n } catch (err) {\n const code = err instanceof Error ? err.message : 'server_error'\n\n if (code === 'totp_required') {\n // Server says TOTP is required — show the TOTP field without counting failure\n setShowTOTP(true)\n setErrorMsg(t('errTotpRequired', language))\n setIsSubmitting(false)\n return\n }\n\n if (code === 'too_many_attempts') {\n setIsForceLoggedOut(true)\n setErrorMsg(t('errTooMany', language))\n onForceLogout?.()\n setIsSubmitting(false)\n return\n }\n\n const newFailed = failedAttempts + 1\n setFailedAttempts(newFailed)\n setPassword('')\n setTotp('')\n\n const left = maxAttempts - newFailed\n setErrorMsg(resolveError(code, language, left, maxAttempts))\n } finally {\n setIsSubmitting(false)\n }\n },\n [\n isLockedOut,\n isSubmitting,\n isForceLoggedOut,\n password,\n showTOTP,\n totp,\n onUnlock,\n failedAttempts,\n maxAttempts,\n language,\n onForceLogout,\n ],\n )\n\n const handleTOTPComplete = useCallback(\n (value: string) => {\n setTotp(value)\n // Auto-submit when TOTP is complete and password is filled.\n if (value.length === 6 && password) {\n void (async () => {\n setIsSubmitting(true)\n setErrorMsg(null)\n try {\n await onUnlock({ password, totp: value })\n } catch (err) {\n const code = err instanceof Error ? err.message : 'server_error'\n if (code === 'too_many_attempts') {\n setIsForceLoggedOut(true)\n setErrorMsg(t('errTooMany', language))\n onForceLogout?.()\n return\n }\n const newFailed = failedAttempts + 1\n setFailedAttempts(newFailed)\n setPassword('')\n setTotp('')\n setErrorMsg(resolveError(code, language, maxAttempts - newFailed, maxAttempts))\n } finally {\n setIsSubmitting(false)\n }\n })()\n }\n },\n [password, onUnlock, failedAttempts, maxAttempts, language, onForceLogout],\n )\n\n // ── Render ────────────────────────────────────────────────────────────────\n\n const userInitials = initials(user.name, user.email)\n const displayName = user.name ?? user.email\n\n return (\n <div\n dir={dir}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t('locked', language)}\n className={cn(\n 'fixed inset-0 z-[9999] flex flex-col items-center justify-center',\n 'bg-background/95 backdrop-blur-sm',\n className,\n )}\n >\n <div className=\"flex w-full max-w-sm flex-col items-center gap-5 rounded-2xl border border-border bg-background-surface p-8 shadow-2xl\">\n\n {/* Lock icon */}\n <div\n className=\"flex h-14 w-14 items-center justify-center rounded-full bg-primary/10 text-primary\"\n aria-hidden=\"true\"\n >\n <Lock className=\"h-7 w-7\" strokeWidth={1.75} />\n </div>\n\n {/* Title */}\n <div className=\"flex flex-col items-center gap-1 text-center\">\n <h2 className=\"text-xl font-bold text-foreground\">\n {t('locked', language)}\n </h2>\n <p className=\"text-sm text-muted-foreground\">\n {t('lockedDesc', language)}\n </p>\n </div>\n\n {/* User identity row */}\n <div\n className=\"flex items-center gap-3\"\n aria-label={displayName}\n >\n <Avatar className=\"h-11 w-11 shrink-0\">\n {user.avatarUrl && (\n <AvatarImage src={user.avatarUrl} alt={displayName} />\n )}\n <AvatarFallback className=\"text-sm font-semibold\" aria-hidden=\"true\">\n {userInitials}\n </AvatarFallback>\n </Avatar>\n <div className=\"flex min-w-0 flex-col\">\n <span className=\"truncate text-sm font-medium text-foreground\">\n {displayName}\n </span>\n <span className=\"truncate text-xs text-muted-foreground\" dir=\"ltr\">\n {user.email}\n </span>\n </div>\n </div>\n\n {/* Form */}\n <form\n className=\"flex w-full flex-col gap-4\"\n onSubmit={(e) => void handleSubmit(e)}\n aria-disabled={isForceLoggedOut || isLockedOut}\n >\n {/* Password field */}\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"unlock-password\" className=\"text-sm font-medium\">\n {t('password', language)}\n </Label>\n {/* PasswordInput is a sentra-ui component with show/hide toggle */}\n <PasswordInput\n id=\"unlock-password\"\n ref={passwordRef}\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n disabled={isSubmitting || isLockedOut || isForceLoggedOut}\n autoComplete=\"current-password\"\n lang={language}\n />\n </div>\n\n {/* TOTP field — shown when hasTOTP=true or after totp_required error */}\n {showTOTP && (\n <div className=\"flex flex-col gap-2\">\n <Label className=\"flex items-center gap-1.5 text-sm font-medium\">\n <ShieldCheck className=\"h-3.5 w-3.5 text-muted-foreground\" aria-hidden=\"true\" />\n {t('totpLabel', language)}\n </Label>\n <OTPBoxGroup\n value={totp}\n onChange={setTotp}\n onComplete={handleTOTPComplete}\n disabled={isSubmitting || isLockedOut || isForceLoggedOut}\n ariaLabel={t('totpLabel', language)}\n />\n </div>\n )}\n\n {/* Error message */}\n {errorMsg && (\n <p\n role=\"alert\"\n className={cn(\n 'text-center text-sm',\n isLockedOut || isForceLoggedOut\n ? 'font-medium text-destructive'\n : 'text-destructive',\n )}\n >\n {errorMsg}\n </p>\n )}\n\n {/* Unlock button — hidden when force-logged out */}\n {!isLockedOut && !isForceLoggedOut && (\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={!password || isSubmitting}\n aria-busy={isSubmitting}\n >\n {isSubmitting ? t('unlocking', language) : t('unlock', language)}\n </Button>\n )}\n </form>\n\n {/* Switch account link — always visible */}\n <button\n type=\"button\"\n onClick={onSignOut}\n className=\"flex items-center gap-1.5 text-xs text-muted-foreground transition-colors duration-fast ease-standard hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:rounded-sm\"\n >\n <LogOut className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {t('switchAccount', language)}\n </button>\n </div>\n </div>\n )\n}\n\nPasswordLockScreen.displayName = 'PasswordLockScreen'\n\nexport default PasswordLockScreen\n","'use client'\n\n// AppSidebar — ported from app/src/components/layout/AppSidebar.tsx\n//\n// Adaptation notes:\n// useAuth → user + profile + isLoading + onSignOut props\n// useLanguage → language + isRTL props\n// useTenantBranding → appName + logo props (U1's BrandingProvider supplies CSS vars;\n// header consumes them — here we accept them as direct props so\n// the sidebar is standalone without a context dependency)\n// useConversations → conversations + isConversationsLoading props (optional; if not\n// supplied the ChatsSection is hidden — caller can inject their own)\n// usePathname / useRouter → not imported; navigation is handled via onNavigate callback\n// or hrefs supplied in navItems\n// Link (next/link) → replaced by <a> tags (product-layer provides Next.js;\n// we keep href strings and an onNavigate seam)\n// Sidebar primitives → from ../ui/sidebar (already in sentra-ui)\n\nimport { useState } from 'react'\nimport {\n PanelLeftClose,\n PanelLeftOpen,\n LogOut,\n Shield,\n ChevronDown,\n Sparkles,\n ChartArea,\n Search,\n SquarePen,\n MessageCircle,\n} from 'lucide-react'\nimport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarHeader,\n useSidebar,\n} from '../ui/sidebar'\nimport { Avatar, AvatarFallback, AvatarImage } from '../ui/avatar'\nimport { Button } from '../ui/button'\nimport { Skeleton } from '../ui/skeleton'\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip'\nimport { cn } from '../../lib/utils'\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ntype ActiveTab = 'assistant' | 'analysis'\n\nexport interface SidebarUser {\n email: string | null\n displayName: string | null\n avatarUrl?: string\n}\n\nexport interface SidebarConversation {\n id: string\n title_en: string\n title_ar?: string | null\n}\n\nexport interface AppSidebarProps {\n /** Locale */\n language: 'en' | 'ar'\n isRTL: boolean\n /** Branding — from BrandingProvider (U1) or direct props */\n appName?: string\n logo?: string\n /** Auth */\n user?: SidebarUser | null\n isAuthLoading?: boolean\n onSignOut?: () => void | Promise<void>\n /** Navigation callbacks — product layer provides these */\n onNavigate?: (href: string) => void\n /** Current pathname — used to highlight active tab and conversations */\n currentPathname?: string\n /** Chat / conversation data (optional — hides the section when absent) */\n conversations?: SidebarConversation[]\n isConversationsLoading?: boolean\n /** Tab hrefs */\n assistantHref?: string\n analysisHref?: string\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst isArabicText = (text: string): boolean => /[؀-ۿ]/.test(text)\n\nconst getUserInitials = (displayName: string | null, email: string | null): string => {\n if (displayName) {\n return displayName\n .split(' ')\n .map((n) => n.charAt(0))\n .join('')\n .toUpperCase()\n .slice(0, 2)\n }\n if (email) return email.charAt(0).toUpperCase()\n return 'U'\n}\n\n// ---------------------------------------------------------------------------\n// SidebarLogo\n// ---------------------------------------------------------------------------\n\nconst SidebarLogo = ({\n appName,\n logo,\n onNavigate,\n assistantHref,\n language = 'en',\n}: {\n appName: string\n logo?: string\n onNavigate?: (href: string) => void\n assistantHref: string\n language?: 'en' | 'ar'\n}) => {\n const { open, isMobile, toggleSidebar } = useSidebar()\n const isSidebarOpen = open || isMobile\n const initial = (appName[0] || 'S').toUpperCase()\n\n const handleLogoClick = (e: React.MouseEvent) => {\n e.preventDefault()\n onNavigate?.(assistantHref)\n }\n\n if (isSidebarOpen) {\n return (\n <header className=\"flex items-center justify-between w-full\">\n <a\n href={assistantHref}\n onClick={handleLogoClick}\n className=\"flex items-center gap-2 min-w-0\"\n >\n {logo ? (\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-white px-0.5\">\n <img\n src={logo}\n alt={appName}\n className=\"max-h-6 max-w-full object-contain\"\n onError={(e) => {\n ;(e.currentTarget as HTMLImageElement).style.display = 'none'\n }}\n />\n </div>\n ) : (\n <div className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-primary\">\n <Shield className=\"h-4 w-4 text-primary-foreground\" />\n </div>\n )}\n <span className=\"text-base font-semibold tracking-tight truncate\">{appName}</span>\n </a>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 w-8 shrink-0 p-0 hover:bg-muted cursor-pointer\"\n onClick={toggleSidebar}\n aria-label={language === 'ar' ? 'طي الشريط الجانبي' : 'Collapse sidebar'}\n >\n <PanelLeftClose className=\"h-4 w-4 text-muted-foreground\" />\n </Button>\n </header>\n )\n }\n\n return (\n <header className=\"flex flex-col items-center justify-center gap-2\">\n <a\n href={assistantHref}\n onClick={handleLogoClick}\n className=\"flex items-center justify-center\"\n aria-label={appName}\n >\n {logo ? (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-white px-0.5\">\n <img\n src={logo}\n alt={appName}\n className=\"max-h-6 max-w-full object-contain\"\n onError={(e) => {\n ;(e.currentTarget as HTMLImageElement).style.display = 'none'\n }}\n />\n </div>\n ) : (\n <div className=\"flex h-8 w-8 items-center justify-center rounded-md bg-primary\">\n <span className=\"text-xs font-bold text-primary-foreground\">{initial}</span>\n </div>\n )}\n </a>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 w-8 p-0 hover:bg-muted cursor-pointer\"\n onClick={toggleSidebar}\n aria-label={language === 'ar' ? 'توسيع الشريط الجانبي' : 'Expand sidebar'}\n >\n <PanelLeftOpen className=\"h-4 w-4 text-muted-foreground\" />\n </Button>\n </header>\n )\n}\nSidebarLogo.displayName = 'SidebarLogo'\n\n// ---------------------------------------------------------------------------\n// NavigationTabs\n// ---------------------------------------------------------------------------\n\nconst NavigationTabs = ({\n activeTab,\n onTabChange,\n language,\n isRTL,\n onNavigate,\n assistantHref,\n analysisHref,\n}: {\n activeTab: ActiveTab\n onTabChange: (tab: ActiveTab) => void\n language: 'en' | 'ar'\n isRTL: boolean\n onNavigate?: (href: string) => void\n assistantHref: string\n analysisHref: string\n}) => {\n const { open, isMobile } = useSidebar()\n const isSidebarOpen = open || isMobile\n\n const tabs: {\n id: ActiveTab\n labelEn: string\n labelAr: string\n icon: React.ComponentType<{ className?: string }>\n href: string\n }[] = [\n { id: 'assistant', labelEn: 'Assistant', labelAr: 'المساعد', icon: Sparkles, href: assistantHref },\n { id: 'analysis', labelEn: 'Analysis', labelAr: 'التحليل', icon: ChartArea, href: analysisHref },\n ]\n\n return (\n <nav aria-label=\"Primary navigation\">\n <div\n className={cn(\n isSidebarOpen\n ? 'flex flex-row gap-1 p-1 bg-slate-100 dark:bg-slate-800 rounded-sm'\n : 'flex flex-col gap-1',\n )}\n >\n {tabs.map((tab) => {\n const Icon = tab.icon\n const isActive = activeTab === tab.id\n const label = language === 'ar' ? tab.labelAr : tab.labelEn\n\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault()\n onTabChange(tab.id)\n onNavigate?.(tab.href)\n }\n\n const tabContent = (\n <a\n href={tab.href}\n onClick={handleClick}\n className={cn(\n 'flex items-center justify-center rounded-md py-2 transition-colors duration-fast ease-standard',\n isSidebarOpen ? 'flex-1 gap-2 px-3' : 'w-full px-2',\n isActive\n ? 'bg-background text-primary shadow-sm'\n : 'text-muted-foreground hover:text-foreground hover:bg-background/60',\n )}\n aria-current={isActive ? 'page' : undefined}\n >\n <Icon className=\"h-4 w-4 shrink-0\" />\n {isSidebarOpen && (\n <span className={cn('text-sm font-medium', isRTL ? 'text-right' : 'text-left')}>\n {label}\n </span>\n )}\n </a>\n )\n\n if (!isSidebarOpen) {\n return (\n <Tooltip key={tab.id}>\n <TooltipTrigger asChild>{tabContent}</TooltipTrigger>\n <TooltipContent\n side={isRTL ? 'left' : 'right'}\n className=\"bg-popover text-popover-foreground border border-border text-sm\"\n >\n {label}\n </TooltipContent>\n </Tooltip>\n )\n }\n\n return <div key={tab.id}>{tabContent}</div>\n })}\n </div>\n </nav>\n )\n}\nNavigationTabs.displayName = 'NavigationTabs'\n\n// ---------------------------------------------------------------------------\n// SearchAndReports\n// ---------------------------------------------------------------------------\n\nconst SearchAndReports = ({\n language,\n isRTL,\n onNavigate,\n assistantHref,\n}: {\n language: 'en' | 'ar'\n isRTL: boolean\n onNavigate?: (href: string) => void\n assistantHref: string\n}) => {\n const { open, isMobile } = useSidebar()\n const isSidebarOpen = open || isMobile\n\n const items = [\n {\n id: 'search',\n labelEn: 'Search',\n labelAr: 'البحث',\n icon: Search,\n href: `${assistantHref}?mode=search`,\n },\n {\n id: 'new-chat',\n labelEn: 'New Chat',\n labelAr: 'محادثة جديدة',\n icon: SquarePen,\n href: assistantHref,\n },\n ]\n\n return (\n <div className=\"flex flex-col gap-1\">\n {items.map((item) => {\n const Icon = item.icon\n const label = language === 'ar' ? item.labelAr : item.labelEn\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault()\n onNavigate?.(item.href)\n }\n\n const content = (\n <a\n key={item.id}\n href={item.href}\n onClick={handleClick}\n className={cn(\n 'flex items-center rounded-md transition-colors duration-fast ease-standard hover:bg-muted cursor-pointer w-full',\n isSidebarOpen ? 'gap-2 p-2' : 'justify-center p-2',\n )}\n >\n <Icon className={cn('shrink-0', isSidebarOpen ? 'h-4 w-4' : 'h-5 w-5')} />\n {isSidebarOpen && (\n <span className={cn('text-sm text-foreground', isRTL ? 'text-right' : 'text-left')}>\n {label}\n </span>\n )}\n </a>\n )\n\n if (!isSidebarOpen) {\n return (\n <Tooltip key={item.id}>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent\n side={isRTL ? 'left' : 'right'}\n className=\"bg-popover text-popover-foreground border border-border text-sm\"\n >\n {label}\n </TooltipContent>\n </Tooltip>\n )\n }\n\n return content\n })}\n </div>\n )\n}\nSearchAndReports.displayName = 'SearchAndReports'\n\n// ---------------------------------------------------------------------------\n// ChatsSection\n// ---------------------------------------------------------------------------\n\nconst ChatsSection = ({\n language,\n conversations,\n isLoading,\n currentPathname,\n onNavigate,\n chatBaseHref,\n}: {\n language: 'en' | 'ar'\n conversations?: SidebarConversation[]\n isLoading?: boolean\n currentPathname?: string\n onNavigate?: (href: string) => void\n chatBaseHref: string\n}) => {\n const [isCollapsed, setIsCollapsed] = useState(false)\n\n const handleToggleCollapse = () => {\n setIsCollapsed((prev) => !prev)\n }\n\n return (\n <section className=\"flex flex-col gap-2\">\n <button\n onClick={handleToggleCollapse}\n className=\"flex items-center gap-2 px-1 text-xs text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard cursor-pointer\"\n aria-expanded={!isCollapsed}\n aria-label={isCollapsed ? 'Expand conversations' : 'Collapse conversations'}\n >\n <span className=\"flex-1 text-start\">\n {language === 'ar' ? 'المحادثات الأخيرة' : 'Recent Conversations'}\n </span>\n <ChevronDown\n className={cn(\n 'h-3 w-3 shrink-0 transition-transform duration-200',\n isCollapsed ? '-rotate-90' : 'rotate-0',\n )}\n />\n </button>\n\n {!isCollapsed && (\n <div className=\"flex flex-col gap-0.5\">\n {isLoading &&\n Array.from({ length: 6 }).map((_, i) => (\n <Skeleton key={i} className=\"h-7 w-full rounded-md\" />\n ))}\n\n {!isLoading &&\n conversations?.map((chat) => {\n const title =\n language === 'ar' && chat.title_ar ? chat.title_ar : chat.title_en\n const isArabic = isArabicText(title)\n const href = `${chatBaseHref}/${chat.id}`\n const isActive =\n currentPathname === href || currentPathname?.startsWith(`${href}/`)\n\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault()\n onNavigate?.(href)\n }\n\n return (\n <a\n key={chat.id}\n href={href}\n onClick={handleClick}\n className={cn(\n 'flex items-center gap-2 rounded-md px-2 py-1.5 text-sm transition-colors duration-fast ease-standard group',\n isActive\n ? 'bg-primary/10 text-primary'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground',\n )}\n >\n <MessageCircle className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate text-xs\" dir={isArabic ? 'rtl' : 'ltr'}>\n {title}\n </span>\n </a>\n )\n })}\n\n {!isLoading && (!conversations || conversations.length === 0) && (\n <p className=\"px-2 py-1.5 text-xs text-muted-foreground\">\n {language === 'ar' ? 'لا توجد محادثات بعد' : 'No conversations yet'}\n </p>\n )}\n </div>\n )}\n </section>\n )\n}\nChatsSection.displayName = 'ChatsSection'\n\n// ---------------------------------------------------------------------------\n// UserProfile\n// ---------------------------------------------------------------------------\n\nconst UserProfile = ({\n user,\n isLoading,\n onSignOut,\n isRTL,\n}: {\n user?: SidebarUser | null\n isLoading?: boolean\n onSignOut?: () => void | Promise<void>\n isRTL: boolean\n}) => {\n const { open, isMobile } = useSidebar()\n const [isSigningOut, setIsSigningOut] = useState(false)\n const isSidebarOpen = open || isMobile\n\n const handleSignOut = async () => {\n setIsSigningOut(true)\n try {\n await onSignOut?.()\n } catch (error) {\n console.error('[UserProfile]', 'Sign out error', error)\n setIsSigningOut(false)\n }\n }\n\n if (isLoading) {\n return (\n <div\n className={cn(\n 'flex items-center rounded-lg border border-border',\n isSidebarOpen ? 'justify-between p-3' : 'justify-center p-1',\n )}\n >\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"h-8 w-8 rounded-full\" />\n {isSidebarOpen && (\n <div className=\"flex flex-col gap-1\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-3 w-32\" />\n </div>\n )}\n </div>\n {isSidebarOpen && <Skeleton className=\"h-8 w-8 rounded\" />}\n </div>\n )\n }\n\n const displayName = user?.displayName ?? null\n const email = user?.email ?? null\n const avatarUrl = user?.avatarUrl ?? ''\n\n return (\n <div\n className={cn(\n 'flex items-center rounded-lg border border-border bg-card',\n isSidebarOpen ? 'justify-between p-3' : 'justify-center p-1',\n )}\n >\n <div className=\"flex items-center gap-3 min-w-0 flex-1\">\n <Avatar className=\"h-8 w-8 shrink-0\">\n <AvatarImage src={avatarUrl} alt=\"User avatar\" />\n <AvatarFallback className=\"text-xs\">\n {getUserInitials(displayName, email)}\n </AvatarFallback>\n </Avatar>\n\n {isSidebarOpen && (\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-sm font-medium truncate text-foreground\">\n {displayName ?? (isRTL ? 'مستخدم' : 'User')}\n </span>\n <Tooltip>\n <TooltipTrigger asChild>\n <span\n className=\"text-xs text-muted-foreground truncate cursor-default\"\n dir=\"ltr\"\n >\n {email}\n </span>\n </TooltipTrigger>\n <TooltipContent className=\"bg-popover text-popover-foreground border border-border text-sm max-w-[280px] break-all\">\n {email}\n </TooltipContent>\n </Tooltip>\n </div>\n )}\n </div>\n\n {isSidebarOpen && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-8 w-8 shrink-0 p-0 ms-2 cursor-pointer\"\n onClick={handleSignOut}\n disabled={isSigningOut}\n title={isRTL ? 'تسجيل الخروج' : 'Sign out'}\n >\n <LogOut\n className={cn('h-4 w-4 text-muted-foreground', isRTL && 'rotate-180')}\n />\n </Button>\n )}\n </div>\n )\n}\nUserProfile.displayName = 'UserProfile'\n\n// ---------------------------------------------------------------------------\n// AppSidebar\n// ---------------------------------------------------------------------------\n\nconst AppSidebar = ({\n language,\n isRTL,\n appName = 'Sentra',\n logo,\n user,\n isAuthLoading,\n onSignOut,\n onNavigate,\n currentPathname,\n conversations,\n isConversationsLoading,\n assistantHref = '/chat',\n analysisHref = '/analysis',\n}: AppSidebarProps) => {\n const { open, isMobile } = useSidebar()\n const isSidebarOpen = open || isMobile\n\n const getActiveTab = (): ActiveTab => {\n if (currentPathname?.startsWith('/analysis')) return 'analysis'\n return 'assistant'\n }\n\n const [activeTab, setActiveTab] = useState<ActiveTab>(getActiveTab)\n\n const handleTabChange = (tab: ActiveTab) => {\n setActiveTab(tab)\n }\n\n return (\n <Sidebar\n side={isRTL ? 'right' : 'left'}\n collapsible=\"icon\"\n className={cn('border-border bg-card', isSidebarOpen ? 'px-3' : 'px-1', 'py-4')}\n >\n {/* Header: logo + toggle */}\n <SidebarHeader className=\"py-3 px-0 border-b border-border\">\n <SidebarLogo\n appName={appName}\n logo={logo}\n onNavigate={onNavigate}\n assistantHref={assistantHref}\n language={language}\n />\n </SidebarHeader>\n\n {/* Content: tabs + assistant tools + chat list */}\n <SidebarContent\n className={cn(\n 'pt-4 space-y-3',\n '[&::-webkit-scrollbar]:w-1.5',\n '[&::-webkit-scrollbar-track]:rounded-full',\n '[&::-webkit-scrollbar-track]:bg-transparent',\n '[&::-webkit-scrollbar-thumb]:rounded-full',\n '[&::-webkit-scrollbar-thumb]:bg-border',\n )}\n >\n <NavigationTabs\n activeTab={activeTab}\n onTabChange={handleTabChange}\n language={language}\n isRTL={isRTL}\n onNavigate={onNavigate}\n assistantHref={assistantHref}\n analysisHref={analysisHref}\n />\n\n {activeTab === 'assistant' && (\n <>\n <SearchAndReports\n language={language}\n isRTL={isRTL}\n onNavigate={onNavigate}\n assistantHref={assistantHref}\n />\n {isSidebarOpen && (\n <div className=\"pt-2 border-t border-border\">\n <ChatsSection\n language={language}\n conversations={conversations}\n isLoading={isConversationsLoading}\n currentPathname={currentPathname}\n onNavigate={onNavigate}\n chatBaseHref={assistantHref}\n />\n </div>\n )}\n </>\n )}\n </SidebarContent>\n\n {/* Footer: user profile */}\n <SidebarFooter className=\"px-0 pt-3 border-t border-border\">\n <UserProfile\n user={user}\n isLoading={isAuthLoading}\n onSignOut={onSignOut}\n isRTL={isRTL}\n />\n </SidebarFooter>\n </Sidebar>\n )\n}\n\nAppSidebar.displayName = 'AppSidebar'\n\nexport { AppSidebar }\nexport default AppSidebar","'use client'\n\n// AppPageShell — ported from app/src/components/layout/AppPageShell.tsx\n//\n// Adaptation notes:\n// useAuth → isAuthenticated + isAuthLoading + onUnauthenticated props\n// useNavigationState → currentView + scope + onViewChange + onScopeChange props\n// useLanguage → isRTL prop\n// UnifiedTopNav → topNavSlot prop (product layer provides the full nav component)\n// CriticalAlertsBar / NewsChannelBanner / NotificationTicker / BreakingNewsTicker\n// → realtimeSlotsTop + realtimeSlotsBottom props\n// (product layer injects the live banners; sentra-ui is unaware of data)\n// next/navigation → onUnauthenticated callback (no hard Next.js dep here)\n\nimport React from 'react'\n\nexport interface AppPageShellProps {\n children: React.ReactNode\n /** Whether the current layout direction is RTL */\n isRTL: boolean\n /** Called when auth check fails — product layer does the redirect */\n isAuthenticated?: boolean\n isAuthLoading?: boolean\n onUnauthenticated?: () => void\n /** Full nav element rendered above content (UnifiedTopNav in app layer) */\n topNavSlot?: React.ReactNode\n /** Slots for real-time banners rendered between nav and main content\n * (CriticalAlertsBar, NewsChannelBanner, NotificationTicker) */\n realtimeSlotsTop?: React.ReactNode\n /** Slot for the footer ticker (BreakingNewsTicker) */\n realtimeSlotBottom?: React.ReactNode\n /** Backward-compat: copilotSeeds (unused) */\n copilotSeeds?: string[]\n}\n\nconst AppPageShell = ({\n children,\n isRTL,\n isAuthenticated,\n isAuthLoading,\n onUnauthenticated,\n topNavSlot,\n realtimeSlotsTop,\n realtimeSlotBottom,\n // copilotSeeds accepted for backward-compat but not used\n copilotSeeds: _copilotSeeds,\n}: AppPageShellProps) => {\n // Auth gate — product layer handles the actual redirect\n React.useEffect(() => {\n if (!isAuthLoading && isAuthenticated === false) {\n onUnauthenticated?.()\n }\n }, [isAuthLoading, isAuthenticated, onUnauthenticated])\n\n if (isAuthLoading) {\n return (\n <div className=\"h-screen flex items-center justify-center bg-background\">\n <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-primary mx-auto\" />\n </div>\n )\n }\n\n if (isAuthenticated === false) {\n return null\n }\n\n return (\n <div className=\"min-h-screen bg-background flex flex-col\" dir={isRTL ? 'rtl' : 'ltr'}>\n {topNavSlot}\n {realtimeSlotsTop}\n <main className=\"flex-1 overflow-y-auto\">{children}</main>\n {realtimeSlotBottom}\n </div>\n )\n}\n\nAppPageShell.displayName = 'AppPageShell'\n\nexport { AppPageShell }\nexport default AppPageShell","'use client'\n\n// ViewToggle — ported from app/src/components/navigation/ViewToggle.tsx\n//\n// Adaptation notes:\n// framer-motion → NOT available in sentra-ui deps; animated pill replaced\n// with a CSS transition approach (no layout animation)\n// useRouter / usePathname → onViewChange callback + currentPathname prop\n// useLanguage → language prop\n// useIsMobile → isMobile prop\n// @/lib/navigation types → inlined here as simple string literals\n\nimport { LayoutGrid, Star, FolderKanban } from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\nexport type View = 'foryou' | 'dashboard' | 'projects'\n\ninterface ViewDefinition {\n id: View\n icon: React.ComponentType<{ className?: string }>\n labelEn: string\n labelAr: string\n path: string\n}\n\nconst VIEWS: ViewDefinition[] = [\n { id: 'foryou', icon: Star, labelEn: 'For You', labelAr: 'لك', path: '/for-you' },\n { id: 'dashboard', icon: LayoutGrid, labelEn: 'Dashboard', labelAr: 'اللوحة', path: '/dashboard' },\n { id: 'projects', icon: FolderKanban, labelEn: 'Projects', labelAr: 'المشاريع', path: '/projects' },\n]\n\nexport interface ViewToggleProps {\n currentView?: View\n language: 'en' | 'ar'\n isMobile?: boolean\n /** Current URL path — used to derive active view */\n currentPathname?: string\n /** Called with the new view when the user clicks */\n onViewChange: (view: View) => void\n /** Called to navigate to a path */\n onNavigate?: (path: string) => void\n}\n\nconst ViewToggle = ({\n language,\n isMobile,\n currentPathname,\n currentView,\n onViewChange,\n onNavigate,\n}: ViewToggleProps) => {\n // Derive active view from pathname (same logic as original)\n const activeView =\n VIEWS.find((v) => currentPathname?.startsWith(v.path))?.id ??\n currentView ??\n 'dashboard'\n\n const handleClick = (view: ViewDefinition) => {\n onNavigate?.(view.path)\n if (activeView !== view.id) {\n onViewChange(view.id)\n }\n }\n\n return (\n <div className=\"flex items-center gap-0.5 bg-muted/50 rounded-lg p-0.5\">\n {VIEWS.map((view) => {\n const Icon = view.icon\n const isActive = activeView === view.id\n const label = language === 'ar' ? view.labelAr : view.labelEn\n\n return (\n <button\n key={view.id}\n onClick={() => handleClick(view)}\n className={cn(\n 'relative flex items-center gap-1.5 px-2 sm:px-3 py-1.5 text-sm font-medium rounded-md transition-colors duration-fast ease-standard',\n isActive\n ? 'bg-primary text-primary-foreground'\n : 'text-muted-foreground hover:text-foreground',\n )}\n >\n <Icon className=\"relative z-10 w-4 h-4\" />\n {!isMobile && <span className=\"relative z-10\">{label}</span>}\n </button>\n )\n })}\n </div>\n )\n}\n\nViewToggle.displayName = 'ViewToggle'\n\nexport { ViewToggle }\nexport default ViewToggle","'use client'\n\n/**\n * RouteProgress — a thin top-of-viewport progress bar that animates on every\n * route change.\n *\n * Why: the product dashboards are client components ('use client' pages that\n * fetch in useEffect), so Next's `loading.tsx` Suspense boundary only flashes\n * on the initial server navigation — between client-side page transitions there\n * was NO visible loading indicator. This bar fills the gap: it shows a brand\n * progress bar whenever the `pathname` prop changes and completes shortly after.\n *\n * Framework-agnostic: @prism/ui has NO `next` dependency, so this component\n * does NOT import `next/navigation`. The consuming app passes the current path\n * via the `pathname` prop (e.g. `<RouteProgress pathname={usePathname()} />`).\n * Mount it ONCE near the root of each product (inside LanguageProvider/layout).\n *\n * Operator request 2026-06-05: \"loader between pages\" was missing on all products.\n */\n\nimport { useEffect, useRef, useState } from 'react'\n\nexport interface RouteProgressProps {\n /**\n * The current route path. Pass `usePathname()` from the app. Whenever this\n * value changes the bar animates. Required — the app owns the router binding.\n */\n pathname: string\n /** Bar height in px. Default 2. */\n height?: number\n}\n\nconst RouteProgress = ({ pathname, height = 2 }: RouteProgressProps) => {\n const [visible, setVisible] = useState(false)\n const [width, setWidth] = useState(0)\n const firstRender = useRef(true)\n const timers = useRef<ReturnType<typeof setTimeout>[]>([])\n\n useEffect(() => {\n // Skip the very first mount — only animate on actual navigations.\n if (firstRender.current) {\n firstRender.current = false\n return\n }\n\n // Clear any in-flight timers from a previous transition.\n timers.current.forEach(clearTimeout)\n timers.current = []\n\n // Start: show + ramp up to ~90% quickly (trickle), then complete + hide.\n setVisible(true)\n setWidth(10)\n timers.current.push(setTimeout(() => setWidth(70), 50))\n timers.current.push(setTimeout(() => setWidth(90), 250))\n timers.current.push(setTimeout(() => setWidth(100), 500))\n timers.current.push(\n setTimeout(() => {\n setVisible(false)\n setWidth(0)\n }, 750),\n )\n\n return () => {\n timers.current.forEach(clearTimeout)\n timers.current = []\n }\n }, [pathname])\n\n return (\n <div\n aria-hidden=\"true\"\n style={{\n position: 'fixed',\n top: 0,\n insetInlineStart: 0,\n width: `${width}%`,\n height: `${height}px`,\n opacity: visible ? 1 : 0,\n transition: 'width 200ms ease-out, opacity 200ms ease-out',\n zIndex: 9999,\n pointerEvents: 'none',\n }}\n className=\"bg-primary\"\n />\n )\n}\n\nRouteProgress.displayName = 'RouteProgress'\n\nexport { RouteProgress }\nexport default RouteProgress\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport {\n SidebarProvider, Sidebar, SidebarHeader, SidebarContent, SidebarFooter,\n SidebarGroup, SidebarGroupLabel, SidebarMenu, SidebarMenuItem, SidebarMenuButton,\n SidebarInset, SidebarTrigger,\n} from \"../ui/sidebar\";\n\nexport interface AppNavItem {\n key: string;\n label: string;\n icon?: React.ReactNode;\n badge?: React.ReactNode;\n active?: boolean;\n}\nexport interface AppNavGroup {\n label?: string;\n items: AppNavItem[];\n}\nexport interface AppBrand {\n name: string;\n subtitle?: string;\n icon?: React.ReactNode;\n primary?: string;\n}\n\nexport interface AppHeaderProps {\n /** Renders a sidebar collapse trigger at the start. */\n withSidebarTrigger?: boolean;\n title?: React.ReactNode;\n /** Center slot (e.g. a search box). */\n center?: React.ReactNode;\n /** End slot (e.g. actions, user menu, realtime dot). */\n end?: React.ReactNode;\n className?: string;\n}\n\n/** AppHeader — a product-agnostic top bar: optional sidebar trigger + title (start),\n * an optional center slot, and an end slot (actions / user menu). Token-themed, RTL. */\nexport function AppHeader({ withSidebarTrigger, title, center, end, className }: AppHeaderProps) {\n return (\n <header className={cn(\"flex h-14 shrink-0 items-center gap-3 border-b border-border bg-background/80 px-4 backdrop-blur\", className)}>\n <div className=\"flex min-w-0 items-center gap-2\">\n {withSidebarTrigger && <SidebarTrigger />}\n {title && <div className=\"truncate font-semibold\">{title}</div>}\n </div>\n {center && <div className=\"mx-auto hidden max-w-md flex-1 md:block\">{center}</div>}\n {end && <div className=\"ms-auto flex items-center gap-2\">{end}</div>}\n </header>\n );\n}\n\nexport interface AppLayoutProps {\n brand: AppBrand;\n nav: AppNavGroup[];\n onNavigate?: (key: string) => void;\n /** Footer nav (e.g. Profile / Settings). */\n footer?: AppNavGroup;\n /** Header slots. */\n headerTitle?: React.ReactNode;\n headerCenter?: React.ReactNode;\n headerEnd?: React.ReactNode;\n /** Optional floating slot inside the content (e.g. a copilot launcher). */\n assistant?: React.ReactNode;\n language?: \"en\" | \"ar\";\n defaultSidebarOpen?: boolean;\n children: React.ReactNode;\n className?: string;\n}\n\nfunction NavGroup({ group, onNavigate }: { group: AppNavGroup; onNavigate?: (k: string) => void }) {\n return (\n <SidebarGroup>\n {group.label && <SidebarGroupLabel>{group.label}</SidebarGroupLabel>}\n <SidebarMenu>\n {group.items.map((item) => (\n <SidebarMenuItem key={item.key}>\n <SidebarMenuButton isActive={item.active} tooltip={item.label} onClick={() => onNavigate?.(item.key)}>\n {item.icon}\n <span className=\"truncate\">{item.label}</span>\n {item.badge != null && <span className=\"ms-auto\">{item.badge}</span>}\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroup>\n );\n}\n\n/** AppLayout — the full app shell: a collapsible sidebar (brand + nav groups + footer)\n * + a top header + content area. Built on the kit Sidebar primitives. Responsive\n * (off-canvas on mobile), RTL-aware, token-themed. */\nexport function AppLayout({\n brand, nav, onNavigate, footer, headerTitle, headerCenter, headerEnd, assistant,\n language = \"en\", defaultSidebarOpen = true, children, className,\n}: AppLayoutProps) {\n const primary = brand.primary || \"hsl(var(--primary))\";\n return (\n <SidebarProvider defaultOpen={defaultSidebarOpen} dir={language === \"ar\" ? \"rtl\" : \"ltr\"}>\n <Sidebar side={language === \"ar\" ? \"right\" : \"left\"}>\n <SidebarHeader className=\"border-b border-sidebar-border\">\n <div className=\"flex items-center gap-2 px-2 py-1.5\">\n <span className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-white\" style={{ background: primary }}>\n {brand.icon}\n </span>\n <span className=\"min-w-0 leading-tight\">\n <span className=\"block truncate text-sm font-semibold text-sidebar-foreground\">{brand.name}</span>\n {brand.subtitle && <span className=\"block truncate text-[11px] text-sidebar-foreground/60\">{brand.subtitle}</span>}\n </span>\n </div>\n </SidebarHeader>\n <SidebarContent>\n {nav.map((g, i) => <NavGroup key={i} group={g} onNavigate={onNavigate} />)}\n </SidebarContent>\n {footer && (\n <SidebarFooter className=\"border-t border-sidebar-border\">\n <SidebarMenu>\n {footer.items.map((item) => (\n <SidebarMenuItem key={item.key}>\n <SidebarMenuButton isActive={item.active} tooltip={item.label} onClick={() => onNavigate?.(item.key)}>\n {item.icon}<span className=\"truncate\">{item.label}</span>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarFooter>\n )}\n </Sidebar>\n <SidebarInset className={className}>\n <AppHeader withSidebarTrigger title={headerTitle} center={headerCenter} end={headerEnd} />\n <main className=\"min-w-0 flex-1 overflow-auto\">{children}</main>\n {assistant}\n </SidebarInset>\n </SidebarProvider>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { AppLayout, type AppLayoutProps } from \"./AppLayout\";\n\nexport interface AdminSubNavItem {\n key: string;\n label: string;\n icon?: React.ReactNode;\n}\n\nexport interface AdminLayoutProps extends Omit<AppLayoutProps, \"children\"> {\n /** Secondary section tabs rendered under the header (admin areas). */\n subNav: AdminSubNavItem[];\n activeSubNav?: string;\n onSubNavChange?: (key: string) => void;\n children: React.ReactNode;\n}\n\n/** AdminLayout — AppLayout plus a secondary sub-navigation tab bar under the header,\n * for admin areas (e.g. Users / Roles / Settings / Audit). Token-themed, RTL. */\nexport function AdminLayout({ subNav, activeSubNav, onSubNavChange, children, ...appProps }: AdminLayoutProps) {\n return (\n <AppLayout {...appProps}>\n <div className=\"flex items-center gap-1 overflow-x-auto border-b border-border bg-background px-4\">\n {subNav.map((s) => {\n const active = s.key === activeSubNav;\n return (\n <button\n key={s.key}\n onClick={() => onSubNavChange?.(s.key)}\n className={cn(\n \"flex items-center gap-1.5 whitespace-nowrap border-b-2 px-3 py-2.5 text-sm transition\",\n active ? \"border-primary font-medium text-foreground\" : \"border-transparent text-muted-foreground hover:text-foreground\",\n )}\n >\n {s.icon}{s.label}\n </button>\n );\n })}\n </div>\n <div className=\"p-6\">{children}</div>\n </AppLayout>\n );\n}\n","'use client'\n\n// DynamicIcon — ported from app/src/components/nav/DynamicIcon.tsx\n// Self-contained: lucide-react + boxicons (CSS class) + image URL support.\n// No app-layer dependencies.\n\nimport * as Icons from 'lucide-react'\nimport { Sparkles } from 'lucide-react'\n\ninterface DynamicIconProps {\n name: string | null | undefined\n className?: string\n size?: number\n strokeWidth?: number\n}\n\n/**\n * Renders an icon by name string — supports four icon sources:\n *\n * 1. Image URL (starts with \"http://\", \"https://\", or \"/\"):\n * Renders an <img> sized to match a lucide/boxicon of the same h-N class.\n *\n * 2. Boxicons brand icons — two accepted formats:\n * a. Colon-prefix (canonical): \"bxl:<name>\" → \"bxl-<name>\" CSS class\n * b. Legacy hyphen-prefix: \"bxl-*\" / \"bx-*\"\n * Requires boxicons CSS loaded at the app root.\n *\n * 3. Lucide icons — two accepted formats:\n * a. Colon-prefix (canonical): \"lucide:<kebab-case>\" → PascalCase lookup\n * b. Legacy bare PascalCase (kept for backward-compat)\n * Falls back to <Sparkles> when name is null, empty, or unrecognised.\n */\nconst DynamicIcon = ({ name, className, size, strokeWidth }: DynamicIconProps) => {\n if (!name) {\n return <Sparkles className={className} size={size} strokeWidth={strokeWidth} />\n }\n\n // Image URL branch\n if (name.startsWith('http://') || name.startsWith('https://') || name.startsWith('/')) {\n const px = size ?? hClassToPx(className) ?? 24\n return (\n <img\n src={name}\n alt=\"\"\n className={className}\n style={{ width: px, height: px, objectFit: 'contain', display: 'inline-block' }}\n aria-hidden=\"true\"\n />\n )\n }\n\n // Boxicons branch\n let bxClass: string | null = null\n if (name.startsWith('bxl:') || name.startsWith('bx:')) {\n const colonIdx = name.indexOf(':')\n const prefix = name.slice(0, colonIdx)\n const iconName = name.slice(colonIdx + 1)\n bxClass = `${prefix}-${iconName}`\n } else if (name.startsWith('bxl-') || name.startsWith('bx-')) {\n bxClass = name\n }\n\n if (bxClass !== null) {\n const fontSize = size ?? hClassToPx(className) ?? '1em'\n return (\n <i\n className={`bx ${bxClass}${className ? ` ${className}` : ''}`}\n style={{ fontSize, color: 'currentColor', lineHeight: 1 }}\n aria-hidden=\"true\"\n />\n )\n }\n\n // Lucide branch\n let lucideName = name\n if (name.startsWith('lucide:')) {\n const iconSlug = name.slice(7)\n lucideName = iconSlug\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('')\n }\n\n const Cmp = (Icons as unknown as Record<string, React.ComponentType<React.SVGProps<SVGSVGElement> & { size?: number; strokeWidth?: number }>>)[lucideName]\n\n if (!Cmp) {\n return <Sparkles className={className} size={size} strokeWidth={strokeWidth} />\n }\n\n return <Cmp className={className} size={size} strokeWidth={strokeWidth} />\n}\n\nDynamicIcon.displayName = 'DynamicIcon'\n\nconst H_CLASS_PX: Record<string, number> = {\n 'h-3': 12,\n 'h-4': 16,\n 'h-5': 20,\n 'h-6': 24,\n 'h-7': 28,\n 'h-8': 32,\n 'h-9': 36,\n 'h-10': 40,\n 'h-12': 48,\n 'h-14': 56,\n 'h-16': 64,\n}\n\nfunction hClassToPx(className: string | undefined): number | undefined {\n if (!className) return undefined\n for (const cls of className.split(/\\s+/)) {\n const px = H_CLASS_PX[cls]\n if (px !== undefined) return px\n }\n return undefined\n}\n\nexport { DynamicIcon }\nexport default DynamicIcon\n","\"use client\";\n\nimport * as React from \"react\";\nimport { ShieldCheck, Monitor, LogOut, User, KeyRound, Camera, Check } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"../ui/avatar\";\nimport { Card, CardContent } from \"../ui/card\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { Switch } from \"../ui/switch\";\nimport { Separator } from \"../ui/separator\";\nimport { StatusBadge } from \"../status/StatusBadge\";\n\nexport interface ProfileSession {\n id: string;\n device: string;\n location?: string;\n lastActive: string;\n current?: boolean;\n}\n\nexport interface ProfileViewProps {\n user: { name?: string; email: string; avatarUrl?: string; roles?: string[] };\n language?: \"en\" | \"ar\";\n sessions?: ProfileSession[];\n twoFactorEnabled?: boolean;\n onSave?: (data: { name: string; email: string }) => void;\n onChangePassword?: () => void;\n onToggle2FA?: (enabled: boolean) => void;\n onRevokeSession?: (id: string) => void;\n onChangeAvatar?: () => void;\n}\n\ntype SectionKey = \"account\" | \"security\" | \"sessions\";\n\nconst T = {\n en: {\n title: \"Profile settings\", subtitle: \"Manage your account, security and active sessions.\",\n account: \"Account\", security: \"Security\", sessions: \"Sessions\",\n accountDesc: \"Your public profile and contact details.\",\n securityDesc: \"Password and two-factor authentication.\",\n sessionsDesc: \"Devices currently signed in to your account.\",\n name: \"Name\", email: \"Email\", save: \"Save changes\", saved: \"Saved\",\n avatar: \"Profile photo\", changeAvatar: \"Change photo\",\n password: \"Password\", passwordDesc: \"Set a strong, unique password.\", changePassword: \"Change password\",\n twoFA: \"Two-factor authentication\", twoFADesc: \"Add an extra layer of security to your account.\",\n current: \"This device\", revoke: \"Revoke\", active: (n: number) => `${n} active session${n === 1 ? \"\" : \"s\"}`,\n },\n ar: {\n title: \"إعدادات الملف\", subtitle: \"إدارة حسابك والأمان والجلسات النشطة.\",\n account: \"الحساب\", security: \"الأمان\", sessions: \"الجلسات\",\n accountDesc: \"ملفك العام وبيانات التواصل.\",\n securityDesc: \"كلمة المرور والمصادقة الثنائية.\",\n sessionsDesc: \"الأجهزة المسجّلة الدخول حاليًا إلى حسابك.\",\n name: \"الاسم\", email: \"البريد الإلكتروني\", save: \"حفظ التغييرات\", saved: \"تم الحفظ\",\n avatar: \"صورة الملف\", changeAvatar: \"تغيير الصورة\",\n password: \"كلمة المرور\", passwordDesc: \"اختر كلمة مرور قوية وفريدة.\", changePassword: \"تغيير كلمة المرور\",\n twoFA: \"المصادقة الثنائية\", twoFADesc: \"أضف طبقة حماية إضافية لحسابك.\",\n current: \"هذا الجهاز\", revoke: \"إنهاء\", active: (n: number) => `${n} جلسة نشطة`,\n },\n};\n\nfunction SectionHeader({ title, desc }: { title: string; desc: string }) {\n return (\n <div className=\"mb-4\">\n <h2 className=\"text-lg font-semibold\">{title}</h2>\n <p className=\"text-sm text-muted-foreground\">{desc}</p>\n </div>\n );\n}\n\n/** ProfileView — a real settings screen: a section sidebar (Account / Security / Sessions)\n * beside the active section's content. Product-agnostic (data + callbacks in), RTL + bilingual\n * via `language`, fully token-themed (dark/light). */\nexport function ProfileView({\n user, language = \"en\", sessions = [], twoFactorEnabled = false,\n onSave, onChangePassword, onToggle2FA, onRevokeSession, onChangeAvatar,\n}: ProfileViewProps) {\n const t = T[language];\n const isRTL = language === \"ar\";\n const [section, setSection] = React.useState<SectionKey>(\"account\");\n const [name, setName] = React.useState(user.name ?? \"\");\n const [email, setEmail] = React.useState(user.email);\n const [saved, setSaved] = React.useState(false);\n const initial = (user.name || user.email || \"?\").charAt(0).toUpperCase();\n\n const NAV: { key: SectionKey; label: string; icon: React.ReactNode }[] = [\n { key: \"account\", label: t.account, icon: <User className=\"h-4 w-4\" /> },\n { key: \"security\", label: t.security, icon: <ShieldCheck className=\"h-4 w-4\" /> },\n { key: \"sessions\", label: t.sessions, icon: <Monitor className=\"h-4 w-4\" /> },\n ];\n\n function save() {\n onSave?.({ name, email });\n setSaved(true);\n setTimeout(() => setSaved(false), 1600);\n }\n\n return (\n <div dir={isRTL ? \"rtl\" : \"ltr\"} className=\"mx-auto max-w-5xl p-6\">\n {/* ── Header ── */}\n <header className=\"flex items-center gap-4 rounded-xl border border-border bg-card p-5\">\n <div className=\"relative\">\n <Avatar className=\"h-16 w-16\">\n {user.avatarUrl && <AvatarImage src={user.avatarUrl} alt={user.name ?? user.email} />}\n <AvatarFallback className=\"bg-primary/10 text-lg text-primary\">{initial}</AvatarFallback>\n </Avatar>\n </div>\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"truncate text-xl font-semibold\">{user.name || user.email}</h1>\n <p className=\"truncate text-sm text-muted-foreground\">{user.email}</p>\n </div>\n {user.roles && user.roles.length > 0 && (\n <div className=\"hidden flex-wrap gap-1.5 sm:flex\">\n {user.roles.map((r) => <StatusBadge key={r} tone=\"info\">{r}</StatusBadge>)}\n </div>\n )}\n </header>\n\n {/* ── Body: section sidebar + content ── */}\n <div className=\"mt-6 grid gap-6 md:grid-cols-[220px_1fr]\">\n {/* Sidebar */}\n <nav className=\"flex flex-row gap-1 overflow-x-auto md:flex-col md:overflow-visible\" aria-label={t.title}>\n {NAV.map((item) => {\n const active = section === item.key;\n return (\n <button\n key={item.key}\n onClick={() => setSection(item.key)}\n aria-current={active ? \"page\" : undefined}\n className={cn(\n \"flex items-center gap-2.5 whitespace-nowrap rounded-lg px-3 py-2 text-sm font-medium transition-colors\",\n active ? \"bg-primary/10 text-primary\" : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n )}\n >\n {item.icon}\n <span>{item.label}</span>\n </button>\n );\n })}\n </nav>\n\n {/* Content */}\n <div className=\"min-w-0\">\n {section === \"account\" && (\n <section>\n <SectionHeader title={t.account} desc={t.accountDesc} />\n <Card>\n <CardContent className=\"space-y-5 pt-6\">\n <div className=\"flex items-center gap-4\">\n <Avatar className=\"h-14 w-14\">\n {user.avatarUrl && <AvatarImage src={user.avatarUrl} alt={user.name ?? user.email} />}\n <AvatarFallback className=\"bg-primary/10 text-primary\">{initial}</AvatarFallback>\n </Avatar>\n <div>\n <p className=\"text-sm font-medium\">{t.avatar}</p>\n <Button variant=\"outline\" size=\"sm\" className=\"mt-1.5 gap-1.5\" onClick={onChangeAvatar}>\n <Camera className=\"h-3.5 w-3.5\" />{t.changeAvatar}\n </Button>\n </div>\n </div>\n <Separator />\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"pv-name\">{t.name}</Label>\n <Input id=\"pv-name\" value={name} onChange={(e) => setName(e.target.value)} />\n </div>\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"pv-email\">{t.email}</Label>\n <Input id=\"pv-email\" type=\"email\" value={email} onChange={(e) => setEmail(e.target.value)} />\n </div>\n </div>\n </CardContent>\n </Card>\n <div className=\"mt-4 flex justify-end\">\n <Button onClick={save} className=\"gap-1.5\">\n {saved ? <><Check className=\"h-4 w-4\" />{t.saved}</> : t.save}\n </Button>\n </div>\n </section>\n )}\n\n {section === \"security\" && (\n <section>\n <SectionHeader title={t.security} desc={t.securityDesc} />\n <Card>\n <CardContent className=\"divide-y divide-border pt-2\">\n <div className=\"flex items-center justify-between gap-4 py-4\">\n <div className=\"flex items-start gap-3\">\n <KeyRound className=\"mt-0.5 h-5 w-5 text-muted-foreground\" />\n <div>\n <p className=\"text-sm font-medium\">{t.password}</p>\n <p className=\"text-sm text-muted-foreground\">{t.passwordDesc}</p>\n </div>\n </div>\n <Button variant=\"outline\" onClick={onChangePassword}>{t.changePassword}</Button>\n </div>\n <div className=\"flex items-center justify-between gap-4 py-4\">\n <div className=\"flex items-start gap-3\">\n <ShieldCheck className=\"mt-0.5 h-5 w-5 text-muted-foreground\" />\n <div>\n <p className=\"text-sm font-medium\">{t.twoFA}</p>\n <p className=\"text-sm text-muted-foreground\">{t.twoFADesc}</p>\n </div>\n </div>\n <Switch checked={twoFactorEnabled} onCheckedChange={(v) => onToggle2FA?.(v)} />\n </div>\n </CardContent>\n </Card>\n </section>\n )}\n\n {section === \"sessions\" && (\n <section>\n <SectionHeader title={t.sessions} desc={t.sessionsDesc} />\n <Card>\n <CardContent className=\"space-y-3 pt-6\">\n <p className=\"text-xs font-medium uppercase tracking-wide text-muted-foreground\">{t.active(sessions.length)}</p>\n {sessions.map((s) => (\n <div key={s.id} className=\"flex items-center justify-between gap-4 rounded-lg border border-border p-3\">\n <div className=\"flex items-center gap-3\">\n <span className=\"flex h-9 w-9 items-center justify-center rounded-lg bg-accent text-muted-foreground\">\n <Monitor className=\"h-4 w-4\" />\n </span>\n <div>\n <p className=\"flex items-center gap-2 text-sm font-medium\">\n {s.device}\n {s.current && <StatusBadge tone=\"success\">{t.current}</StatusBadge>}\n </p>\n <p className=\"text-xs text-muted-foreground\">{[s.location, s.lastActive].filter(Boolean).join(\" · \")}</p>\n </div>\n </div>\n {!s.current && (\n <Button variant=\"ghost\" size=\"sm\" className=\"gap-1.5\" onClick={() => onRevokeSession?.(s.id)}>\n <LogOut className=\"h-4 w-4\" />{t.revoke}\n </Button>\n )}\n </div>\n ))}\n </CardContent>\n </Card>\n </section>\n )}\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\";\nimport { Input } from \"../ui/input\";\n\nexport interface ColorPickerProps {\n /** Current color, hex (e.g. \"#7c3aed\"). */\n value: string;\n onChange: (hex: string) => void;\n /** Preset swatches shown in the popover. */\n presets?: string[];\n /** Optional className for the trigger. */\n className?: string;\n disabled?: boolean;\n \"aria-label\"?: string;\n}\n\nconst DEFAULT_PRESETS = [\n \"#7c3aed\", \"#931535\", \"#2563eb\", \"#0891b2\", \"#059669\", \"#16a34a\",\n \"#ca8a04\", \"#ea580c\", \"#dc2626\", \"#db2777\", \"#475569\", \"#0f172a\",\n];\n\nfunction normalizeHex(v: string): string {\n let h = v.trim();\n if (h && !h.startsWith(\"#\")) h = \"#\" + h;\n return h;\n}\n\n/** ColorPicker — a swatch trigger that opens a popover with a native color input,\n * a hex field, and preset swatches. Presentational + controlled. */\nexport function ColorPicker({\n value, onChange, presets = DEFAULT_PRESETS, className, disabled, ...rest\n}: ColorPickerProps) {\n const [text, setText] = React.useState(value);\n React.useEffect(() => setText(value), [value]);\n\n const commitText = () => {\n const h = normalizeHex(text);\n if (/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.test(h)) onChange(h);\n else setText(value);\n };\n\n return (\n <Popover>\n <PopoverTrigger\n disabled={disabled}\n aria-label={rest[\"aria-label\"] ?? \"Pick a color\"}\n className={cn(\n \"inline-flex items-center gap-2 rounded-lg border border-input bg-background px-2.5 py-1.5 text-sm outline-none transition hover:bg-accent disabled:opacity-50\",\n className,\n )}\n >\n <span className=\"h-5 w-5 shrink-0 rounded-md border border-border\" style={{ background: value }} />\n <span className=\"font-mono text-xs uppercase text-muted-foreground\">{value}</span>\n </PopoverTrigger>\n <PopoverContent className=\"w-60 space-y-3\" align=\"start\">\n <div className=\"flex items-center gap-2\">\n <input\n type=\"color\"\n value={/^#[0-9a-fA-F]{6}$/.test(value) ? value : \"#000000\"}\n onChange={(e) => onChange(e.target.value)}\n className=\"h-9 w-9 shrink-0 cursor-pointer rounded-md border border-input bg-transparent p-0.5\"\n aria-label=\"Color wheel\"\n />\n <Input\n value={text}\n onChange={(e) => setText(e.target.value)}\n onBlur={commitText}\n onKeyDown={(e) => e.key === \"Enter\" && commitText()}\n className=\"font-mono uppercase\"\n placeholder=\"#000000\"\n />\n </div>\n <div className=\"grid grid-cols-6 gap-1.5\">\n {presets.map((p) => (\n <button\n key={p}\n type=\"button\"\n onClick={() => onChange(p)}\n aria-label={p}\n className={cn(\n \"h-7 w-7 rounded-md border border-border transition hover:scale-110\",\n value.toLowerCase() === p.toLowerCase() && \"ring-2 ring-ring ring-offset-1 ring-offset-background\",\n )}\n style={{ background: p }}\n />\n ))}\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as Icons from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\";\nimport { Input } from \"../ui/input\";\nimport { ScrollArea } from \"../ui/scroll-area\";\n\nexport interface IconPickerProps {\n /** Current icon name (lucide PascalCase, e.g. \"Sparkles\"). */\n value?: string;\n onChange: (name: string) => void;\n /** Restrict to a custom icon list (defaults to a curated common set). */\n icons?: string[];\n className?: string;\n disabled?: boolean;\n}\n\n// A curated common set so the grid stays usable (lucide ships 1000+).\nconst COMMON: string[] = [\n \"Activity\", \"AlertCircle\", \"Archive\", \"ArrowRight\", \"Bell\", \"Bookmark\", \"Box\", \"Calendar\",\n \"Camera\", \"Check\", \"CheckCircle\", \"ChevronRight\", \"Circle\", \"Clipboard\", \"Clock\", \"Cloud\",\n \"Code\", \"Cog\", \"Command\", \"Compass\", \"Copy\", \"CreditCard\", \"Database\", \"Download\", \"Edit\",\n \"Eye\", \"File\", \"FileText\", \"Filter\", \"Flag\", \"Folder\", \"Gift\", \"Globe\", \"Grid\", \"Hash\",\n \"Heart\", \"Home\", \"Image\", \"Inbox\", \"Info\", \"Key\", \"Layers\", \"Layout\", \"Link\", \"List\", \"Lock\",\n \"Mail\", \"Map\", \"MapPin\", \"Menu\", \"MessageSquare\", \"Mic\", \"Monitor\", \"Moon\", \"MoreHorizontal\",\n \"Move\", \"Music\", \"Package\", \"Paperclip\", \"Pencil\", \"Phone\", \"PieChart\", \"Play\", \"Plus\", \"Power\",\n \"Printer\", \"Radio\", \"RefreshCw\", \"Rocket\", \"Save\", \"Search\", \"Send\", \"Server\", \"Settings\",\n \"Share2\", \"Shield\", \"ShieldCheck\", \"ShoppingCart\", \"Sparkles\", \"Star\", \"Sun\", \"Tag\", \"Target\",\n \"Terminal\", \"Trash2\", \"TrendingUp\", \"Truck\", \"Upload\", \"User\", \"Users\", \"Video\", \"Wallet\",\n \"Wifi\", \"Workflow\", \"Wrench\", \"Zap\",\n];\n\nfunction Glyph({ name, className }: { name: string; className?: string }) {\n const Cmp = (Icons as unknown as Record<string, React.ComponentType<{ className?: string }>>)[name] ?? Icons.Sparkles;\n return <Cmp className={className} />;\n}\n\n/** IconPicker — a button that opens a searchable grid of lucide icons. Controlled\n * by `value` (icon name) + `onChange`. Presentational + token-themed. */\nexport function IconPicker({ value, onChange, icons = COMMON, className, disabled }: IconPickerProps) {\n const [q, setQ] = React.useState(\"\");\n const filtered = React.useMemo(\n () => (q ? icons.filter((n) => n.toLowerCase().includes(q.toLowerCase())) : icons),\n [q, icons],\n );\n\n return (\n <Popover>\n <PopoverTrigger\n disabled={disabled}\n aria-label=\"Pick an icon\"\n className={cn(\n \"inline-flex items-center gap-2 rounded-lg border border-input bg-background px-2.5 py-1.5 text-sm outline-none transition hover:bg-accent disabled:opacity-50\",\n className,\n )}\n >\n <Glyph name={value ?? \"Sparkles\"} className=\"h-4 w-4\" />\n <span className=\"text-xs text-muted-foreground\">{value ?? \"Choose icon\"}</span>\n </PopoverTrigger>\n <PopoverContent className=\"w-64 space-y-2\" align=\"start\">\n <Input value={q} onChange={(e) => setQ(e.target.value)} placeholder=\"Search icons…\" autoFocus />\n <ScrollArea className=\"h-56\">\n <div className=\"grid grid-cols-6 gap-1 pe-2\">\n {filtered.map((n) => (\n <button\n key={n}\n type=\"button\"\n title={n}\n onClick={() => onChange(n)}\n className={cn(\n \"flex h-9 w-9 items-center justify-center rounded-md text-muted-foreground transition hover:bg-accent hover:text-foreground\",\n value === n && \"bg-primary/15 text-primary ring-1 ring-primary/40\",\n )}\n >\n <Glyph name={n} className=\"h-4 w-4\" />\n </button>\n ))}\n {filtered.length === 0 && (\n <p className=\"col-span-6 py-6 text-center text-xs text-muted-foreground\">No icons found</p>\n )}\n </div>\n </ScrollArea>\n </PopoverContent>\n </Popover>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface MapMarker {\n lat: number;\n lng: number;\n label?: string;\n /** Marker color (defaults to the brand primary). */\n color?: string;\n}\n\nexport interface MapViewProps {\n center: [number, number];\n zoom?: number;\n markers?: MapMarker[];\n /** Height of the map container (CSS value). Default 360px. */\n height?: number | string;\n className?: string;\n /** Tile attribution. Defaults to OpenStreetMap. */\n attribution?: string;\n}\n\nconst LEAFLET_CSS = \"https://unpkg.com/leaflet@1.9.4/dist/leaflet.css\";\n\nfunction ensureLeafletCss() {\n if (typeof document === \"undefined\") return;\n if (document.querySelector(`link[data-togo-leaflet]`)) return;\n const link = document.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.href = LEAFLET_CSS;\n link.setAttribute(\"data-togo-leaflet\", \"\");\n document.head.appendChild(link);\n}\n\n/** MapView — a real OpenStreetMap powered by leaflet. SSR-safe (leaflet loads in an\n * effect, client-only). Pass `center`, `zoom`, and `markers`. Themed container; the\n * tiles are OSM raster. */\nexport function MapView({\n center, zoom = 12, markers = [], height = 360, className,\n attribution = '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors',\n}: MapViewProps) {\n const ref = React.useRef<HTMLDivElement>(null);\n const mapRef = React.useRef<any>(null);\n const layerRef = React.useRef<any>(null);\n\n React.useEffect(() => {\n let cancelled = false;\n ensureLeafletCss();\n (async () => {\n const L = (await import(\"leaflet\")).default ?? (await import(\"leaflet\"));\n if (cancelled || !ref.current) return;\n if (!mapRef.current) {\n mapRef.current = L.map(ref.current, { attributionControl: true }).setView(center, zoom);\n L.tileLayer(\"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\", {\n attribution, maxZoom: 19,\n }).addTo(mapRef.current);\n layerRef.current = L.layerGroup().addTo(mapRef.current);\n } else {\n mapRef.current.setView(center, zoom);\n }\n // markers\n layerRef.current.clearLayers();\n for (const m of markers) {\n const color = m.color ?? \"hsl(345 75% 33%)\";\n const icon = L.divIcon({\n className: \"\",\n html: `<span style=\"display:block;width:14px;height:14px;border-radius:9999px;background:${color};border:2px solid #fff;box-shadow:0 1px 4px rgba(0,0,0,.4)\"></span>`,\n iconSize: [14, 14],\n iconAnchor: [7, 7],\n });\n const mk = L.marker([m.lat, m.lng], { icon }).addTo(layerRef.current);\n if (m.label) mk.bindPopup(m.label);\n }\n })();\n return () => { cancelled = true; };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [center[0], center[1], zoom, JSON.stringify(markers)]);\n\n React.useEffect(() => () => { if (mapRef.current) { mapRef.current.remove(); mapRef.current = null; } }, []);\n\n return (\n <div\n ref={ref}\n className={cn(\"overflow-hidden rounded-xl border border-border bg-muted\", className)}\n style={{ height: typeof height === \"number\" ? `${height}px` : height, width: \"100%\" }}\n />\n );\n}\n","'use client'\n\n/**\n * MapLegend — collapsible map legend panel.\n *\n * Ported from app/src/components/situation-map/MapLegend.tsx.\n *\n * Adaptations:\n * - @/components/ui/* → ../ui/*\n * - @/lib/utils → ../../lib/utils\n * - useLanguage removed — language/dir passed as props\n * - MARKER_COLORS / MARKER_LABELS inlined from mapDefaults (no @/data dep)\n * - LegendGroups data injectable via `groups` prop (defaults to MENA presets)\n * - No 'use client' directive — sentra-ui ships framework-agnostic; RSC is\n * handled by the consuming product's bundler.\n */\n\nimport { useState } from 'react';\nimport { Info, ChevronDown } from 'lucide-react';\nimport { cn } from '../../lib/utils';\nimport {\n MARKER_COLORS,\n MARKER_LABELS,\n DEFAULT_LEGEND_GROUPS,\n} from './mapDefaults';\nimport type { LegendGroup, LegendShapeType, MapMarkerType } from './types';\n\n// ─── Shape icon ───────────────────────────────────────────────────────────────\n\ninterface ShapeIconProps {\n shape: LegendShapeType;\n color: string;\n}\n\nconst ShapeIcon = ({ shape, color }: ShapeIconProps) => {\n const size = 12;\n return (\n <svg width={size} height={size} viewBox=\"0 0 12 12\" className=\"shrink-0\" aria-hidden=\"true\">\n {shape === 'diamond' && (\n <rect x=\"2\" y=\"2\" width=\"8\" height=\"8\" rx=\"1\" fill={color} transform=\"rotate(45 6 6)\" />\n )}\n {shape === 'burst' && (\n <polygon\n points=\"6,0.5 7.5,4 11.5,4 8.5,6.5 9.5,10.5 6,8 2.5,10.5 3.5,6.5 0.5,4 4.5,4\"\n fill={color}\n />\n )}\n {shape === 'chevron' && (\n <path\n d=\"M2 8 L6 3 L10 8\"\n fill=\"none\"\n stroke={color}\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n )}\n {shape === 'triangle' && (\n <polygon points=\"6,1.5 11,10.5 1,10.5\" fill={color} />\n )}\n {shape === 'hexagon' && (\n <polygon points=\"6,1 10.5,3.5 10.5,8.5 6,11 1.5,8.5 1.5,3.5\" fill={color} />\n )}\n {shape === 'ring' && (\n <circle cx=\"6\" cy=\"6\" r=\"4.5\" fill=\"none\" stroke={color} strokeWidth=\"2\" />\n )}\n {shape === 'pill' && (\n <rect x=\"1\" y=\"3.5\" width=\"10\" height=\"5\" rx=\"2.5\" fill={color} />\n )}\n {shape === 'square' && (\n <rect x=\"2\" y=\"2\" width=\"8\" height=\"8\" rx=\"1.5\" fill={color} />\n )}\n </svg>\n );\n};\nShapeIcon.displayName = 'ShapeIcon';\n\n// ─── Props ────────────────────────────────────────────────────────────────────\n\nexport interface MapLegendProps {\n /** Language code — 'en' | 'ar'. Controls label language and RTL positioning. */\n language?: string;\n /** Override legend groups (marker types + shapes). Defaults to MENA presets. */\n groups?: LegendGroup[];\n /**\n * Marker color map — keys are MapMarkerType strings, values are hex colors.\n * Defaults to MARKER_COLORS from mapDefaults.\n */\n markerColors?: Partial<Record<MapMarkerType, string>>;\n /**\n * Marker label map — keys are MapMarkerType strings.\n * Defaults to MARKER_LABELS from mapDefaults.\n */\n markerLabels?: Partial<Record<MapMarkerType, { en: string; ar: string }>>;\n /** Additional class name on the root element */\n className?: string;\n /** Initially collapsed. Defaults to false (expanded). */\n defaultCollapsed?: boolean;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport const MapLegend = ({\n language = 'en',\n groups = DEFAULT_LEGEND_GROUPS,\n markerColors,\n markerLabels,\n className,\n defaultCollapsed = false,\n}: MapLegendProps) => {\n const [collapsed, setCollapsed] = useState(defaultCollapsed);\n const isAr = language === 'ar';\n\n const resolvedColors = { ...MARKER_COLORS, ...markerColors };\n const resolvedLabels = { ...MARKER_LABELS, ...markerLabels };\n\n const handleToggle = () => setCollapsed(prev => !prev);\n\n return (\n <div\n className={cn(\n 'absolute bottom-8 z-10',\n isAr ? 'start-14' : 'end-14',\n className,\n )}\n >\n <div className=\"bg-[hsl(var(--warroom-card)/0.95)] backdrop-blur-md border border-[hsl(var(--warroom-border))] rounded-lg shadow-sm overflow-hidden min-w-[160px]\">\n {/* Header */}\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-expanded={!collapsed}\n aria-label={isAr ? 'تبديل مفتاح الخريطة' : 'Toggle map legend'}\n className=\"w-full flex items-center justify-between px-3 py-2 hover:bg-[hsl(var(--warroom-border)/0.3)] transition-colors duration-fast ease-standard\"\n >\n <div className=\"flex items-center gap-1.5\">\n <Info className=\"h-3 w-3 text-[hsl(var(--brand-primary))]\" aria-hidden=\"true\" />\n <span className=\"text-[11px] font-semibold text-foreground\">\n {isAr ? 'مفتاح الخريطة' : 'Legend'}\n </span>\n </div>\n <ChevronDown\n className={cn(\n 'h-3 w-3 text-muted-foreground transition-transform duration-fast ease-standard',\n collapsed && '-rotate-90',\n )}\n aria-hidden=\"true\"\n />\n </button>\n\n {/* Content */}\n {!collapsed && (\n <div className=\"px-3 pb-2.5 space-y-2\" dir={isAr ? 'rtl' : 'ltr'}>\n {groups.map((group) => (\n <div key={group.label}>\n <span className=\"text-[9px] font-semibold uppercase tracking-wider text-muted-foreground/50 block mb-1\">\n {isAr ? group.label_ar : group.label}\n </span>\n <div className=\"space-y-1\">\n {group.items.map(({ type, shape }) => {\n const label = resolvedLabels[type];\n const color = resolvedColors[type] ?? '#888';\n return (\n <div key={type} className=\"flex items-center gap-2\">\n <ShapeIcon shape={shape} color={color} />\n <span className=\"text-[10px] text-muted-foreground leading-none\">\n {label ? (isAr ? label.ar : label.en) : type}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n ))}\n\n {/* Severity scale */}\n <div>\n <span className=\"text-[9px] font-semibold uppercase tracking-wider text-muted-foreground/50 block mb-1\">\n {isAr ? 'الخطورة' : 'Severity'}\n </span>\n <div className=\"flex items-center gap-1\">\n <div\n className=\"flex-1 h-1.5 rounded-full\"\n style={{ background: 'linear-gradient(to right, #eab308, #f97316, #dc2626)' }}\n />\n </div>\n <div className={cn('flex justify-between mt-0.5', isAr && 'flex-row-reverse')}>\n <span className=\"text-[8px] text-muted-foreground/50\">\n {isAr ? 'متصاعد' : 'Elevated'}\n </span>\n <span className=\"text-[8px] text-muted-foreground/50\">\n {isAr ? 'حرج' : 'Critical'}\n </span>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nMapLegend.displayName = 'MapLegend';\nexport default MapLegend;","/**\n * Default configuration constants for the map components.\n *\n * These are the same values used in the source app (situation-map-data.ts /\n * MapLegend.tsx) extracted here so map components are self-contained without\n * depending on the app's data/ directory.\n */\n\nimport type { LegendGroup, MapMarkerType, MapRegionPreset, MapLayer } from './types';\n\n// ─── Marker colors — matches MARKER_COLORS in situation-map-data.ts ──────────\n\nexport const MARKER_COLORS: Record<MapMarkerType, string> = {\n strike: '#ef4444', // red-500\n launch_site: '#f97316', // orange-500\n proxy_force: '#a855f7', // purple-500\n military_base: '#3b82f6', // blue-500\n air_defense: '#06b6d4', // cyan-500\n nuclear: '#eab308', // yellow-500\n naval: '#14b8a6', // teal-500\n infrastructure: '#6b7280', // gray-500\n};\n\n// ─── Bilingual marker labels ──────────────────────────────────────────────────\n\nexport const MARKER_LABELS: Record<MapMarkerType, { en: string; ar: string }> = {\n strike: { en: 'Strike / Attack', ar: 'ضربة / هجوم' },\n launch_site: { en: 'Launch Site', ar: 'موقع الإطلاق' },\n proxy_force: { en: 'Proxy Force', ar: 'قوة وكيلة' },\n military_base: { en: 'Military Base', ar: 'قاعدة عسكرية' },\n air_defense: { en: 'Air Defense', ar: 'دفاع جوي' },\n nuclear: { en: 'Nuclear Site', ar: 'موقع نووي' },\n naval: { en: 'Naval Chokepoint', ar: 'نقطة خنق بحرية' },\n infrastructure: { en: 'Critical Infra.', ar: 'بنية تحتية حرجة' },\n};\n\n// ─── Legend groups ────────────────────────────────────────────────────────────\n\nexport const DEFAULT_LEGEND_GROUPS: LegendGroup[] = [\n {\n label: 'Threats',\n label_ar: 'التهديدات',\n items: [\n { type: 'strike', shape: 'diamond' },\n { type: 'launch_site', shape: 'burst' },\n { type: 'proxy_force', shape: 'chevron' },\n ],\n },\n {\n label: 'Assets',\n label_ar: 'الأصول',\n items: [\n { type: 'military_base', shape: 'triangle' },\n { type: 'air_defense', shape: 'hexagon' },\n { type: 'nuclear', shape: 'ring' },\n ],\n },\n {\n label: 'Infrastructure',\n label_ar: 'البنية التحتية',\n items: [\n { type: 'naval', shape: 'pill' },\n { type: 'infrastructure', shape: 'square' },\n ],\n },\n];\n\n// ─── Default region presets — MENA-centric ───────────────────────────────────\n\nexport const DEFAULT_REGION_PRESETS: MapRegionPreset[] = [\n { key: 'global', label: 'Global', label_ar: 'عالمي', latitude: 25.3, longitude: 51.5, zoom: 2.8 },\n { key: 'mena', label: 'MENA', label_ar: 'الشرق الأوسط', latitude: 28, longitude: 45, zoom: 3.5 },\n { key: 'gulf', label: 'Gulf', label_ar: 'الخليج', latitude: 26, longitude: 52, zoom: 5.5 },\n { key: 'levant', label: 'Levant', label_ar: 'المشرق', latitude: 33, longitude: 36, zoom: 5.5 },\n { key: 'iran', label: 'Iran', label_ar: 'إيران', latitude: 32.5, longitude: 53, zoom: 5 },\n { key: 'redSea', label: 'Red Sea', label_ar: 'البحر الأحمر', latitude: 18, longitude: 42, zoom: 4.5 },\n];\n\n// ─── Default layer definitions ────────────────────────────────────────────────\n\nexport const DEFAULT_LAYERS: MapLayer[] = [\n { id: 'iranStrikes', label: 'Iran Strikes', label_ar: 'ضربات إيران', enabled: true, color: MARKER_COLORS.strike },\n { id: 'usBases', label: 'US Bases', label_ar: 'القواعد الأمريكية', enabled: true, color: MARKER_COLORS.military_base },\n { id: 'iranianProxies', label: 'Iranian Proxies', label_ar: 'الوكلاء الإيرانيون', enabled: true, color: MARKER_COLORS.proxy_force },\n { id: 'nuclearSites', label: 'Nuclear Sites', label_ar: 'المواقع النووية', enabled: true, color: MARKER_COLORS.nuclear },\n { id: 'airDefense', label: 'Air Defense', label_ar: 'الدفاع الجوي', enabled: false, color: MARKER_COLORS.air_defense },\n { id: 'navalChokepoints', label: 'Naval Chokepoints', label_ar: 'نقاط الخنق البحرية', enabled: false, color: MARKER_COLORS.naval },\n { id: 'criticalInfra', label: 'Critical Infra.', label_ar: 'البنية التحتية الحرجة', enabled: false, color: MARKER_COLORS.infrastructure },\n { id: 'conflictZones', label: 'Conflict Zones', label_ar: 'مناطق النزاع', enabled: true, color: '#dc2626' },\n];\n","'use client'\n\n/**\n * MapLayersPanel — collapsible layer visibility toggles.\n *\n * Ported from app/src/components/situation-map/LayersPanel.tsx (the companion\n * panel that was part of the SituationMapEmbed). Extracted as a standalone\n * component so it can be used independently of the full map panel.\n *\n * Adaptations:\n * - @/lib/utils → ../../lib/utils\n * - useLanguage removed — language prop instead\n * - Layer definitions injectable via props\n */\n\nimport { useState } from 'react';\nimport { Layers, ChevronDown } from 'lucide-react';\nimport { cn } from '../../lib/utils';\nimport type { MapLayer } from './types';\nimport { DEFAULT_LAYERS } from './mapDefaults';\n\nexport interface MapLayersPanelProps {\n /** Layer toggle entries. Defaults to DEFAULT_LAYERS from mapDefaults. */\n layers?: MapLayer[];\n /** Language code — 'en' | 'ar' */\n language?: string;\n /** Called when a layer toggle changes */\n onToggle?: (layerId: string, enabled: boolean) => void;\n /** Additional class name on root */\n className?: string;\n}\n\nexport const MapLayersPanel = ({\n layers = DEFAULT_LAYERS,\n language = 'en',\n onToggle,\n className,\n}: MapLayersPanelProps) => {\n const [collapsed, setCollapsed] = useState(false);\n const isAr = language === 'ar';\n\n const handleToggle = () => setCollapsed(prev => !prev);\n\n return (\n <div\n className={cn(\n 'absolute top-3 z-10',\n isAr ? 'end-3' : 'start-3',\n className,\n )}\n >\n <div className=\"bg-[hsl(var(--warroom-card)/0.95)] backdrop-blur-md border border-[hsl(var(--warroom-border))] rounded-lg shadow-sm overflow-hidden min-w-[160px]\">\n {/* Header */}\n <button\n type=\"button\"\n onClick={handleToggle}\n aria-expanded={!collapsed}\n aria-label={isAr ? 'تبديل لوحة الطبقات' : 'Toggle layers panel'}\n className=\"w-full flex items-center justify-between px-3 py-2 hover:bg-[hsl(var(--warroom-border)/0.3)] transition-colors duration-fast ease-standard\"\n >\n <div className=\"flex items-center gap-1.5\">\n <Layers className=\"h-3 w-3 text-[hsl(var(--brand-primary))]\" aria-hidden=\"true\" />\n <span className=\"text-[11px] font-semibold text-foreground\">\n {isAr ? 'الطبقات' : 'Layers'}\n </span>\n </div>\n <ChevronDown\n className={cn(\n 'h-3 w-3 text-muted-foreground transition-transform duration-fast ease-standard',\n collapsed && '-rotate-90',\n )}\n aria-hidden=\"true\"\n />\n </button>\n\n {/* Layer list */}\n {!collapsed && (\n <div className=\"px-3 pb-2.5 space-y-1.5\" dir={isAr ? 'rtl' : 'ltr'}>\n {layers.map((layer) => (\n <label\n key={layer.id}\n className=\"flex items-center gap-2 cursor-pointer group\"\n >\n <input\n type=\"checkbox\"\n checked={layer.enabled}\n onChange={() => onToggle?.(layer.id, !layer.enabled)}\n className=\"sr-only\"\n aria-label={isAr ? layer.label_ar : layer.label}\n />\n {/* Visual checkbox */}\n <span\n className={cn(\n 'w-3 h-3 rounded-sm border shrink-0 flex items-center justify-center transition-colors duration-fast ease-standard',\n layer.enabled\n ? 'border-transparent'\n : 'border-muted-foreground/40 bg-transparent',\n )}\n style={layer.enabled && layer.color\n ? { backgroundColor: layer.color }\n : undefined}\n aria-hidden=\"true\"\n >\n {layer.enabled && (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M1.5 4L3.5 6L6.5 2\" stroke=\"white\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )}\n </span>\n <span className=\"text-[10px] text-muted-foreground group-hover:text-foreground transition-colors duration-fast ease-standard leading-none\">\n {isAr ? layer.label_ar : layer.label}\n </span>\n </label>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n};\n\nMapLayersPanel.displayName = 'MapLayersPanel';\nexport default MapLayersPanel;","'use client'\n\n/**\n * MapPanel — chrome shell for the situation map view.\n *\n * Ported from app/src/components/situation-map/SituationMapEmbed.tsx.\n *\n * DESIGN DECISION — renderMap seam (option b from the porting spec):\n * ──────────────────────────────────────────────────────────────────\n * react-map-gl@7 + maplibre-gl@4 together add ~600 KB gzipped WebGL runtime.\n * Bundling them into @prism/ui would force every product consumer to pay that\n * cost even when no map is rendered (e.g. Scout's data-table views).\n *\n * Instead, MapPanel exposes a `renderMap` prop that receives a RenderMapContext\n * object. The product (sentra-next) supplies the actual <Map> component from\n * react-map-gl/maplibre, which it already depends on. sentra-ui ships zero\n * map-library bytes.\n *\n * Everything else — region selector bar, time-range filter, layers panel,\n * legend, alert sidebar — is real and fully ported here. The seam is only\n * the WebGL canvas itself.\n *\n * Adaptations from source:\n * - @/lib/utils → ../../lib/utils\n * - @/components/ui/* → ../ui/*\n * - useLanguage → language / dir props\n * - useTheme → isDark prop\n * - bridge + useQuery → alerts prop (product fetches and passes)\n * - WebSocket listener → onAlertCountChange callback\n * - REGION_PRESETS → regionPresets prop (defaults to DEFAULT_REGION_PRESETS)\n * - LayersPanel / MapLegend → imported from this module\n */\n\nimport React, { useState, useCallback, useMemo } from 'react';\nimport { cn } from '../../lib/utils';\nimport { MapLegend } from './MapLegend';\nimport { MapLayersPanel } from './MapLayersPanel';\nimport type {\n MapPanelProps,\n MapRegionPreset,\n RenderMapContext,\n AlertMapItem,\n AlertSeverity,\n} from './types';\nimport { DEFAULT_REGION_PRESETS, DEFAULT_LAYERS } from './mapDefaults';\n\n// ─── Severity color map ───────────────────────────────────────────────────────\n\nconst ALERT_SEVERITY_COLORS: Record<AlertSeverity, string> = {\n critical: '#dc2626',\n high: '#ea580c',\n medium: '#d97706',\n low: '#16a34a',\n};\n\n// ─── Time range config ────────────────────────────────────────────────────────\n\nconst TIME_RANGES = [\n { key: '24h', ms: 86_400_000, label_en: '24h', label_ar: '24 س' },\n { key: '7d', ms: 7 * 86_400_000, label_en: '7d', label_ar: '7 أيام' },\n { key: '30d', ms: 30 * 86_400_000, label_en: '30d', label_ar: '30 يوم' },\n { key: 'all', ms: Infinity, label_en: 'All', label_ar: 'الكل' },\n] as const;\n\ntype TimeRangeKey = '24h' | '7d' | '30d' | 'all';\n\n// ─── Map placeholder (shown when renderMap is not provided) ──────────────────\n\nconst MapPlaceholder = ({ isDark }: { isDark: boolean }) => (\n <div\n className={cn(\n 'w-full h-full flex flex-col items-center justify-center gap-3',\n isDark ? 'bg-[hsl(var(--sr-navy-deep))]' : 'bg-muted',\n )}\n role=\"img\"\n aria-label=\"Map placeholder — supply renderMap prop to render the actual map\"\n >\n {/* Stylised grid suggesting a map */}\n <svg\n width=\"80\"\n height=\"60\"\n viewBox=\"0 0 80 60\"\n fill=\"none\"\n aria-hidden=\"true\"\n className=\"opacity-30\"\n >\n <rect width=\"80\" height=\"60\" rx=\"4\" fill={isDark ? '#1e293b' : '#cbd5e1'} />\n {/* Horizontal grid lines */}\n {[10, 20, 30, 40, 50].map(y => (\n <line key={y} x1=\"0\" y1={y} x2=\"80\" y2={y} stroke={isDark ? '#334155' : '#94a3b8'} strokeWidth=\"0.5\" />\n ))}\n {/* Vertical grid lines */}\n {[16, 32, 48, 64].map(x => (\n <line key={x} x1={x} y1=\"0\" x2={x} y2=\"60\" stroke={isDark ? '#334155' : '#94a3b8'} strokeWidth=\"0.5\" />\n ))}\n {/* Fake \"landmass\" blob */}\n <ellipse cx=\"40\" cy=\"30\" rx=\"22\" ry=\"14\" fill={isDark ? '#1e3a5f' : '#bfdbfe'} opacity=\"0.6\" />\n {/* Sample marker dots */}\n <circle cx=\"35\" cy=\"26\" r=\"3\" fill=\"#ef4444\" />\n <circle cx=\"48\" cy=\"33\" r=\"2.5\" fill=\"#f97316\" />\n <circle cx=\"28\" cy=\"34\" r=\"2\" fill=\"#3b82f6\" />\n </svg>\n <p className=\"text-[11px] text-muted-foreground text-center px-4 max-w-[200px]\">\n Supply a <code className=\"font-mono text-[10px]\">renderMap</code> prop to\n render the map engine.\n </p>\n </div>\n);\nMapPlaceholder.displayName = 'MapPlaceholder';\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport const MapPanel = ({\n renderMap,\n markers = [],\n alerts = [],\n regionPresets = DEFAULT_REGION_PRESETS,\n layers: layersProp,\n initialRegion = 'global',\n language = 'en',\n isDark = true,\n onLayerToggle,\n onAlertCountChange,\n className,\n}: MapPanelProps) => {\n const isAr = language === 'ar';\n\n // ── Region selector ──────────────────────────────────────────────────────\n const [activeRegionKey, setActiveRegionKey] = useState(initialRegion);\n\n const handleRegionSelect = useCallback((key: string) => {\n setActiveRegionKey(key);\n }, []);\n\n const activeRegion: MapRegionPreset = useMemo(\n () =>\n regionPresets.find(r => r.key === activeRegionKey) ??\n regionPresets[0] ??\n DEFAULT_REGION_PRESETS[0],\n [activeRegionKey, regionPresets],\n );\n\n // ── Time range filter ────────────────────────────────────────────────────\n const [timeRange, setTimeRange] = useState<TimeRangeKey>('all');\n\n const filteredAlerts = useMemo<AlertMapItem[]>(() => {\n if (!alerts.length) return [];\n const range = TIME_RANGES.find(t => t.key === timeRange);\n if (!range || range.ms === Infinity) return alerts;\n const cutoff = Date.now() - range.ms;\n return alerts.filter(a => new Date(a.updated_at).getTime() >= cutoff);\n }, [alerts, timeRange]);\n\n const alertCount = filteredAlerts.length;\n\n // Notify host when alert count changes\n const prevAlertCountRef = React.useRef(alertCount);\n if (prevAlertCountRef.current !== alertCount) {\n prevAlertCountRef.current = alertCount;\n onAlertCountChange?.(alertCount);\n }\n\n // ── Alert sidebar ────────────────────────────────────────────────────────\n const [sidebarOpen, setSidebarOpen] = useState(false);\n\n const handleSidebarOpen = useCallback(() => setSidebarOpen(true), []);\n const handleSidebarClose = useCallback(() => setSidebarOpen(false), []);\n\n // ── Layer state ──────────────────────────────────────────────────────────\n const resolvedLayerDefs = layersProp ?? DEFAULT_LAYERS;\n\n const [layerEnabled, setLayerEnabled] = useState<Record<string, boolean>>(\n () => Object.fromEntries(resolvedLayerDefs.map(l => [l.id, l.enabled])),\n );\n\n const handleLayerToggle = useCallback((layerId: string, enabled: boolean) => {\n setLayerEnabled(prev => ({ ...prev, [layerId]: enabled }));\n onLayerToggle?.(layerId, enabled);\n }, [onLayerToggle]);\n\n // Merge enabled state back into layer defs for LayersPanel\n const mergedLayers = useMemo(\n () => resolvedLayerDefs.map(l => ({ ...l, enabled: layerEnabled[l.id] ?? l.enabled })),\n [resolvedLayerDefs, layerEnabled],\n );\n\n // ── renderMap context ────────────────────────────────────────────────────\n const mapCtx: RenderMapContext = {\n layers: layerEnabled,\n markers,\n alerts: filteredAlerts,\n activeRegion,\n language,\n dir: isAr ? 'rtl' : 'ltr',\n isDark,\n };\n\n return (\n <div className={cn('w-full h-full relative overflow-hidden', className)}>\n\n {/* ── Map canvas or placeholder ─────────────────────────────────────── */}\n <div className=\"absolute inset-0\">\n {renderMap ? renderMap(mapCtx) : <MapPlaceholder isDark={isDark} />}\n </div>\n\n {/* ── Region selector bar ───────────────────────────────────────────── */}\n <div\n className={cn(\n 'absolute top-3 z-10 flex items-center gap-0.5',\n 'bg-[hsl(var(--warroom-card)/0.95)] backdrop-blur-md',\n 'border border-[hsl(var(--warroom-border))] rounded-lg p-0.5 shadow-sm',\n // Position next to layers panel on the opposite side\n isAr ? 'end-[11rem]' : 'start-[11rem]',\n )}\n role=\"toolbar\"\n aria-label={isAr ? 'اختيار المنطقة' : 'Region selector'}\n >\n {regionPresets.map((preset) => (\n <button\n key={preset.key}\n type=\"button\"\n onClick={() => handleRegionSelect(preset.key)}\n aria-pressed={activeRegionKey === preset.key}\n className={cn(\n 'px-2.5 py-1 text-[11px] font-medium rounded-md transition-all duration-fast ease-standard',\n activeRegionKey === preset.key\n ? 'bg-[hsl(var(--brand-primary))] text-white shadow-sm'\n : 'text-muted-foreground hover:text-foreground hover:bg-[hsl(var(--warroom-border)/0.5)]',\n )}\n >\n {isAr ? preset.label_ar : preset.label}\n </button>\n ))}\n </div>\n\n {/* ── Time-range filter ─────────────────────────────────────────────── */}\n <div\n className={cn(\n 'absolute bottom-10 z-10 flex items-center gap-0.5',\n 'bg-[hsl(var(--warroom-card)/0.95)] backdrop-blur-md',\n 'border border-[hsl(var(--warroom-border))] rounded-lg p-0.5 shadow-sm',\n isAr ? 'end-14' : 'start-14',\n )}\n role=\"toolbar\"\n aria-label={isAr ? 'تصفية النطاق الزمني' : 'Time range filter'}\n >\n <span className=\"text-[10px] text-muted-foreground px-1.5\">\n {isAr ? 'النطاق الزمني' : 'Time range'}\n </span>\n {TIME_RANGES.map(t => (\n <button\n key={t.key}\n type=\"button\"\n onClick={() => setTimeRange(t.key as TimeRangeKey)}\n aria-pressed={timeRange === t.key}\n className={cn(\n 'px-2.5 py-1 text-[10px] font-medium rounded-md transition-all duration-fast ease-standard',\n timeRange === t.key\n ? 'bg-[hsl(var(--brand-primary))] text-white shadow-sm'\n : 'text-muted-foreground hover:text-foreground hover:bg-[hsl(var(--warroom-border)/0.5)]',\n )}\n >\n {isAr ? t.label_ar : t.label_en}\n </button>\n ))}\n </div>\n\n {/* ── Alert sidebar toggle button ───────────────────────────────────── */}\n <button\n type=\"button\"\n onClick={handleSidebarOpen}\n aria-label={isAr ? 'قائمة التنبيهات' : 'Alert list'}\n className={cn(\n 'absolute top-3 z-20 flex items-center gap-1.5 px-2.5 py-1.5',\n 'bg-[hsl(var(--warroom-card)/0.95)] backdrop-blur-md',\n 'border border-[hsl(var(--warroom-border))] rounded-lg',\n 'text-foreground hover:bg-[hsl(var(--warroom-border)/0.5)] transition-all duration-fast ease-standard shadow-sm',\n isAr ? 'start-16' : 'end-3',\n )}\n >\n <span className=\"text-[11px] font-medium\">\n {isAr ? `التنبيهات (${alertCount})` : `Alerts (${alertCount})`}\n </span>\n {alertCount > 0 && (\n <span\n className=\"flex items-center justify-center w-4 h-4 rounded-full bg-red-600 text-[9px] font-bold text-white\"\n aria-hidden=\"true\"\n >\n {alertCount > 99 ? '99+' : alertCount}\n </span>\n )}\n </button>\n\n {/* ── Alert sidebar ─────────────────────────────────────────────────── */}\n {sidebarOpen && (\n <>\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 z-20 bg-black/10\"\n onClick={handleSidebarClose}\n aria-hidden=\"true\"\n />\n <aside\n className={cn(\n 'absolute top-0 bottom-0 z-30 w-[300px] flex flex-col',\n 'bg-[hsl(var(--warroom-card)/0.97)] backdrop-blur-xl',\n 'border-[hsl(var(--warroom-border))] shadow-xl',\n isAr\n ? 'start-0 border-e animate-in slide-in-from-left duration-200'\n : 'end-0 border-s animate-in slide-in-from-right duration-200',\n )}\n dir={isAr ? 'rtl' : 'ltr'}\n aria-label={isAr ? 'التنبيهات الحالية' : 'Current Alerts'}\n >\n <div\n className={cn(\n 'flex items-center justify-between px-4 py-3 border-b border-[hsl(var(--warroom-border))]',\n isAr && 'flex-row-reverse',\n )}\n >\n <span className=\"text-sm font-semibold text-foreground\">\n {isAr ? 'التنبيهات الحالية' : 'Current Alerts'}\n </span>\n <button\n type=\"button\"\n onClick={handleSidebarClose}\n aria-label={isAr ? 'إغلاق' : 'Close'}\n className=\"p-1 rounded-md hover:bg-[hsl(var(--warroom-border)/0.5)] text-muted-foreground\"\n >\n ✕\n </button>\n </div>\n\n <div className=\"flex-1 overflow-y-auto divide-y divide-border/30\">\n {filteredAlerts.length === 0 ? (\n <div className=\"p-6 text-center text-sm text-muted-foreground\">\n {isAr ? 'لا توجد تنبيهات' : 'No alerts'}\n </div>\n ) : (\n filteredAlerts.map(alert => {\n const sev = (alert.severity ?? 'medium') as AlertSeverity;\n const sevColor = ALERT_SEVERITY_COLORS[sev] ?? ALERT_SEVERITY_COLORS.medium;\n const title = isAr && alert.title_ar ? alert.title_ar : alert.title_en;\n return (\n <a\n key={alert.slug}\n href={`/alert/${alert.slug}`}\n className=\"flex items-start gap-2.5 px-4 py-3 hover:bg-muted/30 transition-colors duration-fast ease-standard group border-s-2\"\n style={{ borderInlineStartColor: sevColor }}\n >\n <span\n className=\"w-2 h-2 rounded-full shrink-0 mt-1.5\"\n style={{ backgroundColor: sevColor }}\n aria-hidden=\"true\"\n />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-[12px] font-medium text-foreground line-clamp-2 leading-snug group-hover:text-primary\">\n {title}\n </p>\n <p className=\"text-[10px] text-muted-foreground mt-0.5 capitalize\">\n {alert.mode} · {sev}\n </p>\n </div>\n </a>\n );\n })\n )}\n </div>\n </aside>\n </>\n )}\n\n {/* ── Layers panel ──────────────────────────────────────────────────── */}\n <MapLayersPanel\n layers={mergedLayers}\n language={language}\n onToggle={handleLayerToggle}\n />\n\n {/* ── Legend ────────────────────────────────────────────────────────── */}\n <MapLegend language={language} />\n\n </div>\n );\n};\n\nMapPanel.displayName = 'MapPanel';\nexport default MapPanel;","'use client'\n\n/**\n * EventMapPanel — location card for an event artifact.\n *\n * Ported from app/src/components/capability-sections/event/event-map-panel.tsx.\n *\n * Adaptations:\n * - @/components/ui/card → ../ui/card\n * - useEventArtifact / SectionComponentProps removed — data passed as props\n * - language / location as direct props\n *\n * Returns null when no location is available (matching the source behaviour\n * where section_visible=FALSE).\n */\n\nimport { MapPin } from 'lucide-react';\nimport { Card, CardContent, CardHeader, CardTitle } from '../ui/card';\n\nexport interface EventMapPanelProps {\n /** Structured location string — if absent the panel renders nothing */\n location?: string | null;\n /** Language code — 'en' | 'ar' */\n language?: string;\n}\n\nexport const EventMapPanel = ({ location, language = 'en' }: EventMapPanelProps) => {\n if (!location) return null;\n\n const isAr = language === 'ar';\n\n return (\n <Card>\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"text-base flex items-center gap-2\">\n <MapPin className=\"w-4 h-4 text-primary\" aria-hidden=\"true\" />\n {isAr ? 'الموقع' : 'Location'}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <p\n className=\"text-sm text-foreground p-3 bg-muted/30 rounded-lg\"\n dir={isAr ? 'rtl' : 'ltr'}\n >\n {location}\n </p>\n </CardContent>\n </Card>\n );\n};\n\nEventMapPanel.displayName = 'EventMapPanel';\nexport default EventMapPanel;\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface GraphNode {\n id: string;\n label?: string;\n group?: string;\n}\nexport interface GraphLink {\n source: string;\n target: string;\n}\nexport interface NetworkGraphProps {\n nodes: GraphNode[];\n links: GraphLink[];\n width?: number;\n height?: number;\n className?: string;\n /** Map a group → CSS color. Falls back to a token palette. */\n groupColor?: (group: string | undefined) => string;\n /** Node circle radius. */\n nodeRadius?: number;\n /** Fired when a node is clicked (not dragged). */\n onNodeClick?: (node: GraphNode) => void;\n}\n\nconst PALETTE = [\n \"hsl(345 75% 45%)\", \"hsl(217 91% 60%)\", \"hsl(160 84% 39%)\",\n \"hsl(38 92% 50%)\", \"hsl(263 70% 60%)\", \"hsl(199 89% 48%)\",\n];\n\ninterface Particle {\n x: number; y: number; vx: number; vy: number;\n fx?: number | null; fy?: number | null; // fixed position while dragging\n}\n\n/** NetworkGraph — a dependency-free, **live force-directed** SVG graph with\n * **draggable** nodes. Nodes repel, links act as springs, and the layout settles;\n * dragging a node pins it to the pointer and reheats the simulation so the graph\n * reacts dynamically. Pass `nodes` + `links`. */\nexport function NetworkGraph({\n nodes, links, width = 640, height = 420, className, groupColor,\n nodeRadius = 11, onNodeClick,\n}: NetworkGraphProps) {\n const svgRef = React.useRef<SVGSVGElement>(null);\n const sim = React.useRef<Map<string, Particle>>(new Map());\n const alpha = React.useRef(1);\n const raf = React.useRef<number | null>(null);\n const drag = React.useRef<{ id: string; moved: boolean } | null>(null);\n const [, tick] = React.useReducer((c) => c + 1, 0);\n const [hover, setHover] = React.useState<string | null>(null);\n\n const groups = React.useMemo(() => Array.from(new Set(nodes.map((n) => n.group ?? \"default\"))), [nodes]);\n const colorOf = (g: string | undefined) =>\n groupColor?.(g) ?? PALETTE[Math.max(0, groups.indexOf(g ?? \"default\")) % PALETTE.length];\n\n const stop = React.useCallback(() => {\n if (raf.current != null) { cancelAnimationFrame(raf.current); raf.current = null; }\n }, []);\n\n const step = React.useCallback(() => {\n const m = sim.current;\n const ids = Array.from(m.keys());\n const a = alpha.current;\n // charge repulsion (all pairs)\n for (let i = 0; i < ids.length; i++) {\n for (let j = i + 1; j < ids.length; j++) {\n const p = m.get(ids[i])!, q = m.get(ids[j])!;\n let dx = p.x - q.x, dy = p.y - q.y;\n const d2 = dx * dx + dy * dy || 0.01;\n const d = Math.sqrt(d2);\n const f = (3200 / d2) * a;\n dx /= d; dy /= d;\n p.vx += dx * f; p.vy += dy * f;\n q.vx -= dx * f; q.vy -= dy * f;\n }\n }\n // link springs\n for (const l of links) {\n const p = m.get(l.source), q = m.get(l.target);\n if (!p || !q) continue;\n let dx = q.x - p.x, dy = q.y - p.y;\n const d = Math.sqrt(dx * dx + dy * dy) || 0.01;\n const f = (d - 100) * 0.045 * a;\n dx /= d; dy /= d;\n p.vx += dx * f; p.vy += dy * f;\n q.vx -= dx * f; q.vy -= dy * f;\n }\n // centering gravity + integrate (Verlet-ish with damping)\n for (const p of m.values()) {\n if (p.fx != null) { p.x = p.fx; p.y = p.fy!; p.vx = 0; p.vy = 0; continue; }\n p.vx += (width / 2 - p.x) * 0.0015 * a;\n p.vy += (height / 2 - p.y) * 0.0015 * a;\n p.vx *= 0.86; p.vy *= 0.86;\n p.x = Math.max(nodeRadius + 4, Math.min(width - nodeRadius - 4, p.x + p.vx));\n p.y = Math.max(nodeRadius + 4, Math.min(height - nodeRadius - 4, p.y + p.vy));\n }\n alpha.current = drag.current ? Math.max(a, 0.3) : a * 0.99;\n tick();\n if (alpha.current > 0.02 || drag.current) raf.current = requestAnimationFrame(step);\n else raf.current = null;\n }, [links, width, height, nodeRadius]);\n\n const start = React.useCallback(() => {\n if (raf.current == null) raf.current = requestAnimationFrame(step);\n }, [step]);\n\n // (Re)seed the simulation when the graph changes; reuse existing positions.\n React.useEffect(() => {\n const prev = sim.current;\n const next = new Map<string, Particle>();\n const n = nodes.length || 1;\n nodes.forEach((node, i) => {\n const old = prev.get(node.id);\n if (old) next.set(node.id, old);\n else {\n const ang = (i / n) * Math.PI * 2;\n const R = Math.min(width, height) / 3;\n next.set(node.id, { x: width / 2 + R * Math.cos(ang), y: height / 2 + R * Math.sin(ang), vx: 0, vy: 0 });\n }\n });\n sim.current = next;\n alpha.current = 1; // reheat\n start();\n return stop;\n }, [nodes, links, width, height, start, stop]);\n\n function toSvg(e: React.PointerEvent) {\n const svg = svgRef.current;\n if (!svg) return { x: 0, y: 0 };\n const pt = svg.createSVGPoint();\n pt.x = e.clientX; pt.y = e.clientY;\n const ctm = svg.getScreenCTM();\n if (!ctm) return { x: 0, y: 0 };\n const p = pt.matrixTransform(ctm.inverse());\n return { x: p.x, y: p.y };\n }\n\n function onDown(id: string, e: React.PointerEvent) {\n e.stopPropagation();\n (e.currentTarget as Element).setPointerCapture?.(e.pointerId);\n const p = sim.current.get(id);\n if (p) { const m = toSvg(e); p.fx = m.x; p.fy = m.y; }\n drag.current = { id, moved: false };\n alpha.current = Math.max(alpha.current, 0.5);\n start();\n }\n function onMove(e: React.PointerEvent) {\n const d = drag.current;\n if (!d) return;\n const p = sim.current.get(d.id);\n if (p) { const m = toSvg(e); p.fx = m.x; p.fy = m.y; d.moved = true; }\n }\n function onUp(e: React.PointerEvent) {\n const d = drag.current;\n if (!d) return;\n const p = sim.current.get(d.id);\n if (p) { p.fx = null; p.fy = null; }\n if (!d.moved) { const node = nodes.find((n) => n.id === d.id); if (node) onNodeClick?.(node); }\n drag.current = null;\n alpha.current = Math.max(alpha.current, 0.3);\n start();\n }\n\n const m = sim.current;\n return (\n <svg\n ref={svgRef}\n viewBox={`0 0 ${width} ${height}`}\n className={cn(\"w-full touch-none select-none rounded-xl border border-border bg-card\", className)}\n role=\"img\"\n aria-label=\"Network graph (drag nodes to rearrange)\"\n onPointerMove={onMove}\n onPointerUp={onUp}\n onPointerLeave={onUp}\n >\n {links.map((l, i) => {\n const a = m.get(l.source), b = m.get(l.target);\n if (!a || !b) return null;\n const active = hover != null && (l.source === hover || l.target === hover);\n return (\n <line\n key={i} x1={a.x} y1={a.y} x2={b.x} y2={b.y}\n stroke={active ? \"hsl(var(--primary))\" : \"hsl(var(--border))\"}\n strokeWidth={active ? 2 : 1.5}\n strokeOpacity={hover != null && !active ? 0.4 : 1}\n />\n );\n })}\n {nodes.map((n) => {\n const p = m.get(n.id);\n if (!p) return null;\n const dim = hover != null && hover !== n.id;\n return (\n <g\n key={n.id}\n transform={`translate(${p.x},${p.y})`}\n style={{ cursor: \"grab\", opacity: dim ? 0.45 : 1 }}\n onPointerDown={(e) => onDown(n.id, e)}\n onPointerEnter={() => setHover(n.id)}\n onPointerLeave={() => setHover(null)}\n >\n <circle r={nodeRadius} fill={colorOf(n.group)} stroke=\"hsl(var(--background))\" strokeWidth={2} />\n <text y={nodeRadius + 14} textAnchor=\"middle\" className=\"fill-foreground\" style={{ fontSize: 11, pointerEvents: \"none\" }}>\n {n.label ?? n.id}\n </text>\n </g>\n );\n })}\n </svg>\n );\n}\n","'use client'\n\n// ─── EntityNetworkGraph ────────────────────────────────────────────────────────\n//\n// Adapted from app/src/components/entity/EntityNetworkGraph.tsx\n//\n// GRAPH LIBRARY DECISION — SEAM PATTERN\n// ──────────────────────────────────────\n// The source uses @react-sigma/core + graphology + sigma + graphology-layout-forceatlas2.\n// These are heavy bundles (~600 KB minified) and not in sentra-ui's package.json.\n// Adding them would inflate every product that imports sentra-ui.\n//\n// Decision: use a RENDER SEAM — the chrome (container, loading, error, empty\n// states, legend, stats pill, hint text) is fully implemented here. The actual\n// force-directed canvas is injected by the host via the `renderGraph` prop.\n//\n// Storybook: stories use a mock renderGraph that renders a placeholder SVG.\n// The app uses renderGraph={() => <EntityNetworkGraphCanvas slug={slug} />}\n// where EntityNetworkGraphCanvas is the existing GraphCanvas component from the\n// original EntityNetworkGraph.tsx (unchanged in app/).\n//\n// This keeps sentra-ui bundle lean and the chrome portable to any host product.\n//\n// Changes vs source:\n// - useLanguage → language / isRTL props\n// - useEntityNetwork hook removed; data injected as props (network + status)\n// - Graph canvas replaced with renderGraph seam\n// - @/components/ui/* → ../ui/*\n// - \"use client\" directive removed\n\nimport { Loader2, AlertCircle, RotateCcw } from \"lucide-react\";\nimport { Skeleton } from \"../ui/skeleton\";\nimport type { EntityNetwork } from \"./types\";\n\n// ── Sentiment legend colours ───────────────────────────────────────────────────\n// Matches the SENTIMENT_COLORS palette in the original component so the legend\n// stays visually consistent even when the graph canvas is injected from outside.\nconst SENTIMENT_COLORS: Record<string, string> = {\n positive: \"#34d399\", // emerald-400\n neutral: \"#94a3b8\", // slate-400\n negative: \"#f87171\", // red-400\n};\n\nconst SENTIMENT_LEGEND = [\n { key: \"positive\", en: \"Positive\", ar: \"إيجابي\" },\n { key: \"neutral\", en: \"Neutral\", ar: \"محايد\" },\n { key: \"negative\", en: \"Negative\", ar: \"سلبي\" },\n] as const;\n\nexport interface EntityNetworkGraphProps {\n /**\n * SEAM — host renders the actual graph canvas inside this callback.\n * Receives the network data so the canvas can build its own graphology Graph.\n * If omitted, a \"graph unavailable\" placeholder is shown.\n *\n * Example (app side):\n * renderGraph={(network) => <EntityNetworkGraphCanvas slug={slug} network={network} />}\n */\n renderGraph?: (network: EntityNetwork) => React.ReactNode;\n /** Network data fetched from GET /api/entities/{slug}/network */\n network: EntityNetwork | null;\n isLoading?: boolean;\n isError?: boolean;\n onRetry?: () => void;\n language?: \"en\" | \"ar\";\n isRTL?: boolean;\n}\n\nconst EntityNetworkGraph = ({\n renderGraph,\n network,\n isLoading,\n isError,\n onRetry,\n language = \"en\",\n isRTL = false,\n}: EntityNetworkGraphProps) => {\n // ── Loading state ──────────────────────────────────────────────────────────\n if (isLoading) {\n return (\n <div\n className=\"flex flex-col items-center justify-center w-full min-h-[480px] gap-3 text-muted-foreground\"\n dir={isRTL ? \"rtl\" : \"ltr\"}\n >\n <Loader2 className=\"w-6 h-6 animate-spin\" />\n <span className=\"text-xs\">\n {language === \"ar\"\n ? \"جارٍ تحميل شبكة الجهة...\"\n : \"Loading entity network...\"}\n </span>\n <div className=\"w-full max-w-md space-y-2 px-4\">\n <Skeleton className=\"h-3 w-full rounded\" />\n <Skeleton className=\"h-3 w-5/6 rounded\" />\n <Skeleton className=\"h-3 w-4/6 rounded\" />\n </div>\n </div>\n );\n }\n\n // ── Error state ────────────────────────────────────────────────────────────\n if (isError) {\n return (\n <div\n className=\"flex flex-col items-center justify-center w-full min-h-[480px] gap-3\"\n dir={isRTL ? \"rtl\" : \"ltr\"}\n >\n <AlertCircle className=\"w-8 h-8 text-destructive/70\" />\n <div className=\"text-center space-y-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {language === \"ar\"\n ? \"تعذّر تحميل شبكة الجهة\"\n : \"Could not load entity network\"}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {language === \"ar\"\n ? \"حدث خطأ أثناء جلب البيانات.\"\n : \"An error occurred while fetching data.\"}\n </p>\n </div>\n {onRetry && (\n <button\n onClick={onRetry}\n className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard mt-1\"\n >\n <RotateCcw className=\"w-3.5 h-3.5\" />\n {language === \"ar\" ? \"إعادة المحاولة\" : \"Try again\"}\n </button>\n )}\n </div>\n );\n }\n\n // ── Empty state ────────────────────────────────────────────────────────────\n if (!network || network.nodes.length === 0) {\n return (\n <div\n className=\"flex flex-col items-center justify-center w-full min-h-[480px] gap-3 px-6\"\n dir={isRTL ? \"rtl\" : \"ltr\"}\n >\n <div className=\"w-14 h-14 rounded-full bg-muted/50 flex items-center justify-center\">\n <svg\n className=\"w-7 h-7 text-muted-foreground/50\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n aria-hidden=\"true\"\n >\n <circle cx=\"5\" cy=\"12\" r=\"2\" />\n <circle cx=\"19\" cy=\"5\" r=\"2\" />\n <circle cx=\"19\" cy=\"19\" r=\"2\" />\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"6\" />\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"18\" />\n </svg>\n </div>\n <div className=\"text-center space-y-1 max-w-md\">\n <p className=\"text-sm font-medium text-foreground\">\n {language === \"ar\"\n ? \"لا توجد علاقات مسجّلة لهذه الجهة\"\n : \"No relationships recorded for this entity\"}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {language === \"ar\"\n ? \"ستظهر العلاقات هنا عند اكتشافها من خلال تحليل المحتوى.\"\n : \"Relationships will appear here as content analysis discovers them.\"}\n </p>\n </div>\n </div>\n );\n }\n\n // ── Graph chrome + seam ────────────────────────────────────────────────────\n // dir=\"ltr\" on the outer container: Sigma canvas always uses LTR coordinates.\n // RTL text rendering is the graph host's responsibility.\n return (\n <div\n className=\"relative overflow-hidden w-full bg-background\"\n style={{ height: 480, minHeight: 480 }}\n dir=\"ltr\"\n >\n {/* Injected graph canvas or fallback placeholder */}\n {renderGraph ? (\n renderGraph(network)\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center bg-muted/20 text-xs text-muted-foreground\">\n {language === \"ar\"\n ? \"عارض الرسم البياني غير متاح\"\n : \"Graph renderer not provided\"}\n </div>\n )}\n\n {/* Stats pill — top-end */}\n <div\n className=\"absolute top-3 end-3 z-20 flex items-center gap-2 bg-card/90 backdrop-blur-md border border-border/50 rounded-full px-3 py-1.5 text-[10px] text-muted-foreground font-medium\"\n dir={isRTL ? \"rtl\" : \"ltr\"}\n >\n <span>\n {network.nodes.length} {language === \"ar\" ? \"جهة\" : \"entities\"}\n </span>\n <span className=\"opacity-40\">·</span>\n <span>\n {network.edges.length} {language === \"ar\" ? \"رابط\" : \"edges\"}\n </span>\n </div>\n\n {/* Drag hint — top-start */}\n <div\n className=\"absolute top-3 start-3 z-10 text-[10px] text-muted-foreground/60\"\n dir={isRTL ? \"rtl\" : \"ltr\"}\n >\n {isRTL\n ? \"اسحب العقد · مرّر للتكبير · انقر للانتقال\"\n : \"Drag · Scroll to zoom · Click to navigate\"}\n </div>\n\n {/* Sentiment legend — bottom-end */}\n <div\n className=\"absolute bottom-3 end-3 z-20 flex items-center gap-2 bg-card/80 backdrop-blur-md border border-border/30 rounded-full px-3 py-1.5\"\n dir={isRTL ? \"rtl\" : \"ltr\"}\n >\n {SENTIMENT_LEGEND.map(({ key, en, ar }) => (\n <div key={key} className=\"flex items-center gap-1\">\n <div\n className=\"w-2 h-2 rounded-full shrink-0\"\n style={{ background: SENTIMENT_COLORS[key] }}\n />\n <span className=\"text-[10px] text-muted-foreground\">\n {language === \"ar\" ? ar : en}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n};\n\nEntityNetworkGraph.displayName = \"EntityNetworkGraph\";\n\nexport { EntityNetworkGraph };","'use client'\n\n// PluginCard — grid card for a single plugin (source/capability/AI/pipeline).\n//\n// ADAPTED from app/src/components/superadmin/plugins/PluginCard.tsx:\n// - next/dynamic → static import (no Next.js server in sentra-ui; Storybook\n// renders synchronously; host can wrap in lazy() if needed).\n// - Link (next/link) → onDetailClick / onPageClick callbacks. The host\n// handles navigation; this keeps the component framework-agnostic.\n// - resolveIcon() → iconComponent prop — host passes the resolved Lucide icon.\n// - useLongPress → kept inline (no external dep needed, small helper).\n// - IntersectionObserver gate for sparkline kept but simplified —\n// sparkline is always rendered if seriesData has any > 0 values.\n// Host can gate it externally via the `showSparkline` prop if desired.\n// - @/components/ui/* → ../ui/*; @/lib/utils → ../../lib/utils\n\nimport { useMemo, useCallback, useEffect, useRef, useState } from \"react\";\nimport { Settings2, ExternalLink, CircleDot, type LucideIcon } from \"lucide-react\";\nimport { Badge } from \"../ui/badge\";\nimport { PluginSparkline } from \"./PluginSparkline\";\nimport type { PluginCatalogEntry } from \"./types\";\n\n// ── Type labels ───────────────────────────────────────────────────────────────\n\nconst TYPE_LABELS: Record<string, { en: string; ar: string }> = {\n capability: { en: \"Capability\", ar: \"قدرة\" },\n source: { en: \"Source\", ar: \"مصدر\" },\n ai_provider: { en: \"AI Provider\", ar: \"مزوّد ذكاء\" },\n adk_artifact: { en: \"ADK Artifact\", ar: \"قطعة ADK\" },\n pipeline: { en: \"Pipeline\", ar: \"خطّ معالجة\" },\n enrichment: { en: \"Enrichment\", ar: \"إثراء\" },\n copilot: { en: \"Copilot\", ar: \"مساعد\" },\n \"system-base\": { en: \"System\", ar: \"نظام\" },\n adk_tool: { en: \"Tool\", ar: \"أداة\" },\n core: { en: \"Core\", ar: \"أساس\" },\n // adk_kind values — shown in place of \"adk_artifact\" when present\n tool: { en: \"Tool\", ar: \"أداة\" },\n skill: { en: \"Skill\", ar: \"مهارة\" },\n agent: { en: \"Agent\", ar: \"وكيل\" },\n mcp: { en: \"MCP\", ar: \"MCP\" },\n memory: { en: \"Memory\", ar: \"ذاكرة\" },\n persona: { en: \"Persona\", ar: \"شخصية\" },\n};\n\nconst DEFAULT_COLOR = \"#64748b\";\n\n// ── Formatters ────────────────────────────────────────────────────────────────\n\nfunction formatCount(n: number | undefined | null): string {\n if (n == null) return \"0\";\n if (n < 1000) return String(n);\n if (n < 1_000_000) return `${(n / 1000).toFixed(n < 10_000 ? 1 : 0)}K`;\n if (n < 1_000_000_000)\n return `${(n / 1_000_000).toFixed(n < 10_000_000 ? 1 : 0)}M`;\n return `${(n / 1_000_000_000).toFixed(1)}B`;\n}\n\nfunction formatRelative(iso: string | null | undefined, isRTL: boolean): string {\n if (!iso) return isRTL ? \"لا نشاط\" : \"No activity\";\n const t = Date.parse(iso);\n if (Number.isNaN(t)) return isRTL ? \"لا نشاط\" : \"No activity\";\n const diffSec = Math.max(0, Math.round((Date.now() - t) / 1000));\n if (diffSec < 60) return isRTL ? \"قبل ثوانٍ\" : \"just now\";\n const m = Math.round(diffSec / 60);\n if (m < 60) return isRTL ? `قبل ${m} د` : `${m}m ago`;\n const h = Math.round(diffSec / 3600);\n if (h < 48) return isRTL ? `قبل ${h} س` : `${h}h ago`;\n const d = Math.round(diffSec / 86400);\n if (d < 30) return isRTL ? `قبل ${d} يوم` : `${d}d ago`;\n const mo = Math.round(d / 30);\n if (mo < 12) return isRTL ? `قبل ${mo} شهر` : `${mo}mo ago`;\n const y = Math.round(d / 365);\n return isRTL ? `قبل ${y} سنة` : `${y}y ago`;\n}\n\nfunction countLabel(pluginType: string, isRTL: boolean): string {\n switch (pluginType) {\n case \"source\":\n return isRTL ? \"مغلّفات\" : \"envelopes\";\n case \"ai_provider\":\n return isRTL ? \"رموز\" : \"tokens\";\n case \"adk_artifact\":\n case \"adk_tool\":\n return isRTL ? \"استدعاءات\" : \"invocations\";\n case \"pipeline\":\n case \"enrichment\":\n return isRTL ? \"مهام نشطة\" : \"active jobs\";\n default:\n return isRTL ? \"سجلات\" : \"records\";\n }\n}\n\n// ── Activity state ────────────────────────────────────────────────────────────\n\ntype ActivityState = \"green\" | \"yellow\" | \"red\";\n\nfunction activityState(iso: string | null | undefined): ActivityState {\n if (!iso) return \"red\";\n const t = Date.parse(iso);\n if (Number.isNaN(t)) return \"red\";\n const ageMin = (Date.now() - t) / 60000;\n if (ageMin <= 60) return \"green\";\n if (ageMin <= 60 * 24) return \"yellow\";\n return \"red\";\n}\n\nconst STATE_CLASSES: Record<ActivityState, { chip: string; dot: string }> = {\n green: {\n chip: \"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border-emerald-500/30\",\n dot: \"bg-emerald-500\",\n },\n yellow: {\n chip: \"bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/30\",\n dot: \"bg-amber-500\",\n },\n red: {\n chip: \"bg-red-500/10 text-red-600 dark:text-red-400 border-red-500/30\",\n dot: \"bg-red-500\",\n },\n};\n\n// ── Long-press hook (inline, no dep) ─────────────────────────────────────────\n\nfunction useLongPress(\n callback: () => void,\n { delay = 500 }: { delay?: number } = {}\n) {\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const start = useCallback(() => {\n timerRef.current = setTimeout(callback, delay);\n }, [callback, delay]);\n\n const cancel = useCallback(() => {\n if (timerRef.current) clearTimeout(timerRef.current);\n }, []);\n\n return {\n onMouseDown: start,\n onMouseUp: cancel,\n onMouseLeave: cancel,\n onTouchStart: start,\n onTouchEnd: cancel,\n };\n}\n\n// ── IntersectionObserver hook ─────────────────────────────────────────────────\n\nfunction useInView(\n rootMargin = \"200px\"\n): [React.RefObject<HTMLDivElement | null>, boolean] {\n const ref = useRef<HTMLDivElement | null>(null);\n const [inView, setInView] = useState(false);\n\n useEffect(() => {\n const el = ref.current;\n if (!el || inView) return;\n const obs = new IntersectionObserver(\n (entries) => {\n if (entries[0]?.isIntersecting) {\n setInView(true);\n obs.disconnect();\n }\n },\n { rootMargin }\n );\n obs.observe(el);\n return () => obs.disconnect();\n }, [inView, rootMargin]);\n\n return [ref, inView];\n}\n\n// ── PluginCard ────────────────────────────────────────────────────────────────\n\nexport interface PluginCardProps {\n plugin: PluginCatalogEntry;\n isRTL: boolean;\n /**\n * Resolved Lucide icon component for this plugin.\n * Host calls resolveIcon(plugin.nav_icon) and passes the result here.\n */\n iconComponent?: LucideIcon;\n /** When true, render a checkbox for multi-select. */\n selectable?: boolean;\n selected?: boolean;\n onSelectChange?: (id: string, next: boolean) => void;\n /**\n * Called when the user clicks \"Details\". Host navigates to the detail page.\n * Receives the plugin slug (or id) as argument.\n */\n onDetailClick?: (slugOrId: string) => void;\n /**\n * Called when the user clicks \"Page\" (external route link).\n * Receives the route string from plugin.route.\n */\n onPageClick?: (route: string) => void;\n}\n\nexport const PluginCard = ({\n plugin,\n isRTL,\n iconComponent: Icon,\n selectable = false,\n selected = false,\n onSelectChange,\n onDetailClick,\n onPageClick,\n}: PluginCardProps) => {\n const name =\n (isRTL ? plugin.name_ar : plugin.name_en) ||\n plugin.name_en ||\n plugin.name ||\n plugin.slug ||\n plugin.id;\n\n const description =\n (isRTL ? plugin.description_ar : plugin.description_en) ||\n plugin.description_en ||\n plugin.description ||\n \"\";\n\n // When the plugin is an adk_artifact, prefer the granular adk_kind over the\n // coarse plugin_type so the badge shows \"Tool\" / \"Skill\" / \"Agent\" / \"MCP\" / etc.\n const rawTypeKey = String(plugin.plugin_type ?? \"\");\n const typeKey =\n rawTypeKey === \"adk_artifact\" && plugin.adk_kind\n ? String(plugin.adk_kind)\n : rawTypeKey;\n const typeLabel = TYPE_LABELS[typeKey] ?? {\n en: typeKey || \"Plugin\",\n ar: typeKey || \"إضافة\",\n };\n const color = plugin.nav_color || DEFAULT_COLOR;\n const enabled = plugin.enabled_globally !== false;\n const lastActiveISO = plugin.last_active_at ?? null;\n const state = activityState(lastActiveISO);\n const stateClasses = STATE_CLASSES[state];\n\n // countLabel uses the coarse plugin_type so all adk_artifact kinds show\n // \"invocations\" regardless of their specific adk_kind.\n const countLabelText = countLabel(rawTypeKey, isRTL);\n\n const seriesData = useMemo(() => {\n const series = plugin.activity_series ?? [];\n if (series.length === 0) {\n return Array.from({ length: 24 }, () => ({ n: 0 }));\n }\n return series.map((b) => ({ n: b.n }));\n }, [plugin.activity_series]);\n\n const hasSeriesData = seriesData.some((d) => d.n > 0);\n const [cardRef, chartInView] = useInView(\"200px\");\n\n const externalRoute =\n typeof plugin.route === \"string\" && plugin.route.trim() !== \"\"\n ? plugin.route\n : null;\n\n const handleBodyClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!selectable) return;\n const target = e.target as HTMLElement;\n if (target.closest(\"a, button, input, [role='button']\")) return;\n onSelectChange?.(plugin.id, !selected);\n };\n\n const handleLongPress = useCallback(() => {\n onSelectChange?.(plugin.id, true);\n }, [onSelectChange, plugin.id]);\n\n const longPressHandlers = useLongPress(handleLongPress, { delay: 500 });\n\n const slugOrId = plugin.slug ?? plugin.id;\n\n return (\n <div\n ref={cardRef}\n className={[\n \"h-full rounded-lg border bg-card transition-all duration-fast ease-standard hover:shadow-md flex flex-col\",\n selected\n ? \"border-primary ring-2 ring-primary/40\"\n : \"border-border hover:border-primary/40\",\n selectable ? \"cursor-pointer select-none\" : \"\",\n ].join(\" \")}\n data-selected={selected ? \"true\" : undefined}\n onClick={handleBodyClick}\n onContextMenu={(e) => {\n if (selected || selectable) e.preventDefault();\n }}\n {...longPressHandlers}\n >\n <div className=\"p-4 flex flex-col gap-3 flex-1\">\n <div className=\"flex items-start gap-3\">\n <div\n className=\"flex h-11 w-11 flex-none items-center justify-center rounded-md text-white\"\n style={{ backgroundColor: color }}\n aria-hidden=\"true\"\n >\n {Icon && <Icon className=\"h-5 w-5\" />}\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-start justify-between gap-2\">\n <h3\n className=\"text-sm font-semibold text-foreground truncate min-w-0\"\n title={name ?? undefined}\n >\n {name}\n </h3>\n <span\n className={[\n \"inline-flex items-center gap-1 flex-none px-1.5 py-0.5 rounded-full text-[10px] font-medium border\",\n stateClasses.chip,\n ].join(\" \")}\n title={lastActiveISO ?? (isRTL ? \"لا نشاط\" : \"No activity\")}\n aria-label={\n isRTL\n ? `آخر نشاط: ${formatRelative(lastActiveISO, isRTL)}`\n : `Last active: ${formatRelative(lastActiveISO, isRTL)}`\n }\n >\n <span\n className={[\n \"h-1.5 w-1.5 rounded-full flex-none\",\n stateClasses.dot,\n ].join(\" \")}\n />\n <span className=\"truncate\">\n {formatRelative(lastActiveISO, isRTL)}\n </span>\n </span>\n </div>\n <div className=\"mt-1 flex items-center gap-2 flex-wrap\">\n <Badge\n variant=\"secondary\"\n className=\"text-[10px] font-normal uppercase tracking-wide\"\n >\n {isRTL ? typeLabel.ar : typeLabel.en}\n </Badge>\n <span\n className={[\n \"inline-flex items-center gap-1 px-1.5 py-0.5 rounded-full text-[10px] font-medium\",\n enabled\n ? \"bg-emerald-500/10 text-emerald-600 dark:text-emerald-400\"\n : \"bg-muted text-muted-foreground\",\n ].join(\" \")}\n aria-label={enabled ? \"Enabled\" : \"Disabled\"}\n >\n <CircleDot className=\"h-3 w-3 opacity-70\" />\n {enabled\n ? isRTL\n ? \"مفعّل\"\n : \"Enabled\"\n : isRTL\n ? \"معطّل\"\n : \"Disabled\"}\n </span>\n </div>\n </div>\n </div>\n\n <p className=\"text-xs text-muted-foreground line-clamp-2 min-h-[2rem]\">\n {description || (isRTL ? \"لا يوجد وصف.\" : \"No description.\")}\n </p>\n </div>\n\n {/* Counter + sparkline */}\n <div className=\"border-t border-border/60 bg-muted/20\">\n <div className=\"px-4 pt-3 pb-1\">\n <div className=\"text-[10px] uppercase tracking-wider text-muted-foreground\">\n {countLabelText}\n </div>\n <div\n className=\"text-2xl font-semibold text-foreground leading-tight\"\n title={String(plugin.activity_count ?? 0)}\n >\n {formatCount(plugin.activity_count ?? 0)}\n </div>\n </div>\n\n {chartInView ? (\n <PluginSparkline\n pluginId={plugin.id}\n seriesData={seriesData}\n hasSeriesData={hasSeriesData}\n color={color}\n />\n ) : (\n <div className=\"h-12 w-full\" aria-hidden=\"true\" />\n )}\n </div>\n\n {/* Footer action bar */}\n <div className=\"px-3 py-2 flex items-center justify-between gap-2 text-xs border-t border-border/40\">\n <span\n className=\"font-mono opacity-60 truncate text-muted-foreground\"\n title={slugOrId}\n >\n {slugOrId}\n </span>\n <div className=\"inline-flex items-center gap-1 flex-none\">\n {externalRoute && onPageClick && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onPageClick(externalRoute);\n }}\n className=\"inline-flex items-center gap-1 px-2 py-1 rounded-md text-[11px] font-medium text-foreground hover:bg-muted transition-colors duration-fast ease-standard\"\n title={\n isRTL\n ? \"فتح صفحة القدرة\"\n : \"Open capability page\"\n }\n >\n <ExternalLink className=\"h-3 w-3\" />\n {isRTL ? \"الصفحة\" : \"Page\"}\n </button>\n )}\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n onDetailClick?.(slugOrId);\n }}\n className=\"inline-flex items-center gap-1 px-2 py-1 rounded-md text-[11px] font-medium text-primary hover:bg-primary/10 transition-colors duration-fast ease-standard\"\n title={isRTL ? \"فتح تفاصيل الإضافة\" : \"Open plugin details\"}\n >\n <Settings2 className=\"h-3 w-3\" />\n {isRTL ? \"التفاصيل\" : \"Details\"}\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nPluginCard.displayName = \"PluginCard\";","'use client'\n\n// PluginSparkline — recharts AreaChart sparkline for PluginCard.\n//\n// Ported verbatim from app/src/components/superadmin/plugins/PluginSparkline.tsx.\n// Recharts is already in the package.json deps (v2.15.4).\n\nimport { Area, AreaChart, ResponsiveContainer } from \"recharts\";\nimport type { SparklinePoint } from \"./types\";\n\nexport interface PluginSparklineProps {\n pluginId: string;\n seriesData: SparklinePoint[];\n hasSeriesData: boolean;\n color: string;\n}\n\nexport const PluginSparkline = ({\n pluginId,\n seriesData,\n hasSeriesData,\n color,\n}: PluginSparklineProps) => {\n if (!hasSeriesData) {\n return <div className=\"h-12 w-full\" aria-hidden=\"true\" />;\n }\n\n const gradId = `pluginspark-${pluginId}`;\n\n return (\n <div className=\"h-12 w-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={seriesData} margin={{ top: 4, right: 0, bottom: 0, left: 0 }}>\n <defs>\n <linearGradient id={gradId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={0.45} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0} />\n </linearGradient>\n </defs>\n <Area\n type=\"monotone\"\n dataKey=\"n\"\n stroke={color}\n strokeWidth={1.5}\n strokeOpacity={1}\n fill={`url(#${gradId})`}\n isAnimationActive={false}\n dot={false}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n );\n};\n\nPluginSparkline.displayName = \"PluginSparkline\";\n","'use client'\n\n// PluginPageHeader — standard section header for plugin-detail sub-pages.\n//\n// ADAPTED from app/src/components/superadmin/plugins/PluginPageHeader.tsx:\n// - useLanguage hook → language prop\n// - No other changes needed.\n\nimport type { LucideIcon } from \"lucide-react\";\n\nexport interface PluginPageHeaderProps {\n icon?: LucideIcon;\n title_en: string;\n title_ar: string;\n subtitle_en?: string;\n subtitle_ar?: string;\n actions?: React.ReactNode;\n /** Current UI language. */\n language: \"en\" | \"ar\";\n}\n\nexport const PluginPageHeader = ({\n icon: Icon,\n title_en,\n title_ar,\n subtitle_en,\n subtitle_ar,\n actions,\n language,\n}: PluginPageHeaderProps) => {\n const isRTL = language === \"ar\";\n const title = isRTL ? title_ar : title_en;\n const subtitle = isRTL ? subtitle_ar : subtitle_en;\n\n return (\n <div className=\"mb-1\">\n <div className=\"flex items-center gap-2\">\n {Icon && (\n <Icon\n className=\"h-5 w-5 text-muted-foreground shrink-0\"\n aria-hidden=\"true\"\n />\n )}\n <h1 className=\"text-xl font-semibold text-foreground\">{title}</h1>\n {actions && (\n <div className=\"ms-auto flex items-center gap-2\">{actions}</div>\n )}\n </div>\n {subtitle && (\n <p className=\"mt-1 text-sm text-muted-foreground text-start\">\n {subtitle}\n </p>\n )}\n </div>\n );\n};\n\nPluginPageHeader.displayName = \"PluginPageHeader\";\n","'use client'\n\n// PluginSectionCard — standard section-card wrapper for plugin detail sub-pages.\n//\n// ADAPTED from app/src/components/superadmin/plugins/PluginSectionCard.tsx:\n// - useLanguage hook → language prop\n// - @/components/ui/* → ../ui/*; @/lib/utils → ../../lib/utils\n\nimport type { LucideIcon } from \"lucide-react\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"../ui/card\";\nimport { cn } from \"../../lib/utils\";\n\nexport interface PluginSectionCardProps {\n icon?: LucideIcon;\n title_en: string;\n title_ar: string;\n description_en?: string;\n description_ar?: string;\n /** Optional actions slot at the inline-end of the title row. */\n actions?: React.ReactNode;\n /** Adds destructive accent border for dangerous sections. */\n destructive?: boolean;\n className?: string;\n children: React.ReactNode;\n /** Current UI language. */\n language: \"en\" | \"ar\";\n}\n\nexport const PluginSectionCard = ({\n icon: Icon,\n title_en,\n title_ar,\n description_en,\n description_ar,\n actions,\n destructive,\n className,\n children,\n language,\n}: PluginSectionCardProps) => {\n const isRTL = language === \"ar\";\n const title = isRTL ? title_ar : title_en;\n const description = isRTL ? description_ar : description_en;\n\n return (\n <Card\n dir={isRTL ? \"rtl\" : \"ltr\"}\n className={cn(destructive && \"border-destructive/30\", className)}\n >\n <CardHeader className=\"pb-3\">\n <CardTitle\n className={cn(\n \"flex items-center gap-2 text-base font-medium\",\n destructive && \"text-destructive\"\n )}\n >\n {Icon && (\n <Icon\n className=\"h-4 w-4 shrink-0 text-muted-foreground\"\n aria-hidden=\"true\"\n />\n )}\n <span className=\"flex-1 text-start\">{title}</span>\n {actions && (\n <span className=\"flex items-center gap-2\">{actions}</span>\n )}\n </CardTitle>\n {description && (\n <p className=\"text-sm text-muted-foreground text-start\">\n {description}\n </p>\n )}\n </CardHeader>\n <CardContent className=\"space-y-4\">{children}</CardContent>\n </Card>\n );\n};\n\nPluginSectionCard.displayName = \"PluginSectionCard\";\n","'use client'\n\n/**\n * SourceBadge — branded pill for a source plugin (icon + label).\n *\n * Product-agnostic rewrite (Rule 25) of app/src/components/sources/SourceBadge.tsx:\n * the old version looked the label up via a translation registry and resolved\n * the icon via an app-only `plugin-icons` lib. Here the product passes the\n * already-resolved `label`, `navIcon` (a DynamicIcon name string), and optional\n * brand `color` — so the library carries no registry and no context dependency.\n *\n * Variants: pill (icon + label, default) · compact (icon only).\n * Sizes: xs · sm (default) · md.\n * When `href` is set the badge becomes an external link with a hover ring.\n *\n * Rules: 7 (displayName), 16 (semantic tokens, no hex literals in className).\n */\n\nimport { DynamicIcon } from '../nav/DynamicIcon'\nimport { cn } from '../../lib/utils'\n\nexport type SourceBadgeVariant = 'pill' | 'compact'\nexport type SourceBadgeSize = 'xs' | 'sm' | 'md'\n\nexport interface SourceBadgeProps {\n /** Display label (already localised by the product). */\n label: string\n /** DynamicIcon name string — \"si:openai\", \"lucide:zap\", \"bxl:reddit\", a URL, etc. */\n navIcon?: string | null\n /** Optional brand color (hex or CSS color) applied to the icon. */\n color?: string\n variant?: SourceBadgeVariant\n href?: string\n size?: SourceBadgeSize\n className?: string\n}\n\nconst SIZE_ICON: Record<SourceBadgeSize, string> = {\n xs: 'h-2.5 w-2.5',\n sm: 'h-3 w-3',\n md: 'h-3.5 w-3.5',\n}\nconst SIZE_TEXT: Record<SourceBadgeSize, string> = {\n xs: 'text-[10px]',\n sm: 'text-xs',\n md: 'text-sm',\n}\n\nexport const SourceBadge = ({\n label,\n navIcon,\n color,\n variant = 'pill',\n href,\n size = 'sm',\n className,\n}: SourceBadgeProps) => {\n const inner = (\n <>\n <span\n className=\"flex shrink-0 items-center justify-center\"\n style={color ? { color } : undefined}\n >\n <DynamicIcon name={navIcon ?? null} className={cn(SIZE_ICON[size], 'shrink-0')} />\n </span>\n {variant !== 'compact' && (\n <span className={cn(SIZE_TEXT[size], 'font-medium leading-none')}>{label}</span>\n )}\n </>\n )\n\n const baseClass = cn(\n 'inline-flex items-center gap-1.5 rounded-full bg-muted/40 px-2.5 py-1 transition-colors duration-fast ease-standard',\n 'border border-border/40',\n href && 'cursor-pointer hover:bg-muted hover:ring-2 hover:ring-primary/20',\n className,\n )\n\n // In compact (icon-only) variant the visible label is hidden, so expose it to\n // assistive tech via title/aria-label — otherwise the badge/link has no name.\n const a11yLabel = variant === 'compact' ? label : undefined\n\n if (href) {\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={baseClass}\n title={a11yLabel}\n aria-label={a11yLabel}\n >\n {inner}\n </a>\n )\n }\n\n return (\n <span className={baseClass} title={a11yLabel} aria-label={a11yLabel}>\n {inner}\n </span>\n )\n}\n\nSourceBadge.displayName = 'SourceBadge'\nexport default SourceBadge\n","// Plugin icon resolver.\n//\n// ADAPTED from app/src/components/superadmin/plugins/icon-resolver.ts:\n// - Ported si: / fa6: support using react-icons (added to sentra-ui deps).\n// - bxl: boxicons CSS-class component kept.\n// - lucide: + bare PascalCase kept.\n//\n// nav_icon value can take one of four shapes:\n//\n// 1. Prefixed brand reference (preferred for brand-name plugins):\n// \"si:openai\" → react-icons/si → SiOpenai\n// \"si:googlegemini\" → react-icons/si → SiGooglegemini\n// \"fa6:linkedin\" → react-icons/fa6 → FaLinkedin\n// \"bxl:reddit\" → boxicons class \"bxl-reddit\" (CSS, legacy)\n// \"lucide:zap\" → lucide-react → Zap\n//\n// 2. Bare Lucide PascalCase name (legacy, still supported):\n// \"Facebook\" → lucide-react.Facebook\n//\n// 3. Empty / null / unresolved → fallback to Box icon.\n//\n// NOTE (bundle size): namespace imports for SimpleIcons and Fa6Icons pull\n// the full library (~600 kB each minified). Acceptable for admin dashboards.\n// A product that ships to end-users should use a curated fast-path map instead.\n\nimport * as React from 'react'\nimport * as LucideIcons from 'lucide-react'\nimport { Box } from 'lucide-react'\nimport * as SimpleIcons from 'react-icons/si'\nimport * as Fa6Icons from 'react-icons/fa6'\n\ntype IconKind = 'lucide' | 'react-icons' | 'boxicons' | 'fallback'\n\nexport interface ResolvedIcon {\n Component: React.ElementType\n kind: IconKind\n}\n\nconst FALLBACK: ResolvedIcon = { Component: Box, kind: 'fallback' }\n\n// Convert \"openai\" → \"SiOpenai\", \"google-cloud\" → \"SiGooglecloud\".\n// Simple Icons uses the PascalCase of the stripped-lowercased slug.\nconst toSimpleIconsName = (slug: string): string => {\n const stripped = slug.replace(/[^a-z0-9]/gi, '').toLowerCase()\n if (!stripped) return ''\n return 'Si' + stripped.charAt(0).toUpperCase() + stripped.slice(1)\n}\n\n// Convert \"linkedin\" → \"FaLinkedin\", \"github\" → \"FaGithub\".\nconst toFaName = (slug: string): string => {\n const stripped = slug.replace(/[^a-z0-9]/gi, '').toLowerCase()\n if (!stripped) return ''\n return 'Fa' + stripped.charAt(0).toUpperCase() + stripped.slice(1)\n}\n\n// Box-icons logo component: wraps the global boxicons class in an <i> element.\n// Boxicons CSS must be loaded globally for this to render correctly.\nconst makeBoxiconsComponent = (cls: string): React.ElementType => {\n const Cmp = ({ className = '' }: { className?: string }) =>\n React.createElement('i', {\n className: ['bx', cls, className].filter(Boolean).join(' '),\n 'aria-hidden': true,\n })\n Cmp.displayName = `BoxIcon(${cls})`\n return Cmp\n}\n\nexport const resolveIcon = (navIcon: string | null | undefined): ResolvedIcon => {\n if (!navIcon || typeof navIcon !== 'string') return FALLBACK\n const trimmed = navIcon.trim()\n if (!trimmed) return FALLBACK\n\n // Prefixed: \"<scheme>:<slug>\"\n const colonIdx = trimmed.indexOf(':')\n if (colonIdx > 0) {\n const scheme = trimmed.slice(0, colonIdx).toLowerCase()\n const value = trimmed.slice(colonIdx + 1).trim()\n if (!value) return FALLBACK\n\n switch (scheme) {\n case 'si': {\n const name = toSimpleIconsName(value)\n const Cmp = (SimpleIcons as unknown as Record<string, React.ElementType | undefined>)[name]\n if (Cmp) return { Component: Cmp, kind: 'react-icons' }\n return FALLBACK\n }\n case 'fa6':\n case 'fa': {\n const name = toFaName(value)\n const Cmp = (Fa6Icons as unknown as Record<string, React.ElementType | undefined>)[name]\n if (Cmp) return { Component: Cmp, kind: 'react-icons' }\n return FALLBACK\n }\n case 'bxl':\n case 'bxs':\n case 'bx': {\n const cls = `${scheme}-${value.replace(/[^a-z0-9-]/gi, '').toLowerCase()}`\n return { Component: makeBoxiconsComponent(cls), kind: 'boxicons' }\n }\n case 'lucide': {\n // Allow either PascalCase (\"Zap\") or kebab (\"zap\") after lucide:.\n const pascal = value.charAt(0).toUpperCase() + value.slice(1)\n const candidates = [\n value,\n pascal,\n value.replace(/(^|-)([a-z])/g, (_, _dash, ch) => ch.toUpperCase()),\n ]\n for (const candidate of candidates) {\n const Cmp = (LucideIcons as unknown as Record<string, React.ElementType | undefined>)[candidate]\n if (Cmp) return { Component: Cmp, kind: 'lucide' }\n }\n return FALLBACK\n }\n default:\n // Unknown scheme — fall through to bare lookup.\n break\n }\n }\n\n // Bare Lucide name fallback (legacy seed values like \"Facebook\").\n const Lucide = (LucideIcons as unknown as Record<string, React.ElementType | undefined>)[trimmed]\n if (Lucide) return { Component: Lucide, kind: 'lucide' }\n\n return FALLBACK\n}\n","'use client'\n\n/**\n * WorkflowStepNode — recursive, readable pipeline step renderer.\n *\n * ADAPTED from app/src/components/superadmin/plugins/WorkflowStepNode.tsx:\n * - @/components/ui/* → ../ui/*\n * - @/lib/utils → ../../lib/utils\n * - useLanguage hook → removed; isRTL prop is external\n * - StepMetrics7d → inline type (no hook import)\n *\n * Seam: all data passes through props — no bridge/hook calls.\n */\n\nimport { useState } from 'react'\nimport {\n Clock,\n GitBranch,\n Database,\n Repeat,\n Sparkles,\n Code,\n Languages,\n Globe,\n PanelRightOpen,\n ChevronDown,\n ChevronUp,\n ChevronRight,\n BarChart2,\n ArrowDown,\n Trash2,\n} from 'lucide-react'\nimport { Badge } from '../ui/badge'\nimport { Button } from '../ui/button'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../ui/select'\nimport { cn } from '../../lib/utils'\nimport type { StepMetrics7d } from './types'\n\n// A path addresses a step in the nested tree.\ntype StepPath = (number | string)[]\nconst pathKey = (p: StepPath): string => p.join('.')\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyStep = Record<string, any>\n\nconst parseFromTable = (query: string): string | null => {\n if (!query) return null\n const m = query.match(/FROM\\s+([\\w.\"]+)/i)\n if (!m) return null\n return m[1].replace(/['\"]/g, '')\n}\n\nconst trunc = (s: string, max = 60): string =>\n s.length > max ? s.slice(0, max) + '…' : s\n\nconst parseLimit = (query: string): number | null => {\n const m = query.match(/LIMIT\\s+(\\d+)/i)\n return m ? parseInt(m[1], 10) : null\n}\n\ntype StepCategory = 'trigger' | 'condition' | 'query' | 'loop' | 'ai' | 'output' | 'transform' | 'generic'\n\nconst getCategory = (kind: string): StepCategory => {\n switch (kind) {\n case 'cron_trigger': return 'trigger'\n case 'if': return 'condition'\n case 'sql_select': return 'query'\n case 'for_each': return 'loop'\n case 'gemini_call': case 'adk_call': return 'ai'\n case 'sql_insert': case 'sql_update': return 'output'\n case 'json_extract': case 'translate': return 'transform'\n default: return 'generic'\n }\n}\n\nconst CATEGORY_STYLES: Record<StepCategory, { badge: string; border: string; icon: string }> = {\n trigger: { badge: 'bg-violet-100 text-violet-800 dark:bg-violet-900/40 dark:text-violet-300', border: 'border-s-violet-400', icon: 'text-violet-500' },\n condition: { badge: 'bg-amber-100 text-amber-800 dark:bg-amber-900/40 dark:text-amber-300', border: 'border-s-amber-400', icon: 'text-amber-500' },\n query: { badge: 'bg-blue-100 text-blue-800 dark:bg-blue-900/40 dark:text-blue-300', border: 'border-s-blue-400', icon: 'text-blue-500' },\n loop: { badge: 'bg-cyan-100 text-cyan-800 dark:bg-cyan-900/40 dark:text-cyan-300', border: 'border-s-cyan-400', icon: 'text-cyan-500' },\n ai: { badge: 'bg-emerald-100 text-emerald-800 dark:bg-emerald-900/40 dark:text-emerald-300', border: 'border-s-emerald-400', icon: 'text-emerald-500' },\n output: { badge: 'bg-rose-100 text-rose-800 dark:bg-rose-900/40 dark:text-rose-300', border: 'border-s-rose-400', icon: 'text-rose-500' },\n transform: { badge: 'bg-teal-100 text-teal-800 dark:bg-teal-900/40 dark:text-teal-300', border: 'border-s-teal-400', icon: 'text-teal-500' },\n generic: { badge: 'bg-muted text-muted-foreground', border: 'border-s-border', icon: 'text-muted-foreground' },\n}\n\nconst STEP_ICONS: Record<string, React.ElementType> = {\n cron_trigger: Clock,\n if: GitBranch,\n sql_select: Database,\n sql_insert: Database,\n sql_update: Database,\n for_each: Repeat,\n gemini_call: Sparkles,\n adk_call: Sparkles,\n json_extract: Code,\n translate: Languages,\n http_call: Globe,\n}\n\n// ── Inline summary per kind ───────────────────────────────────────────────────\n\n// ── Human-readable helpers (plain-language mode for non-technical readers) ──────\n\n// Friendly labels per step category (EN, AR).\nconst CATEGORY_LABEL: Record<StepCategory, [string, string]> = {\n trigger: ['Schedule', 'الجدولة'],\n condition: ['Condition', 'شرط'],\n query: ['Read data', 'قراءة البيانات'],\n loop: ['Repeat', 'تكرار'],\n ai: ['AI', 'ذكاء اصطناعي'],\n output: ['Save', 'حفظ'],\n transform: ['Transform', 'تحويل'],\n generic: ['Step', 'خطوة'],\n}\n\n// \"step-3\" → \"Step 3\" / \"الخطوة ٣\"\nconst friendlyStepNo = (id: string, isRTL: boolean): string => {\n const n = /(\\d+)\\s*$/.exec(String(id))?.[1]\n if (!n) return ''\n return isRTL ? `الخطوة ${n}` : `Step ${n}`\n}\n\n// \"15m\" → \"15 minutes\" / \"كل ١٥ دقيقة\"\nconst humanSchedule = (raw: unknown, isRTL: boolean): string => {\n const m = /^(\\d+)\\s*([smhd])$/.exec(String(raw ?? '').trim())\n if (!m) return String(raw ?? '')\n const n = Number(m[1])\n const U: Record<string, [string, string, string, string]> = {\n s: ['second', 'seconds', 'ثانية', 'ثوانٍ'],\n m: ['minute', 'minutes', 'دقيقة', 'دقائق'],\n h: ['hour', 'hours', 'ساعة', 'ساعات'],\n d: ['day', 'days', 'يوم', 'أيام'],\n }\n const u = U[m[2]]\n if (isRTL) return `${n} ${n === 1 ? u[2] : u[3]}`\n return n === 1 ? u[0] : `${n} ${u[1]}`\n}\n\n// strip $, schema prefix, and snake/kebab → spaced words: \"public.raw_envelopes\" → \"raw envelopes\"\nconst humanName = (s: unknown): string =>\n String(s ?? '').replace(/^\\$/, '').replace(/^[a-z0-9]+\\./i, '').replace(/[_-]+/g, ' ').trim()\n\n// One plain-language sentence describing what a step does.\nfunction humanStepSummary(step: AnyStep, isRTL: boolean): string {\n const kind: string = step.kind ?? step.type ?? '?'\n const t = (en: string, ar: string) => (isRTL ? ar : en)\n switch (kind) {\n case 'cron_trigger': {\n const s = humanSchedule(step.schedule ?? step.interval, isRTL)\n return t(`Runs automatically every ${s}`, `يعمل تلقائيًا كل ${s}`)\n }\n case 'if':\n return t('Continues only when the condition is met', 'يكمل فقط عند تحقّق الشرط')\n case 'for_each':\n return t('Repeats the next steps for each item', 'يكرّر الخطوات التالية لكل عنصر')\n case 'sql_select': {\n const from = humanName(parseFromTable(step.query ?? '') ?? '')\n const lim = parseLimit(step.query ?? '')\n const count = lim != null ? t(`up to ${lim} records`, `حتى ${lim} سجل`) : t('records', 'السجلات')\n return from\n ? t(`Looks up ${count} from ${from}`, `يجلب ${count} من ${from}`)\n : t(`Looks up ${count}`, `يجلب ${count}`)\n }\n case 'sql_insert': {\n const tb = humanName(step.table)\n return tb ? t(`Saves the results as ${tb}`, `يحفظ النتائج كـ ${tb}`) : t('Saves the results', 'يحفظ النتائج')\n }\n case 'sql_update': {\n const tb = humanName(step.table)\n return t(`Updates ${tb || 'the records'}`, `يحدّث ${tb || 'السجلات'}`)\n }\n case 'gemini_call':\n case 'adk_call': {\n const task = humanName(step.prompt_slug ?? step.prompt_id ?? '')\n return task\n ? t(`Uses AI to ${task}`, `يستخدم الذكاء الاصطناعي لـ ${task}`)\n : t('Uses AI to analyze the data', 'يستخدم الذكاء الاصطناعي لتحليل البيانات')\n }\n case 'http_request':\n case 'http_call':\n return t('Calls an external service', 'يستدعي خدمة خارجية')\n case 'send_email':\n case 'email':\n return t('Sends an email notification', 'يرسل إشعارًا عبر البريد الإلكتروني')\n case 'webhook':\n return t('Sends a webhook notification', 'يرسل إشعار ويب هوك')\n default:\n return t(`Runs the “${humanName(kind)}” step`, `ينفّذ خطوة «${humanName(kind)}»`)\n }\n}\n\nconst StepSummary = ({ step, isRTL, humanize }: { step: AnyStep; isRTL: boolean; humanize?: boolean }) => {\n const lbl = (en: string, ar: string) => (isRTL ? ar : en)\n const [showQuery, setShowQuery] = useState(false)\n const kind: string = step.kind ?? '?'\n\n // Plain-language mode: one friendly sentence, no raw SQL/code.\n if (humanize) {\n return <span className=\"text-xs text-foreground/80\">{humanStepSummary(step, isRTL)}</span>\n }\n\n if (kind === 'cron_trigger') {\n const schedule = step.schedule ?? step.interval ?? '?'\n const minSec = step.min_interval_sec\n return (\n <span className=\"text-xs text-muted-foreground font-mono\">\n {lbl('every', 'كل')} <span className=\"text-foreground font-medium\">{schedule}</span>\n {minSec != null && <span className=\"ms-1 opacity-60\">(min {minSec}s)</span>}\n </span>\n )\n }\n\n if (kind === 'if') {\n const cond = step.condition ?? '?'\n return (\n <span className=\"text-xs text-muted-foreground\">\n {lbl('if', 'إذا')} <code className=\"text-foreground bg-muted rounded px-1 py-0.5 text-[11px]\">{trunc(String(cond), 80)}</code>\n </span>\n )\n }\n\n if (kind === 'sql_select') {\n const query: string = step.query ?? ''\n const fromTable = parseFromTable(query) ?? '?'\n const output = step.output ?? step.target_field ?? '?'\n const limit = parseLimit(query)\n return (\n <div className=\"text-xs text-muted-foreground space-y-1\">\n <div>\n {lbl('SELECT from', 'اختيار من')} <code className=\"text-foreground bg-muted rounded px-1 py-0.5 text-[11px]\">{fromTable}</code>\n {' → '}\n <code className=\"text-emerald-700 dark:text-emerald-400 bg-emerald-50 dark:bg-emerald-900/30 rounded px-1 py-0.5 text-[11px]\">${output}</code>\n {limit != null && <span className=\"ms-1 opacity-60\">(LIMIT {limit})</span>}\n </div>\n {query && (\n <button\n type=\"button\"\n className=\"flex items-center gap-1 text-[10px] text-primary/70 hover:text-primary underline-offset-2 hover:underline\"\n onClick={() => setShowQuery((v) => !v)}\n >\n {showQuery\n ? <><ChevronDown className=\"h-3 w-3\" />{lbl('hide query', 'إخفاء الاستعلام')}</>\n : <><ChevronRight className=\"h-3 w-3 rtl:rotate-180\" />{lbl('show query', 'عرض الاستعلام')}</>\n }\n </button>\n )}\n {showQuery && (\n <pre className=\"mt-1 rounded bg-muted p-2 text-[10px] leading-relaxed whitespace-pre-wrap break-all max-h-40 overflow-y-auto font-mono\" dir=\"ltr\">\n {query}\n </pre>\n )}\n </div>\n )\n }\n\n if (kind === 'for_each') {\n const over = step.over ?? step.items ?? '?'\n return (\n <span className=\"text-xs text-muted-foreground\">\n {lbl('for each', 'لكل')} <code className=\"text-foreground bg-muted rounded px-1 py-0.5 text-[11px]\">{String(over)}</code>\n {' →'}\n </span>\n )\n }\n\n if (kind === 'sql_insert') {\n const table = step.table ?? '?'\n const cols: string[] = Array.isArray(step.columns) ? step.columns : []\n const onConflict = step.on_conflict\n return (\n <span className=\"text-xs text-muted-foreground\">\n {lbl('INSERT into', 'إدراج في')} <code className=\"text-foreground bg-muted rounded px-1 py-0.5 text-[11px]\">{table}</code>\n {cols.length > 0 && <span className=\"ms-1 opacity-70\">({cols.length} {lbl('columns', 'أعمدة')})</span>}\n {onConflict && <span className=\"ms-1 opacity-60 text-[10px]\">ON CONFLICT {trunc(String(onConflict), 30)}</span>}\n </span>\n )\n }\n\n if (kind === 'sql_update') {\n const table = step.table ?? '?'\n const setKeys = step.set && typeof step.set === 'object' ? Object.keys(step.set) : []\n return (\n <span className=\"text-xs text-muted-foreground\">\n {lbl('UPDATE', 'تحديث')} <code className=\"text-foreground bg-muted rounded px-1 py-0.5 text-[11px]\">{table}</code>\n {setKeys.length > 0 && (\n <span className=\"ms-1 opacity-70\">\n SET {setKeys.slice(0, 4).join(', ')}{setKeys.length > 4 ? '…' : ''}\n </span>\n )}\n </span>\n )\n }\n\n if (kind === 'gemini_call') {\n const prompt = step.prompt_slug ?? step.prompt_id ?? step.model ?? '?'\n const target = step.target_field ?? step.output ?? ''\n return (\n <span className=\"text-xs text-muted-foreground\">\n {lbl('Gemini: prompt=', 'Gemini: نموذج=')}\n <code className=\"text-foreground bg-muted rounded px-1 py-0.5 text-[11px]\">{String(prompt)}</code>\n {target && (\n <> {' → '}<code className=\"text-emerald-700 dark:text-emerald-400 bg-emerald-50 dark:bg-emerald-900/30 rounded px-1 py-0.5 text-[11px]\">${target}</code></>\n )}\n </span>\n )\n }\n\n if (kind === 'adk_call') {\n const hasInline = !!step.prompt_inline\n const promptLabel = hasInline\n ? lbl('inline prompt', 'نص مضمّن')\n : (step.prompt_slug ?? step.prompt_id ?? '?')\n const modelLabel: string = step.model ?? 'gemini-2.5-flash'\n const target = step.target_field ?? 'adk_response'\n return (\n <span className=\"text-xs text-muted-foreground\">\n {lbl('ADK: ', 'ADK: ')}\n <code className=\"text-foreground bg-muted rounded px-1 py-0.5 text-[11px]\">\n {hasInline ? <em>{promptLabel}</em> : String(promptLabel)}\n </code>\n <span className=\"ms-1 opacity-60 text-[10px]\">{modelLabel}</span>\n {' → '}\n <code className=\"text-emerald-700 dark:text-emerald-400 bg-emerald-50 dark:bg-emerald-900/30 rounded px-1 py-0.5 text-[11px]\">${target}</code>\n </span>\n )\n }\n\n if (kind === 'json_extract') {\n const exprs: unknown[] = Array.isArray(step.expressions) ? step.expressions : []\n const source = step.source ?? step.from ?? ''\n return (\n <span className=\"text-xs text-muted-foreground\">\n {lbl('extract', 'استخراج')} <span className=\"text-foreground\">{exprs.length > 0 ? exprs.slice(0, 3).join(', ') : '?'}</span>\n {source && <> {lbl('from', 'من')} <code className=\"bg-muted rounded px-1 py-0.5 text-[11px]\">${source}</code></>}\n </span>\n )\n }\n\n if (kind === 'translate') {\n const textExpr = step.text ?? step.source_field ?? '?'\n const target = step.target_field ?? '?'\n const srcLang = step.source_lang ?? 'en'\n const tgtLang = step.target_lang ?? 'ar'\n return (\n <span className=\"text-xs text-muted-foreground\">\n {lbl('translate', 'ترجمة')} <code className=\"bg-muted rounded px-1 py-0.5 text-[11px]\">{String(textExpr)}</code>\n {' → '}\n <code className=\"text-emerald-700 dark:text-emerald-400 bg-emerald-50 dark:bg-emerald-900/30 rounded px-1 py-0.5 text-[11px]\">${target}</code>\n <span className=\"ms-1 opacity-60\">({srcLang}→{tgtLang})</span>\n </span>\n )\n }\n\n if (kind === 'http_call') {\n const method = step.method ?? 'GET'\n const url: string = step.url ?? ''\n let host = url\n try { host = new URL(url).hostname } catch { /* raw */ }\n return (\n <span className=\"text-xs text-muted-foreground\">\n <Badge variant=\"outline\" className=\"me-1 font-mono text-[10px] h-4\">{method}</Badge>\n <span className=\"text-foreground\">{trunc(host, 50)}</span>\n </span>\n )\n }\n\n const label = step.label_en ?? step.label ?? ''\n if (label) {\n return <span className=\"text-xs text-muted-foreground\">{trunc(String(label), 80)}</span>\n }\n return null\n}\nStepSummary.displayName = 'StepSummary'\n\n// ── Metrics chip ──────────────────────────────────────────────────────────────\n\nconst MetricsChip = ({ runs, errors }: { runs: number; errors: number }) => {\n const okPct = runs > 0 ? Math.round(((runs - errors) / runs) * 100) : 100\n return (\n <div className=\"flex items-center gap-1 rounded-full border bg-muted/50 px-2 py-0.5 text-[10px] text-muted-foreground\">\n <BarChart2 className=\"h-3 w-3\" />\n <span>{runs}r / {okPct}%ok</span>\n </div>\n )\n}\nMetricsChip.displayName = 'MetricsChip'\n\nconst StepConnector = () => (\n <div className=\"flex justify-center py-0.5\">\n <ArrowDown className=\"h-3.5 w-3.5 text-border\" aria-hidden />\n </div>\n)\nStepConnector.displayName = 'StepConnector'\n\n// ── Inline add control ────────────────────────────────────────────────────────\n\nconst NestedAddControl = ({ isRTL, addableKinds, onAdd }: {\n isRTL: boolean\n addableKinds: string[]\n onAdd: (kind: string) => void\n}) => {\n const lbl = (en: string, ar: string) => (isRTL ? ar : en)\n const [kind, setKind] = useState('')\n return (\n <div className=\"flex items-center gap-1.5 pt-1\">\n <Select value={kind} onValueChange={setKind}>\n <SelectTrigger className=\"h-6 w-36 text-[11px]\">\n <SelectValue placeholder={lbl('+ add…', '+ إضافة…')} />\n </SelectTrigger>\n <SelectContent>\n {addableKinds.map((k) => (\n <SelectItem key={k} value={k} className=\"text-[11px] font-mono\">{k}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button\n size=\"sm\" variant=\"ghost\" className=\"h-6 px-1.5 text-[11px]\"\n disabled={!kind}\n onClick={() => { if (kind) { onAdd(kind); setKind('') } }}\n >\n {lbl('Add', 'إضافة')}\n </Button>\n </div>\n )\n}\nNestedAddControl.displayName = 'NestedAddControl'\n\n// ── Main recursive node ───────────────────────────────────────────────────────\n\nexport interface WorkflowStepNodeProps {\n step: AnyStep\n path: StepPath\n depth: number\n isRTL: boolean\n metrics?: StepMetrics7d\n editingPath?: string | null\n onEditRequest?: (path: StepPath) => void\n onDelete?: (path: StepPath) => void\n onMove?: (path: StepPath, dir: -1 | 1) => void\n onAdd?: (containerPath: StepPath, kind: string) => void\n addableKinds?: string[]\n renderEditor?: (step: AnyStep, path: StepPath) => React.ReactNode\n /** Plain-language mode for non-technical readers (friendly badge + sentence,\n * no raw SQL/code). Default: true. Pass false for the developer view. */\n humanize?: boolean\n}\n\nexport const WorkflowStepNode = ({\n step,\n path,\n depth,\n isRTL,\n metrics,\n editingPath,\n onEditRequest,\n onDelete,\n onMove,\n onAdd,\n addableKinds = [],\n renderEditor,\n humanize = true,\n}: WorkflowStepNodeProps) => {\n const lbl = (en: string, ar: string) => (isRTL ? ar : en)\n const kind: string = step.kind ?? step.type ?? '?'\n const stepId: string = step.id ?? ''\n const category = getCategory(kind)\n const styles = CATEGORY_STYLES[category]\n const IconCmp = STEP_ICONS[kind] ?? PanelRightOpen\n\n const thenSteps: AnyStep[] = Array.isArray(step.then) ? step.then : []\n const elseSteps: AnyStep[] = Array.isArray(step.else) ? step.else : []\n const loopSteps: AnyStep[] = Array.isArray(step.steps) ? step.steps : []\n\n const m = metrics && stepId ? metrics[stepId] : undefined\n const isEditing = editingPath != null && editingPath === pathKey(path)\n\n const renderBranch = (children: AnyStep[], arrName: 'then' | 'else' | 'steps', railColor: string, label: string) => (\n <div className={cn('mt-2 ms-6 space-y-1.5 border-s-2 border-dashed ps-3', railColor)}>\n <div className=\"text-[10px] text-muted-foreground font-medium uppercase tracking-wide mb-1\">{label}</div>\n {children.map((child, ci) => (\n <div key={child.id ?? ci}>\n {ci > 0 && <StepConnector />}\n <WorkflowStepNode\n step={child}\n path={[...path, arrName, ci]}\n depth={depth + 1}\n isRTL={isRTL}\n metrics={metrics}\n editingPath={editingPath}\n onEditRequest={onEditRequest}\n onDelete={onDelete}\n onMove={onMove}\n onAdd={onAdd}\n addableKinds={addableKinds}\n renderEditor={renderEditor}\n humanize={humanize}\n />\n </div>\n ))}\n {onAdd && (\n <NestedAddControl isRTL={isRTL} addableKinds={addableKinds} onAdd={(k) => onAdd([...path, arrName], k)} />\n )}\n </div>\n )\n\n return (\n <div className=\"relative\">\n {depth > 0 && (\n <div className=\"absolute start-0 top-0 bottom-0 w-px bg-border/60\" style={{ insetInlineStart: '-12px' }} aria-hidden />\n )}\n\n <div\n className={cn(\n 'rounded-md border border-s-2 bg-card shadow-sm',\n styles.border,\n isEditing && 'ring-1 ring-primary/40',\n )}\n >\n <div className=\"flex items-start gap-2 px-3 py-2\">\n <div className={cn('mt-0.5 shrink-0', styles.icon)}>\n <IconCmp className=\"h-3.5 w-3.5\" aria-hidden />\n </div>\n\n <div className=\"flex-1 min-w-0 space-y-1\">\n <div className=\"flex items-center gap-1.5 flex-wrap\">\n <Badge variant=\"secondary\" className={cn('h-4 rounded-sm text-[10px] px-1', !humanize && 'font-mono', styles.badge)}>\n {humanize ? lbl(CATEGORY_LABEL[category][0], CATEGORY_LABEL[category][1]) : kind}\n </Badge>\n {stepId && (\n <span className={cn('text-[10px] text-muted-foreground/50', !humanize && 'font-mono')}>\n {humanize ? friendlyStepNo(stepId, isRTL) : stepId}\n </span>\n )}\n {m && <MetricsChip runs={m.runs} errors={m.errors} />}\n </div>\n <StepSummary step={step} isRTL={isRTL} humanize={humanize} />\n </div>\n\n <div className=\"flex items-center gap-0.5 shrink-0\">\n {onMove && (\n <>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" className=\"h-6 w-6 p-0\" title={lbl('Move up', 'لأعلى')} onClick={() => onMove(path, -1)}>\n <ChevronUp className=\"h-3 w-3\" />\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" className=\"h-6 w-6 p-0\" title={lbl('Move down', 'لأسفل')} onClick={() => onMove(path, 1)}>\n <ChevronDown className=\"h-3 w-3\" />\n </Button>\n </>\n )}\n {onEditRequest && (\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" className=\"h-6 px-2 text-[11px]\" onClick={() => onEditRequest(path)}>\n {isEditing ? lbl('Close', 'إغلاق') : lbl('Edit', 'تعديل')}\n </Button>\n )}\n {onDelete && (\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" className=\"h-6 w-6 p-0 text-destructive/70 hover:text-destructive\" title={lbl('Delete', 'حذف')} onClick={() => onDelete(path)}>\n <Trash2 className=\"h-3 w-3\" />\n </Button>\n )}\n </div>\n </div>\n\n {isEditing && renderEditor && (\n <div className=\"border-t px-3 pb-3 pt-2\">\n {renderEditor(step, path)}\n </div>\n )}\n </div>\n\n {(loopSteps.length > 0 || (onAdd && kind === 'for_each')) &&\n renderBranch(loopSteps, 'steps', 'border-cyan-300/60', lbl('loop body', 'جسم الحلقة'))}\n\n {(thenSteps.length > 0 || (onAdd && kind === 'if')) &&\n renderBranch(thenSteps, 'then', 'border-amber-300/60', lbl('then', 'عندها'))}\n\n {elseSteps.length > 0 &&\n renderBranch(elseSteps, 'else', 'border-slate-300/60', lbl('else', 'وإلا'))}\n </div>\n )\n}\n\nWorkflowStepNode.displayName = 'WorkflowStepNode'\n","'use client'\n\n/**\n * WorkflowPipeline — read-only flex pipeline lane viewer.\n *\n * ADAPTED from app/src/components/superadmin/plugins/WorkflowPipeline.tsx:\n * - @/components/ui/* → ../ui/*\n * - @/lib/utils → ../../lib/utils\n * - @/contexts/LanguageContext (useLanguage) → isRTL prop\n * - @/lib/workflow-stages (STAGES, PipelineModel...) → props + local STAGES\n *\n * Seam: model + isRTL are external. No bridge/hook calls.\n */\n\nimport { ChevronRight } from 'lucide-react'\nimport { Card, CardContent } from '../ui/card'\nimport { Badge } from '../ui/badge'\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '../ui/tooltip'\nimport { cn } from '../../lib/utils'\nimport type { PipelineModel, PipelineLane, PipelineCard } from './types'\n\n// Default stages — matches the 5-stage pipeline from workflow-stages.ts.\n// Callers can override by composing their own PipelineLane[] in model.stages.\nexport const PIPELINE_STAGES = [\n { key: 'fetch', label_en: 'Fetch', label_ar: 'جلب' },\n { key: 'parse', label_en: 'Parse', label_ar: 'تحليل' },\n { key: 'enrich', label_en: 'Enrich', label_ar: 'إثراء' },\n { key: 'enhance', label_en: 'Enhance', label_ar: 'تحسين' },\n { key: 'save', label_en: 'Save', label_ar: 'حفظ' },\n]\n\n// ── Props ─────────────────────────────────────────────────────────────────────\n\nexport interface WorkflowPipelineProps {\n model: PipelineModel\n /** Current UI direction. Default false (LTR). */\n isRTL?: boolean\n}\n\n// ── SVC badge colour ──────────────────────────────────────────────────────────\n\ntype BadgeVariant = 'default' | 'secondary' | 'outline' | 'destructive'\n\nconst svcBadgeVariant = (svc: string): BadgeVariant => {\n if (!svc || svc === 'direct (HTTP)' || svc === 'unknown' || svc === 'direct') {\n return 'secondary'\n }\n return 'default'\n}\n\n// ── Metrics pill ──────────────────────────────────────────────────────────────\n\ninterface MetricsPillProps {\n ok_rate: number\n p50_ms: number\n last_error?: string\n isRTL: boolean\n}\n\nconst MetricsPill = ({ ok_rate, p50_ms, last_error, isRTL }: MetricsPillProps) => {\n const bad = ok_rate < 0.5\n const pct = Math.round(ok_rate * 100)\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <div\n className={cn(\n 'flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-mono tabular-nums w-fit',\n bad\n ? 'bg-destructive/10 text-destructive'\n : 'bg-green-50 text-green-700 dark:bg-green-950/30 dark:text-green-400',\n )}\n >\n <span>{pct}%</span>\n <span className=\"text-muted-foreground\">·</span>\n <span>{p50_ms}ms</span>\n </div>\n </TooltipTrigger>\n {last_error && (\n <TooltipContent side=\"bottom\" dir={isRTL ? 'rtl' : 'ltr'} className=\"max-w-xs text-xs\">\n {isRTL ? 'آخر خطأ: ' : 'Last error: '}\n {last_error}\n </TooltipContent>\n )}\n </Tooltip>\n </TooltipProvider>\n )\n}\nMetricsPill.displayName = 'MetricsPill'\n\n// ── Pipeline card ─────────────────────────────────────────────────────────────\n\ninterface PipelineCardViewProps {\n card: PipelineCard\n isRTL: boolean\n}\n\nconst PipelineCardView = ({ card, isRTL }: PipelineCardViewProps) => {\n const title = isRTL ? card.title_ar : card.title_en\n\n return (\n <Card\n className={cn(\n 'w-full border transition-all duration-fast ease-standard',\n card.isSynthetic\n ? 'border-dashed border-muted-foreground/40 bg-muted/20'\n : 'bg-card',\n )}\n >\n <CardContent className=\"px-3 py-2.5 space-y-1.5\">\n <div className=\"flex items-start gap-2 flex-wrap\">\n <span className=\"text-xs font-semibold leading-snug flex-1 min-w-0 break-words\">\n {title}\n </span>\n {card.isSynthetic && (\n <Badge variant=\"outline\" className=\"text-[10px] shrink-0 text-muted-foreground\">\n {isRTL ? 'مشتق' : 'derived'}\n </Badge>\n )}\n </div>\n\n {card.svc && (\n <Badge\n variant={svcBadgeVariant(card.svc)}\n className=\"text-[10px] font-mono truncate max-w-full\"\n title={card.svc}\n >\n {card.svc}\n </Badge>\n )}\n\n {card.summary.length > 0 && (\n <dl className=\"space-y-0.5\">\n {card.summary.map(({ label, value }) => (\n <div key={label} className=\"flex items-start gap-1 text-[10px]\">\n <dt className=\"text-muted-foreground shrink-0\">{label}:</dt>\n <dd className=\"font-mono text-foreground truncate\" dir=\"ltr\" title={value}>\n {value}\n </dd>\n </div>\n ))}\n </dl>\n )}\n\n {card.metrics && (\n <MetricsPill\n ok_rate={card.metrics.ok_rate}\n p50_ms={card.metrics.p50_ms}\n last_error={card.metrics.last_error}\n isRTL={isRTL}\n />\n )}\n </CardContent>\n </Card>\n )\n}\nPipelineCardView.displayName = 'PipelineCardView'\n\n// ── Lane column ───────────────────────────────────────────────────────────────\n\ninterface LaneColumnProps {\n lane: PipelineLane\n isRTL: boolean\n isLast: boolean\n}\n\nconst LaneColumn = ({ lane, isRTL, isLast }: LaneColumnProps) => {\n const label = isRTL ? lane.label_ar : lane.label_en\n\n return (\n <div className=\"flex items-stretch gap-0 flex-1 min-w-0\">\n <div className=\"flex flex-col gap-0 flex-1 min-w-0\">\n <div className=\"rounded-t-lg border border-b-0 bg-muted/40 px-3 py-1.5\">\n <span className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider\">\n {label}\n </span>\n </div>\n\n <div className=\"flex-1 rounded-b-lg border bg-muted/10 px-2 py-2 space-y-2 min-h-[80px]\">\n {lane.cards.length === 0 ? (\n <div className=\"flex items-center justify-center h-full min-h-[60px]\">\n <span className=\"text-[10px] text-muted-foreground/50\">—</span>\n </div>\n ) : (\n lane.cards.map((card) => (\n <PipelineCardView key={card.id} card={card} isRTL={isRTL} />\n ))\n )}\n </div>\n </div>\n\n {!isLast && (\n <div className=\"flex items-center justify-center px-1 shrink-0 self-stretch\">\n <ChevronRight\n className={cn(\n 'h-4 w-4 text-muted-foreground/50 shrink-0',\n isRTL && 'rotate-180',\n )}\n aria-hidden=\"true\"\n />\n </div>\n )}\n </div>\n )\n}\nLaneColumn.displayName = 'LaneColumn'\n\n// ── Parallel branches legend ──────────────────────────────────────────────────\n\ninterface BranchLegendProps {\n fetchBranches: PipelineCard[]\n isRTL: boolean\n}\n\nconst BranchLegend = ({ fetchBranches, isRTL }: BranchLegendProps) => {\n if (fetchBranches.length <= 1) return null\n\n return (\n <div className=\"flex flex-wrap items-center gap-2 text-[11px] text-muted-foreground\">\n <span className=\"font-medium\">\n {isRTL ? 'فروع الجلب المتوازية:' : 'Parallel fetch branches:'}\n </span>\n {fetchBranches.map((card) => (\n <span\n key={card.id}\n className=\"inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5\"\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-primary/60 shrink-0\" />\n <span>{isRTL ? card.title_ar : card.title_en}</span>\n </span>\n ))}\n <span className=\"text-muted-foreground/60\">\n {isRTL\n ? '← تتقارع في Enhance + Save'\n : '→ converge on Enhance + Save'}\n </span>\n </div>\n )\n}\nBranchLegend.displayName = 'BranchLegend'\n\n// ── WorkflowPipeline (root) ───────────────────────────────────────────────────\n\nexport const WorkflowPipeline = ({ model, isRTL = false }: WorkflowPipelineProps) => {\n const hasContent = model.stages.some((l) => l.cards.length > 0)\n\n return (\n <div dir={isRTL ? 'rtl' : 'ltr'} className=\"space-y-4\">\n {model.fetchBranches.length > 1 && (\n <BranchLegend fetchBranches={model.fetchBranches} isRTL={isRTL} />\n )}\n\n {hasContent ? (\n <div\n className=\"rounded-xl border bg-background p-4 overflow-x-auto\"\n style={{\n backgroundImage:\n 'radial-gradient(circle, var(--border) 1px, transparent 1px)',\n backgroundSize: '16px 16px',\n }}\n >\n <div className=\"flex items-stretch gap-0 pb-2 min-w-fit\">\n {PIPELINE_STAGES.map((stage, idx) => {\n const lane = model.stages.find((l) => l.key === stage.key)\n if (!lane) return null\n return (\n <LaneColumn\n key={stage.key}\n lane={lane}\n isRTL={isRTL}\n isLast={idx === PIPELINE_STAGES.length - 1}\n />\n )\n })}\n </div>\n </div>\n ) : (\n <div className=\"flex items-center justify-center rounded-lg border border-dashed bg-muted/20 h-40\">\n <p className=\"text-sm text-muted-foreground\">\n {isRTL\n ? 'لا توجد خطوات في سير العمل'\n : 'No workflow steps configured'}\n </p>\n </div>\n )}\n </div>\n )\n}\nWorkflowPipeline.displayName = 'WorkflowPipeline'\n\nexport default WorkflowPipeline\n","'use client'\n\n/**\n * WorkflowEditor — drag-reorderable list editor for plugin workflow_steps + sources.\n *\n * ADAPTED from app/src/components/superadmin/plugins/WorkflowEditor.tsx:\n * - @/components/ui/* → ../ui/*\n * - @/lib/utils → ../../lib/utils\n * - useLanguage (LanguageContext) → language prop (string)\n * - useSaveWorkflow hook → removed; onSave(steps, sources) callback seam\n * - AIKeywordPanel → removed (host product wires if needed)\n * - toast (sonner) → kept (sonner is in sentra-ui deps)\n * - PipelineModel → removed (not needed by editor)\n * - WorkflowPalette type → imported from ./types\n * - WorkflowValidationError → removed (caller handles bridge error shape)\n *\n * DND: uses @dnd-kit/core + @dnd-kit/sortable — these are added to sentra-ui\n * package.json (dnd-kit is already in the host app; pulled as peer here).\n *\n * Seams:\n * - workflowSteps / workflowSources: raw JSONB arrays (initial state)\n * - onSave(steps, sources): called when operator hits Save; returns Promise\n * - pluginSlug: passed to EditSourceDialog for Credentials links\n * - language: 'en' | 'ar'\n * - palette: optional WorkflowPalette (SVC picker items)\n */\n\nimport { useState, useCallback, useMemo } from 'react'\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from '@dnd-kit/core'\nimport {\n SortableContext,\n sortableKeyboardCoordinates,\n useSortable,\n verticalListSortingStrategy,\n arrayMove,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport {\n Save,\n RotateCcw,\n Plus,\n Trash2,\n AlertTriangle,\n Pencil,\n GripVertical,\n Database,\n Search,\n Rss,\n Globe,\n Code,\n Info,\n ExternalLink,\n} from 'lucide-react'\nimport { toast } from 'sonner'\n\nimport { Button } from '../ui/button'\nimport { Badge } from '../ui/badge'\nimport { Switch } from '../ui/switch'\nimport { Label } from '../ui/label'\nimport { Input } from '../ui/input'\nimport { Textarea } from '../ui/textarea'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../ui/select'\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogFooter,\n} from '../ui/dialog'\nimport { Separator } from '../ui/separator'\nimport { cn } from '../../lib/utils'\nimport type { WorkflowPalette, WorkflowStep, WorkflowSource } from './types'\nimport { NestedStepsEditor } from './NestedStepsEditor'\nimport { StepOptionsDialog } from './StepOptionsDialog'\n\n// ── nested-tree helpers (steps can contain then/else/steps branches) ──\nconst BR = ['then', 'else', 'steps'] as const\nlet _wid = 0\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction assignUids(steps: any[]): any[] {\n return (steps ?? []).map((s) => {\n const n = { ...s, _uid: s._uid ?? `wstep-${_wid++}` }\n for (const k of BR) if (Array.isArray(n[k])) n[k] = assignUids(n[k])\n return n\n })\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction updateByUid(steps: any[], uid: string, next: any): any[] {\n return steps.map((s) => {\n if (String(s._uid) === uid) return { ...next, _uid: s._uid }\n let changed = false\n const c = { ...s }\n for (const k of BR) if (Array.isArray(c[k])) { const r = updateByUid(c[k], uid, next); if (r !== c[k]) { c[k] = r; changed = true } }\n return changed ? c : s\n })\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction deleteByUid(steps: any[], uid: string): any[] {\n const out: any[] = []\n for (const s of steps) {\n if (String(s._uid) === uid) continue\n const c = { ...s }\n for (const k of BR) if (Array.isArray(c[k])) c[k] = deleteByUid(c[k], uid)\n out.push(c)\n }\n return out\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction stripUidsDeep(o: any): any {\n if (Array.isArray(o)) return o.map(stripUidsDeep)\n if (o && typeof o === 'object') {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { _uid, ...rest } = o\n const r: Record<string, any> = {}\n for (const k of Object.keys(rest)) r[k] = stripUidsDeep(rest[k])\n return r\n }\n return o\n}\n\n// ── Constants ─────────────────────────────────────────────────────────────────\n\nconst PROTO_POLLUTION_KEYS = ['__proto__', 'constructor', 'prototype']\n\nconst SOURCE_TYPES = [\n { type: 'searxng_social', label_en: 'SearxNG Social', label_ar: 'سيركس اجتماعي' },\n { type: 'crawler', label_en: 'Web Crawler', label_ar: 'زاحف الويب' },\n { type: 'http', label_en: 'HTTP Source', label_ar: 'مصدر HTTP' },\n { type: 'api', label_en: 'API Source', label_ar: 'مصدر API' },\n { type: 'meltwater', label_en: 'Meltwater', label_ar: 'ميلت ووتر' },\n]\n\nconst STEP_KINDS = [\n { kind: 'rss_poll', label_en: 'RSS Poll', label_ar: 'استطلاع RSS' },\n { kind: 'search_query', label_en: 'Search Query', label_ar: 'استعلام بحث' },\n { kind: 'http_call', label_en: 'HTTP Call', label_ar: 'طلب HTTP' },\n { kind: 'web_scrape', label_en: 'Web Scrape', label_ar: 'جلب صفحات' },\n { kind: 'sql_insert', label_en: 'SQL Insert', label_ar: 'إدراج SQL' },\n]\n\nconst STEP_LABELS: Record<string, { en: string; ar: string }> = {\n rss_poll: { en: 'RSS Poll', ar: 'استطلاع RSS' },\n search_query: { en: 'Search Query', ar: 'استعلام بحث' },\n http_call: { en: 'HTTP Call', ar: 'طلب HTTP' },\n web_scrape: { en: 'Web Scrape', ar: 'جلب صفحات' },\n sql_insert: { en: 'SQL Insert', ar: 'إدراج SQL' },\n}\n\nconst kindIcon = (kind: string) => {\n switch (kind) {\n case 'search_query': return Search\n case 'rss_poll': return Rss\n case 'http_call': return Globe\n case 'web_scrape': return Code\n case 'sql_insert': return Database\n default: return Code\n }\n}\n\n// ── Security helper ───────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst hasProtoPollutionKey = (obj: any): boolean => {\n if (!obj || typeof obj !== 'object') return false\n return Object.keys(obj).some((k) => PROTO_POLLUTION_KEYS.includes(k))\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst stepSummary = (step: any, isRTL: boolean): string => {\n const kind = step?.kind ?? ''\n if (kind === 'search_query') {\n const n = Array.isArray(step.queries) ? step.queries.length : 0\n return isRTL ? `${n} استعلام بحث` : `${n} search ${n === 1 ? 'query' : 'queries'}`\n }\n if (kind === 'rss_poll') {\n const n = Array.isArray(step.urls) ? step.urls.length : 0\n return isRTL ? `${n} رابط RSS` : `${n} feed ${n === 1 ? 'URL' : 'URLs'}`\n }\n if (kind === 'sql_insert') {\n return step.table ? `→ ${step.table}` : (isRTL ? 'إدراج' : 'insert')\n }\n if (kind === 'http_call') return step.url || step.endpoint_template || 'HTTP'\n if (kind === 'web_scrape') return step.url || step.endpoint_template || (isRTL ? 'جلب صفحة' : 'scrape')\n return ''\n}\n\n// ── JSON field parser ─────────────────────────────────────────────────────────\n\nconst parseJSONField = (txt: string): [unknown, string | null] => {\n const t = txt.trim()\n if (t === '') return [undefined, null]\n try {\n return [JSON.parse(t), null]\n } catch (e) {\n return [undefined, e instanceof Error ? e.message : 'invalid JSON']\n }\n}\n\n// ── SortableRow ───────────────────────────────────────────────────────────────\n\ninterface SortableRowProps {\n id: string\n icon: React.ComponentType<{ className?: string }>\n title: string\n subtitle: string\n badge?: string\n disabled?: boolean\n isRTL: boolean\n checked: boolean\n onToggle: () => void\n onEdit?: () => void\n onDelete: () => void\n}\n\nconst SortableRow = ({\n id, icon: Icon, title, subtitle, badge, disabled, isRTL,\n checked, onToggle, onEdit, onDelete,\n}: SortableRowProps) => {\n const {\n attributes, listeners, setNodeRef, setActivatorNodeRef,\n transform, transition, isDragging,\n } = useSortable({ id })\n\n const style: React.CSSProperties = {\n transform: CSS.Transform.toString(transform),\n transition,\n zIndex: isDragging ? 10 : undefined,\n }\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={cn(\n 'flex items-center gap-2 bg-card px-2 py-2.5',\n isDragging && 'opacity-80 shadow-lg rounded-md',\n disabled && 'opacity-55',\n )}\n >\n <button\n ref={setActivatorNodeRef}\n {...attributes}\n {...listeners}\n type=\"button\"\n aria-label={isRTL ? 'اسحب لإعادة الترتيب' : 'Drag to reorder'}\n className=\"flex h-9 w-6 shrink-0 cursor-grab active:cursor-grabbing items-center justify-center text-muted-foreground/40 hover:text-muted-foreground transition-colors duration-fast ease-standard\"\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n\n <div className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-muted\">\n <Icon className=\"h-4 w-4 text-muted-foreground\" />\n </div>\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"truncate text-sm font-medium\">{title}</span>\n {badge && (\n <Badge variant=\"secondary\" className=\"shrink-0 text-[10px] tabular-nums\">\n {badge}\n </Badge>\n )}\n {disabled && (\n <Badge variant=\"outline\" className=\"shrink-0 text-[10px] text-muted-foreground\">\n {isRTL ? 'معطّل' : 'off'}\n </Badge>\n )}\n </div>\n {subtitle && (\n <p className=\"truncate text-xs text-muted-foreground\">{subtitle}</p>\n )}\n </div>\n\n <div className=\"flex shrink-0 items-center gap-1\">\n <Switch\n checked={checked}\n onCheckedChange={onToggle}\n className=\"scale-90\"\n aria-label={isRTL ? 'تفعيل/تعطيل' : 'Enable/disable'}\n />\n {onEdit && (\n <Button size=\"sm\" variant=\"ghost\" className=\"h-8 px-2\" onClick={onEdit} title={isRTL ? 'تعديل' : 'Edit'}>\n <Pencil className=\"h-3.5 w-3.5 me-1\" />\n {isRTL ? 'تعديل' : 'Edit'}\n </Button>\n )}\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-8 w-8 p-0 text-destructive hover:text-destructive\"\n onClick={onDelete}\n title={isRTL ? 'حذف' : 'Delete'}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n )\n}\nSortableRow.displayName = 'SortableRow'\n\n// ── AddItemDialog ─────────────────────────────────────────────────────────────\n\ninterface AddItemDialogProps {\n open: boolean\n onClose: () => void\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onAddStep: (step: any) => void\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onAddSource: (src: any) => void\n palette: WorkflowPalette | undefined\n isRTL: boolean\n}\n\nconst AddItemDialog = ({ open, onClose, onAddStep, onAddSource, palette, isRTL }: AddItemDialogProps) => {\n const [mode, setMode] = useState<'step' | 'source'>('step')\n const [selectedKind, setSelectedKind] = useState('')\n const [selectedType, setSelectedType] = useState('')\n\n const handleAdd = () => {\n if (mode === 'step' && selectedKind) {\n const obj = { kind: selectedKind }\n if (hasProtoPollutionKey(obj)) return\n onAddStep(obj)\n setSelectedKind('')\n onClose()\n } else if (mode === 'source' && selectedType) {\n const obj = { type: selectedType, enabled: true }\n if (hasProtoPollutionKey(obj)) return\n onAddSource(obj)\n setSelectedType('')\n onClose()\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={(v) => !v && onClose()}>\n <DialogContent className=\"max-w-sm\" dir={isRTL ? 'rtl' : 'ltr'}>\n <DialogHeader>\n <DialogTitle>{isRTL ? 'إضافة عنصر' : 'Add item'}</DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4 py-2\">\n <div className=\"flex gap-2\">\n <Button size=\"sm\" variant={mode === 'step' ? 'default' : 'outline'} onClick={() => setMode('step')}>\n {isRTL ? 'خطوة' : 'Step'}\n </Button>\n <Button size=\"sm\" variant={mode === 'source' ? 'default' : 'outline'} onClick={() => setMode('source')}>\n {isRTL ? 'مصدر' : 'Source'}\n </Button>\n </div>\n\n {mode === 'step' && (\n <Select value={selectedKind} onValueChange={setSelectedKind}>\n <SelectTrigger>\n <SelectValue placeholder={isRTL ? 'اختر نوع الخطوة' : 'Select step kind'} />\n </SelectTrigger>\n <SelectContent>\n {STEP_KINDS.map((k) => (\n <SelectItem key={k.kind} value={k.kind}>\n {isRTL ? k.label_ar : k.label_en}\n </SelectItem>\n ))}\n {(palette?.svc ?? []).map((s) => (\n <SelectItem key={`svc-${s.slug}`} value={s.slug}>\n {isRTL ? s.name_ar : s.name_en}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n\n {mode === 'source' && (\n <Select value={selectedType} onValueChange={setSelectedType}>\n <SelectTrigger>\n <SelectValue placeholder={isRTL ? 'اختر نوع المصدر' : 'Select source type'} />\n </SelectTrigger>\n <SelectContent>\n {SOURCE_TYPES.map((t) => (\n <SelectItem key={t.type} value={t.type}>\n {isRTL ? t.label_ar : t.label_en}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" size=\"sm\" onClick={onClose}>\n {isRTL ? 'إلغاء' : 'Cancel'}\n </Button>\n <Button size=\"sm\" onClick={handleAdd} disabled={mode === 'step' ? !selectedKind : !selectedType}>\n {isRTL ? 'إضافة' : 'Add'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\nAddItemDialog.displayName = 'AddItemDialog'\n\n// ── EditStepDialog ────────────────────────────────────────────────────────────\n\ninterface EditStepDialogProps {\n open: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n step: any | null\n onClose: () => void\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onSave: (patch: any) => void\n isRTL: boolean\n}\n\nimport { useEffect } from 'react'\n\nconst EditStepDialog = ({ open, step, onClose, onSave, isRTL }: EditStepDialogProps) => {\n const kind: string = step?.kind ?? ''\n const lbl = (en: string, ar: string) => (isRTL ? ar : en)\n\n const [queriesTxt, setQueriesTxt] = useState('')\n const [enginesTxt, setEnginesTxt] = useState('')\n const [urlsTxt, setUrlsTxt] = useState('')\n const [freshnessHours, setFreshnessHours] = useState('')\n const [url, setUrl] = useState('')\n const [method, setMethod] = useState<'GET' | 'POST'>('GET')\n const [resultPath, setResultPath] = useState('')\n const [targetField, setTargetField] = useState('')\n const [timeoutSec, setTimeoutSec] = useState('')\n const [headersTxt, setHeadersTxt] = useState('')\n const [bodyJsonTxt, setBodyJsonTxt] = useState('')\n const [userAgent, setUserAgent] = useState('')\n const [extractTxt, setExtractTxt] = useState('')\n const [table, setTable] = useState('')\n const [rowsField, setRowsField] = useState('')\n const [onConflict, setOnConflict] = useState('')\n const [skipOnEmpty, setSkipOnEmpty] = useState(false)\n const [fieldMapTxt, setFieldMapTxt] = useState('')\n const [jsonErr, setJsonErr] = useState<string | null>(null)\n\n useEffect(() => {\n if (!step) return\n setJsonErr(null)\n const jstr = (v: unknown) => (v == null ? '' : JSON.stringify(v, null, 2))\n if (kind === 'search_query') {\n setQueriesTxt(Array.isArray(step.queries) ? step.queries.join('\\n') : '')\n setEnginesTxt(Array.isArray(step.engines) ? step.engines.join(', ') : '')\n } else if (kind === 'rss_poll') {\n setUrlsTxt(Array.isArray(step.urls) ? step.urls.join('\\n') : (step.url ? String(step.url) : ''))\n setFreshnessHours(step.freshness_hours != null ? String(step.freshness_hours) : '')\n } else if (kind === 'http_call') {\n setUrl(step.url ?? ''); setMethod(step.method === 'POST' ? 'POST' : 'GET')\n setResultPath(step.result_path ?? ''); setTargetField(step.target_field ?? '')\n setTimeoutSec(step.timeout_sec != null ? String(step.timeout_sec) : '')\n setHeadersTxt(jstr(step.headers)); setBodyJsonTxt(jstr(step.body_json))\n } else if (kind === 'web_scrape') {\n setUrl(step.url ?? ''); setTargetField(step.target_field ?? '')\n setTimeoutSec(step.timeout_sec != null ? String(step.timeout_sec) : '')\n setUserAgent(step.user_agent ?? ''); setExtractTxt(jstr(step.extract))\n } else if (kind === 'sql_insert') {\n setTable(step.table ?? ''); setRowsField(step.rows_field ?? '')\n setOnConflict(step.on_conflict ?? ''); setSkipOnEmpty(!!step.skip_on_empty)\n setFieldMapTxt(jstr(step.field_map))\n }\n }, [step, kind])\n\n const numOrSkip = (s: string) => {\n const t = s.trim()\n return t !== '' && !isNaN(Number(t)) ? Number(t) : undefined\n }\n\n const handleApply = () => {\n if (!step) return\n setJsonErr(null)\n if (kind === 'search_query') {\n const queries = queriesTxt.split('\\n').map((q) => q.trim()).filter(Boolean)\n const engines = enginesTxt.split(',').map((e) => e.trim()).filter(Boolean)\n onSave({ queries, engines: engines.length > 0 ? engines : undefined })\n } else if (kind === 'rss_poll') {\n const urls = urlsTxt.split('\\n').map((u) => u.trim()).filter(Boolean)\n const fh = numOrSkip(freshnessHours)\n onSave({ urls, ...(fh != null ? { freshness_hours: fh } : {}) })\n } else if (kind === 'http_call') {\n const [headers, hErr] = parseJSONField(headersTxt)\n const [bodyJson, bErr] = parseJSONField(bodyJsonTxt)\n if (hErr) { setJsonErr(`headers: ${hErr}`); return }\n if (bErr) { setJsonErr(`body_json: ${bErr}`); return }\n onSave({\n url: url.trim(), method,\n ...(resultPath.trim() ? { result_path: resultPath.trim() } : {}),\n ...(targetField.trim() ? { target_field: targetField.trim() } : {}),\n ...(numOrSkip(timeoutSec) != null ? { timeout_sec: numOrSkip(timeoutSec) } : {}),\n ...(headers !== undefined ? { headers } : {}),\n ...(bodyJson !== undefined ? { body_json: bodyJson } : {}),\n })\n } else if (kind === 'web_scrape') {\n const [extract, eErr] = parseJSONField(extractTxt)\n if (eErr) { setJsonErr(`extract: ${eErr}`); return }\n onSave({\n url: url.trim(),\n ...(targetField.trim() ? { target_field: targetField.trim() } : {}),\n ...(numOrSkip(timeoutSec) != null ? { timeout_sec: numOrSkip(timeoutSec) } : {}),\n ...(userAgent.trim() ? { user_agent: userAgent.trim() } : {}),\n ...(extract !== undefined ? { extract } : {}),\n })\n } else if (kind === 'sql_insert') {\n const [fieldMap, fErr] = parseJSONField(fieldMapTxt)\n if (fErr) { setJsonErr(`field_map: ${fErr}`); return }\n onSave({\n table: table.trim(),\n ...(rowsField.trim() ? { rows_field: rowsField.trim() } : {}),\n ...(onConflict.trim() ? { on_conflict: onConflict.trim() } : {}),\n skip_on_empty: skipOnEmpty,\n ...(fieldMap !== undefined ? { field_map: fieldMap } : {}),\n })\n } else {\n onClose(); return\n }\n onClose()\n }\n\n if (!step) return null\n const knownKind = ['search_query', 'rss_poll', 'http_call', 'web_scrape', 'sql_insert'].includes(kind)\n\n return (\n <Dialog open={open} onOpenChange={(v) => !v && onClose()}>\n <DialogContent className=\"max-w-md max-h-[85vh] overflow-y-auto\" dir={isRTL ? 'rtl' : 'ltr'}>\n <DialogHeader>\n <DialogTitle>\n {lbl('Edit step', 'تعديل الخطوة')}{' '}\n <span className=\"font-mono text-sm text-muted-foreground\">{kind}</span>\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4 py-2\">\n {kind === 'search_query' && (\n <>\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('Queries (one per line)', 'الاستعلامات (سطر لكل استعلام)')}</Label>\n <Textarea dir={isRTL ? 'rtl' : 'ltr'} placeholder={isRTL ? 'صحافة\\nسياسة' : 'press release\\nbreaking news'} value={queriesTxt} onChange={(e) => setQueriesTxt(e.target.value)} rows={6} className=\"font-mono text-sm resize-y\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('Engines (comma-separated)', 'محركات البحث (مفصولة بفواصل)')}</Label>\n <Input dir=\"ltr\" placeholder=\"google, bing, duckduckgo\" value={enginesTxt} onChange={(e) => setEnginesTxt(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n </>\n )}\n\n {kind === 'rss_poll' && (\n <>\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('Feed URLs (one per line)', 'روابط RSS (سطر لكل رابط)')}</Label>\n <Textarea dir=\"ltr\" placeholder=\"https://example.com/feed.rss\" value={urlsTxt} onChange={(e) => setUrlsTxt(e.target.value)} rows={5} className=\"font-mono text-sm resize-y\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('Freshness (hours)', 'الحداثة (بالساعات)')}</Label>\n <Input dir=\"ltr\" type=\"number\" placeholder=\"24\" value={freshnessHours} onChange={(e) => setFreshnessHours(e.target.value)} className=\"w-28\" />\n </div>\n </>\n )}\n\n {kind === 'http_call' && (\n <>\n <div className=\"grid grid-cols-[1fr_auto] gap-2\">\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('URL', 'الرابط')}</Label>\n <Input dir=\"ltr\" placeholder=\"https://api.example.com/v1/items\" value={url} onChange={(e) => setUrl(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('Method', 'الطريقة')}</Label>\n <Select value={method} onValueChange={(v) => setMethod(v as 'GET' | 'POST')}>\n <SelectTrigger className=\"w-24\"><SelectValue /></SelectTrigger>\n <SelectContent><SelectItem value=\"GET\">GET</SelectItem><SelectItem value=\"POST\">POST</SelectItem></SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('Result path', 'مسار النتيجة')}</Label>\n <Input dir=\"ltr\" placeholder=\"$.data.items\" value={resultPath} onChange={(e) => setResultPath(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('Target field', 'الحقل الهدف')}</Label>\n <Input dir=\"ltr\" placeholder=\"envelopes\" value={targetField} onChange={(e) => setTargetField(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('Timeout (seconds)', 'المهلة (ثواني)')}</Label>\n <Input dir=\"ltr\" type=\"number\" placeholder=\"15\" value={timeoutSec} onChange={(e) => setTimeoutSec(e.target.value)} className=\"w-28\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('Headers (JSON)', 'الترويسات (JSON)')}</Label>\n <Textarea dir=\"ltr\" placeholder='{\"Authorization\": \"Bearer {{secret:token}}\"}' value={headersTxt} onChange={(e) => setHeadersTxt(e.target.value)} rows={3} className=\"font-mono text-xs resize-y\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('Body JSON (POST)', 'محتوى الطلب JSON (POST)')}</Label>\n <Textarea dir=\"ltr\" placeholder='{\"query\": \"...\"}' value={bodyJsonTxt} onChange={(e) => setBodyJsonTxt(e.target.value)} rows={3} className=\"font-mono text-xs resize-y\" />\n </div>\n </>\n )}\n\n {kind === 'web_scrape' && (\n <>\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('URL', 'الرابط')}</Label>\n <Input dir=\"ltr\" placeholder=\"https://example.com/page\" value={url} onChange={(e) => setUrl(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('Target field', 'الحقل الهدف')}</Label>\n <Input dir=\"ltr\" placeholder=\"envelopes\" value={targetField} onChange={(e) => setTargetField(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('Timeout (seconds)', 'المهلة (ثواني)')}</Label>\n <Input dir=\"ltr\" type=\"number\" placeholder=\"20\" value={timeoutSec} onChange={(e) => setTimeoutSec(e.target.value)} className=\"w-full\" />\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('User agent', 'وكيل المستخدم')}</Label>\n <Input dir=\"ltr\" placeholder=\"Mozilla/5.0 ...\" value={userAgent} onChange={(e) => setUserAgent(e.target.value)} className=\"font-mono text-xs\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('Extract rules (JSON)', 'قواعد الاستخراج (JSON)')}</Label>\n <Textarea dir=\"ltr\" placeholder='{\"title\": \"h1\", \"content\": \".article-body\"}' value={extractTxt} onChange={(e) => setExtractTxt(e.target.value)} rows={4} className=\"font-mono text-xs resize-y\" />\n </div>\n </>\n )}\n\n {kind === 'sql_insert' && (\n <>\n <div className=\"grid grid-cols-2 gap-2\">\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('Table', 'الجدول')}</Label>\n <Input dir=\"ltr\" placeholder=\"public.raw_envelopes\" value={table} onChange={(e) => setTable(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('Rows field', 'حقل الصفوف')}</Label>\n <Input dir=\"ltr\" placeholder=\"$envelopes\" value={rowsField} onChange={(e) => setRowsField(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('On conflict', 'عند التعارض')}</Label>\n <Input dir=\"ltr\" placeholder=\"content_hash\" value={onConflict} onChange={(e) => setOnConflict(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n <div className=\"flex items-center gap-2\">\n <Switch checked={skipOnEmpty} onCheckedChange={setSkipOnEmpty} className=\"scale-90\" />\n <Label className=\"text-sm\">{lbl('Skip on empty', 'تخطٍّ إذا فارغ')}</Label>\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-sm font-medium\">{lbl('Field map (JSON)', 'خريطة الحقول (JSON)')}</Label>\n <Textarea dir=\"ltr\" placeholder='{\"content_en\": \"title\", \"url\": \"link\"}' value={fieldMapTxt} onChange={(e) => setFieldMapTxt(e.target.value)} rows={5} className=\"font-mono text-xs resize-y\" />\n </div>\n </>\n )}\n\n {!knownKind && (\n <div className=\"rounded-md bg-muted px-3 py-2 text-[11px] text-muted-foreground font-mono whitespace-pre-wrap break-all\">\n {JSON.stringify(step, (k) => (k === '_uid' ? undefined : step[k]), 2)}\n </div>\n )}\n\n {jsonErr && (\n <div className=\"flex items-start gap-2 rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0 mt-0.5\" />\n <span>{lbl('Invalid JSON', 'JSON غير صالح')}: {jsonErr}</span>\n </div>\n )}\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" size=\"sm\" onClick={onClose}>{lbl('Cancel', 'إلغاء')}</Button>\n {knownKind && (\n <Button size=\"sm\" onClick={handleApply}>{lbl('Apply', 'تطبيق')}</Button>\n )}\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\nEditStepDialog.displayName = 'EditStepDialog'\n\n// ── Secret ref note ───────────────────────────────────────────────────────────\n\nconst SecretRefNote = ({ isRTL, pluginSlug, secretKey }: {\n isRTL: boolean\n pluginSlug: string\n secretKey: string\n}) => (\n <div className=\"flex flex-wrap items-start gap-2 rounded-md border border-amber-200 bg-amber-50 px-3 py-2 dark:border-amber-800 dark:bg-amber-950\">\n <Info className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-amber-600 dark:text-amber-400\" />\n <div className=\"flex-1 space-y-1 text-[11px] leading-snug text-amber-700 dark:text-amber-300\">\n <p>\n {isRTL\n ? 'يُستخدم المرجع التالي في الإعداد — لا تلصق الرمز السري هنا أبداً:'\n : 'This reference is used in the config — never paste the actual secret here:'}\n </p>\n <code className=\"rounded bg-amber-100 px-1 py-0.5 font-mono text-[10px] text-amber-800 dark:bg-amber-900 dark:text-amber-200\">\n {`{{secret:${secretKey}}}`}\n </code>\n <p>\n {isRTL ? 'سجّل القيمة الفعلية في ' : 'Store the real value in '}\n <a\n href={`../plugins/${pluginSlug}/credentials`}\n className=\"inline-flex items-center gap-0.5 underline underline-offset-2 hover:no-underline\"\n >\n {isRTL ? 'تبويب بيانات الاعتماد' : 'the Credentials tab'}\n <ExternalLink className=\"h-2.5 w-2.5\" />\n </a>\n </p>\n </div>\n </div>\n)\nSecretRefNote.displayName = 'SecretRefNote'\n\n// ── EditSourceDialog (simplified — covers known source types) ─────────────────\n\ninterface EditSourceDialogProps {\n open: boolean\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n source: any | null\n pluginSlug: string\n onClose: () => void\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onSave: (patch: any) => void\n isRTL: boolean\n}\n\nconst EditSourceDialog = ({ open, source, pluginSlug, onClose, onSave, isRTL }: EditSourceDialogProps) => {\n const sourceType: string = source?.type ?? ''\n const lbl = (en: string, ar: string) => (isRTL ? ar : en)\n\n const [sxLanguage, setSxLanguage] = useState<'ar' | 'en' | 'auto'>('ar')\n const [sxSite, setSxSite] = useState('')\n const [sxCategories, setSxCategories] = useState('news')\n const [sxTimeRange, setSxTimeRange] = useState('')\n const [sxMaxPerQuery, setSxMaxPerQuery] = useState('10')\n const [httpEndpoint, setHttpEndpoint] = useState('')\n const [httpMethod, setHttpMethod] = useState<'GET' | 'POST'>('GET')\n const [httpResultPath, setHttpResultPath] = useState('')\n const [httpHeaders, setHttpHeaders] = useState('')\n const [httpTimeout, setHttpTimeout] = useState('')\n const [crUrl, setCrUrl] = useState('')\n const [crProfileId, setCrProfileId] = useState('')\n const [crSelectorsTxt, setCrSelectorsTxt] = useState('')\n const [apiTrackHandle, setApiTrackHandle] = useState('')\n const [apiLang, setApiLang] = useState<'ar' | 'en' | 'auto'>('ar')\n const [apiMaxResults, setApiMaxResults] = useState('100')\n const [mwSearchId, setMwSearchId] = useState('')\n const [mwQuery, setMwQuery] = useState('')\n const [mwPlatform, setMwPlatform] = useState('')\n const [mwPageSize, setMwPageSize] = useState('50')\n const [jsonErr, setJsonErr] = useState<string | null>(null)\n\n useEffect(() => {\n if (!source) return\n setJsonErr(null)\n const jstr = (v: unknown) => (v == null ? '' : JSON.stringify(v, null, 2))\n setSxLanguage(source.language === 'en' || source.language === 'auto' ? source.language : 'ar')\n setSxSite(typeof source.site === 'string' ? source.site : '')\n setSxCategories(Array.isArray(source.categories) ? source.categories.join(', ') : 'news')\n setSxTimeRange(typeof source.time_range === 'string' ? source.time_range : '')\n setSxMaxPerQuery(source.max_per_query != null ? String(source.max_per_query) : '10')\n setHttpEndpoint(typeof source.endpoint_template === 'string' ? source.endpoint_template : '')\n setHttpMethod(source.method === 'POST' ? 'POST' : 'GET')\n setHttpResultPath(typeof source.result_path === 'string' ? source.result_path : '')\n setHttpHeaders(source.headers != null ? jstr(source.headers) : '')\n setHttpTimeout(source.timeout_sec != null ? String(source.timeout_sec) : '')\n setCrUrl(typeof source.url === 'string' ? source.url : '')\n setCrProfileId(typeof source.profile_id === 'string' ? source.profile_id : '')\n setCrSelectorsTxt(Array.isArray(source.selectors) ? source.selectors.join('\\n') : '')\n setApiTrackHandle(typeof source.track_handle === 'string' ? source.track_handle : '')\n setApiLang(source.lang === 'en' || source.lang === 'auto' ? source.lang : 'ar')\n setApiMaxResults(source.max_results != null ? String(source.max_results) : '100')\n setMwSearchId(typeof source.search_id === 'string' ? source.search_id : '')\n setMwQuery(typeof source.query === 'string' ? source.query : '')\n setMwPlatform(typeof source.platform === 'string' ? source.platform : '')\n setMwPageSize(source.page_size != null ? String(source.page_size) : '50')\n }, [source])\n\n const numOrSkip = (s: string): number | undefined => {\n const t = s.trim()\n return t !== '' && !isNaN(Number(t)) ? Number(t) : undefined\n }\n\n const handleApply = () => {\n if (!source) return\n setJsonErr(null)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let patch: Record<string, any> = {}\n\n if (sourceType === 'searxng_social') {\n const categories = sxCategories.split(',').map((c) => c.trim()).filter(Boolean)\n patch = {\n language: sxLanguage,\n ...(sxSite.trim() ? { site: sxSite.trim() } : {}),\n categories: categories.length > 0 ? categories : ['news'],\n ...(sxTimeRange ? { time_range: sxTimeRange } : {}),\n ...(numOrSkip(sxMaxPerQuery) != null ? { max_per_query: numOrSkip(sxMaxPerQuery) } : {}),\n }\n } else if (sourceType === 'http') {\n const [headers, hErr] = parseJSONField(httpHeaders)\n if (hErr) { setJsonErr(`headers: ${hErr}`); return }\n patch = {\n endpoint_template: httpEndpoint.trim() || undefined,\n method: httpMethod,\n ...(httpResultPath.trim() ? { result_path: httpResultPath.trim() } : {}),\n ...(headers !== undefined ? { headers } : {}),\n ...(numOrSkip(httpTimeout) != null ? { timeout_sec: numOrSkip(httpTimeout) } : {}),\n }\n } else if (sourceType === 'crawler') {\n const selectors = crSelectorsTxt.split('\\n').map((s) => s.trim()).filter(Boolean)\n patch = {\n url: crUrl.trim() || undefined,\n ...(crProfileId.trim() ? { profile_id: crProfileId.trim() } : {}),\n ...(selectors.length > 0 ? { selectors } : {}),\n }\n } else if (sourceType === 'api') {\n patch = {\n ...(apiTrackHandle.trim() ? { track_handle: apiTrackHandle.trim() } : {}),\n lang: apiLang,\n ...(numOrSkip(apiMaxResults) != null ? { max_results: numOrSkip(apiMaxResults) } : {}),\n headers: { Authorization: '{{secret:bearer_token}}' },\n }\n } else if (sourceType === 'meltwater') {\n patch = {\n ...(mwSearchId.trim() ? { search_id: mwSearchId.trim() } : {}),\n ...(mwQuery.trim() ? { query: mwQuery.trim() } : {}),\n ...(mwPlatform.trim() ? { platform: mwPlatform.trim() } : {}),\n ...(numOrSkip(mwPageSize) != null ? { page_size: numOrSkip(mwPageSize) } : {}),\n api_token: '{{secret:api_token}}',\n }\n }\n\n onSave(patch)\n onClose()\n }\n\n if (!source) return null\n const knownType = ['searxng_social', 'http', 'crawler', 'api', 'meltwater'].includes(sourceType)\n\n return (\n <Dialog open={open} onOpenChange={(v) => !v && onClose()}>\n <DialogContent className=\"max-w-lg max-h-[85vh] overflow-y-auto\" dir={isRTL ? 'rtl' : 'ltr'}>\n <DialogHeader>\n <DialogTitle>\n {lbl('Edit source', 'تعديل مصدر')}{' '}\n <span className=\"font-mono text-sm text-muted-foreground\">{sourceType}</span>\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"space-y-4 py-2\">\n {sourceType === 'searxng_social' && (\n <>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium\">{lbl('Language', 'اللغة')}</Label>\n <Select value={sxLanguage} onValueChange={(v) => setSxLanguage(v as 'ar' | 'en' | 'auto')}>\n <SelectTrigger className=\"w-40 text-sm\"><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ar\">{lbl('Arabic (ar)', 'العربية')}</SelectItem>\n <SelectItem value=\"en\">{lbl('English (en)', 'الإنجليزية')}</SelectItem>\n <SelectItem value=\"auto\">{lbl('Auto', 'تلقائي')}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium\">{lbl('Site filter (optional)', 'تصفية بالموقع (اختياري)')}</Label>\n <Input dir=\"ltr\" placeholder=\"facebook.com\" value={sxSite} onChange={(e) => setSxSite(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium\">{lbl('Categories (comma-separated)', 'الفئات (مفصولة بفواصل)')}</Label>\n <Input dir=\"ltr\" placeholder=\"news, social media\" value={sxCategories} onChange={(e) => setSxCategories(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium\">{lbl('Results per query', 'نتائج لكل استعلام')}</Label>\n <Input dir=\"ltr\" type=\"number\" placeholder=\"10\" value={sxMaxPerQuery} onChange={(e) => setSxMaxPerQuery(e.target.value)} className=\"w-28 text-sm\" />\n </div>\n </>\n )}\n\n {sourceType === 'http' && (\n <>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium\">{lbl('Endpoint URL template', 'قالب رابط النقطة')}</Label>\n <Input dir=\"ltr\" placeholder=\"https://api.example.com/{query}\" value={httpEndpoint} onChange={(e) => setHttpEndpoint(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium\">{lbl('Headers (JSON)', 'الترويسات (JSON)')}</Label>\n <div className=\"flex items-start gap-1.5 rounded-md border border-amber-200 bg-amber-50 px-2.5 py-1.5 dark:border-amber-800 dark:bg-amber-950\">\n <Info className=\"mt-0.5 h-3 w-3 shrink-0 text-amber-600 dark:text-amber-400\" />\n <p className=\"text-[10px] leading-snug text-amber-700 dark:text-amber-300\">\n {lbl('Use {{secret:KEY}} for tokens. Never paste plaintext.', 'استخدم {{secret:KEY}} للرموز. لا تلصق الرمز هنا.')}\n </p>\n </div>\n <Textarea dir=\"ltr\" placeholder={'{\\n \"Authorization\": \"Bearer {{secret:api_token}}\"\\n}'} value={httpHeaders} onChange={(e) => setHttpHeaders(e.target.value)} rows={4} className=\"font-mono text-xs resize-y\" />\n </div>\n </>\n )}\n\n {sourceType === 'crawler' && (\n <>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium\">{lbl('Start URL', 'رابط البداية')}</Label>\n <Input dir=\"ltr\" placeholder=\"https://example.com/articles/\" value={crUrl} onChange={(e) => setCrUrl(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium\">{lbl('Profile ID (optional)', 'معرّف الملف الشخصي (اختياري)')}</Label>\n <Input dir=\"ltr\" placeholder=\"profile-abc123\" value={crProfileId} onChange={(e) => setCrProfileId(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium\">{lbl('CSS selectors (one per line)', 'محدّدات CSS (سطر لكل محدّد)')}</Label>\n <Textarea dir=\"ltr\" placeholder=\".article-body\" value={crSelectorsTxt} onChange={(e) => setCrSelectorsTxt(e.target.value)} rows={3} className=\"font-mono text-sm resize-y\" />\n </div>\n </>\n )}\n\n {sourceType === 'api' && (\n <>\n <SecretRefNote isRTL={isRTL} pluginSlug={pluginSlug} secretKey=\"bearer_token\" />\n <Separator />\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium\">{lbl('Track handle', 'المقبض المتتبَّع')}</Label>\n <Input dir=\"ltr\" placeholder=\"BBCWorld\" value={apiTrackHandle} onChange={(e) => setApiTrackHandle(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium\">{lbl('Max results per run', 'أقصى عدد نتائج')}</Label>\n <Input dir=\"ltr\" type=\"number\" placeholder=\"100\" value={apiMaxResults} onChange={(e) => setApiMaxResults(e.target.value)} className=\"w-28 text-sm\" />\n </div>\n </>\n )}\n\n {sourceType === 'meltwater' && (\n <>\n <SecretRefNote isRTL={isRTL} pluginSlug={pluginSlug} secretKey=\"api_token\" />\n <Separator />\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium\">{lbl('Search ID (saved search)', 'معرّف البحث')}</Label>\n <Input dir=\"ltr\" placeholder=\"search-abc123\" value={mwSearchId} onChange={(e) => setMwSearchId(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium\">{lbl('Query (ad-hoc)', 'استعلام مباشر')}</Label>\n <Input dir=\"ltr\" placeholder='site:twitter.com \"خطاب سياسي\"' value={mwQuery} onChange={(e) => setMwQuery(e.target.value)} className=\"font-mono text-sm\" />\n </div>\n <div className=\"space-y-1.5\">\n <Label className=\"text-xs font-medium\">{lbl('Page size', 'حجم الصفحة')}</Label>\n <Input dir=\"ltr\" type=\"number\" placeholder=\"50\" value={mwPageSize} onChange={(e) => setMwPageSize(e.target.value)} className=\"w-28 text-sm\" />\n </div>\n </>\n )}\n\n {!knownType && (\n <div className=\"rounded-md bg-muted px-3 py-2 text-[11px] text-muted-foreground font-mono whitespace-pre-wrap break-all\">\n {JSON.stringify(source, (k) => (k === '_uid' ? undefined : source[k]), 2)}\n </div>\n )}\n\n {jsonErr && (\n <div className=\"flex items-start gap-2 rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-xs text-destructive\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0 mt-0.5\" />\n <span>{lbl('Invalid JSON', 'JSON غير صالح')}: {jsonErr}</span>\n </div>\n )}\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" size=\"sm\" onClick={onClose}>{lbl('Cancel', 'إلغاء')}</Button>\n {knownType && <Button size=\"sm\" onClick={handleApply}>{lbl('Apply', 'تطبيق')}</Button>}\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\nEditSourceDialog.displayName = 'EditSourceDialog'\n\n// ── WorkflowEditor (public) ────────────────────────────────────────────────────\n\nexport interface WorkflowEditorProps {\n /** Raw JSONB workflow_steps array from the DB. */\n workflowSteps: WorkflowStep[]\n /** Raw JSONB sources array from the DB. */\n workflowSources: WorkflowSource[]\n /** Plugin slug — used in source credential links. */\n pluginSlug: string\n /** Current UI language. */\n language: 'en' | 'ar'\n /** Palette for Add dialog SVC items. */\n palette?: WorkflowPalette\n /**\n * Called when the operator clicks Save.\n * Returns a Promise — reject to show an error toast.\n */\n onSave: (steps: WorkflowStep[], sources: WorkflowSource[]) => Promise<void>\n}\n\nexport const WorkflowEditor = ({\n workflowSteps,\n workflowSources,\n pluginSlug,\n language,\n palette,\n onSave,\n}: WorkflowEditorProps) => {\n const isRTL = language === 'ar'\n\n const initialSteps = useMemo(\n () => assignUids(workflowSteps),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n )\n const initialSources = useMemo(\n () => workflowSources.map((s, i) => ({ ...s, _uid: `source-${i}` })),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [],\n )\n\n const [uidSeq, setUidSeq] = useState(1000)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [editSteps, setEditSteps] = useState<any[]>(initialSteps)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [editSources, setEditSources] = useState<any[]>(initialSources)\n\n const [addDialogOpen, setAddDialogOpen] = useState(false)\n const [isSaving, setIsSaving] = useState(false)\n const [dirty, setDirty] = useState(false)\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [editingStep, setEditingStep] = useState<any | null>(null)\n const [editStepDialogOpen, setEditStepDialogOpen] = useState(false)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [editingSource, setEditingSource] = useState<any | null>(null)\n const [editSourceDialogOpen, setEditSourceDialogOpen] = useState(false)\n\n const markDirty = () => setDirty(true)\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n )\n\n const handleStepDragEnd = useCallback((event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id) return\n setEditSteps((prev) => {\n const oldIdx = prev.findIndex((s) => String(s._uid) === active.id)\n const newIdx = prev.findIndex((s) => String(s._uid) === over.id)\n if (oldIdx === -1 || newIdx === -1) return prev\n return arrayMove(prev, oldIdx, newIdx)\n })\n markDirty()\n }, [])\n\n const handleSourceDragEnd = useCallback((event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id) return\n setEditSources((prev) => {\n const oldIdx = prev.findIndex((s) => String(s._uid) === active.id)\n const newIdx = prev.findIndex((s) => String(s._uid) === over.id)\n if (oldIdx === -1 || newIdx === -1) return prev\n return arrayMove(prev, oldIdx, newIdx)\n })\n markDirty()\n }, [])\n\n const handleToggleStep = useCallback((id: string) => {\n setEditSteps((prev) => prev.map((s) => (String(s._uid) === id ? { ...s, disabled: !s.disabled } : s)))\n markDirty()\n }, [])\n\n const handleDeleteStep = useCallback((id: string) => {\n setEditSteps((prev) => deleteByUid(prev, id))\n markDirty()\n }, [])\n\n // Open the type-specific options modal for a step (from the nested editor).\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleEditStep = useCallback((step: any) => {\n setEditingStep(step)\n setEditStepDialogOpen(true)\n }, [])\n\n // Save the FULL updated step back into the tree by its _uid (any depth).\n const handleStepOptionsSave = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (next: any) => {\n setEditSteps((prev) => updateByUid(prev, String(next._uid), next))\n markDirty()\n },\n [],\n )\n\n const handleToggleSource = useCallback((id: string) => {\n setEditSources((prev) => prev.map((s) =>\n String(s._uid) === id ? { ...s, enabled: s.enabled === false } : s))\n markDirty()\n }, [])\n\n const handleDeleteSource = useCallback((id: string) => {\n setEditSources((prev) => prev.filter((s) => String(s._uid) !== id))\n markDirty()\n }, [])\n\n const handleOpenEditSource = useCallback((id: string) => {\n setEditSources((prev) => {\n const source = prev.find((s) => String(s._uid) === id)\n if (source) { setEditingSource(source); setEditSourceDialogOpen(true) }\n return prev\n })\n }, [])\n\n const handleEditSourceSave = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (patch: any) => {\n if (!editingSource) return\n setEditSources((prev) => prev.map((s) =>\n String(s._uid) === String(editingSource._uid) ? { ...s, ...patch } : s))\n markDirty()\n },\n [editingSource],\n )\n\n const handleAddStep = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (step: any) => {\n if (hasProtoPollutionKey(step)) { toast.error(isRTL ? 'إدخال غير آمن' : 'Unsafe input blocked'); return }\n setUidSeq((n) => n + 1)\n setEditSteps((prev) => [...prev, { ...step, _uid: `step-new-${uidSeq}` }])\n markDirty()\n },\n [isRTL, uidSeq],\n )\n\n const handleAddSource = useCallback(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (src: any) => {\n if (hasProtoPollutionKey(src)) { toast.error(isRTL ? 'إدخال غير آمن' : 'Unsafe input blocked'); return }\n setUidSeq((n) => n + 1)\n setEditSources((prev) => [...prev, { ...src, _uid: `source-new-${uidSeq}` }])\n markDirty()\n },\n [isRTL, uidSeq],\n )\n\n const handleReset = useCallback(() => {\n setEditSteps(initialSteps)\n setEditSources(initialSources)\n setDirty(false)\n }, [initialSteps, initialSources])\n\n const handleSave = useCallback(async () => {\n for (const s of editSteps) {\n if (hasProtoPollutionKey(s)) { toast.error(isRTL ? 'خطوة تحتوي على مفاتيح غير مسموح بها' : 'Step contains blocked keys'); return }\n }\n for (const s of editSources) {\n if (hasProtoPollutionKey(s)) { toast.error(isRTL ? 'مصدر يحتوي على مفاتيح غير مسموح بها' : 'Source contains blocked keys'); return }\n }\n\n const cleanSteps = stripUidsDeep(editSteps)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cleanSources = editSources.map((s: any) => {\n const { _uid, ...rest } = s\n return { ...rest, enabled: typeof rest.enabled === 'boolean' ? rest.enabled : true, type: rest.type ?? 'searxng_social' }\n })\n\n setIsSaving(true)\n try {\n await onSave(cleanSteps, cleanSources)\n toast.success(isRTL ? 'تم حفظ سير العمل' : 'Workflow saved')\n setDirty(false)\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : null\n toast.error(msg\n ? (isRTL ? `فشل الحفظ: ${msg}` : `Save failed: ${msg}`)\n : (isRTL ? 'فشل الحفظ' : 'Save failed'))\n } finally {\n setIsSaving(false)\n }\n }, [editSteps, editSources, onSave, isRTL])\n\n const stepLabel = (kind: string) =>\n STEP_LABELS[kind] ? (isRTL ? STEP_LABELS[kind].ar : STEP_LABELS[kind].en) : kind\n\n return (\n <div className=\"space-y-5\" dir={isRTL ? 'rtl' : 'ltr'}>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button size=\"sm\" onClick={handleSave} disabled={isSaving || !dirty}>\n <Save className=\"h-3.5 w-3.5 me-1.5\" />\n {isRTL ? 'حفظ' : 'Save'}\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={handleReset} disabled={!dirty}>\n <RotateCcw className=\"h-3.5 w-3.5 me-1.5\" />\n {isRTL ? 'إعادة ضبط' : 'Reset'}\n </Button>\n <Button size=\"sm\" variant=\"outline\" onClick={() => setAddDialogOpen(true)} className=\"ms-auto\">\n <Plus className=\"h-3.5 w-3.5 me-1.5\" />\n {isRTL ? 'إضافة' : 'Add'}\n </Button>\n </div>\n\n {/* STEPS list */}\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold text-muted-foreground\">\n {isRTL ? 'الخطوات' : 'Steps'}{' '}\n <span className=\"text-xs font-normal\">\n ({editSteps.length}) — {isRTL ? 'اسحب لإعادة الترتيب' : 'drag to reorder'}\n </span>\n </h3>\n {editSteps.length === 0 ? (\n <div className=\"rounded-lg border border-dashed bg-muted/20 px-4 py-6 text-center text-sm text-muted-foreground\">\n {isRTL ? 'لا توجد خطوات — أضف خطوة' : 'No steps — add one'}\n </div>\n ) : (\n <div className=\"rounded-lg border border-border bg-muted/10 p-2\">\n <NestedStepsEditor\n steps={editSteps}\n language={isRTL ? 'ar' : 'en'}\n onChange={(next) => { setEditSteps(next); markDirty() }}\n onEditStep={handleEditStep}\n onDeleteStep={handleDeleteStep}\n />\n </div>\n )}\n </div>\n\n {/* SOURCES list */}\n <div className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold text-muted-foreground\">\n {isRTL ? 'المصادر' : 'Sources'}{' '}\n <span className=\"text-xs font-normal\">({editSources.length})</span>\n </h3>\n {editSources.length === 0 ? (\n <div className=\"rounded-lg border border-dashed bg-muted/20 px-4 py-6 text-center text-sm text-muted-foreground\">\n {isRTL ? 'لا توجد مصادر' : 'No sources'}\n </div>\n ) : (\n <DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleSourceDragEnd}>\n <SortableContext items={editSources.map((s) => String(s._uid))} strategy={verticalListSortingStrategy}>\n <div className=\"overflow-hidden rounded-lg border border-border divide-y divide-border\">\n {editSources.map((s) => {\n const subParts: string[] = []\n if (s.site) subParts.push(`site:${s.site}`)\n if (s.endpoint_template) subParts.push(s.endpoint_template)\n if (s.url) subParts.push(s.url)\n if (s.track_handle) subParts.push(`@${s.track_handle}`)\n if (s.search_id) subParts.push(`search:${s.search_id}`)\n else if (s.query) subParts.push(s.query.slice(0, 40))\n subParts.push(isRTL ? 'يستخدم قائمة الكلمات المفتاحية' : 'uses keyword list')\n const sub = subParts.join(' · ')\n return (\n <SortableRow\n key={String(s._uid)}\n id={String(s._uid)}\n icon={Globe}\n title={s.type ?? 'source'}\n subtitle={sub}\n disabled={s.enabled === false}\n checked={s.enabled !== false}\n isRTL={isRTL}\n onToggle={() => handleToggleSource(String(s._uid))}\n onEdit={() => handleOpenEditSource(String(s._uid))}\n onDelete={() => handleDeleteSource(String(s._uid))}\n />\n )\n })}\n </div>\n </SortableContext>\n </DndContext>\n )}\n </div>\n\n <div className=\"flex items-start gap-2 text-[11px] text-amber-600 dark:text-amber-400\">\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0 mt-0.5\" />\n <span>\n {isRTL\n ? 'ملاحظة: تعطيل المصدر يُحترم من المُنفِّذ. تعطيل الخطوة تجميلي حالياً.'\n : 'Note: disabling a SOURCE is honoured by the executor. Disabling a STEP is currently cosmetic.'}\n </span>\n </div>\n\n <AddItemDialog\n open={addDialogOpen}\n onClose={() => setAddDialogOpen(false)}\n onAddStep={handleAddStep}\n onAddSource={handleAddSource}\n palette={palette}\n isRTL={isRTL}\n />\n <StepOptionsDialog\n open={editStepDialogOpen}\n step={editingStep}\n language={isRTL ? 'ar' : 'en'}\n onClose={() => setEditStepDialogOpen(false)}\n onSave={handleStepOptionsSave}\n />\n <EditSourceDialog\n open={editSourceDialogOpen}\n source={editingSource}\n pluginSlug={pluginSlug}\n onClose={() => setEditSourceDialogOpen(false)}\n onSave={handleEditSourceSave}\n isRTL={isRTL}\n />\n </div>\n )\n}\nWorkflowEditor.displayName = 'WorkflowEditor'\n\nexport default WorkflowEditor\n","'use client'\n\n/**\n * NestedStepsEditor — multi-level drag-and-drop editor for a workflow step TREE.\n *\n * Steps can be reordered within a branch AND moved across nesting levels\n * (top-level ↔ an `if`'s then/else ↔ a `for_each`'s loop body). Built on\n * @dnd-kit with one DndContext + a SortableContext per branch; drag-end resolves\n * the source/target branch by the dragged item's path and moves it immutably.\n * A gear button opens the per-step options modal (via onEditStep).\n */\n\nimport * as React from 'react'\nimport {\n DndContext, DragOverlay, closestCenter, KeyboardSensor, PointerSensor,\n useSensor, useSensors, useDroppable, type DragEndEvent, type DragStartEvent,\n} from '@dnd-kit/core'\nimport {\n SortableContext, sortableKeyboardCoordinates, useSortable, verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { GripVertical, Settings2, Trash2, GitBranch, Repeat, Clock, Database, Sparkles, Globe, ChevronRight } from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { Badge } from '../ui/badge'\n\nexport type Step = Record<string, any>\n\nexport interface NestedStepsEditorProps {\n steps: Step[]\n language?: 'en' | 'ar'\n onChange: (steps: Step[]) => void\n onEditStep?: (step: Step) => void\n onDeleteStep?: (uid: string) => void\n className?: string\n}\n\n// ── tree helpers ────────────────────────────────────────────────────────────\nlet _seq = 0\nconst newUid = () => `s${(_seq++).toString(36)}-${Date.now().toString(36)}`\n\nfunction ensureUids(steps: Step[]): Step[] {\n return steps.map((s) => {\n const next: Step = { ...s, _uid: s._uid ?? newUid() }\n for (const k of ['then', 'else', 'steps']) if (Array.isArray(next[k])) next[k] = ensureUids(next[k])\n return next\n })\n}\n\nconst BRANCH_KEYS = ['then', 'else', 'steps'] as const\ntype BranchKey = (typeof BRANCH_KEYS)[number]\n\nfunction branchesFor(step: Step): BranchKey[] {\n const kind = step.kind\n if (kind === 'if') return ['then', 'else']\n if (kind === 'for_each' || kind === 'loop' || Array.isArray(step.steps)) return ['steps']\n return []\n}\n\ntype Path = (string | number)[] // alternating [index, key, index, key, …, index]\n\nfunction findPath(steps: Step[], uid: string, prefix: Path = []): Path | null {\n for (let i = 0; i < steps.length; i++) {\n const s = steps[i]\n if (s._uid === uid) return [...prefix, i]\n for (const k of BRANCH_KEYS) {\n if (Array.isArray(s[k])) {\n const r = findPath(s[k], uid, [...prefix, i, k])\n if (r) return r\n }\n }\n }\n return null\n}\n\n// returns the container array for a containerPath (path without trailing index)\nfunction getContainer(root: Step[], containerPath: Path): Step[] {\n let arr: Step[] = root\n let node: Step | null = null\n for (const tok of containerPath) {\n if (typeof tok === 'number') node = arr[tok]\n else { if (!Array.isArray(node![tok])) node![tok] = []; arr = node![tok] }\n }\n return arr\n}\n\nconst samePath = (a: Path, b: Path) => a.length === b.length && a.every((v, i) => v === b[i])\nconst startsWith = (p: Path, prefix: Path) => prefix.length <= p.length && prefix.every((v, i) => v === p[i])\n\n// ── leaf summary (compact, human-ish) ───────────────────────────────────────\nconst KIND_ICON: Record<string, React.ElementType> = {\n cron_trigger: Clock, if: GitBranch, for_each: Repeat, loop: Repeat,\n sql_select: Database, sql_insert: Database, sql_update: Database,\n gemini_call: Sparkles, adk_call: Sparkles, http_call: Globe, http_request: Globe, webhook: Globe,\n}\nfunction kindLabel(kind: string, isRTL: boolean): string {\n const m: Record<string, [string, string]> = {\n cron_trigger: ['Schedule', 'جدولة'], if: ['Condition', 'شرط'], for_each: ['Repeat', 'تكرار'],\n sql_select: ['Read data', 'قراءة'], sql_insert: ['Save', 'حفظ'], sql_update: ['Update', 'تحديث'],\n gemini_call: ['AI', 'ذكاء'], adk_call: ['AI', 'ذكاء'], http_call: ['HTTP', 'HTTP'],\n }\n return m[kind] ? (isRTL ? m[kind][1] : m[kind][0]) : kind.replace(/[_-]+/g, ' ')\n}\nconst BRANCH_LABEL: Record<BranchKey, [string, string]> = {\n then: ['THEN', 'عندها'], else: ['ELSE', 'وإلا'], steps: ['LOOP BODY', 'جسم الحلقة'],\n}\n\n// ── sortable row ────────────────────────────────────────────────────────────\nfunction StepRow({\n step, isRTL, depth, onEditStep, onDeleteStep, renderBranches,\n}: {\n step: Step; isRTL: boolean; depth: number\n onEditStep?: (s: Step) => void; onDeleteStep?: (uid: string) => void\n renderBranches: (step: Step) => React.ReactNode\n}) {\n const uid = String(step._uid)\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: uid })\n const Icon = KIND_ICON[step.kind] ?? ChevronRight\n const style: React.CSSProperties = { transform: CSS.Transform.toString(transform), transition }\n\n return (\n <div ref={setNodeRef} style={style} className={cn(isDragging && 'opacity-50')}>\n <div className=\"flex items-center gap-2 rounded-md border border-border bg-card px-2 py-1.5 shadow-sm\">\n <button\n type=\"button\"\n className=\"shrink-0 cursor-grab touch-none text-muted-foreground/60 hover:text-foreground active:cursor-grabbing\"\n aria-label={isRTL ? 'اسحب' : 'Drag'}\n {...attributes}\n {...listeners}\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n <Icon className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <Badge variant=\"secondary\" className=\"h-4 rounded-sm px-1 text-[10px]\">{kindLabel(step.kind ?? '?', isRTL)}</Badge>\n <span className=\"min-w-0 flex-1 truncate text-xs text-muted-foreground\">{compactSummary(step, isRTL)}</span>\n <button\n type=\"button\"\n onClick={() => onEditStep?.(step)}\n className=\"shrink-0 rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground\"\n aria-label={isRTL ? 'الإعدادات' : 'Settings'}\n >\n <Settings2 className=\"h-3.5 w-3.5\" />\n </button>\n <button\n type=\"button\"\n onClick={() => onDeleteStep?.(uid)}\n className=\"shrink-0 rounded p-1 text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n aria-label={isRTL ? 'حذف' : 'Delete'}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n {renderBranches(step)}\n </div>\n )\n}\n\nfunction compactSummary(step: Step, isRTL: boolean): string {\n switch (step.kind) {\n case 'cron_trigger': return isRTL ? `كل ${step.schedule ?? '?'}` : `every ${step.schedule ?? '?'}`\n case 'if': return isRTL ? 'حسب الشرط' : 'when condition is met'\n case 'for_each': return isRTL ? `لكل ${humanVar(step.over)}` : `for each ${humanVar(step.over)}`\n case 'sql_select': return isRTL ? 'قراءة سجلات' : 'reads records'\n case 'sql_insert': return isRTL ? 'حفظ النتائج' : 'saves results'\n case 'adk_call': case 'gemini_call': return isRTL ? 'خطوة ذكاء اصطناعي' : 'AI step'\n default: return String(step.kind ?? '').replace(/[_-]+/g, ' ')\n }\n}\nconst humanVar = (v: any) => String(v ?? 'item').replace(/^\\$/, '').replace(/[_-]+/g, ' ')\n\n// ── empty-branch droppable ──────────────────────────────────────────────────\nfunction EmptyDrop({ id, label }: { id: string; label: string }) {\n const { setNodeRef, isOver } = useDroppable({ id })\n return (\n <div\n ref={setNodeRef}\n className={cn(\n 'rounded-md border border-dashed px-3 py-2 text-center text-[11px] text-muted-foreground transition',\n isOver ? 'border-primary bg-primary/5 text-primary' : 'border-border',\n )}\n >\n {label}\n </div>\n )\n}\n\n// ── main ────────────────────────────────────────────────────────────────────\nexport function NestedStepsEditor({\n steps, language = 'en', onChange, onEditStep, onDeleteStep, className,\n}: NestedStepsEditorProps) {\n const isRTL = language === 'ar'\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 4 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n )\n const [activeStep, setActiveStep] = React.useState<Step | null>(null)\n\n // ensure uids once per identity change\n const tree = React.useMemo(() => ensureUids(steps), [steps])\n\n // droppable id for an empty branch encodes its container path: \"drop::0::then\"\n const emptyDropId = (containerPath: Path) => `drop::${containerPath.join('::')}`\n const parseEmptyDrop = (id: string): Path | null => {\n if (!id.startsWith('drop::')) return null\n return id.slice(6).split('::').filter(Boolean).map((t) => (/^\\d+$/.test(t) ? Number(t) : t))\n }\n\n const onDragStart = (e: DragStartEvent) => {\n const p = findPath(tree, String(e.active.id))\n if (p) {\n const cont = getContainer(tree, p.slice(0, -1))\n setActiveStep(cont[p[p.length - 1] as number])\n }\n }\n\n const onDragEnd = (e: DragEndEvent) => {\n setActiveStep(null)\n const { active, over } = e\n if (!over || active.id === over.id) return\n const root: Step[] = JSON.parse(JSON.stringify(tree))\n const fromPath = findPath(root, String(active.id))\n if (!fromPath) return\n\n // resolve target container + index\n let toContainerPath: Path\n let toIndex: number\n const overEmpty = parseEmptyDrop(String(over.id))\n if (overEmpty) {\n toContainerPath = overEmpty\n toIndex = getContainer(root, toContainerPath).length\n } else {\n const overPath = findPath(root, String(over.id))\n if (!overPath) return\n toContainerPath = overPath.slice(0, -1)\n toIndex = overPath[overPath.length - 1] as number\n }\n\n // never drop a step into its own subtree\n if (startsWith(toContainerPath, fromPath)) return\n\n // remove from source\n const fromContainerPath = fromPath.slice(0, -1)\n const fromIdx = fromPath[fromPath.length - 1] as number\n const fromArr = getContainer(root, fromContainerPath)\n const [moved] = fromArr.splice(fromIdx, 1)\n if (!moved) return\n\n // adjust target index if same container and we removed an earlier sibling\n if (samePath(fromContainerPath, toContainerPath) && fromIdx < toIndex) toIndex -= 1\n\n const toArr = getContainer(root, toContainerPath)\n toArr.splice(Math.max(0, Math.min(toIndex, toArr.length)), 0, moved)\n onChange(root)\n }\n\n // recursive branch renderer\n const renderBranch = (arr: Step[], containerPath: Path, depth: number, label?: string): React.ReactNode => (\n <div className={cn(depth > 0 && 'ms-5 border-s-2 border-dashed border-border ps-3')}>\n {label && <div className=\"mb-1 mt-1.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">{label}</div>}\n <SortableContext items={arr.map((s) => String(s._uid))} strategy={verticalListSortingStrategy}>\n <div className=\"space-y-1.5\">\n {arr.length === 0 ? (\n <EmptyDrop id={emptyDropId(containerPath)} label={isRTL ? 'أفلت خطوة هنا' : 'Drop a step here'} />\n ) : (\n arr.map((s, i) => (\n <StepRow\n key={String(s._uid)}\n step={s}\n isRTL={isRTL}\n depth={depth}\n onEditStep={onEditStep}\n onDeleteStep={onDeleteStep}\n renderBranches={(step) => {\n const bks = branchesFor(step)\n if (bks.length === 0) return null\n return (\n <div className=\"mt-1.5 space-y-1\">\n {bks.map((bk) =>\n renderBranch(\n Array.isArray(step[bk]) ? step[bk] : [],\n [...containerPath, i, bk],\n depth + 1,\n isRTL ? BRANCH_LABEL[bk][1] : BRANCH_LABEL[bk][0],\n ),\n )}\n </div>\n )\n }}\n />\n ))\n )}\n </div>\n </SortableContext>\n </div>\n )\n\n return (\n <div className={cn('text-sm', className)} dir={isRTL ? 'rtl' : 'ltr'}>\n <DndContext sensors={sensors} collisionDetection={closestCenter} onDragStart={onDragStart} onDragEnd={onDragEnd}>\n {renderBranch(tree, [], 0)}\n <DragOverlay>\n {activeStep ? (\n <div className=\"flex items-center gap-2 rounded-md border border-primary/40 bg-card px-2 py-1.5 shadow-lg\">\n <GripVertical className=\"h-4 w-4 text-muted-foreground/60\" />\n <Badge variant=\"secondary\" className=\"h-4 rounded-sm px-1 text-[10px]\">{kindLabel(activeStep.kind ?? '?', isRTL)}</Badge>\n <span className=\"text-xs text-muted-foreground\">{compactSummary(activeStep, isRTL)}</span>\n </div>\n ) : null}\n </DragOverlay>\n </DndContext>\n </div>\n )\n}\n\nNestedStepsEditor.displayName = 'NestedStepsEditor'\n","'use client'\n\n/**\n * StepOptionsDialog — a type-specific options modal for a single workflow step.\n *\n * The form fields are driven by a registry keyed on the step `kind`, so each step\n * type shows exactly the settings it needs (schedule, condition, query, prompt,\n * model, …). Unknown kinds fall back to a raw-JSON editor. Presentational +\n * bilingual (EN/AR) + token-themed + RTL — pass the step and an onSave callback.\n */\n\nimport * as React from 'react'\nimport {\n Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogDescription,\n} from '../ui/dialog'\nimport { Button } from '../ui/button'\nimport { Input } from '../ui/input'\nimport { Textarea } from '../ui/textarea'\nimport { Label } from '../ui/label'\nimport { Switch } from '../ui/switch'\nimport {\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem,\n} from '../ui/select'\n\nexport type StepFieldType = 'text' | 'textarea' | 'number' | 'select' | 'switch' | 'lines' | 'csv' | 'json'\n\nexport interface StepFieldDef {\n key: string\n type: StepFieldType\n label_en: string\n label_ar: string\n placeholder?: string\n options?: { value: string; label: string }[]\n}\n\nconst MODELS = ['gemini-2.5-flash', 'gemini-2.5-pro', 'gpt-4o', 'gpt-4o-mini', 'claude-sonnet-4-6']\n .map((m) => ({ value: m, label: m }))\n\n/** kind → field schema. The most common togo/sentra step kinds are covered; any\n * other kind falls back to the raw-JSON editor. */\nexport const STEP_FIELD_REGISTRY: Record<string, StepFieldDef[]> = {\n cron_trigger: [\n { key: 'schedule', type: 'text', label_en: 'Schedule', label_ar: 'الجدولة', placeholder: 'e.g. 15m, 1h, 1d' },\n { key: 'min_interval_sec', type: 'number', label_en: 'Min interval (seconds)', label_ar: 'أدنى فاصل (ثوانٍ)' },\n ],\n if: [\n { key: 'condition', type: 'text', label_en: 'Condition', label_ar: 'الشرط', placeholder: '$cron_due' },\n ],\n for_each: [\n { key: 'over', type: 'text', label_en: 'For each item in', label_ar: 'لكل عنصر في', placeholder: '$candidates' },\n ],\n sql_select: [\n { key: 'table', type: 'text', label_en: 'Table', label_ar: 'الجدول', placeholder: 'public.raw_envelopes' },\n { key: 'query', type: 'textarea', label_en: 'Query', label_ar: 'الاستعلام', placeholder: 'SELECT …' },\n { key: 'limit', type: 'number', label_en: 'Limit', label_ar: 'الحد' },\n { key: 'output', type: 'text', label_en: 'Output variable', label_ar: 'متغير الإخراج', placeholder: 'candidates' },\n ],\n sql_insert: [\n { key: 'table', type: 'text', label_en: 'Table', label_ar: 'الجدول' },\n { key: 'columns', type: 'csv', label_en: 'Columns', label_ar: 'الأعمدة', placeholder: 'title, severity, entity_id' },\n { key: 'rows_field', type: 'text', label_en: 'Rows from', label_ar: 'الصفوف من' },\n { key: 'on_conflict', type: 'text', label_en: 'On conflict', label_ar: 'عند التعارض' },\n { key: 'skip_on_empty', type: 'switch', label_en: 'Skip when empty', label_ar: 'تخطٍّ عند الفراغ' },\n ],\n sql_update: [\n { key: 'table', type: 'text', label_en: 'Table', label_ar: 'الجدول' },\n { key: 'set', type: 'json', label_en: 'Set (JSON)', label_ar: 'تعيين (JSON)' },\n ],\n gemini_call: [\n { key: 'prompt_slug', type: 'text', label_en: 'Prompt', label_ar: 'الموجّه', placeholder: 'alert-classify' },\n { key: 'model', type: 'select', label_en: 'Model', label_ar: 'النموذج', options: MODELS },\n { key: 'target_field', type: 'text', label_en: 'Save result to', label_ar: 'حفظ النتيجة في' },\n ],\n adk_call: [\n { key: 'prompt_slug', type: 'text', label_en: 'Prompt', label_ar: 'الموجّه', placeholder: 'alert-classify' },\n { key: 'prompt_inline', type: 'textarea', label_en: 'Inline prompt (optional)', label_ar: 'موجّه مضمّن (اختياري)' },\n { key: 'model', type: 'select', label_en: 'Model', label_ar: 'النموذج', options: MODELS },\n { key: 'target_field', type: 'text', label_en: 'Save result to', label_ar: 'حفظ النتيجة في' },\n ],\n http_call: [\n { key: 'url', type: 'text', label_en: 'URL', label_ar: 'الرابط', placeholder: 'https://…' },\n { key: 'method', type: 'select', label_en: 'Method', label_ar: 'الطريقة', options: [{ value: 'GET', label: 'GET' }, { value: 'POST', label: 'POST' }] },\n { key: 'target_field', type: 'text', label_en: 'Save response to', label_ar: 'حفظ الاستجابة في' },\n { key: 'timeout_sec', type: 'number', label_en: 'Timeout (seconds)', label_ar: 'المهلة (ثوانٍ)' },\n { key: 'headers', type: 'json', label_en: 'Headers (JSON)', label_ar: 'الترويسات (JSON)' },\n { key: 'body_json', type: 'json', label_en: 'Body (JSON)', label_ar: 'الجسم (JSON)' },\n ],\n webhook: [\n { key: 'url', type: 'text', label_en: 'Webhook URL', label_ar: 'رابط الويب هوك', placeholder: 'https://…' },\n { key: 'method', type: 'select', label_en: 'Method', label_ar: 'الطريقة', options: [{ value: 'POST', label: 'POST' }, { value: 'GET', label: 'GET' }] },\n ],\n send_email: [\n { key: 'to', type: 'text', label_en: 'To', label_ar: 'إلى' },\n { key: 'subject', type: 'text', label_en: 'Subject', label_ar: 'الموضوع' },\n { key: 'body', type: 'textarea', label_en: 'Body', label_ar: 'النص' },\n ],\n search_query: [\n { key: 'queries', type: 'lines', label_en: 'Queries (one per line)', label_ar: 'الاستعلامات (واحد بكل سطر)' },\n { key: 'engines', type: 'csv', label_en: 'Engines', label_ar: 'المحرّكات' },\n ],\n rss_poll: [\n { key: 'urls', type: 'lines', label_en: 'Feed URLs (one per line)', label_ar: 'روابط الخلاصات (واحد بكل سطر)' },\n { key: 'freshness_hours', type: 'number', label_en: 'Freshness (hours)', label_ar: 'الحداثة (ساعات)' },\n ],\n web_scrape: [\n { key: 'url', type: 'text', label_en: 'URL', label_ar: 'الرابط' },\n { key: 'target_field', type: 'text', label_en: 'Save to', label_ar: 'حفظ في' },\n { key: 'timeout_sec', type: 'number', label_en: 'Timeout (seconds)', label_ar: 'المهلة (ثوانٍ)' },\n { key: 'user_agent', type: 'text', label_en: 'User agent', label_ar: 'وكيل المستخدم' },\n ],\n}\n\n// alias kinds → same schema\nSTEP_FIELD_REGISTRY.http_request = STEP_FIELD_REGISTRY.http_call\nSTEP_FIELD_REGISTRY.email = STEP_FIELD_REGISTRY.send_email\n\nexport interface StepOptionsDialogProps {\n open: boolean\n /** The step object being edited (any shape with a `kind`). */\n step: Record<string, any> | null\n language?: 'en' | 'ar'\n onClose: () => void\n /** Called with the FULL updated step object when the operator saves. */\n onSave: (next: Record<string, any>) => void\n}\n\nconst isContainerKey = (k: string) => k === 'then' || k === 'else' || k === 'steps' || k === '_uid' || k === 'id' || k === 'kind'\n\nexport function StepOptionsDialog({ open, step, language = 'en', onClose, onSave }: StepOptionsDialogProps) {\n const isRTL = language === 'ar'\n const t = (en: string, ar: string) => (isRTL ? ar : en)\n const kind: string = step?.kind ?? 'unknown'\n const fields = STEP_FIELD_REGISTRY[kind]\n const isKnown = Array.isArray(fields)\n\n const [form, setForm] = React.useState<Record<string, string>>({})\n const [rawJson, setRawJson] = React.useState('')\n const [err, setErr] = React.useState<string | null>(null)\n\n // seed form whenever a new step opens\n React.useEffect(() => {\n if (!step) return\n setErr(null)\n if (!isKnown) {\n setRawJson(JSON.stringify(step, (k, v) => (k === '_uid' ? undefined : v), 2))\n return\n }\n const next: Record<string, string> = {}\n for (const f of fields) {\n const v = step[f.key]\n if (f.type === 'lines') next[f.key] = Array.isArray(v) ? v.join('\\n') : (v ?? '')\n else if (f.type === 'csv') next[f.key] = Array.isArray(v) ? v.join(', ') : (v ?? '')\n else if (f.type === 'json') next[f.key] = v == null ? '' : JSON.stringify(v, null, 2)\n else if (f.type === 'switch') next[f.key] = v ? '1' : ''\n else next[f.key] = v == null ? '' : String(v)\n }\n setForm(next)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [step, kind])\n\n const set = (k: string, v: string) => setForm((p) => ({ ...p, [k]: v }))\n\n const handleSave = () => {\n if (!step) return\n setErr(null)\n if (!isKnown) {\n try {\n const parsed = JSON.parse(rawJson)\n onSave({ ...parsed, _uid: step._uid, kind: parsed.kind ?? step.kind })\n onClose()\n } catch (e: any) {\n setErr(t('Invalid JSON: ', 'JSON غير صالح: ') + (e?.message ?? ''))\n }\n return\n }\n // preserve container branches + identity, overwrite the editable fields\n const next: Record<string, any> = {}\n for (const k of Object.keys(step)) if (isContainerKey(k)) next[k] = step[k]\n next.kind = step.kind\n for (const f of fields) {\n const raw = (form[f.key] ?? '').trim()\n if (f.type === 'switch') { next[f.key] = form[f.key] === '1'; continue }\n if (raw === '') continue\n if (f.type === 'number') { const n = Number(raw); if (!Number.isNaN(n)) next[f.key] = n; continue }\n if (f.type === 'lines') { next[f.key] = raw.split('\\n').map((s) => s.trim()).filter(Boolean); continue }\n if (f.type === 'csv') { next[f.key] = raw.split(',').map((s) => s.trim()).filter(Boolean); continue }\n if (f.type === 'json') {\n try { next[f.key] = JSON.parse(raw) } catch (e: any) { setErr(`${f.label_en}: ${e?.message ?? 'invalid JSON'}`); return }\n continue\n }\n next[f.key] = raw\n }\n onSave(next)\n onClose()\n }\n\n const title = humanKind(kind, isRTL)\n\n return (\n <Dialog open={open} onOpenChange={(o) => !o && onClose()}>\n <DialogContent className=\"max-w-lg\" dir={isRTL ? 'rtl' : 'ltr'}>\n <DialogHeader>\n <DialogTitle>{t('Step settings', 'إعدادات الخطوة')} · {title}</DialogTitle>\n <DialogDescription>{t('Configure what this step does.', 'اضبط ما تقوم به هذه الخطوة.')}</DialogDescription>\n </DialogHeader>\n\n <div className=\"max-h-[60vh] space-y-4 overflow-y-auto py-1\">\n {err && <p className=\"rounded-md bg-destructive/10 px-3 py-2 text-sm text-destructive\">{err}</p>}\n\n {!isKnown ? (\n <div className=\"space-y-1.5\">\n <Label>{t('Raw step (JSON)', 'الخطوة الخام (JSON)')}</Label>\n <Textarea value={rawJson} onChange={(e) => setRawJson(e.target.value)} rows={12} className=\"font-mono text-xs\" dir=\"ltr\" />\n </div>\n ) : (\n fields.map((f) => (\n <div key={f.key} className=\"space-y-1.5\">\n <Label htmlFor={`opt-${f.key}`}>{t(f.label_en, f.label_ar)}</Label>\n {f.type === 'switch' ? (\n <div className=\"flex items-center gap-2\">\n <Switch id={`opt-${f.key}`} checked={form[f.key] === '1'} onCheckedChange={(v) => set(f.key, v ? '1' : '')} />\n </div>\n ) : f.type === 'select' ? (\n <Select value={form[f.key] || undefined} onValueChange={(v) => set(f.key, v)}>\n <SelectTrigger id={`opt-${f.key}`}><SelectValue placeholder={t('Select…', 'اختر…')} /></SelectTrigger>\n <SelectContent>\n {f.options?.map((o) => <SelectItem key={o.value} value={o.value}>{o.label}</SelectItem>)}\n </SelectContent>\n </Select>\n ) : f.type === 'textarea' || f.type === 'lines' || f.type === 'csv' || f.type === 'json' ? (\n <Textarea\n id={`opt-${f.key}`}\n value={form[f.key] ?? ''}\n onChange={(e) => set(f.key, e.target.value)}\n placeholder={f.placeholder}\n rows={f.type === 'json' || f.type === 'textarea' ? 5 : 3}\n className={f.type === 'json' ? 'font-mono text-xs' : undefined}\n dir={f.type === 'json' ? 'ltr' : undefined}\n />\n ) : (\n <Input\n id={`opt-${f.key}`}\n type={f.type === 'number' ? 'number' : 'text'}\n value={form[f.key] ?? ''}\n onChange={(e) => set(f.key, e.target.value)}\n placeholder={f.placeholder}\n />\n )}\n </div>\n ))\n )}\n </div>\n\n <DialogFooter>\n <Button variant=\"outline\" onClick={onClose}>{t('Cancel', 'إلغاء')}</Button>\n <Button onClick={handleSave}>{t('Save', 'حفظ')}</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n\nfunction humanKind(kind: string, isRTL: boolean): string {\n const map: Record<string, [string, string]> = {\n cron_trigger: ['Schedule', 'جدولة'], if: ['Condition', 'شرط'], for_each: ['Repeat', 'تكرار'],\n sql_select: ['Read data', 'قراءة'], sql_insert: ['Save', 'حفظ'], sql_update: ['Update', 'تحديث'],\n gemini_call: ['AI', 'ذكاء اصطناعي'], adk_call: ['AI', 'ذكاء اصطناعي'], http_call: ['HTTP', 'HTTP'],\n http_request: ['HTTP', 'HTTP'], webhook: ['Webhook', 'ويب هوك'], send_email: ['Email', 'بريد'],\n search_query: ['Search', 'بحث'], rss_poll: ['RSS', 'RSS'], web_scrape: ['Scrape', 'جلب'],\n }\n const m = map[kind]\n if (m) return isRTL ? m[1] : m[0]\n return kind.replace(/[_-]+/g, ' ')\n}\n\nStepOptionsDialog.displayName = 'StepOptionsDialog'\n","'use client'\n\n/**\n * PluginAppearanceSection — appearance/placement section (pure-UI port).\n *\n * ADAPTED from app/src/components/admin/plugin/sections/PluginAppearanceSection.tsx:\n * - @/components/ui/* → ../ui/*\n * - @/lib/utils → ../../lib/utils\n * - useLanguage hook → language prop\n * - usePluginDetail → removed; initial state from props (appearance fields)\n * - useUpdateAppearance → removed; onSave(fields) callback seam\n *\n * Seams:\n * - appearance: PluginAppearanceFields (current server state, seeds form)\n * - onSave(fields): called on Save button — host calls the bridge\n * - isPending: true while host is saving\n * - isError / errorMessage: error state from host\n * - language: 'en' | 'ar'\n */\n\nimport { useState, useEffect } from 'react'\nimport { Card, CardContent, CardHeader, CardTitle } from '../ui/card'\nimport { RadioGroup, RadioGroupItem } from '../ui/radio-group'\nimport { Switch } from '../ui/switch'\nimport { Input } from '../ui/input'\nimport { Button } from '../ui/button'\nimport { Label } from '../ui/label'\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '../ui/tooltip'\nimport { cn } from '../../lib/utils'\nimport type { AppearanceMode, PluginAppearanceFields } from './types'\n\n// ── Placement option definitions ───────────────────────────────────────────────\n\ntype PlacementOption = {\n value: AppearanceMode\n label_en: string\n label_ar: string\n desc_en: string\n desc_ar: string\n capabilityOnly: boolean\n}\n\nconst PLACEMENT_OPTIONS: PlacementOption[] = [\n {\n value: 'sidebar',\n label_en: 'Sidebar',\n label_ar: 'الشريط الجانبي',\n desc_en: 'Appears as a navigation item in the main sidebar.',\n desc_ar: 'يظهر كعنصر تنقل في الشريط الجانبي الرئيسي.',\n capabilityOnly: false,\n },\n {\n value: 'header',\n label_en: 'Header',\n label_ar: 'الرأس',\n desc_en: 'Appears in the top header bar, next to notifications.',\n desc_ar: 'يظهر في شريط الرأس العلوي بجانب الإشعارات.',\n capabilityOnly: false,\n },\n {\n value: 'sideover',\n label_en: 'Sideover panel',\n label_ar: 'لوحة جانبية',\n desc_en: 'Opens as a slide-over sheet from a global icon button. Capability only.',\n desc_ar: 'يفتح كلوحة منزلقة من زر الأيقونة العامة. للقدرات فقط.',\n capabilityOnly: true,\n },\n {\n value: 'fixed',\n label_en: 'Fixed overlay',\n label_ar: 'تراكب ثابت',\n desc_en: 'Mounts as a floating widget on every page (copilot-style). Capability only.',\n desc_ar: 'يُثبَّت كأداة عائمة في كل صفحة (نمط المساعد). للقدرات فقط.',\n capabilityOnly: true,\n },\n {\n value: 'hidden',\n label_en: 'Hidden',\n label_ar: 'مخفي',\n desc_en: 'Not rendered anywhere in the app shell.',\n desc_ar: 'لا يظهر في أي مكان من واجهة التطبيق.',\n capabilityOnly: false,\n },\n]\n\nconst canBeDefaultPage = (mode: AppearanceMode): boolean =>\n mode === 'sidebar' || mode === 'header'\n\n// ── Props ──────────────────────────────────────────────────────────────────────\n\nexport interface PluginAppearanceSectionProps {\n /** Current server state — seeds the form on mount / when changed. */\n appearance: PluginAppearanceFields\n /** Called when the operator saves. Return type intentionally void — host handles async. */\n onSave: (changed: Partial<PluginAppearanceFields>) => void\n /** Whether the host is currently persisting. */\n isPending?: boolean\n /** Whether the last save resulted in an error. */\n isError?: boolean\n errorMessage?: string\n /** Current UI language. */\n language: 'en' | 'ar'\n}\n\n// ── Component ──────────────────────────────────────────────────────────────────\n\nexport const PluginAppearanceSection = ({\n appearance,\n onSave,\n isPending = false,\n isError = false,\n errorMessage,\n language,\n}: PluginAppearanceSectionProps) => {\n const isRTL = language === 'ar'\n const isCapability = appearance.plugin_type === 'capability'\n\n const [mode, setMode] = useState<AppearanceMode>(appearance.appearance_mode)\n const [order, setOrder] = useState<number>(appearance.nav_order)\n const [isDefaultPage, setIsDefaultPage] = useState<boolean>(appearance.is_default_page ?? false)\n const [dirty, setDirty] = useState(false)\n\n // Re-seed when server state changes (e.g. after successful save)\n useEffect(() => {\n setMode(appearance.appearance_mode)\n setOrder(appearance.nav_order)\n setIsDefaultPage(appearance.is_default_page ?? false)\n setDirty(false)\n }, [appearance])\n\n const handleModeChange = (value: string) => {\n const next = value as AppearanceMode\n setMode(next)\n if (!canBeDefaultPage(next)) setIsDefaultPage(false)\n setDirty(true)\n }\n\n const handleOrderChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const parsed = parseInt(e.target.value, 10)\n setOrder(Number.isNaN(parsed) ? 0 : parsed)\n setDirty(true)\n }\n\n const handleDefaultPageChange = (checked: boolean) => {\n setIsDefaultPage(checked)\n setDirty(true)\n }\n\n const handleSave = () => {\n const payload: Partial<PluginAppearanceFields> = {}\n if (mode !== appearance.appearance_mode) payload.appearance_mode = mode\n if (order !== appearance.nav_order) payload.nav_order = order\n if (isCapability && isDefaultPage !== (appearance.is_default_page ?? false)) {\n payload.is_default_page = isDefaultPage\n }\n if (Object.keys(payload).length === 0) { setDirty(false); return }\n onSave(payload)\n }\n\n return (\n <TooltipProvider>\n <Card className=\"mt-4\">\n <CardHeader>\n <CardTitle className=\"text-base font-semibold\">\n {isRTL ? 'المظهر والتوضع' : 'Appearance & Placement'}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-8\">\n\n {/* Placement radio group */}\n <div className=\"space-y-3\">\n <p className=\"text-sm font-medium text-foreground\">\n {isRTL ? 'التوضع' : 'Placement'}\n </p>\n <RadioGroup\n value={mode}\n onValueChange={handleModeChange}\n className=\"space-y-2\"\n dir={isRTL ? 'rtl' : 'ltr'}\n >\n {PLACEMENT_OPTIONS.map((opt) => {\n const disabled = opt.capabilityOnly && !isCapability\n const label = isRTL ? opt.label_ar : opt.label_en\n const desc = isRTL ? opt.desc_ar : opt.desc_en\n\n return (\n <div key={opt.value} className=\"flex items-start gap-3\">\n {disabled ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex items-start gap-3 opacity-40 cursor-not-allowed\">\n <RadioGroupItem value={opt.value} id={`placement-${opt.value}`} disabled className=\"mt-0.5 shrink-0\" />\n <div className=\"space-y-0.5\">\n <Label htmlFor={`placement-${opt.value}`} className=\"text-sm font-medium cursor-not-allowed\">{label}</Label>\n <p className=\"text-xs text-muted-foreground\">{desc}</p>\n </div>\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"right\" dir={isRTL ? 'rtl' : 'ltr'}>\n {isRTL ? 'متاح فقط لنوع القدرات' : 'Available for capability plugins only'}\n </TooltipContent>\n </Tooltip>\n ) : (\n <>\n <RadioGroupItem value={opt.value} id={`placement-${opt.value}`} className=\"mt-0.5 shrink-0\" />\n <div className=\"space-y-0.5\">\n <Label htmlFor={`placement-${opt.value}`} className=\"text-sm font-medium cursor-pointer\">{label}</Label>\n <p className=\"text-xs text-muted-foreground\">{desc}</p>\n </div>\n </>\n )}\n </div>\n )\n })}\n </RadioGroup>\n </div>\n\n {/* Nav order */}\n <div className=\"space-y-2\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Label htmlFor=\"nav-order\" className=\"text-sm font-medium cursor-help\">\n {isRTL ? 'الترتيب' : 'Order'}\n </Label>\n </TooltipTrigger>\n <TooltipContent side=\"right\" dir={isRTL ? 'rtl' : 'ltr'} className=\"max-w-xs\">\n {isRTL\n ? 'الأرقام الأصغر تظهر أولاً.'\n : 'Lower numbers appear first.'}\n </TooltipContent>\n </Tooltip>\n <Input\n id=\"nav-order\"\n type=\"number\"\n value={order}\n onChange={handleOrderChange}\n min={0}\n className=\"w-28\"\n dir=\"ltr\"\n />\n </div>\n\n {/* Default landing page (capability only) */}\n {isCapability && (\n <div className=\"flex items-start gap-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Switch\n id=\"default-page\"\n checked={isDefaultPage}\n onCheckedChange={handleDefaultPageChange}\n disabled={!canBeDefaultPage(mode)}\n aria-describedby=\"default-page-desc\"\n />\n </TooltipTrigger>\n {!canBeDefaultPage(mode) && (\n <TooltipContent side=\"right\" dir={isRTL ? 'rtl' : 'ltr'} className=\"max-w-xs\">\n {isRTL\n ? 'لا يمكن تعيين صفحة افتراضية عندما يكون الوضع مخفياً أو لوحة جانبية أو تراكباً ثابتاً.'\n : 'Cannot set as default page when mode is hidden, sideover, or fixed.'}\n </TooltipContent>\n )}\n </Tooltip>\n <div className=\"space-y-0.5\">\n <Label\n htmlFor=\"default-page\"\n className={cn(\n 'text-sm font-medium',\n !canBeDefaultPage(mode) && 'opacity-40 cursor-not-allowed',\n )}\n >\n {isRTL ? 'تعيين كصفحة الوصول الافتراضية' : 'Set as default landing page'}\n </Label>\n <p id=\"default-page-desc\" className=\"text-xs text-muted-foreground\">\n {isRTL\n ? 'يوجّه المستخدمين إلى هذه القدرة عند فتح التطبيق.'\n : 'Redirects users to this capability on app open.'}\n </p>\n </div>\n </div>\n )}\n\n {/* Error feedback */}\n {isError && (\n <p className=\"text-sm text-destructive\" role=\"alert\">\n {isRTL\n ? `فشل الحفظ: ${errorMessage ?? 'خطأ غير معروف'}`\n : `Save failed: ${errorMessage ?? 'Unknown error'}`}\n </p>\n )}\n\n {/* Save button */}\n <div className={cn('flex', isRTL ? 'justify-start' : 'justify-end')}>\n <Button onClick={handleSave} disabled={!dirty || isPending} size=\"sm\">\n {isPending\n ? (isRTL ? 'جارٍ الحفظ…' : 'Saving…')\n : (isRTL ? 'حفظ التغييرات' : 'Save changes')}\n </Button>\n </div>\n\n </CardContent>\n </Card>\n </TooltipProvider>\n )\n}\n\nPluginAppearanceSection.displayName = 'PluginAppearanceSection'\n\nexport default PluginAppearanceSection\n","'use client'\n\n/**\n * TestRunPanel — streams SSE test-run execution log + saved envelopes.\n *\n * ADAPTED from app/src/components/superadmin/plugins/TestRunPanel.tsx:\n * - @/components/ui/* → ../ui/*\n * - @/lib/utils → ../../lib/utils\n * - useLanguage hook → language prop\n * - sourceTestRunSSE hook → onRunRequest seam (host wires the SSE call)\n *\n * Seam: instead of importing the bridge SSE helper directly, the host passes\n * `onRunRequest(slug, maxEnvelopes, callbacks)` which must match the same\n * AbortController return signature. This keeps sentra-ui bridge-free.\n *\n * Type definitions for TestRunStep, TestRunCompletePayload, TestRunSavedItem\n * are re-exported from this file so the host can wire them without a bridge dep.\n */\n\nimport { useState, useRef, useCallback } from 'react'\nimport {\n Play,\n Square,\n CheckCircle2,\n XCircle,\n MinusCircle,\n Loader2,\n ExternalLink,\n ChevronDown,\n ChevronUp,\n FileText,\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\nimport { Button } from '../ui/button'\nimport { Card, CardContent, CardHeader, CardTitle } from '../ui/card'\nimport { Badge } from '../ui/badge'\nimport { Separator } from '../ui/separator'\n\n// ── Public types (re-exported for host wiring) ────────────────────────────────\n\nexport interface TestRunStep {\n name: string\n status: 'ok' | 'error' | 'skipped' | string\n detail?: string\n duration_ms?: number\n count?: number\n error?: string\n}\n\nexport interface TestRunSavedItem {\n title?: string\n url?: string\n language?: string\n content_hash?: string\n envelope_id?: string\n source_id?: string\n region?: string\n content_en?: string\n content_ar?: string\n published_at?: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n raw_payload?: any\n}\n\nexport interface TestRunCompletePayload {\n envelopes_saved: number\n saved: TestRunSavedItem[]\n}\n\n/** Callbacks for the SSE stream. */\nexport interface TestRunCallbacks {\n onStep: (step: TestRunStep) => void\n onComplete: (payload: TestRunCompletePayload) => void\n onError: (err: { error: string }) => void\n}\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\ntype RunState = 'idle' | 'running' | 'done' | 'error'\n\n// ── StepRow ───────────────────────────────────────────────────────────────────\n\ninterface StepRowProps {\n step: TestRunStep\n isRTL: boolean\n}\n\nconst StepRow = ({ step, isRTL }: StepRowProps) => {\n const Icon =\n step.status === 'ok' ? CheckCircle2 :\n step.status === 'error' ? XCircle :\n step.status === 'skipped' ? MinusCircle :\n Loader2\n\n const iconClass = cn(\n 'h-4 w-4 shrink-0',\n step.status === 'ok' && 'text-emerald-500',\n step.status === 'error' && 'text-destructive',\n step.status === 'skipped' && 'text-muted-foreground',\n step.status !== 'ok' && step.status !== 'error' && step.status !== 'skipped' && 'animate-spin text-muted-foreground',\n )\n\n return (\n <div className=\"flex items-start gap-3 py-2 text-sm\">\n <Icon className={cn(iconClass, 'mt-0.5')} aria-hidden />\n <div className=\"min-w-0 flex-1 space-y-0.5\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className=\"font-mono font-medium\">{step.name}</span>\n {typeof step.count === 'number' && step.count > 0 && (\n <Badge variant=\"secondary\" className=\"text-[10px] tabular-nums\">{step.count}</Badge>\n )}\n {typeof step.duration_ms === 'number' && (\n <span className=\"text-[11px] text-muted-foreground tabular-nums\">\n {step.duration_ms < 1000 ? `${step.duration_ms}ms` : `${(step.duration_ms / 1000).toFixed(1)}s`}\n </span>\n )}\n </div>\n {step.detail && (\n <p className=\"text-[11px] text-muted-foreground truncate\" title={step.detail}>{step.detail}</p>\n )}\n {step.error && (\n <p className=\"text-[11px] text-destructive break-words\">{step.error}</p>\n )}\n </div>\n <span className={cn(\n 'shrink-0 text-[10px] font-medium uppercase tracking-wide',\n step.status === 'ok' && 'text-emerald-500',\n step.status === 'error' && 'text-destructive',\n step.status === 'skipped' && 'text-muted-foreground',\n )}>\n {isRTL\n ? step.status === 'ok' ? 'ناجح'\n : step.status === 'error' ? 'خطأ'\n : step.status === 'skipped' ? 'متخطّى'\n : '...'\n : step.status}\n </span>\n </div>\n )\n}\nStepRow.displayName = 'StepRow'\n\n// ── SavedItem ─────────────────────────────────────────────────────────────────\n\ninterface SavedItemProps {\n item: TestRunSavedItem\n isRTL: boolean\n}\n\nconst SavedItem = ({ item, isRTL }: SavedItemProps) => {\n const [rawOpen, setRawOpen] = useState(false)\n const bodyText = isRTL\n ? (item.content_ar || item.content_en || '')\n : (item.content_en || item.content_ar || '')\n\n const handleToggleRaw = () => setRawOpen((v) => !v)\n\n return (\n <div className=\"space-y-2 py-3\">\n <div className=\"flex items-start gap-1.5\">\n <div className=\"min-w-0 flex-1\">\n {item.url ? (\n <a href={item.url} target=\"_blank\" rel=\"noopener noreferrer\"\n className=\"text-sm font-medium text-foreground hover:text-primary hover:underline\" dir=\"auto\">\n {item.title || item.url || '(untitled)'}\n </a>\n ) : (\n <span className=\"text-sm font-medium text-foreground\" dir=\"auto\">\n {item.title || '(untitled)'}\n </span>\n )}\n </div>\n {item.url && (\n <a href={item.url} target=\"_blank\" rel=\"noopener noreferrer\"\n className=\"shrink-0 text-muted-foreground hover:text-primary mt-0.5\">\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n )}\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {item.language && <Badge variant=\"outline\" className=\"text-[10px] uppercase\">{item.language}</Badge>}\n {item.region && <Badge variant=\"outline\" className=\"text-[10px]\">{item.region}</Badge>}\n {item.published_at && (\n <span className=\"text-[10px] text-muted-foreground tabular-nums\">\n {new Date(item.published_at).toLocaleString(isRTL ? 'ar-SA' : 'en-US', { dateStyle: 'medium', timeStyle: 'short' })}\n </span>\n )}\n {item.content_hash && (\n <span className=\"text-[9px] font-mono text-muted-foreground/50 hidden sm:block\">\n {item.content_hash.slice(0, 8)}\n </span>\n )}\n </div>\n\n {bodyText && (\n <p className=\"text-xs text-muted-foreground leading-relaxed line-clamp-4 whitespace-pre-line\" dir={isRTL ? 'rtl' : 'ltr'}>\n {bodyText}\n </p>\n )}\n\n {item.raw_payload != null && (\n <div>\n <button type=\"button\" onClick={handleToggleRaw}\n className=\"flex items-center gap-1 text-[10px] text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard\">\n <FileText className=\"h-3 w-3\" />\n {rawOpen ? (isRTL ? 'إخفاء البيانات الخام' : 'Hide raw payload') : (isRTL ? 'عرض البيانات الخام' : 'Show raw payload')}\n {rawOpen ? <ChevronUp className=\"h-3 w-3\" /> : <ChevronDown className=\"h-3 w-3\" />}\n </button>\n {rawOpen && (\n <pre className=\"mt-1.5 max-h-48 overflow-y-auto rounded-md bg-muted/60 px-3 py-2 text-[10px] font-mono text-muted-foreground whitespace-pre-wrap break-all\">\n {JSON.stringify(item.raw_payload, null, 2)}\n </pre>\n )}\n </div>\n )}\n </div>\n )\n}\nSavedItem.displayName = 'SavedItem'\n\n// ── TestRunPanel ──────────────────────────────────────────────────────────────\n\nexport interface TestRunPanelProps {\n /** Plugin slug — passed to onRunRequest. */\n slug: string\n /** Max envelopes to save. Default 5. */\n maxEnvelopes?: number\n /** If true, panel renders as an inline block rather than a Card. */\n inline?: boolean\n /** Current UI language. */\n language: 'en' | 'ar'\n /**\n * Host-provided SSE runner. Must return an AbortController.\n * Signature mirrors sourceTestRunSSE from the bridge hooks.\n */\n onRunRequest: (\n slug: string,\n maxEnvelopes: number,\n callbacks: TestRunCallbacks,\n ) => AbortController\n}\n\nexport const TestRunPanel = ({\n slug,\n maxEnvelopes = 5,\n inline = false,\n language,\n onRunRequest,\n}: TestRunPanelProps) => {\n const isRTL = language === 'ar'\n\n const [runState, setRunState] = useState<RunState>('idle')\n const [steps, setSteps] = useState<TestRunStep[]>([])\n const [complete, setComplete] = useState<TestRunCompletePayload | null>(null)\n const [errorMsg, setErrorMsg] = useState<string | null>(null)\n const [savedExpanded, setSavedExpanded] = useState(true)\n\n const abortRef = useRef<AbortController | null>(null)\n\n const handleStart = useCallback(() => {\n setSteps([])\n setComplete(null)\n setErrorMsg(null)\n setSavedExpanded(true)\n setRunState('running')\n\n abortRef.current = onRunRequest(slug, maxEnvelopes, {\n onStep: (step) => setSteps((prev) => [...prev, step]),\n onComplete: (payload) => { setComplete(payload); setRunState('done') },\n onError: (err) => { setErrorMsg(err.error); setRunState('error') },\n })\n }, [slug, maxEnvelopes, onRunRequest])\n\n const handleStop = useCallback(() => {\n abortRef.current?.abort()\n setRunState('idle')\n }, [])\n\n const isRunning = runState === 'running'\n\n const content = (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n {isRunning ? (\n <Button variant=\"destructive\" size=\"sm\" onClick={handleStop} className=\"gap-1.5\">\n <Square className=\"h-3.5 w-3.5\" />\n {isRTL ? 'إيقاف' : 'Stop'}\n </Button>\n ) : (\n <Button size=\"sm\" onClick={handleStart} className=\"gap-1.5\">\n <Play className=\"h-3.5 w-3.5\" />\n {isRTL ? 'تشغيل اختباري' : 'Test run'}\n </Button>\n )}\n\n {isRunning && (\n <span className=\"flex items-center gap-1.5 text-xs text-muted-foreground\">\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" aria-hidden />\n {isRTL ? 'جارٍ التشغيل…' : 'Running…'}\n </span>\n )}\n\n {runState === 'done' && complete && (\n <span className=\"text-xs text-emerald-600 dark:text-emerald-400 font-medium\">\n {isRTL\n ? `تمّ حفظ ${complete.envelopes_saved} مغلّف`\n : `${complete.envelopes_saved} envelope${complete.envelopes_saved !== 1 ? 's' : ''} saved`}\n </span>\n )}\n\n {runState === 'error' && (\n <span className=\"text-xs text-destructive font-medium\">\n {isRTL ? 'فشل التشغيل' : 'Run failed'}\n </span>\n )}\n </div>\n\n {steps.length > 0 && (\n <div className=\"rounded-md border bg-muted/30 px-4 divide-y divide-border/50\">\n {steps.map((step, i) => (\n <StepRow key={`${step.name}-${i}`} step={step} isRTL={isRTL} />\n ))}\n </div>\n )}\n\n {runState === 'error' && errorMsg && (\n <div className=\"flex items-center gap-2 rounded-md border border-destructive/40 bg-destructive/10 px-4 py-3 text-sm text-destructive\">\n <XCircle className=\"h-4 w-4 shrink-0\" aria-hidden />\n <span>{errorMsg}</span>\n </div>\n )}\n\n {runState === 'done' && complete && (\n <div className=\"rounded-md border\">\n <button\n type=\"button\"\n onClick={() => setSavedExpanded((v) => !v)}\n className=\"flex w-full items-center justify-between px-4 py-2.5 text-sm font-medium hover:bg-muted/40 transition-colors duration-fast ease-standard\"\n >\n <span className=\"flex items-center gap-2\">\n <CheckCircle2 className=\"h-4 w-4 text-emerald-500\" aria-hidden />\n {isRTL\n ? `المغلّفات المحفوظة (${complete.envelopes_saved})`\n : `Saved envelopes (${complete.envelopes_saved})`}\n </span>\n {savedExpanded\n ? <ChevronUp className=\"h-4 w-4 text-muted-foreground\" aria-hidden />\n : <ChevronDown className=\"h-4 w-4 text-muted-foreground\" aria-hidden />}\n </button>\n\n {savedExpanded && (\n <>\n <Separator />\n <div className=\"px-4 divide-y divide-border/50\">\n {complete.saved.length === 0 ? (\n <p className=\"py-3 text-sm text-muted-foreground\">\n {isRTL ? 'لا توجد مغلّفات' : 'No envelopes'}\n </p>\n ) : (\n complete.saved.map((item, i) => (\n <SavedItem\n key={(item.content_hash || item.envelope_id || item.url || '') + i}\n item={item}\n isRTL={isRTL}\n />\n ))\n )}\n </div>\n </>\n )}\n </div>\n )}\n </div>\n )\n\n if (inline) return content\n\n return (\n <Card>\n <CardHeader className=\"pb-3\">\n <CardTitle className=\"text-base flex items-center gap-2\">\n <Play className=\"h-4 w-4 text-muted-foreground\" aria-hidden />\n {isRTL ? 'تشغيل اختباري' : 'Test Run'}\n </CardTitle>\n </CardHeader>\n <CardContent>{content}</CardContent>\n </Card>\n )\n}\nTestRunPanel.displayName = 'TestRunPanel'\n\nexport default TestRunPanel\n","'use client'\n\n/**\n * PluginDetailLayout — tabbed [slug] layout with sub-sidebar tab navigation.\n *\n * ADAPTED from app/src/app/(app)/superadmin/plugins/[slug]/layout.tsx:\n * - Extracted from Next.js App Router layout into a pure React component\n * - @/components/ui/* → ../ui/*\n * - @/lib/utils → ../../lib/utils\n * - useLanguage hook → language prop\n * - usePluginDetail / usePipelinePlugins → removed; plugin identity via props\n * - recharts AreaChart → kept (recharts is in sentra-ui deps)\n * - resolveIcon → imported from ./icon-resolver\n *\n * Seams:\n * - tabs: PluginDetailTab[] — ordered list of available tabs\n * - activeTab: string — currently active tab key\n * - onTabChange(key): void — host handles routing\n * - children: React.ReactNode — content for the active tab\n * - plugin: PluginDetailIdentity — name, description, type, icon props\n * - activity?: PluginActivitySummary — last_active_at + activity_count + series\n * - language: 'en' | 'ar'\n */\n\nimport { useMemo } from 'react'\nimport { CircleDot } from 'lucide-react'\nimport { Area, AreaChart, ResponsiveContainer } from 'recharts'\nimport { Badge } from '../ui/badge'\nimport { Skeleton } from '../ui/skeleton'\nimport { cn } from '../../lib/utils'\nimport { resolveIcon } from './icon-resolver'\nimport type { PluginDetailTab } from './types'\n\n// ── Shared vocabulary ─────────────────────────────────────────────────────────\n\nconst TYPE_LABELS: Record<string, { en: string; ar: string }> = {\n capability: { en: 'Capability', ar: 'قدرة' },\n source: { en: 'Source', ar: 'مصدر' },\n ai_provider: { en: 'AI Provider', ar: 'مزوّد ذكاء' },\n adk_artifact: { en: 'AI', ar: 'ذكاء اصطناعي' },\n pipeline: { en: 'Pipeline', ar: 'خطّ معالجة' },\n enrichment: { en: 'Enrichment', ar: 'إثراء' },\n copilot: { en: 'Copilot', ar: 'مساعد' },\n 'system-base': { en: 'System', ar: 'نظام' },\n adk_tool: { en: 'ADK Tool', ar: 'أداة ADK' },\n core: { en: 'Core', ar: 'الأساس' },\n}\n\nconst DEFAULT_COLOR = '#64748b'\n\nconst formatCount = (n: number | null | undefined): string => {\n if (n == null) return '0'\n if (n < 1000) return String(n)\n if (n < 1_000_000) return `${(n / 1000).toFixed(n < 10_000 ? 1 : 0)}K`\n if (n < 1_000_000_000) return `${(n / 1_000_000).toFixed(n < 10_000_000 ? 1 : 0)}M`\n return `${(n / 1_000_000_000).toFixed(1)}B`\n}\n\nconst countLabel = (pluginType: string, isRTL: boolean): string => {\n switch (pluginType) {\n case 'source': return isRTL ? 'مغلّفات' : 'envelopes'\n case 'ai_provider': return isRTL ? 'رموز' : 'tokens'\n case 'adk_artifact': case 'adk_tool': return isRTL ? 'استدعاءات' : 'invocations'\n case 'pipeline': case 'enrichment': return isRTL ? 'مهام نشطة' : 'active jobs'\n case 'core': return isRTL ? 'حالة' : 'status'\n default: return isRTL ? 'سجلات' : 'records'\n }\n}\n\nconst formatRelative = (iso: string | null | undefined, isRTL: boolean): string => {\n if (!iso) return isRTL ? 'لا نشاط' : 'No activity'\n const t = Date.parse(iso)\n if (Number.isNaN(t)) return isRTL ? 'لا نشاط' : 'No activity'\n const diffSec = Math.max(0, Math.round((Date.now() - t) / 1000))\n if (diffSec < 60) return isRTL ? 'قبل ثوانٍ' : 'just now'\n const m = Math.round(diffSec / 60)\n if (m < 60) return isRTL ? `قبل ${m} د` : `${m}m ago`\n const h = Math.round(diffSec / 3600)\n if (h < 48) return isRTL ? `قبل ${h} س` : `${h}h ago`\n const d = Math.round(diffSec / 86400)\n if (d < 30) return isRTL ? `قبل ${d} يوم` : `${d}d ago`\n const mo = Math.round(d / 30)\n if (mo < 12) return isRTL ? `قبل ${mo} شهر` : `${mo}mo ago`\n const y = Math.round(d / 365)\n return isRTL ? `قبل ${y} سنة` : `${y}y ago`\n}\n\ntype ActivityState = 'green' | 'yellow' | 'red'\n\nconst activityState = (iso: string | null | undefined): ActivityState => {\n if (!iso) return 'red'\n const t = Date.parse(iso)\n if (Number.isNaN(t)) return 'red'\n const ageMin = (Date.now() - t) / 60000\n if (ageMin <= 60) return 'green'\n if (ageMin <= 60 * 24) return 'yellow'\n return 'red'\n}\n\nconst STATE_CLASSES: Record<ActivityState, { chip: string; dot: string }> = {\n green: { chip: 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border-emerald-500/30', dot: 'bg-emerald-500' },\n yellow: { chip: 'bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/30', dot: 'bg-amber-500' },\n red: { chip: 'bg-red-500/10 text-red-600 dark:text-red-400 border-red-500/30', dot: 'bg-red-500' },\n}\n\n// ── Public types ──────────────────────────────────────────────────────────────\n\nexport interface PluginDetailIdentity {\n slug?: string | null\n name?: string | null\n name_en?: string | null\n name_ar?: string | null\n description?: string | null\n description_en?: string | null\n description_ar?: string | null\n plugin_type?: string | null\n version?: string | null\n nav_icon?: string | null\n nav_color?: string | null\n enabled_globally?: boolean | null\n}\n\nexport interface PluginActivitySummary {\n last_active_at?: string | null\n activity_count?: number | null\n activity_series?: { n: number }[]\n}\n\nexport interface PluginDetailLayoutProps {\n /** Ordered tab list. */\n tabs: PluginDetailTab[]\n /** Currently active tab key. */\n activeTab: string\n /** Called when the operator clicks a tab. */\n onTabChange: (key: string) => void\n /** Content for the active tab. */\n children: React.ReactNode\n /** Plugin identity for the hero. */\n plugin: PluginDetailIdentity\n /** Optional activity data for the sparkline analytics block. */\n activity?: PluginActivitySummary\n /** Whether identity data is still loading. */\n isLoading?: boolean\n /** Whether identity fetch errored. */\n isError?: boolean\n /** Current UI language. */\n language: 'en' | 'ar'\n}\n\n// ── PluginHeroSkeleton ────────────────────────────────────────────────────────\n\nconst PluginHeroSkeleton = () => (\n <div className=\"w-full border-b border-border bg-card px-6 py-6\">\n <div className=\"flex items-center gap-5\">\n <Skeleton className=\"h-20 w-20 rounded-xl\" />\n <div className=\"flex-1 space-y-3\">\n <Skeleton className=\"h-6 w-64\" />\n <Skeleton className=\"h-4 w-96\" />\n <Skeleton className=\"h-4 w-40\" />\n </div>\n <Skeleton className=\"h-20 w-48 rounded-lg\" />\n </div>\n </div>\n)\nPluginHeroSkeleton.displayName = 'PluginHeroSkeleton'\n\n// ── PluginHero ────────────────────────────────────────────────────────────────\n\ninterface PluginHeroProps {\n plugin: PluginDetailIdentity\n activity?: PluginActivitySummary\n isRTL: boolean\n}\n\nconst PluginHero = ({ plugin, activity, isRTL }: PluginHeroProps) => {\n const name =\n (isRTL ? plugin.name_ar : plugin.name_en) ||\n plugin.name_en ||\n plugin.name ||\n plugin.slug ||\n ''\n const description =\n (isRTL ? plugin.description_ar : plugin.description_en) ||\n plugin.description_en ||\n plugin.description ||\n ''\n const typeKey = String(plugin.plugin_type ?? '')\n const typeLabel = TYPE_LABELS[typeKey] ?? { en: typeKey || 'Plugin', ar: typeKey || 'إضافة' }\n const color = plugin.nav_color || DEFAULT_COLOR\n const { Component: Icon } = resolveIcon(plugin.nav_icon)\n const enabled = plugin.enabled_globally !== false\n\n const lastActiveISO = activity?.last_active_at ?? null\n const state = activityState(lastActiveISO)\n const stateClasses = STATE_CLASSES[state]\n const activityCount = activity?.activity_count ?? 0\n\n const seriesData = useMemo(() => {\n const series = activity?.activity_series ?? []\n if (series.length === 0) return Array.from({ length: 24 }, () => ({ n: 0 }))\n return series.map((b) => ({ n: b.n }))\n }, [activity?.activity_series])\n const hasSeriesData = seriesData.some((d) => d.n > 0)\n const gradId = `herospark-${plugin.slug ?? 'plugin'}`\n\n return (\n <header className=\"w-full border-b border-border bg-card px-6 py-6\">\n <div className=\"flex flex-col lg:flex-row lg:items-stretch gap-6\">\n {/* Identity block */}\n <div className=\"flex items-start gap-5 flex-1 min-w-0\">\n <div\n className=\"flex h-20 w-20 flex-none items-center justify-center rounded-xl text-white shadow-sm\"\n style={{ backgroundColor: color }}\n aria-hidden=\"true\"\n >\n <Icon className=\"h-9 w-9\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n <h1 className=\"text-2xl font-semibold text-foreground leading-none\">{name}</h1>\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 px-2 py-0.5 rounded-full text-xs font-medium border',\n stateClasses.chip,\n )}\n title={lastActiveISO ?? (isRTL ? 'لا نشاط' : 'No activity')}\n >\n <span className={cn('h-2 w-2 rounded-full flex-none', stateClasses.dot)} />\n {formatRelative(lastActiveISO, isRTL)}\n </span>\n </div>\n\n {description && (\n <p className=\"mt-2.5 text-sm text-muted-foreground max-w-3xl\">{description}</p>\n )}\n\n <div className=\"mt-3 flex items-center gap-2 flex-wrap\">\n <Badge variant=\"secondary\" className=\"text-[10px] uppercase tracking-wide\">\n {isRTL ? typeLabel.ar : typeLabel.en}\n </Badge>\n {plugin.slug && (\n <Badge variant=\"outline\" className=\"text-[10px] font-mono\">{plugin.slug}</Badge>\n )}\n {plugin.version && (\n <Badge variant=\"outline\" className=\"text-[10px] font-mono\">v{plugin.version}</Badge>\n )}\n <span\n className={cn(\n 'inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-[10px] font-medium',\n enabled\n ? 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400'\n : 'bg-muted text-muted-foreground',\n )}\n >\n <CircleDot className=\"h-3 w-3 opacity-70\" />\n {enabled ? (isRTL ? 'مفعّل' : 'Enabled') : (isRTL ? 'معطّل' : 'Disabled')}\n </span>\n </div>\n </div>\n </div>\n\n {/* Analytics block */}\n <div className=\"flex-none w-full lg:w-72 rounded-lg border border-border/70 bg-muted/20 overflow-hidden\">\n <div className=\"px-4 pt-3 pb-1\">\n <div className=\"text-[10px] uppercase tracking-wider text-muted-foreground\">\n {countLabel(typeKey, isRTL)}\n </div>\n <div className=\"text-3xl font-semibold text-foreground leading-tight\" title={String(activityCount)}>\n {formatCount(activityCount)}\n </div>\n </div>\n <div className=\"h-16 w-full\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={seriesData} margin={{ top: 4, right: 0, bottom: 0, left: 0 }}>\n <defs>\n <linearGradient id={gradId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity={hasSeriesData ? 0.45 : 0.12} />\n <stop offset=\"100%\" stopColor={color} stopOpacity={0} />\n </linearGradient>\n </defs>\n <Area\n type=\"monotone\"\n dataKey=\"n\"\n stroke={color}\n strokeWidth={1.5}\n strokeOpacity={hasSeriesData ? 1 : 0.35}\n fill={`url(#${gradId})`}\n isAnimationActive={false}\n dot={false}\n />\n </AreaChart>\n </ResponsiveContainer>\n </div>\n </div>\n </div>\n </header>\n )\n}\nPluginHero.displayName = 'PluginHero'\n\n// Re-exported so PluginDetailShell (AdminLayout-based plugin detail) can reuse\n// the same hero + skeleton without duplicating them.\nexport { PluginHero, PluginHeroSkeleton }\n\n// ── Sub-sidebar tab nav ───────────────────────────────────────────────────────\n\ninterface SubSidebarProps {\n tabs: PluginDetailTab[]\n activeTab: string\n onTabChange: (key: string) => void\n isRTL: boolean\n}\n\nconst SubSidebar = ({ tabs, activeTab, onTabChange, isRTL }: SubSidebarProps) => {\n const renderTab = (tab: PluginDetailTab) => {\n const Icon = tab.icon\n const label = isRTL ? tab.label_ar : tab.label_en\n const isActive = activeTab === tab.key\n return (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => onTabChange(tab.key)}\n className={cn(\n 'flex items-center gap-2.5 rounded-md px-3 py-2 text-sm transition-colors duration-fast ease-standard text-start w-full',\n isActive\n ? 'bg-accent text-accent-foreground font-medium'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground',\n )}\n aria-current={isActive ? 'page' : undefined}\n >\n {Icon && <Icon className=\"h-4 w-4 shrink-0\" aria-hidden />}\n <span className=\"truncate\">{label}</span>\n </button>\n )\n }\n\n // Group tabs by section (section_en), preserving first-appearance order.\n // Tabs without a section land in a leading unlabelled group (key '').\n const order: string[] = []\n const groups = new Map<string, PluginDetailTab[]>()\n for (const tab of tabs) {\n const key = tab.section_en ?? ''\n if (!groups.has(key)) {\n groups.set(key, [])\n order.push(key)\n }\n groups.get(key)!.push(tab)\n }\n const hasSections = tabs.some((t) => t.section_en)\n\n return (\n <nav\n aria-label={isRTL ? 'تنقل التبويبات الفرعية' : 'Plugin detail sub-navigation'}\n className=\"flex flex-col gap-4 p-3\"\n >\n {order.map((sectionKey) => {\n const sectionTabs = groups.get(sectionKey)!\n const header = sectionKey\n ? isRTL\n ? sectionTabs[0].section_ar || sectionKey\n : sectionKey\n : null\n return (\n <div key={sectionKey || '_'} className=\"flex flex-col gap-0.5\">\n {hasSections && header && (\n <p\n className={cn(\n 'px-3 mb-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/60',\n isRTL ? 'text-right' : 'text-left',\n )}\n >\n {header}\n </p>\n )}\n {sectionTabs.map(renderTab)}\n </div>\n )\n })}\n </nav>\n )\n}\nSubSidebar.displayName = 'SubSidebar'\n\n// ── PluginDetailLayout (root) ─────────────────────────────────────────────────\n\nexport const PluginDetailLayout = ({\n tabs,\n activeTab,\n onTabChange,\n children,\n plugin,\n activity,\n isLoading = false,\n isError = false,\n language,\n}: PluginDetailLayoutProps) => {\n const isRTL = language === 'ar'\n\n return (\n // Two-sidebar plugin detail rendered INSIDE the product's AdminLayout content\n // (operator 2026-06-05: keep the dashboard menu; plugin tabs are a SECOND\n // sub-sidebar next to it). Full-bleed: cancel AdminLayout's <main> padding\n // (p-3 sm:p-4 md:p-6) with matching negative margins so the sub-sidebar sits\n // flush against the dashboard sidebar and the content has no outer gap.\n // NOTE: no min-h-screen / no sticky here — those fight AdminLayout's own\n // scrolling <main> and broke the layout. The hero scrolls with the content.\n // Reference layout (mofa-dev /superadmin/plugins/<slug>): a single flex ROW\n // — the plugin sub-sidebar sits flush at the TOP next to the dashboard\n // sidebar (full height), and the content column (hero + tab content stacked)\n // is beside it. NOT hero-on-top-spanning-both. Full-bleed: cancel\n // AdminLayout's <main> padding so the sub-sidebar borders the dashboard nav.\n <div\n // -m-* cancels AdminLayout <main>'s p-3 sm:p-4 md:p-6 on ALL sides (incl.\n // the RTL left side — margins are physical, so -m-* hits both edges\n // symmetrically regardless of dir). min-h-full makes this fill <main>'s\n // height so items-stretch gives the sub-sidebar FULL height. h-full +\n // overflow-hidden keeps the row bounded; the content column scrolls.\n className=\"flex items-stretch min-h-full h-full -m-3 sm:-m-4 md:-m-6\"\n dir={isRTL ? 'rtl' : 'ltr'}\n >\n {/* ── Plugin sub-sidebar (desktop) — full-height, flush beside the\n dashboard sidebar, grouped sections like the reference. ── */}\n <aside className=\"hidden md:flex flex-col w-56 shrink-0 self-stretch border-e border-border bg-card overflow-y-auto\">\n <SubSidebar\n tabs={tabs}\n activeTab={activeTab}\n onTabChange={onTabChange}\n isRTL={isRTL}\n />\n </aside>\n\n {/* ── Content column: mobile tab bar + hero + tab content (scrolls\n independently so the sub-sidebar stays full-height + fixed). ── */}\n <div className=\"flex-1 min-w-0 flex flex-col overflow-y-auto\">\n {/* Mobile tab bar (horizontal scrollable) */}\n <div className=\"md:hidden w-full border-b border-border bg-card px-3 py-2 overflow-x-auto\">\n <div className=\"flex gap-1 min-w-max\">\n {tabs.map((tab) => {\n const Icon = tab.icon\n const label = isRTL ? tab.label_ar : tab.label_en\n const isActive = activeTab === tab.key\n return (\n <button\n key={tab.key}\n type=\"button\"\n onClick={() => onTabChange(tab.key)}\n className={cn(\n 'flex items-center gap-1.5 rounded-md px-3 py-1.5 text-xs transition-colors duration-fast ease-standard whitespace-nowrap',\n isActive\n ? 'bg-accent text-accent-foreground font-medium'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground',\n )}\n aria-current={isActive ? 'page' : undefined}\n >\n {Icon && <Icon className=\"h-3.5 w-3.5 shrink-0\" aria-hidden />}\n {label}\n </button>\n )\n })}\n </div>\n </div>\n\n {/* Hero */}\n {isLoading && <PluginHeroSkeleton />}\n {isError && (\n <div className=\"rounded-lg border border-destructive/30 bg-destructive/5 p-4 m-6 text-sm text-destructive\">\n {isRTL ? 'تعذّر تحميل الإضافة.' : 'Failed to load this plugin.'}\n </div>\n )}\n {!isLoading && !isError && (\n <PluginHero plugin={plugin} activity={activity} isRTL={isRTL} />\n )}\n\n {/* Tab content */}\n <main className=\"flex-1 min-w-0 p-3 sm:p-4 md:p-6\">{children}</main>\n </div>\n </div>\n )\n}\n\nPluginDetailLayout.displayName = 'PluginDetailLayout'\n\nexport default PluginDetailLayout\n","\"use client\";\n\nimport * as React from \"react\";\nimport { ListTree, GitBranch, Pencil, ArrowRight } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport { WorkflowStepNode } from \"./WorkflowStepNode\";\nimport { NestedStepsEditor } from \"./NestedStepsEditor\";\n\nexport type WorkflowView = \"steps\" | \"pipeline\" | \"editor\";\n\nexport interface WorkflowStepLike {\n kind?: string;\n then?: WorkflowStepLike[];\n else?: WorkflowStepLike[];\n steps?: WorkflowStepLike[];\n [key: string]: unknown;\n}\n\nexport interface WorkflowProps {\n /** The workflow as a nested step tree — the single source of truth for every view. */\n steps: WorkflowStepLike[];\n /** Controlled active view. */\n view?: WorkflowView;\n /** Initial view when uncontrolled. Default \"steps\". */\n defaultView?: WorkflowView;\n onViewChange?: (view: WorkflowView) => void;\n language?: \"en\" | \"ar\";\n /** Plain-language step descriptions (default true). */\n humanize?: boolean;\n /** Enables the Editor view; called when the editor mutates the tree. */\n onChange?: (steps: WorkflowStepLike[]) => void;\n onEditStep?: (step: WorkflowStepLike) => void;\n className?: string;\n}\n\nconst LABELS = {\n en: { steps: \"Steps\", pipeline: \"Pipeline\", editor: \"Editor\", empty: \"No steps yet.\" },\n ar: { steps: \"الخطوات\", pipeline: \"المسار\", editor: \"محرّر\", empty: \"لا توجد خطوات بعد.\" },\n};\n\nconst VIEW_ICON: Record<WorkflowView, React.ElementType> = {\n steps: ListTree,\n pipeline: GitBranch,\n editor: Pencil,\n};\n\n/** Workflow — the unified workflow component. One nested-step model rendered three ways,\n * switchable via the header toggle:\n * • Steps — human-readable vertical step tree (default)\n * • Pipeline — the same steps as a horizontal flow\n * • Editor — multi-level drag-and-drop editor with per-step options (enabled when onChange is set)\n * Pipeline + Editor are derived from the same `steps`, so all three views show one workflow. */\nexport function Workflow({\n steps, view, defaultView = \"steps\", onViewChange, language = \"en\",\n humanize = true, onChange, onEditStep, className,\n}: WorkflowProps) {\n const isRTL = language === \"ar\";\n const t = LABELS[language];\n const [internal, setInternal] = React.useState<WorkflowView>(defaultView);\n const active = view ?? internal;\n const setView = (v: WorkflowView) => { setInternal(v); onViewChange?.(v); };\n\n const views: WorkflowView[] = onChange ? [\"steps\", \"pipeline\", \"editor\"] : [\"steps\", \"pipeline\"];\n\n return (\n <div dir={isRTL ? \"rtl\" : \"ltr\"} className={cn(\"flex flex-col gap-3\", className)}>\n {/* View toggle */}\n <div className=\"inline-flex w-fit items-center gap-1 self-start rounded-lg border border-border bg-card p-1\">\n {views.map((v) => {\n const Icon = VIEW_ICON[v];\n return (\n <Button\n key={v}\n type=\"button\"\n size=\"sm\"\n variant={active === v ? \"secondary\" : \"ghost\"}\n className=\"h-7 gap-1.5 px-2.5\"\n aria-pressed={active === v}\n onClick={() => setView(v)}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n {t[v]}\n </Button>\n );\n })}\n </div>\n\n {/* Body */}\n {steps.length === 0 ? (\n <p className=\"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground\">{t.empty}</p>\n ) : active === \"editor\" && onChange ? (\n <NestedStepsEditor\n steps={steps as never}\n language={language}\n onChange={(s) => onChange(s as WorkflowStepLike[])}\n onEditStep={onEditStep as never}\n />\n ) : active === \"pipeline\" ? (\n <div className=\"flex items-stretch gap-2 overflow-x-auto pb-2\">\n {steps.map((step, i) => (\n <React.Fragment key={i}>\n {i > 0 && (\n <div className=\"flex shrink-0 items-center text-muted-foreground\">\n <ArrowRight className=\"h-4 w-4 rtl:rotate-180\" />\n </div>\n )}\n <div className=\"w-72 shrink-0\">\n <WorkflowStepNode step={step as never} path={[i]} depth={0} isRTL={isRTL} humanize={humanize} />\n </div>\n </React.Fragment>\n ))}\n </div>\n ) : (\n <div className=\"space-y-2\">\n {steps.map((step, i) => (\n <WorkflowStepNode key={i} step={step as never} path={[i]} depth={0} isRTL={isRTL} humanize={humanize} />\n ))}\n </div>\n )}\n </div>\n );\n}\n","'use client'\n/**\n * LogsView — presentational per-product log viewer\n *\n * Rule 25: purely presentational; NO data fetching, NO context reads,\n * NO product-specific imports. All data arrives as props.\n * Rule 16: semantic tokens only (no hex), logical CSS properties (ms/me/ps/pe).\n * Rule 8: all chrome strings bilingual via `language` prop.\n * Rule 7: displayName set; event handlers prefixed `handle*`.\n */\n\nimport React, { useState, useCallback } from 'react'\nimport { ChevronDown, ChevronRight, RefreshCw, Search, X } from 'lucide-react'\n\nimport { cn, formatRelativeTime } from '../../lib/utils'\nimport { useDebounce } from '../../hooks/useDebounce'\nimport { useInfiniteScroll } from '../../hooks/useInfiniteScroll'\n\nimport { Badge } from '../ui/badge'\nimport { Button } from '../ui/button'\nimport { Input } from '../ui/input'\nimport { Skeleton } from '../ui/skeleton'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../ui/select'\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../ui/table'\nimport { Switch } from '../ui/switch'\nimport { ScrollArea } from '../ui/scroll-area'\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../ui/collapsible'\n\nimport type { LogLevel, LogsFilter, LogsViewProps, ServiceLogRow } from './types'\n\n// ─── i18n labels ──────────────────────────────────────────────────────────────\n\nconst LABELS = {\n en: {\n level: 'Level',\n service: 'Service',\n component: 'Component',\n search: 'Search messages…',\n since: 'Since',\n until: 'Until',\n allLevels: 'All levels',\n allServices: 'All services',\n allComponents: 'All components',\n liveTail: 'Live',\n loadMore: 'Load more',\n noLogs: 'No log entries found.',\n noLogsHint: 'Try adjusting the filters or time range.',\n loading: 'Loading logs…',\n traceId: 'Trace ID',\n requestId: 'Request ID',\n userId: 'User ID',\n attrs: 'Attributes',\n clear: 'Clear',\n filterBy: 'Filter by level',\n },\n ar: {\n level: 'المستوى',\n service: 'الخدمة',\n component: 'المكوّن',\n search: 'بحث في الرسائل…',\n since: 'منذ',\n until: 'حتى',\n allLevels: 'جميع المستويات',\n allServices: 'جميع الخدمات',\n allComponents: 'جميع المكونات',\n liveTail: 'مباشر',\n loadMore: 'تحميل المزيد',\n noLogs: 'لا توجد سجلات.',\n noLogsHint: 'حاول ضبط الفلاتر أو النطاق الزمني.',\n loading: 'جارٍ تحميل السجلات…',\n traceId: 'معرف التتبع',\n requestId: 'معرف الطلب',\n userId: 'معرف المستخدم',\n attrs: 'الخصائص',\n clear: 'مسح',\n filterBy: 'تصفية حسب المستوى',\n },\n} as const\n\n// ─── Level badge ──────────────────────────────────────────────────────────────\n\nconst LEVEL_CLASSES: Record<LogLevel, string> = {\n error: 'bg-destructive/15 text-destructive border-destructive/30',\n warn: 'bg-alert-amber/15 text-alert-amber border-alert-amber/30',\n info: 'bg-info/15 text-info border-info/30',\n debug: 'bg-muted text-muted-foreground border-border',\n}\n\nconst LevelBadge = ({ level }: { level: LogLevel }) => (\n <Badge\n className={cn(\n 'font-mono text-[10px] uppercase tracking-wide border',\n LEVEL_CLASSES[level] ?? LEVEL_CLASSES.debug,\n )}\n >\n {level}\n </Badge>\n)\nLevelBadge.displayName = 'LevelBadge'\n\n// ─── Level multiselect (toggle buttons) ───────────────────────────────────────\n\nconst ALL_LEVELS: LogLevel[] = ['error', 'warn', 'info', 'debug']\n\ninterface LevelFilterProps {\n selected: string[]\n onChange: (levels: string[]) => void\n ariaLabel: string\n}\n\nconst LevelFilter = ({ selected, onChange, ariaLabel }: LevelFilterProps) => {\n const handleToggle = useCallback(\n (level: LogLevel) => {\n if (selected.includes(level)) {\n onChange(selected.filter((l) => l !== level))\n } else {\n onChange([...selected, level])\n }\n },\n [selected, onChange],\n )\n\n return (\n <div className=\"flex flex-wrap gap-1.5\" role=\"group\" aria-label={ariaLabel}>\n {ALL_LEVELS.map((level) => {\n const active = selected.length === 0 || selected.includes(level)\n return (\n <button\n key={level}\n type=\"button\"\n onClick={() => handleToggle(level)}\n aria-pressed={selected.includes(level)}\n className={cn(\n 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold',\n 'transition-opacity duration-fast ease-standard cursor-pointer',\n LEVEL_CLASSES[level],\n !active && 'opacity-30',\n )}\n >\n {level}\n </button>\n )\n })}\n </div>\n )\n}\nLevelFilter.displayName = 'LevelFilter'\n\n// ─── Expanded row detail ───────────────────────────────────────────────────────\n\ntype AnyLabels = (typeof LABELS)['en'] | (typeof LABELS)['ar']\n\ninterface ExpandedRowProps {\n row: ServiceLogRow\n labels: AnyLabels\n}\n\nconst ExpandedRow = ({ row, labels }: ExpandedRowProps) => {\n const meta = [\n row.traceId ? [labels.traceId, row.traceId] : null,\n row.requestId ? [labels.requestId, row.requestId] : null,\n row.userId ? [labels.userId, row.userId] : null,\n ].filter(Boolean) as [string, string][]\n\n const hasAttrs = row.attrs && Object.keys(row.attrs).length > 0\n\n return (\n <div className=\"px-4 py-3 bg-muted/30 rounded-b-md border-t border-border space-y-3 text-xs\">\n {/* Full message */}\n <p className=\"font-mono text-foreground break-all whitespace-pre-wrap leading-relaxed\">\n {row.msg}\n </p>\n\n {/* Trace / request / user metadata */}\n {meta.length > 0 && (\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5\">\n {meta.map(([key, val]) => (\n <React.Fragment key={key}>\n <dt className=\"text-muted-foreground font-medium\">{key}</dt>\n <dd className=\"font-mono text-foreground truncate\">{val}</dd>\n </React.Fragment>\n ))}\n </dl>\n )}\n\n {/* Attrs */}\n {hasAttrs && (\n <div>\n <p className=\"text-muted-foreground font-medium mb-1\">{labels.attrs}</p>\n <pre className=\"bg-card rounded p-2 overflow-x-auto text-foreground/80 border border-border leading-relaxed\">\n {JSON.stringify(row.attrs, null, 2)}\n </pre>\n </div>\n )}\n </div>\n )\n}\nExpandedRow.displayName = 'ExpandedRow'\n\n// ─── Loading skeleton ──────────────────────────────────────────────────────────\n\nconst LogsTableSkeleton = () => (\n <div className=\"space-y-2 p-4\">\n {Array.from({ length: 8 }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3\">\n <Skeleton className=\"h-5 w-14 rounded-full\" />\n <Skeleton className=\"h-4 w-20\" />\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-4 flex-1\" />\n </div>\n ))}\n </div>\n)\nLogsTableSkeleton.displayName = 'LogsTableSkeleton'\n\n// ─── Empty state ───────────────────────────────────────────────────────────────\n\nconst EmptyState = ({ label, hint }: { label: string; hint: string }) => (\n <div className=\"flex flex-col items-center justify-center py-16 gap-2 text-center\">\n <Search className=\"h-8 w-8 text-muted-foreground/40\" aria-hidden />\n <p className=\"text-sm font-medium text-muted-foreground\">{label}</p>\n <p className=\"text-xs text-muted-foreground/60\">{hint}</p>\n </div>\n)\nEmptyState.displayName = 'EmptyState'\n\n// ─── LogsView ─────────────────────────────────────────────────────────────────\n\nconst LogsView = ({\n logs,\n filters,\n onFilterChange,\n language,\n loading = false,\n onLoadMore,\n hasMore = false,\n services = [],\n components = [],\n liveTail = false,\n onToggleLiveTail,\n className,\n}: LogsViewProps) => {\n const t = LABELS[language]\n const isRtl = language === 'ar'\n\n // Expanded rows — keyed by row id\n const [expanded, setExpanded] = useState<Set<string>>(new Set())\n\n // Local search state — debounced before calling onFilterChange\n const [localQ, setLocalQ] = useState(filters.q ?? '')\n const debouncedQ = useDebounce(localQ, 300)\n\n // Sync debounced search value into parent filter\n const prevDebouncedQ = React.useRef(debouncedQ)\n React.useEffect(() => {\n if (debouncedQ !== prevDebouncedQ.current) {\n prevDebouncedQ.current = debouncedQ\n onFilterChange({ ...filters, q: debouncedQ || undefined })\n }\n }, [debouncedQ, filters, onFilterChange])\n\n // Infinite scroll sentinel\n const { sentinelRef } = useInfiniteScroll({\n onLoadMore: onLoadMore ?? (() => {}),\n hasMore: hasMore && !loading,\n isLoading: loading,\n })\n\n // ── event handlers ──────────────────────────────────────────────────────────\n\n const handleToggleRow = useCallback((id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }, [])\n\n const handleLevelChange = useCallback(\n (levels: string[]) => {\n onFilterChange({ ...filters, levels: levels.length ? levels : undefined })\n },\n [filters, onFilterChange],\n )\n\n const handleServiceChange = useCallback(\n (val: string) => {\n onFilterChange({ ...filters, service: val === '__all__' ? undefined : val })\n },\n [filters, onFilterChange],\n )\n\n const handleComponentChange = useCallback(\n (val: string) => {\n onFilterChange({ ...filters, component: val === '__all__' ? undefined : val })\n },\n [filters, onFilterChange],\n )\n\n const handleSinceChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onFilterChange({ ...filters, since: e.target.value || undefined })\n },\n [filters, onFilterChange],\n )\n\n const handleUntilChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n onFilterChange({ ...filters, until: e.target.value || undefined })\n },\n [filters, onFilterChange],\n )\n\n const handleSearchChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setLocalQ(e.target.value)\n }, [])\n\n const handleClearSearch = useCallback(() => {\n setLocalQ('')\n onFilterChange({ ...filters, q: undefined })\n }, [filters, onFilterChange])\n\n const handleToggleLiveTail = useCallback(() => {\n onToggleLiveTail?.(!liveTail)\n }, [liveTail, onToggleLiveTail])\n\n // ── render ──────────────────────────────────────────────────────────────────\n\n return (\n <div\n className={cn('flex flex-col gap-4', className)}\n dir={isRtl ? 'rtl' : 'ltr'}\n >\n {/* Filter bar */}\n <div className=\"flex flex-wrap items-center gap-3 rounded-lg border border-border bg-card px-4 py-3\">\n {/* Level multiselect */}\n <div className=\"flex flex-col gap-1 min-w-0\">\n <span className=\"text-xs text-muted-foreground font-medium\">{t.level}</span>\n <LevelFilter\n selected={filters.levels ?? []}\n onChange={handleLevelChange}\n ariaLabel={t.filterBy}\n />\n </div>\n\n <div className=\"h-8 w-px bg-border hidden sm:block\" aria-hidden />\n\n {/* Service dropdown */}\n {services.length > 0 && (\n <div className=\"flex flex-col gap-1 min-w-[130px]\">\n <span className=\"text-xs text-muted-foreground font-medium\">{t.service}</span>\n <Select\n value={filters.service ?? '__all__'}\n onValueChange={handleServiceChange}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder={t.allServices} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__all__\">{t.allServices}</SelectItem>\n {services.map((svc) => (\n <SelectItem key={svc} value={svc}>\n {svc}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* Component dropdown */}\n {components.length > 0 && (\n <div className=\"flex flex-col gap-1 min-w-[130px]\">\n <span className=\"text-xs text-muted-foreground font-medium\">{t.component}</span>\n <Select\n value={filters.component ?? '__all__'}\n onValueChange={handleComponentChange}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder={t.allComponents} />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"__all__\">{t.allComponents}</SelectItem>\n {components.map((c) => (\n <SelectItem key={c} value={c}>\n {c}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n )}\n\n {/* Time range */}\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-xs text-muted-foreground font-medium\">{t.since}</span>\n <Input\n type=\"datetime-local\"\n className=\"h-8 text-xs w-[160px]\"\n value={filters.since ?? ''}\n onChange={handleSinceChange}\n />\n </div>\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-xs text-muted-foreground font-medium\">{t.until}</span>\n <Input\n type=\"datetime-local\"\n className=\"h-8 text-xs w-[160px]\"\n value={filters.until ?? ''}\n onChange={handleUntilChange}\n />\n </div>\n\n {/* Search */}\n <div className=\"flex flex-col gap-1 flex-1 min-w-[160px]\">\n <span className=\"text-xs text-muted-foreground font-medium\">{t.search.replace('…', '')}</span>\n <div className=\"relative\">\n <Search className=\"absolute start-2 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground pointer-events-none\" aria-hidden />\n <Input\n className={cn('h-8 text-xs ps-7 pe-7', isRtl && 'text-end')}\n placeholder={t.search}\n value={localQ}\n onChange={handleSearchChange}\n aria-label={t.search}\n />\n {localQ && (\n <button\n type=\"button\"\n onClick={handleClearSearch}\n className=\"absolute end-2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard\"\n aria-label={t.clear}\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Live tail toggle */}\n {onToggleLiveTail && (\n <div className=\"flex items-center gap-2 ms-auto\">\n <RefreshCw\n className={cn(\n 'h-3.5 w-3.5 text-muted-foreground transition-transform duration-fast ease-standard',\n liveTail && 'animate-spin text-success',\n )}\n aria-hidden\n />\n <span className=\"text-xs text-muted-foreground font-medium\">{t.liveTail}</span>\n <Switch\n checked={liveTail}\n onCheckedChange={handleToggleLiveTail}\n aria-label={t.liveTail}\n className=\"data-[state=checked]:bg-success\"\n />\n </div>\n )}\n </div>\n\n {/* Table area */}\n <div className=\"rounded-lg border border-border bg-card overflow-hidden\">\n {loading && logs.length === 0 ? (\n <>\n <div className=\"px-4 py-2 text-xs text-muted-foreground border-b border-border\">\n {t.loading}\n </div>\n <LogsTableSkeleton />\n </>\n ) : logs.length === 0 ? (\n <EmptyState label={t.noLogs} hint={t.noLogsHint} />\n ) : (\n <ScrollArea className=\"max-h-[65vh]\">\n <Table>\n <TableHeader>\n <TableRow className=\"hover:bg-transparent\">\n <TableHead className=\"w-6 ps-3\" />\n <TableHead className=\"w-[80px]\">{t.level}</TableHead>\n <TableHead className=\"w-[110px] text-muted-foreground font-medium\">\n {/* relative time column — no header label needed, context clear */}\n </TableHead>\n <TableHead className=\"w-[120px]\">{t.service}</TableHead>\n <TableHead className=\"w-[110px] hidden md:table-cell\">\n {t.component}\n </TableHead>\n <TableHead>{/* msg — takes remaining width */}</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {logs.map((row) => {\n const isOpen = expanded.has(row.id)\n const hasDetail =\n row.traceId ||\n row.requestId ||\n row.userId ||\n (row.attrs && Object.keys(row.attrs).length > 0)\n\n return (\n <React.Fragment key={row.id}>\n <TableRow\n className={cn(\n 'cursor-pointer transition-colors duration-fast ease-standard',\n isOpen && 'bg-muted/30',\n row.level === 'error' && 'bg-destructive/5 hover:bg-destructive/10',\n row.level === 'warn' && 'bg-alert-amber/5 hover:bg-alert-amber/10',\n )}\n onClick={() => handleToggleRow(row.id)}\n aria-expanded={isOpen}\n >\n {/* Expand chevron */}\n <TableCell className=\"ps-3 pe-0 w-6\">\n {hasDetail ? (\n isOpen ? (\n <ChevronDown className=\"h-3.5 w-3.5 text-muted-foreground\" aria-hidden />\n ) : (\n <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground rtl:rotate-180\" aria-hidden />\n )\n ) : null}\n </TableCell>\n\n {/* Level */}\n <TableCell className=\"pe-2\">\n <LevelBadge level={row.level} />\n </TableCell>\n\n {/* Relative time */}\n <TableCell className=\"text-xs text-muted-foreground whitespace-nowrap font-mono pe-2\">\n <time dateTime={row.ts} title={row.ts}>\n {formatRelativeTime(row.ts)}\n </time>\n </TableCell>\n\n {/* Service */}\n <TableCell className=\"text-xs font-medium text-foreground/80 pe-2 whitespace-nowrap\">\n {row.service}\n </TableCell>\n\n {/* Component */}\n <TableCell className=\"text-xs text-muted-foreground pe-2 whitespace-nowrap hidden md:table-cell\">\n {row.component ?? '—'}\n </TableCell>\n\n {/* Message */}\n <TableCell className=\"text-xs text-foreground max-w-0\">\n <p className=\"truncate\">{row.msg}</p>\n </TableCell>\n </TableRow>\n\n {/* Expanded detail row */}\n {isOpen && (\n <TableRow className=\"hover:bg-transparent\">\n <TableCell colSpan={6} className=\"p-0\">\n <ExpandedRow row={row} labels={t} />\n </TableCell>\n </TableRow>\n )}\n </React.Fragment>\n )\n })}\n </TableBody>\n </Table>\n\n {/* Infinite scroll sentinel */}\n {onLoadMore && (\n <div ref={sentinelRef} className=\"h-1\" aria-hidden />\n )}\n\n {/* Explicit load more button (fallback / accessibility) */}\n {hasMore && !loading && onLoadMore && (\n <div className=\"flex justify-center py-4\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onLoadMore}\n className=\"text-xs\"\n >\n {t.loadMore}\n </Button>\n </div>\n )}\n\n {/* Loading more indicator */}\n {loading && logs.length > 0 && (\n <div className=\"flex items-center justify-center gap-2 py-4\">\n <RefreshCw className=\"h-4 w-4 animate-spin text-muted-foreground\" aria-hidden />\n <span className=\"text-xs text-muted-foreground\">{t.loading}</span>\n </div>\n )}\n </ScrollArea>\n )}\n </div>\n </div>\n )\n}\nLogsView.displayName = 'LogsView'\n\nexport { LogsView }\n","import { useState, useEffect } from 'react'\n\n/**\n * useDebounce — delays state update until the value has been stable for `delay` ms.\n *\n * Ported from app/src/hooks/useDebounce.ts.\n * Used by ListPage consumers (search field debounce before query fire).\n */\nexport function useDebounce<T>(value: T, delay = 300): T {\n const [debounced, setDebounced] = useState(value)\n\n useEffect(() => {\n const timer = setTimeout(() => setDebounced(value), delay)\n return () => clearTimeout(timer)\n }, [value, delay])\n\n return debounced\n}\n","'use client'\n\n/**\n * useInfiniteScroll\n *\n * Attaches an IntersectionObserver to a sentinel element.\n * When the sentinel enters the viewport the `onLoadMore` callback fires —\n * but only when `hasMore` is true and `isLoading` is false.\n *\n * Ported from app/src/hooks/useInfiniteScroll.ts (sentra-intel/hub#66).\n * This is the shared primitive used by ListPage in sentra-ui.\n */\n\nimport { useEffect, useRef } from 'react'\n\ninterface UseInfiniteScrollOptions {\n onLoadMore: () => void\n hasMore: boolean\n isLoading: boolean\n threshold?: number\n}\n\nexport function useInfiniteScroll({\n onLoadMore,\n hasMore,\n isLoading,\n threshold = 0.1,\n}: UseInfiniteScrollOptions) {\n const sentinelRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const el = sentinelRef.current\n if (!el) return\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries[0].isIntersecting && hasMore && !isLoading) {\n onLoadMore()\n }\n },\n { threshold },\n )\n\n observer.observe(el)\n return () => observer.disconnect()\n }, [hasMore, isLoading, onLoadMore, threshold])\n\n return { sentinelRef }\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Search } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { Input } from \"../ui/input\";\nimport { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from \"../ui/select\";\nimport { StatusBadge } from \"../status/StatusBadge\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"../ui/avatar\";\nimport { STR, levelTone, relTime, type Lang } from \"./shared\";\nimport type { Issue, IssueLevel, ErrorFilter, IssueSort } from \"./types\";\n\nexport interface IssuesListProps {\n issues: Issue[];\n selectedId?: string | null;\n onSelectIssue?: (issue: Issue) => void;\n language?: Lang;\n filter?: ErrorFilter;\n onFilterChange?: (f: ErrorFilter) => void;\n sort?: IssueSort;\n onSortChange?: (s: IssueSort) => void;\n /** options for the environment dropdown */\n environments?: string[];\n className?: string;\n}\n\nconst LEVELS: IssueLevel[] = [\"fatal\", \"error\", \"warning\", \"info\", \"debug\"];\n\n/** Compact, RTL-safe inline bar sparkline for issue frequency. */\nfunction Spark({ values }: { values?: number[] }) {\n if (!values || values.length === 0) return <div className=\"h-7 w-20\" />;\n const max = Math.max(...values, 1);\n return (\n <div className=\"flex h-7 w-20 items-end gap-px\" aria-hidden>\n {values.map((v, i) => (\n <span key={i} className=\"flex-1 rounded-sm bg-muted-foreground/40\" style={{ height: `${Math.max(8, (v / max) * 100)}%` }} />\n ))}\n </div>\n );\n}\n\n/** IssuesList — the Sentry-style \"Issues\" view: a filter bar + a list of error\n * groups (level, title + culprit, frequency sparkline, events, users, assignee,\n * last-seen). Presentational; row click → onSelectIssue. RTL + bilingual. */\nexport function IssuesList({\n issues, selectedId, onSelectIssue, language = \"en\",\n filter = {}, onFilterChange, sort = \"lastSeen\", onSortChange, environments = [], className,\n}: IssuesListProps) {\n const t = STR[language];\n const dir = language === \"ar\" ? \"rtl\" : \"ltr\";\n const setFilter = (patch: Partial<ErrorFilter>) => onFilterChange?.({ ...filter, ...patch });\n\n return (\n <div dir={dir} className={cn(\"flex h-full flex-col\", className)}>\n {/* Filter bar */}\n <div className=\"flex flex-wrap items-center gap-2 border-b border-border p-3\">\n <div className=\"relative min-w-[180px] flex-1\">\n <Search className=\"pointer-events-none absolute top-1/2 size-4 -translate-y-1/2 text-muted-foreground ltr:left-2.5 rtl:right-2.5\" />\n <Input\n value={filter.q ?? \"\"}\n onChange={(e) => setFilter({ q: e.target.value })}\n placeholder={t.search}\n className=\"ltr:pl-8 rtl:pr-8\"\n />\n </div>\n <Select value={filter.levels?.[0] ?? \"all\"} onValueChange={(v) => setFilter({ levels: v === \"all\" ? undefined : [v as IssueLevel] })}>\n <SelectTrigger className=\"w-[130px]\"><SelectValue placeholder={t.allLevels} /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">{t.allLevels}</SelectItem>\n {LEVELS.map((l) => <SelectItem key={l} value={l} className=\"capitalize\">{l}</SelectItem>)}\n </SelectContent>\n </Select>\n {environments.length > 0 && (\n <Select value={filter.environment ?? \"all\"} onValueChange={(v) => setFilter({ environment: v === \"all\" ? undefined : v })}>\n <SelectTrigger className=\"w-[150px]\"><SelectValue placeholder={t.allEnvs} /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">{t.allEnvs}</SelectItem>\n {environments.map((e) => <SelectItem key={e} value={e}>{e}</SelectItem>)}\n </SelectContent>\n </Select>\n )}\n <Select value={sort} onValueChange={(v) => onSortChange?.(v as IssueSort)}>\n <SelectTrigger className=\"w-[140px]\"><SelectValue /></SelectTrigger>\n <SelectContent>\n <SelectItem value=\"lastSeen\">{t.sortLastSeen}</SelectItem>\n <SelectItem value=\"firstSeen\">{t.sortFirstSeen}</SelectItem>\n <SelectItem value=\"count\">{t.sortEvents}</SelectItem>\n <SelectItem value=\"userCount\">{t.sortUsers}</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {/* Column header (desktop) */}\n <div className=\"hidden items-center gap-3 border-b border-border bg-muted/30 px-4 py-2 text-xs font-medium uppercase tracking-wide text-muted-foreground md:flex\">\n <span className=\"flex-1\">{t.title}</span>\n <span className=\"w-20 text-center\">{t.events}</span>\n <span className=\"w-24 text-center\">{t.events} / {t.users}</span>\n <span className=\"w-24 text-end\">{t.lastSeen}</span>\n </div>\n\n {/* Rows */}\n <div className=\"min-h-0 flex-1 overflow-auto\">\n {issues.length === 0 ? (\n <div className=\"p-10 text-center text-sm text-muted-foreground\">{t.noIssues}</div>\n ) : (\n issues.map((iss) => {\n const active = iss.id === selectedId;\n const initial = (iss.assignee?.name || iss.assignee?.email || \"?\").charAt(0).toUpperCase();\n return (\n <button\n key={iss.id}\n onClick={() => onSelectIssue?.(iss)}\n className={cn(\n \"flex w-full items-center gap-3 border-b border-border/60 px-4 py-3 text-start transition hover:bg-muted/40\",\n active && \"bg-primary/5 ltr:border-s-2 ltr:border-s-primary rtl:border-e-2 rtl:border-e-primary\",\n )}\n >\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <StatusBadge tone={levelTone(iss.level)}><span className=\"uppercase\">{iss.level}</span></StatusBadge>\n <span className=\"truncate text-sm font-semibold\">{iss.title}</span>\n </div>\n {iss.culprit && <p className=\"mt-0.5 truncate font-mono text-xs text-muted-foreground\">{iss.culprit}</p>}\n <div className=\"mt-1 flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground\">\n {iss.environment && <span>{iss.environment}</span>}\n {iss.status && iss.status !== \"unresolved\" && (\n <span className=\"capitalize\">{iss.status === \"resolved\" ? t.resolved : t.ignored}</span>\n )}\n <span className=\"md:hidden\">{relTime(iss.lastSeen)}</span>\n </div>\n </div>\n <div className=\"hidden md:block\"><Spark values={iss.frequency} /></div>\n <div className=\"hidden w-20 text-center md:block\">\n <div className=\"text-sm font-semibold tabular-nums\">{iss.count.toLocaleString()}</div>\n <div className=\"text-[11px] text-muted-foreground\">{t.events}</div>\n </div>\n <div className=\"hidden w-24 text-center md:block\">\n <div className=\"text-sm font-semibold tabular-nums\">{(iss.userCount ?? 0).toLocaleString()}</div>\n <div className=\"text-[11px] text-muted-foreground\">{t.users}</div>\n </div>\n <div className=\"hidden w-24 items-center justify-end gap-2 md:flex\">\n <span className=\"text-xs text-muted-foreground\">{relTime(iss.lastSeen)}</span>\n {iss.assignee && (\n <Avatar className=\"size-6\">\n {iss.assignee.avatarUrl && <AvatarImage src={iss.assignee.avatarUrl} alt={initial} />}\n <AvatarFallback className=\"text-[10px]\">{initial}</AvatarFallback>\n </Avatar>\n )}\n </div>\n </button>\n );\n })\n )}\n </div>\n </div>\n );\n}\n","import { formatRelativeTime } from \"../../lib/utils\";\nimport type { IssueLevel } from \"./types\";\n\nexport type Lang = \"en\" | \"ar\";\n\n/** Map a Sentry-style level to a StatusBadge tone. */\nexport function levelTone(level: IssueLevel): \"danger\" | \"warning\" | \"info\" | \"neutral\" {\n switch (level) {\n case \"fatal\":\n case \"error\":\n return \"danger\";\n case \"warning\":\n return \"warning\";\n case \"info\":\n return \"info\";\n default:\n return \"neutral\";\n }\n}\n\nexport function relTime(iso: string): string {\n try {\n return formatRelativeTime(iso);\n } catch {\n return iso;\n }\n}\n\nexport const STR = {\n en: {\n issues: \"Issues\", search: \"Search errors…\", allLevels: \"All levels\", environment: \"Environment\",\n allEnvs: \"All environments\", range: \"Time range\", events: \"Events\", users: \"Users\",\n lastSeen: \"Last seen\", firstSeen: \"First seen\", assignee: \"Assignee\", noIssues: \"No errors 🎉\",\n resolve: \"Resolve\", ignore: \"Ignore\", resolved: \"Resolved\", ignored: \"Ignored\", unresolved: \"Unresolved\",\n stackTrace: \"Stack trace\", breadcrumbs: \"Breadcrumbs\", tags: \"Tags\", overview: \"Overview\",\n occurrences: \"Occurrences\", inApp: \"In app\", selectIssue: \"Select an issue to see details\",\n sortLastSeen: \"Last seen\", sortFirstSeen: \"First seen\", sortEvents: \"Events\", sortUsers: \"Users\",\n title: \"Error\", culprit: \"Location\",\n },\n ar: {\n issues: \"الأخطاء\", search: \"ابحث في الأخطاء…\", allLevels: \"كل المستويات\", environment: \"البيئة\",\n allEnvs: \"كل البيئات\", range: \"النطاق الزمني\", events: \"الأحداث\", users: \"المستخدمون\",\n lastSeen: \"آخر ظهور\", firstSeen: \"أول ظهور\", assignee: \"المُسنَد\", noIssues: \"لا أخطاء 🎉\",\n resolve: \"حلّ\", ignore: \"تجاهل\", resolved: \"مُحَل\", ignored: \"مُتجاهَل\", unresolved: \"غير مُحَل\",\n stackTrace: \"تتبّع المكدّس\", breadcrumbs: \"فتات التتبّع\", tags: \"الوسوم\", overview: \"نظرة عامة\",\n occurrences: \"مرات الحدوث\", inApp: \"داخل التطبيق\", selectIssue: \"اختر خطأً لعرض التفاصيل\",\n sortLastSeen: \"آخر ظهور\", sortFirstSeen: \"أول ظهور\", sortEvents: \"الأحداث\", sortUsers: \"المستخدمون\",\n title: \"الخطأ\", culprit: \"الموقع\",\n },\n} as const;\n","\"use client\";\n\nimport * as React from \"react\";\nimport { ChevronRight, CheckCircle2, BellOff } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport { Badge } from \"../ui/badge\";\nimport { StatusBadge } from \"../status/StatusBadge\";\nimport { Tabs, TabsList, TabsTrigger, TabsContent } from \"../ui/tabs\";\nimport { Collapsible, CollapsibleTrigger, CollapsibleContent } from \"../ui/collapsible\";\nimport { MiniBarChart } from \"../charts/MiniBarChart\";\nimport { STR, levelTone, relTime, type Lang } from \"./shared\";\nimport type { Issue, StackFrame, IssueBreadcrumb } from \"./types\";\n\nexport interface IssueDetailProps {\n issue: Issue;\n language?: Lang;\n onResolve?: (issue: Issue) => void;\n onIgnore?: (issue: Issue) => void;\n className?: string;\n}\n\nfunction Stat({ label, value }: { label: string; value: React.ReactNode }) {\n return (\n <div className=\"rounded-lg border border-border bg-card px-3 py-2\">\n <div className=\"text-[11px] uppercase tracking-wide text-muted-foreground\">{label}</div>\n <div className=\"text-sm font-semibold tabular-nums\">{value}</div>\n </div>\n );\n}\n\nfunction Frame({ frame }: { frame: StackFrame }) {\n const [open, setOpen] = React.useState(Boolean(frame.inApp && frame.context?.length));\n const loc = [frame.filename, frame.lineno].filter(Boolean).join(\":\") + (frame.colno ? `:${frame.colno}` : \"\");\n return (\n <Collapsible open={open} onOpenChange={setOpen} className={cn(\"border-b border-border/60\", !frame.inApp && \"opacity-70\")}>\n <CollapsibleTrigger className=\"flex w-full items-center gap-2 px-3 py-2 text-start hover:bg-muted/40\">\n <ChevronRight className={cn(\"size-3.5 shrink-0 text-muted-foreground transition-transform\", open && \"rotate-90\")} />\n <span className=\"truncate font-mono text-xs\">\n <span className=\"text-foreground\">{loc}</span>\n {frame.function && <span className=\"text-muted-foreground\"> in {frame.function}</span>}\n </span>\n {frame.inApp && <Badge className=\"ms-auto shrink-0 text-[10px]\">in app</Badge>}\n </CollapsibleTrigger>\n {frame.context && frame.context.length > 0 && (\n <CollapsibleContent>\n <pre className=\"overflow-auto bg-muted/30 px-3 py-2 font-mono text-xs leading-5\">\n {frame.context.map((c) => (\n <div key={c.line} className={cn(\"flex gap-3\", c.current && \"-mx-3 bg-destructive/10 px-3\")}>\n <span className=\"w-8 shrink-0 select-none text-end text-muted-foreground\">{c.line}</span>\n <span className={cn(c.current ? \"text-foreground\" : \"text-muted-foreground\")}>{c.text}</span>\n </div>\n ))}\n </pre>\n </CollapsibleContent>\n )}\n </Collapsible>\n );\n}\n\nfunction BreadcrumbRow({ b }: { b: IssueBreadcrumb }) {\n return (\n <div className=\"flex items-start gap-3 border-b border-border/60 px-3 py-2 text-xs\">\n <span className=\"w-16 shrink-0 font-mono text-muted-foreground\">{relTime(b.timestamp)}</span>\n {b.category && <Badge className=\"shrink-0 text-[10px]\">{b.category}</Badge>}\n <span className=\"min-w-0 flex-1 break-words text-foreground\">{b.message}</span>\n </div>\n );\n}\n\n/** IssueDetail — the error detail pane: title + culprit, level, resolve/ignore,\n * stats, a frequency chart, then tabbed Stack trace / Breadcrumbs / Tags. */\nexport function IssueDetail({ issue, language = \"en\", onResolve, onIgnore, className }: IssueDetailProps) {\n const t = STR[language];\n const dir = language === \"ar\" ? \"rtl\" : \"ltr\";\n const chart = (issue.frequency ?? []).map((value, i) => ({ label: String(i), value }));\n\n return (\n <div dir={dir} className={cn(\"flex h-full flex-col\", className)}>\n {/* Header */}\n <div className=\"border-b border-border p-4\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <StatusBadge tone={levelTone(issue.level)}><span className=\"uppercase\">{issue.level}</span></StatusBadge>\n <h2 className=\"truncate text-base font-semibold\">{issue.title}</h2>\n </div>\n {issue.culprit && <p className=\"mt-1 truncate font-mono text-xs text-muted-foreground\">{issue.culprit}</p>}\n </div>\n <div className=\"flex shrink-0 gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => onResolve?.(issue)}><CheckCircle2 className=\"size-4\" /> {t.resolve}</Button>\n <Button variant=\"ghost\" size=\"sm\" onClick={() => onIgnore?.(issue)}><BellOff className=\"size-4\" /> {t.ignore}</Button>\n </div>\n </div>\n <div className=\"mt-3 grid grid-cols-2 gap-2 sm:grid-cols-4\">\n <Stat label={t.events} value={issue.count.toLocaleString()} />\n <Stat label={t.users} value={(issue.userCount ?? 0).toLocaleString()} />\n <Stat label={t.firstSeen} value={relTime(issue.firstSeen)} />\n <Stat label={t.lastSeen} value={relTime(issue.lastSeen)} />\n </div>\n </div>\n\n <div className=\"min-h-0 flex-1 overflow-auto p-4\">\n {chart.length > 0 && (\n <div className=\"mb-4\">\n <div className=\"mb-2 text-xs font-medium uppercase tracking-wide text-muted-foreground\">{t.occurrences}</div>\n <MiniBarChart data={chart} height={120} />\n </div>\n )}\n\n <Tabs defaultValue=\"stack\">\n <TabsList>\n <TabsTrigger value=\"stack\">{t.stackTrace}</TabsTrigger>\n <TabsTrigger value=\"breadcrumbs\">{t.breadcrumbs}</TabsTrigger>\n <TabsTrigger value=\"tags\">{t.tags}</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"stack\">\n <div className=\"overflow-hidden rounded-lg border border-border\">\n {(issue.stack ?? []).length === 0\n ? <p className=\"p-4 text-sm text-muted-foreground\">—</p>\n : issue.stack!.map((f, i) => <Frame key={i} frame={f} />)}\n </div>\n </TabsContent>\n\n <TabsContent value=\"breadcrumbs\">\n <div className=\"overflow-hidden rounded-lg border border-border\">\n {(issue.breadcrumbs ?? []).length === 0\n ? <p className=\"p-4 text-sm text-muted-foreground\">—</p>\n : issue.breadcrumbs!.map((b, i) => <BreadcrumbRow key={i} b={b} />)}\n </div>\n </TabsContent>\n\n <TabsContent value=\"tags\">\n <div className=\"flex flex-wrap gap-2\">\n {(issue.tags ?? []).length === 0\n ? <p className=\"text-sm text-muted-foreground\">—</p>\n : issue.tags!.map((tag) => (\n <span key={tag.key} className=\"inline-flex items-center gap-1.5 rounded-md border border-border bg-card px-2 py-1 text-xs\">\n <span className=\"text-muted-foreground\">{tag.key}</span>\n <span className=\"font-medium\">{tag.value}</span>\n </span>\n ))}\n </div>\n </TabsContent>\n </Tabs>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport { IssuesList } from \"./IssuesList\";\nimport { IssueDetail } from \"./IssueDetail\";\nimport { STR, type Lang } from \"./shared\";\nimport type { Issue, ErrorFilter, IssueSort } from \"./types\";\n\nexport interface ErrorTrackingPageProps {\n issues: Issue[];\n language?: Lang;\n filter?: ErrorFilter;\n onFilterChange?: (f: ErrorFilter) => void;\n sort?: IssueSort;\n onSortChange?: (s: IssueSort) => void;\n environments?: string[];\n onResolve?: (issue: Issue) => void;\n onIgnore?: (issue: Issue) => void;\n /** controlled selection (optional) */\n selectedId?: string | null;\n onSelectIssue?: (issue: Issue) => void;\n className?: string;\n}\n\n/** ErrorTrackingPage — the Sentry-style master/detail error page: IssuesList on\n * the start side, IssueDetail on the end side. Responsive: split on desktop,\n * list→detail drill-down on mobile. Uncontrolled selection unless `selectedId`\n * is provided. */\nexport function ErrorTrackingPage({\n issues, language = \"en\", filter, onFilterChange, sort, onSortChange,\n environments, onResolve, onIgnore, selectedId, onSelectIssue, className,\n}: ErrorTrackingPageProps) {\n const t = STR[language];\n const dir = language === \"ar\" ? \"rtl\" : \"ltr\";\n const [internal, setInternal] = React.useState<string | null>(null);\n const activeId = selectedId !== undefined ? selectedId : internal;\n const active = issues.find((i) => i.id === activeId) ?? null;\n\n const select = (iss: Issue) => {\n if (selectedId === undefined) setInternal(iss.id);\n onSelectIssue?.(iss);\n };\n\n return (\n <div dir={dir} className={cn(\"flex h-[100vh] max-h-full overflow-hidden bg-background text-foreground\", className)}>\n {/* List — full width until an issue is selected; then a fixed start column on desktop */}\n <div\n className={cn(\n \"min-w-0 flex-col border-border\",\n active ? \"hidden md:flex md:max-w-md md:flex-none md:border-e lg:max-w-lg\" : \"flex flex-1\",\n )}\n >\n <IssuesList\n issues={issues}\n selectedId={activeId}\n onSelectIssue={select}\n language={language}\n filter={filter}\n onFilterChange={onFilterChange}\n sort={sort}\n onSortChange={onSortChange}\n environments={environments}\n />\n </div>\n\n {/* Detail — only occupies space once an issue is selected */}\n <div className={cn(\"min-w-0 flex-1\", !active && \"hidden\")}>\n {active ? (\n <div className=\"flex h-full flex-col\">\n <div className=\"border-b border-border p-2 md:hidden\">\n <Button variant=\"ghost\" size=\"sm\" onClick={() => (selectedId === undefined ? setInternal(null) : onSelectIssue?.(active))}>\n <ArrowLeft className=\"size-4 rtl:rotate-180\" /> {t.issues}\n </Button>\n </div>\n <IssueDetail issue={active} language={language} onResolve={onResolve} onIgnore={onIgnore} className=\"min-h-0 flex-1\" />\n </div>\n ) : (\n <p className=\"hidden p-10 text-center text-sm text-muted-foreground md:block\">{t.selectIssue}</p>\n )}\n </div>\n </div>\n );\n}\n","'use client'\n\n/**\n * SentraLoading — full-screen branded loading screen.\n *\n * Branding source (operator 2026-06-12): the loader NEVER fetches an image —\n * no logo URL, no SVG/PNG request. It renders the platform's BRAND ICON (a\n * Lucide icon name chosen in the Fort branding icon picker) and the platform\n * TITLE of the current product in the active language. Spinner uses the brand\n * primary color.\n *\n * The component accepts `language`/`dir` props so each product wires its own i18n.\n *\n * This is THE loading component for every product (operator 2026-06-12) — no\n * product ships its own loader. Wire it from Fort branding:\n *\n * <SentraLoading language={language} dir={isRTL ? 'rtl' : 'ltr'}\n * iconName={branding?.icon ?? null}\n * productNameEn={branding?.product_name_en}\n * productNameAr={branding?.product_name_ar} />\n */\n\nimport * as LucideIcons from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Logo } from '../brand/Logo'\n\ninterface SentraLoadingProps {\n language?: 'en' | 'ar'\n dir?: 'ltr' | 'rtl'\n /** Lucide icon name from the branding icon picker — the platform brand icon. */\n iconName?: string | null\n /**\n * Platform title pair from Fort branding. The component resolves the active\n * language itself so every product gets the translated title for free.\n */\n productNameEn?: string | null\n productNameAr?: string | null\n /** Pre-resolved title override — wins over the En/Ar pair when set. */\n productName?: string\n}\n\nconst SentraLoading = ({\n language = 'en',\n dir = 'ltr',\n iconName,\n productNameEn,\n productNameAr,\n productName,\n}: SentraLoadingProps) => {\n const isAr = language === 'ar'\n const name =\n productName ??\n (isAr ? productNameAr || productNameEn : productNameEn) ??\n 'Sentra'\n\n // Brand mark = the selected Lucide icon only. No image fetch, ever.\n let Icon: LucideIcon | undefined\n if (iconName) {\n Icon = (LucideIcons as Record<string, unknown>)[iconName] as LucideIcon | undefined\n }\n\n return (\n <div\n className=\"min-h-screen flex flex-col items-center justify-center gap-6 bg-background\"\n dir={dir}\n aria-label={isAr ? 'جاري التحميل' : 'Loading'}\n role=\"status\"\n >\n {/* AI-thinking mark (operator 2026-06-12): the brand icon IS the loader —\n soft pulsing glow behind it + a slow orbit ring around it, so it reads\n as \"intelligence working\", not a bare spinner. When no icon is set the\n glow + orbit ring still animate around an empty core. */}\n <div className=\"relative flex h-24 w-24 items-center justify-center\">\n {/* breathing glow */}\n <span className=\"absolute h-20 w-20 rounded-full bg-primary/20 blur-xl animate-pulse\" />\n {/* outer orbit ring — slow spin, brand primary */}\n <span\n className=\"absolute h-24 w-24 rounded-full border border-primary/25 border-t-primary/90 animate-spin\"\n style={{ animationDuration: '2.5s' }}\n />\n {/* inner counter-orbit ring */}\n <span\n className=\"absolute h-[4.2rem] w-[4.2rem] rounded-full border border-primary/15 border-b-primary/60 animate-spin\"\n style={{ animationDuration: '1.8s', animationDirection: 'reverse' }}\n />\n {/* The brand icon IS the loader. When no Lucide icon is wired, fall back to\n the ToGO mark so the core is never empty. */}\n {Icon ? (\n <Icon className=\"relative h-10 w-10 text-primary animate-pulse\" aria-hidden />\n ) : (\n <span className=\"relative text-primary animate-pulse\" aria-hidden>\n <Logo variant=\"mono\" tone=\"inherit\" size={38} />\n </span>\n )}\n </div>\n\n {/* Platform title — the current product's name in the active language */}\n <h1 className=\"text-xl font-semibold text-foreground tracking-wide\">{name}</h1>\n\n {/* thinking dots */}\n <div className=\"flex items-center gap-1.5\" aria-hidden>\n <span className=\"h-1.5 w-1.5 rounded-full bg-primary/80 animate-bounce\" style={{ animationDelay: '-0.3s' }} />\n <span className=\"h-1.5 w-1.5 rounded-full bg-primary/60 animate-bounce\" style={{ animationDelay: '-0.15s' }} />\n <span className=\"h-1.5 w-1.5 rounded-full bg-primary/40 animate-bounce\" />\n </div>\n\n <span className=\"sr-only\">{isAr ? 'جاري التحميل...' : 'Loading...'}</span>\n </div>\n )\n}\n\nSentraLoading.displayName = 'SentraLoading'\nexport default SentraLoading\nexport { SentraLoading }\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport markColor from \"../../assets/brand/mark-color.svg\";\nimport markWhite from \"../../assets/brand/mark-white.svg\";\nimport monoColor from \"../../assets/brand/mono-color.svg\";\nimport monoWhite from \"../../assets/brand/mono-white.svg\";\n\nexport type LogoVariant = \"mark\" | \"mono\";\n/** brand = gradient · white = reversed (dark bg) · inherit = currentColor (themes with text). */\nexport type LogoTone = \"brand\" | \"white\" | \"inherit\";\n\nconst ASSET: Record<LogoVariant, { color: string; white: string; ratio: number }> = {\n mark: { color: markColor, white: markWhite, ratio: 507 / 618 }, // tall mascot mark\n mono: { color: monoColor, white: monoWhite, ratio: 507 / 398.6 }, // wide monogram\n};\n\nexport interface LogoProps extends Omit<React.HTMLAttributes<HTMLElement>, \"color\"> {\n variant?: LogoVariant;\n tone?: LogoTone;\n /** Rendered height in px; width derives from the mark's aspect ratio. */\n size?: number;\n title?: string;\n}\n\n/** ToGO Logo — the mascot mark or the monogram. `tone=\"inherit\"` masks the shape\n * with currentColor so it themes with the surrounding text color. */\nexport function Logo({ variant = \"mark\", tone = \"brand\", size = 32, title = \"ToGO\", className, style, ...props }: LogoProps) {\n const a = ASSET[variant];\n const width = Math.round(size * a.ratio);\n\n if (tone === \"inherit\") {\n return (\n <span\n role=\"img\"\n aria-label={title}\n className={cn(\"inline-block shrink-0\", className)}\n style={{\n width,\n height: size,\n backgroundColor: \"currentColor\",\n WebkitMaskImage: `url(${a.white})`,\n maskImage: `url(${a.white})`,\n WebkitMaskRepeat: \"no-repeat\",\n maskRepeat: \"no-repeat\",\n WebkitMaskSize: \"contain\",\n maskSize: \"contain\",\n WebkitMaskPosition: \"center\",\n maskPosition: \"center\",\n ...style,\n }}\n {...props}\n />\n );\n }\n\n return (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={tone === \"white\" ? a.white : a.color}\n alt={title}\n width={width}\n height={size}\n className={cn(\"inline-block shrink-0\", className)}\n style={style}\n {...(props as React.ImgHTMLAttributes<HTMLImageElement>)}\n />\n );\n}\nLogo.displayName = \"Logo\";\n","'use client'\n\n/**\n * ContextualSkeleton — a loading skeleton with a contextual header (spinner +\n * a bilingual \"loading X…\" caption) and one of three body shapes: default\n * (text lines), grid (cards), or timeline (dot + lines rows).\n *\n * Pure & product-agnostic (Rule 25): `language` is a prop, no context. Distinct\n * from SectionSkeleton (which is a single card-shaped block) — this one carries\n * a caption + variant body for richer loading states.\n *\n * Ported from app/src/components/loading/ContextualSkeleton.tsx.\n */\n\nimport * as React from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { Skeleton } from './skeleton'\n\nexport type ContextualSkeletonVariant = 'default' | 'grid' | 'timeline'\n\nexport interface ContextualSkeletonProps {\n /** Bilingual caption shown next to the spinner, e.g. {en:'Loading alerts…', ar:'…'} */\n description: { en: string; ar: string }\n variant?: ContextualSkeletonVariant\n /** Number of text lines for the 'default' variant. Default: 3. */\n lines?: number\n language?: 'en' | 'ar'\n /**\n * Optional icon (LucideIcon component) rendered before the caption.\n * Accepted for API parity with hub callers — visually ignored (spinner\n * already serves as the loading indicator). Pass it to keep TS happy when\n * migrating from the old hub ContextualSkeleton.\n */\n icon?: React.ComponentType<{ className?: string }>\n /**\n * Bilingual title shown above the skeleton body. Optional — omitted if not provided.\n */\n title?: { en: string; ar: string }\n}\n\nconst LINE_WIDTHS = ['w-full', 'w-5/6', 'w-4/6', 'w-3/4', 'w-2/3']\n\nconst DefaultBody = ({ lines }: { lines: number }) => (\n <div className=\"space-y-3\">\n {Array.from({ length: lines }, (_, i) => (\n <Skeleton key={i} className={`h-4 ${LINE_WIDTHS[i % LINE_WIDTHS.length]}`} />\n ))}\n </div>\n)\n\nconst GridBody = () => (\n <div className=\"space-y-3\">\n {[1, 2, 3].map(i => (\n <Skeleton key={i} className=\"h-16 w-full\" />\n ))}\n </div>\n)\n\nconst TimelineBody = () => (\n <div className=\"space-y-4\">\n {[1, 2, 3].map(i => (\n <div key={i} className=\"flex gap-3\">\n <Skeleton className=\"w-2.5 h-2.5 rounded-full mt-1.5 shrink-0\" />\n <div className=\"flex-1 space-y-1\">\n <Skeleton className=\"h-3 w-20\" />\n <Skeleton className=\"h-4 w-full\" />\n </div>\n </div>\n ))}\n </div>\n)\n\nexport const ContextualSkeleton = ({\n description,\n variant = 'default',\n lines = 3,\n language = 'en',\n}: ContextualSkeletonProps) => {\n const lang = language === 'ar' ? 'ar' : 'en'\n return (\n <div className=\"space-y-3\" aria-busy=\"true\">\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <Loader2 className=\"w-3.5 h-3.5 animate-spin text-primary\" aria-hidden=\"true\" />\n <span>{description[lang]}</span>\n </div>\n {variant === 'timeline' ? (\n <TimelineBody />\n ) : variant === 'grid' ? (\n <GridBody />\n ) : (\n <DefaultBody lines={lines} />\n )}\n </div>\n )\n}\n\nContextualSkeleton.displayName = 'ContextualSkeleton'\nexport default ContextualSkeleton\n","'use client'\n\nimport { Card, CardContent, CardHeader } from \"./card\";\nimport { Skeleton } from \"./skeleton\";\n\ninterface SectionSkeletonProps {\n title?: string;\n rows?: number;\n}\n\nconst SectionSkeleton = ({ title, rows = 3 }: SectionSkeletonProps) => {\n return (\n <Card\n className=\"bg-card border-border\"\n aria-busy=\"true\"\n aria-label={title || \"Loading\"}\n data-testid={title ? `section-skeleton-${title.toLowerCase().replace(/\\s+/g, \"-\")}` : \"section-skeleton\"}\n >\n {title && (\n <CardHeader className=\"pb-3\">\n <Skeleton className=\"h-4 w-40\" />\n </CardHeader>\n )}\n <CardContent className=\"space-y-2 pt-4\">\n {Array.from({ length: rows }).map((_, i) => (\n <Skeleton\n key={i}\n className=\"h-4 rounded-md\"\n style={{ width: `${100 - i * 10}%` }}\n />\n ))}\n </CardContent>\n </Card>\n );\n};\nSectionSkeleton.displayName = \"SectionSkeleton\";\n\nexport { SectionSkeleton };\n","'use client'\n\n/**\n * LanguageProvider — @prism/ui shared bilingual context.\n *\n * Single source of truth for language + RTL across all 5 product apps.\n * Default: EN (ltr). Switch to AR to get RTL + Arabic strings.\n *\n * Usage:\n * // Root layout or _app:\n * <LanguageProvider initialLanguage=\"en\" onLanguageChange={persistToProfile}>\n * {children}\n * </LanguageProvider>\n *\n * // Inside any component:\n * const { t, language, setLanguage, isRTL } = useT()\n * // or the alias:\n * const { language, setLanguage } = useLanguage()\n *\n * The `language` prop on individual components still works as a Storybook /\n * standalone override — those components accept it and fall through to\n * conditional rendering when no context is present. At runtime the context\n * value always wins (components read context first).\n *\n * Rules: Rule 8 (bilingual EN/AR), Rule 16 (Sentra style), Rule 7 (displayName).\n */\n\nimport {\n createContext,\n useContext,\n useState,\n useCallback,\n useEffect,\n type ReactNode,\n} from 'react'\nimport { useTranslation } from 'react-i18next'\nimport i18n, { initI18n, type SupportedLanguage } from './index'\n\n// ---------------------------------------------------------------------------\n// Context shape\n// ---------------------------------------------------------------------------\n\nexport interface LanguageContextValue {\n /** Current locale — 'en' | 'ar' */\n language: SupportedLanguage\n /** Alias used by components ported from the legacy Sentra app */\n lang: SupportedLanguage\n /** true when language === 'ar' */\n isRTL: boolean\n /** Switch language. Updates i18next, document.documentElement dir/lang,\n * caches the choice to localStorage, and calls onLanguageChange. */\n setLanguage: (l: SupportedLanguage) => void\n /**\n * Seed the language from the Fort profile AFTER login — but ONLY when the user\n * has no cached choice yet. The cached selection (the user's explicit toggle)\n * always wins over profile.lang on reload. Use this instead of setLanguage()\n * for the post-login profile seed so it doesn't clobber a cached preference.\n */\n seedLanguage: (l: SupportedLanguage) => void\n /**\n * i18next `t()` bound to the current language.\n * Key format: `\"namespace:key\"` or just `\"key\"` (uses defaultNS = 'common').\n * Supports interpolation: `t('header:updated', { time: '5 min ago' })`.\n */\n t: (key: string, vars?: Record<string, unknown>) => string\n}\n\nconst LanguageContext = createContext<LanguageContextValue | null>(null)\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport interface LanguageProviderProps {\n children: ReactNode\n /**\n * Seed language. Defaults to 'en'.\n * Pass `initialLanguage={profile.lang}` post-login to hydrate from Fort\n * profile without a flicker (SSR already sets the cookie; the provider\n * syncs immediately).\n */\n initialLanguage?: SupportedLanguage\n /**\n * Called whenever the user switches language (or on first mount if\n * initialLanguage differs from the stored preference). Products wire this\n * to `FortProfileClient.patchProfile({ lang })` to persist the choice.\n */\n onLanguageChange?: (lang: SupportedLanguage) => void\n}\n\n// Initialise i18next at module load time (idempotent — safe to call multiple times).\n// This ensures the instance is ready synchronously before the first render.\ninitI18n()\n\nconst LANG_STORAGE_KEY = 'sentra:lang'\n/** Cookie name must be colon-free (RFC 6265). Mirrors LANG_STORAGE_KEY. */\nexport const LANG_COOKIE_NAME = 'sentra_lang'\n\n// Read the cached language choice (operator 2026-06-05: \"selected lang must be\n// cached\"). SSR-safe (returns null when there's no window). Validates the value.\nconst readCachedLang = (): SupportedLanguage | null => {\n if (typeof window === 'undefined') return null\n try {\n const v = window.localStorage.getItem(LANG_STORAGE_KEY)\n return v === 'en' || v === 'ar' ? v : null\n } catch {\n return null\n }\n}\n\n/** Write the language choice to a cookie so server layouts can read it for SSR.\n * 1-year expiry so it survives restarts; SameSite=Lax is safe for same-site nav. */\nconst writeLangCookie = (l: SupportedLanguage): void => {\n if (typeof document === 'undefined') return\n document.cookie = `${LANG_COOKIE_NAME}=${l}; path=/; max-age=${60 * 60 * 24 * 365}; SameSite=Lax`\n}\n\nconst LanguageProvider = ({\n children,\n initialLanguage = 'en',\n onLanguageChange,\n}: LanguageProviderProps) => {\n // Start from initialLanguage for SSR (server has no localStorage → no hydration\n // mismatch); the cached choice is applied in a mount effect below.\n const [language, setLanguageState] = useState<SupportedLanguage>(initialLanguage)\n\n // Sync document dir/lang on mount and on every language change\n const applyDirToDocument = useCallback((l: SupportedLanguage) => {\n if (typeof document === 'undefined') return\n document.documentElement.dir = l === 'ar' ? 'rtl' : 'ltr'\n document.documentElement.lang = l\n }, [])\n\n // On first render: the CACHED localStorage choice wins over initialLanguage.\n // If neither is set, initialLanguage (which is now the SSR cookie value) wins.\n // Writing the cookie here keeps it in sync with the resolved value even when\n // the user hasn't toggled language manually yet.\n useEffect(() => {\n const cached = readCachedLang()\n const resolved = cached ?? initialLanguage\n if (resolved !== language) setLanguageState(resolved)\n applyDirToDocument(resolved)\n writeLangCookie(resolved)\n if (i18n.language !== resolved) {\n i18n.changeLanguage(resolved)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n const setLanguage = useCallback(\n (l: SupportedLanguage) => {\n setLanguageState(l)\n applyDirToDocument(l)\n i18n.changeLanguage(l)\n // Cache the selection so it survives reloads (localStorage + cookie).\n // The cookie is read by server layouts so the next SSR request renders the\n // correct lang/dir on <html> at first paint — zero EN→AR flash.\n try {\n if (typeof window !== 'undefined') window.localStorage.setItem(LANG_STORAGE_KEY, l)\n } catch {\n /* storage unavailable — non-fatal */\n }\n writeLangCookie(l)\n onLanguageChange?.(l)\n },\n [applyDirToDocument, onLanguageChange],\n )\n\n // seedLanguage — apply the profile lang ONLY if the user has no cached choice.\n // The cached selection (explicit toggle) wins on reload, so the post-login\n // profile seed must not clobber it. Does NOT write to the cache (a profile seed\n // is not an explicit user selection).\n const seedLanguage = useCallback(\n (l: SupportedLanguage) => {\n if (readCachedLang()) return // user already chose — keep their choice\n setLanguageState(l)\n applyDirToDocument(l)\n i18n.changeLanguage(l)\n },\n [applyDirToDocument],\n )\n\n // Simple translation helper that stays in sync with current language state.\n // We use i18n.t directly (synchronous after init) instead of useTranslation\n // here to keep the context value stable across re-renders.\n const t = useCallback(\n (key: string, vars?: Record<string, unknown>): string => {\n return i18n.t(key, { ...(vars as object), lng: language }) as string\n },\n [language],\n )\n\n const value: LanguageContextValue = {\n language,\n lang: language,\n isRTL: language === 'ar',\n setLanguage,\n seedLanguage,\n t,\n }\n\n return (\n <LanguageContext.Provider value={value}>\n {children}\n </LanguageContext.Provider>\n )\n}\nLanguageProvider.displayName = 'LanguageProvider'\n\n// Also export as named export for destructured imports\nexport { LanguageProvider }\n\n// ---------------------------------------------------------------------------\n// Hooks\n// ---------------------------------------------------------------------------\n\n/**\n * useT — primary hook. Returns `{ t, language, setLanguage, isRTL }`.\n * Must be used inside a <LanguageProvider>.\n */\nexport const useT = (): LanguageContextValue => {\n const ctx = useContext(LanguageContext)\n if (!ctx) {\n throw new Error('[useT] Must be used inside <LanguageProvider> from @prism/ui')\n }\n return ctx\n}\n\n/**\n * useLanguage — alias for useT. Preferred by components that only need\n * `language` / `setLanguage` and don't call `t()`.\n */\nexport const useLanguage = (): LanguageContextValue => useT()\n\n// ---------------------------------------------------------------------------\n// Re-export i18next `useTranslation` for components that prefer the\n// react-i18next API directly (optional — most components use useT)\n// ---------------------------------------------------------------------------\nexport { useTranslation } from 'react-i18next'\n\nexport default LanguageProvider\n","'use client'\n\n/**\n * @prism/ui — shared i18next initialisation\n *\n * Called once by LanguageProvider. Safe to call multiple times (idempotent via\n * `i18n.isInitialized` guard). Defaults to EN so every app boots with zero\n * Arabic strings until the provider explicitly switches to AR.\n *\n * Consumers: import `i18n` from here if direct access is needed; prefer the\n * `useT()` / `useLanguage()` hooks for component-level translation.\n *\n * Rules: Rule 8 (bilingual EN/AR), Rule 16 (Sentra style — client component).\n */\n\nimport i18n from 'i18next'\nimport { initReactI18next } from 'react-i18next'\n\nimport enJson from './locales/en.json'\nimport arJson from './locales/ar.json'\n\nexport const SUPPORTED_LANGUAGES = ['en', 'ar'] as const\nexport type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number]\n\nconst resources = {\n en: {\n common: enJson.common,\n header: enJson.header,\n profile: enJson.profile,\n nav: enJson.nav,\n copilot: enJson.copilot,\n auth: enJson.auth,\n },\n ar: {\n common: arJson.common,\n header: arJson.header,\n profile: arJson.profile,\n nav: arJson.nav,\n copilot: arJson.copilot,\n auth: arJson.auth,\n },\n}\n\n/**\n * Initialise i18next. Idempotent — safe to call from multiple providers\n * (e.g. in Storybook + the consuming app mounting two providers).\n */\nexport function initI18n(): void {\n if (i18n.isInitialized) return\n\n i18n\n .use(initReactI18next)\n .init({\n /**\n * DEFAULT LANGUAGE = EN. This is the bug fix: all panels default to\n * English. Arabic is only rendered when the user explicitly switches or\n * the app seeds the provider with `initialLanguage=\"ar\"` from a Fort\n * profile (post-login).\n */\n lng: 'en',\n fallbackLng: 'en',\n supportedLngs: ['en', 'ar'],\n defaultNS: 'common',\n ns: ['common', 'header', 'profile', 'nav', 'copilot', 'auth'],\n resources,\n interpolation: {\n escapeValue: false, // React already escapes\n },\n // Disable auto-detection — language is controlled exclusively via\n // LanguageProvider.setLanguage (reads Fort profile.lang post-login).\n detection: undefined,\n })\n}\n\nexport default i18n\n","{\n \"common\": {\n \"refresh\": \"Refresh\",\n \"save\": \"Save\",\n \"cancel\": \"Cancel\",\n \"delete\": \"Delete\",\n \"confirm\": \"Confirm\",\n \"close\": \"Close\",\n \"search\": \"Search...\",\n \"loading\": \"Loading...\",\n \"error\": \"Error loading data\",\n \"empty\": \"No data available\",\n \"viewAll\": \"View All\",\n \"create\": \"Create\",\n \"edit\": \"Edit\",\n \"remove\": \"Remove\",\n \"add\": \"Add\",\n \"copy\": \"Copy\",\n \"share\": \"Share\",\n \"back\": \"Back\",\n \"next\": \"Next\",\n \"submit\": \"Submit\",\n \"reset\": \"Reset\",\n \"yes\": \"Yes\",\n \"no\": \"No\"\n },\n \"header\": {\n \"search\": \"Search...\",\n \"liveMonitoring\": \"Live Monitoring\",\n \"updated\": \"Updated {{time}}\",\n \"refresh\": \"Refresh\",\n \"switchLanguage\": \"Switch language\"\n },\n \"profile\": {\n \"profile\": \"Profile\",\n \"settings\": \"Settings\",\n \"lockScreen\": \"Lock screen\",\n \"signOut\": \"Sign out\",\n \"admin\": \"Admin\",\n \"superAdmin\": \"Super Admin\"\n },\n \"nav\": {\n \"dashboard\": \"Dashboard\",\n \"alerts\": \"Alerts\",\n \"narratives\": \"Narratives\",\n \"events\": \"Events\",\n \"entities\": \"Entities\",\n \"briefings\": \"Briefings\",\n \"tasks\": \"Tasks\",\n \"copilot\": \"Copilot\",\n \"compare\": \"Compare\",\n \"map\": \"Map\"\n },\n \"copilot\": {\n \"placeholder\": \"Ask follow-up...\",\n \"placeholderAsk\": \"Ask {{name}}...\",\n \"aiName\": \"Sentra AI\",\n \"thinking\": \"Thinking\",\n \"fast\": \"Fast\",\n \"thinkingIndicator\": \"Thinking...\",\n \"dockPosition\": \"Dock Position\",\n \"dockLeft\": \"Dock Left\",\n \"dockRight\": \"Dock Right\",\n \"dockBottom\": \"Dock Bottom\",\n \"history\": \"History\",\n \"conversationHistory\": \"Conversation History\",\n \"noPreviousConversations\": \"No previous conversations\",\n \"deleteConversation\": \"Delete conversation\",\n \"newChat\": \"New Chat\",\n \"fullView\": \"Full View\",\n \"dropFiles\": \"Drop files here\",\n \"aiPersonaSimulation\": \"AI Persona Simulation\",\n \"digitalTwin\": \"Digital Twin\",\n \"twinDisclaimer\": \"This is an AI simulation based on known intelligence profiles. Not real communication.\",\n \"noDataAvailable\": \"No data available at the moment\",\n \"comparisonFactorsAccepted\": \"Comparison factors accepted\",\n \"insightFromDashboard\": \"Insight from dashboard\",\n \"copyResponse\": \"Copy\",\n \"shareResponse\": \"Share\",\n \"dockFloat\": \"Float (undock)\",\n \"undock\": \"Undock\",\n \"redock\": \"Re-dock\",\n \"resize\": \"Resize\",\n \"askCopilot\": \"Ask Copilot\"\n },\n \"auth\": {\n \"signIn\": \"Sign In\",\n \"signOut\": \"Sign Out\",\n \"email\": \"Email\",\n \"password\": \"Password\",\n \"forgotPassword\": \"Forgot Password?\",\n \"resetPassword\": \"Reset Password\",\n \"twoFactor\": \"Two-Factor Authentication\",\n \"enterOTP\": \"Enter OTP\",\n \"backToLogin\": \"Back to Login\",\n \"sendResetLink\": \"Send Reset Link\",\n \"newPassword\": \"New Password\",\n \"confirmPassword\": \"Confirm Password\"\n }\n}\n","{\n \"common\": {\n \"refresh\": \"تحديث\",\n \"save\": \"حفظ\",\n \"cancel\": \"إلغاء\",\n \"delete\": \"حذف\",\n \"confirm\": \"تأكيد\",\n \"close\": \"إغلاق\",\n \"search\": \"بحث...\",\n \"loading\": \"جارٍ التحميل...\",\n \"error\": \"خطأ في تحميل البيانات\",\n \"empty\": \"لا توجد بيانات\",\n \"viewAll\": \"عرض الكل\",\n \"create\": \"إنشاء\",\n \"edit\": \"تعديل\",\n \"remove\": \"إزالة\",\n \"add\": \"إضافة\",\n \"copy\": \"نسخ\",\n \"share\": \"مشاركة\",\n \"back\": \"رجوع\",\n \"next\": \"التالي\",\n \"submit\": \"إرسال\",\n \"reset\": \"إعادة تعيين\",\n \"yes\": \"نعم\",\n \"no\": \"لا\"\n },\n \"header\": {\n \"search\": \"بحث...\",\n \"liveMonitoring\": \"المراقبة المباشرة\",\n \"updated\": \"آخر تحديث {{time}}\",\n \"refresh\": \"تحديث\",\n \"switchLanguage\": \"تبديل اللغة\"\n },\n \"profile\": {\n \"profile\": \"الملف الشخصي\",\n \"settings\": \"الإعدادات\",\n \"lockScreen\": \"قفل الشاشة\",\n \"signOut\": \"تسجيل الخروج\",\n \"admin\": \"لوحة الإدارة\",\n \"superAdmin\": \"الإدارة العليا\"\n },\n \"nav\": {\n \"dashboard\": \"لوحة التحكم\",\n \"alerts\": \"التنبيهات\",\n \"narratives\": \"السرديات\",\n \"events\": \"الأحداث\",\n \"entities\": \"الكيانات\",\n \"briefings\": \"الإحاطات\",\n \"tasks\": \"المهام\",\n \"copilot\": \"المساعد الذكي\",\n \"compare\": \"مقارنة\",\n \"map\": \"الخريطة\"\n },\n \"copilot\": {\n \"placeholder\": \"اسأل المساعد...\",\n \"placeholderAsk\": \"اسأل {{name}}...\",\n \"aiName\": \"سنترا الذكي\",\n \"thinking\": \"تفكير\",\n \"fast\": \"سريع\",\n \"thinkingIndicator\": \"جارٍ التفكير...\",\n \"dockPosition\": \"موضع النافذة\",\n \"dockLeft\": \"تثبيت يسار\",\n \"dockRight\": \"تثبيت يمين\",\n \"dockBottom\": \"تثبيت أسفل\",\n \"history\": \"السجل\",\n \"conversationHistory\": \"المحادثات السابقة\",\n \"noPreviousConversations\": \"لا توجد محادثات سابقة\",\n \"deleteConversation\": \"حذف المحادثة\",\n \"newChat\": \"محادثة جديدة\",\n \"fullView\": \"عرض كامل\",\n \"dropFiles\": \"أفلت الملفات هنا\",\n \"aiPersonaSimulation\": \"محاكاة ذكاء اصطناعي\",\n \"digitalTwin\": \"توأم رقمي\",\n \"twinDisclaimer\": \"هذه محاكاة ذكاء اصطناعي مبنية على ملفات استخباراتية معروفة. ليست تواصلاً حقيقياً.\",\n \"noDataAvailable\": \"لا توجد بيانات متاحة حالياً\",\n \"comparisonFactorsAccepted\": \"تم قبول عوامل المقارنة\",\n \"insightFromDashboard\": \"رؤية من لوحة التحكم\",\n \"copyResponse\": \"نسخ\",\n \"shareResponse\": \"مشاركة\",\n \"dockFloat\": \"نافذة عائمة\",\n \"undock\": \"إلغاء الإرساء\",\n \"redock\": \"إعادة الإرساء\",\n \"resize\": \"تغيير الحجم\",\n \"askCopilot\": \"اسأل المساعد\"\n },\n \"auth\": {\n \"signIn\": \"تسجيل الدخول\",\n \"signOut\": \"تسجيل الخروج\",\n \"email\": \"البريد الإلكتروني\",\n \"password\": \"كلمة المرور\",\n \"forgotPassword\": \"نسيت كلمة المرور؟\",\n \"resetPassword\": \"إعادة تعيين كلمة المرور\",\n \"twoFactor\": \"التحقق بخطوتين\",\n \"enterOTP\": \"أدخل رمز التحقق\",\n \"backToLogin\": \"العودة لتسجيل الدخول\",\n \"sendResetLink\": \"إرسال رابط إعادة التعيين\",\n \"newPassword\": \"كلمة المرور الجديدة\",\n \"confirmPassword\": \"تأكيد كلمة المرور\"\n }\n}\n","'use client'\n\n/**\n * ArtifactTable — renders an A2UI \"table\" artifact.\n *\n * Uses the plain shadcn Table primitives (appropriate for small copilot-response\n * data — the feature-heavy DataTable is overkill for 5–50 row AI output).\n * Bilingual column headers (label_en / label_ar). RTL-safe via logical props.\n * Semantic tokens only, no hex literals.\n *\n * Rules: Rule 7 (displayName), Rule 8 (bilingual/RTL), Rule 16 (Sentra style).\n */\n\nimport {\n Table,\n TableHeader,\n TableRow,\n TableHead,\n TableBody,\n TableCell,\n} from '../../ui/table'\nimport type { A2UITableData } from './types'\n\nexport interface ArtifactTableProps {\n data: A2UITableData\n language?: 'en' | 'ar'\n dir?: 'ltr' | 'rtl'\n}\n\nconst ArtifactTable = ({ data, language = 'en', dir }: ArtifactTableProps) => {\n const resolvedDir = dir ?? (language === 'ar' ? 'rtl' : 'ltr')\n\n // ── Normalize both wire shapes ──────────────────────────────────────────────\n // The model (per the a2ui prompt) emits the SIMPLE shape:\n // columns: [\"Provider\",\"Models\"], rows: [[\"Google\",\"Gemini\"], ...]\n // The rich shape is: columns: [{key,label_en,label_ar}], rows: [{key: value}].\n // Accept either so the table renders regardless of which the model produced.\n const rawCols = (data?.columns ?? []) as unknown[]\n const cols = rawCols.map((c, i) =>\n typeof c === 'string'\n ? { key: String(i), label_en: c, label_ar: c }\n : (c as { key: string; label_en: string; label_ar?: string }),\n )\n const rawRows = (data?.rows ?? []) as unknown[]\n const cellOf = (row: unknown, col: { key: string }, colIdx: number): unknown =>\n Array.isArray(row) ? row[colIdx] : (row as Record<string, unknown>)?.[col.key]\n\n if (cols.length === 0) {\n return (\n <p className=\"text-xs text-muted-foreground italic\">\n {language === 'ar' ? 'لا توجد بيانات' : 'No data'}\n </p>\n )\n }\n\n return (\n <div className=\"overflow-x-auto rounded-md border border-border\" dir={resolvedDir}>\n <Table>\n <TableHeader>\n <TableRow>\n {cols.map((col, colIdx) => (\n <TableHead\n key={col.key ?? colIdx}\n className=\"text-start text-xs font-semibold text-muted-foreground bg-muted/40 px-3 py-2\"\n >\n {language === 'ar' && col.label_ar ? col.label_ar : col.label_en}\n </TableHead>\n ))}\n </TableRow>\n </TableHeader>\n <TableBody>\n {rawRows.length === 0 ? (\n <TableRow>\n <TableCell\n colSpan={cols.length}\n className=\"text-center text-xs text-muted-foreground py-4\"\n >\n {language === 'ar' ? 'لا توجد صفوف' : 'No rows'}\n </TableCell>\n </TableRow>\n ) : (\n rawRows.map((row, rowIdx) => (\n <TableRow key={rowIdx} className=\"hover:bg-muted/30 transition-colors duration-fast ease-standard\">\n {cols.map((col, colIdx) => {\n const v = cellOf(row, col, colIdx)\n return (\n <TableCell\n key={col.key ?? colIdx}\n className=\"text-start text-xs text-foreground px-3 py-2\"\n >\n {v !== undefined && v !== null ? String(v) : '—'}\n </TableCell>\n )\n })}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </div>\n )\n}\n\nArtifactTable.displayName = 'ArtifactTable'\n\nexport { ArtifactTable }\n","'use client'\n\n/**\n * ArtifactChart — renders an A2UI \"chart\" artifact.\n *\n * Uses recharts (already in package.json) for bar / line / pie. Lightweight\n * responsive wrappers — no new heavy dependency. All styling via semantic tokens.\n *\n * Supports:\n * - bar — BarChart (multiple series = grouped bars)\n * - line — LineChart (multiple series = multiple lines)\n * - pie — PieChart (single series, points[i].x = label, points[i].y = value)\n *\n * Bilingual: legend labels use series.label_ar when language === 'ar'.\n * RTL: recharts is LTR-native; we wrap in a div with dir=\"ltr\" and position\n * labels manually so the chart internals stay correct regardless of page dir.\n *\n * Rules: Rule 7 (displayName), Rule 8 (bilingual/RTL), Rule 16 (Sentra style).\n */\n\nimport {\n BarChart,\n Bar,\n LineChart,\n Line,\n PieChart,\n Pie,\n Cell,\n XAxis,\n YAxis,\n Tooltip,\n Legend,\n ResponsiveContainer,\n} from 'recharts'\nimport type { A2UIChartData, A2UIChartSeries } from './types'\n\n// ── Palette — maps to Sentra primary / accent / semantic colors ───────────────\n// Values are CSS colour strings that contrast on bg-card / bg-muted surfaces.\n// We avoid hex literals where possible; these are the computed outputs of the\n// --primary (navy) and --gold tokens at typical dark-mode luminance values.\n// Token-driven series palette — re-themes with the active theme (ToGO Flow + status).\nconst CHART_PALETTE = [\n 'hsl(var(--primary))',\n 'hsl(var(--info))',\n 'hsl(var(--warning))',\n 'hsl(var(--success))',\n 'hsl(var(--alert-cyan))',\n 'hsl(var(--muted-foreground))',\n 'hsl(var(--destructive))',\n]\n\n// ── Label resolution ──────────────────────────────────────────────────────────\n\nfunction seriesLabel(s: A2UIChartSeries, language: 'en' | 'ar'): string {\n return language === 'ar' && s.label_ar ? s.label_ar : s.label_en\n}\n\n// ── Bar chart ─────────────────────────────────────────────────────────────────\n\ninterface BarChartViewProps {\n series: A2UIChartSeries[]\n language: 'en' | 'ar'\n}\n\nconst BarChartView = ({ series, language }: BarChartViewProps) => {\n // Reshape: [{x, s0, s1, ...}]\n const allX = Array.from(new Set(series.flatMap(s => s.points.map(p => String(p.x)))))\n const chartData = allX.map(x => {\n const row: Record<string, string | number> = { x }\n series.forEach((s, i) => {\n const pt = s.points.find(p => String(p.x) === x)\n row[`s${i}`] = pt ? pt.y : 0\n })\n return row\n })\n\n return (\n <ResponsiveContainer width=\"100%\" height={180}>\n <BarChart data={chartData} margin={{ top: 4, right: 4, left: -16, bottom: 0 }}>\n <XAxis dataKey=\"x\" tick={{ fontSize: 10, fill: 'hsl(var(--muted-foreground))' }} />\n <YAxis tick={{ fontSize: 10, fill: 'hsl(var(--muted-foreground))' }} />\n <Tooltip\n contentStyle={{ background: 'hsl(var(--card))', border: '1px solid hsl(var(--border))', fontSize: 11 }}\n labelStyle={{ color: 'hsl(var(--foreground))' }}\n />\n {series.length > 1 && (\n <Legend\n formatter={(value: string) => {\n const idx = Number(value.slice(1))\n return seriesLabel(series[idx], language)\n }}\n wrapperStyle={{ fontSize: 10 }}\n />\n )}\n {series.map((s, i) => (\n <Bar key={`s${i}`} dataKey={`s${i}`} fill={CHART_PALETTE[i % CHART_PALETTE.length]} radius={[2, 2, 0, 0]} />\n ))}\n </BarChart>\n </ResponsiveContainer>\n )\n}\nBarChartView.displayName = 'BarChartView'\n\n// ── Line chart ────────────────────────────────────────────────────────────────\n\ninterface LineChartViewProps {\n series: A2UIChartSeries[]\n language: 'en' | 'ar'\n}\n\nconst LineChartView = ({ series, language }: LineChartViewProps) => {\n const allX = Array.from(new Set(series.flatMap(s => s.points.map(p => String(p.x)))))\n const chartData = allX.map(x => {\n const row: Record<string, string | number> = { x }\n series.forEach((s, i) => {\n const pt = s.points.find(p => String(p.x) === x)\n row[`s${i}`] = pt ? pt.y : 0\n })\n return row\n })\n\n return (\n <ResponsiveContainer width=\"100%\" height={180}>\n <LineChart data={chartData} margin={{ top: 4, right: 4, left: -16, bottom: 0 }}>\n <XAxis dataKey=\"x\" tick={{ fontSize: 10, fill: 'hsl(var(--muted-foreground))' }} />\n <YAxis tick={{ fontSize: 10, fill: 'hsl(var(--muted-foreground))' }} />\n <Tooltip\n contentStyle={{ background: 'hsl(var(--card))', border: '1px solid hsl(var(--border))', fontSize: 11 }}\n labelStyle={{ color: 'hsl(var(--foreground))' }}\n />\n {series.length > 1 && (\n <Legend\n formatter={(value: string) => {\n const idx = Number(value.slice(1))\n return seriesLabel(series[idx], language)\n }}\n wrapperStyle={{ fontSize: 10 }}\n />\n )}\n {series.map((s, i) => (\n <Line\n key={`s${i}`}\n type=\"monotone\"\n dataKey={`s${i}`}\n stroke={CHART_PALETTE[i % CHART_PALETTE.length]}\n dot={false}\n strokeWidth={2}\n />\n ))}\n </LineChart>\n </ResponsiveContainer>\n )\n}\nLineChartView.displayName = 'LineChartView'\n\n// ── Pie chart ─────────────────────────────────────────────────────────────────\n\ninterface PieChartViewProps {\n series: A2UIChartSeries[]\n language: 'en' | 'ar'\n}\n\nconst PieChartView = ({ series, language }: PieChartViewProps) => {\n // Pie uses the first series only — each point is one slice.\n const first = series[0]\n if (!first) return null\n\n const pieData = first.points.map(p => ({\n name: String(p.x),\n value: p.y,\n }))\n\n return (\n <ResponsiveContainer width=\"100%\" height={180}>\n <PieChart>\n <Pie\n data={pieData}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={40}\n outerRadius={70}\n paddingAngle={2}\n dataKey=\"value\"\n label={({ name, percent }: { name: string; percent: number }) =>\n `${name} ${(percent * 100).toFixed(0)}%`\n }\n labelLine={false}\n >\n {pieData.map((_, idx) => (\n <Cell key={`cell-${idx}`} fill={CHART_PALETTE[idx % CHART_PALETTE.length]} />\n ))}\n </Pie>\n <Tooltip\n contentStyle={{ background: 'hsl(var(--card))', border: '1px solid hsl(var(--border))', fontSize: 11 }}\n />\n {series.length > 1 && (\n <Legend\n wrapperStyle={{ fontSize: 10 }}\n />\n )}\n {series.length === 1 && first.label_ar && language === 'ar' && first.label_ar !== first.label_en && (\n <Legend wrapperStyle={{ fontSize: 10 }} />\n )}\n </PieChart>\n </ResponsiveContainer>\n )\n}\nPieChartView.displayName = 'PieChartView'\n\n// ── Main export ───────────────────────────────────────────────────────────────\n\nexport interface ArtifactChartProps {\n data: A2UIChartData\n language?: 'en' | 'ar'\n dir?: 'ltr' | 'rtl'\n}\n\nconst ArtifactChart = ({ data, language = 'en' }: ArtifactChartProps) => {\n // ── Normalize both wire shapes ──────────────────────────────────────────────\n // The model (per the a2ui prompt) emits the SIMPLE Chart.js shape:\n // {labels:[\"A\",\"B\"], datasets:[{label:\"Series\", data:[1,2]}], type?:\"bar\"}\n // The rich shape is: {type, series:[{label_en, points:[{x,y}]}]}.\n const raw = data as unknown as {\n type?: string\n series?: A2UIChartSeries[]\n labels?: Array<string | number>\n datasets?: Array<{ label?: string; data?: number[] }>\n }\n const type = (raw.type === 'line' || raw.type === 'pie' ? raw.type : 'bar') as 'bar' | 'line' | 'pie'\n let series: A2UIChartSeries[] = Array.isArray(raw.series) ? raw.series : []\n if (series.length === 0 && Array.isArray(raw.datasets) && Array.isArray(raw.labels)) {\n const labels = raw.labels\n series = raw.datasets.map((ds, di) => ({\n label_en: ds.label ?? `Series ${di + 1}`,\n points: (ds.data ?? []).map((y, i) => ({ x: labels[i] ?? i, y })),\n }))\n }\n\n if (series.length === 0) {\n return (\n <p className=\"text-xs text-muted-foreground italic\">\n {language === 'ar' ? 'لا توجد بيانات' : 'No data'}\n </p>\n )\n }\n\n // recharts is LTR-native — always render chart internals in LTR and rely on\n // bilingual labels only for legend/tooltip text.\n return (\n <div className=\"w-full\" dir=\"ltr\">\n {type === 'bar' && <BarChartView series={series} language={language} />}\n {type === 'line' && <LineChartView series={series} language={language} />}\n {type === 'pie' && <PieChartView series={series} language={language} />}\n </div>\n )\n}\n\nArtifactChart.displayName = 'ArtifactChart'\n\nexport { ArtifactChart }\n","'use client'\n\n/**\n * ArtifactCard — renders an A2UI \"card\" artifact.\n *\n * Two layouts:\n * - **Rich** (intelligence card): a summary headline, a 2-column grid of metric\n * tiles (label + big value + icon, tone-color-coded green/red/neutral, optional\n * sparkline), a related-items list, and a footer recommendation. Used when the\n * payload carries `metrics`/`summary`.\n * - **Simple**: title + body + key/value fields. Backward-compatible fallback.\n *\n * Bilingual (title/summary/related/footer _en/_ar), RTL-safe (logical props),\n * token-themed for dark/light. displayName set (Rule 7).\n */\n\nimport * as React from 'react'\nimport {\n TrendingUp, Users, Clock, Crosshair, ShieldCheck, BarChart3,\n AlertTriangle, Check, Globe, Sparkles,\n} from 'lucide-react'\nimport { cn } from '../../../lib/utils'\nimport { SeverityChip } from '../../intel/SeverityChip'\nimport type { IntelSeverity } from '../../intel/types'\nimport type { A2UICardData, A2UICardMetric, A2UICardTone, A2UICardIcon } from './types'\n\nexport interface ArtifactCardProps {\n data: A2UICardData\n /** Outer artifact title (title_en / title_ar from the A2UIArtifact envelope). */\n artifactTitle?: string\n language?: 'en' | 'ar'\n dir?: 'ltr' | 'rtl'\n}\n\nconst ICONS: Record<A2UICardIcon, React.ElementType> = {\n trend: TrendingUp, users: Users, clock: Clock, source: Crosshair,\n shield: ShieldCheck, chart: BarChart3, alert: AlertTriangle, check: Check, globe: Globe,\n}\n\nconst TONE: Record<A2UICardTone, { tile: string; value: string; icon: string }> = {\n positive: { tile: 'border-success/30 bg-success/10', value: 'text-success', icon: 'text-success' },\n negative: { tile: 'border-destructive/30 bg-destructive/10', value: 'text-destructive', icon: 'text-destructive' },\n neutral: { tile: 'border-border bg-muted/40', value: 'text-foreground', icon: 'text-muted-foreground' },\n}\n\n// Tiny dependency-free sparkline.\nfunction Sparkline({ values, className }: { values: number[]; className?: string }) {\n if (!values || values.length < 2) return null\n const w = 56, h = 18\n const min = Math.min(...values), max = Math.max(...values)\n const span = max - min || 1\n const pts = values.map((v, i) => `${(i / (values.length - 1)) * w},${h - ((v - min) / span) * h}`).join(' ')\n return (\n <svg viewBox={`0 0 ${w} ${h}`} width={w} height={h} className={className} aria-hidden>\n <polyline points={pts} fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n )\n}\n\nfunction MetricTile({ m, language }: { m: A2UICardMetric; language: 'en' | 'ar' }) {\n const tone = TONE[m.tone ?? 'neutral']\n const Icon = m.icon ? ICONS[m.icon] : null\n const label = language === 'ar' && m.label_ar ? m.label_ar : m.label_en\n return (\n <div className={cn('flex items-start justify-between gap-2 rounded-lg border p-3', tone.tile)}>\n <span className=\"min-w-0\">\n <span className=\"block truncate text-[11px] text-muted-foreground\">{label}</span>\n <span className={cn('mt-0.5 block text-lg font-bold leading-tight', tone.value)}>{String(m.value)}</span>\n {m.trend && m.trend.length > 1 && <Sparkline values={m.trend} className={cn('mt-1', tone.icon)} />}\n </span>\n {Icon && <Icon className={cn('mt-0.5 h-4 w-4 shrink-0', tone.icon)} />}\n </div>\n )\n}\n\nconst ArtifactCard = ({ data, artifactTitle, language = 'en', dir }: ArtifactCardProps) => {\n const resolvedDir = dir ?? (language === 'ar' ? 'rtl' : 'ltr')\n const pick = (en?: string, ar?: string) => (language === 'ar' ? ar || en || '' : en || '')\n\n const cardTitle = pick(data.title_en, data.title_ar) || artifactTitle || ''\n const summary = pick(data.summary_en, data.summary_ar)\n const related = (language === 'ar' ? data.related_ar || data.related_en : data.related_en) || []\n const footer = pick(data.footer_en, data.footer_ar)\n const cardBody = pick(data.body_en, data.body_ar)\n\n const validSeverities: IntelSeverity[] = ['critical', 'high', 'medium', 'low']\n const severity: IntelSeverity | null =\n data.severity && validSeverities.includes(data.severity as IntelSeverity)\n ? (data.severity as IntelSeverity) : null\n\n const isRich = (data.metrics && data.metrics.length > 0) || !!summary || related.length > 0 || !!footer\n\n return (\n <div className=\"space-y-3 rounded-xl border border-border bg-card p-4 text-foreground\" dir={resolvedDir}>\n {/* Header */}\n {(cardTitle || severity) && (\n <div className=\"flex items-start justify-between gap-2\">\n {cardTitle && <p className=\"min-w-0 flex-1 text-sm font-semibold leading-snug\">{cardTitle}</p>}\n {severity && <SeverityChip severity={severity} language={language} className=\"mt-0.5 shrink-0\" />}\n </div>\n )}\n\n {isRich ? (\n <>\n {summary && <p className=\"text-sm leading-relaxed text-foreground/90\" dir=\"auto\">{summary}</p>}\n\n {data.metrics && data.metrics.length > 0 && (\n <div className=\"grid grid-cols-2 gap-2.5\">\n {data.metrics.map((m, i) => <MetricTile key={i} m={m} language={language} />)}\n </div>\n )}\n\n {related.length > 0 && (\n <ul className=\"space-y-1.5 border-t border-border/60 pt-3\">\n {related.map((r, i) => (\n <li key={i} className=\"flex items-start gap-2 text-xs text-muted-foreground\">\n <Sparkles className=\"mt-0.5 h-3.5 w-3.5 shrink-0 text-primary/70\" />\n <span className=\"min-w-0\" dir=\"auto\">{r}</span>\n </li>\n ))}\n </ul>\n )}\n\n {footer && (\n <div className=\"flex items-start gap-2 border-t border-border/60 pt-3 text-xs font-medium text-success\">\n <Sparkles className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span className=\"min-w-0\" dir=\"auto\">{footer}</span>\n </div>\n )}\n </>\n ) : (\n <>\n {cardBody && <p className=\"text-xs leading-relaxed text-muted-foreground\" dir=\"auto\">{cardBody}</p>}\n {data.fields && data.fields.length > 0 && (\n <dl className=\"space-y-1 border-t border-border/50 pt-2\">\n {data.fields.map((field, i) => (\n <div key={i} className=\"flex items-start gap-2 text-xs\">\n <dt className=\"min-w-[6rem] max-w-[8rem] shrink-0 truncate font-medium text-muted-foreground\">{field.label}</dt>\n <dd className=\"min-w-0 flex-1 break-words text-foreground\" dir=\"auto\">{String(field.value)}</dd>\n </div>\n ))}\n </dl>\n )}\n </>\n )}\n </div>\n )\n}\n\nArtifactCard.displayName = 'ArtifactCard'\n\nexport { ArtifactCard }\n","'use client'\n\n/**\n * SeverityChip — severity badge + optional scope tag used in IntelCard.\n *\n * Design:\n * Severity dot + label badge (left). Scope tag separate chip (right) when\n * scopeName is provided — keeps both readable and untruncated.\n *\n * Tokens (semantic only — no hex):\n * critical / high → destructive family\n * medium → alert-amber family\n * low → success family\n * scope tag → muted/foreground (neutral)\n *\n * RTL: uses logical props (ms-* / me-*). Pure, no side-effects, no context.\n */\n\nimport { cn } from '../../lib/utils'\nimport type { IntelSeverity } from './types'\n\nconst SEVERITY_LABELS: Record<IntelSeverity, { en: string; ar: string }> = {\n critical: { en: 'Critical', ar: 'حرج' },\n high: { en: 'High', ar: 'مرتفع' },\n medium: { en: 'Medium', ar: 'متوسط' },\n low: { en: 'Low', ar: 'منخفض' },\n}\n\n/** Dot color — a filled circle indicator inside the badge */\nconst SEVERITY_DOT: Record<IntelSeverity, string> = {\n critical: 'bg-destructive',\n high: 'bg-destructive/70',\n medium: 'bg-amber-400',\n low: 'bg-green-500',\n}\n\n/** Badge background + text + border using only semantic Tailwind tokens */\nconst SEVERITY_BADGE: Record<IntelSeverity, string> = {\n critical: 'bg-destructive/10 text-destructive border-destructive/25',\n high: 'bg-destructive/8 text-destructive border-destructive/18',\n medium: 'bg-amber-400/10 text-amber-600 border-amber-400/25 dark:text-amber-400',\n low: 'bg-green-500/10 text-green-700 border-green-500/25 dark:text-green-400',\n}\n\n/** @deprecated — kept for consumers that read SEVERITY_CLASSES directly */\nconst SEVERITY_CLASSES = SEVERITY_BADGE\n\nexport interface SeverityChipProps {\n severity: IntelSeverity\n /** Scope/region name shown as a neutral secondary tag beside the badge */\n scopeName?: string\n language?: 'en' | 'ar'\n className?: string\n}\n\nconst SeverityChip = ({ severity, scopeName, language = 'en', className }: SeverityChipProps) => {\n const label = language === 'ar' ? SEVERITY_LABELS[severity].ar : SEVERITY_LABELS[severity].en\n\n return (\n <span\n className={cn('inline-flex items-center gap-2 flex-wrap', className)}\n aria-label={`${label}${scopeName ? ` · ${scopeName}` : ''}`}\n >\n {/* Severity badge: dot + label */}\n <span\n className={cn(\n 'inline-flex items-center gap-1 rounded-md border px-1.5 py-0.5 text-[10px] font-semibold leading-none tracking-wide uppercase',\n SEVERITY_BADGE[severity],\n )}\n aria-hidden=\"true\"\n >\n <span\n className={cn('size-1.5 rounded-full shrink-0', SEVERITY_DOT[severity])}\n aria-hidden=\"true\"\n />\n {label}\n </span>\n\n {/* Scope tag — neutral, separate chip so it never gets truncated */}\n {scopeName && (\n <span\n className=\"inline-flex items-center rounded-md border border-border/60 bg-muted/40 px-1.5 py-0.5 text-[10px] font-medium leading-none text-muted-foreground\"\n aria-hidden=\"true\"\n >\n {scopeName}\n </span>\n )}\n </span>\n )\n}\nSeverityChip.displayName = 'SeverityChip'\n\nexport { SeverityChip, SEVERITY_LABELS, SEVERITY_CLASSES }\n","'use client'\n\n/**\n * ArtifactActions — renders an A2UI \"actions\" artifact as a set of action chips.\n *\n * Clicking a chip fires onAction(item). The parent (UnifiedCopilotDock) wires\n * onAction to send item.prompt (when set) as a new user message — the standard\n * copilot send path. Bilingual labels. RTL-safe.\n *\n * Rules: Rule 7 (displayName), Rule 8 (bilingual/RTL), Rule 16 (Sentra style).\n */\n\nimport type { A2UIActionItem, A2UIActionsData } from './types'\n\nexport interface ArtifactActionsProps {\n data: A2UIActionsData\n /** Called when the user clicks an action chip. */\n onAction?: (item: A2UIActionItem) => void\n language?: 'en' | 'ar'\n dir?: 'ltr' | 'rtl'\n}\n\nconst ArtifactActions = ({ data, onAction, language = 'en', dir }: ArtifactActionsProps) => {\n const resolvedDir = dir ?? (language === 'ar' ? 'rtl' : 'ltr')\n\n if (!data.items || data.items.length === 0) {\n return null\n }\n\n const handleClick = (item: A2UIActionItem) => {\n onAction?.(item)\n }\n\n return (\n <div\n className=\"flex flex-wrap gap-2\"\n dir={resolvedDir}\n role=\"group\"\n aria-label={language === 'ar' ? 'إجراءات مقترحة' : 'Suggested actions'}\n >\n {data.items.map(item => {\n const label = language === 'ar' && item.label_ar ? item.label_ar : item.label_en\n return (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => handleClick(item)}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-primary/30 bg-primary/10 px-3 py-1.5 text-xs font-medium text-primary hover:bg-primary/20 hover:border-primary/50 transition-colors duration-fast ease-standard focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1\"\n aria-label={label}\n >\n {label}\n </button>\n )\n })}\n </div>\n )\n}\n\nArtifactActions.displayName = 'ArtifactActions'\n\nexport { ArtifactActions }\n","\"use client\";\n\nimport * as React from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport remarkGfm from \"remark-gfm\";\nimport rehypeHighlight from \"rehype-highlight\";\nimport { Copy, Check, ImageDown } from \"lucide-react\";\nimport type { ColumnDef } from \"@tanstack/react-table\";\nimport { cn } from \"../../lib/utils\";\nimport { DataTable } from \"../data-table/DataTable\";\n\nexport interface MarkdownRendererProps {\n content: string;\n language?: \"en\" | \"ar\";\n className?: string;\n}\n\n// ── Markdown table → kit DataTable (sortable + CSV export) ──────────────────────\nfunction hastText(node: any): string {\n if (!node) return \"\";\n if (node.type === \"text\") return node.value ?? \"\";\n if (Array.isArray(node.children)) return node.children.map(hastText).join(\"\");\n return \"\";\n}\nfunction parseTable(node: any): { headers: string[]; rows: string[][] } {\n const kids = node?.children ?? [];\n const thead = kids.find((c: any) => c.tagName === \"thead\");\n const tbody = kids.find((c: any) => c.tagName === \"tbody\");\n const hRow = (thead?.children ?? []).find((c: any) => c.tagName === \"tr\");\n const headers = (hRow?.children ?? []).filter((c: any) => c.tagName === \"th\").map((c: any) => hastText(c).trim());\n const rows = (tbody?.children ?? []).filter((c: any) => c.tagName === \"tr\").map((tr: any) =>\n (tr.children ?? []).filter((c: any) => c.tagName === \"td\").map((c: any) => hastText(c).trim()));\n return { headers, rows };\n}\n\n/** MarkdownTable — renders a GFM table via the kit's DataTable (sortable, searchable,\n * CSV export). Exported so apps can reuse the markdown-table → DataTable mapping. */\nexport function MarkdownTable({ node, language = \"en\" }: { node: any; language?: \"en\" | \"ar\" }) {\n const { headers, rows } = React.useMemo(() => parseTable(node), [node]);\n if (!headers.length) {\n return <div className=\"my-3 overflow-x-auto rounded-lg border border-border\"><table className=\"w-full text-start text-sm\" /></div>;\n }\n const columns: ColumnDef<Record<string, string>>[] = headers.map((h, i) => ({\n accessorKey: `c${i}`,\n header: h,\n meta: { header_en: h, header_ar: h },\n }));\n const data = rows.map((r, i) => {\n const o: Record<string, string> = { _id: String(i) };\n r.forEach((c, j) => { o[`c${j}`] = c; });\n return o;\n });\n return (\n <div className=\"my-3\">\n <DataTable\n columns={columns}\n data={data}\n getRowId={(r) => (r as { _id: string })._id}\n language={language}\n showGlobalSearch={rows.length > 8}\n showCsvExport\n showDensityToggle={false}\n pageSize={rows.length > 25 ? 25 : 1000}\n />\n </div>\n );\n}\n\n// ── Code block — styled header + copy + PNG export ──────────────────────────────\n/** CodeBlock — a fenced code block with a language label, Copy, and download-as-PNG.\n * Exported so apps can render standalone code with the same chrome. */\nexport function CodeBlock({ lang, children }: { lang?: string; children?: React.ReactNode }) {\n const boxRef = React.useRef<HTMLDivElement>(null);\n const codeRef = React.useRef<HTMLElement>(null);\n const [copied, setCopied] = React.useState(false);\n\n const copy = () => {\n const text = codeRef.current?.textContent ?? \"\";\n navigator.clipboard?.writeText(text).then(() => { setCopied(true); setTimeout(() => setCopied(false), 1400); });\n };\n const downloadPng = async () => {\n if (!boxRef.current) return;\n const { toPng } = await import(\"html-to-image\");\n const bg = getComputedStyle(boxRef.current).backgroundColor;\n const url = await toPng(boxRef.current, { pixelRatio: 2, backgroundColor: bg });\n const a = document.createElement(\"a\");\n a.href = url; a.download = `code.${lang || \"txt\"}.png`; a.click();\n };\n\n return (\n <div className=\"my-3 overflow-hidden rounded-lg border border-border\">\n <div className=\"flex items-center justify-between border-b border-border bg-muted/60 px-3 py-1.5\">\n <span className=\"font-mono text-xs text-muted-foreground\">{lang || \"code\"}</span>\n <span className=\"flex items-center gap-1\">\n <button onClick={copy} className=\"flex items-center gap-1 rounded px-1.5 py-0.5 text-xs text-muted-foreground transition hover:bg-accent hover:text-foreground\">\n {copied ? <Check className=\"h-3 w-3\" /> : <Copy className=\"h-3 w-3\" />}{copied ? \"Copied\" : \"Copy\"}\n </button>\n <button onClick={downloadPng} aria-label=\"Download as PNG\" className=\"flex items-center gap-1 rounded px-1.5 py-0.5 text-xs text-muted-foreground transition hover:bg-accent hover:text-foreground\">\n <ImageDown className=\"h-3 w-3\" />PNG\n </button>\n </span>\n </div>\n <div ref={boxRef} className=\"bg-muted/40 p-3\">\n <pre dir=\"ltr\" className=\"overflow-x-auto text-[0.8rem] leading-relaxed [&>code]:bg-transparent [&>code]:p-0\">\n <code ref={codeRef} className={cn(\"hljs\", lang && `language-${lang}`)}>{children}</code>\n </pre>\n </div>\n </div>\n );\n}\n\n// ── Mermaid diagram block (rendered client-side, lazily) ────────────────────────\nlet _mermaidPromise: Promise<typeof import(\"mermaid\").default> | null = null;\nfunction loadMermaid() {\n if (!_mermaidPromise) {\n _mermaidPromise = import(\"mermaid\").then((m) => {\n m.default.initialize({ startOnLoad: false, securityLevel: \"strict\", theme: \"neutral\" });\n return m.default;\n });\n }\n return _mermaidPromise;\n}\n\nlet _mermaidSeq = 0;\nfunction MermaidBlock({ code }: { code: string }) {\n const ref = React.useRef<HTMLDivElement>(null);\n const [error, setError] = React.useState<string | null>(null);\n React.useEffect(() => {\n let cancelled = false;\n loadMermaid()\n .then(async (mermaid) => {\n const id = `tg-mermaid-${++_mermaidSeq}`;\n const { svg } = await mermaid.render(id, code);\n if (!cancelled && ref.current) ref.current.innerHTML = svg;\n })\n .catch((e) => !cancelled && setError(String(e?.message || e)));\n return () => { cancelled = true; };\n }, [code]);\n if (error) {\n return (\n <pre className=\"overflow-auto rounded-lg border border-destructive/40 bg-destructive/10 p-3 text-xs text-destructive\">\n Mermaid error: {error}\n {\"\\n\\n\"}{code}\n </pre>\n );\n }\n return <div ref={ref} className=\"my-3 flex justify-center overflow-x-auto rounded-lg border border-border bg-card p-3\" />;\n}\n\n/** MarkdownRenderer — GFM markdown with highlighted code, mermaid diagrams, and\n * token-themed prose (headings/lists/tables/code/quote/links). RTL-aware. */\nexport function MarkdownRenderer({ content, language = \"en\", className }: MarkdownRendererProps) {\n const isRTL = language === \"ar\";\n return (\n <div dir={isRTL ? \"rtl\" : \"ltr\"} className={cn(\"tg-md text-sm leading-relaxed text-foreground\", className)}>\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[[rehypeHighlight, { detect: true, ignoreMissing: true }]]}\n components={{\n h1: (p) => <h1 className=\"mb-3 mt-5 text-2xl font-bold\" {...p} />,\n h2: (p) => <h2 className=\"mb-2 mt-5 border-b border-border pb-1 text-xl font-semibold\" {...p} />,\n h3: (p) => <h3 className=\"mb-2 mt-4 text-lg font-semibold\" {...p} />,\n p: (p) => <p className=\"my-2.5\" {...p} />,\n a: (p) => <a className=\"font-medium text-primary underline-offset-2 hover:underline\" {...p} />,\n ul: (p) => <ul className=\"my-2.5 list-disc space-y-1 ps-6\" {...p} />,\n ol: (p) => <ol className=\"my-2.5 list-decimal space-y-1 ps-6\" {...p} />,\n li: (p) => <li className=\"marker:text-muted-foreground\" {...p} />,\n blockquote: (p) => <blockquote className=\"my-3 border-s-4 border-primary/40 ps-4 text-muted-foreground\" {...p} />,\n hr: () => <hr className=\"my-5 border-border\" />,\n // GFM tables render through the kit DataTable (sortable + CSV export).\n table: (p: any) => <MarkdownTable node={p.node} language={language} />,\n code(props) {\n const { children, className: cls, node, ...rest } = props as any;\n const text = String(children ?? \"\");\n const lang = /language-(\\w+)/.exec(cls || \"\")?.[1];\n const inline = !node || node.position?.start.line === node.position?.end.line;\n if (lang === \"mermaid\") return <MermaidBlock code={text.replace(/\\n$/, \"\")} />;\n if (inline && !cls) return <code className=\"rounded bg-muted px-1.5 py-0.5 font-mono text-[0.85em] text-foreground\" {...rest}>{children}</code>;\n // Block code → styled CodeBlock (copy + PNG export). pre passes through.\n return <CodeBlock lang={lang}>{children}</CodeBlock>;\n },\n pre: (p: any) => <>{p.children}</>,\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n}\n","'use client'\n\nimport { MarkdownRenderer } from '../markdown/MarkdownRenderer'\nimport { cn } from '../../lib/utils'\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\nexport interface MarkdownContentProps {\n /** Markdown source — typically an assistant chat message. */\n content: string\n /** Text direction. RTL maps to the Arabic locale of the renderer. Default 'ltr'. */\n dir?: 'ltr' | 'rtl'\n /** Extra classes merged onto the wrapper. */\n className?: string\n}\n\n// ── Component ──────────────────────────────────────────────────────────────────\n\n/**\n * MarkdownContent — shared markdown renderer for assistant chat messages\n * (copilot dock, chat thread, project chat).\n *\n * Delegates to the kit's `MarkdownRenderer`, so a full assistant reply parses\n * over the SAME rich pipeline as standalone markdown: GFM tables render through\n * the sortable **DataTable** (with CSV export), fenced code blocks become the\n * **CodeBlock** (copy + PNG export, syntax-highlighted), ```mermaid fences render\n * as diagrams. Raw HTML is not rendered (no rehype-raw). Artifacts (a2ui blocks)\n * are stripped by the provider and rendered separately, so an assistant turn\n * shows BOTH its markdown text and its artifacts.\n */\nconst MarkdownContent = ({ content, dir = 'ltr', className }: MarkdownContentProps) => (\n <MarkdownRenderer\n content={content}\n language={dir === 'rtl' ? 'ar' : 'en'}\n className={cn('text-sm [&>*:first-child]:mt-0 [&>*:last-child]:mb-0', className)}\n />\n)\n\nMarkdownContent.displayName = 'MarkdownContent'\n\nexport default MarkdownContent\n","'use client'\n\n/**\n * ArtifactMarkdown — renders an A2UI \"markdown\" artifact.\n *\n * Reuses the existing MarkdownContent component — no duplication.\n * Bilingual dir attribute passed through.\n *\n * Rules: Rule 7 (displayName), Rule 8 (RTL), Rule 16 (Sentra style).\n */\n\nimport MarkdownContent from '../../chat/MarkdownContent'\nimport type { A2UIMarkdownData } from './types'\n\nexport interface ArtifactMarkdownProps {\n data: A2UIMarkdownData\n language?: 'en' | 'ar'\n dir?: 'ltr' | 'rtl'\n}\n\nconst ArtifactMarkdown = ({ data, language = 'en', dir }: ArtifactMarkdownProps) => {\n const resolvedDir = dir ?? (language === 'ar' ? 'rtl' : 'ltr')\n\n if (!data.content) {\n return null\n }\n\n return (\n <div className=\"rounded-md bg-muted/30 border border-border/60 p-3\" dir={resolvedDir}>\n <MarkdownContent content={data.content} dir={resolvedDir} />\n </div>\n )\n}\n\nArtifactMarkdown.displayName = 'ArtifactMarkdown'\n\nexport { ArtifactMarkdown }\n","'use client'\n\n/**\n * ArtifactClientCandidates — renders a \"client_candidates\" artifact.\n *\n * Displays a list of candidate clients returned by the discovery tool. Each\n * card is fully clickable and posts a structured ArtifactInteraction of kind\n * \"select_candidate\" with the chosen candidate's data.\n *\n * Rules: Rule 7 (displayName), Rule 8 (bilingual/RTL), Rule 16 (Sentra style),\n * Rule 25 (product-agnostic — no context reads, no fetching).\n */\n\nimport type { A2UIClientCandidatesData, A2UIClientCandidate, ArtifactInteraction } from './types'\n\nexport interface ArtifactClientCandidatesProps {\n data: A2UIClientCandidatesData\n /** Fired when the user selects a candidate. Carries a \"select_candidate\" interaction. */\n onInteract?: (interaction: ArtifactInteraction) => void\n language?: 'en' | 'ar'\n dir?: 'ltr' | 'rtl'\n}\n\nconst ArtifactClientCandidates = ({\n data,\n onInteract,\n language = 'en',\n dir,\n}: ArtifactClientCandidatesProps) => {\n const resolvedDir = dir ?? (language === 'ar' ? 'rtl' : 'ltr')\n\n if (!data.candidates || data.candidates.length === 0) return null\n\n const handleSelect = (candidate: A2UIClientCandidate) => {\n const payload: Record<string, unknown> = { name: candidate.name }\n if (candidate.website_url) payload.website_url = candidate.website_url\n if (candidate.sector) payload.sector = candidate.sector\n onInteract?.({ kind: 'select_candidate', payload })\n }\n\n const chooseLabel = language === 'ar' ? 'اختر هذا العميل' : 'Select this client'\n\n return (\n <div\n className=\"space-y-2\"\n dir={resolvedDir}\n role=\"list\"\n aria-label={language === 'ar' ? 'عملاء مرشحون' : 'Candidate clients'}\n >\n {data.prompt && (\n <p className=\"text-xs text-muted-foreground mb-2\" dir=\"auto\">\n {data.prompt}\n </p>\n )}\n\n {data.candidates.map((candidate, idx) => (\n <button\n key={idx}\n type=\"button\"\n role=\"listitem\"\n onClick={() => handleSelect(candidate)}\n className=\"w-full text-start rounded-lg border border-border bg-card hover:bg-accent/50 hover:border-primary/40 px-3 py-2.5 transition-colors duration-fast ease-standard focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1\"\n aria-label={`${chooseLabel}: ${candidate.name}`}\n >\n <p className=\"text-sm font-semibold text-foreground leading-snug\">\n {candidate.name}\n </p>\n\n {candidate.website_url && (\n <p className=\"text-xs text-muted-foreground mt-0.5 truncate\">\n {candidate.website_url}\n </p>\n )}\n\n {candidate.sector && (\n <span className=\"mt-1 inline-block text-[10px] px-1.5 py-0.5 rounded-full bg-primary/10 text-primary font-medium\">\n {candidate.sector}\n </span>\n )}\n\n {candidate.summary && (\n <p className=\"text-xs text-foreground/70 mt-1.5 line-clamp-2 leading-relaxed\" dir=\"auto\">\n {candidate.summary}\n </p>\n )}\n </button>\n ))}\n </div>\n )\n}\n\nArtifactClientCandidates.displayName = 'ArtifactClientCandidates'\n\nexport { ArtifactClientCandidates }\n","'use client'\n\n/**\n * ArtifactClientFieldPicker — renders a \"client_field_picker\" artifact.\n *\n * Displays a list of client profile fields that the user can individually\n * toggle on/off before confirming. Posts a \"pick_fields\" ArtifactInteraction\n * with the array of selected field keys.\n *\n * Rules: Rule 7 (displayName), Rule 8 (bilingual/RTL), Rule 16 (Sentra style),\n * Rule 25 (product-agnostic — no context reads, no fetching).\n */\n\nimport { useState } from 'react'\nimport type { A2UIClientFieldPickerData, ArtifactInteraction } from './types'\n\nexport interface ArtifactClientFieldPickerProps {\n data: A2UIClientFieldPickerData\n /** Fired when the user confirms the selected fields. Carries a \"pick_fields\" interaction. */\n onInteract?: (interaction: ArtifactInteraction) => void\n language?: 'en' | 'ar'\n dir?: 'ltr' | 'rtl'\n}\n\nconst ArtifactClientFieldPicker = ({\n data,\n onInteract,\n language = 'en',\n dir,\n}: ArtifactClientFieldPickerProps) => {\n const resolvedDir = dir ?? (language === 'ar' ? 'rtl' : 'ltr')\n\n // All fields selected by default\n const [selected, setSelected] = useState<Set<string>>(\n new Set((data.fields ?? []).map(f => f.key)),\n )\n\n if (!data.fields || data.fields.length === 0) return null\n\n const handleToggle = (key: string) => {\n setSelected(prev => {\n const next = new Set(prev)\n if (next.has(key)) next.delete(key)\n else next.add(key)\n return next\n })\n }\n\n const handleConfirm = () => {\n const fields = data.fields.filter(f => selected.has(f.key)).map(f => f.key)\n onInteract?.({ kind: 'pick_fields', payload: { fields } })\n }\n\n const confirmLabel = language === 'ar' ? 'تأكيد الحقول المختارة' : 'Confirm selected fields'\n const currentLabel = language === 'ar' ? 'الحالي:' : 'Current:'\n const suggestedLabel = language === 'ar' ? 'مقترح:' : 'Suggested:'\n\n return (\n <div className=\"space-y-1.5\" dir={resolvedDir}>\n {data.fields.map(field => {\n const label = language === 'ar' && field.label_ar ? field.label_ar : field.label_en\n const isChecked = selected.has(field.key)\n\n return (\n <button\n key={field.key}\n type=\"button\"\n onClick={() => handleToggle(field.key)}\n aria-pressed={isChecked}\n className={`w-full text-start rounded-lg border px-3 py-2 transition-colors duration-fast ease-standard focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1 ${\n isChecked\n ? 'border-primary/40 bg-primary/5'\n : 'border-border bg-card hover:bg-muted/40'\n }`}\n >\n <div className=\"flex items-start gap-2.5\">\n {/* Checkbox indicator */}\n <span\n className={`mt-0.5 w-4 h-4 rounded shrink-0 flex items-center justify-center border transition-colors duration-fast ease-standard ${\n isChecked\n ? 'bg-primary border-primary'\n : 'border-border bg-background'\n }`}\n aria-hidden=\"true\"\n >\n {isChecked && (\n <svg\n className=\"w-2.5 h-2.5 text-primary-foreground\"\n fill=\"none\"\n viewBox=\"0 0 12 12\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M2 6l3 3 5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs font-medium text-foreground leading-snug\">\n {label}\n </p>\n\n {field.current && (\n <p className=\"text-[10px] text-muted-foreground mt-0.5 truncate\">\n <span className=\"font-medium\">{currentLabel}</span>{' '}\n {field.current}\n </p>\n )}\n\n {field.suggested && (\n <p className=\"text-[10px] text-primary mt-0.5 truncate\">\n <span className=\"font-medium\">{suggestedLabel}</span>{' '}\n {field.suggested}\n </p>\n )}\n </div>\n </div>\n </button>\n )\n })}\n\n <button\n type=\"button\"\n onClick={handleConfirm}\n disabled={selected.size === 0}\n className=\"mt-2 w-full rounded-lg bg-primary px-3 py-2 text-xs font-semibold text-primary-foreground hover:bg-primary/90 disabled:opacity-50 disabled:cursor-not-allowed transition-colors duration-fast ease-standard focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1\"\n >\n {confirmLabel}\n </button>\n </div>\n )\n}\n\nArtifactClientFieldPicker.displayName = 'ArtifactClientFieldPicker'\n\nexport { ArtifactClientFieldPicker }\n","'use client'\n\n/**\n * ArtifactClientDiffConfirm — renders a \"client_diff_confirm\" artifact.\n *\n * Displays a two-column before/after diff table the user must confirm before\n * the save is committed. Posts a \"confirm_diff\" ArtifactInteraction with\n * { confirmed: true } or { confirmed: false }.\n *\n * Rules: Rule 7 (displayName), Rule 8 (bilingual/RTL), Rule 16 (Sentra style),\n * Rule 25 (product-agnostic — no context reads, no fetching).\n */\n\nimport type { A2UIClientDiffConfirmData, ArtifactInteraction } from './types'\n\nexport interface ArtifactClientDiffConfirmProps {\n data: A2UIClientDiffConfirmData\n /** Fired when the user confirms or cancels the diff. Carries a \"confirm_diff\" interaction. */\n onInteract?: (interaction: ArtifactInteraction) => void\n language?: 'en' | 'ar'\n dir?: 'ltr' | 'rtl'\n}\n\nconst ArtifactClientDiffConfirm = ({\n data,\n onInteract,\n language = 'en',\n dir,\n}: ArtifactClientDiffConfirmProps) => {\n const resolvedDir = dir ?? (language === 'ar' ? 'rtl' : 'ltr')\n\n if (!data.rows || data.rows.length === 0) return null\n\n const title =\n language === 'ar' && data.title_ar ? data.title_ar : data.title_en\n const confirmLabel =\n language === 'ar' && data.confirm_label_ar\n ? data.confirm_label_ar\n : data.confirm_label_en\n const cancelLabel = language === 'ar' ? 'إلغاء' : 'Cancel'\n const oldColLabel = language === 'ar' ? 'القديم' : 'Before'\n const newColLabel = language === 'ar' ? 'الجديد' : 'After'\n\n const handleConfirm = () => {\n onInteract?.({ kind: 'confirm_diff', payload: { confirmed: true } })\n }\n\n const handleCancel = () => {\n onInteract?.({ kind: 'confirm_diff', payload: { confirmed: false } })\n }\n\n return (\n <div\n className=\"rounded-lg border border-border bg-card overflow-hidden\"\n dir={resolvedDir}\n >\n {/* Title bar */}\n {title && (\n <div className=\"px-3 py-2 border-b border-border bg-muted/40\">\n <p className=\"text-xs font-semibold text-foreground\" dir=\"auto\">\n {title}\n </p>\n </div>\n )}\n\n {/* Diff rows */}\n <div className=\"divide-y divide-border\">\n {/* Column headers */}\n <div className=\"grid grid-cols-[1fr_1fr_1fr] gap-2 px-3 py-1.5 bg-muted/20 text-[10px] font-semibold text-muted-foreground uppercase tracking-wide\">\n <span>{language === 'ar' ? 'الحقل' : 'Field'}</span>\n <span>{oldColLabel}</span>\n <span className=\"text-success\">{newColLabel}</span>\n </div>\n\n {data.rows.map(row => {\n const label = language === 'ar' && row.label_ar ? row.label_ar : row.label_en\n return (\n <div\n key={row.field}\n className=\"grid grid-cols-[1fr_1fr_1fr] gap-2 items-start px-3 py-2 text-xs\"\n >\n <span className=\"text-muted-foreground font-medium leading-snug\">\n {label}\n </span>\n <span\n className=\"text-foreground/50 line-through truncate leading-snug\"\n aria-label={oldColLabel}\n >\n {row.old !== undefined && row.old !== '' ? row.old : '—'}\n </span>\n <span\n className=\"text-success font-medium truncate leading-snug\"\n aria-label={newColLabel}\n >\n {row.new}\n </span>\n </div>\n )\n })}\n </div>\n\n {/* Action buttons */}\n <div\n className=\"px-3 py-2.5 border-t border-border bg-muted/20 flex items-center gap-2 justify-end\"\n dir={resolvedDir}\n >\n <button\n type=\"button\"\n onClick={handleCancel}\n className=\"rounded-md border border-border bg-transparent px-3 py-1.5 text-xs font-medium text-muted-foreground hover:bg-muted transition-colors duration-fast ease-standard focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1\"\n >\n {cancelLabel}\n </button>\n <button\n type=\"button\"\n onClick={handleConfirm}\n className=\"rounded-md bg-primary px-3 py-1.5 text-xs font-semibold text-primary-foreground hover:bg-primary/90 transition-colors duration-fast ease-standard focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1\"\n >\n {confirmLabel}\n </button>\n </div>\n </div>\n )\n}\n\nArtifactClientDiffConfirm.displayName = 'ArtifactClientDiffConfirm'\n\nexport { ArtifactClientDiffConfirm }\n","'use client'\n\n/**\n * ArtifactPersonaStarters — renders a \"persona_starters\" artifact.\n *\n * Displays suggested opening questions for a persona chat as pill chips.\n * Clicking a chip fires onInteract with kind \"persona_start\" and the chip's\n * prompt — the provider sends it as the first message of the conversation.\n *\n * Mirrors ArtifactActions visually (same chip style) but posts a structured\n * ArtifactInteraction instead of a plain onAction callback.\n *\n * Rules: Rule 7 (displayName), Rule 8 (bilingual/RTL), Rule 16 (Sentra style),\n * Rule 25 (product-agnostic — no context reads, no fetching).\n */\n\nimport type { A2UIPersonaStartersData, ArtifactInteraction } from './types'\n\nexport interface ArtifactPersonaStartersProps {\n data: A2UIPersonaStartersData\n /** Fired when the user clicks a starter chip. Carries a \"persona_start\" interaction. */\n onInteract?: (interaction: ArtifactInteraction) => void\n language?: 'en' | 'ar'\n dir?: 'ltr' | 'rtl'\n}\n\nconst ArtifactPersonaStarters = ({\n data,\n onInteract,\n language = 'en',\n dir,\n}: ArtifactPersonaStartersProps) => {\n const resolvedDir = dir ?? (language === 'ar' ? 'rtl' : 'ltr')\n\n if (!data.starters || data.starters.length === 0) return null\n\n const handleClick = (prompt: string) => {\n onInteract?.({ kind: 'persona_start', payload: { prompt } })\n }\n\n return (\n <div\n className=\"flex flex-wrap gap-2\"\n dir={resolvedDir}\n role=\"group\"\n aria-label={language === 'ar' ? 'أسئلة افتتاحية مقترحة' : 'Suggested opening questions'}\n >\n {data.starters.map((starter, idx) => {\n const label =\n language === 'ar' && starter.label_ar\n ? starter.label_ar\n : starter.label_en\n\n return (\n <button\n key={idx}\n type=\"button\"\n onClick={() => handleClick(starter.prompt)}\n className=\"inline-flex items-center gap-1.5 rounded-full border border-primary/30 bg-primary/10 px-3 py-1.5 text-xs font-medium text-primary hover:bg-primary/20 hover:border-primary/50 transition-colors duration-fast ease-standard focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-1\"\n aria-label={label}\n >\n {label}\n </button>\n )\n })}\n </div>\n )\n}\n\nArtifactPersonaStarters.displayName = 'ArtifactPersonaStarters'\n\nexport { ArtifactPersonaStarters }\n","'use client'\n\n/**\n * ArtifactRenderer — top-level dispatcher for A2UI artifacts.\n *\n * Switches on artifact.kind and delegates to the appropriate per-kind renderer.\n * Unknown kinds render a labeled JSON <details> block — forward-compatible for\n * future server kinds without a client upgrade.\n *\n * Each artifact is wrapped in a titled card shell so all kinds share a consistent\n * heading layout (title_en / title_ar from the artifact envelope). Per-kind\n * renderers focus purely on their data — they don't re-render the title.\n *\n * Props:\n * artifact — A2UIArtifact from the SSE stream\n * onAction — fired when an \"actions\" artifact chip is clicked; passes\n * the A2UIActionItem. CopilotProvider wires this to send\n * item.prompt as a new user message via the standard send path.\n * language — 'en' | 'ar'\n * dir — 'ltr' | 'rtl' (inferred from language when omitted)\n *\n * Rules: Rule 7 (displayName), Rule 8 (bilingual/RTL), Rule 16 (Sentra style),\n * Rule 25 (product-agnostic — no context reads, no fetching).\n */\n\nimport { ArtifactTable } from './ArtifactTable'\nimport { ArtifactChart } from './ArtifactChart'\nimport { ArtifactCard } from './ArtifactCard'\nimport { ArtifactActions } from './ArtifactActions'\nimport { ArtifactMarkdown } from './ArtifactMarkdown'\nimport { ArtifactClientCandidates } from './ArtifactClientCandidates'\nimport { ArtifactClientFieldPicker } from './ArtifactClientFieldPicker'\nimport { ArtifactClientDiffConfirm } from './ArtifactClientDiffConfirm'\nimport { ArtifactPersonaStarters } from './ArtifactPersonaStarters'\nimport type {\n A2UIArtifact,\n A2UIActionItem,\n ArtifactInteraction,\n A2UITableData,\n A2UIChartData,\n A2UICardData,\n A2UIActionsData,\n A2UIMarkdownData,\n A2UIClientCandidatesData,\n A2UIClientFieldPickerData,\n A2UIClientDiffConfirmData,\n A2UIPersonaStartersData,\n} from './types'\n\nexport interface ArtifactRendererProps {\n artifact: A2UIArtifact\n /** Fired when the user clicks an \"actions\" chip — sends item.prompt as a text message. */\n onAction?: (item: A2UIActionItem) => void\n /**\n * Fired when an interactive artifact (client_candidates, client_field_picker,\n * client_diff_confirm, persona_starters) posts a structured interaction.\n * CopilotProvider wires this to handleArtifactInteract which forwards the\n * interaction to the dispatch request and suppresses the user bubble.\n */\n onInteract?: (interaction: ArtifactInteraction) => void\n language?: 'en' | 'ar'\n dir?: 'ltr' | 'rtl'\n}\n\n// ── Fallback for unknown kinds ─────────────────────────────────────────────────\n\ninterface UnknownArtifactProps {\n artifact: A2UIArtifact\n language: 'en' | 'ar'\n}\n\nconst UnknownArtifact = ({ artifact, language }: UnknownArtifactProps) => (\n <details className=\"rounded-md border border-dashed border-border bg-muted/30 p-3 text-xs\">\n <summary className=\"cursor-pointer text-muted-foreground font-medium select-none\">\n {language === 'ar'\n ? `عنصر غير معروف: ${artifact.kind}`\n : `Unknown artifact kind: ${artifact.kind}`}\n </summary>\n <pre className=\"mt-2 text-foreground/70 overflow-auto max-h-48 whitespace-pre-wrap break-all\">\n {JSON.stringify(artifact.data, null, 2)}\n </pre>\n </details>\n)\nUnknownArtifact.displayName = 'UnknownArtifact'\n\n// ── Main renderer ─────────────────────────────────────────────────────────────\n\nconst ArtifactRenderer = ({\n artifact,\n onAction,\n onInteract,\n language = 'en',\n dir,\n}: ArtifactRendererProps) => {\n const resolvedDir = dir ?? (language === 'ar' ? 'rtl' : 'ltr')\n\n // Prefer artifact-envelope title in the active language.\n const titleText =\n language === 'ar'\n ? (artifact.title_ar || artifact.title_en || '')\n : (artifact.title_en || '')\n\n const renderBody = () => {\n switch (artifact.kind) {\n case 'table':\n return (\n <ArtifactTable\n data={artifact.data as A2UITableData}\n language={language}\n dir={resolvedDir}\n />\n )\n\n case 'chart':\n return (\n <ArtifactChart\n data={artifact.data as A2UIChartData}\n language={language}\n dir={resolvedDir}\n />\n )\n\n case 'card':\n return (\n <ArtifactCard\n data={artifact.data as A2UICardData}\n artifactTitle={titleText}\n language={language}\n dir={resolvedDir}\n />\n )\n\n case 'actions':\n return (\n <ArtifactActions\n data={artifact.data as A2UIActionsData}\n onAction={onAction}\n language={language}\n dir={resolvedDir}\n />\n )\n\n case 'markdown':\n return (\n <ArtifactMarkdown\n data={artifact.data as A2UIMarkdownData}\n language={language}\n dir={resolvedDir}\n />\n )\n\n case 'client_candidates':\n return (\n <ArtifactClientCandidates\n data={artifact.data as A2UIClientCandidatesData}\n onInteract={onInteract}\n language={language}\n dir={resolvedDir}\n />\n )\n\n case 'client_field_picker':\n return (\n <ArtifactClientFieldPicker\n data={artifact.data as A2UIClientFieldPickerData}\n onInteract={onInteract}\n language={language}\n dir={resolvedDir}\n />\n )\n\n case 'client_diff_confirm':\n return (\n <ArtifactClientDiffConfirm\n data={artifact.data as A2UIClientDiffConfirmData}\n onInteract={onInteract}\n language={language}\n dir={resolvedDir}\n />\n )\n\n case 'persona_starters':\n return (\n <ArtifactPersonaStarters\n data={artifact.data as A2UIPersonaStartersData}\n onInteract={onInteract}\n language={language}\n dir={resolvedDir}\n />\n )\n\n default:\n return <UnknownArtifact artifact={artifact} language={language} />\n }\n }\n\n return (\n <div\n className=\"mt-2 space-y-1.5\"\n dir={resolvedDir}\n data-artifact-kind={artifact.kind}\n data-artifact-version={artifact.version}\n >\n {/* Envelope title — shown for all kinds except \"card\" which owns its own title */}\n {titleText && artifact.kind !== 'card' && (\n <p className=\"text-xs font-semibold text-foreground/70 leading-none px-0.5\">\n {titleText}\n </p>\n )}\n\n {renderBody()}\n </div>\n )\n}\n\nArtifactRenderer.displayName = 'ArtifactRenderer'\n\nexport { ArtifactRenderer }\n","'use client'\n\nimport * as React from \"react\";\nimport { MessageSquarePlus } from \"lucide-react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../../lib/utils\";\nimport type { Language } from \"../issues/meta\";\n\n/**\n * FeedbackButton — the trigger that opens the feedback hub / new-issue flow.\n *\n * Pure + product-agnostic (Rule 25): it renders a button and calls `onOpen` (or\n * `onClick`) — it owns no modal, no portal, no fetch. The host decides what\n * opening means (mount a FeedbackHub, open a NewIssueModal, etc.). Two layouts:\n * `variant=\"floating\"` (a fixed FAB pinned to the inline-end / bottom corner,\n * RTL-aware) and `variant=\"inline\"` (a compact toolbar/nav button). Bilingual\n * via `language` (Rule 8); token-clean (Rule 16).\n *\n * Props contract:\n * - onOpen() | onClick(): fired when pressed (onOpen preferred; onClick alias)\n * - language: 'en' | 'ar' — picks the \"Feedback\" label\n * - variant: 'floating' (default) | 'inline'\n * - count: optional unread/open badge count\n * - label: optional override of the default \"Feedback\" text\n */\nconst feedbackButtonVariants = cva(\n \"inline-flex items-center gap-1.5 font-medium transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ring-offset-background\",\n {\n variants: {\n variant: {\n floating:\n \"fixed bottom-5 end-5 z-40 rounded-full bg-primary px-4 py-3 text-sm text-primary-foreground shadow-lg hover:bg-primary/90\",\n inline:\n \"rounded-md px-2.5 py-1.5 text-xs text-muted-foreground hover:bg-secondary/50 hover:text-foreground\",\n },\n },\n defaultVariants: { variant: \"floating\" },\n },\n);\n\nexport type FeedbackButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> &\n VariantProps<typeof feedbackButtonVariants> & {\n onOpen?: () => void;\n language?: Language;\n /** Optional open/unread count rendered as a small badge. */\n count?: number;\n /** Optional label override (default: \"Feedback\" / \"ملاحظات\"). */\n label?: string;\n };\n\nconst FeedbackButton = React.forwardRef<HTMLButtonElement, FeedbackButtonProps>(\n ({ variant, language = \"en\", count, label, onOpen, onClick, className, ...props }, ref) => {\n const ar = language === \"ar\";\n const text = label ?? (ar ? \"ملاحظات\" : \"Feedback\");\n const handleClick: React.MouseEventHandler<HTMLButtonElement> = (e) => {\n onClick?.(e);\n onOpen?.();\n };\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={handleClick}\n aria-label={text}\n className={cn(feedbackButtonVariants({ variant }), \"relative\", className)}\n {...props}\n >\n <MessageSquarePlus size={variant === \"inline\" ? 15 : 18} />\n <span className={cn(variant === \"inline\" && \"hidden sm:inline\")}>{text}</span>\n {count && count > 0 ? (\n <span className=\"ms-1 inline-flex min-w-4 items-center justify-center rounded-full bg-destructive px-1 text-[10px] font-semibold text-destructive-foreground\">\n {count > 99 ? \"99+\" : count}\n </span>\n ) : null}\n </button>\n );\n },\n);\nFeedbackButton.displayName = \"FeedbackButton\";\n\nexport { FeedbackButton, feedbackButtonVariants };\n","'use client'\n\nimport * as React from \"react\";\nimport { Plus, MessageSquarePlus } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport { Sheet, SheetContent, SheetHeader, SheetTitle } from \"../ui/sheet\";\nimport { StatusBadge } from \"../status/StatusBadge\";\nimport { EmptyState } from \"../status/EmptyState\";\nimport {\n type Language,\n statusLabel,\n typeLabel,\n STATUS_TONE,\n formatTimestamp,\n} from \"../issues/meta\";\nimport type { Issue } from \"../issues/types\";\n\n/**\n * FeedbackHub — the reporter's feedback slide-over: the list of issues they have\n * filed (optionally scoped to the current route) plus a \"Report something new\"\n * entry. This is the lightweight reporter surface (distinct from the full manager\n * IssueBoard): a reporter opens it from a FeedbackButton to see their open items\n * and file a new one.\n *\n * Pure + product-agnostic (Rule 25): `issues` + the current `route` arrive as\n * props; selecting an item or starting a new report just fires `onSelectIssue` /\n * `onNewIssue`. No fetch, no portal beyond the @prism/ui Sheet (which is\n * RTL-aware). Bilingual via `language` (Rule 8); token-clean (Rule 16).\n *\n * Props contract:\n * - open / onOpenChange: controlled visibility\n * - issues: Issue[] filed by this reporter (host-supplied)\n * - language: 'en' | 'ar'\n * - route: optional current route — when set, shows a \"this page\" group first\n * - loading: host-driven loading flag → skeleton rows\n * - onNewIssue(): start a new report\n * - onSelectIssue(id): open an existing issue's detail\n * - title: optional header override (default \"Feedback\")\n */\nexport type FeedbackHubProps = {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n issues: Issue[];\n language?: Language;\n route?: string;\n loading?: boolean;\n onNewIssue?: () => void;\n onSelectIssue?: (id: string) => void;\n title?: string;\n};\n\nconst FeedbackHub = ({\n open,\n onOpenChange,\n issues,\n language = \"en\",\n route,\n loading = false,\n onNewIssue,\n onSelectIssue,\n title,\n}: FeedbackHubProps) => {\n const ar = language === \"ar\";\n const heading = title ?? (ar ? \"ملاحظات\" : \"Feedback\");\n\n // Split into \"this page\" vs \"everything else\" when a route is provided.\n const onThisPage = route ? issues.filter((i) => i.route === route) : [];\n const elsewhere = route ? issues.filter((i) => i.route !== route) : issues;\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent side=\"right\" className=\"flex w-full max-w-md flex-col gap-0 p-0 sm:max-w-md\">\n <SheetHeader className=\"border-b border-border/50 px-5 py-3 text-start\">\n <SheetTitle className=\"text-sm font-semibold\">{heading}</SheetTitle>\n </SheetHeader>\n\n <div className=\"flex-1 space-y-4 overflow-y-auto p-4\">\n <Button size=\"sm\" className=\"w-full\" onClick={onNewIssue}>\n <Plus size={14} /> {ar ? \"أبلغ عن شيء جديد\" : \"Report something new\"}\n </Button>\n\n {loading ? (\n <div className=\"space-y-2\">\n {[0, 1, 2].map((k) => (\n <div key={k} className=\"h-16 animate-pulse rounded-lg bg-secondary\" />\n ))}\n </div>\n ) : issues.length === 0 ? (\n <EmptyState\n icon={<MessageSquarePlus />}\n title={ar ? \"لا توجد ملاحظات بعد\" : \"No feedback yet\"}\n description={\n ar\n ? \"لم تُبلِّغ عن أي شيء حتى الآن. ابدأ بالزر أعلاه.\"\n : \"You haven't reported anything yet. Start with the button above.\"\n }\n />\n ) : (\n <>\n {route && onThisPage.length > 0 ? (\n <FeedbackGroup\n label={ar ? \"في هذه الصفحة\" : \"On this page\"}\n items={onThisPage}\n language={language}\n onSelect={onSelectIssue}\n />\n ) : null}\n {elsewhere.length > 0 ? (\n <FeedbackGroup\n label={route ? (ar ? \"في أماكن أخرى\" : \"Elsewhere\") : (ar ? \"ملاحظاتك\" : \"Your reports\")}\n items={elsewhere}\n language={language}\n onSelect={onSelectIssue}\n />\n ) : null}\n </>\n )}\n </div>\n </SheetContent>\n </Sheet>\n );\n};\nFeedbackHub.displayName = \"FeedbackHub\";\n\nconst FeedbackGroup = ({\n label,\n items,\n language,\n onSelect,\n}: {\n label: string;\n items: Issue[];\n language: Language;\n onSelect?: (id: string) => void;\n}) => (\n <div>\n <p className=\"mb-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">{label}</p>\n <ul className=\"space-y-2\">\n {items.map((issue) => (\n <li key={issue.id}>\n <button\n type=\"button\"\n onClick={() => onSelect?.(issue.id)}\n className={cn(\n \"block w-full rounded-lg border border-border/60 bg-card p-3 text-start transition\",\n \"hover:border-primary/40 hover:shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n <div className=\"mb-1 flex items-center gap-2\">\n <span className=\"font-mono text-xs text-muted-foreground\">#{issue.number}</span>\n <StatusBadge tone={STATUS_TONE[issue.status]} className=\"text-[10px]\">\n {statusLabel(issue.status, language)}\n </StatusBadge>\n <span className=\"ms-auto text-[10px] uppercase tracking-wider text-muted-foreground\">\n {typeLabel(issue.type, language)}\n </span>\n </div>\n <p className=\"line-clamp-2 text-sm font-medium text-foreground\">{issue.title}</p>\n <p className=\"mt-1 text-[11px] text-muted-foreground\">\n {formatTimestamp(issue.createdAt, language)}\n </p>\n </button>\n </li>\n ))}\n </ul>\n </div>\n);\nFeedbackGroup.displayName = \"FeedbackHubGroup\";\n\nexport { FeedbackHub };\n","// issues/meta.ts — shared display metadata for the issue/feedback UI.\n//\n// Plain module (no \"use client\") so any component can import the label maps and\n// tone helpers. Bilingual EN/AR + token-clean: the os-agents originals hardcoded\n// `bg-amber-500/10`-style color literals; here every priority/status maps to a\n// semantic StatusBadge tone (success/warning/danger/info/neutral) so colors stay\n// centralised and theme-/RTL-safe (Rule 8, Rule 16).\n\nimport type { StatusBadgeTone } from \"../status/StatusBadge\";\nimport type {\n IssueStatus,\n IssueType,\n IssuePriority,\n IssueLinkType,\n} from \"./types\";\n\nexport type Language = \"en\" | \"ar\";\n\n/** Board columns, in order. Labels are bilingual. */\nexport const STATUS_COLUMNS: ReadonlyArray<{\n key: IssueStatus;\n en: string;\n ar: string;\n}> = [\n { key: \"todo\", en: \"To do\", ar: \"للتنفيذ\" },\n { key: \"in_progress\", en: \"In progress\", ar: \"قيد التنفيذ\" },\n { key: \"blocked\", en: \"Blocked\", ar: \"محظور\" },\n { key: \"ready_for_review\", en: \"Review\", ar: \"للمراجعة\" },\n { key: \"done\", en: \"Done\", ar: \"مكتمل\" },\n];\n\n/** Pre-resolved status label for a given language. */\nexport const statusLabel = (s: IssueStatus, lang: Language): string => {\n const col = STATUS_COLUMNS.find((c) => c.key === s);\n if (!col) return s;\n return lang === \"ar\" ? col.ar : col.en;\n};\n\n/** Status → StatusBadge tone (token-driven; no hex literals). */\nexport const STATUS_TONE: Record<IssueStatus, StatusBadgeTone> = {\n todo: \"neutral\",\n in_progress: \"info\",\n blocked: \"danger\",\n ready_for_review: \"warning\",\n done: \"success\",\n};\n\n/** Issue-type labels (EN/AR). `change` is surfaced as \"Feature\". */\nconst TYPE_LABEL: Record<IssueType, { en: string; ar: string }> = {\n bug: { en: \"Bug\", ar: \"خلل\" },\n change: { en: \"Feature\", ar: \"ميزة\" },\n question: { en: \"Question\", ar: \"سؤال\" },\n discussion: { en: \"Discussion\", ar: \"نقاش\" },\n};\n\nexport const typeLabel = (t: IssueType, lang: Language): string =>\n lang === \"ar\" ? TYPE_LABEL[t].ar : TYPE_LABEL[t].en;\n\n/** Types offered in the hub create-flow. question/discussion are SDK-only. */\nexport const HUB_TYPES: IssueType[] = [\"bug\", \"change\"];\n\n/** Priority labels (EN/AR) + a semantic tone (a11y: always text-labelled too). */\nconst PRIORITY_LABEL: Record<IssuePriority, { en: string; ar: string }> = {\n low: { en: \"Low\", ar: \"منخفض\" },\n normal: { en: \"Normal\", ar: \"عادي\" },\n high: { en: \"High\", ar: \"مرتفع\" },\n critical: { en: \"Critical\", ar: \"حرج\" },\n};\n\nexport const priorityLabel = (p: IssuePriority, lang: Language): string =>\n lang === \"ar\" ? PRIORITY_LABEL[p].ar : PRIORITY_LABEL[p].en;\n\nexport const PRIORITY_TONE: Record<IssuePriority, StatusBadgeTone> = {\n low: \"neutral\",\n normal: \"info\",\n high: \"warning\",\n critical: \"danger\",\n};\n\nexport const ALL_PRIORITIES: IssuePriority[] = [\"low\", \"normal\", \"high\", \"critical\"];\n\n/** Cross-issue link labels (EN/AR). */\nconst LINK_LABEL: Record<IssueLinkType, { en: string; ar: string }> = {\n parent_of: { en: \"Parent of\", ar: \"أصل لـ\" },\n blocks: { en: \"Blocks\", ar: \"يحظر\" },\n duplicates: { en: \"Duplicates\", ar: \"مكرر لـ\" },\n relates: { en: \"Relates to\", ar: \"مرتبط بـ\" },\n};\n\nexport const linkLabel = (l: IssueLinkType, lang: Language): string =>\n lang === \"ar\" ? LINK_LABEL[l].ar : LINK_LABEL[l].en;\n\n/** Attachment UX constants (client mirror of the SDK's server-side caps). */\nexport const ATTACHMENT_ACCEPT =\n \"image/png,image/jpeg,image/webp,image/gif,application/pdf\";\nexport const ATTACHMENT_MAX_BYTES = 10 * 1024 * 1024; // 10 MB\nexport const ATTACHMENT_MAX_FILES = 5; // modal UX cap\n\n/** Format a byte count for the attachment list. */\nexport const formatBytes = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n};\n\n/** Format an ISO timestamp short + locale-aware (Arabic locale when lang=ar). */\nexport const formatTimestamp = (iso: string, lang: Language): string =>\n new Date(iso).toLocaleString(lang === \"ar\" ? \"ar\" : undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n","'use client'\n\nimport * as React from \"react\";\nimport { MessageSquarePlus } from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport type { Language } from \"../issues/meta\";\n\n/**\n * MotorFeedbackLauncher — the ONE shared feedback launcher for every Sentra\n * product dashboard (Sentra hub, Scout, Cortex, Fort, Axon).\n *\n * It loads the shared Motor feedback SDK (@sentra/motor-feedback, served as a\n * static bundle at `sdkSrc`, default /motor-feedback.js) and mounts its\n * FeedbackHub on this floating trigger. ALL feedback behaviour — the report\n * form, element anchor, client-side screenshot, attachments, and the POST to\n * Motor's /api/issues/v1 surface — lives in the Motor SDK. No product\n * reimplements the feedback form or transport (operator decision 2026-06-14:\n * \"feedback must extend the Motor SDK, not be custom per product\").\n *\n * The FAB is DRAGGABLE: press-and-drag moves it anywhere on screen and the\n * position is cached in localStorage (per project), so it survives reloads. A\n * drag is distinguished from a click by a small movement threshold — a real\n * click still opens the feedback panel; a drag does not.\n *\n * Why the SDK over a bespoke modal: the SDK renders its panel inside a Shadow\n * DOM mounted on <body>, so it sits on the top stacking layer — immune to the\n * host app's z-index / transformed ancestors (the old bespoke launcher rendered\n * *behind* the header). This trigger button also carries a very high z-index so\n * the FAB itself floats over all app UI.\n *\n * Product-agnostic (Rule 25): no app context, no fetch here — `project`,\n * `publishableKey` (Motor DSN public key), `apiBase`, and `language` all arrive\n * as props. Renders nothing when `project`/`publishableKey` are empty (Motor\n * optional → host stays standalone). Bilingual (Rule 8); token-clean (Rule 16).\n */\n\ntype SdkIssueType = \"bug\" | \"change\" | \"question\" | \"discussion\";\ntype FeedbackHubHandle = { open(): void; close(): void; refresh(): void; destroy(): void };\ntype MotorFeedbackSdk = {\n mountFeedbackHub(opts: {\n trigger: Element;\n project: string;\n publishableKey: string;\n apiBase: string;\n theme?: \"light\" | \"dark\" | \"auto\";\n defaultType?: SdkIssueType;\n title?: string;\n reporterEmail?: string;\n reporterName?: string;\n }): FeedbackHubHandle;\n};\n\ndeclare global {\n interface Window {\n MotorFeedback?: MotorFeedbackSdk;\n }\n}\n\nexport type MotorFeedbackLauncherProps = {\n /** Motor project slug, e.g. \"sentra\" | \"scout\" | \"cortex\" | \"fort\" | \"axon\". */\n project: string;\n /** Motor DSN public key, e.g. \"motor-sentra-dev-key\" (NEXT_PUBLIC_MOTOR_DSN). */\n publishableKey: string;\n /** Motor issues API base, e.g. http://localhost:8215/api/issues/v1. */\n apiBase: string;\n language?: Language;\n /** Where the Motor SDK bundle is served. Default: /motor-feedback.js */\n sdkSrc?: string;\n theme?: \"light\" | \"dark\" | \"auto\";\n defaultType?: SdkIssueType;\n /** Pre-fill the reporter identity when the host knows the signed-in user. */\n reporterEmail?: string;\n reporterName?: string;\n /** Optional FAB label override (default: \"Feedback\" / \"ملاحظات\"). */\n label?: string;\n};\n\ntype Pos = { left: number; top: number };\n\nconst FAB_W = 132; // approx FAB footprint for viewport clamping\nconst FAB_H = 48;\nconst DRAG_THRESHOLD = 5; // px of movement before a press counts as a drag\n\nconst clampToViewport = (left: number, top: number): Pos => {\n if (typeof window === \"undefined\") return { left, top };\n const maxLeft = Math.max(0, window.innerWidth - FAB_W);\n const maxTop = Math.max(0, window.innerHeight - FAB_H);\n return {\n left: Math.min(Math.max(0, left), maxLeft),\n top: Math.min(Math.max(0, top), maxTop),\n };\n};\n\nconst MotorFeedbackLauncher: React.FC<MotorFeedbackLauncherProps> = ({\n project,\n publishableKey,\n apiBase,\n language = \"en\",\n sdkSrc = \"/motor-feedback.js\",\n theme = \"auto\",\n defaultType = \"bug\",\n reporterEmail,\n reporterName,\n label,\n}) => {\n const ar = language === \"ar\";\n const text = label ?? (ar ? \"ملاحظات\" : \"Feedback\");\n const storageKey = `motor-feedback-fab:${project}`;\n\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const handleRef = React.useRef<FeedbackHubHandle | null>(null);\n\n const [pos, setPos] = React.useState<Pos | null>(null);\n // Drag bookkeeping kept in a ref so handlers don't churn on every move.\n // startX/startY = press point (for the drag-vs-click threshold); dx/dy = grab\n // offset within the button.\n const drag = React.useRef<{ active: boolean; moved: boolean; startX: number; startY: number; dx: number; dy: number }>({\n active: false,\n moved: false,\n startX: 0,\n startY: 0,\n dx: 0,\n dy: 0,\n });\n\n const active = Boolean(project && publishableKey && apiBase);\n\n // Restore the cached position on mount (clamped to the current viewport).\n React.useEffect(() => {\n if (!active || typeof window === \"undefined\") return;\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw) {\n const parsed = JSON.parse(raw) as Partial<Pos>;\n if (typeof parsed.left === \"number\" && typeof parsed.top === \"number\") {\n setPos(clampToViewport(parsed.left, parsed.top));\n }\n }\n } catch {\n /* ignore corrupt cache */\n }\n }, [active, storageKey]);\n\n // Mount the shared Motor SDK hub on this trigger once the bundle has loaded.\n React.useEffect(() => {\n if (!active) return;\n let cancelled = false;\n\n const mount = () => {\n if (cancelled || handleRef.current || !window.MotorFeedback || !triggerRef.current) return;\n handleRef.current = window.MotorFeedback.mountFeedbackHub({\n trigger: triggerRef.current,\n project,\n publishableKey,\n apiBase,\n theme,\n defaultType,\n title: text,\n reporterEmail,\n reporterName,\n });\n };\n\n if (window.MotorFeedback) {\n mount();\n } else {\n let script = document.querySelector<HTMLScriptElement>(`script[src=\"${sdkSrc}\"]`);\n if (!script) {\n script = document.createElement(\"script\");\n script.src = sdkSrc;\n script.async = true;\n document.body.appendChild(script);\n }\n script.addEventListener(\"load\", mount);\n }\n\n return () => {\n cancelled = true;\n handleRef.current?.destroy();\n handleRef.current = null;\n };\n }, [active, project, publishableKey, apiBase, theme, defaultType, text, reporterEmail, reporterName, sdkSrc]);\n\n // ── Drag-to-move (pointer events: mouse + touch) ──────────────────────────\n const handlePointerDown = (e: React.PointerEvent<HTMLButtonElement>) => {\n if (!triggerRef.current) return;\n const rect = triggerRef.current.getBoundingClientRect();\n drag.current = {\n active: true,\n moved: false,\n startX: e.clientX,\n startY: e.clientY,\n dx: e.clientX - rect.left,\n dy: e.clientY - rect.top,\n };\n try {\n triggerRef.current.setPointerCapture(e.pointerId);\n } catch {\n /* setPointerCapture may throw if the pointer is already released */\n }\n };\n\n const handlePointerMove = (e: React.PointerEvent<HTMLButtonElement>) => {\n const d = drag.current;\n if (!d.active) return;\n // Only count as a drag once the pointer travels past the threshold from the\n // press point — a small jitter during a click stays a click.\n if (!d.moved) {\n if (Math.abs(e.clientX - d.startX) <= DRAG_THRESHOLD && Math.abs(e.clientY - d.startY) <= DRAG_THRESHOLD) {\n return;\n }\n d.moved = true;\n }\n setPos(clampToViewport(e.clientX - d.dx, e.clientY - d.dy));\n };\n\n const handlePointerUp = (e: React.PointerEvent<HTMLButtonElement>) => {\n const d = drag.current;\n if (!d.active) return;\n d.active = false;\n try {\n triggerRef.current?.releasePointerCapture(e.pointerId);\n } catch {\n /* ignore */\n }\n if (d.moved) {\n // Persist the new position so it survives reloads.\n setPos((cur) => {\n if (cur && typeof window !== \"undefined\") {\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(cur));\n } catch {\n /* storage may be unavailable (private mode) */\n }\n }\n return cur;\n });\n }\n };\n\n // Swallow the click that follows a drag so the SDK's click→open doesn't fire.\n const handleClickCapture = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (drag.current.moved) {\n e.preventDefault();\n e.stopPropagation();\n // reset so the NEXT genuine click opens the panel\n drag.current.moved = false;\n }\n };\n\n if (!active) return null;\n\n // Default anchor (bottom-end) until the user drags; then switch to absolute\n // left/top from the cached/active position.\n const positioned = pos !== null;\n const style: React.CSSProperties = positioned\n ? { left: pos.left, top: pos.top, right: \"auto\", bottom: \"auto\", touchAction: \"none\" }\n : { touchAction: \"none\" };\n\n return (\n <button\n ref={triggerRef}\n type=\"button\"\n aria-label={text}\n title={ar ? \"اسحب لتحريك الزر\" : \"Drag to move\"}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onClickCapture={handleClickCapture}\n style={style}\n className={cn(\n \"fixed z-[2147483000] inline-flex cursor-grab items-center gap-1.5 rounded-full\",\n \"bg-primary px-4 py-3 text-sm font-medium text-primary-foreground shadow-lg transition-colors duration-fast ease-standard\",\n \"hover:bg-primary/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"focus-visible:ring-offset-2 ring-offset-background active:cursor-grabbing select-none\",\n !positioned && \"bottom-5 end-5\",\n )}\n >\n <MessageSquarePlus size={18} />\n <span>{text}</span>\n </button>\n );\n};\nMotorFeedbackLauncher.displayName = \"MotorFeedbackLauncher\";\n\nexport { MotorFeedbackLauncher };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { MessageSquarePlus, X, MapPin, Paperclip, Camera, ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Textarea } from \"../ui/textarea\";\nimport { Label } from \"../ui/label\";\n\nexport type FeedbackKind = \"bug\" | \"feature\" | \"question\" | \"discussion\";\n\nexport interface PickedLocation {\n selector: string;\n tag: string;\n label?: string;\n}\nexport interface FeedbackAttachment {\n name: string;\n kind: \"file\" | \"screenshot\";\n}\nexport interface FeedbackItem {\n id: string;\n kind: FeedbackKind;\n title: string;\n details?: string;\n pageUrl?: string;\n location?: PickedLocation;\n attachments?: FeedbackAttachment[];\n createdAt?: string;\n}\nexport type NewFeedback = Omit<FeedbackItem, \"id\" | \"createdAt\">;\n\nexport interface FeedbackWidgetProps {\n /** Issues already reported on this page (rendered in the panel list). */\n items?: FeedbackItem[];\n /** Current page URL (defaults to window.location.href). */\n pageUrl?: string;\n onSubmit?: (issue: NewFeedback) => void;\n onSelectIssue?: (id: string) => void;\n /** Host-provided screenshot capture (the kit is presentational). Returns a name. */\n onScreenshot?: () => Promise<string | null> | string | null;\n language?: \"en\" | \"ar\";\n /** Control the panel externally (otherwise a floating button is shown). */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n pageSize?: number;\n}\n\nconst KINDS: { key: FeedbackKind; en: string; ar: string; cls: string; sel: string }[] = [\n { key: \"bug\", en: \"Bug\", ar: \"خطأ\", cls: \"text-red-500\", sel: \"border-red-500 bg-red-500/10 text-red-500\" },\n { key: \"feature\", en: \"Feature\", ar: \"ميزة\", cls: \"text-blue-500\", sel: \"border-blue-500 bg-blue-500/10 text-blue-500\" },\n { key: \"question\", en: \"Question\", ar: \"سؤال\", cls: \"text-amber-500\", sel: \"border-amber-500 bg-amber-500/10 text-amber-500\" },\n { key: \"discussion\", en: \"Discussion\", ar: \"نقاش\", cls: \"text-purple-500\", sel: \"border-purple-500 bg-purple-500/10 text-purple-500\" },\n];\nconst kindOf = (k: FeedbackKind) => KINDS.find((x) => x.key === k)!;\n\nconst T = {\n en: { title: \"Feedback\", intro: \"Found a bug, have an idea, or want to ask something about this page? It's attached to the page you are on.\",\n report: \"Report an issue\", onPage: \"On this page\", issues: (n: number) => `${n} issue${n === 1 ? \"\" : \"s\"} on this page`,\n type: \"Type\", titleL: \"Title\", brief: \"Brief description\", details: \"Details\", detailsPh: \"Steps to reproduce, expected vs actual, etc.\",\n url: \"Page URL\", location: \"Location\", pin: \"Pin location\", attach: \"Attachments\", addFile: \"Add file\", screenshot: \"Screenshot\", submit: \"Submit\",\n picking: \"Click any element to pin it · Esc to cancel\", empty: \"No issues yet on this page.\", repin: \"Re-pin\", clear: \"Clear\" },\n ar: { title: \"الملاحظات\", intro: \"وجدت خطأ أو لديك فكرة أو سؤال حول هذه الصفحة؟ سيُرفق بالصفحة الحالية.\",\n report: \"أبلغ عن مشكلة\", onPage: \"على هذه الصفحة\", issues: (n: number) => `${n} مشكلة على هذه الصفحة`,\n type: \"النوع\", titleL: \"العنوان\", brief: \"وصف مختصر\", details: \"التفاصيل\", detailsPh: \"خطوات إعادة الإنتاج، المتوقع مقابل الفعلي…\",\n url: \"رابط الصفحة\", location: \"الموقع\", pin: \"تثبيت موقع\", attach: \"المرفقات\", addFile: \"إضافة ملف\", screenshot: \"لقطة شاشة\", submit: \"إرسال\",\n picking: \"انقر أي عنصر لتثبيته · Esc للإلغاء\", empty: \"لا مشكلات على هذه الصفحة بعد.\", repin: \"إعادة التثبيت\", clear: \"مسح\" },\n};\n\nfunction cssPath(el: Element): string {\n const parts: string[] = [];\n let node: Element | null = el;\n while (node && node.nodeType === 1 && parts.length < 5 && node !== document.body) {\n let part = node.tagName.toLowerCase();\n if ((node as HTMLElement).id) { part += `#${(node as HTMLElement).id}`; parts.unshift(part); break; }\n const cls = (node.getAttribute(\"class\") || \"\").trim().split(/\\s+/).filter(Boolean).slice(0, 2);\n if (cls.length) part += \".\" + cls.join(\".\");\n parts.unshift(part);\n node = node.parentElement;\n }\n return parts.join(\" > \");\n}\n\nexport function FeedbackWidget({\n items = [], pageUrl, onSubmit, onSelectIssue, onScreenshot, language = \"en\",\n open: openProp, onOpenChange, className, pageSize = 5,\n}: FeedbackWidgetProps) {\n const t = T[language];\n const isRTL = language === \"ar\";\n const [internalOpen, setInternalOpen] = React.useState(false);\n const open = openProp ?? internalOpen;\n const setOpen = (v: boolean) => { setInternalOpen(v); onOpenChange?.(v); };\n\n const [reporting, setReporting] = React.useState(false);\n const [kind, setKind] = React.useState<FeedbackKind>(\"bug\");\n const [title, setTitle] = React.useState(\"\");\n const [details, setDetails] = React.useState(\"\");\n const [location, setLocation] = React.useState<PickedLocation | null>(null);\n const [attachments, setAttachments] = React.useState<FeedbackAttachment[]>([]);\n const [selectedId, setSelectedId] = React.useState<string | null>(items[0]?.id ?? null);\n const [page, setPage] = React.useState(0);\n\n const [picking, setPicking] = React.useState(false);\n const [hl, setHl] = React.useState<DOMRect | null>(null);\n const fileRef = React.useRef<HTMLInputElement>(null);\n const url = pageUrl ?? (typeof window !== \"undefined\" ? window.location.href : \"\");\n\n React.useEffect(() => {\n if (!picking) return;\n const ignore = (el: Element | null) => !el || el.closest(\"[data-feedback-ui]\");\n const move = (e: MouseEvent) => { const el = document.elementFromPoint(e.clientX, e.clientY); setHl(ignore(el) ? null : el!.getBoundingClientRect()); };\n const click = (e: MouseEvent) => {\n const el = document.elementFromPoint(e.clientX, e.clientY);\n if (ignore(el)) return;\n e.preventDefault(); e.stopPropagation();\n setLocation({ selector: cssPath(el!), tag: el!.tagName.toLowerCase(), label: (el!.textContent || \"\").trim().slice(0, 40) || undefined });\n setPicking(false); setHl(null); setReporting(true);\n };\n const key = (e: KeyboardEvent) => { if (e.key === \"Escape\") { setPicking(false); setHl(null); setReporting(true); } };\n document.addEventListener(\"mousemove\", move, true);\n document.addEventListener(\"click\", click, true);\n document.addEventListener(\"keydown\", key, true);\n const prev = document.body.style.cursor; document.body.style.cursor = \"crosshair\";\n return () => {\n document.removeEventListener(\"mousemove\", move, true);\n document.removeEventListener(\"click\", click, true);\n document.removeEventListener(\"keydown\", key, true);\n document.body.style.cursor = prev;\n };\n }, [picking]);\n\n function startPin() { setReporting(false); setPicking(true); }\n async function takeScreenshot() {\n const name = (await onScreenshot?.()) ?? \"screenshot.png\";\n if (name) setAttachments((a) => [...a, { name, kind: \"screenshot\" }]);\n }\n function onFiles(e: React.ChangeEvent<HTMLInputElement>) {\n const files = Array.from(e.target.files ?? []);\n setAttachments((a) => [...a, ...files.map((f) => ({ name: f.name, kind: \"file\" as const }))]);\n e.target.value = \"\";\n }\n function submit() {\n if (!title.trim()) return;\n onSubmit?.({ kind, title: title.trim(), details: details.trim() || undefined, pageUrl: url, location: location ?? undefined, attachments });\n setTitle(\"\"); setDetails(\"\"); setLocation(null); setAttachments([]); setKind(\"bug\"); setReporting(false);\n }\n\n const pages = Math.max(1, Math.ceil(items.length / pageSize));\n const shown = items.slice(page * pageSize, page * pageSize + pageSize);\n\n return (\n <div data-feedback-ui dir={isRTL ? \"rtl\" : \"ltr\"} className={className}>\n {/* element-pin overlay */}\n {picking && (\n <>\n <div className=\"fixed inset-x-0 top-0 z-[10001] bg-primary px-4 py-2 text-center text-sm font-medium text-primary-foreground\">\n <MapPin className=\"me-2 inline h-4 w-4\" />{t.picking}\n </div>\n {hl && <div className=\"pointer-events-none fixed z-[10000] rounded border-2 border-primary bg-primary/10\" style={{ top: hl.top, left: hl.left, width: hl.width, height: hl.height }} />}\n </>\n )}\n\n {/* floating trigger */}\n {openProp === undefined && !open && !picking && (\n <button onClick={() => setOpen(true)} aria-label={t.title}\n className=\"fixed bottom-5 end-5 z-[9990] flex h-12 w-12 items-center justify-center rounded-full bg-primary text-primary-foreground shadow-lg transition hover:opacity-90\">\n <MessageSquarePlus className=\"h-5 w-5\" />\n </button>\n )}\n\n {/* ── Feedback side panel ── */}\n {open && !picking && (\n <>\n <div className=\"fixed inset-0 z-[9991] bg-black/40\" onClick={() => setOpen(false)} />\n <aside className=\"fixed inset-y-0 end-0 z-[9992] flex w-[380px] max-w-[90vw] flex-col border-s border-border bg-card text-card-foreground shadow-2xl\">\n <div className=\"flex items-center justify-between border-b border-border px-5 py-3.5\">\n <span className=\"text-lg font-semibold\">{t.title}</span>\n <button onClick={() => setOpen(false)} className=\"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground\"><X className=\"h-4 w-4\" /></button>\n </div>\n <div className=\"flex-1 overflow-y-auto p-5\">\n <p className=\"mb-4 text-sm text-muted-foreground\">{t.intro}</p>\n <Button className=\"w-full\" onClick={() => setReporting(true)}>{t.report}</Button>\n\n <p className=\"mb-2 mt-6 text-xs font-medium uppercase tracking-wide text-muted-foreground\">{t.onPage}</p>\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-sm text-muted-foreground\">{t.issues(items.length)}</span>\n {pages > 1 && (\n <span className=\"flex items-center gap-1\">\n <Button size=\"sm\" variant=\"outline\" className=\"h-6 w-6 p-0\" disabled={page === 0} onClick={() => setPage((p) => p - 1)}><ChevronLeft className=\"h-3.5 w-3.5 rtl:rotate-180\" /></Button>\n <span className=\"text-xs text-muted-foreground\">{page + 1}/{pages}</span>\n <Button size=\"sm\" variant=\"outline\" className=\"h-6 w-6 p-0\" disabled={page >= pages - 1} onClick={() => setPage((p) => p + 1)}><ChevronRight className=\"h-3.5 w-3.5 rtl:rotate-180\" /></Button>\n </span>\n )}\n </div>\n <div className=\"space-y-1.5\">\n {shown.length === 0 ? <p className=\"py-6 text-center text-sm text-muted-foreground\">{t.empty}</p> : shown.map((it) => {\n const k = kindOf(it.kind);\n return (\n <button key={it.id} onClick={() => { setSelectedId(it.id); onSelectIssue?.(it.id); }}\n className={cn(\"flex w-full items-center gap-2.5 rounded-lg border px-3 py-2 text-start transition hover:bg-accent\",\n selectedId === it.id ? \"border-primary bg-primary/5\" : \"border-border\")}>\n <span className=\"font-mono text-[11px] text-muted-foreground\">#{it.id}</span>\n <span className={cn(\"rounded px-1.5 py-0.5 text-[10px] font-semibold\", k.cls, \"bg-current/10\")} style={{ backgroundColor: \"transparent\" }}>\n <span className={k.cls}>{isRTL ? k.ar : k.en}</span>\n </span>\n <span className=\"min-w-0 flex-1 truncate text-sm\">{it.title}</span>\n </button>\n );\n })}\n </div>\n </div>\n </aside>\n </>\n )}\n\n {/* ── Report an issue modal ── */}\n {reporting && !picking && (\n <div className=\"fixed inset-0 z-[9995] flex items-center justify-center p-4\" onClick={() => setReporting(false)}>\n <div className=\"absolute inset-0 bg-black/60\" />\n <div className=\"relative flex max-h-[90vh] w-full max-w-md flex-col overflow-hidden rounded-2xl border border-border bg-card text-card-foreground shadow-2xl\" onClick={(e) => e.stopPropagation()}>\n <div className=\"flex items-center justify-between border-b border-border px-5 py-3.5\">\n <span className=\"text-lg font-semibold\">{t.report}</span>\n <button onClick={() => setReporting(false)} className=\"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground\"><X className=\"h-4 w-4\" /></button>\n </div>\n <div className=\"space-y-4 overflow-y-auto px-5 py-4\">\n <div>\n <Label className=\"mb-1.5 block text-xs uppercase tracking-wide text-muted-foreground\">{t.type}</Label>\n <div className=\"flex flex-wrap gap-2\">\n {KINDS.map((k) => (\n <button key={k.key} onClick={() => setKind(k.key)}\n className={cn(\"rounded-full border px-3 py-1 text-sm font-medium transition\", kind === k.key ? k.sel : cn(\"border-border\", k.cls, \"opacity-80 hover:opacity-100\"))}>\n {isRTL ? k.ar : k.en}\n </button>\n ))}\n </div>\n </div>\n <div>\n <Label htmlFor=\"fb-title\" className=\"mb-1.5 block text-xs uppercase tracking-wide text-muted-foreground\">{t.titleL} *</Label>\n <Input id=\"fb-title\" value={title} onChange={(e) => setTitle(e.target.value)} placeholder={t.brief} />\n </div>\n <div>\n <Label htmlFor=\"fb-details\" className=\"mb-1.5 block text-xs uppercase tracking-wide text-muted-foreground\">{t.details}</Label>\n <Textarea id=\"fb-details\" rows={4} value={details} onChange={(e) => setDetails(e.target.value)} placeholder={t.detailsPh} />\n </div>\n <div>\n <Label className=\"mb-1.5 block text-xs uppercase tracking-wide text-muted-foreground\">{t.url}</Label>\n <Input value={url} readOnly className=\"font-mono text-xs text-muted-foreground\" />\n </div>\n <div>\n <Label className=\"mb-1.5 block text-xs uppercase tracking-wide text-muted-foreground\">{t.location}</Label>\n {location ? (\n <div className=\"flex items-center gap-2 rounded-lg border border-border bg-muted/40 p-2\">\n <span className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-primary/10 text-primary\">\n <MapPin className=\"h-4 w-4\" />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm font-medium\">{location.label || `<${location.tag}>`}</span>\n <span className=\"block truncate font-mono text-[10px] text-muted-foreground\">{location.tag} · {location.selector}</span>\n </span>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 shrink-0 px-2 text-xs\" onClick={startPin}>{t.repin}</Button>\n <button onClick={() => setLocation(null)} aria-label={t.clear}\n className=\"shrink-0 rounded p-1 text-muted-foreground hover:bg-accent hover:text-destructive\">\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n ) : (\n <Button variant=\"outline\" size=\"sm\" className=\"gap-1.5\" onClick={startPin}>\n <MapPin className=\"h-3.5 w-3.5\" />{t.pin}\n </Button>\n )}\n </div>\n <div>\n <Label className=\"mb-1.5 block text-xs uppercase tracking-wide text-muted-foreground\">{t.attach}</Label>\n <div className=\"flex flex-wrap items-center gap-2\">\n <input ref={fileRef} type=\"file\" multiple className=\"hidden\" onChange={onFiles} />\n <Button variant=\"outline\" size=\"sm\" className=\"gap-1.5\" onClick={() => fileRef.current?.click()}><Paperclip className=\"h-3.5 w-3.5\" />{t.addFile}</Button>\n <Button variant=\"outline\" size=\"sm\" className=\"gap-1.5\" onClick={takeScreenshot}><Camera className=\"h-3.5 w-3.5\" />{t.screenshot}</Button>\n {attachments.map((a, i) => <span key={i} className=\"rounded bg-muted px-2 py-0.5 text-xs text-muted-foreground\">{a.name}</span>)}\n </div>\n </div>\n </div>\n <div className=\"border-t border-border p-4\">\n <Button className=\"w-full\" disabled={!title.trim()} onClick={submit}>{t.submit}</Button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Logo, type LogoVariant } from \"./Logo\";\n\nexport interface WordmarkProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Font size of the wordmark in px. */\n size?: number;\n /** Render the mark/monogram before the wordmark. */\n withMark?: boolean;\n markVariant?: LogoVariant;\n}\n\n/** ToGO Wordmark — \"To\" in Gopher Cyan, \"GO\" in Cobalt (brand-fixed, theme-independent),\n * set in the Sora display face. */\nexport function Wordmark({ size = 24, withMark = false, markVariant = \"mono\", className, style, ...props }: WordmarkProps) {\n return (\n <span className={cn(\"inline-flex items-center gap-2 font-display font-extrabold tracking-tight\", className)} style={style} {...props}>\n {withMark && <Logo variant={markVariant} tone=\"brand\" size={Math.round(size * 1.15)} />}\n <span style={{ fontSize: size, lineHeight: 1 }} aria-label=\"ToGO\">\n <span style={{ color: \"var(--togo-cyan-500)\" }}>To</span>\n <span style={{ color: \"var(--togo-cobalt-500)\" }}>GO</span>\n </span>\n </span>\n );\n}\nWordmark.displayName = \"Wordmark\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n DndContext, DragOverlay, closestCenter, KeyboardSensor, PointerSensor,\n useSensor, useSensors, type DragEndEvent, type DragStartEvent,\n} from \"@dnd-kit/core\";\nimport {\n SortableContext, sortableKeyboardCoordinates, useSortable, verticalListSortingStrategy, arrayMove,\n} from \"@dnd-kit/sortable\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport { GripVertical, Settings2, Trash2, Plus } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { Card } from \"../ui/card\";\nimport { Badge } from \"../ui/badge\";\nimport { Button } from \"../ui/button\";\nimport { Label } from \"../ui/label\";\nimport { Input } from \"../ui/input\";\nimport { Textarea } from \"../ui/textarea\";\nimport {\n Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter,\n} from \"../ui/dialog\";\nimport {\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem,\n} from \"../ui/select\";\n\nexport interface ModelOption {\n value: string;\n label?: string;\n}\n\nexport interface SectionModel {\n id: string;\n title: string;\n badge?: string;\n /** AI prompt that powers this section (edited in edit mode). */\n prompt?: string;\n /** Selected model id. */\n model?: string;\n /** Arbitrary key/value settings. */\n settings?: Record<string, string>;\n /** Rendered content in view mode. */\n content?: React.ReactNode;\n}\n\nconst T = {\n en: {\n edit: \"Edit section\", prompt: \"Prompt\", model: \"Model\", settings: \"Settings\",\n addSetting: \"Add setting\", key: \"Key\", value: \"Value\", save: \"Save\", cancel: \"Cancel\",\n addSection: \"Add section\", noModel: \"Default model\", empty: \"No content.\",\n },\n ar: {\n edit: \"تعديل القسم\", prompt: \"التوجيه\", model: \"النموذج\", settings: \"الإعدادات\",\n addSetting: \"إضافة إعداد\", key: \"المفتاح\", value: \"القيمة\", save: \"حفظ\", cancel: \"إلغاء\",\n addSection: \"إضافة قسم\", noModel: \"النموذج الافتراضي\", empty: \"لا يوجد محتوى.\",\n },\n};\n\n// ── Section settings editor (Dialog) ─────────────────────────────────────────\nfunction SectionEditor({\n open, section, models, language, onClose, onSave,\n}: {\n open: boolean;\n section: SectionModel;\n models: ModelOption[];\n language: \"en\" | \"ar\";\n onClose: () => void;\n onSave: (next: SectionModel) => void;\n}) {\n const t = T[language];\n const [draft, setDraft] = React.useState<SectionModel>(section);\n React.useEffect(() => { if (open) setDraft(section); }, [open, section]);\n\n const settings = Object.entries(draft.settings ?? {});\n const setSetting = (i: number, key: string, value: string) => {\n const next = [...settings];\n next[i] = [key, value];\n setDraft({ ...draft, settings: Object.fromEntries(next.filter(([k]) => k)) });\n };\n const addSetting = () => setDraft({ ...draft, settings: { ...(draft.settings ?? {}), \"\": \"\" } });\n\n return (\n <Dialog open={open} onOpenChange={(o) => !o && onClose()}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>{draft.title || t.edit}</DialogTitle>\n </DialogHeader>\n <div className=\"space-y-4\">\n <div className=\"space-y-1.5\">\n <Label htmlFor=\"sec-prompt\">{t.prompt}</Label>\n <Textarea\n id=\"sec-prompt\" rows={4}\n value={draft.prompt ?? \"\"}\n onChange={(e) => setDraft({ ...draft, prompt: e.target.value })}\n />\n </div>\n <div className=\"space-y-1.5\">\n <Label>{t.model}</Label>\n <Select value={draft.model ?? \"\"} onValueChange={(v) => setDraft({ ...draft, model: v })}>\n <SelectTrigger><SelectValue placeholder={t.noModel} /></SelectTrigger>\n <SelectContent>\n {models.map((m) => (\n <SelectItem key={m.value} value={m.value}>{m.label ?? m.value}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-1.5\">\n <Label>{t.settings}</Label>\n <div className=\"space-y-2\">\n {settings.map(([k, v], i) => (\n <div key={i} className=\"flex gap-2\">\n <Input placeholder={t.key} value={k} onChange={(e) => setSetting(i, e.target.value, v)} />\n <Input placeholder={t.value} value={v} onChange={(e) => setSetting(i, k, e.target.value)} />\n </div>\n ))}\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={addSetting}>\n <Plus className=\"h-3.5 w-3.5\" /> {t.addSetting}\n </Button>\n </div>\n </div>\n </div>\n <DialogFooter>\n <Button variant=\"secondary\" onClick={onClose}>{t.cancel}</Button>\n <Button onClick={() => onSave(draft)}>{t.save}</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\n// ── A single section card ────────────────────────────────────────────────────\nexport interface DynamicSectionProps {\n section: SectionModel;\n editMode?: boolean;\n models?: ModelOption[];\n language?: \"en\" | \"ar\";\n onChange?: (section: SectionModel) => void;\n onRemove?: () => void;\n /** Drag handle props (supplied by SectionBoard in edit mode). */\n handleProps?: React.HTMLAttributes<HTMLButtonElement>;\n className?: string;\n}\n\nexport function DynamicSection({\n section, editMode, models = [], language = \"en\", onChange, onRemove, handleProps, className,\n}: DynamicSectionProps) {\n const t = T[language];\n const [editing, setEditing] = React.useState(false);\n return (\n <Card className={cn(\"space-y-3 p-4\", className)}>\n <div className=\"flex items-center gap-2\">\n {editMode && (\n <button\n type=\"button\"\n aria-label=\"Drag to reorder\"\n className=\"shrink-0 cursor-grab text-muted-foreground hover:text-foreground\"\n {...handleProps}\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n )}\n <h3 className=\"min-w-0 flex-1 truncate text-sm font-semibold\">{section.title}</h3>\n {section.badge && <Badge>{section.badge}</Badge>}\n {editMode && (\n <>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 w-7 p-0\" aria-label={t.edit} onClick={() => setEditing(true)}>\n <Settings2 className=\"h-4 w-4\" />\n </Button>\n {onRemove && (\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 w-7 p-0 text-destructive\" aria-label=\"Remove\" onClick={onRemove}>\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n )}\n </>\n )}\n </div>\n\n <div className=\"text-sm text-muted-foreground\">\n {section.content ?? <span className=\"italic opacity-70\">{t.empty}</span>}\n </div>\n\n {editMode && (section.model || section.prompt) && (\n <div className=\"flex flex-wrap items-center gap-2 border-t border-border pt-2 text-[11px] text-muted-foreground\">\n {section.model && <Badge variant=\"outline\">{section.model}</Badge>}\n {section.prompt && <span className=\"line-clamp-1 flex-1 font-mono opacity-70\">{section.prompt}</span>}\n </div>\n )}\n\n <SectionEditor\n open={editing}\n section={section}\n models={models}\n language={language}\n onClose={() => setEditing(false)}\n onSave={(next) => { onChange?.(next); setEditing(false); }}\n />\n </Card>\n );\n}\n\n// ── Sortable wrapper ─────────────────────────────────────────────────────────\nfunction SortableSection(props: DynamicSectionProps & { id: string }) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: props.id });\n const style: React.CSSProperties = { transform: CSS.Transform.toString(transform), transition, opacity: isDragging ? 0.5 : 1 };\n return (\n <div ref={setNodeRef} style={style}>\n <DynamicSection {...props} handleProps={{ ...attributes, ...listeners } as never} />\n </div>\n );\n}\n\n// ── The board ────────────────────────────────────────────────────────────────\nexport interface SectionBoardProps {\n sections: SectionModel[];\n editMode?: boolean;\n models?: ModelOption[];\n language?: \"en\" | \"ar\";\n columns?: 1 | 2;\n onChange?: (sections: SectionModel[]) => void;\n onAddSection?: () => void;\n className?: string;\n}\n\n/** SectionBoard — an ordered set of dynamic sections. In `editMode` each section is\n * drag-reorderable (@dnd-kit) and editable (prompt / model / settings via a dialog);\n * `onChange` fires on reorder and on per-section edits. View mode renders content only.\n * Token-themed (dark/light), RTL + EN/AR. */\nexport function SectionBoard({\n sections, editMode, models = [], language = \"en\", columns = 1, onChange, onAddSection, className,\n}: SectionBoardProps) {\n const t = T[language];\n const isRTL = language === \"ar\";\n const [activeId, setActiveId] = React.useState<string | null>(null);\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 4 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }),\n );\n\n const update = (id: string, next: SectionModel) =>\n onChange?.(sections.map((s) => (s.id === id ? next : s)));\n const remove = (id: string) => onChange?.(sections.filter((s) => s.id !== id));\n\n const onDragEnd = (e: DragEndEvent) => {\n setActiveId(null);\n const { active, over } = e;\n if (!over || active.id === over.id) return;\n const from = sections.findIndex((s) => s.id === active.id);\n const to = sections.findIndex((s) => s.id === over.id);\n if (from < 0 || to < 0) return;\n onChange?.(arrayMove(sections, from, to));\n };\n\n const grid = cn(\"grid gap-3\", columns === 2 ? \"sm:grid-cols-2\" : \"grid-cols-1\");\n const active = sections.find((s) => s.id === activeId);\n\n if (!editMode) {\n return (\n <div dir={isRTL ? \"rtl\" : \"ltr\"} className={cn(grid, className)}>\n {sections.map((s) => (\n <DynamicSection key={s.id} section={s} language={language} models={models} />\n ))}\n </div>\n );\n }\n\n return (\n <div dir={isRTL ? \"rtl\" : \"ltr\"} className={cn(\"space-y-3\", className)}>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={(e: DragStartEvent) => setActiveId(String(e.active.id))}\n onDragEnd={onDragEnd}\n onDragCancel={() => setActiveId(null)}\n >\n <SortableContext items={sections.map((s) => s.id)} strategy={verticalListSortingStrategy}>\n <div className={grid}>\n {sections.map((s) => (\n <SortableSection\n key={s.id} id={s.id} section={s} editMode models={models} language={language}\n onChange={(next) => update(s.id, next)} onRemove={() => remove(s.id)}\n />\n ))}\n </div>\n </SortableContext>\n <DragOverlay>\n {active ? <DynamicSection section={active} editMode models={models} language={language} className=\"shadow-lg\" /> : null}\n </DragOverlay>\n </DndContext>\n\n {onAddSection && (\n <Button variant=\"outline\" className=\"w-full border-dashed\" onClick={onAddSection}>\n <Plus className=\"h-4 w-4\" /> {t.addSection}\n </Button>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Bold, Italic, Heading1, Heading2, Heading3, List, ListOrdered, Link2, Code, Code2, Quote, Eye, Pencil, Columns2 } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport { Textarea } from \"../ui/textarea\";\nimport { MarkdownRenderer } from \"./MarkdownRenderer\";\n\nexport type MarkdownView = \"write\" | \"preview\" | \"split\";\n\nexport interface MarkdownEditorProps {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n view?: MarkdownView;\n defaultView?: MarkdownView;\n onViewChange?: (view: MarkdownView) => void;\n language?: \"en\" | \"ar\";\n placeholder?: string;\n minRows?: number;\n className?: string;\n}\n\ntype Action =\n | { wrap: string }\n | { wrap: string; end: string }\n | { line: string }\n | { insert: string };\n\nconst TOOLBAR: { icon: React.ElementType; title: { en: string; ar: string }; act: Action }[] = [\n { icon: Bold, title: { en: \"Bold\", ar: \"غامق\" }, act: { wrap: \"**\" } },\n { icon: Italic, title: { en: \"Italic\", ar: \"مائل\" }, act: { wrap: \"_\" } },\n { icon: Heading1, title: { en: \"Heading 1\", ar: \"عنوان 1\" }, act: { line: \"# \" } },\n { icon: Heading2, title: { en: \"Heading 2\", ar: \"عنوان 2\" }, act: { line: \"## \" } },\n { icon: Heading3, title: { en: \"Heading 3\", ar: \"عنوان 3\" }, act: { line: \"### \" } },\n { icon: List, title: { en: \"Bulleted list\", ar: \"قائمة\" }, act: { line: \"- \" } },\n { icon: ListOrdered, title: { en: \"Numbered list\", ar: \"قائمة مرقمة\" }, act: { line: \"1. \" } },\n { icon: Quote, title: { en: \"Quote\", ar: \"اقتباس\" }, act: { line: \"> \" } },\n { icon: Link2, title: { en: \"Link\", ar: \"رابط\" }, act: { wrap: \"[\", end: \"](https://)\" } },\n { icon: Code, title: { en: \"Inline code\", ar: \"كود\" }, act: { wrap: \"`\" } },\n { icon: Code2, title: { en: \"Code block\", ar: \"كتلة كود\" }, act: { wrap: \"\\n```\\n\", end: \"\\n```\\n\" } },\n];\n\nconst VIEWS: { key: MarkdownView; icon: React.ElementType; en: string; ar: string }[] = [\n { key: \"write\", icon: Pencil, en: \"Write\", ar: \"كتابة\" },\n { key: \"preview\", icon: Eye, en: \"Preview\", ar: \"معاينة\" },\n { key: \"split\", icon: Columns2, en: \"Split\", ar: \"تقسيم\" },\n];\n\n/** MarkdownEditor — toolbar (bold/italic/headings/lists/link/code/quote) + a textarea\n * with a Write / Preview / Split view toggle (Split shows a live MarkdownRenderer).\n * Dependency-light (no CodeMirror/Monaco). Controlled or uncontrolled. RTL + EN/AR. */\nexport function MarkdownEditor({\n value, defaultValue = \"\", onChange, view, defaultView = \"split\", onViewChange,\n language = \"en\", placeholder, minRows = 10, className,\n}: MarkdownEditorProps) {\n const isRTL = language === \"ar\";\n const ref = React.useRef<HTMLTextAreaElement>(null);\n const [internal, setInternal] = React.useState(defaultValue);\n const text = value ?? internal;\n const setText = (v: string) => { setInternal(v); onChange?.(v); };\n\n const [internalView, setInternalView] = React.useState<MarkdownView>(defaultView);\n const activeView = view ?? internalView;\n const setView = (v: MarkdownView) => { setInternalView(v); onViewChange?.(v); };\n\n function apply(act: Action) {\n const el = ref.current;\n if (!el) return;\n const start = el.selectionStart, end = el.selectionEnd;\n const sel = text.slice(start, end);\n let next = text, caret = end;\n if (\"wrap\" in act) {\n const open = act.wrap, close = (\"end\" in act ? act.end : act.wrap);\n next = text.slice(0, start) + open + sel + close + text.slice(end);\n caret = start + open.length + sel.length + close.length;\n } else if (\"line\" in act) {\n const lineStart = text.lastIndexOf(\"\\n\", start - 1) + 1;\n next = text.slice(0, lineStart) + act.line + text.slice(lineStart);\n caret = end + act.line.length;\n } else if (\"insert\" in act) {\n next = text.slice(0, start) + act.insert + text.slice(end);\n caret = start + act.insert.length;\n }\n setText(next);\n requestAnimationFrame(() => { el.focus(); el.setSelectionRange(caret, caret); });\n }\n\n const t = (en: string, ar: string) => (isRTL ? ar : en);\n\n return (\n <div dir={isRTL ? \"rtl\" : \"ltr\"} className={cn(\"flex flex-col overflow-hidden rounded-xl border border-border bg-card\", className)}>\n {/* Toolbar */}\n <div className=\"flex flex-wrap items-center gap-0.5 border-b border-border p-1.5\">\n {TOOLBAR.map(({ icon: Icon, title, act }, i) => (\n <Button key={i} type=\"button\" variant=\"ghost\" size=\"sm\" className=\"h-7 w-7 p-0\"\n title={t(title.en, title.ar)} aria-label={t(title.en, title.ar)}\n disabled={activeView === \"preview\"} onClick={() => apply(act)}>\n <Icon className=\"h-4 w-4\" />\n </Button>\n ))}\n <div className=\"ms-auto flex items-center gap-0.5\">\n {VIEWS.map(({ key, icon: Icon, en, ar }) => (\n <Button key={key} type=\"button\" size=\"sm\" variant={activeView === key ? \"secondary\" : \"ghost\"}\n className=\"h-7 gap-1.5 px-2\" onClick={() => setView(key)}>\n <Icon className=\"h-3.5 w-3.5\" />{t(en, ar)}\n </Button>\n ))}\n </div>\n </div>\n\n {/* Body */}\n <div className={cn(\"min-h-0 flex-1\", activeView === \"split\" && \"grid grid-cols-1 divide-y divide-border md:grid-cols-2 md:divide-x md:divide-y-0 rtl:md:divide-x-reverse\")}>\n {activeView !== \"preview\" && (\n <Textarea\n ref={ref}\n value={text}\n onChange={(e) => setText(e.target.value)}\n placeholder={placeholder ?? t(\"Write markdown…\", \"اكتب ماركداون…\")}\n rows={minRows}\n dir={isRTL ? \"rtl\" : \"ltr\"}\n className=\"min-h-[12rem] resize-y rounded-none border-0 font-mono text-sm focus-visible:ring-0\"\n />\n )}\n {activeView !== \"write\" && (\n <div className=\"min-h-[12rem] overflow-auto p-4\">\n {text.trim()\n ? <MarkdownRenderer content={text} language={language} />\n : <p className=\"text-sm text-muted-foreground\">{t(\"Nothing to preview yet.\", \"لا شيء للمعاينة بعد.\")}</p>}\n </div>\n )}\n </div>\n </div>\n );\n}\n","'use client'\n\n/**\n * CopilotProvider — @prism/ui F3\n *\n * Context provider that wires UnifiedCopilotDock to the cortex-sdk\n * CortexClient.copilotDispatch() SSE stream. Apps mount this once at their\n * root (or inside LanguageProvider) and call useCopilot() anywhere to\n * open/close the dock.\n *\n * Wave B additions (2026-06-06):\n * B1 — Fetches /v1/copilot/config on mount; exposes allowedAgents as dynamic\n * personas list and allowedTools/allowedSkills for the dock panels.\n * Falls back to empty/undefined when Cortex is unreachable (nil-safe).\n * B2 — allowedTools + allowedSkills passed to dock via new prop.\n * B3 — AR suggestions already fixed (bilingual pair shape). Provider default\n * suggestions are now bilingual.\n * B4 — pageContext prop forwarded into CopilotRequest.intelligenceContext.data_summary.\n *\n * Architecture:\n * - Provider manages CopilotChatState (messages, streaming, error).\n * - onSend → CortexClient.copilotDispatch() → async generator → state updates.\n * - Language comes from the shared LanguageProvider context so the copilot\n * always answers in the active locale (EN/AR).\n * - cortex-sdk is a pure fetch/SSE SDK — no React dependency. Safe in any\n * runtime (browser, Node 18+, edge).\n *\n * Error handling (Rule 14 spirit):\n * - Network / Cortex unreachable → streamError shown in dock; no crash.\n * - Each SSE turn is wrapped in try/catch/finally so state always resolves.\n *\n * Rules: Rule 7 (displayName), Rule 8 (bilingual), Rule 16 (Sentra style),\n * Rule 25 (product-agnostic — no product DB/context reads).\n */\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from 'react'\n// Decoupled from @sentra/cortex-sdk — the host injects a CopilotClient (same shape).\nimport type { CopilotClient, CopilotRequest, CopilotEvent, StepEvent as CortexStepEvent } from './client'\nimport type {\n CopilotChatState,\n CopilotDockContext,\n CopilotMessage,\n AgentStep,\n SendOptions,\n A2UIArtifact,\n CopilotQuickAction,\n} from './types'\nimport UnifiedCopilotDock from './UnifiedCopilotDock'\nimport type { A2UIActionItem, ArtifactInteraction } from './artifacts/types'\nimport { useT as _useT } from '../../i18n/LanguageProvider'\n\n// Safely read language context — won't throw if LanguageProvider is absent.\nfunction useSafeLanguage(): { language: 'en' | 'ar'; isRTL: boolean } {\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n const ctx = _useT()\n return { language: ctx.language as 'en' | 'ar', isRTL: ctx.isRTL }\n } catch {\n return { language: 'en', isRTL: false }\n }\n}\n\n// ── ID generator ──────────────────────────────────────────────────────────────\n\nfunction genId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`\n}\n\n// stripA2UI removes ```a2ui … ``` artifact blocks from assistant text so the\n// raw JSON is never shown to the user — the structured widget is rendered\n// separately from message.a2uiArtifacts. During streaming the closing fence may\n// not have arrived yet, so we also hide any in-progress (unclosed) block from\n// the first ```a2ui marker onward.\nfunction stripA2UI(text: string): string {\n let out = text.replace(/```a2ui[\\s\\S]*?```/g, '')\n const open = out.indexOf('```a2ui')\n if (open !== -1) out = out.slice(0, open)\n return out.trim()\n}\n\n// genUUID returns an RFC-4122 v4 UUID. The Cortex session backend requires a\n// real UUID (non-UUID ids are skipped) — crypto.randomUUID is available in all\n// browsers we target; the Math.random fallback keeps SSR/old-runtime safe.\nfunction genUUID(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0\n const v = c === 'x' ? r : (r & 0x3) | 0x8\n return v.toString(16)\n })\n}\n\n// ── Agent Arabic name fallback map ────────────────────────────────────────────\n// The Cortex /v1/copilot/config endpoint (config_handler.go) currently returns\n// only `name` (EN). The DB has name_ar populated for all agent-persona rows.\n// Until the Go handler is updated to emit name_ar, we map by slug here.\n// Source: cortex DB plugins table, plugin_type='adk_artifact', adk_kind='agent'\n// Query: SELECT slug, name_ar FROM plugins WHERE slug LIKE 'agent-persona-%';\nconst AGENT_AR_NAMES: Record<string, string> = {\n 'agent-persona-analyst': 'محلل الاستخبارات',\n 'agent-persona-media': 'محلل الإعلام',\n 'agent-persona-diplomat': 'الدبلوماسي',\n 'agent-persona-osint': 'باحث OSINT',\n}\n\n// ── Config types (mirrors config_handler.go response shape) ──────────────────\n\nexport interface CopilotConfigTool {\n slug: string\n name: string\n name_ar?: string\n function_name?: string\n}\n\nexport interface CopilotConfigSkill {\n slug: string\n name: string\n name_ar?: string\n}\n\nexport interface CopilotConfigAgent {\n slug: string\n name: string\n /** Arabic name. The Go config handler currently returns only `name` (EN).\n * When the server starts emitting this field it will be picked up automatically.\n * Until then, CopilotProvider falls back to the AGENT_AR_NAMES map below.\n */\n name_ar?: string\n}\n\n/**\n * Token-scoped branding the dashboard/SDK applies to the copilot dock.\n * Forwarded verbatim from cortex_api_keys.capabilities.branding (config_handler.go).\n * All fields optional — an empty object means \"use the dock defaults\".\n */\nexport interface CopilotBranding {\n /** Dock header title (EN). Overrides the default \"Copilot\". */\n title?: string\n /** Dock header title (AR). */\n titleAr?: string\n /** Accent colour (CSS colour string) applied to the dock's primary surfaces. */\n primaryColor?: string\n /** Input placeholder (EN). */\n placeholder?: string\n /** Input placeholder (AR). */\n placeholderAr?: string\n}\n\n/**\n * Token-scoped UI toggles. Forwarded from capabilities.ui. Each defaults to\n * \"shown\" when undefined so an unconfigured token keeps the full surface.\n */\nexport interface CopilotUIConfig {\n /** Show the in-dock Tools panel + / command tools group. Default true. */\n showTools?: boolean\n /** Show the in-dock Skills panel + / command skills group. Default true. */\n showSkills?: boolean\n /** Show the @ agent/persona menu + picker. Default true. */\n showAgents?: boolean\n}\n\nexport interface CopilotConfig {\n allowed_tools: CopilotConfigTool[]\n allowed_skills: CopilotConfigSkill[]\n allowed_agents: CopilotConfigAgent[]\n allowed_mcp: unknown[]\n branding: CopilotBranding\n ui: CopilotUIConfig\n limits: {\n rate_per_min: number | null\n monthly_budget: string | null\n hard_cap: string | null\n }\n}\n\n// ── Context ───────────────────────────────────────────────────────────────────\n\n/**\n * Options accepted by `useCopilot().open()`.\n *\n * Backwards-compatible: bare `open()` (no args) still works unchanged.\n */\nexport interface OpenCopilotOptions {\n /**\n * Pre-fill the dock input with this message text.\n * When autoSend is false (default), the text is placed in the input field\n * and focus is moved to it so the user can review before sending.\n */\n message?: string\n /**\n * When true, the message is sent automatically as soon as the dock opens,\n * without user confirmation. Use for smart-action \"اسأل\" flows where the\n * intent is clear from the card context.\n */\n autoSend?: boolean\n}\n\nexport interface CopilotContextValue {\n /**\n * Open the copilot dock.\n *\n * @example bare open (no pre-load)\n * ```tsx\n * const { open } = useCopilot()\n * <button onClick={() => open()}>Copilot</button>\n * ```\n *\n * @example pre-fill input\n * ```tsx\n * open({ message: `اشرح هذا الخبر: ${card.title_ar}` })\n * ```\n *\n * @example auto-send\n * ```tsx\n * open({ message: `اشرح هذا الخبر: ${card.title_ar}`, autoSend: true })\n * ```\n */\n open: (opts?: OpenCopilotOptions) => void\n /** Close the copilot dock */\n close: () => void\n /** Whether the dock is currently open/expanded */\n isOpen: boolean\n /** Token-scoped config (null while loading or when Cortex is unreachable) */\n config: CopilotConfig | null\n}\n\nconst CopilotContext = createContext<CopilotContextValue | null>(null)\n\n// ── Provider props ────────────────────────────────────────────────────────────\n\nexport interface CopilotProviderProps {\n children: ReactNode\n\n /**\n * Cortex base URL. Defaults to '/api/v1'.\n * Apps that proxy Cortex through Next.js rewrites pass the rewrite path here\n * (e.g. '/api/cortex'). Apps with a separate Cortex service pass the full\n * service URL (e.g. 'http://cortex:8210').\n */\n baseUrl?: string\n\n /**\n * Optional Cortex API token (Bearer). When apps proxy Cortex via cookie-auth\n * (Next.js middleware attaches the token server-side) the token can be omitted.\n * When a raw token is available client-side, pass it here.\n */\n token?: string\n /** Streaming client (replaces the cortex-sdk). Without it the dock renders but cannot dispatch. */\n client?: CopilotClient\n\n /**\n * Page-level context fed to the copilot dock (type, title, suggestions, etc.).\n * Defaults to a generic \"global\" context. Apps update this by re-rendering\n * the provider with different context (or by wrapping per-page sub-sections).\n */\n context?: CopilotDockContext\n\n /**\n * Start the dock in an open/expanded state. Defaults to false.\n */\n defaultOpen?: boolean\n\n /**\n * B4: Optional markdown description of the current page. When set, the copilot\n * receives it as intelligenceContext.data_summary in every dispatch so it\n * \"understands the current page\" without the user having to explain.\n *\n * Apps update this prop on navigation to keep the context current.\n *\n * Example: \"User is on the Plugins page. 13 plugins are loaded. Active types:\n * tool, skill, agent. The user can enable/disable plugins here.\"\n */\n pageContext?: string\n\n /**\n * Quick-action chips shown in the dock's empty/intro state. Each chip sends\n * its `prompt` when clicked. Falls back to `context.suggestions` when omitted.\n */\n quickActions?: CopilotQuickAction[]\n}\n\n// ── Default context ───────────────────────────────────────────────────────────\n\nconst DEFAULT_CONTEXT: CopilotDockContext = {\n type: 'global',\n contextRef: '',\n title: 'Copilot',\n mode: 'global',\n suggestions: [\n { en: 'Summarise recent alerts', ar: 'لخّص التنبيهات الأخيرة' },\n { en: 'What are the key narratives this week?', ar: 'ما أبرز السرديات هذا الأسبوع؟' },\n { en: 'Show top entities by coverage', ar: 'اعرض أبرز الكيانات حسب التغطية' },\n ],\n}\n\n// ── Provider ──────────────────────────────────────────────────────────────────\n\nconst CopilotProvider = ({\n children,\n baseUrl = '/api/v1',\n token,\n context = DEFAULT_CONTEXT,\n defaultOpen = false,\n pageContext,\n quickActions,\n client: injectedClient,\n}: CopilotProviderProps) => {\n const { language } = useSafeLanguage()\n\n // ── Dock open/close state ───────────────────────────────────────────────────\n const [isOpen, setIsOpen] = useState(defaultOpen)\n\n // ── Pending message state (from open({ message, autoSend })) ───────────────\n // Passed as pendingMessage/pendingAutoSend props to UnifiedCopilotDock, which\n // consumes them in its own effect and calls onPendingMessageConsumed to clear.\n const [pendingMessage, setPendingMessage] = useState<string | null>(null)\n const [pendingAutoSend, setPendingAutoSend] = useState(false)\n\n // ── B1: Token-scoped config ─────────────────────────────────────────────────\n const [config, setConfig] = useState<CopilotConfig | null>(null)\n\n // ── Chat state ──────────────────────────────────────────────────────────────\n const [messages, setMessages] = useState<CopilotMessage[]>([])\n const [inputValue, setInputValue] = useState('')\n const [isLoading, setIsLoading] = useState(false)\n const [isStreaming, setIsStreaming] = useState(false)\n const [isReceiving, setIsReceiving] = useState(false)\n // True after [DONE] while the committed assistant message paints (markdown,\n // tables, charts, artifacts). Cleared on a post-commit double-rAF so the dock\n // keeps its thinking indicator until the rendered content is on screen.\n const [isFinalizing, setIsFinalizing] = useState(false)\n const [streamingText, setStreamingText] = useState('')\n const [agentSteps, setAgentSteps] = useState<AgentStep[]>([])\n const [streamError, setStreamError] = useState<string | null>(null)\n\n // ── Wave D: session management ──────────────────────────────────────────────\n // The current Cortex chat-session id. When set, dispatch persists both turns\n // to it; the backend auto-titles a fresh session from the first message. null\n // = a new untracked conversation (a session is created server-side on first send).\n const [sessionId, setSessionId] = useState<string | null>(null)\n const [sessionTitle, setSessionTitle] = useState<string | undefined>(undefined)\n\n // Keep last sent payload for retry\n const lastPayloadRef = useRef<{ text: string; opts?: SendOptions } | null>(null)\n // AbortController for the current stream\n const abortRef = useRef<AbortController | null>(null)\n\n // ── CortexClient — memoised per baseUrl/token change ───────────────────────\n // Build a new client ref only when baseUrl/token actually changes.\n const clientRef = useRef<CopilotClient | null>(injectedClient ?? null)\n clientRef.current = injectedClient ?? null\n\n // ── B1: Fetch /v1/copilot/config on mount (and when client changes) ─────────\n // Nil-safe: if the fetch fails for any reason (Cortex unreachable, 401, etc.),\n // config stays null and the dock falls back to hardcoded PERSONAS.\n useEffect(() => {\n let cancelled = false\n const fetchConfig = async () => {\n try {\n // Use raw fetch to the config path rather than the client.request() helper\n // so we don't throw on 401 when no token is yet available.\n const configUrl = baseUrl.endsWith('/') ? `${baseUrl}copilot/config` : `${baseUrl}/copilot/config`\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (token) headers['Authorization'] = `Bearer ${token}`\n const res = await fetch(configUrl, {\n method: 'GET',\n headers,\n credentials: 'include',\n })\n if (!res.ok || cancelled) return\n const data = (await res.json()) as CopilotConfig\n if (!cancelled) setConfig(data)\n } catch {\n // Cortex unreachable or no token yet — silently ignore, dock degrades gracefully.\n }\n }\n void fetchConfig()\n return () => { cancelled = true }\n }, [baseUrl, token])\n\n // ── Map cortex StepEvent → AgentStep ─────────────────────────────────────\n const mapStep = (s: CortexStepEvent): AgentStep => ({\n step: s.step,\n message: s.message,\n done: s.done,\n count: s.count,\n duration_ms: s.duration_ms,\n sources: s.sources,\n domains: s.domains,\n handles: s.handles,\n query: s.query,\n })\n\n // ── Send ───────────────────────────────────────────────────────────────────\n\n const handleSend = useCallback(\n async (text: string, opts?: SendOptions) => {\n if (!text.trim()) return\n\n // Abort any in-flight stream\n abortRef.current?.abort()\n const abort = new AbortController()\n abortRef.current = abort\n\n lastPayloadRef.current = { text, opts }\n\n // Wave D: ensure a session id so dispatch persists this conversation.\n // Lazily mint one for a fresh conversation; the backend upserts + auto-titles it.\n let activeSession = sessionId\n if (!activeSession) {\n activeSession = genUUID()\n setSessionId(activeSession)\n }\n\n // Add user message\n const userMsg: CopilotMessage = {\n id: genId(),\n role: 'user',\n content: text,\n hidden: opts?.hideUserMessage,\n }\n\n setMessages(prev => [...prev, userMsg])\n setInputValue('')\n setStreamError(null)\n setIsLoading(true)\n setIsStreaming(false)\n setIsReceiving(false)\n setIsFinalizing(false)\n setAgentSteps([])\n setStreamingText('')\n\n // Build the assistant message shell — will be updated with streaming content\n const assistantId = `streaming-${genId()}`\n let accumulated = ''\n let finalSteps: AgentStep[] = []\n // A2UI: collect artifacts emitted before [DONE] into the finalised message.\n let finalArtifacts: A2UIArtifact[] = []\n\n try {\n const client = clientRef.current\n if (!client) { throw new Error('No CopilotClient provided') }\n\n // B4: Build intelligenceContext — inject pageContext as data_summary when available.\n const intelligenceCtx = pageContext\n ? { data_summary: pageContext }\n : undefined\n\n const req: CopilotRequest = {\n messages: [\n // Pass the full history so the model has conversation context\n ...(messages.map(m => ({\n role: m.role,\n content: m.content,\n }))),\n { role: 'user', content: text },\n ],\n language,\n mode: context.mode,\n thinking_mode: opts?.thinkingMode,\n forced_tools: opts?.forcedTools\n ? {\n deep_research: opts.forcedTools.deep_research ?? false,\n search_sources: opts.forcedTools.search_sources ?? [],\n }\n : undefined,\n attachments: opts?.attachments as CopilotRequest['attachments'],\n intelligenceContext: intelligenceCtx,\n // Wave D: persist this turn to the active session (backend upserts + auto-titles).\n session_id: activeSession,\n // Phase-3: structured interaction post-back from an interactive artifact.\n // Forwarded when handleArtifactInteract is the caller; absent for normal sends.\n interaction: opts?.interaction,\n }\n\n // Optimistically title a brand-new conversation from its first message\n // so the header reflects it immediately (backend auto-titles to match).\n if (!sessionTitle && messages.length === 0) {\n const t = text.length > 50 ? `${text.slice(0, 50)}…` : text\n setSessionTitle(t)\n }\n\n for await (const event of client.copilotDispatch(req, { signal: abort.signal })) {\n if (abort.signal.aborted) break\n\n switch (event.type) {\n case 'delta': {\n accumulated += event.text\n setIsStreaming(true)\n setIsReceiving(true)\n // Hide any ```a2ui block from the live text — the widget renders separately.\n setStreamingText(stripA2UI(accumulated))\n break\n }\n case 'step': {\n const step = mapStep(event.step)\n finalSteps = [...finalSteps, step]\n setAgentSteps([...finalSteps])\n setIsStreaming(true)\n break\n }\n case 'citations': {\n // Citations are attached to the finalised assistant message below.\n break\n }\n case 'artifact': {\n // A2UI: accumulate artifacts — they are attached to the finalised message.\n finalArtifacts = [...finalArtifacts, event.artifact as A2UIArtifact]\n break\n }\n case 'done': {\n // Stream finished cleanly — break out of the generator\n break\n }\n default:\n break\n }\n }\n\n // Finalise: commit the assistant message with stripped text + steps + artifacts.\n // The ```a2ui block is removed from content (rendered as a widget instead);\n // commit when there is prose OR at least one artifact.\n const cleanContent = stripA2UI(accumulated)\n const committed = !abort.signal.aborted && (cleanContent || finalArtifacts.length > 0)\n if (committed) {\n // Enter the finalizing phase BEFORE committing so the dock's busy\n // indicator survives the streaming→done transition. Cleared after the\n // message has had two animation frames to mount + paint its markdown,\n // tables, charts and artifacts.\n setIsFinalizing(true)\n const assistantMsg: CopilotMessage = {\n id: assistantId,\n role: 'assistant',\n content: cleanContent,\n steps: finalSteps.length > 0 ? finalSteps : undefined,\n a2uiArtifacts: finalArtifacts.length > 0 ? finalArtifacts : undefined,\n }\n setMessages(prev => [...prev, assistantMsg])\n if (typeof requestAnimationFrame !== 'undefined') {\n requestAnimationFrame(() =>\n requestAnimationFrame(() => setIsFinalizing(false)),\n )\n } else {\n setIsFinalizing(false)\n }\n }\n } catch (err) {\n if (abort.signal.aborted) {\n // User aborted — not an error\n return\n }\n console.error('[CopilotProvider]', 'Stream error', err)\n const msg =\n err instanceof Error ? err.message : 'Cortex is unreachable. Please try again.'\n setStreamError(msg)\n } finally {\n setIsLoading(false)\n setIsStreaming(false)\n setIsReceiving(false)\n setStreamingText('')\n setAgentSteps([])\n }\n },\n // messages is included so each turn picks up the current history correctly.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [messages, language, context.mode, baseUrl, token, pageContext, sessionId, sessionTitle],\n )\n\n const handleRetry = useCallback(() => {\n if (!lastPayloadRef.current) return\n const { text, opts } = lastPayloadRef.current\n // Remove the last assistant message (if any) so retry re-runs cleanly\n setMessages(prev =>\n prev.filter(m => m.role !== 'assistant' || prev.indexOf(m) < prev.length - 1),\n )\n setStreamError(null)\n void handleSend(text, opts)\n }, [handleSend])\n\n const handleNewConversation = useCallback(() => {\n abortRef.current?.abort()\n setMessages([])\n setInputValue('')\n setStreamError(null)\n setIsLoading(false)\n setIsStreaming(false)\n setIsReceiving(false)\n setIsFinalizing(false)\n setStreamingText('')\n setAgentSteps([])\n lastPayloadRef.current = null\n // Wave D: drop the active session so the next send mints a fresh one.\n setSessionId(null)\n setSessionTitle(undefined)\n }, [])\n\n // ── Wave D: history (list) + load a past session ────────────────────────────\n\n // Fetch the token's chat sessions, mapped to the dock's history shape.\n const handleFetchHistory = useCallback(async (): Promise<\n Array<{ id: string; title: string; updated_at: string; context_label?: string }>\n > => {\n try {\n const url = baseUrl.endsWith('/')\n ? `${baseUrl}copilot/sessions`\n : `${baseUrl}/copilot/sessions`\n const res = await fetch(url, {\n credentials: 'include',\n headers: token ? { Authorization: `Bearer ${token}` } : undefined,\n })\n if (!res.ok) return []\n const data = (await res.json()) as {\n sessions?: Array<{ id: string; title: string; last_message_at?: number; created_at?: number }>\n }\n return (data.sessions ?? []).map(s => ({\n id: s.id,\n title: s.title || 'New chat',\n // dock expects an ISO/string updated_at; convert epoch-ms when present.\n updated_at: s.last_message_at\n ? new Date(s.last_message_at).toISOString()\n : s.created_at\n ? new Date(s.created_at).toISOString()\n : '',\n }))\n } catch {\n return []\n }\n }, [baseUrl, token])\n\n // Delete a past session (and its memory) on the server.\n const handleDeleteConversation = useCallback(\n async (id: string): Promise<void> => {\n const url = baseUrl.endsWith('/')\n ? `${baseUrl}copilot/sessions/${id}`\n : `${baseUrl}/copilot/sessions/${id}`\n const res = await fetch(url, {\n method: 'DELETE',\n credentials: 'include',\n headers: token ? { Authorization: `Bearer ${token}` } : undefined,\n })\n // 204 No Content on success; 404 (already gone) is also acceptable.\n if (!res.ok && res.status !== 404) {\n throw new Error(`delete session failed: ${res.status}`)\n }\n },\n [baseUrl, token],\n )\n\n // Load a past session's messages and make it the active conversation.\n const handleLoadConversation = useCallback(\n async (id: string) => {\n abortRef.current?.abort()\n try {\n const url = baseUrl.endsWith('/')\n ? `${baseUrl}copilot/sessions/${id}/messages`\n : `${baseUrl}/copilot/sessions/${id}/messages`\n const res = await fetch(url, {\n credentials: 'include',\n headers: token ? { Authorization: `Bearer ${token}` } : undefined,\n })\n if (!res.ok) return\n const data = (await res.json()) as {\n title?: string\n messages?: Array<{ role: string; content: string }>\n }\n const loaded: CopilotMessage[] = (data.messages ?? [])\n .filter(m => m.role === 'user' || m.role === 'assistant')\n .map(m => ({\n id: genId(),\n role: m.role as 'user' | 'assistant',\n content: m.content,\n }))\n setMessages(loaded)\n setSessionId(id)\n setSessionTitle(data.title)\n setStreamError(null)\n setStreamingText('')\n setAgentSteps([])\n setInputValue('')\n } catch {\n // Silent — the dock shows the prior conversation unchanged on failure.\n }\n },\n [baseUrl, token],\n )\n\n const handleStop = useCallback(() => {\n abortRef.current?.abort()\n setIsLoading(false)\n setIsStreaming(false)\n setIsReceiving(false)\n setIsFinalizing(false)\n }, [])\n\n // ── CopilotChatState object ────────────────────────────────────────────────\n\n const chatState: CopilotChatState = {\n messages,\n streamingText,\n isReceiving,\n isLoading,\n isStreaming,\n isFinalizing,\n agentSteps,\n streamError,\n inputValue,\n onInputChange: setInputValue,\n onSend: (text, opts) => { void handleSend(text, opts) },\n onStop: handleStop,\n onRetry: handleRetry,\n onNewConversation: handleNewConversation,\n // Wave D: session management — activates the dock's history popover.\n conversationId: sessionId ?? undefined,\n conversationTitle: sessionTitle,\n onFetchHistory: handleFetchHistory,\n onLoadConversation: handleLoadConversation,\n onDeleteConversation: handleDeleteConversation,\n }\n\n // ── B1: Build dynamic personas list from config.allowed_agents ────────────\n // Strip the \"agent-persona-\" prefix if present, so dispatch receives the\n // short slug (e.g. \"analyst\") the copilot backend recognises as a persona.\n // Falls back to undefined → UnifiedCopilotDock uses its hardcoded PERSONAS.\n const dynamicPersonas = config && config.allowed_agents.length > 0\n ? config.allowed_agents.map(a => ({\n id: a.slug.replace(/^agent-persona-/, ''),\n label: a.name,\n // Prefer name_ar from the server payload (when the Go handler emits it),\n // then fall back to AGENT_AR_NAMES keyed by the full slug, then the EN name.\n labelAr: a.name_ar || AGENT_AR_NAMES[a.slug] || a.name,\n icon: undefined,\n }))\n : undefined\n\n // ── Context value ──────────────────────────────────────────────────────────\n\n // ── A2UI: artifact action handler ─────────────────────────────────────────\n // When an ArtifactActions chip is clicked, send the item.prompt as a new\n // user message via the existing handleSend path (expands the dock if collapsed).\n const handleArtifactAction = useCallback(\n (item: A2UIActionItem) => {\n if (!item.prompt) return\n setIsOpen(true)\n void handleSend(item.prompt)\n },\n [handleSend],\n )\n\n // ── Phase-3: structured artifact interaction handler ──────────────────────\n // When an interactive Phase-3 artifact (client_candidates, client_field_picker,\n // client_diff_confirm, persona_starters) posts a structured interaction:\n // 1. Open the dock so the response is visible.\n // 2. Synthesise a minimal text tag — never shown to the user (hideUserMessage).\n // 3. Attach the interaction to the CopilotRequest so the backend dispatches\n // on structured data rather than the synthesised text.\n const handleArtifactInteract = useCallback(\n (interaction: ArtifactInteraction) => {\n setIsOpen(true)\n const text = `[interaction:${interaction.kind}]`\n void handleSend(text, {\n hideUserMessage: true,\n interaction,\n })\n },\n [handleSend],\n )\n\n const handleOpen = useCallback((opts?: OpenCopilotOptions) => {\n setIsOpen(true)\n if (opts?.message) {\n setPendingMessage(opts.message)\n setPendingAutoSend(opts.autoSend ?? false)\n }\n }, [])\n\n const handleClose = useCallback(() => setIsOpen(false), [])\n\n const handlePendingMessageConsumed = useCallback(() => {\n setPendingMessage(null)\n setPendingAutoSend(false)\n }, [])\n\n const contextValue: CopilotContextValue = {\n open: handleOpen,\n close: handleClose,\n isOpen,\n config,\n }\n\n return (\n <CopilotContext.Provider value={contextValue}>\n {children}\n\n {/* Mount the dock — always in the DOM so state persists across navigation */}\n <UnifiedCopilotDock\n chatState={chatState}\n context={context}\n language={language}\n defaultExpanded={isOpen}\n // Intro quick-action chips (empty state). Falls back to suggestions.\n quickActions={quickActions}\n onClose={handleClose}\n // B1: dynamic personas from config (undefined = use hardcoded fallback)\n personas={dynamicPersonas}\n // B2: tools + skills from config for the in-dock panel\n allowedTools={config?.allowed_tools}\n allowedSkills={config?.allowed_skills}\n // B4: page-context already forwarded via chatState.onSend intelligenceContext\n // E: token-scoped branding + ui toggles from config\n branding={config?.branding}\n uiConfig={config?.ui}\n // A2UI: artifact action chip → send prompt as new user message\n onArtifactAction={handleArtifactAction}\n // Phase-3: structured interaction → dispatch with interaction payload\n onArtifactInteract={handleArtifactInteract}\n // Task 3: pre-loaded message from open({ message, autoSend })\n pendingMessage={pendingMessage}\n pendingAutoSend={pendingAutoSend}\n onPendingMessageConsumed={handlePendingMessageConsumed}\n />\n </CopilotContext.Provider>\n )\n}\n\nCopilotProvider.displayName = 'CopilotProvider'\n\n// ── useCopilot ────────────────────────────────────────────────────────────────\n\n/**\n * useCopilot — consume the copilot context.\n *\n * Returns `{ open, close, isOpen, config }`.\n * Must be used inside a <CopilotProvider>.\n *\n * @example\n * ```tsx\n * const { open } = useCopilot()\n * <button onClick={open}>Ask AI</button>\n * ```\n */\nexport const useCopilot = (): CopilotContextValue => {\n const ctx = useContext(CopilotContext)\n if (!ctx) {\n throw new Error('[useCopilot] Must be used inside <CopilotProvider> from @prism/ui')\n }\n return ctx\n}\n\nexport { CopilotProvider }\nexport default CopilotProvider\n","'use client'\n\nimport React, { useState, useRef, useEffect, useCallback, useMemo } from 'react'\nimport { useT as _useT } from '../../i18n/LanguageProvider'\nimport { fallbackT } from './copilotStrings'\n\n// Safely read the shared LanguageProvider context without throwing when outside it\nfunction useSafeT(): ReturnType<typeof _useT> | null {\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return _useT()\n } catch {\n return null\n }\n}\n\nimport {\n Send, Sparkles, User, Loader2, X, ChevronUp,\n Clock, Plus, Maximize2, Users, AlertTriangle,\n ExternalLink, MoreVertical, Brain, Zap, Lightbulb,\n PanelLeft, PanelRight, PanelBottom, Check, Copy, Share2,\n Wrench, ChevronDown, AtSign, Terminal, Trash2,\n Move, GripVertical, Minimize2,\n} from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { Textarea } from '../ui/textarea'\nimport { ScrollArea } from '../ui/scroll-area'\nimport { Avatar, AvatarImage, AvatarFallback } from '../ui/avatar'\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover'\nimport {\n DropdownMenu, DropdownMenuContent, DropdownMenuItem,\n DropdownMenuTrigger, DropdownMenuSeparator, DropdownMenuLabel,\n} from '../ui/dropdown-menu'\nimport {\n Tooltip, TooltipContent, TooltipProvider, TooltipTrigger,\n} from '../ui/tooltip'\nimport {\n Collapsible, CollapsibleTrigger, CollapsibleContent,\n} from '../ui/collapsible'\nimport {\n Command, CommandInput, CommandList, CommandEmpty,\n CommandGroup, CommandItem,\n} from '../ui/command'\nimport AgentSteps from './AgentSteps'\nimport StreamErrorBanner from './StreamErrorBanner'\nimport ChatToolbar from '../chat/ChatToolbar'\nimport CompareFactorsCard from '../chat/CompareFactorsCard'\nimport ChatStructuredData, { extractStructuredBlocks } from '../chat/ChatStructuredData'\nimport MarkdownContent from '../chat/MarkdownContent'\nimport { ArtifactRenderer } from './artifacts/ArtifactRenderer'\nimport type { A2UIActionItem, ArtifactInteraction } from './artifacts/types'\nimport type {\n CopilotChatState,\n CopilotDockContext,\n ChatAttachment,\n ForcedTools,\n CompareFactorsData,\n ComparisonFactor,\n SendOptions,\n DockPosition,\n ChatPersona,\n CopilotQuickAction,\n} from './types'\nimport type { SlugChecker } from '../chat/ChatStructuredData'\n\n// Operator (2026-06-16): the in-dock \"Tools & Skills\" panel is removed; tools\n// and skills stay reachable via the inline \"/\" command menu. Typed as boolean\n// (not literal false) so TS keeps normal narrowing inside the gated block.\nconst SHOW_TOOLS_PANEL: boolean = false\n\n// ── Persona picker (inline, avoids another sub-component file) ────────────────\n\nconst PERSONAS: Array<{ id: ChatPersona; label: string; labelAr: string; icon: string }> = [\n { id: 'analyst', label: 'Analyst', labelAr: 'محلل', icon: '🔬' },\n { id: 'strategist', label: 'Strategist', labelAr: 'استراتيجي', icon: '♟️' },\n { id: 'advisor', label: 'Advisor', labelAr: 'مستشار', icon: '💼' },\n]\n\nconst PersonaPicker = ({\n value,\n onChange,\n disabled,\n language = 'en',\n personas: personasProp,\n}: {\n value: ChatPersona\n onChange: (p: ChatPersona) => void\n disabled?: boolean\n language?: 'en' | 'ar'\n /** B1: dynamic persona list from config; falls back to PERSONAS constant */\n personas?: Array<{ id: string; label: string; labelAr: string; icon?: string }>\n}) => {\n const list = personasProp && personasProp.length > 0 ? personasProp : PERSONAS\n return (\n <div className=\"flex items-center gap-1 flex-wrap\">\n {list.map(p => (\n <button\n key={p.id}\n onClick={() => !disabled && onChange(p.id)}\n disabled={disabled}\n className={`inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-[11px] font-medium transition-all duration-fast ease-standard border ${\n value === p.id\n ? 'bg-primary/15 text-primary border-primary/30'\n : 'bg-transparent text-muted-foreground border-border hover:bg-muted hover:text-foreground'\n }`}\n >\n {p.icon && <span>{p.icon}</span>}\n {language === 'ar' ? p.labelAr : p.label}\n </button>\n ))}\n </div>\n )\n}\nPersonaPicker.displayName = 'PersonaPicker'\n\n// ── Context badge map ─────────────────────────────────────────────────────────\n\nconst CONTEXT_BADGES: Record<string, { label: string; labelAr: string; color: string }> = {\n dashboard: { label: 'Dashboard', labelAr: 'لوحة التحكم', color: 'bg-blue-500/20 text-blue-400' },\n narrative: { label: 'Narrative', labelAr: 'سردية', color: 'bg-amber-500/20 text-amber-400' },\n entity: { label: 'Entity', labelAr: 'جهة', color: 'bg-emerald-500/20 text-emerald-400' },\n alert: { label: 'Alert', labelAr: 'إشارة', color: 'bg-red-500/20 text-red-400' },\n task: { label: 'Task', labelAr: 'مهمة', color: 'bg-purple-500/20 text-purple-400' },\n task_detail: { label: 'Task', labelAr: 'مهمة', color: 'bg-purple-500/20 text-purple-400' },\n tasks: { label: 'Tasks', labelAr: 'المهام', color: 'bg-purple-500/20 text-purple-400' },\n digital_twin: { label: 'Digital Twin', labelAr: 'توأم رقمي', color: 'bg-violet-500/20 text-violet-400' },\n breaking_news: { label: 'Breaking News', labelAr: 'خبر عاجل', color: 'bg-orange-500/20 text-orange-400' },\n}\n\n// ── sanitizeAgentEmptyState ───────────────────────────────────────────────────\n\nfunction sanitizeAgentEmptyState(content: string, emptyMessage: string): string {\n if (!content) return content\n let stripped = content.replace(/```json[\\s\\S]*?```/g, '').trim()\n const reduced = stripped\n .replace(/NO_DATA_AVAILABLE/gi, '')\n .replace(/\\[\\s*\\]/g, '')\n .replace(/[\\s.,;:!?-]+/g, ' ')\n .trim()\n if (reduced.length === 0) return emptyMessage\n return content\n}\n\n// ── Props ─────────────────────────────────────────────────────────────────────\n\nexport interface UnifiedCopilotDockProps {\n /**\n * The chat state seam. The product creates this from its useCopilotChat hook\n * (Sentra) or its own streaming hook (Cortex, Scout). This is the ONLY API\n * surface that touches actual streaming/network logic.\n */\n chatState: CopilotChatState\n\n /** Page-level context (type, title, suggestions) */\n context: CopilotDockContext\n\n /**\n * UI language — 'en' or 'ar'. The product reads this from its LanguageContext\n * and passes it here. No context import needed in this component.\n */\n language?: 'en' | 'ar'\n\n /**\n * Navigation callback. Called with an absolute path when the user clicks\n * an internal link (context badge, citation, entity chip, etc.).\n * The product wires this to router.push (Next.js) or window.location.href.\n */\n onNavigate?: (path: string) => void\n\n /**\n * Optional: batch slug-check for ChatStructuredData.\n * When omitted, all slugs are assumed valid.\n */\n onCheckSlugs?: SlugChecker\n\n /**\n * Optional: navigate to the full-page chat view.\n * Called when the user clicks the Maximize button.\n */\n onExpandToFullPage?: () => void\n\n /** Pre-fill the input with this text */\n pendingMessage?: string | null\n /** If true, auto-send pendingMessage instead of just filling the input */\n pendingAutoSend?: boolean\n /** Called once the pending message has been consumed */\n onPendingMessageConsumed?: () => void\n\n /** Quick-action chips shown after the first insight response */\n followUpChips?: string[]\n\n /**\n * Quick-action chips shown in the empty/intro state (before any messages).\n * Each chip sends its `prompt` when clicked. When omitted, the dock falls\n * back to rendering `context.suggestions` as chips (back-compat).\n */\n quickActions?: CopilotQuickAction[]\n\n /** Start the dock in expanded state */\n defaultExpanded?: boolean\n\n /** Assistant greeting shown above suggestion chips when chat is empty */\n seedGreeting?: string\n\n /** Called when user closes/collapses the dock */\n onClose?: () => void\n\n /**\n * Optional: persona list override.\n * Defaults to analyst/strategist/advisor. Pass empty array to hide the picker.\n */\n personas?: Array<{ id: string; label: string; labelAr: string; icon?: string }>\n\n /**\n * Token-scoped allowed tools (from /v1/copilot/config). Drives the Tools panel\n * + the `/` command menu. Undefined = no token restriction (panel hidden or\n * uses defaults). Each item: { slug, name, function_name? }.\n */\n allowedTools?: Array<{ slug: string; name: string; function_name?: string }>\n\n /**\n * Token-scoped allowed skills (from /v1/copilot/config). Drives the Skills\n * panel + the `/` command menu's activate-skill entries. Undefined = none.\n */\n allowedSkills?: Array<{ slug: string; name: string }>\n\n /**\n * B4: Optional markdown description of the current page. The dock stores\n * this and CopilotProvider injects it as intelligenceContext.data_summary.\n * For direct-mount consumers using their own chatState, wire page context\n * through their own send path. This prop is accepted but not auto-forwarded\n * from the dock itself (provider handles it).\n */\n pageContext?: string\n\n /**\n * E: token-scoped branding (from /v1/copilot/config.branding). Optional —\n * an omitted/empty object keeps the dock defaults. Backwards-compatible.\n */\n branding?: {\n title?: string\n titleAr?: string\n primaryColor?: string\n placeholder?: string\n placeholderAr?: string\n }\n\n /**\n * E: token-scoped UI toggles (from /v1/copilot/config.ui). Each defaults to\n * shown when undefined, so an unconfigured token keeps the full surface.\n */\n uiConfig?: {\n showTools?: boolean\n showSkills?: boolean\n showAgents?: boolean\n }\n\n /**\n * A2UI: callback fired when the user clicks an action chip in an ArtifactActions\n * artifact. The item.prompt (when set) should be sent as a new user message.\n * CopilotProvider wires this automatically — direct mount consumers may pass\n * their own handler here.\n *\n * When omitted the dock provides a default that calls chatState.onSend(item.prompt).\n */\n onArtifactAction?: (item: A2UIActionItem) => void\n\n /**\n * Phase-3 structured interaction channel. Fired when the user interacts with\n * a client_candidates, client_field_picker, client_diff_confirm, or\n * persona_starters artifact. The interaction carries a kind discriminator and\n * a structured payload — no free-text echo.\n *\n * CopilotProvider wires this to handleArtifactInteract (attaches the\n * interaction to the dispatch request, suppresses the user bubble).\n * Direct mount consumers may provide their own handler.\n *\n * When omitted the dock falls back to sending a synthesised hidden message\n * via chatState.onSend with { hideUserMessage: true, interaction }.\n */\n onArtifactInteract?: (interaction: ArtifactInteraction) => void\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\n/**\n * UnifiedCopilotDock\n *\n * Floating AI copilot dock (collapsed bar / expanded panel). Supports three\n * dock positions (bottom, left, right), streaming agent steps, structured data\n * blocks, compare-factors cards, attachment uploads, thinking-mode toggle, and\n * conversation history.\n *\n * ALL app-specific dependencies removed:\n * - useCopilotChat → chatState prop (CopilotChatState seam)\n * - useAuth → removed (no user avatar needed in shared lib)\n * - useLanguage → language prop\n * - useRouter → onNavigate / onExpandToFullPage props\n * - bridge → onCheckSlugs prop (ChatStructuredData seam)\n * - Mode type → plain string in CopilotDockContext\n * - AuthImage → plain <img> or omitted\n */\nconst UnifiedCopilotDock = ({\n chatState,\n context,\n language: languageProp = 'en',\n onNavigate,\n onCheckSlugs,\n onExpandToFullPage,\n pendingMessage,\n pendingAutoSend,\n onPendingMessageConsumed,\n followUpChips,\n quickActions,\n defaultExpanded,\n seedGreeting,\n onClose,\n personas,\n allowedTools,\n allowedSkills,\n branding,\n uiConfig,\n pageContext: _pageContext,\n onArtifactAction,\n onArtifactInteract,\n}: UnifiedCopilotDockProps) => {\n // Context wins over prop — ensures AR/EN follows the shared LanguageProvider\n const langCtx = useSafeT()\n const language: 'en' | 'ar' = langCtx ? langCtx.language : languageProp\n // Without a LanguageProvider, fall back to the bundled English copilot\n // dictionary (copilotStrings) instead of echoing raw \"copilot:*\" keys.\n const t = langCtx ? langCtx.t : fallbackT\n const isRTL = language === 'ar'\n\n // ── A2UI: default artifact action handler ─────────────────────────────────\n // When onArtifactAction is not provided, action-chip clicks send the item's\n // prompt as a new user message via the standard send path.\n const handleArtifactAction = useCallback(\n (item: A2UIActionItem) => {\n if (onArtifactAction) {\n onArtifactAction(item)\n return\n }\n if (item.prompt) {\n chatState.onSend(item.prompt)\n }\n },\n [onArtifactAction, chatState],\n )\n\n // ── Phase-3: default structured interaction handler ────────────────────────\n // When onArtifactInteract is not provided (direct-mount consumers without\n // CopilotProvider), fall back to sending a synthesised hidden message that\n // carries the interaction in SendOptions so the bridge can route it.\n const handleArtifactInteract = useCallback(\n (interaction: ArtifactInteraction) => {\n if (onArtifactInteract) {\n onArtifactInteract(interaction)\n return\n }\n // Synthesise a minimal text so the turn is not empty.\n // hideUserMessage suppresses the bubble; interaction is forwarded in opts.\n const text = `[interaction:${interaction.kind}]`\n chatState.onSend(text, { hideUserMessage: true, interaction })\n },\n [onArtifactInteract, chatState],\n )\n const [isExpanded, setIsExpanded] = useState(defaultExpanded ?? false)\n const [forcedTools, setForcedTools] = useState<ForcedTools>({})\n const [attachments, setAttachments] = useState<ChatAttachment[]>([])\n const [thinkingMode, setThinkingMode] = useState(false)\n const [isDragging, setIsDragging] = useState(false)\n const [persona, setPersona] = useState<ChatPersona>('analyst')\n const [historyOpen, setHistoryOpen] = useState(false)\n const [historyItems, setHistoryItems] = useState<Array<{ id: string; title: string; updated_at: string; context_label?: string }>>([])\n const [insightTriggered, setInsightTriggered] = useState(false)\n const [snapshottedChips, setSnapshottedChips] = useState<string[] | undefined>()\n\n // ── C3/C2b: slash + at-mention menu state ────────────────────────────────\n const [slashMenuOpen, setSlashMenuOpen] = useState(false)\n const [atMenuOpen, setAtMenuOpen] = useState(false)\n const [slashQuery, setSlashQuery] = useState('')\n const [atQuery, setAtQuery] = useState('')\n // Wrapper refs so textarea Arrow/Enter keys can be forwarded into the open\n // cmdk menu (the textarea keeps focus, so cmdk's own nav never fires otherwise).\n const slashMenuRef = useRef<HTMLDivElement>(null)\n const atMenuRef = useRef<HTMLDivElement>(null)\n\n // ── C2: Tools & Skills panel collapsed state ──────────────────────────────\n const [toolsPanelOpen, setToolsPanelOpen] = useState(false)\n\n // ── C4: post-streaming refocus ────────────────────────────────────────────\n const prevIsStreamingRef = useRef(false)\n\n const messagesEndRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLTextAreaElement>(null)\n const pendingAutoSendRef = useRef<string | null>(null)\n const dragCounterRef = useRef(0)\n const toolbarUploadRef = useRef<((files: File[]) => Promise<void>) | null>(null)\n\n // Dock position\n const getInitialDockPosition = (): DockPosition => {\n try {\n const saved = localStorage.getItem('sentra-copilot-dock-position')\n if (saved === 'left' || saved === 'right' || saved === 'bottom' || saved === 'float') return saved\n } catch { /* ignore */ }\n return 'bottom'\n }\n const [dockPosition, setDockPosition] = useState<DockPosition>(getInitialDockPosition)\n\n const handleDockPositionChange = (pos: DockPosition) => {\n setDockPosition(pos)\n try { localStorage.setItem('sentra-copilot-dock-position', pos) } catch { /* ignore */ }\n }\n\n // ── Float mode: free-floating, draggable + resizable window ────────────────\n // Persisted geometry (top-left x/y + width/height in CSS px). Clamped to the\n // viewport on read so a saved rect from a larger screen still lands on-screen.\n const FLOAT_MIN_W = 320\n const FLOAT_MIN_H = 360\n type FloatRect = { x: number; y: number; w: number; h: number }\n const defaultFloatRect = useCallback((): FloatRect => {\n const w = 420\n const h = 560\n const vw = typeof window !== 'undefined' ? window.innerWidth : 1280\n const vh = typeof window !== 'undefined' ? window.innerHeight : 800\n // RTL → open near the left edge; LTR → near the right edge.\n const x = isRTL ? 24 : Math.max(24, vw - w - 24)\n const y = Math.max(24, vh - h - 24)\n return { x, y, w, h }\n }, [isRTL])\n const clampFloatRect = useCallback((r: FloatRect): FloatRect => {\n if (typeof window === 'undefined') return r\n const vw = window.innerWidth\n const vh = window.innerHeight\n const w = Math.min(Math.max(r.w, FLOAT_MIN_W), vw - 16)\n const h = Math.min(Math.max(r.h, FLOAT_MIN_H), vh - 16)\n const x = Math.min(Math.max(r.x, 8), Math.max(8, vw - w - 8))\n const y = Math.min(Math.max(r.y, 8), Math.max(8, vh - h - 8))\n return { x, y, w, h }\n }, [])\n const [floatRect, setFloatRect] = useState<FloatRect>(() => {\n try {\n const saved = localStorage.getItem('sentra-copilot-float-rect')\n if (saved) return clampFloatRect(JSON.parse(saved) as FloatRect)\n } catch { /* ignore */ }\n return defaultFloatRect()\n })\n const persistFloatRect = useCallback((r: FloatRect) => {\n try { localStorage.setItem('sentra-copilot-float-rect', JSON.stringify(r)) } catch { /* ignore */ }\n }, [])\n // Live pointer-drag/resize gesture state (refs avoid re-render per move).\n const floatGestureRef = useRef<\n | null\n | { mode: 'move' | 'resize'; startX: number; startY: number; orig: FloatRect }\n >(null)\n\n const effectiveDockPosition = useMemo<DockPosition>(() => {\n // On phones a free-floating window is unusable → force bottom sheet.\n if (typeof window !== 'undefined' && window.innerWidth < 640) return 'bottom'\n return dockPosition\n }, [dockPosition])\n\n const isFloat = effectiveDockPosition === 'float'\n\n // Pointer-based move (drag by header) + resize (corner handle). Works with\n // mouse + touch + pen via Pointer Events; RTL flips the resize handle side.\n const onFloatPointerMove = useCallback((e: PointerEvent) => {\n const g = floatGestureRef.current\n if (!g) return\n const dx = e.clientX - g.startX\n const dy = e.clientY - g.startY\n if (g.mode === 'move') {\n setFloatRect(clampFloatRect({ ...g.orig, x: g.orig.x + dx, y: g.orig.y + dy }))\n } else {\n // Resize from the inner-bottom corner. In RTL the handle sits bottom-left,\n // so width grows as the pointer moves left (negative dx).\n const w = g.orig.w + (isRTL ? -dx : dx)\n const x = isRTL ? g.orig.x + dx : g.orig.x\n setFloatRect(clampFloatRect({ x, y: g.orig.y, w, h: g.orig.h + dy }))\n }\n }, [clampFloatRect, isRTL])\n\n const endFloatGesture = useCallback(() => {\n if (!floatGestureRef.current) return\n floatGestureRef.current = null\n window.removeEventListener('pointermove', onFloatPointerMove)\n window.removeEventListener('pointerup', endFloatGesture)\n setFloatRect(r => { persistFloatRect(r); return r })\n }, [onFloatPointerMove, persistFloatRect])\n\n const startFloatGesture = useCallback(\n (mode: 'move' | 'resize') => (e: React.PointerEvent) => {\n if (!isFloat) return\n e.preventDefault()\n floatGestureRef.current = { mode, startX: e.clientX, startY: e.clientY, orig: floatRect }\n window.addEventListener('pointermove', onFloatPointerMove)\n window.addEventListener('pointerup', endFloatGesture)\n },\n [isFloat, floatRect, onFloatPointerMove, endFloatGesture],\n )\n\n // Cleanup any in-flight gesture on unmount.\n useEffect(() => () => {\n window.removeEventListener('pointermove', onFloatPointerMove)\n window.removeEventListener('pointerup', endFloatGesture)\n }, [onFloatPointerMove, endFloatGesture])\n\n // Re-clamp the float rect when the viewport shrinks so it never drifts off-screen.\n useEffect(() => {\n if (!isFloat) return\n const onResize = () => setFloatRect(r => clampFloatRect(r))\n window.addEventListener('resize', onResize)\n return () => window.removeEventListener('resize', onResize)\n }, [isFloat, clampFloatRect])\n\n const dockClasses = useMemo(() => {\n if (!isExpanded) return 'fixed bottom-0 left-0 right-0 z-50 h-14 transition-all duration-300'\n switch (effectiveDockPosition) {\n case 'float':\n // Geometry comes from inline style (floatStyle); no transition so drag\n // tracks the pointer 1:1.\n return 'fixed z-50'\n case 'left':\n return 'fixed top-[3.5rem] left-0 bottom-0 w-full sm:w-[420px] z-50 transition-all duration-300'\n case 'right':\n return 'fixed top-[3.5rem] right-0 bottom-0 w-full sm:w-[420px] z-50 transition-all duration-300'\n case 'bottom':\n default:\n return 'fixed bottom-0 left-0 right-0 z-50 h-[calc(100vh-3.5rem)] sm:h-[60vh] transition-all duration-300'\n }\n }, [isExpanded, effectiveDockPosition])\n\n const floatStyle = useMemo<React.CSSProperties | undefined>(() => {\n if (!isFloat || !isExpanded) return undefined\n return { left: floatRect.x, top: floatRect.y, width: floatRect.w, height: floatRect.h }\n }, [isFloat, isExpanded, floatRect])\n\n const expandedBorderClass = useMemo(() => {\n switch (effectiveDockPosition) {\n case 'left': return 'border-e'\n case 'right': return 'border-s'\n case 'float': return 'border rounded-2xl overflow-hidden'\n default: return 'border-t'\n }\n }, [effectiveDockPosition])\n\n const expandedShadowClass = useMemo(() => {\n switch (effectiveDockPosition) {\n case 'left': return 'shadow-[4px_0_15px_rgba(0,0,0,0.12)]'\n case 'right': return 'shadow-[-4px_0_15px_rgba(0,0,0,0.12)]'\n case 'float': return 'shadow-2xl'\n default: return 'shadow-2xl'\n }\n }, [effectiveDockPosition])\n\n // Auto-scroll\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }, [chatState.messages, chatState.agentSteps])\n\n // Pending message handling\n useEffect(() => {\n if (pendingMessage) {\n if (pendingAutoSend) {\n pendingAutoSendRef.current = pendingMessage\n setInsightTriggered(true)\n setSnapshottedChips(followUpChips)\n chatState.onNewConversation()\n setIsExpanded(true)\n onPendingMessageConsumed?.()\n } else {\n chatState.onInputChange(pendingMessage)\n setIsExpanded(true)\n onPendingMessageConsumed?.()\n setTimeout(() => inputRef.current?.focus(), 300)\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [pendingMessage, onPendingMessageConsumed])\n\n // Fire queued auto-send after conversation reset\n useEffect(() => {\n if (chatState.messages.length === 0) {\n if (pendingAutoSendRef.current && !chatState.isLoading) {\n const msg = pendingAutoSendRef.current\n pendingAutoSendRef.current = null\n chatState.onSend(msg, { thinkingMode, insight: true, hideUserMessage: true })\n } else if (!pendingAutoSendRef.current) {\n setInsightTriggered(false)\n setSnapshottedChips(undefined)\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [chatState.messages, chatState.isLoading])\n\n // History\n useEffect(() => {\n if (historyOpen && chatState.onFetchHistory) {\n chatState.onFetchHistory().then(setHistoryItems)\n } else if (historyOpen && chatState.conversationHistory) {\n setHistoryItems(chatState.conversationHistory)\n }\n }, [historyOpen, chatState])\n\n // Sync controlled open: the provider flips defaultExpanded (from isOpen) when\n // the launcher / a smart-action calls open(). Expand the dock to match so a\n // bare open() (no pending message) reliably opens the panel.\n useEffect(() => {\n if (defaultExpanded) setIsExpanded(true)\n }, [defaultExpanded])\n\n // Escape to collapse\n useEffect(() => {\n if (!isExpanded) return\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { setIsExpanded(false); onClose?.() }\n }\n window.addEventListener('keydown', handleEscape)\n return () => window.removeEventListener('keydown', handleEscape)\n }, [isExpanded, onClose])\n\n // C4: refocus input after SSE stream ends (isStreaming true → false)\n // Don't steal focus if a command/mention menu is currently open.\n useEffect(() => {\n const wasStreaming = prevIsStreamingRef.current\n prevIsStreamingRef.current = chatState.isStreaming\n if (wasStreaming && !chatState.isStreaming && isExpanded && !slashMenuOpen && !atMenuOpen) {\n requestAnimationFrame(() => inputRef.current?.focus())\n }\n }, [chatState.isStreaming, isExpanded, slashMenuOpen, atMenuOpen])\n\n // Derived context / mode\n const isTwin = chatState.effectiveMode === 'digital_twin'\n const twinImg = context.entityImageUrl\n const twinInitials = (context.title || '??').slice(0, 2).toUpperCase()\n\n // E: token-scoped branding + ui toggles. Each toggle defaults to shown.\n const brandPlaceholder = isRTL ? branding?.placeholderAr : branding?.placeholder\n const brandTitle = isRTL ? (branding?.titleAr || branding?.title) : branding?.title\n const showTools = uiConfig?.showTools !== false\n const showSkills = uiConfig?.showSkills !== false\n const showAgents = uiConfig?.showAgents !== false\n // Effective allow-lists honour the ui toggles (hide a surface even if the\n // token is allowed the underlying capabilities).\n const effAllowedTools = showTools ? allowedTools : undefined\n const effAllowedSkills = showSkills ? allowedSkills : undefined\n\n const placeholder = brandPlaceholder\n ? brandPlaceholder\n : isTwin\n ? t('copilot:placeholderAsk').replace('{{name}}', context.title)\n : t('copilot:placeholder')\n\n const aiName = isTwin\n ? context.title\n : (brandTitle || t('copilot:aiName'))\n\n const twinBadge = isTwin ? t('copilot:digitalTwin') : null\n\n const dockContextType = chatState.loadedContextType || context.type\n const dockContextLabel = chatState.loadedContextLabel || context.title\n const dockContextBadge = isTwin\n ? CONTEXT_BADGES['digital_twin']\n : CONTEXT_BADGES[dockContextType] || null\n\n // ── Helpers ────────────────────────────────────────────────────────────────\n\n const autoResize = (el: HTMLTextAreaElement) => {\n el.style.height = 'auto'\n el.style.height = Math.min(el.scrollHeight, 120) + 'px'\n }\n\n const handleExpand = () => {\n setIsExpanded(true)\n setTimeout(() => inputRef.current?.focus(), 300)\n }\n\n const handleSend = useCallback(() => {\n if (!chatState.inputValue.trim()) return\n const hasTools = Object.values(forcedTools).some(Boolean)\n const atts = attachments.length > 0\n ? attachments.map(a => ({ url: a.url, data: a.data, name: a.name, type: a.type }))\n : undefined\n\n const opts: SendOptions = {\n thinkingMode,\n forcedTools: hasTools ? forcedTools : undefined,\n attachments: atts,\n }\n // Close any open menus before sending\n setSlashMenuOpen(false)\n setAtMenuOpen(false)\n chatState.onSend(chatState.inputValue, opts)\n setAttachments([])\n requestAnimationFrame(() => inputRef.current?.focus())\n }, [chatState, forcedTools, attachments, thinkingMode])\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // When a command menu is open, Escape closes it without collapsing the dock.\n if (e.key === 'Escape' && (slashMenuOpen || atMenuOpen)) {\n e.stopPropagation()\n setSlashMenuOpen(false)\n setAtMenuOpen(false)\n return\n }\n // When a command menu is open, forward navigation keys (Up/Down/Enter) into\n // the cmdk list so the user can move between items with the keyboard. The\n // textarea keeps focus, so we re-dispatch the keydown onto the cmdk input,\n // which bubbles to the cmdk root and drives selection/highlight.\n if ((slashMenuOpen || atMenuOpen) &&\n (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Enter' || e.key === 'Home' || e.key === 'End')) {\n if (e.key === 'Enter' && e.shiftKey) {\n // Shift+Enter is a newline — let it pass through to the textarea.\n } else {\n const wrap = (slashMenuOpen ? slashMenuRef.current : atMenuRef.current)\n const target = (wrap?.querySelector('[cmdk-input]') ?? wrap?.querySelector('[cmdk-root]')) as HTMLElement | null\n if (target) {\n e.preventDefault()\n e.stopPropagation()\n target.dispatchEvent(new KeyboardEvent('keydown', { key: e.key, bubbles: true, cancelable: true }))\n return\n }\n }\n }\n // Fallback: when a menu is open, Enter is handled by the cmdk list — don't send.\n if (e.key === 'Enter' && !e.shiftKey && (slashMenuOpen || atMenuOpen)) {\n return\n }\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n if (chatState.inputValue.trim()) handleSend()\n }\n }\n\n // C3/C2b: handle input value changes and open/close menus on / and @\n const handleInputChange = useCallback((value: string) => {\n chatState.onInputChange(value)\n\n // Slash menu only opens when there are tools or skills to show (degrade gracefully).\n // Honours the ui.showTools/showSkills toggles via eff* lists.\n const hasSlashItems = (effAllowedTools && effAllowedTools.length > 0) || (effAllowedSkills && effAllowedSkills.length > 0)\n if (hasSlashItems) {\n const slashMatch = value.match(/(?:^|\\s)\\/([^\\s]*)$/)\n if (slashMatch) {\n setSlashQuery(slashMatch[1] ?? '')\n setSlashMenuOpen(true)\n setAtMenuOpen(false)\n return\n }\n }\n\n // At-mention menu only opens when agents are shown AND there are personas\n // (undefined personas = use hardcoded fallback, still shown).\n const hasAtItems = showAgents && ((personas !== undefined && personas.length > 0) || personas === undefined)\n if (hasAtItems) {\n const atMatch = value.match(/(?:^|\\s)@([^\\s]*)$/)\n if (atMatch) {\n setAtQuery(atMatch[1] ?? '')\n setAtMenuOpen(true)\n setSlashMenuOpen(false)\n return\n }\n }\n\n // No active trigger — close menus\n if (slashMenuOpen) setSlashMenuOpen(false)\n if (atMenuOpen) setAtMenuOpen(false)\n }, [chatState, effAllowedTools, effAllowedSkills, personas, showAgents, slashMenuOpen, atMenuOpen])\n\n // C3: insert a slash-command into the input (replaces the trailing /... token)\n const handleSlashSelect = useCallback((command: string) => {\n const value = chatState.inputValue\n // Replace the trailing slash-token with the selected command\n const updated = value.replace(/(?:^|\\s)\\/[^\\s]*$/, (match) => {\n const prefix = match.startsWith(' ') ? ' ' : ''\n return `${prefix}/${command} `\n })\n chatState.onInputChange(updated)\n setSlashMenuOpen(false)\n setSlashQuery('')\n requestAnimationFrame(() => inputRef.current?.focus())\n }, [chatState])\n\n // C2b: insert an @mention into the input (replaces the trailing @... token)\n const handleAtSelect = useCallback((name: string) => {\n const value = chatState.inputValue\n const updated = value.replace(/(?:^|\\s)@[^\\s]*$/, (match) => {\n const prefix = match.startsWith(' ') ? ' ' : ''\n return `${prefix}@${name} `\n })\n chatState.onInputChange(updated)\n setAtMenuOpen(false)\n setAtQuery('')\n requestAnimationFrame(() => inputRef.current?.focus())\n }, [chatState])\n\n // C1: Read dropped files into base64 data URI attachments for the chat send path\n const handleDroppedFiles = useCallback(async (files: File[]) => {\n const newAttachments: ChatAttachment[] = await Promise.all(\n files.map(\n file =>\n new Promise<ChatAttachment>((resolve) => {\n const reader = new FileReader()\n reader.onload = (ev) => {\n resolve({ data: ev.target?.result as string, name: file.name, type: file.type, size: file.size })\n }\n reader.onerror = () => {\n resolve({ name: file.name, type: file.type, size: file.size })\n }\n reader.readAsDataURL(file)\n }),\n ),\n )\n setAttachments(prev => [...prev, ...newAttachments])\n }, [])\n\n const handleLoadConversation = (id: string) => {\n chatState.onLoadConversation?.(id)\n setHistoryOpen(false)\n setInsightTriggered(false)\n setSnapshottedChips(undefined)\n }\n\n // Delete a past conversation (session + memory). Optimistically drops it from\n // the list, then awaits the server; on the active conversation, also resets to\n // a fresh chat so the dock doesn't keep showing deleted context.\n const handleDeleteConversation = async (id: string) => {\n if (!chatState.onDeleteConversation) return\n setHistoryItems(prev => prev.filter(c => c.id !== id))\n if (id === chatState.conversationId) {\n chatState.onNewConversation()\n }\n try {\n await chatState.onDeleteConversation(id)\n } catch {\n // On failure, re-fetch so the list reflects server truth.\n if (chatState.onFetchHistory) chatState.onFetchHistory().then(setHistoryItems)\n }\n }\n\n // ── TwinAvatar sub-component ───────────────────────────────────────────────\n\n const TwinAvatar = ({ size = 'sm' }: { size?: 'sm' | 'md' | 'lg' }) => {\n const sizeClasses = size === 'lg' ? 'w-12 h-12' : size === 'md' ? 'w-8 h-8' : 'w-6 h-6'\n const textSize = size === 'lg' ? 'text-sm' : size === 'md' ? 'text-[10px]' : 'text-[8px]'\n const iconSize = size === 'lg' ? 'w-6 h-6' : size === 'md' ? 'w-4 h-4' : 'w-3 h-3'\n const borderRadius = size === 'lg' ? 'rounded-xl' : size === 'md' ? 'rounded-lg' : 'rounded-md'\n\n if (isTwin && twinImg) {\n return (\n <Avatar className={`${sizeClasses} shrink-0`}>\n <AvatarImage src={twinImg} alt={context.title} />\n <AvatarFallback className={`bg-gradient-to-br from-violet-500 to-indigo-600 text-white ${textSize} font-bold`}>{twinInitials}</AvatarFallback>\n </Avatar>\n )\n }\n if (isTwin) {\n return (\n <div className={`${sizeClasses} ${borderRadius} flex items-center justify-center shrink-0 bg-gradient-to-br from-violet-500 to-indigo-600`}>\n <Users className={`${iconSize} text-white`} />\n </div>\n )\n }\n return (\n <div className={`${sizeClasses} ${borderRadius} flex items-center justify-center shrink-0 bg-gradient-to-br from-primary to-primary/70`}>\n <Sparkles className={`${iconSize} text-primary-foreground`} />\n </div>\n )\n }\n\n // ── Empty state message ────────────────────────────────────────────────────\n\n const emptyMessage = t('copilot:noDataAvailable')\n\n // ── Render ─────────────────────────────────────────────────────────────────\n\n return (\n <>\n <div className=\"h-16 w-full shrink-0\" aria-hidden=\"true\" />\n <div\n className={dockClasses}\n dir={isRTL ? 'rtl' : 'ltr'}\n // E: token-scoped accent — override the --primary CSS var so bg-primary/\n // text-primary children pick it up. No-op when branding.primaryColor unset.\n // In float mode, floatStyle supplies the free-floating geometry.\n style={{\n ...(branding?.primaryColor ? ({ ['--primary']: branding.primaryColor } as React.CSSProperties) : {}),\n ...(floatStyle ?? {}),\n }}\n >\n\n {/* ── Collapsed bar ──────────────────────────────────────────────── */}\n {!isExpanded && (\n <div\n className=\"h-full bg-card/95 backdrop-blur-lg border-t border-border shadow-lg flex items-center gap-3 px-4 cursor-pointer hover:bg-accent/30 transition-colors duration-fast ease-standard\"\n onClick={handleExpand}\n >\n <TwinAvatar size=\"md\" />\n <div className=\"flex-1 min-w-0\">\n <input\n type=\"text\"\n value={chatState.inputValue}\n onChange={(e) => { e.stopPropagation(); chatState.onInputChange(e.target.value) }}\n onClick={(e) => { e.stopPropagation(); handleExpand() }}\n onKeyDown={(e) => {\n // Enter from the collapsed bar EXPANDS the dock AND SENDS the\n // typed message — previously it only expanded, so a question\n // typed here vanished and the copilot appeared to \"do nothing\".\n if (e.key === 'Enter' && chatState.inputValue.trim()) {\n e.preventDefault()\n e.stopPropagation()\n handleExpand()\n handleSend()\n }\n }}\n placeholder={placeholder}\n className=\"w-full bg-transparent text-base md:text-sm text-foreground placeholder:text-muted-foreground focus:outline-none\"\n />\n </div>\n <ChevronUp className=\"w-4 h-4 text-muted-foreground shrink-0\" />\n </div>\n )}\n\n {/* ── Expanded panel ─────────────────────────────────────────────── */}\n {isExpanded && (\n <div className={`relative h-full bg-card/95 backdrop-blur-lg ${expandedBorderClass} border-border ${expandedShadowClass} flex flex-col`}>\n\n {/* Float-mode resize handle (inner-bottom corner; RTL → bottom-left) */}\n {isFloat && (\n <div\n role=\"separator\"\n aria-label={t('copilot:resize')}\n onPointerDown={startFloatGesture('resize')}\n className={`absolute bottom-0 ${isRTL ? 'left-0' : 'right-0'} z-10 h-5 w-5 ${isRTL ? 'cursor-sw-resize' : 'cursor-se-resize'} touch-none flex items-end justify-end p-0.5 text-muted-foreground/50 hover:text-muted-foreground`}\n style={isRTL ? { transform: 'scaleX(-1)' } : undefined}\n >\n <svg viewBox=\"0 0 10 10\" className=\"h-2.5 w-2.5\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M9 1 1 9M9 5 5 9M9 9 9 9\" stroke=\"currentColor\" strokeWidth=\"1.2\" fill=\"none\" />\n </svg>\n </div>\n )}\n\n {/* Header — doubles as the float-mode drag handle */}\n <div\n className={`px-4 py-2.5 border-b border-border flex items-center justify-between shrink-0 bg-background/50 ${isFloat ? 'cursor-move select-none' : ''}`}\n onPointerDown={isFloat ? startFloatGesture('move') : undefined}\n >\n <div className=\"flex items-center gap-2.5\">\n {isFloat && (\n <GripVertical className=\"w-3.5 h-3.5 text-muted-foreground/60 shrink-0\" aria-hidden=\"true\" />\n )}\n <TwinAvatar size=\"md\" />\n <div>\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-semibold text-foreground\">\n {chatState.conversationTitle || aiName}\n </h3>\n {twinBadge && (\n <span className=\"text-[9px] px-1.5 py-0.5 rounded-full bg-violet-500/20 text-violet-400 font-medium\">\n {twinBadge}\n </span>\n )}\n <span className={`text-[9px] px-1.5 py-0.5 rounded-full font-medium shrink-0 inline-flex items-center gap-0.5 ${thinkingMode ? 'bg-amber-500/20 text-amber-400' : 'bg-cyan-500/20 text-cyan-400'}`}>\n {thinkingMode ? <Brain className=\"w-2.5 h-2.5\" /> : <Zap className=\"w-2.5 h-2.5\" />}\n {thinkingMode ? t('copilot:thinking') : t('copilot:fast')}\n </span>\n </div>\n <p className=\"text-[10px] text-muted-foreground line-clamp-2\">\n {isTwin\n ? t('copilot:aiPersonaSimulation')\n : (dockContextLabel || context.title)}\n </p>\n {dockContextBadge && (\n <button\n onClick={dockContextBadge && onNavigate ? () => {\n const ref = chatState.loadedContextRef || context.contextRef\n const type = chatState.loadedContextType || context.type\n onNavigate?.(`/${type}/${ref}`)\n } : undefined}\n className={`inline-flex items-center gap-1 text-[9px] px-1.5 py-0.5 rounded-full mt-0.5 transition-all duration-fast ease-standard border ${dockContextBadge.color} ${onNavigate ? 'hover:brightness-125 cursor-pointer border-current/20' : 'opacity-60 cursor-default border-transparent'}`}\n >\n {onNavigate && <ExternalLink className=\"w-2.5 h-2.5 shrink-0\" />}\n <span className=\"truncate max-w-[150px] font-medium\">\n {language === 'ar' ? dockContextBadge.labelAr : dockContextBadge.label}\n {dockContextLabel ? ` · ${dockContextLabel}` : ''}\n </span>\n </button>\n )}\n </div>\n </div>\n\n {/* Header actions — never start a float drag from a control. */}\n <div className=\"flex items-center gap-1\" onPointerDown={(e) => e.stopPropagation()}>\n <DropdownMenu dir={isRTL ? 'rtl' : 'ltr'}>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n aria-label={language === 'ar' ? 'موضع النافذة' : 'Dock position'}\n >\n <MoreVertical className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-52\">\n <DropdownMenuLabel className=\"text-[10px] text-muted-foreground font-normal\" dir={isRTL ? 'rtl' : 'ltr'}>\n {t('copilot:dockPosition')}\n </DropdownMenuLabel>\n <DropdownMenuItem\n onClick={() => handleDockPositionChange('left')}\n dir={isRTL ? 'rtl' : 'ltr'}\n className={dockPosition === 'left' ? 'text-primary' : ''}\n >\n <PanelLeft className={`w-3.5 h-3.5 me-2`} />\n {t('copilot:dockLeft')}\n {dockPosition === 'left' && <Check className={`w-3 h-3 ms-auto text-primary`} />}\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => handleDockPositionChange('right')}\n dir={isRTL ? 'rtl' : 'ltr'}\n className={dockPosition === 'right' ? 'text-primary' : ''}\n >\n <PanelRight className={`w-3.5 h-3.5 me-2`} />\n {t('copilot:dockRight')}\n {dockPosition === 'right' && <Check className={`w-3 h-3 ms-auto text-primary`} />}\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => handleDockPositionChange('bottom')}\n dir={isRTL ? 'rtl' : 'ltr'}\n className={dockPosition === 'bottom' ? 'text-primary' : ''}\n >\n <PanelBottom className={`w-3.5 h-3.5 me-2`} />\n {t('copilot:dockBottom')}\n {dockPosition === 'bottom' && <Check className={`w-3 h-3 ms-auto text-primary`} />}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem\n onClick={() => handleDockPositionChange('float')}\n dir={isRTL ? 'rtl' : 'ltr'}\n className={dockPosition === 'float' ? 'text-primary' : ''}\n >\n <Move className={`w-3.5 h-3.5 me-2`} />\n {t('copilot:dockFloat')}\n {dockPosition === 'float' && <Check className={`w-3 h-3 ms-auto text-primary`} />}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n\n {/* Quick undock / re-dock toggle (float ⇄ bottom) */}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={() => handleDockPositionChange(isFloat ? 'bottom' : 'float')}\n title={isFloat ? t('copilot:redock') : t('copilot:undock')}\n aria-label={isFloat ? t('copilot:redock') : t('copilot:undock')}\n >\n {isFloat ? <Minimize2 className=\"w-3.5 h-3.5\" /> : <Move className=\"w-3.5 h-3.5\" />}\n </Button>\n\n {(chatState.onFetchHistory || chatState.conversationHistory) && (\n <Popover open={historyOpen} onOpenChange={setHistoryOpen}>\n <PopoverTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-7 w-7\" title={t('copilot:history')}>\n <Clock className=\"w-3.5 h-3.5\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-72 p-0\" dir={isRTL ? 'rtl' : 'ltr'}>\n <div className=\"p-3 border-b border-border\">\n <p className=\"text-xs font-medium text-foreground\">\n {t('copilot:conversationHistory')}\n </p>\n </div>\n <ScrollArea className=\"max-h-64\">\n <div className=\"p-2 space-y-0.5\">\n {historyItems.length === 0 ? (\n <p className=\"text-xs text-muted-foreground text-center py-4\">\n {t('copilot:noPreviousConversations')}\n </p>\n ) : historyItems.map(conv => (\n <div\n key={conv.id}\n className={`group flex items-center gap-1 rounded-lg transition-colors duration-fast ease-standard hover:bg-muted ${conv.id === chatState.conversationId ? 'bg-primary/10' : ''}`}\n >\n <button\n onClick={() => handleLoadConversation(conv.id)}\n className={`flex-1 min-w-0 text-start px-2.5 py-2 text-xs`}\n >\n <p className=\"font-medium text-foreground line-clamp-1\">\n {conv.title || conv.context_label || 'Untitled'}\n </p>\n <p className=\"text-[10px] text-muted-foreground mt-0.5\">\n {new Date(conv.updated_at).toLocaleDateString(language === 'ar' ? 'ar-SA' : 'en-US')}\n </p>\n </button>\n {chatState.onDeleteConversation && (\n <button\n onClick={() => handleDeleteConversation(conv.id)}\n className=\"shrink-0 me-1.5 p-1 rounded text-muted-foreground opacity-0 group-hover:opacity-100 hover:text-destructive hover:bg-destructive/10 transition-all duration-fast ease-standard\"\n title={t('copilot:deleteConversation')}\n aria-label={t('copilot:deleteConversation')}\n >\n <Trash2 className=\"w-3 h-3\" />\n </button>\n )}\n </div>\n ))}\n </div>\n </ScrollArea>\n </PopoverContent>\n </Popover>\n )}\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={() => { chatState.onNewConversation(); setThinkingMode(false) }}\n title={t('copilot:newChat')}\n >\n <Plus className=\"w-3.5 h-3.5\" />\n </Button>\n\n {onExpandToFullPage && (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n onClick={onExpandToFullPage}\n title={t('copilot:fullView')}\n >\n <Maximize2 className=\"w-3.5 h-3.5\" />\n </Button>\n )}\n\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n aria-label={t('common:close')}\n onClick={() => { setIsExpanded(false); onClose?.() }}\n >\n <X className=\"w-4 h-4\" aria-hidden=\"true\" />\n </Button>\n </div>\n </div>\n\n {/* Message area */}\n <ScrollArea className=\"flex-1 px-4 py-3\" dir={isRTL ? 'rtl' : 'ltr'}>\n <div className=\"space-y-3\">\n {/* Digital twin disclaimer */}\n {isTwin && chatState.messages.length === 0 && (\n <div className=\"mx-auto max-w-md mb-3 p-2.5 bg-amber-500/10 border border-amber-500/30 rounded-lg flex items-start gap-2\">\n <AlertTriangle className=\"w-3.5 h-3.5 text-amber-500 shrink-0 mt-0.5\" />\n <p className=\"text-[11px] text-amber-500/90\">\n {t('copilot:twinDisclaimer')}\n </p>\n </div>\n )}\n\n {/* Empty state */}\n {chatState.messages.length === 0 && !chatState.isLoading && (\n <div className=\"text-center py-6\">\n <div className=\"mx-auto mb-3 flex justify-center\"><TwinAvatar size=\"lg\" /></div>\n {seedGreeting ? (\n <div className=\"max-w-md mx-auto mb-4 p-3 bg-muted rounded-xl border border-border text-start\">\n <p className=\"text-sm text-foreground\" dir=\"auto\">{seedGreeting}</p>\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground mb-4\">{placeholder}</p>\n )}\n {/* Quick actions (preferred) — explicit intro prompts.\n Falls back to context.suggestions when none provided. */}\n {quickActions && quickActions.length > 0 ? (\n <div className=\"flex flex-wrap justify-center gap-2 max-w-md mx-auto\">\n {quickActions.map((qa, i) => (\n <button\n key={i}\n onClick={() => chatState.onSend(qa.prompt, { thinkingMode })}\n className=\"inline-flex items-center gap-1.5 text-xs px-3 py-1.5 bg-primary/10 hover:bg-primary/15 text-foreground rounded-full transition-colors duration-fast ease-standard border border-primary/20 hover:border-primary/40\"\n >\n <Sparkles className=\"w-3 h-3 text-primary shrink-0\" aria-hidden=\"true\" />\n {language === 'ar' ? qa.label_ar : qa.label_en}\n </button>\n ))}\n </div>\n ) : (\n <div className=\"flex flex-wrap justify-center gap-2 max-w-md mx-auto\">\n {context.suggestions.map((suggestion, i) => {\n // Suggestions may be a plain string (back-compat) or a\n // {en,ar} pair — render the active language.\n const text =\n typeof suggestion === 'string'\n ? suggestion\n : language === 'ar'\n ? suggestion.ar\n : suggestion.en\n return (\n <button\n key={i}\n onClick={() => chatState.onSend(text, { thinkingMode })}\n className=\"text-xs px-3 py-1.5 bg-muted hover:bg-accent text-muted-foreground hover:text-foreground rounded-full transition-colors duration-fast ease-standard border border-border hover:border-primary/30\"\n >\n {text}\n </button>\n )\n })}\n </div>\n )}\n </div>\n )}\n\n {/* Message list */}\n {chatState.messages.map((message, msgIdx) => {\n const isLastAssistant = message.role === 'assistant' && msgIdx === chatState.messages.length - 1\n\n const compareFactorsStep = message.steps?.find(\n (s) => s.step === 'compare_factors' && (s as unknown as Record<string, unknown>)['factors'],\n )\n const compareFactorsData = compareFactorsStep ? {\n factors: (compareFactorsStep as unknown as Record<string, unknown>)['factors'],\n subjectA: (compareFactorsStep as unknown as Record<string, unknown>)['subjectA'],\n subjectB: (compareFactorsStep as unknown as Record<string, unknown>)['subjectB'],\n type: (compareFactorsStep as unknown as Record<string, unknown>)['type'],\n } as CompareFactorsData : null\n\n const handleAcceptFactors = (factors: ComparisonFactor[]) => {\n if (!compareFactorsData) return\n const payload = JSON.stringify({\n factors,\n type: compareFactorsData.type,\n slugA: compareFactorsData.subjectA.slug,\n slugB: compareFactorsData.subjectB.slug,\n })\n chatState.onSend(`[COMPARE_ACCEPT]${payload}`, { thinkingMode })\n }\n\n const strippedContent = message.role === 'assistant'\n ? message.content.replace(/\\[COMPARE_FACTORS_STATE\\][\\s\\S]*?\\[\\/COMPARE_FACTORS_STATE\\]/g, '').trim()\n : message.content\n const { markdown: cleanMarkdown, structured: structuredData } = message.role === 'assistant'\n ? extractStructuredBlocks(strippedContent)\n : { markdown: strippedContent, structured: null }\n\n const renderedMarkdown = message.role === 'assistant'\n ? sanitizeAgentEmptyState(cleanMarkdown, emptyMessage)\n : cleanMarkdown\n\n const displayContent = message.role === 'user' && message.content.startsWith('[COMPARE_ACCEPT]')\n ? t('copilot:comparisonFactorsAccepted')\n : renderedMarkdown\n\n // Hidden insight-trigger bubbles\n if (message.hidden && message.role === 'user') {\n const insightText = message.content.match(/\"([^\"]+)\"/)?.[1]\n || t('copilot:insightFromDashboard')\n return (\n <div key={message.id} className=\"flex justify-center py-1\">\n <div className=\"inline-flex items-center gap-1.5 px-3 py-1.5 bg-primary/5 border border-primary/20 rounded-full text-[11px] text-primary/70 max-w-[90%]\">\n <Lightbulb className=\"w-3 h-3 shrink-0\" />\n <span className=\"truncate\" dir=\"auto\">{insightText}</span>\n </div>\n </div>\n )\n }\n\n return (\n <div key={message.id}>\n {/* Agent steps for this message */}\n {message.role === 'assistant' && message.steps && message.steps.length > 0 && (\n <div className=\"flex gap-2 mb-1 justify-start\">\n <div className=\"mt-1 shrink-0\"><TwinAvatar size=\"sm\" /></div>\n <div className=\"min-w-0 flex-1 max-w-[calc(85%-2rem)]\">\n <AgentSteps\n steps={message.steps}\n isStreaming={chatState.isStreaming && msgIdx === chatState.messages.length - 1}\n language={language}\n dir={isRTL ? 'rtl' : 'ltr'}\n />\n </div>\n </div>\n )}\n\n {/* Message bubble\n Alignment convention (correct for any direction):\n - user → justify-end (logical trailing edge: right in LTR, left in RTL)\n - assistant → justify-start (logical leading edge: left in LTR, right in RTL)\n No flex-row-reverse — the container's dir attribute handles visual flip.\n\n role × dir → visual position\n ────────────────────────────\n user × LTR → RIGHT (trailing)\n user × RTL → LEFT (trailing)\n assistant × LTR → LEFT (leading)\n assistant × RTL → RIGHT (leading)\n */}\n <div className={`flex gap-2 ${\n message.role === 'user' ? 'justify-end' : 'justify-start'\n }`}>\n {/* Assistant avatar: leading side — first in DOM so it appears at\n the leading edge (left in LTR, right in RTL) */}\n {message.role === 'assistant' && <div className=\"mt-1 shrink-0\"><TwinAvatar size=\"sm\" /></div>}\n\n <div className={`max-w-[85%] rounded-xl px-3 py-2 text-sm ${\n message.role === 'user'\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted text-foreground border border-border'\n }`}>\n {message.role === 'assistant' ? (\n <div className=\"max-w-none break-words\" dir={isRTL ? 'rtl' : 'ltr'}>\n {/* Assistant output is markdown — render it (GFM, skipHtml,\n links in new tab). User messages stay plain text below. */}\n <MarkdownContent content={displayContent} dir={isRTL ? 'rtl' : 'ltr'} />\n {structuredData && (\n <ChatStructuredData\n data={structuredData}\n language={language}\n dir={isRTL ? 'rtl' : 'ltr'}\n onNavigate={onNavigate}\n onCheckSlugs={onCheckSlugs}\n />\n )}\n {message.briefing && (\n <ChatStructuredData\n data={message.briefing as Parameters<typeof ChatStructuredData>[0]['data']}\n language={language}\n dir={isRTL ? 'rtl' : 'ltr'}\n onNavigate={onNavigate}\n onCheckSlugs={onCheckSlugs}\n />\n )}\n {compareFactorsData && (\n <CompareFactorsCard\n data={compareFactorsData}\n onAccept={handleAcceptFactors}\n disabled={!isLastAssistant || chatState.isLoading}\n language={language}\n />\n )}\n {message.citations && message.citations.length > 0 && (\n <div className=\"mt-2 pt-2 border-t border-border/50 flex flex-wrap gap-1\" dir={isRTL ? 'rtl' : 'ltr'}>\n {message.citations.map(c => (\n <button\n key={c.number}\n type=\"button\"\n onClick={() => onNavigate?.(`/${c.type}/${c.slug}`)}\n className=\"inline-flex items-center gap-1.5 px-2 py-1 rounded-md bg-primary/10 hover:bg-primary/20 text-primary text-[10px] font-medium transition-colors duration-fast ease-standard border border-primary/20\"\n title={c.description || c.title}\n >\n <span className=\"inline-flex items-center justify-center w-3.5 h-3.5 rounded-full bg-primary/20 text-primary text-[8px] font-bold\">{c.number}</span>\n <span className=\"truncate max-w-[120px]\">{c.title}</span>\n </button>\n ))}\n </div>\n )}\n\n {/* A2UI: render structured artifacts below the text */}\n {message.a2uiArtifacts && message.a2uiArtifacts.length > 0 && (\n <div className=\"mt-2 space-y-2\" dir={isRTL ? 'rtl' : 'ltr'}>\n {message.a2uiArtifacts.map((artifact, artIdx) => (\n <ArtifactRenderer\n key={artIdx}\n artifact={artifact}\n onAction={handleArtifactAction}\n onInteract={handleArtifactInteract}\n language={language}\n dir={isRTL ? 'rtl' : 'ltr'}\n />\n ))}\n </div>\n )}\n </div>\n ) : displayContent}\n </div>\n\n {/* User avatar: trailing side — last in DOM so it appears at\n the trailing edge (right in LTR, left in RTL) */}\n {message.role === 'user' && (\n <div className=\"w-6 h-6 rounded-md bg-muted flex items-center justify-center shrink-0 mt-1\">\n <User className=\"w-3 h-3 text-muted-foreground\" />\n </div>\n )}\n </div>\n\n {/* Copy / Share actions — always offset from the leading edge\n (start side of the message block) to stay under the assistant bubble */}\n {message.role === 'assistant' && !message.id.startsWith('streaming-') && renderedMarkdown && (\n <div className=\"flex items-center gap-1 mt-1 justify-start ps-8\">\n <button\n type=\"button\"\n title={t('copilot:copyResponse')}\n onClick={() => navigator.clipboard.writeText(renderedMarkdown).catch(() => {})}\n className=\"flex items-center gap-1 px-2 py-0.5 rounded text-[10px] text-muted-foreground hover:text-foreground hover:bg-muted/60 transition-colors duration-fast ease-standard\"\n >\n <Copy className=\"w-3 h-3\" />\n <span>{t('copilot:copyResponse')}</span>\n </button>\n {typeof navigator !== 'undefined' && 'share' in navigator && (\n <button\n type=\"button\"\n title={t('copilot:shareResponse')}\n onClick={() => navigator.share({ title: 'Copilot Response', text: renderedMarkdown }).catch(() => {})}\n className=\"flex items-center gap-1 px-2 py-0.5 rounded text-[10px] text-muted-foreground hover:text-foreground hover:bg-muted/60 transition-colors duration-fast ease-standard\"\n >\n <Share2 className=\"w-3 h-3\" />\n <span>{t('copilot:shareResponse')}</span>\n </button>\n )}\n </div>\n )}\n </div>\n )\n })}\n\n {/* Stream error banner — always at leading edge (assistant side) */}\n {chatState.streamError && (\n <div className=\"flex gap-2 justify-start\">\n <div className=\"mt-1 shrink-0\"><TwinAvatar size=\"sm\" /></div>\n <div className=\"min-w-0 flex-1 max-w-[calc(85%-2rem)]\">\n <StreamErrorBanner\n onRetry={chatState.onRetry}\n isRetrying={chatState.isLoading}\n language={language}\n />\n </div>\n </div>\n )}\n\n {/* Follow-up chips after insight */}\n {snapshottedChips && snapshottedChips.length > 0 && insightTriggered && chatState.messages.length === 2 && !chatState.isLoading && chatState.messages[1]?.role === 'assistant' && (\n <div className=\"flex flex-wrap justify-center gap-2 max-w-md mx-auto py-2\">\n {snapshottedChips.map((chip, i) => (\n <button\n key={i}\n onClick={() => { chatState.onSend(chip, { thinkingMode }); setSnapshottedChips(undefined); setInsightTriggered(false) }}\n className=\"text-xs px-3 py-1.5 bg-primary/10 hover:bg-primary/20 text-primary rounded-full transition-colors duration-fast ease-standard border border-primary/20\"\n >\n {chip}\n </button>\n ))}\n </div>\n )}\n\n {/* Live agent steps (pre-response) — always at leading edge */}\n {(chatState.isLoading || chatState.isStreaming) && !chatState.isReceiving && chatState.agentSteps.length > 0 && (\n <div className=\"flex gap-2 justify-start\">\n <div className=\"mt-1 shrink-0\"><TwinAvatar size=\"sm\" /></div>\n <div className=\"min-w-0 flex-1 max-w-[calc(85%-2rem)]\">\n <AgentSteps steps={chatState.agentSteps} isStreaming={true} language={language} dir={isRTL ? 'rtl' : 'ltr'} />\n </div>\n </div>\n )}\n\n {/* Thinking indicator (no steps yet) — always at leading edge.\n Stays visible through isFinalizing so the spinner doesn't\n clear a frame before the committed response paints. */}\n {(chatState.isLoading || chatState.isStreaming || chatState.isFinalizing) && !chatState.isReceiving && chatState.agentSteps.length === 0 && (\n <div className=\"flex gap-2 justify-start\">\n <div className=\"w-6 h-6 rounded-md bg-gradient-to-br from-primary to-primary/70 flex items-center justify-center shrink-0\">\n <Loader2 className=\"w-3 h-3 text-primary-foreground animate-spin\" />\n </div>\n <div className=\"bg-muted rounded-xl px-3 py-2 border border-border\">\n <span className=\"text-xs text-muted-foreground animate-pulse\">\n {t('copilot:thinkingIndicator')}\n </span>\n </div>\n </div>\n )}\n\n <div dir={isRTL ? 'rtl' : 'ltr'} ref={messagesEndRef} />\n </div>\n </ScrollArea>\n\n {/* Input area */}\n <div\n className=\"px-4 py-2.5 border-t border-border bg-background/50 shrink-0 space-y-2 relative\"\n dir={isRTL ? 'rtl' : 'ltr'}\n onDragEnter={(e) => { e.preventDefault(); e.stopPropagation(); dragCounterRef.current++; setIsDragging(true) }}\n onDragOver={(e) => { e.preventDefault(); e.stopPropagation() }}\n onDragLeave={(e) => { e.preventDefault(); e.stopPropagation(); dragCounterRef.current--; if (dragCounterRef.current <= 0) { setIsDragging(false); dragCounterRef.current = 0 } }}\n onDrop={(e) => {\n e.preventDefault(); e.stopPropagation(); setIsDragging(false); dragCounterRef.current = 0\n const files = Array.from(e.dataTransfer.files)\n if (files.length > 0) {\n // C1: Add to attachment chips (sent with next handleSend via attachments path)\n void handleDroppedFiles(files)\n // Also forward to the toolbar's remote-upload path when available\n if (toolbarUploadRef.current) toolbarUploadRef.current(files)\n }\n }}\n >\n {isDragging && (\n <div className=\"absolute inset-0 z-10 flex items-center justify-center bg-primary/5 border-2 border-dashed border-primary/40 rounded-lg backdrop-blur-sm\">\n <p className=\"text-xs font-medium text-primary\">\n {t('copilot:dropFiles')}\n </p>\n </div>\n )}\n\n <ChatToolbar\n forcedTools={forcedTools}\n onForcedToolsChange={setForcedTools}\n attachments={attachments}\n onAttachmentsChange={setAttachments}\n thinkingMode={thinkingMode}\n onThinkingModeChange={(enabled) => {\n setThinkingMode(enabled)\n try { localStorage.setItem('sentra-thinking-mode', String(enabled)) } catch { /* ignore */ }\n }}\n disabled={chatState.isLoading}\n language={language}\n onUploadReady={(fn) => { toolbarUploadRef.current = fn }}\n />\n\n {!isTwin && (personas === undefined || (personas ?? PERSONAS).length > 0) && (\n <PersonaPicker\n value={persona}\n onChange={setPersona}\n disabled={chatState.isLoading}\n language={language}\n personas={personas}\n />\n )}\n\n {/* Tools & Skills collapsible panel — REMOVED per operator (2026-06-16):\n the \"الأدوات والمهارات\" panel is hidden; tools/skills remain\n reachable via the inline \"/\" command menu in the input.\n SHOW_TOOLS_PANEL is a const false so the block never renders. */}\n {SHOW_TOOLS_PANEL && (\n <Collapsible open={toolsPanelOpen} onOpenChange={setToolsPanelOpen}>\n <CollapsibleTrigger asChild>\n <button\n type=\"button\"\n className=\"flex items-center gap-1.5 text-[11px] text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard\"\n aria-expanded={toolsPanelOpen}\n >\n <Wrench className=\"w-3 h-3 shrink-0\" />\n <span>{language === 'ar' ? 'الأدوات والمهارات' : 'Tools & Skills'}</span>\n <ChevronDown className={`w-3 h-3 transition-transform duration-fast ease-standard ${toolsPanelOpen ? 'rotate-180' : ''}`} />\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"mt-1.5 rounded-lg border border-border bg-muted/40 p-2 space-y-1\">\n {effAllowedTools && effAllowedTools.map(tool => (\n <div\n key={tool.slug}\n className=\"flex items-center justify-between gap-2 rounded-md px-2 py-1 hover:bg-muted transition-colors duration-fast ease-standard\"\n >\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <Terminal className=\"w-3 h-3 shrink-0 text-blue-400\" />\n <span className=\"text-xs text-foreground truncate\">{tool.name}</span>\n </div>\n <button\n type=\"button\"\n onClick={() => {\n const cmd = `/${tool.function_name ?? tool.slug} `\n chatState.onInputChange(chatState.inputValue + cmd)\n setToolsPanelOpen(false)\n requestAnimationFrame(() => inputRef.current?.focus())\n }}\n className=\"shrink-0 text-[10px] px-1.5 py-0.5 rounded bg-primary/10 text-primary hover:bg-primary/20 transition-colors duration-fast ease-standard\"\n title={language === 'ar' ? 'أدرج' : 'Insert'}\n >\n {language === 'ar' ? 'أدرج' : 'Insert'}\n </button>\n </div>\n ))}\n {effAllowedSkills && effAllowedSkills.map(skill => (\n <div\n key={skill.slug}\n className=\"flex items-center justify-between gap-2 rounded-md px-2 py-1 hover:bg-muted transition-colors duration-fast ease-standard\"\n >\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <Zap className=\"w-3 h-3 shrink-0 text-amber-400\" />\n <span className=\"text-xs text-foreground truncate\">{skill.name}</span>\n </div>\n <button\n type=\"button\"\n onClick={() => {\n const cmd = `/skill ${skill.slug} `\n chatState.onInputChange(chatState.inputValue + cmd)\n setToolsPanelOpen(false)\n requestAnimationFrame(() => inputRef.current?.focus())\n }}\n className=\"shrink-0 text-[10px] px-1.5 py-0.5 rounded bg-amber-500/10 text-amber-400 hover:bg-amber-500/20 transition-colors duration-fast ease-standard\"\n title={language === 'ar' ? 'أدرج' : 'Insert'}\n >\n {language === 'ar' ? 'أدرج' : 'Insert'}\n </button>\n </div>\n ))}\n </div>\n </CollapsibleContent>\n </Collapsible>\n )}\n\n {/* C1: Attachment chips — queued files shown before the textarea */}\n {attachments.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {attachments.map((att, i) => (\n <div\n key={`${att.name}-${i}`}\n className=\"inline-flex items-center gap-1.5 px-2 py-1 bg-muted border border-border rounded-md text-[11px] text-foreground max-w-[160px]\"\n >\n <span className=\"truncate font-medium\">{att.name}</span>\n <button\n type=\"button\"\n onClick={() => setAttachments(prev => prev.filter((_, idx) => idx !== i))}\n className=\"shrink-0 text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard\"\n aria-label={language === 'ar' ? `إزالة ${att.name}` : `Remove ${att.name}`}\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* C3 + C2b: slash command and @mention popovers anchored above the textarea */}\n <div className=\"relative\">\n {/* C3: Slash command menu */}\n {slashMenuOpen && (\n <div\n ref={slashMenuRef}\n className=\"absolute bottom-full mb-1 start-0 w-72 z-50 rounded-lg border border-border bg-popover shadow-md overflow-hidden\"\n dir={isRTL ? 'rtl' : 'ltr'}\n >\n <Command shouldFilter={false}>\n <CommandInput\n value={slashQuery}\n onValueChange={setSlashQuery}\n placeholder={language === 'ar' ? 'ابحث في الأوامر…' : 'Search commands…'}\n className=\"h-8 text-xs\"\n autoFocus={false}\n />\n <CommandList className=\"max-h-52\">\n <CommandEmpty className=\"text-xs py-3\">\n {language === 'ar' ? 'لا توجد أوامر' : 'No commands found'}\n </CommandEmpty>\n {effAllowedTools && effAllowedTools.length > 0 && (\n <CommandGroup heading={language === 'ar' ? 'أدوات' : 'Tools'}>\n {effAllowedTools\n .filter(t =>\n !slashQuery ||\n (t.function_name ?? t.slug).toLowerCase().includes(slashQuery.toLowerCase()) ||\n t.name.toLowerCase().includes(slashQuery.toLowerCase())\n )\n .map(tool => (\n <CommandItem\n key={tool.slug}\n value={tool.function_name ?? tool.slug}\n onSelect={() => handleSlashSelect(tool.function_name ?? tool.slug)}\n className=\"text-xs cursor-pointer\"\n >\n <Terminal className=\"w-3 h-3 me-2 shrink-0 text-blue-400\" />\n <span className=\"font-mono text-primary me-1.5\">/{tool.function_name ?? tool.slug}</span>\n <span className=\"text-muted-foreground truncate\">{tool.name}</span>\n </CommandItem>\n ))}\n </CommandGroup>\n )}\n {effAllowedSkills && effAllowedSkills.length > 0 && (\n <CommandGroup heading={language === 'ar' ? 'مهارات' : 'Skills'}>\n {effAllowedSkills\n .filter(s =>\n !slashQuery ||\n s.slug.toLowerCase().includes(slashQuery.toLowerCase()) ||\n s.name.toLowerCase().includes(slashQuery.toLowerCase())\n )\n .map(skill => (\n <CommandItem\n key={skill.slug}\n value={`skill-${skill.slug}`}\n onSelect={() => handleSlashSelect(`skill ${skill.slug}`)}\n className=\"text-xs cursor-pointer\"\n >\n <Zap className=\"w-3 h-3 me-2 shrink-0 text-amber-400\" />\n <span className=\"font-mono text-primary me-1.5\">/skill {skill.slug}</span>\n <span className=\"text-muted-foreground truncate\">{skill.name}</span>\n </CommandItem>\n ))}\n </CommandGroup>\n )}\n </CommandList>\n </Command>\n </div>\n )}\n\n {/* C2b: @mention menu (gated by ui.showAgents) */}\n {atMenuOpen && showAgents && (\n <div\n ref={atMenuRef}\n className=\"absolute bottom-full mb-1 start-0 w-64 z-50 rounded-lg border border-border bg-popover shadow-md overflow-hidden\"\n dir={isRTL ? 'rtl' : 'ltr'}\n >\n <Command shouldFilter={false}>\n <CommandInput\n value={atQuery}\n onValueChange={setAtQuery}\n placeholder={language === 'ar' ? 'ابحث في الوكلاء…' : 'Search agents…'}\n className=\"h-8 text-xs\"\n autoFocus={false}\n />\n <CommandList className=\"max-h-48\">\n <CommandEmpty className=\"text-xs py-3\">\n {language === 'ar' ? 'لا يوجد وكلاء' : 'No agents found'}\n </CommandEmpty>\n <CommandGroup heading={language === 'ar' ? 'الوكلاء' : 'Agents'}>\n {(personas ?? PERSONAS as Array<{ id: string; label: string; labelAr: string; icon?: string }>)\n .filter(p =>\n !atQuery ||\n p.label.toLowerCase().includes(atQuery.toLowerCase()) ||\n p.id.toLowerCase().includes(atQuery.toLowerCase())\n )\n .map(p => (\n <CommandItem\n key={p.id}\n value={p.id}\n onSelect={() => handleAtSelect(p.label)}\n className=\"text-xs cursor-pointer\"\n >\n {p.icon\n ? <span className=\"me-2 text-sm\">{p.icon}</span>\n : <AtSign className=\"w-3 h-3 me-2 shrink-0 text-emerald-400\" />\n }\n <span className=\"text-foreground\">{p.label}</span>\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </div>\n )}\n\n <form\n onSubmit={(e) => { e.preventDefault(); handleSend() }}\n className=\"flex items-end gap-2\"\n >\n <Textarea\n ref={inputRef}\n value={chatState.inputValue}\n onChange={(e) => { handleInputChange(e.target.value); autoResize(e.target) }}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={chatState.isLoading}\n rows={1}\n className=\"flex-1 min-h-[36px] max-h-[120px] resize-none text-sm py-2\"\n />\n <Button\n type=\"submit\"\n size=\"icon\"\n disabled={chatState.isLoading || !chatState.inputValue.trim()}\n className=\"h-9 w-9 shrink-0\"\n aria-label={language === 'ar' ? 'إرسال' : 'Send'}\n >\n <Send className=\"w-4 h-4\" aria-hidden=\"true\" />\n </Button>\n </form>\n </div>\n </div>\n </div>\n )}\n </div>\n </>\n )\n}\n\nUnifiedCopilotDock.displayName = 'UnifiedCopilotDock'\n\nexport default UnifiedCopilotDock","// ── Copilot standalone i18n fallback ─────────────────────────────────────────\n//\n// useSafeT() returns null when the dock/launcher is mounted WITHOUT a\n// LanguageProvider (isolated renders, Storybook stories that forget the\n// provider, host apps that don't use the kit i18n). Previously the fallback\n// was `(key) => key`, so the UI showed raw keys like \"copilot:placeholder\".\n//\n// This module provides a built-in English dictionary for the namespaces the\n// dock + launcher actually read (copilot:*, nav:copilot, common:close), so the\n// surface reads correctly even with no provider. The provider path is\n// unchanged — when a LanguageProvider IS present, langCtx.t wins.\n\nimport enJson from '../../i18n/locales/en.json'\n\ntype Dict = Record<string, unknown>\n\nconst EN = enJson as unknown as Dict\n\n/**\n * fallbackT — resolve a namespaced i18n key (\"ns:key\") against the bundled\n * English locale. Returns the raw key when the namespace/key is unknown so the\n * miss is still visible in development.\n */\nexport function fallbackT(key: string): string {\n const idx = key.indexOf(':')\n if (idx === -1) {\n const v = EN[key]\n return typeof v === 'string' ? v : key\n }\n const ns = key.slice(0, idx)\n const leaf = key.slice(idx + 1)\n const bucket = EN[ns]\n if (bucket && typeof bucket === 'object') {\n const v = (bucket as Dict)[leaf]\n if (typeof v === 'string') return v\n }\n return key\n}\n","'use client'\n\nimport { useState, useMemo } from 'react'\nimport {\n Search, Database, Globe, Sparkles, Check, ChevronDown, ExternalLink,\n Brain, Microscope, Newspaper, FileText, Clock,\n X as XIcon, CircleDot,\n} from 'lucide-react'\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../ui/collapsible'\nimport type { AgentStep } from './types'\n\n// Re-export for consumers\nexport type { AgentStep }\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\ninterface AgentStepsProps {\n steps: AgentStep[]\n isStreaming: boolean\n /** UI language. Defaults to 'en'. */\n language?: 'en' | 'ar'\n /** Text direction. Inferred from language when not provided. */\n dir?: 'ltr' | 'rtl'\n}\n\n// ── Translation maps ───────────────────────────────────────────────────────────\n\nconst STEP_MSG_AR: Record<string, string> = {\n 'Searching internal knowledge...': 'البحث في قاعدة المعرفة الداخلية...',\n 'No internal matches found': 'لا توجد نتائج داخلية',\n 'Searching the web...': 'البحث في الويب...',\n 'No web results found': 'لا توجد نتائج ويب',\n 'Searching X/Twitter for public discourse...': 'البحث في منصة X عن الخطاب العام...',\n 'No social posts found': 'لا توجد منشورات',\n 'Searching latest news...': 'البحث في الأخبار الأخيرة...',\n 'No news results found': 'لا توجد نتائج إخبارية',\n 'Composing response...': 'صياغة الرد...',\n 'Formulating response...': 'أصوغ الرد...',\n 'Answering from screen context...': 'الإجابة من سياق الشاشة...',\n 'Files processed': 'تم معالجة الملفات',\n 'Documents loaded': 'تم قراءة المستندات',\n 'Recalling from memory...': 'أستحضر من الذاكرة...',\n 'Profile recalled': 'تم استحضار الملف الشخصي',\n 'Reflecting on public record...': 'أتأمل في السجل العام...',\n 'No additional context needed': 'لا توجد معلومات إضافية',\n 'Deep research in progress...': 'بحث عميق قيد التنفيذ...',\n 'No deep research results found': 'لم يتم العثور على نتائج',\n 'Entity already exists': 'الجهة موجودة بالفعل',\n 'New entity created': 'تم إنشاء جهة جديدة',\n 'Narrative already exists': 'الرواية موجودة بالفعل',\n 'New narrative added': 'تمت إضافة رواية جديدة',\n 'Narrative enhanced': 'تم تحسين الرواية',\n 'Narrative not found': 'الرواية غير موجودة',\n 'Analysis complete': 'اكتمل التحليل',\n}\n\nconst STEP_MSG_AR_PATTERNS: Array<{ pattern: RegExp; replace: (m: RegExpMatchArray) => string }> = [\n { pattern: /^Found (\\d+) web sources?$/, replace: m => `تم العثور على ${m[1]} مصدر` },\n { pattern: /^Found (\\d+) social posts?$/, replace: m => `تم العثور على ${m[1]} منشور` },\n { pattern: /^Found (\\d+) news sources?$/, replace: m => `تم العثور على ${m[1]} مصدر إخباري` },\n { pattern: /^Reviewed (\\d+) sources?$/, replace: m => `تم مراجعة ${m[1]} مصادر` },\n { pattern: /^(\\d+) high-relevance.*$/, replace: m => `${m[1]} نتيجة عالية الصلة` },\n { pattern: /^Synthesizing from (\\d+) sources?\\.\\.\\.$/, replace: m => `تجميع من ${m[1]} مصدر...` },\n { pattern: /^Processing (\\d+) attached files?\\.\\.\\.$/,replace: m => `معالجة ${m[1]} ملف مرفق...` },\n { pattern: /^Reading (\\d+) documents?\\.\\.\\.$/,replace: m => `قراءة ${m[1]} مستند...` },\n { pattern: /^Profiling \"(.+)\" as (.+)\\.\\.\\.$/, replace: m => `جارٍ تسجيل \"${m[1]}\" كـ ${m[2]}...` },\n { pattern: /^Adding narrative \"(.+)\"\\.\\.\\.$/, replace: m => `جارٍ إضافة الرواية \"${m[1]}\"...` },\n { pattern: /^Enhancing narrative\\.\\.\\.$/, replace: () => 'جارٍ تحسين الرواية...' },\n { pattern: /^Deep research complete: (\\d+) sources? \\((.+)\\)$/, replace: m => `بحث عميق مكتمل: ${m[1]} مصدر (${m[2]})` },\n { pattern: /^Scanned (\\d+) social posts/, replace: m => `تم مسح ${m[1]} منشور اجتماعي` },\n { pattern: /^Re-profiling as (.+)$/, replace: m => `إعادة تسجيل كـ ${m[1]}` },\n { pattern: /^Running (.+)\\.\\.\\.$/, replace: m => `جارٍ تشغيل ${m[1]}...` },\n { pattern: /^(.+) complete$/, replace: m => `اكتمل ${m[1]}` },\n]\n\nconst SOURCE_LABEL_AR: Record<string, string> = {\n 'Internal Narrative': 'سردية داخلية',\n 'Alert Record': 'سجل إشارة',\n 'Entity Profile': 'ملف جهة',\n 'Internal Document': 'مستند داخلي',\n}\n\nfunction translateStepMessage(message: string, language: string): string {\n if (language !== 'ar') return message\n if (STEP_MSG_AR[message]) return STEP_MSG_AR[message]\n for (const { pattern, replace } of STEP_MSG_AR_PATTERNS) {\n const match = message.match(pattern)\n if (match) return replace(match)\n }\n return message\n}\n\nfunction translateSource(source: string, language: string): string {\n if (language !== 'ar') return source\n return SOURCE_LABEL_AR[source] || source\n}\n\n// ── Step icons ─────────────────────────────────────────────────────────────────\n\nconst STEP_ICONS: Record<string, { active: typeof Search; complete: typeof Search }> = {\n rag_search: { active: Search, complete: Database },\n rag_results: { active: Database, complete: Database },\n web_search: { active: Globe, complete: Globe },\n web_results: { active: Globe, complete: Globe },\n news_search: { active: Newspaper, complete: Newspaper },\n news_results: { active: Newspaper, complete: Newspaper },\n social_search: { active: CircleDot, complete: CircleDot },\n social_results: { active: CircleDot, complete: CircleDot },\n deep_research: { active: Microscope, complete: Microscope },\n deep_research_searching:{ active: Search, complete: Search },\n deep_research_reading: { active: Globe, complete: Globe },\n deep_research_thinking:{ active: Brain, complete: Brain },\n deep_research_progress:{ active: Clock, complete: Clock },\n deep_research_results: { active: Microscope, complete: Microscope },\n file_processing: { active: FileText, complete: FileText },\n tool_check: { active: Search, complete: Check },\n profile_entity: { active: Search, complete: Search },\n profile_result: { active: Search, complete: Check },\n track_narrative: { active: Search, complete: Search },\n narrative_result: { active: Search, complete: Check },\n composing: { active: Sparkles, complete: Sparkles },\n twin_recall: { active: Brain, complete: Brain },\n twin_reflect: { active: Globe, complete: Globe },\n twin_composing: { active: Sparkles, complete: Sparkles },\n compare_detect: { active: Search, complete: Search },\n compare_profiling: { active: Clock, complete: Check },\n compare_factors: { active: Sparkles, complete: Sparkles },\n compare_running: { active: Clock, complete: Clock },\n compare_result: { active: Check, complete: Check },\n auto_profile: { active: Search, complete: Check },\n compare_ready: { active: Check, complete: Check },\n}\n\ntype StepState = 'active' | 'complete' | 'error'\n\nfunction getStepState(step: AgentStep, allSteps: AgentStep[], isStreaming?: boolean): StepState {\n if (isStreaming === false) return 'complete'\n if (step.step.endsWith('_results') || step.step === 'profile_result' || step.step === 'narrative_result' || step.step === 'deep_research_results') return 'complete'\n if (step.step === 'rag_search' && allSteps.some(s => s.step === 'rag_results')) return 'complete'\n if (step.step === 'web_search' && allSteps.some(s => s.step === 'web_results')) return 'complete'\n if (step.step === 'news_search' && allSteps.some(s => s.step === 'news_results')) return 'complete'\n if (step.step === 'social_search' && allSteps.some(s => s.step === 'social_results')) return 'complete'\n if (step.step === 'deep_research' && allSteps.some(s => s.step === 'deep_research_results')) return 'complete'\n if (['deep_research_searching', 'deep_research_reading', 'deep_research_thinking', 'deep_research_progress'].includes(step.step)) {\n const idx = allSteps.indexOf(step)\n if (allSteps.slice(idx + 1).some(s => s.step.startsWith('deep_research_'))) return 'complete'\n }\n if (step.step === 'tool_check' && allSteps.some(s => s.step === 'composing' || s.step === 'profile_entity' || s.step === 'track_narrative')) return 'complete'\n if (step.step === 'profile_entity' && allSteps.some(s => s.step === 'profile_result')) return 'complete'\n if (step.step === 'track_narrative' && allSteps.some(s => s.step === 'narrative_result')) return 'complete'\n if ((step.step === 'twin_recall' || step.step === 'twin_reflect' || step.step === 'twin_composing' || step.step === 'composing' || step.step === 'auto_profile' || step.step === 'file_processing') && step.done) return 'complete'\n if (step.step === 'compare_factors' || step.step === 'compare_result') return 'complete'\n if (step.step === 'compare_detect' && allSteps.some(s => s.step === 'compare_factors' || s.step === 'compare_ready')) return 'complete'\n if (step.step === 'compare_profiling' && allSteps.some(s => s.step === 'compare_factors')) return 'complete'\n if (step.step === 'compare_running' && allSteps.some(s => s.step === 'compare_result')) return 'complete'\n if (step.done) return 'complete'\n return 'active'\n}\n\n// ── Sub-components ─────────────────────────────────────────────────────────────\n\nfunction StepIndicator({ state, step }: { state: StepState; step: string }) {\n const icons = STEP_ICONS[step] || { active: Sparkles, complete: Sparkles }\n\n if (state === 'error') return <XIcon className=\"w-3 h-3 text-destructive\" />\n\n if (state === 'complete') {\n return <Check className=\"w-3 h-3 text-emerald-400\" />\n }\n\n const Icon = icons.active\n return (\n <span className=\"relative flex h-3 w-3 items-center justify-center\">\n <span className=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-emerald-400/40\" />\n <Icon className=\"relative w-2.5 h-2.5 text-emerald-400\" />\n </span>\n )\n}\n\nfunction TimingBadge({ ms }: { ms?: number }) {\n if (!ms) return null\n const display = ms >= 1000 ? `${(ms / 1000).toFixed(1)}s` : `${ms}ms`\n return <span className=\"text-[10px] text-muted-foreground/60 tabular-nums ms-1\">({display})</span>\n}\n\nfunction SourcePills({ sources, language }: { sources?: string[]; language: string }) {\n if (!sources || sources.length === 0) return null\n return (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {sources.slice(0, 4).map((s, i) => (\n <span key={i} className=\"inline-flex items-center px-1.5 py-0.5 bg-muted/50 rounded text-[10px] text-muted-foreground leading-tight\">\n {translateSource(s, language)}\n </span>\n ))}\n </div>\n )\n}\n\nfunction DomainPills({ domains, citations }: { domains?: string[]; citations?: string[] }) {\n if (!domains || domains.length === 0) return null\n return (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {domains.slice(0, 4).map((domain, i) => {\n const url = citations?.[i]\n return (\n <a\n key={i}\n href={url || '#'}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-0.5 px-1.5 py-0.5 bg-muted/50 rounded text-[10px] text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard leading-tight\"\n >\n <ExternalLink className=\"w-2 h-2\" />\n {domain}\n </a>\n )\n })}\n </div>\n )\n}\n\nfunction HandlePills({ handles }: { handles?: string[] }) {\n if (!handles || handles.length === 0) return null\n return (\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {handles.slice(0, 4).map((h, i) => (\n <a\n key={i}\n href={`https://x.com/${h}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center px-1.5 py-0.5 bg-muted/50 rounded text-[10px] text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard leading-tight\"\n >\n @{h}\n </a>\n ))}\n </div>\n )\n}\n\nfunction StepLine({\n step,\n allSteps,\n isRTL,\n isStreaming,\n language,\n}: {\n step: AgentStep\n allSteps: AgentStep[]\n isRTL: boolean\n isStreaming: boolean\n language: string\n}) {\n const state = getStepState(step, allSteps, isStreaming)\n const isComplete = state === 'complete'\n\n return (\n <div className={`flex items-start gap-2 text-xs transition-opacity duration-300 ${isComplete ? 'text-muted-foreground/70' : 'text-muted-foreground'}`}>\n <div className=\"mt-0.5 flex-shrink-0\">\n <StepIndicator state={state} step={step.step} />\n </div>\n <div className={`flex-1 min-w-0 text-start`}>\n <span>{translateStepMessage(step.message, language)}</span>\n <TimingBadge ms={step.duration_ms} />\n {step.query && (\n <span className={`ms-1 text-foreground/50 font-mono text-[10px]`}>\"{step.query}\"</span>\n )}\n {step.subQuery && (\n <span className={`ms-1 text-foreground/50 font-mono text-[10px]`}>\"{step.subQuery}\"</span>\n )}\n <SourcePills sources={step.sources} language={language} />\n <DomainPills domains={step.domains} citations={step.citations} />\n <HandlePills handles={step.handles} />\n </div>\n </div>\n )\n}\n\n// ── Main component ─────────────────────────────────────────────────────────────\n\n/**\n * AgentSteps\n *\n * Collapsible list of streaming agent tool-call steps with real-time state\n * indicators (active/complete/error). Bilingual EN/AR, RTL-aware.\n *\n * All app deps removed — language/dir are plain props.\n */\nconst AgentSteps = ({ steps, isStreaming, language = 'en', dir }: AgentStepsProps) => {\n const [isExpanded, setIsExpanded] = useState(true)\n const isAr = language === 'ar'\n const isRTL = dir === 'rtl' || (dir === undefined && isAr)\n\n const displaySteps = useMemo(() => {\n const resultTypes = new Set(steps.filter(s => s.step.endsWith('_results')).map(s => s.step.replace('_results', '_search')))\n const hasDeepResults = steps.some(s => s.step === 'deep_research_results')\n return steps.filter(s => {\n if (s.step.endsWith('_search') && !s.step.startsWith('deep_research_') && resultTypes.has(s.step)) return false\n if (s.step === 'deep_research' && steps.some(ss => ss.step.startsWith('deep_research_') && ss.step !== 'deep_research' && ss.step !== 'deep_research_results')) return false\n if (hasDeepResults && ['deep_research_searching', 'deep_research_reading', 'deep_research_thinking', 'deep_research_progress'].includes(s.step)) return false\n return true\n })\n }, [steps])\n\n if (steps.length === 0) return null\n\n const ragResult = steps.find(s => s.step === 'rag_results')\n const webResult = steps.find(s => s.step === 'web_results')\n const socialResult = steps.find(s => s.step === 'social_results')\n\n const summaryParts: string[] = []\n if (ragResult?.count) summaryParts.push(isAr ? `${ragResult.count} داخلي` : `${ragResult.count} internal`)\n if (webResult?.count) summaryParts.push(isAr ? `${webResult.count} ويب` : `${webResult.count} web`)\n if (socialResult?.count) summaryParts.push(isAr ? `${socialResult.count} تواصل` : `${socialResult.count} social`)\n\n const totalDuration = [ragResult, webResult, socialResult].reduce((sum, s) => sum + (s?.duration_ms || 0), 0)\n\n const allDone = !isStreaming || steps.some(s => s.step === 'composing' || s.step === 'twin_composing')\n const summary = summaryParts.length > 0\n ? (isAr\n ? `تم تحليل ${summaryParts.join('، ')} مصادر${totalDuration ? ` (${(totalDuration / 1000).toFixed(1)}ث)` : ''}`\n : `Analyzed ${summaryParts.join(', ')} sources${totalDuration ? ` (${(totalDuration / 1000).toFixed(1)}s)` : ''}`)\n : allDone\n ? (isAr ? 'اكتمل التحليل' : 'Analysis complete')\n : (isAr ? 'جارٍ البحث...' : 'Searching...')\n\n const triggerIcon = !isStreaming || allDone\n ? <Check className=\"w-3 h-3 text-emerald-400\" />\n : (\n <span className=\"relative flex h-3 w-3 items-center justify-center\">\n <span className=\"absolute inline-flex h-full w-full animate-ping rounded-full bg-emerald-400/40\" />\n <Search className=\"relative w-2.5 h-2.5 text-emerald-400\" />\n </span>\n )\n\n return (\n // dir set locally so flex order, borders, and text alignment mirror natively\n // in RTL without manual flex-row-reverse flips (which double-flip when an\n // ancestor already sets dir=\"rtl\", e.g. inside UnifiedCopilotDock).\n <Collapsible open={isExpanded} onOpenChange={setIsExpanded} dir={isRTL ? 'rtl' : 'ltr'}>\n <CollapsibleTrigger\n className={`flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard cursor-pointer py-1`}\n >\n {triggerIcon}\n <span>{summary}</span>\n <ChevronDown className={`w-3 h-3 transition-transform duration-fast ease-standard ${isExpanded ? 'rotate-180' : ''}`} />\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className={`mt-1 space-y-1.5 border-border ps-1 border-s-2 ms-1.5`}>\n {displaySteps.map((s, i) => (\n <StepLine\n key={`${s.step}-${i}`}\n step={s}\n allSteps={steps}\n isRTL={isRTL}\n isStreaming={isStreaming}\n language={language}\n />\n ))}\n </div>\n </CollapsibleContent>\n </Collapsible>\n )\n}\n\nAgentSteps.displayName = 'AgentSteps'\n\nexport default AgentSteps","'use client'\n\nimport { WifiOff, RefreshCw } from 'lucide-react'\nimport { Button } from '../ui/button'\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\ninterface StreamErrorBannerProps {\n /** Called when the user clicks \"Retry\" — should re-send the last message. */\n onRetry: () => void\n /** Whether a retry is currently in flight. */\n isRetrying?: boolean\n /** UI language. Defaults to 'en'. */\n language?: 'en' | 'ar'\n /** Text direction. Inferred from language when not provided. */\n dir?: 'ltr' | 'rtl'\n}\n\n// ── Component ──────────────────────────────────────────────────────────────────\n\n/**\n * StreamErrorBanner\n *\n * Rendered inside the chat thread when an SSE stream is interrupted mid-flight\n * (e.g. the user loses network connectivity). Shows a localised error message\n * and a retry button that re-sends the last user message WITHOUT navigating\n * away from the page.\n *\n * Bilingual (EN/AR). RTL-aware via logical margin/padding classes.\n * All app deps removed — language/dir are plain props.\n */\nconst StreamErrorBanner = ({ onRetry, isRetrying = false, language = 'en', dir }: StreamErrorBannerProps) => {\n const isAR = language === 'ar'\n const resolvedDir = dir ?? (isAR ? 'rtl' : 'ltr')\n\n const handleRetry = () => {\n if (!isRetrying) onRetry()\n }\n\n return (\n <div\n className=\"flex items-start gap-3 px-3 py-2.5 rounded-xl bg-destructive/10 border border-destructive/30 text-sm\"\n dir={resolvedDir}\n role=\"alert\"\n aria-live=\"polite\"\n >\n <WifiOff className=\"w-4 h-4 text-destructive shrink-0 mt-0.5\" aria-hidden=\"true\" />\n\n <div className=\"flex-1 min-w-0 space-y-2\">\n <p className=\"text-destructive font-medium text-xs leading-snug\">\n {isAR\n ? 'انقطع الاتصال أثناء استجابة المساعد'\n : 'Connection interrupted during response'}\n </p>\n <p className=\"text-muted-foreground text-[11px] leading-snug\">\n {isAR\n ? 'انقطعت البث بسبب مشكلة في الشبكة. يمكنك إعادة المحاولة لاستئناف المحادثة.'\n : 'The stream was interrupted due to a network issue. Retry to continue the conversation.'}\n </p>\n\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 text-xs border-destructive/40 text-destructive hover:bg-destructive/10 hover:text-destructive\"\n onClick={handleRetry}\n disabled={isRetrying}\n >\n {isRetrying ? (\n <>\n <RefreshCw className=\"w-3 h-3 animate-spin me-1.5\" aria-hidden=\"true\" />\n {isAR ? 'جارٍ المحاولة...' : 'Retrying...'}\n </>\n ) : (\n <>\n <RefreshCw className=\"w-3 h-3 me-1.5\" aria-hidden=\"true\" />\n {isAR ? 'إعادة المحاولة' : 'Retry'}\n </>\n )}\n </Button>\n </div>\n </div>\n )\n}\n\nStreamErrorBanner.displayName = 'StreamErrorBanner'\n\nexport default StreamErrorBanner","'use client'\n\nimport { useState, useRef, useCallback, useEffect } from 'react'\nimport { Globe, Newspaper, Microscope, Paperclip, ChevronDown, Brain, Zap } from 'lucide-react'\nimport FilePreviewChip from './FilePreviewChip'\nimport type { ChatAttachment, ForcedTools } from '../copilot/types'\n\n// Re-export types for consumers\nexport type { ForcedTools }\n\n// ── X/Twitter icon ─────────────────────────────────────────────────────────────\n\nfunction XIcon({ className }: { className?: string }) {\n return (\n <svg viewBox=\"0 0 24 24\" className={className} fill=\"currentColor\">\n <path d=\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\" />\n </svg>\n )\n}\n\n// ── Constants ──────────────────────────────────────────────────────────────────\n\nconst ALLOWED_ATTACHMENT_MIMES = new Set([\n 'image/png', 'image/jpeg', 'image/webp', 'image/gif',\n 'image/heic', 'image/heif',\n 'application/pdf',\n])\n\nconst SEARCH_SOURCES = [\n { id: 'web', label: 'Web', labelAr: 'ويب', icon: Globe },\n { id: 'news', label: 'News', labelAr: 'أخبار', icon: Newspaper },\n { id: 'social', label: 'Social', labelAr: 'اجتماعي', icon: XIcon },\n] as const\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\ninterface ChatToolbarProps {\n forcedTools: ForcedTools\n onForcedToolsChange: (tools: ForcedTools) => void\n attachments: ChatAttachment[]\n onAttachmentsChange: (attachments: ChatAttachment[]) => void\n thinkingMode: boolean\n onThinkingModeChange: (enabled: boolean) => void\n disabled?: boolean\n /** UI language. Defaults to 'en'. */\n language?: 'en' | 'ar'\n /** Exposes the internal upload function so the parent can trigger file\n * upload on drag-drop (mirror of the original `onUploadReady` pattern). */\n onUploadReady?: (uploadFn: (files: File[]) => Promise<void>) => void\n}\n\n// ── Component ──────────────────────────────────────────────────────────────────\n\n/**\n * ChatToolbar\n *\n * Tool pills row: thinking-mode toggle, search (with source picker), deep\n * research, and file attachment. Manages file encoding locally (base64 inline).\n *\n * All app deps removed — language is a plain prop.\n */\nconst ChatToolbar = ({\n forcedTools,\n onForcedToolsChange,\n attachments,\n onAttachmentsChange,\n thinkingMode,\n onThinkingModeChange,\n disabled,\n language = 'en',\n onUploadReady,\n}: ChatToolbarProps) => {\n const fileInputRef = useRef<HTMLInputElement>(null)\n const [uploading, setUploading] = useState(false)\n const [uploadError, setUploadError] = useState<string | null>(null)\n const isAr = language === 'ar'\n\n const isSearchActive = !!forcedTools.search\n const isDeepResearchActive = !!forcedTools.deep_research\n\n const toggleSearch = () => {\n if (isSearchActive) {\n onForcedToolsChange({ ...forcedTools, search: false, search_sources: undefined })\n } else {\n onForcedToolsChange({ search: true, search_sources: ['web'], deep_research: false })\n }\n }\n\n const toggleDeepResearch = () => {\n if (isDeepResearchActive) {\n onForcedToolsChange({ ...forcedTools, deep_research: false })\n } else {\n onForcedToolsChange({ search: false, search_sources: undefined, deep_research: true })\n }\n }\n\n const toggleSource = (sourceId: string) => {\n const current = forcedTools.search_sources || ['web']\n const isActive = current.includes(sourceId)\n let next: string[]\n if (isActive) {\n next = current.filter(s => s !== sourceId)\n if (next.length === 0) next = ['web']\n } else {\n next = [...current, sourceId]\n }\n onForcedToolsChange({ ...forcedTools, search_sources: next })\n }\n\n const uploadFiles = useCallback(async (files: File[]) => {\n if (files.length === 0) return\n setUploading(true)\n setUploadError(null)\n const newAttachments: ChatAttachment[] = []\n\n for (const file of files) {\n if (file.size > 10 * 1024 * 1024) {\n setUploadError(isAr ? 'الملف كبير جداً (الحد 10 ميغابايت)' : 'File too large (10MB limit)')\n continue\n }\n\n const mimeType = file.type || 'application/octet-stream'\n if (!ALLOWED_ATTACHMENT_MIMES.has(mimeType)) {\n setUploadError(isAr ? `نوع الملف غير مدعوم: ${mimeType}` : `Unsupported file type: ${mimeType}`)\n continue\n }\n\n try {\n const data = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(reader.result as string)\n reader.onerror = () => reject(reader.error)\n reader.readAsDataURL(file)\n })\n newAttachments.push({ data, name: file.name, type: mimeType, size: file.size })\n } catch (err) {\n console.error('[ChatToolbar]', 'File encode error', { file: file.name, err })\n setUploadError(isAr ? 'فشل تحميل الملف' : 'Failed to load file')\n }\n }\n\n if (newAttachments.length > 0) {\n onAttachmentsChange([...attachments, ...newAttachments])\n }\n setUploading(false)\n if (fileInputRef.current) fileInputRef.current.value = ''\n }, [attachments, onAttachmentsChange, isAr])\n\n const handleFileSelect = useCallback(async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files\n if (!files || files.length === 0) return\n await uploadFiles(Array.from(files))\n }, [uploadFiles])\n\n useEffect(() => {\n onUploadReady?.(uploadFiles)\n }, [uploadFiles, onUploadReady])\n\n const removeAttachment = (index: number) => {\n onAttachmentsChange(attachments.filter((_, i) => i !== index))\n }\n\n const activeSources = forcedTools.search_sources || ['web']\n\n return (\n <div className=\"space-y-2\">\n {uploadError && (\n <p className=\"text-xs text-destructive px-1\">{uploadError}</p>\n )}\n\n {attachments.length > 0 && (\n <div className=\"flex flex-wrap gap-1.5\">\n {attachments.map((att, i) => (\n <FilePreviewChip\n key={i}\n attachment={att}\n onRemove={() => removeAttachment(i)}\n language={language}\n />\n ))}\n </div>\n )}\n\n {/* Source picker (shown when search is active) */}\n {isSearchActive && (\n <div className=\"flex items-center gap-1.5 px-1\">\n <span className=\"text-[10px] text-muted-foreground font-medium uppercase tracking-wider shrink-0\">\n {isAr ? 'مصادر' : 'Sources'}\n </span>\n {SEARCH_SOURCES.map(source => {\n const isActive = activeSources.includes(source.id)\n const Icon = source.icon\n return (\n <button\n key={source.id}\n onClick={() => toggleSource(source.id)}\n disabled={disabled}\n className={`inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-[11px] font-medium transition-all duration-fast ease-standard border ${\n isActive\n ? 'bg-primary/15 text-primary border-primary/30'\n : 'bg-transparent text-muted-foreground border-transparent hover:bg-muted hover:border-border'\n }`}\n >\n <Icon className=\"w-3 h-3\" />\n {isAr ? source.labelAr : source.label}\n </button>\n )\n })}\n </div>\n )}\n\n {/* Main tool pills */}\n <div className=\"flex items-center gap-1.5\">\n <button\n onClick={() => onThinkingModeChange(!thinkingMode)}\n disabled={disabled}\n className={`inline-flex items-center gap-1 px-2.5 py-1 rounded-full text-xs font-medium transition-all duration-fast ease-standard border ${\n thinkingMode\n ? 'bg-amber-500/15 text-amber-400 border-amber-500/30'\n : 'bg-cyan-500/15 text-cyan-400 border-cyan-500/30'\n }`}\n title={thinkingMode\n ? (isAr ? 'وضع التفكير العميق' : 'Thinking mode — deeper analysis')\n : (isAr ? 'الوضع السريع' : 'Fast mode — quicker responses')}\n >\n {thinkingMode ? <Brain className=\"w-3.5 h-3.5\" /> : <Zap className=\"w-3.5 h-3.5\" />}\n {thinkingMode ? (isAr ? 'تفكير' : 'Thinking') : (isAr ? 'سريع' : 'Fast')}\n </button>\n\n <button\n onClick={toggleSearch}\n disabled={disabled}\n className={`inline-flex items-center gap-1 px-2.5 py-1 rounded-full text-xs font-medium transition-all duration-fast ease-standard border ${\n isSearchActive\n ? 'bg-primary/15 text-primary border-primary/30'\n : 'bg-transparent text-muted-foreground border-border hover:bg-muted hover:text-foreground'\n }`}\n >\n <Globe className=\"w-3.5 h-3.5\" />\n {isAr ? 'بحث' : 'Search'}\n {isSearchActive && <ChevronDown className=\"w-3 h-3 rotate-180\" />}\n </button>\n\n <button\n onClick={toggleDeepResearch}\n disabled={disabled}\n className={`inline-flex items-center gap-1 px-2.5 py-1 rounded-full text-xs font-medium transition-all duration-fast ease-standard border ${\n isDeepResearchActive\n ? 'bg-violet-500/15 text-violet-400 border-violet-500/30'\n : 'bg-transparent text-muted-foreground border-border hover:bg-muted hover:text-foreground'\n }`}\n >\n <Microscope className=\"w-3.5 h-3.5\" />\n {isAr ? 'بحث عميق' : 'Deep Research'}\n </button>\n\n <button\n onClick={() => fileInputRef.current?.click()}\n disabled={disabled || uploading}\n className=\"inline-flex items-center gap-1 px-2.5 py-1 rounded-full text-xs font-medium transition-all duration-fast ease-standard border bg-transparent text-muted-foreground border-border hover:bg-muted hover:text-foreground\"\n >\n <Paperclip className={`w-3.5 h-3.5 ${uploading ? 'animate-spin' : ''}`} />\n {attachments.length > 0\n ? `${attachments.length}`\n : (isAr ? 'إرفاق' : 'Attach')}\n </button>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept=\"image/png,image/jpeg,image/webp,image/gif,image/heic,image/heif,.pdf\"\n className=\"hidden\"\n onChange={handleFileSelect}\n />\n </div>\n </div>\n )\n}\n\nChatToolbar.displayName = 'ChatToolbar'\n\nexport default ChatToolbar","'use client'\n\nimport { X, FileText, Image, File } from 'lucide-react'\nimport type { ChatAttachment } from '../copilot/types'\n\n// Re-export type for consumers who import from this module\nexport type { ChatAttachment }\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nfunction getFileIcon(type: string) {\n if (type.startsWith('image/')) return Image\n if (type === 'application/pdf' || type.startsWith('text/')) return FileText\n return File\n}\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\ninterface FilePreviewChipProps {\n attachment: ChatAttachment\n onRemove: () => void\n /** UI language — used for aria labels */\n language?: 'en' | 'ar'\n}\n\n// ── Component ──────────────────────────────────────────────────────────────────\n\n/**\n * FilePreviewChip\n *\n * Compact chip showing an attached file with a remove button.\n * Image files show a thumbnail; others show a type icon.\n *\n * AuthImage dep removed — uses a plain <img> which is fine inside the design\n * system (no Next.js Image optimisation needed here).\n */\nconst FilePreviewChip = ({ attachment, onRemove, language = 'en' }: FilePreviewChipProps) => {\n const Icon = getFileIcon(attachment.type)\n const isImage = attachment.type.startsWith('image/')\n const previewSrc = attachment.data || attachment.url || ''\n\n return (\n <div className=\"inline-flex items-center gap-1.5 px-2 py-1 bg-muted border border-border rounded-lg text-xs max-w-[180px] group\">\n {isImage ? (\n // eslint-disable-next-line @next/next/no-img-element, jsx-a11y/alt-text\n <img src={previewSrc} alt={attachment.name} className=\"w-5 h-5 rounded object-cover shrink-0\" />\n ) : (\n <Icon className=\"w-3.5 h-3.5 text-muted-foreground shrink-0\" />\n )}\n <span className=\"truncate text-foreground\">{attachment.name}</span>\n <button\n onClick={onRemove}\n className=\"ms-auto shrink-0 p-0.5 rounded hover:bg-destructive/20 text-muted-foreground hover:text-destructive transition-colors duration-fast ease-standard\"\n aria-label={language === 'ar' ? 'إزالة' : 'Remove'}\n >\n <X className=\"w-3 h-3\" />\n </button>\n </div>\n )\n}\n\nFilePreviewChip.displayName = 'FilePreviewChip'\n\nexport default FilePreviewChip","'use client'\n\nimport React, { useState, useCallback } from 'react'\nimport { Scale, Plus, X, Check } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { Checkbox } from '../ui/checkbox'\nimport { Input } from '../ui/input'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/select'\nimport type { ComparisonFactor, CompareFactorsData } from '../copilot/types'\n\n// Re-export types for consumers\nexport type { ComparisonFactor, CompareFactorsData }\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\ninterface CompareFactorsCardProps {\n data: CompareFactorsData\n onAccept: (factors: ComparisonFactor[]) => void\n disabled?: boolean\n /** UI language. Defaults to 'en'. */\n language?: 'en' | 'ar'\n}\n\n// ── Component ──────────────────────────────────────────────────────────────────\n\n/**\n * CompareFactorsCard\n *\n * Renders an editable list of comparison factors. The user can enable/disable\n * factors, change their weight, add custom factors, and confirm the selection.\n *\n * All app deps removed — language is a plain prop.\n */\nconst CompareFactorsCard = ({\n data,\n onAccept,\n disabled = false,\n language = 'en',\n}: CompareFactorsCardProps) => {\n const isAR = language === 'ar'\n const [factors, setFactors] = useState<ComparisonFactor[]>(data.factors)\n const [newFactorLabel, setNewFactorLabel] = useState('')\n const [showAddInput, setShowAddInput] = useState(false)\n\n const toggleFactor = useCallback((id: string) => {\n if (disabled) return\n setFactors(prev => prev.map(f => f.id === id ? { ...f, enabled: !f.enabled } : f))\n }, [disabled])\n\n const updateWeight = useCallback((id: string, weight: 'high' | 'medium' | 'low') => {\n if (disabled) return\n setFactors(prev => prev.map(f => f.id === id ? { ...f, weight } : f))\n }, [disabled])\n\n const removeFactor = useCallback((id: string) => {\n if (disabled) return\n setFactors(prev => prev.filter(f => f.id !== id))\n }, [disabled])\n\n const addCustomFactor = useCallback(() => {\n if (!newFactorLabel.trim() || disabled) return\n const id = `custom-${Date.now()}`\n setFactors(prev => [...prev, {\n id,\n label: newFactorLabel.trim(),\n description: 'Custom factor',\n weight: 'medium',\n enabled: true,\n }])\n setNewFactorLabel('')\n setShowAddInput(false)\n }, [newFactorLabel, disabled])\n\n const weightLabel = (w: string) => {\n const labels: Record<string, { en: string; ar: string }> = {\n high: { en: 'High', ar: 'عالي' },\n medium: { en: 'Medium', ar: 'متوسط' },\n low: { en: 'Low', ar: 'منخفض' },\n }\n return (labels[w]?.[isAR ? 'ar' : 'en']) || w\n }\n\n const enabledCount = factors.filter(f => f.enabled).length\n\n return (\n <div className={`mt-3 rounded-lg border border-border bg-card/80 overflow-hidden ${disabled ? 'opacity-60 pointer-events-none' : ''}`}>\n {/* Header */}\n <div className=\"px-3 py-2.5 bg-muted/50 border-b border-border flex items-center gap-2\">\n <Scale className=\"w-4 h-4 text-primary shrink-0\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs font-semibold text-foreground truncate\">\n {data.subjectA.title} <span className=\"text-muted-foreground font-normal\">vs</span> {data.subjectB.title}\n </p>\n <p className=\"text-[10px] text-muted-foreground\">\n {isAR ? `${enabledCount} عامل محدد` : `${enabledCount} factors selected`}\n </p>\n </div>\n {disabled && <Check className=\"w-4 h-4 text-emerald-500 shrink-0\" />}\n </div>\n\n {/* Factor list */}\n <div className=\"divide-y divide-border/50\">\n {factors.map(factor => (\n <div key={factor.id} className=\"px-3 py-2 flex items-center gap-2 hover:bg-muted/30 transition-colors duration-fast ease-standard\">\n <Checkbox\n checked={factor.enabled}\n onCheckedChange={() => toggleFactor(factor.id)}\n className=\"shrink-0\"\n />\n <div className=\"flex-1 min-w-0\">\n <p className={`text-xs font-medium ${factor.enabled ? 'text-foreground' : 'text-muted-foreground line-through'}`}>\n {factor.label}\n </p>\n {factor.description && factor.description !== 'Custom factor' && (\n <p className=\"text-[10px] text-muted-foreground truncate\">{factor.description}</p>\n )}\n </div>\n <Select\n value={factor.weight}\n onValueChange={(v) => updateWeight(factor.id, v as 'high' | 'medium' | 'low')}\n >\n <SelectTrigger className=\"h-6 w-[80px] text-[10px] border-border/50\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"high\" className=\"text-xs\">{weightLabel('high')}</SelectItem>\n <SelectItem value=\"medium\" className=\"text-xs\">{weightLabel('medium')}</SelectItem>\n <SelectItem value=\"low\" className=\"text-xs\">{weightLabel('low')}</SelectItem>\n </SelectContent>\n </Select>\n {factor.id.startsWith('custom-') && (\n <button\n onClick={() => removeFactor(factor.id)}\n className=\"text-muted-foreground hover:text-destructive transition-colors duration-fast ease-standard\"\n aria-label={isAR ? 'إزالة' : 'Remove'}\n >\n <X className=\"w-3 h-3\" />\n </button>\n )}\n </div>\n ))}\n </div>\n\n {/* Add custom factor */}\n <div className=\"px-3 py-2 border-t border-border/50\">\n {showAddInput ? (\n <div className=\"flex items-center gap-2\">\n <Input\n value={newFactorLabel}\n onChange={(e) => setNewFactorLabel(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') addCustomFactor()\n if (e.key === 'Escape') setShowAddInput(false)\n }}\n placeholder={isAR ? 'اسم العامل...' : 'Factor name...'}\n className=\"h-7 text-xs flex-1\"\n autoFocus\n />\n <Button size=\"sm\" variant=\"ghost\" className=\"h-7 px-2\" onClick={addCustomFactor}>\n <Check className=\"w-3 h-3\" />\n </Button>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n className=\"h-7 px-2\"\n onClick={() => { setShowAddInput(false); setNewFactorLabel('') }}\n >\n <X className=\"w-3 h-3\" />\n </Button>\n </div>\n ) : (\n <button\n onClick={() => setShowAddInput(true)}\n className=\"flex items-center gap-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors duration-fast ease-standard\"\n >\n <Plus className=\"w-3 h-3\" />\n {isAR ? 'إضافة عامل مخصص' : 'Add custom factor'}\n </button>\n )}\n </div>\n\n {/* Accept button */}\n {!disabled && (\n <div className=\"px-3 py-2.5 border-t border-border bg-muted/30\">\n <Button\n size=\"sm\"\n className=\"w-full h-8 text-xs gap-1.5\"\n onClick={() => onAccept(factors)}\n disabled={enabledCount === 0}\n >\n <Scale className=\"w-3.5 h-3.5\" />\n {isAR ? 'قبول وتشغيل المقارنة' : 'Accept & Run Comparison'}\n </Button>\n </div>\n )}\n </div>\n )\n}\n\nCompareFactorsCard.displayName = 'CompareFactorsCard'\n\nexport default CompareFactorsCard","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport {\n Globe, AlertTriangle, TrendingUp, BookOpen, Calendar,\n ChevronRight, Shield, Building2, User as UserIcon,\n ArrowUpRight, ArrowDownRight, ArrowRight,\n} from 'lucide-react'\nimport { cn } from '../../lib/utils'\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\ninterface StructuredEntity {\n slug?: string\n name?: string\n name_en?: string\n name_ar?: string\n type?: string\n}\n\ninterface StructuredAlert {\n slug?: string\n severity?: 'high' | 'medium' | 'low'\n title_en?: string\n title_ar?: string\n description_en?: string\n description_ar?: string\n}\n\ninterface StructuredNarrative {\n slug?: string\n title_en?: string\n title_ar?: string\n dominant_narratives?: string\n}\n\ninterface StructuredEvent {\n slug?: string\n title_en?: string\n title_ar?: string\n}\n\ninterface StructuredTheme {\n name_en?: string\n name_ar?: string\n trend?: 'rising' | 'declining' | 'stable' | string\n}\n\nexport interface StructuredData {\n entities?: StructuredEntity[]\n alerts?: StructuredAlert[]\n narratives?: StructuredNarrative[]\n events?: StructuredEvent[]\n themes?: StructuredTheme[]\n briefing?: string\n relationships?: unknown[]\n new_emerging_entities?: StructuredEntity[]\n sentiment_analysis?: unknown\n}\n\n// ── Seam: slug validation ──────────────────────────────────────────────────────\n//\n// The original ChatStructuredData in sentra-next calls bridge.get() to check\n// which slugs actually exist in the DB before rendering clickable links.\n// In the design-system package we cannot import the bridge. Instead, the\n// consumer passes an optional `onCheckSlugs` callback. If not provided, all\n// slugs are assumed valid (Storybook / standalone mode).\n//\n// Sentra product usage:\n//\n// import { bridge } from '@/lib/bridge-client'\n// const checkSlugs: SlugChecker = async (table, slugs) => {\n// const joined = slugs.join(',')\n// const rows = await bridge.get<{ slug: string }[]>(\n// `/api/pg/${table}?slug=in.(${joined})&select=slug`\n// )\n// return rows.map(r => r.slug)\n// }\n// <ChatStructuredData data={data} onCheckSlugs={checkSlugs} />\n//\nexport type SlugChecker = (\n table: 'entities' | 'alerts' | 'narratives' | 'events',\n slugs: string[],\n) => Promise<string[]>\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\n/** Try to parse a JSON code-block string into StructuredData. */\nfunction tryParseStructured(json: string): StructuredData | null {\n try {\n const obj = JSON.parse(json)\n if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) return null\n const knownKeys = ['entities', 'alerts', 'narratives', 'events', 'themes', 'briefing', 'relationships', 'new_emerging_entities', 'sentiment_analysis']\n if (!knownKeys.some(k => k in obj)) return null\n return obj as StructuredData\n } catch {\n return null\n }\n}\n\n/** Extract all ```json code blocks from markdown and merge their structured data. */\nexport function extractStructuredBlocks(content: string): {\n markdown: string\n structured: StructuredData | null\n} {\n const jsonBlockRegex = /```json\\s*\\n([\\s\\S]*?)```/g\n const blocks: StructuredData[] = []\n let cleaned = content\n\n const matches: { full: string; body: string }[] = []\n let match: RegExpExecArray | null\n while ((match = jsonBlockRegex.exec(content)) !== null) {\n matches.push({ full: match[0], body: match[1] })\n }\n\n for (const m of matches) {\n const parsed = tryParseStructured(m.body.trim())\n if (parsed) {\n blocks.push(parsed)\n cleaned = cleaned.replace(m.full, '')\n }\n }\n\n if (blocks.length === 0) return { markdown: content, structured: null }\n\n const merged: StructuredData = {}\n for (const b of blocks) {\n if (b.entities?.length) merged.entities = [...(merged.entities || []), ...b.entities]\n if (b.alerts?.length) merged.alerts = [...(merged.alerts || []), ...b.alerts]\n if (b.narratives?.length) merged.narratives = [...(merged.narratives || []), ...b.narratives]\n if (b.events?.length) merged.events = [...(merged.events || []), ...b.events]\n if (b.themes?.length) merged.themes = [...(merged.themes || []), ...b.themes]\n if (b.new_emerging_entities?.length) merged.entities = [...(merged.entities || []), ...b.new_emerging_entities]\n if (b.briefing && !merged.briefing) merged.briefing = b.briefing\n }\n\n if (merged.entities) {\n const seen = new Set<string>()\n merged.entities = merged.entities.filter(e => {\n const key = e.slug || e.name_en || e.name || ''\n if (!key || seen.has(key)) return false\n seen.add(key)\n return true\n })\n }\n\n return { markdown: cleaned.trim(), structured: merged }\n}\n\n// ── Entity / severity configs ─────────────────────────────────────────────────\n\nconst ENTITY_TYPE_CONFIG: Record<string, { icon: React.ComponentType<{ className?: string }>; color: string }> = {\n government: { icon: Shield, color: 'bg-blue-500/15 text-blue-400 border-blue-500/20' },\n institution: { icon: Building2, color: 'bg-emerald-500/15 text-emerald-400 border-emerald-500/20' },\n individual: { icon: UserIcon, color: 'bg-violet-500/15 text-violet-400 border-violet-500/20' },\n media: { icon: Globe, color: 'bg-amber-500/15 text-amber-400 border-amber-500/20' },\n}\n\nconst SEVERITY_CONFIG: Record<string, { color: string; bg: string }> = {\n high: { color: 'text-red-400', bg: 'bg-red-500/10 border-red-500/20' },\n medium: { color: 'text-amber-400', bg: 'bg-amber-500/10 border-amber-500/20' },\n low: { color: 'text-blue-400', bg: 'bg-blue-500/10 border-blue-500/20' },\n}\n\nconst TREND_ICON: Record<string, { icon: React.ComponentType<{ className?: string }>; color: string }> = {\n rising: { icon: ArrowUpRight, color: 'text-emerald-400' },\n declining:{ icon: ArrowDownRight, color: 'text-red-400' },\n stable: { icon: ArrowRight, color: 'text-muted-foreground' },\n}\n\n// ── Sub-components ─────────────────────────────────────────────────────────────\n\nconst EntityChip = ({\n entity,\n lang,\n onNavigate,\n}: {\n entity: StructuredEntity\n lang: string\n onNavigate?: (path: string) => void\n}) => {\n const name = lang === 'ar'\n ? (entity.name_ar || entity.name_en || entity.name || '?')\n : (entity.name_en || entity.name || entity.name_ar || '?')\n const slug = entity.slug\n const typeConf = ENTITY_TYPE_CONFIG[entity.type || ''] || ENTITY_TYPE_CONFIG.institution\n const Icon = typeConf.icon\n\n const handleClick = () => {\n if (slug && onNavigate) onNavigate(`/entity/${slug}`)\n }\n\n return (\n <button\n onClick={handleClick}\n disabled={!slug || !onNavigate}\n className={cn(\n 'inline-flex items-center gap-1.5 px-2.5 py-1 rounded-lg border text-xs font-medium transition-all duration-fast ease-standard focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n typeConf.color,\n slug && onNavigate ? 'cursor-pointer hover:brightness-125' : 'cursor-default opacity-70',\n )}\n >\n <Icon className=\"w-3 h-3 shrink-0\" />\n <span className=\"truncate max-w-[140px]\">{name}</span>\n {slug && onNavigate && <ChevronRight className=\"w-3 h-3 shrink-0 opacity-50 rtl:rotate-180\" />}\n </button>\n )\n}\nEntityChip.displayName = 'EntityChip'\n\nconst AlertCard = ({\n alert,\n lang,\n onNavigate,\n}: {\n alert: StructuredAlert\n lang: string\n onNavigate?: (path: string) => void\n}) => {\n const title = lang === 'ar'\n ? (alert.title_ar || alert.title_en || '')\n : (alert.title_en || alert.title_ar || '')\n const desc = lang === 'ar'\n ? (alert.description_ar || alert.description_en || '')\n : (alert.description_en || alert.description_ar || '')\n const sev = SEVERITY_CONFIG[alert.severity || 'low'] || SEVERITY_CONFIG.low\n\n return (\n <button\n onClick={() => alert.slug && onNavigate?.(`/alert/${alert.slug}`)}\n disabled={!alert.slug || !onNavigate}\n className={cn(\n 'w-full text-start rounded-lg border p-2.5 transition-all duration-fast ease-standard group',\n sev.bg,\n alert.slug && onNavigate ? 'cursor-pointer hover:brightness-110' : 'cursor-default',\n )}\n >\n <div className=\"flex items-start gap-2\">\n <AlertTriangle className={cn('w-3.5 h-3.5 shrink-0 mt-0.5', sev.color)} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className={cn('text-[10px] font-semibold uppercase tracking-wider', sev.color)}>\n {alert.severity}\n </span>\n </div>\n <p className=\"text-xs font-medium text-foreground mt-0.5 line-clamp-2\">{title}</p>\n {desc && <p className=\"text-[11px] text-muted-foreground mt-1 line-clamp-2\">{desc}</p>}\n </div>\n </div>\n </button>\n )\n}\nAlertCard.displayName = 'AlertCard'\n\nconst NarrativeCard = ({\n narrative,\n lang,\n onNavigate,\n}: {\n narrative: StructuredNarrative\n lang: string\n onNavigate?: (path: string) => void\n}) => {\n const title = lang === 'ar'\n ? (narrative.title_ar || narrative.title_en || narrative.dominant_narratives || '')\n : (narrative.title_en || narrative.dominant_narratives || narrative.title_ar || '')\n const slug = narrative.slug\n\n return (\n <button\n onClick={() => slug && onNavigate?.(`/narrative/${slug}`)}\n className={cn(\n 'w-full text-start rounded-lg border border-amber-500/20 bg-amber-500/5 p-2.5 transition-all duration-fast ease-standard group',\n 'cursor-pointer hover:bg-amber-500/10',\n )}\n >\n <div className=\"flex items-start gap-2\">\n <BookOpen className=\"w-3.5 h-3.5 text-amber-400 shrink-0 mt-0.5\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-xs font-medium text-foreground line-clamp-2\">{title}</p>\n </div>\n <ChevronRight className=\"w-3.5 h-3.5 text-amber-400/50 shrink-0 mt-0.5 opacity-0 group-hover:opacity-100 transition-opacity duration-fast ease-standard rtl:rotate-180\" />\n </div>\n </button>\n )\n}\nNarrativeCard.displayName = 'NarrativeCard'\n\nconst EventChip = ({\n event,\n lang,\n onNavigate,\n}: {\n event: StructuredEvent\n lang: string\n onNavigate?: (path: string) => void\n}) => {\n const title = lang === 'ar'\n ? (event.title_ar || event.title_en || '')\n : (event.title_en || event.title_ar || '')\n const slug = event.slug\n\n return (\n <button\n onClick={() => slug && onNavigate?.(`/event/${slug}`)}\n disabled={!slug || !onNavigate}\n className={cn(\n 'inline-flex items-center gap-1.5 px-2.5 py-1 rounded-lg border border-purple-500/20 bg-purple-500/10 text-purple-400 text-xs font-medium transition-all duration-fast ease-standard',\n slug && onNavigate ? 'cursor-pointer hover:brightness-125' : 'cursor-default',\n )}\n >\n <Calendar className=\"w-3 h-3 shrink-0\" />\n <span className=\"truncate max-w-[200px]\">{title}</span>\n {slug && onNavigate && <ChevronRight className=\"w-3 h-3 shrink-0 opacity-50 rtl:rotate-180\" />}\n </button>\n )\n}\nEventChip.displayName = 'EventChip'\n\nconst ThemeChip = ({ theme, lang }: { theme: StructuredTheme; lang: string }) => {\n const name = lang === 'ar'\n ? (theme.name_ar || theme.name_en || '')\n : (theme.name_en || theme.name_ar || '')\n const trendConf = TREND_ICON[theme.trend || 'stable'] || TREND_ICON.stable\n const TrendIcon = trendConf.icon\n\n return (\n <span className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-lg border border-border bg-muted/50 text-xs font-medium text-foreground\">\n <TrendIcon className={cn('w-3 h-3 shrink-0', trendConf.color)} />\n <span className=\"truncate max-w-[180px]\">{name}</span>\n </span>\n )\n}\nThemeChip.displayName = 'ThemeChip'\n\n// ── Slug validation (injected seam) ───────────────────────────────────────────\n\nfunction useExistingSlugs(data: StructuredData, onCheckSlugs?: SlugChecker) {\n const [existing, setExisting] = useState<Set<string>>(new Set())\n\n useEffect(() => {\n if (!onCheckSlugs) {\n // No checker provided — assume all slugs valid (standalone/Storybook mode)\n const all = new Set<string>()\n ;(data.entities || []).forEach(e => { if (e.slug) all.add(`entities:${e.slug}`) })\n ;(data.alerts || []).forEach(a => { if (a.slug) all.add(`alerts:${a.slug}`) })\n ;(data.narratives || []).forEach(n => { if (n.slug) all.add(`narratives:${n.slug}`) })\n ;(data.events || []).forEach(e => { if (e.slug) all.add(`events:${e.slug}`) })\n setExisting(all)\n return\n }\n\n const checks: { table: 'entities' | 'alerts' | 'narratives' | 'events'; slugs: string[] }[] = []\n\n const entitySlugs = (data.entities || []).map(e => e.slug).filter(Boolean) as string[]\n if (entitySlugs.length) checks.push({ table: 'entities', slugs: entitySlugs })\n\n const alertSlugs = (data.alerts || []).map(a => a.slug).filter(Boolean) as string[]\n if (alertSlugs.length) checks.push({ table: 'alerts', slugs: alertSlugs })\n\n const narrativeSlugs = (data.narratives || []).map(n => n.slug).filter(Boolean) as string[]\n if (narrativeSlugs.length) checks.push({ table: 'narratives', slugs: narrativeSlugs })\n\n const eventSlugs = (data.events || []).map(e => e.slug).filter(Boolean) as string[]\n if (eventSlugs.length) checks.push({ table: 'events', slugs: eventSlugs })\n\n if (checks.length === 0) return\n\n let cancelled = false\n\n Promise.all(\n checks.map(async ({ table, slugs }) => {\n const found = await onCheckSlugs(table, slugs).catch(() => [] as string[])\n return found.map(slug => `${table}:${slug}`)\n }),\n ).then(results => {\n if (cancelled) return\n setExisting(new Set(results.flat()))\n })\n\n return () => { cancelled = true }\n }, [data, onCheckSlugs])\n\n return existing\n}\n\n// ── Main component ─────────────────────────────────────────────────────────────\n\ninterface ChatStructuredDataProps {\n data: StructuredData\n /** UI language. Defaults to 'en'. */\n language?: 'en' | 'ar'\n /** Text direction. Inferred from language when not provided. */\n dir?: 'ltr' | 'rtl'\n /**\n * Navigation callback. When provided, entity/alert/narrative/event chips\n * become clickable and call this with the target path (e.g. '/entity/slug').\n * The product wires this to router.push (Next.js) or window.location.\n */\n onNavigate?: (path: string) => void\n /**\n * Optional: batch-check which slugs actually exist in the DB.\n * When omitted, all slugs are assumed valid (safe for Storybook/standalone).\n */\n onCheckSlugs?: SlugChecker\n}\n\nconst ChatStructuredData = ({\n data,\n language = 'en',\n dir,\n onNavigate,\n onCheckSlugs,\n}: ChatStructuredDataProps) => {\n const lang = language\n const isRTL = lang === 'ar'\n const resolvedDir = dir ?? (isRTL ? 'rtl' : 'ltr')\n const existingSlugs = useExistingSlugs(data, onCheckSlugs)\n\n const validEntities = (data.entities || []).filter(e => e.slug && existingSlugs.has(`entities:${e.slug}`))\n const validAlerts = (data.alerts || []).filter(a => a.slug && existingSlugs.has(`alerts:${a.slug}`))\n const validNarratives= (data.narratives|| []).filter(n => n.slug && existingSlugs.has(`narratives:${n.slug}`))\n const validEvents = (data.events || []).filter(e => e.slug && existingSlugs.has(`events:${e.slug}`))\n const themes = data.themes || []\n\n const hasEntities = validEntities.length > 0\n const hasAlerts = validAlerts.length > 0\n const hasNarratives = validNarratives.length > 0\n const hasEvents = validEvents.length > 0\n const hasThemes = themes.length > 0\n\n if (!hasEntities && !hasAlerts && !hasNarratives && !hasEvents && !hasThemes) return null\n\n return (\n <div className=\"mt-3 space-y-3 not-prose\" dir={resolvedDir}>\n {hasEntities && (\n <div>\n <div className=\"flex items-center gap-1.5 mb-2\">\n <Globe className=\"w-3.5 h-3.5 text-emerald-400\" />\n <span className=\"text-[11px] font-semibold text-muted-foreground uppercase tracking-wider\">\n {isRTL ? 'الجهات المذكورة' : 'Mentioned Entities'}\n </span>\n </div>\n <div className=\"flex flex-wrap gap-1.5\">\n {validEntities.map((e, i) => (\n <EntityChip key={e.slug || i} entity={e} lang={lang} onNavigate={onNavigate} />\n ))}\n </div>\n </div>\n )}\n\n {hasAlerts && (\n <div>\n <div className=\"flex items-center gap-1.5 mb-2\">\n <AlertTriangle className=\"w-3.5 h-3.5 text-red-400\" />\n <span className=\"text-[11px] font-semibold text-muted-foreground uppercase tracking-wider\">\n {isRTL ? 'إشارات' : 'Alerts'}\n </span>\n </div>\n <div className=\"space-y-1.5\">\n {validAlerts.map((a, i) => (\n <AlertCard key={a.slug || i} alert={a} lang={lang} onNavigate={onNavigate} />\n ))}\n </div>\n </div>\n )}\n\n {hasNarratives && (\n <div>\n <div className=\"flex items-center gap-1.5 mb-2\">\n <BookOpen className=\"w-3.5 h-3.5 text-amber-400\" />\n <span className=\"text-[11px] font-semibold text-muted-foreground uppercase tracking-wider\">\n {isRTL ? 'السرديات' : 'Narratives'}\n </span>\n </div>\n <div className=\"space-y-1.5\">\n {validNarratives.map((n, i) => (\n <NarrativeCard key={i} narrative={n} lang={lang} onNavigate={onNavigate} />\n ))}\n </div>\n </div>\n )}\n\n {hasEvents && (\n <div>\n <div className=\"flex items-center gap-1.5 mb-2\">\n <Calendar className=\"w-3.5 h-3.5 text-purple-400\" />\n <span className=\"text-[11px] font-semibold text-muted-foreground uppercase tracking-wider\">\n {isRTL ? 'الأحداث' : 'Events'}\n </span>\n </div>\n <div className=\"flex flex-wrap gap-1.5\">\n {validEvents.map((e, i) => (\n <EventChip key={e.slug || i} event={e} lang={lang} onNavigate={onNavigate} />\n ))}\n </div>\n </div>\n )}\n\n {hasThemes && (\n <div>\n <div className=\"flex items-center gap-1.5 mb-2\">\n <TrendingUp className=\"w-3.5 h-3.5 text-foreground/60\" />\n <span className=\"text-[11px] font-semibold text-muted-foreground uppercase tracking-wider\">\n {isRTL ? 'المواضيع' : 'Themes'}\n </span>\n </div>\n <div className=\"flex flex-wrap gap-1.5\">\n {themes.map((th, i) => (\n <ThemeChip key={i} theme={th} lang={lang} />\n ))}\n </div>\n </div>\n )}\n </div>\n )\n}\nChatStructuredData.displayName = 'ChatStructuredData'\n\nexport default ChatStructuredData","'use client'\n\n/**\n * CopilotLauncher — @prism/ui F3\n *\n * A composable button that calls useCopilot().open(). Two variants:\n *\n * variant=\"fab\" — floating action button (fixed bottom-right, z-40).\n * Good for apps without a header slot.\n * variant=\"header\" — compact icon+label button for embedding in AppHeader's\n * right cluster or any nav bar.\n *\n * Bilingual label from the shared 'nav:copilot' key (EN: \"Copilot\", AR: \"المساعد الذكي\").\n * Language follows the shared LanguageProvider context automatically.\n *\n * Rules: Rule 7 (displayName, handle* events), Rule 8 (bilingual),\n * Rule 16 (Sentra style — Tailwind tokens only).\n */\n\nimport React from 'react'\nimport { Sparkles } from 'lucide-react'\nimport { Button } from '../ui/button'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../ui/tooltip'\nimport { useCopilot } from './CopilotProvider'\nimport { useT as _useT } from '../../i18n/LanguageProvider'\nimport { cn } from '../../lib/utils'\n\n// Safely try the shared language context — won't throw when LanguageProvider\n// is absent (Storybook, isolated renders).\nfunction useSafeT(): ReturnType<typeof _useT> | null {\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return _useT()\n } catch {\n return null\n }\n}\n\n// ── Props ─────────────────────────────────────────────────────────────────────\n\nexport interface CopilotLauncherProps {\n /**\n * \"fab\" — floating action button (position: fixed, bottom-right).\n * \"header\" — compact icon+label for embedding in a top-nav cluster.\n * Default: \"header\".\n */\n variant?: 'fab' | 'header'\n\n /** Additional Tailwind classes */\n className?: string\n\n /**\n * Override label (skips the i18n lookup). Useful when the consuming app\n * has its own translation layer and wants to pass a pre-resolved string.\n */\n label?: string\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nconst CopilotLauncher = ({\n variant = 'header',\n className,\n label,\n}: CopilotLauncherProps) => {\n const { open, isOpen } = useCopilot()\n const ctx = useSafeT()\n const language: 'en' | 'ar' = ctx?.language ?? 'en'\n const t = ctx?.t ?? ((key: string) => key)\n\n const resolvedLabel = label ?? t('nav:copilot')\n\n const handleClick = () => {\n open()\n }\n\n if (variant === 'fab') {\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={handleClick}\n aria-label={resolvedLabel}\n data-testid=\"copilot-launcher-fab\"\n className={cn(\n 'fixed bottom-20 end-4 z-40',\n 'h-12 w-12 rounded-full',\n 'bg-primary text-primary-foreground shadow-lg',\n 'flex items-center justify-center',\n 'hover:bg-primary/90 transition-colors duration-fast ease-standard',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n isOpen && 'ring-2 ring-primary/30',\n className,\n )}\n >\n <Sparkles className=\"h-5 w-5\" aria-hidden=\"true\" />\n </button>\n </TooltipTrigger>\n <TooltipContent\n side={language === 'ar' ? 'left' : 'right'}\n className=\"text-xs\"\n >\n {resolvedLabel}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )\n }\n\n // header variant\n return (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleClick}\n aria-label={resolvedLabel}\n aria-pressed={isOpen}\n data-testid=\"copilot-launcher-header\"\n className={cn(\n 'flex items-center gap-1.5 h-8 px-2 text-xs font-medium text-muted-foreground hover:text-foreground',\n isOpen && 'text-primary hover:text-primary',\n className,\n )}\n >\n <Sparkles className=\"h-4 w-4\" aria-hidden=\"true\" />\n <span className=\"hidden sm:inline\">{resolvedLabel}</span>\n </Button>\n )\n}\n\nCopilotLauncher.displayName = 'CopilotLauncher'\n\nexport { CopilotLauncher }\nexport default CopilotLauncher\n","'use client'\n\n/**\n * CopilotSelectionTrigger — smart \"Ask Copilot\" on text selection.\n *\n * Mount this once inside a CopilotProvider. When the user selects text anywhere\n * on the page (or within an optional `boundarySelector` subtree), a small\n * floating \"Ask Copilot\" button appears near the end of the selection. Clicking\n * it opens the copilot dock pre-filled with the selected text (optionally\n * auto-sent).\n *\n * Opt-in: it renders nothing until there's a qualifying selection.\n * Accessible: Escape dismisses; the button is a real <button> with an aria-label.\n * RTL-aware: the bubble offsets toward the selection's leading edge.\n *\n * <CopilotProvider client={client}>\n * …app…\n * <CopilotSelectionTrigger />\n * </CopilotProvider>\n */\n\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { Sparkles } from 'lucide-react'\nimport { useCopilot } from './CopilotProvider'\nimport { useT as _useT } from '../../i18n/LanguageProvider'\nimport { fallbackT } from './copilotStrings'\n\nfunction useSafeT(): ReturnType<typeof _useT> | null {\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return _useT()\n } catch {\n return null\n }\n}\n\nexport interface CopilotSelectionTriggerProps {\n /** Minimum selected character count before the trigger appears. Default 8. */\n minChars?: number\n /** Maximum characters forwarded as the prompt (selection is trimmed). Default 2000. */\n maxChars?: number\n /** Auto-send the prompt on click instead of pre-filling the input. Default false. */\n autoSend?: boolean\n /** Override the button label. Defaults to the i18n \"copilot:askCopilot\". */\n label?: string\n /**\n * Limit the trigger to selections inside this element subtree. Pass a CSS\n * selector (e.g. \"[data-copilot-selectable]\") or an element ref. When omitted,\n * the whole document is selectable.\n */\n boundarySelector?: string\n /**\n * Build the prompt from the selected text. Defaults to a short \"Explain:\"\n * framing in the active language. Return the raw selection to send it as-is.\n */\n getPrompt?: (selectedText: string, language: 'en' | 'ar') => string\n}\n\ninterface Anchor { x: number; y: number; text: string }\n\nconst CopilotSelectionTrigger = ({\n minChars = 8,\n maxChars = 2000,\n autoSend = false,\n label,\n boundarySelector,\n getPrompt,\n}: CopilotSelectionTriggerProps) => {\n const { open } = useCopilot()\n const ctx = useSafeT()\n const language: 'en' | 'ar' = ctx?.language ?? 'en'\n const t = ctx?.t ?? fallbackT\n const isRTL = language === 'ar'\n\n const [anchor, setAnchor] = useState<Anchor | null>(null)\n // Skip the selectionchange that our own button-click clears.\n const dismissedRef = useRef(false)\n\n const withinBoundary = useCallback(\n (node: Node | null): boolean => {\n if (!boundarySelector) return true\n let el: HTMLElement | null =\n node && node.nodeType === Node.ELEMENT_NODE\n ? (node as HTMLElement)\n : node?.parentElement ?? null\n return !!el?.closest(boundarySelector)\n },\n [boundarySelector],\n )\n\n const evaluateSelection = useCallback(() => {\n if (dismissedRef.current) { dismissedRef.current = false; return }\n const sel = typeof window !== 'undefined' ? window.getSelection() : null\n if (!sel || sel.isCollapsed || sel.rangeCount === 0) { setAnchor(null); return }\n const raw = sel.toString().trim()\n if (raw.length < minChars) { setAnchor(null); return }\n const range = sel.getRangeAt(0)\n if (!withinBoundary(range.commonAncestorContainer)) { setAnchor(null); return }\n const rects = range.getClientRects()\n const rect = rects.length ? rects[rects.length - 1] : range.getBoundingClientRect()\n if (!rect || (rect.width === 0 && rect.height === 0)) { setAnchor(null); return }\n // Anchor at the selection's trailing-edge end (RTL → leading/left side).\n const x = isRTL ? rect.left : rect.right\n const y = rect.bottom\n setAnchor({ x, y, text: raw.slice(0, maxChars) })\n }, [minChars, maxChars, withinBoundary, isRTL])\n\n // selectionchange fires continuously while dragging — settle on pointer/key up.\n // setTimeout (not rAF) so it still fires in a hidden/throttled tab, and so the\n // selection has committed before we measure it.\n useEffect(() => {\n const settle = () => window.setTimeout(evaluateSelection, 0)\n const onUp = () => settle()\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { setAnchor(null); return }\n // Shift+Arrow keyboard selection\n if (e.shiftKey || e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n settle()\n }\n }\n const onScroll = () => setAnchor(null)\n document.addEventListener('mouseup', onUp)\n document.addEventListener('keyup', onKey)\n window.addEventListener('scroll', onScroll, true)\n return () => {\n document.removeEventListener('mouseup', onUp)\n document.removeEventListener('keyup', onKey)\n window.removeEventListener('scroll', onScroll, true)\n }\n }, [evaluateSelection])\n\n if (!anchor) return null\n\n const resolvedLabel = label ?? t('copilot:askCopilot')\n const handleAsk = () => {\n const message = getPrompt\n ? getPrompt(anchor.text, language)\n : isRTL\n ? `اشرح ما يلي:\\n\\n\"${anchor.text}\"`\n : `Explain the following:\\n\\n\"${anchor.text}\"`\n dismissedRef.current = true\n setAnchor(null)\n try { window.getSelection()?.removeAllRanges() } catch { /* ignore */ }\n open({ message, autoSend })\n }\n\n // Position the bubble just below the selection. In RTL the button's right\n // edge anchors at the selection's left edge (translateX(-100%)).\n const vw = typeof window !== 'undefined' ? window.innerWidth : 9999\n const vh = typeof window !== 'undefined' ? window.innerHeight : 9999\n const style: React.CSSProperties = {\n position: 'fixed',\n top: Math.min(anchor.y + 6, vh - 44),\n left: Math.max(8, Math.min(anchor.x, vw - 8)),\n transform: isRTL ? 'translateX(-100%)' : undefined,\n zIndex: 60,\n }\n\n return (\n <div style={style} dir={isRTL ? 'rtl' : 'ltr'} data-testid=\"copilot-selection-trigger\">\n <button\n type=\"button\"\n onMouseDown={(e) => e.preventDefault() /* keep the selection alive until click */}\n onClick={handleAsk}\n aria-label={resolvedLabel}\n className=\"inline-flex items-center gap-1.5 h-8 px-3 rounded-full bg-primary text-primary-foreground text-xs font-medium shadow-lg border border-primary/30 hover:bg-primary/90 transition-colors duration-fast ease-standard focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 animate-in fade-in zoom-in-95\"\n >\n <Sparkles className=\"h-3.5 w-3.5\" aria-hidden=\"true\" />\n {resolvedLabel}\n </button>\n </div>\n )\n}\n\nCopilotSelectionTrigger.displayName = 'CopilotSelectionTrigger'\n\nexport { CopilotSelectionTrigger }\nexport default CopilotSelectionTrigger\n","'use client'\n\nimport { useRef, useEffect } from 'react'\nimport { User, Sparkles } from 'lucide-react'\nimport { ScrollArea } from '../ui/scroll-area'\nimport StreamingMessage from './StreamingMessage'\nimport ArtifactViewer from './ArtifactViewer'\nimport { ArtifactRenderer } from './artifacts'\nimport type { CopilotMessage, ArtifactPayload, A2UIArtifact } from './types'\n\n// Re-export types for consumers\nexport type { ArtifactPayload }\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\nexport interface ThreadMessage {\n id: string\n role: 'user' | 'assistant'\n /** English content — always present */\n text_en: string\n /** Arabic content — used when language === 'ar' */\n text_ar?: string\n /** Legacy controller-slug artifacts (ArtifactViewer). */\n artifacts?: ArtifactPayload[]\n /** A2UI structured artifacts from the Cortex SSE stream (table/chart/card/…). */\n a2uiArtifacts?: A2UIArtifact[]\n}\n\ninterface ChatThreadProps {\n messages: ThreadMessage[]\n /** The text currently being accumulated from the SSE stream */\n streamingText?: string\n isStreaming?: boolean\n /** UI language. Defaults to 'en'. */\n language?: 'en' | 'ar'\n /** Text direction. Inferred from language when not provided. */\n dir?: 'ltr' | 'rtl'\n}\n\n// ── Sub-components ─────────────────────────────────────────────────────────────\n\nconst AssistantAvatar = () => (\n <div className=\"w-6 h-6 rounded-md bg-gradient-to-br from-primary to-primary/70 flex items-center justify-center shrink-0 mt-1\">\n <Sparkles className=\"w-3.5 h-3.5 text-primary-foreground\" />\n </div>\n)\nAssistantAvatar.displayName = 'AssistantAvatar'\n\nconst UserAvatar = () => (\n <div className=\"w-6 h-6 rounded-md bg-muted flex items-center justify-center shrink-0 mt-1\">\n <User className=\"w-3.5 h-3.5 text-muted-foreground\" />\n </div>\n)\nUserAvatar.displayName = 'UserAvatar'\n\n// ── Main component ─────────────────────────────────────────────────────────────\n\n/**\n * ChatThread\n *\n * Renders the full conversation history plus an optional live streaming tail.\n * Bilingual: reads `text_ar` when language === 'ar', falls back to `text_en`.\n * RTL-aware: message alignment and avatar order flip for Arabic.\n * Auto-scrolls to the bottom on new messages or streaming token updates.\n *\n * All app deps removed — language/dir are plain props.\n */\nconst ChatThread = ({\n messages,\n streamingText = '',\n isStreaming = false,\n language = 'en',\n dir,\n}: ChatThreadProps) => {\n const isRTL = dir === 'rtl' || (dir === undefined && language === 'ar')\n const bottomRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n bottomRef.current?.scrollIntoView({ behavior: 'smooth' })\n }, [messages.length, streamingText])\n\n const isEmpty = messages.length === 0 && !isStreaming\n\n return (\n <ScrollArea className=\"flex-1 px-4 py-3\">\n <div className=\"space-y-3 min-h-full\" dir={isRTL ? 'rtl' : 'ltr'}>\n {isEmpty && (\n <div className=\"flex flex-col items-center justify-center py-16 gap-3\">\n <div className=\"w-10 h-10 rounded-xl bg-gradient-to-br from-primary to-primary/70 flex items-center justify-center\">\n <Sparkles className=\"w-5 h-5 text-primary-foreground\" />\n </div>\n <p className=\"text-sm text-muted-foreground text-center max-w-xs\">\n {language === 'ar'\n ? 'اسأل المساعد أي سؤال وسيرد بالمعلومات التي تحتاجها'\n : 'Ask the copilot anything — it will answer with the information you need'}\n </p>\n </div>\n )}\n\n {messages.map((msg) => {\n const text = language === 'ar' ? (msg.text_ar || msg.text_en) : msg.text_en\n const isUser = msg.role === 'user'\n\n return (\n <div\n key={msg.id}\n className={`flex gap-2 ${\n isUser\n ? isRTL ? 'justify-start flex-row-reverse' : 'justify-end'\n : isRTL ? 'justify-end flex-row-reverse' : 'justify-start'\n }`}\n >\n {!isUser && !isRTL && <AssistantAvatar />}\n {isUser && isRTL && <UserAvatar />}\n\n <div className=\"max-w-[85%] space-y-1.5\">\n {isUser ? (\n <div className=\"rounded-xl px-3 py-2 bg-primary text-primary-foreground text-sm\">\n {text}\n </div>\n ) : (\n <StreamingMessage text={text} isStreaming={false} language={language} dir={isRTL ? 'rtl' : 'ltr'} />\n )}\n\n {msg.artifacts && msg.artifacts.length > 0 && (\n <div className=\"space-y-2\">\n {msg.artifacts.map((artifact, idx) => (\n <ArtifactViewer\n key={`${msg.id}-artifact-${idx}`}\n artifact={artifact}\n language={language}\n dir={isRTL ? 'rtl' : 'ltr'}\n />\n ))}\n </div>\n )}\n\n {/* A2UI structured artifacts from the Cortex SSE stream (table/chart/card/…) */}\n {msg.a2uiArtifacts && msg.a2uiArtifacts.length > 0 && (\n <div className=\"space-y-2\">\n {msg.a2uiArtifacts.map((artifact, idx) => (\n <ArtifactRenderer\n key={`${msg.id}-a2ui-${idx}`}\n artifact={artifact}\n language={language}\n dir={isRTL ? 'rtl' : 'ltr'}\n />\n ))}\n </div>\n )}\n </div>\n\n {!isUser && isRTL && <AssistantAvatar />}\n {isUser && !isRTL && <UserAvatar />}\n </div>\n )\n })}\n\n {(isStreaming || streamingText) && (\n <div className={`flex gap-2 ${isRTL ? 'justify-end flex-row-reverse' : 'justify-start'}`}>\n {!isRTL && <AssistantAvatar />}\n <div className=\"max-w-[85%]\">\n <StreamingMessage\n text={streamingText}\n isStreaming={isStreaming}\n language={language}\n dir={isRTL ? 'rtl' : 'ltr'}\n />\n </div>\n {isRTL && <AssistantAvatar />}\n </div>\n )}\n\n <div ref={bottomRef} />\n </div>\n </ScrollArea>\n )\n}\n\nChatThread.displayName = 'ChatThread'\n\nexport default ChatThread\n\n// ── Utility: convert CopilotMessage[] → ThreadMessage[] ───────────────────────\n\nlet _msgCounter = 0\nexport function toThreadMessages(messages: CopilotMessage[]): ThreadMessage[] {\n return messages.map((m) => ({\n id: `msg-${_msgCounter++}`,\n role: m.role,\n text_en: m.content,\n text_ar: m.content_ar,\n artifacts: m.artifacts,\n a2uiArtifacts: m.a2uiArtifacts,\n }))\n}","'use client'\n\nimport { Loader2, Sparkles } from 'lucide-react'\nimport MarkdownContent from '../chat/MarkdownContent'\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\ninterface StreamingMessageProps {\n text: string\n isStreaming: boolean\n /** UI language. Defaults to 'en'. */\n language?: 'en' | 'ar'\n /** Text direction. Inferred from language when not provided. */\n dir?: 'ltr' | 'rtl'\n}\n\n// ── Component ──────────────────────────────────────────────────────────────────\n\n/**\n * StreamingMessage\n *\n * Renders an assistant message that may still be receiving SSE token deltas.\n * While streaming, shows a pulsing cursor at the end.\n * Content renders as markdown via the shared MarkdownContent primitive\n * (GFM, skipHtml, links in new tab, RTL-safe logical padding).\n *\n * All app deps removed — language/dir are plain props.\n */\nconst StreamingMessage = ({ text, isStreaming, language = 'en', dir }: StreamingMessageProps) => {\n const isAR = language === 'ar'\n const resolvedDir = dir ?? (isAR ? 'rtl' : 'ltr')\n\n if (!text && isStreaming) {\n return (\n <div className=\"flex items-center gap-2 px-3 py-2 bg-muted rounded-xl border border-border\">\n <Loader2 className=\"w-3.5 h-3.5 animate-spin text-muted-foreground shrink-0\" />\n <span className=\"text-xs text-muted-foreground animate-pulse\">\n {isAR ? 'جارٍ التفكير...' : 'Thinking...'}\n </span>\n </div>\n )\n }\n\n return (\n <div\n className=\"bg-muted rounded-xl px-3 py-2 border border-border text-sm text-foreground\"\n dir={resolvedDir}\n >\n <MarkdownContent content={text} dir={resolvedDir} className=\"max-w-none\" />\n {isStreaming && (\n <span className=\"inline-block w-1.5 h-3.5 bg-primary animate-pulse rounded-sm ms-0.5 align-middle\" />\n )}\n </div>\n )\n}\n\nStreamingMessage.displayName = 'StreamingMessage'\n\nexport default StreamingMessage\n\n// ── Spinner shown while the bridge sends the first byte ──────────────────────\n\ninterface StreamingSpinnerProps {\n language?: 'en' | 'ar'\n}\n\nexport const StreamingSpinner = ({ language = 'en' }: StreamingSpinnerProps) => {\n return (\n <div className=\"flex gap-2 items-start\">\n <div className=\"w-6 h-6 rounded-md bg-gradient-to-br from-primary to-primary/70 flex items-center justify-center shrink-0 mt-0.5\">\n <Sparkles className=\"w-3.5 h-3.5 text-primary-foreground\" />\n </div>\n <div className=\"bg-muted rounded-xl px-3 py-2 border border-border\">\n <span className=\"text-xs text-muted-foreground animate-pulse\">\n {language === 'ar' ? 'جارٍ التحميل...' : 'Loading...'}\n </span>\n </div>\n </div>\n )\n}\n\nStreamingSpinner.displayName = 'StreamingSpinner'\n","'use client'\n\nimport type { ArtifactPayload } from './types'\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\ninterface ArtifactViewerProps {\n artifact: ArtifactPayload\n /** UI language. Defaults to 'en'. */\n language?: 'en' | 'ar'\n /** Text direction. Inferred from language when not provided. */\n dir?: 'ltr' | 'rtl'\n}\n\n// ── Individual renderers ───────────────────────────────────────────────────────\n\nconst MapOfEventsArtifact = ({ data, language = 'en' }: { data: unknown; language?: string }) => (\n <div className=\"rounded-lg border border-border bg-muted/40 p-3\">\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">\n {language === 'ar' ? 'خريطة الأحداث' : 'Map of Events'}\n </p>\n <pre className=\"text-xs text-foreground/80 overflow-auto max-h-48 whitespace-pre-wrap break-all\">\n {JSON.stringify(data, null, 2)}\n </pre>\n </div>\n)\nMapOfEventsArtifact.displayName = 'MapOfEventsArtifact'\n\nconst TimelineArtifact = ({ data, language = 'en' }: { data: unknown; language?: string }) => (\n <div className=\"rounded-lg border border-border bg-muted/40 p-3\">\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">\n {language === 'ar' ? 'الجدول الزمني' : 'Timeline'}\n </p>\n <pre className=\"text-xs text-foreground/80 overflow-auto max-h-48 whitespace-pre-wrap break-all\">\n {JSON.stringify(data, null, 2)}\n </pre>\n </div>\n)\nTimelineArtifact.displayName = 'TimelineArtifact'\n\nconst NetworkGraphArtifact = ({ data, language = 'en' }: { data: unknown; language?: string }) => (\n <div className=\"rounded-lg border border-border bg-muted/40 p-3\">\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">\n {language === 'ar' ? 'رسم الشبكة' : 'Network Graph'}\n </p>\n <pre className=\"text-xs text-foreground/80 overflow-auto max-h-48 whitespace-pre-wrap break-all\">\n {JSON.stringify(data, null, 2)}\n </pre>\n </div>\n)\nNetworkGraphArtifact.displayName = 'NetworkGraphArtifact'\n\nconst KpiCardArtifact = ({ data, language = 'en' }: { data: unknown; language?: string }) => (\n <div className=\"rounded-lg border border-border bg-muted/40 p-3\">\n <p className=\"text-xs font-medium text-muted-foreground mb-2\">\n {language === 'ar' ? 'مؤشرات الأداء' : 'KPI Card'}\n </p>\n <pre className=\"text-xs text-foreground/80 overflow-auto max-h-48 whitespace-pre-wrap break-all\">\n {JSON.stringify(data, null, 2)}\n </pre>\n </div>\n)\nKpiCardArtifact.displayName = 'KpiCardArtifact'\n\nconst FallbackArtifact = ({ slug, data, language = 'en' }: { slug: string; data: unknown; language?: string }) => (\n <div className=\"rounded-lg border border-dashed border-border bg-muted/30 p-3\">\n <p className=\"text-xs font-medium text-muted-foreground mb-1\">\n {language === 'ar' ? `مكوّن: ${slug}` : `Artifact: ${slug}`}\n </p>\n <pre className=\"text-xs text-foreground/70 overflow-auto max-h-48 whitespace-pre-wrap break-all\">\n {JSON.stringify(data, null, 2)}\n </pre>\n </div>\n)\nFallbackArtifact.displayName = 'FallbackArtifact'\n\n// ── Main component ─────────────────────────────────────────────────────────────\n\n/**\n * ArtifactViewer\n *\n * Switches on `artifact.controller_slug` to render the appropriate visualisation.\n * Supported slugs:\n * - map-of-events\n * - timeline\n * - network-graph\n * - kpi-card\n *\n * All others render a JSON fallback. All app dependencies removed — language/dir\n * are plain props.\n */\nconst ArtifactViewer = ({ artifact, language = 'en', dir }: ArtifactViewerProps) => {\n const resolvedDir = dir ?? (language === 'ar' ? 'rtl' : 'ltr')\n const title = language === 'ar'\n ? (artifact.title_ar || artifact.title || artifact.controller_slug)\n : (artifact.title || artifact.controller_slug)\n\n return (\n <div className=\"space-y-1.5\" dir={resolvedDir}>\n {title && (\n <p className=\"text-xs font-semibold text-foreground/70 px-0.5\">{title}</p>\n )}\n {(() => {\n switch (artifact.controller_slug) {\n case 'map-of-events':\n return <MapOfEventsArtifact data={artifact.data} language={language} />\n case 'timeline':\n return <TimelineArtifact data={artifact.data} language={language} />\n case 'network-graph':\n return <NetworkGraphArtifact data={artifact.data} language={language} />\n case 'kpi-card':\n return <KpiCardArtifact data={artifact.data} language={language} />\n default:\n return <FallbackArtifact slug={artifact.controller_slug} data={artifact.data} language={language} />\n }\n })()}\n </div>\n )\n}\n\nArtifactViewer.displayName = 'ArtifactViewer'\n\nexport default ArtifactViewer\n"],"mappings":"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","names":["jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","cva","jsx","cva","jsx","jsxs","Fragment","jsx","jsxs","t","_","table","useMemo","useState","Search","Fragment","jsx","jsxs","useState","useMemo","Search","jsx","jsxs","useState","useEffect","Loader2","React","jsx","jsxs","useState","useEffect","useRef","jsx","jsx","jsxs","useState","Eye","EyeOff","jsx","jsxs","useState","EyeOff","Eye","useEffect","useRef","jsx","useRef","useEffect","Fragment","jsx","jsxs","useState","useRef","useEffect","useState","Mail","ArrowLeft","Loader2","jsx","jsxs","useState","Mail","ArrowLeft","Loader2","useState","Check","Loader2","ArrowLeft","jsx","jsxs","jsx","jsxs","useState","Check","ArrowLeft","Loader2","useState","useCallback","ArrowLeft","Loader2","jsx","jsxs","useState","useCallback","Loader2","ArrowLeft","Fragment","jsx","jsxs","useState","useEffect","Loader2","useCallback","useEffect","useRef","useState","Lock","jsx","jsxs","STRINGS","useState","useRef","useEffect","useCallback","initials","Lock","useCallback","useEffect","useRef","useState","Lock","LogOut","ShieldCheck","jsx","jsxs","STRINGS","useState","useRef","useEffect","useCallback","Lock","ShieldCheck","LogOut","useState","LogOut","Shield","ChevronDown","Search","Fragment","jsx","jsxs","Shield","Search","useState","ChevronDown","LogOut","React","jsx","jsxs","jsx","jsxs","useEffect","useRef","useState","jsx","jsx","jsxs","jsx","jsxs","Sparkles","jsx","React","ShieldCheck","LogOut","KeyRound","Check","Fragment","jsx","jsxs","t","ShieldCheck","Check","KeyRound","LogOut","React","jsx","jsxs","React","Icons","jsx","jsxs","Icons","React","jsx","useState","ChevronDown","jsx","jsxs","useState","ChevronDown","useState","ChevronDown","jsx","jsxs","useState","ChevronDown","React","useState","useCallback","useMemo","Fragment","jsx","jsxs","useState","useCallback","useMemo","t","React","jsx","jsxs","React","jsx","jsxs","m","Loader2","jsx","jsxs","Loader2","useMemo","useCallback","useEffect","useRef","useState","jsx","jsxs","jsx","jsxs","t","useRef","useCallback","useState","useEffect","typeLabel","useMemo","jsx","jsxs","jsx","jsxs","Fragment","jsx","jsxs","React","useState","Sparkles","ChevronDown","ChevronUp","ChevronRight","Fragment","jsx","jsxs","Sparkles","t","useState","ChevronDown","ChevronRight","ChevronUp","ChevronRight","jsx","jsxs","ChevronRight","useState","useCallback","useMemo","DndContext","closestCenter","KeyboardSensor","PointerSensor","useSensor","useSensors","SortableContext","sortableKeyboardCoordinates","useSortable","verticalListSortingStrategy","CSS","RotateCcw","Trash2","GripVertical","Database","Search","Globe","Code","Info","ExternalLink","toast","React","Settings2","Trash2","GitBranch","Repeat","Clock","Database","Sparkles","Globe","ChevronRight","jsx","jsxs","Clock","GitBranch","Repeat","Database","Sparkles","Globe","ChevronRight","Settings2","Trash2","t","React","jsx","jsxs","t","useEffect","Fragment","jsx","jsxs","t","useSortable","CSS","jsxs","jsx","GripVertical","Trash2","useState","useEffect","Fragment","Info","ExternalLink","useMemo","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","useCallback","toast","RotateCcw","DndContext","closestCenter","SortableContext","verticalListSortingStrategy","Globe","useState","useEffect","Fragment","jsx","jsxs","useState","useEffect","useState","useRef","useCallback","Loader2","ExternalLink","ChevronDown","ChevronUp","Fragment","jsx","jsxs","StepRow","Loader2","useState","ExternalLink","ChevronUp","ChevronDown","useRef","useCallback","useMemo","CircleDot","Area","AreaChart","ResponsiveContainer","jsx","jsxs","TYPE_LABELS","DEFAULT_COLOR","formatCount","countLabel","formatRelative","t","activityState","STATE_CLASSES","typeLabel","useMemo","CircleDot","ResponsiveContainer","AreaChart","Area","jsxs","jsx","t","React","GitBranch","Pencil","jsx","jsxs","GitBranch","Pencil","t","React","useState","useCallback","ChevronDown","ChevronRight","Search","X","useState","useEffect","useEffect","useRef","Fragment","jsx","jsxs","LABELS","useCallback","React","EmptyState","Search","t","useState","X","ChevronDown","ChevronRight","Search","jsx","jsxs","t","Search","React","ChevronRight","CheckCircle2","jsx","jsxs","ChevronRight","t","CheckCircle2","React","ArrowLeft","jsx","jsxs","t","ArrowLeft","LucideIcons","jsx","jsx","jsxs","LucideIcons","Loader2","jsx","jsxs","Loader2","jsx","jsxs","useState","useCallback","useEffect","jsx","useState","useCallback","useEffect","t","useT","jsx","jsxs","Tooltip","ResponsiveContainer","jsx","jsxs","Clock","ShieldCheck","AlertTriangle","Check","Globe","Sparkles","jsx","jsxs","jsxs","jsx","Fragment","jsx","jsxs","Clock","ShieldCheck","AlertTriangle","Check","Globe","Sparkles","jsx","React","Check","Fragment","jsx","jsxs","tr","Check","jsx","jsx","jsx","jsxs","useState","jsx","jsxs","jsx","jsxs","jsx","jsx","jsxs","React","cva","jsx","jsxs","cva","Plus","MessageSquarePlus","t","Fragment","jsx","jsxs","Plus","MessageSquarePlus","React","MessageSquarePlus","jsx","jsxs","MessageSquarePlus","React","MessageSquarePlus","X","MapPin","Camera","ChevronLeft","ChevronRight","Fragment","jsx","jsxs","T","t","MapPin","MessageSquarePlus","X","ChevronLeft","ChevronRight","Camera","jsx","jsxs","React","DndContext","DragOverlay","closestCenter","KeyboardSensor","PointerSensor","useSensor","useSensors","SortableContext","sortableKeyboardCoordinates","useSortable","verticalListSortingStrategy","arrayMove","CSS","GripVertical","Settings2","Trash2","Plus","Fragment","jsx","jsxs","T","t","Plus","GripVertical","Settings2","Trash2","useSortable","CSS","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","active","arrayMove","DndContext","closestCenter","SortableContext","verticalListSortingStrategy","DragOverlay","React","Code","Code2","Eye","Pencil","jsx","jsxs","Code","Code2","VIEWS","Pencil","Eye","t","createContext","useCallback","useContext","useEffect","useRef","useState","useState","useRef","useEffect","useCallback","useMemo","Sparkles","User","Loader2","X","ChevronUp","Clock","Plus","Users","AlertTriangle","ExternalLink","Brain","Zap","Check","Copy","ChevronDown","Terminal","Trash2","GripVertical","useState","useMemo","Search","Database","Globe","Sparkles","Check","ChevronDown","ExternalLink","FileText","Clock","CircleDot","jsx","jsxs","STEP_ICONS","Search","Database","Globe","CircleDot","Clock","FileText","Check","Sparkles","ExternalLink","useState","useMemo","ChevronDown","RefreshCw","Fragment","jsx","jsxs","RefreshCw","useState","useRef","useCallback","useEffect","Globe","Newspaper","Microscope","Paperclip","ChevronDown","Brain","X","FileText","jsx","jsxs","jsx","jsxs","XIcon","Globe","Newspaper","useRef","useState","useCallback","useEffect","Brain","ChevronDown","Microscope","Paperclip","useState","useCallback","Plus","X","Check","jsx","jsxs","useState","useCallback","Check","X","Plus","useState","useEffect","Globe","AlertTriangle","TrendingUp","Calendar","ChevronRight","Shield","ArrowRight","jsx","jsxs","Shield","Globe","ArrowRight","ChevronRight","AlertTriangle","Calendar","useState","useEffect","themes","TrendingUp","Fragment","jsx","jsxs","useT","t","useCallback","useState","useRef","useMemo","useEffect","Users","Sparkles","ChevronUp","GripVertical","Brain","Zap","ExternalLink","Check","Clock","Trash2","Plus","X","AlertTriangle","User","Copy","Loader2","ChevronDown","Terminal","jsx","jsxs","useT","createContext","useState","useRef","useEffect","useCallback","t","useContext","Sparkles","jsx","jsxs","useSafeT","useT","t","Sparkles","useCallback","useEffect","useRef","useState","Sparkles","jsx","jsxs","useSafeT","useT","t","useState","useRef","useCallback","useEffect","Sparkles","useRef","useEffect","User","Sparkles","Loader2","Sparkles","jsx","jsxs","Loader2","Sparkles","jsx","jsxs","jsx","jsxs","Sparkles","User","useRef","useEffect"]}