diff --git a/.loc.json b/.loc.json index fc1f8a0..efa411a 100644 --- a/.loc.json +++ b/.loc.json @@ -1,33 +1,4 @@ { - "exceptions": { - "apps/playground/src/App.tsx": { - "max": 3413, - "reason": "Existing component and demo responsibilities; extract cohesive modules in the follow-up refactor. No growth." - }, - "apps/playground/src/mining-pages.tsx": { - "max": 720, - "reason": "Existing component and demo responsibilities; extract cohesive modules in the follow-up refactor. No growth." - }, - "packages/ui/src/blocks/campaign-schedule-matrix.tsx": { - "max": 994, - "reason": "Existing component and demo responsibilities; extract cohesive modules in the follow-up refactor. No growth." - }, - "packages/ui/src/blocks/creator-transfer.tsx": { - "max": 626, - "reason": "Existing component and demo responsibilities; extract cohesive modules in the follow-up refactor. No growth." - }, - "packages/ui/src/blocks/navigation-panel.tsx": { - "max": 1349, - "reason": "Existing component and demo responsibilities; extract cohesive modules in the follow-up refactor. No growth." - }, - "packages/ui/src/components/line-item-graph.tsx": { - "max": 896, - "reason": "Existing component and demo responsibilities; extract cohesive modules in the follow-up refactor. No growth." - }, - "tests/e2e/qualification.spec.ts": { - "max": 1540, - "reason": "Existing browser qualification scenarios; split by tested feature in the follow-up refactor. No growth." - } - }, + "exceptions": {}, "excluded": {} } diff --git a/AGENTS.md b/AGENTS.md index 08e1022..d70f8cb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -14,4 +14,4 @@ This repo is the shared `@nextide/ui` package. The playground exists only as a l - Do not assume backwards compatibility. If compatibility expectations are unclear, ask before locking the direction. - Never write product decisions, implementation details, API routing, fallback mechanics, or other internal plumbing into user-facing or agent-facing text. UI copy, notices, docs, prompts, labels, and tool messages should describe the user goal, required action, or visible state, not how the system is internally wired. -Use `just setup` and `just check` for the shared development baseline; see README.md for focused tests and browser prerequisites. Keep named LOC budgets and function debt exceptions from growing. +Use `just setup` and `just check` for the shared development baseline; see README.md for focused tests and browser prerequisites. Keep source files within 600 lines, tests within 900 lines, functions within 100 lines, and complexity within 12; do not add legacy debt exceptions. diff --git a/README.md b/README.md index f74f991..ccb39ac 100644 --- a/README.md +++ b/README.md @@ -22,12 +22,10 @@ Windows' `bin` directory to PATH so `just` can find `sh`. Port 4173 must be free. Focus with `just test-integration -g "campaign schedule"`. The [shared baseline](https://github.com/nextidemedia/meta/blob/main/docs/development-baseline.md) -sets complexity 12, function length 100, and source/test LOC limits. `.loc.json` -records exact legacy file budgets; reduce them after extraction and never grow -or regenerate them to accept new code. Narrow function comments record each -existing metric and the extraction debt; they are not permission to grow those -functions. Accessibility exceptions explain specific SVG, forwarded-prop, or -scroll-region semantics. Existing ESLint/React Hooks rules remain until parity +sets complexity 12, function length 100, and source/test LOC limits. All source +files meet the 600-line limit and browser suites meet the 900-line test limit; +`.loc.json` has no exceptions. Accessibility exceptions explain specific SVG, +forwarded-prop, or scroll-region semantics. Existing ESLint/React Hooks rules remain until parity with Oxlint is verified. Oxlint 1.80.0 was the newest stable npm release at least seven days old on 2026-09-08; the existing formatter and TypeScript remain pinned. diff --git a/apps/playground/src/App.tsx b/apps/playground/src/App.tsx index 9924539..b1f57eb 100644 --- a/apps/playground/src/App.tsx +++ b/apps/playground/src/App.tsx @@ -1,1353 +1,27 @@ -import { - type CSSProperties, - type ReactNode, - useEffect, - useReducer, - useState, -} from "react" -import { useRef } from "react" -import { - Activity, - ArrowRight, - BarChart3, - BookOpenText, - Boxes, - BriefcaseBusiness, - Building2, - CalendarClock, - Check, - Circle, - Database, - FileJson, - FileText, - Filter, - Gauge, - Layers3, - LoaderCircle, - PanelRightClose, - PanelRightOpen, - PanelLeft, - Plus, - Radar, - RadioTower, - Search, - Settings, - ShieldAlert, - Sparkles, - ServerCog, - UserRound, - UsersRound, - Video, - X, -} from "lucide-react" - -import { AppShell, type ShellDensity } from "@nextide/ui/blocks/app-shell" -import { CreatorScopePanel } from "@nextide/ui/blocks/creator-scope-panel" -import { CreatorTransfer } from "@nextide/ui/blocks/creator-transfer" -import { - DashboardFilterBar, - type DashboardFilterItem, -} from "@nextide/ui/blocks/dashboard-filter-bar" -import { ExportWorkbench } from "@nextide/ui/blocks/export-workbench" -import { FitLeaderboard } from "@nextide/ui/blocks/fit-leaderboard" -import { - IntelligenceProgressionChart, - type IntelligenceProgressionStage, -} from "@nextide/ui/blocks/intelligence-progression-chart" -import { SignalPlate } from "@nextide/ui/blocks/signal-plate" -import { LiveguardCockpit } from "@nextide/ui/blocks/liveguard-cockpit" -import { - NavigationPanel, - defaultNavigationPanelSections, -} from "@nextide/ui/blocks/navigation-panel" -import { ProgressiveSummaryRail } from "@nextide/ui/blocks/progressive-summary-rail" -import { - ReportContextBuilder, - type ReportContextBucket, -} from "@nextide/ui/blocks/report-context-builder" -import { - SettingsModal, - SettingsModalSection, -} from "@nextide/ui/blocks/settings-modal" -import { - StreamSelector, - type StreamSelectorItem, -} from "@nextide/ui/blocks/stream-selector" -import { - Autocomplete, - AutocompleteClear, - AutocompleteContent, - AutocompleteEmpty, - AutocompleteInput, - AutocompleteInputGroup, - AutocompleteItem, - AutocompleteList, - AutocompletePortal, - AutocompletePositioner, -} from "@nextide/ui/components/autocomplete" -import { - Alert, - AlertDescription, - AlertTitle, -} from "@nextide/ui/components/alert" -import { - Avatar, - AvatarBadge, - AvatarFallback, - AvatarGroup, - AvatarGroupCount, -} from "@nextide/ui/components/avatar" -import { Badge } from "@nextide/ui/components/badge" -import { Button } from "@nextide/ui/components/button" -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from "@nextide/ui/components/card" -import { - Carousel, - CarouselContent, - CarouselItem, - CarouselNext, - CarouselPrevious, -} from "@nextide/ui/components/carousel" -import { Checkbox } from "@nextide/ui/components/checkbox" -import { - Collapsible, - CollapsibleContent, - CollapsibleTrigger, -} from "@nextide/ui/components/collapsible" -import { - CreatorFlowChart, - type CreatorFlowSession, -} from "@nextide/ui/components/creator-flow-chart" -import { - SingleCalendarDateRangePicker, - type DateRange, -} from "@nextide/ui/components/date-range-picker" -import { DonutChart } from "@nextide/ui/components/donut-chart" -import { - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "@nextide/ui/components/dialog" -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuGroup, - DropdownMenuItem, - DropdownMenuLabel, - DropdownMenuTrigger, -} from "@nextide/ui/components/dropdown-menu" -import { - DurationPicker, - type DurationValue, -} from "@nextide/ui/components/duration-picker" -import { - Empty, - EmptyDescription, - EmptyHeader, - EmptyMedia, - EmptyTitle, -} from "@nextide/ui/components/empty" -import { - Field, - FieldDescription, - FieldLabel, -} from "@nextide/ui/components/field" -import { HourlyPacingChart } from "@nextide/ui/components/hourly-pacing-chart" -import { Input } from "@nextide/ui/components/input" -import { Kbd, KbdGroup } from "@nextide/ui/components/kbd" -import { LineGraph } from "@nextide/ui/components/line-graph" -import { - LineItemGraph, - type LineItemGraphDay, - type LineItemGraphSeries, -} from "@nextide/ui/components/line-item-graph" -import { Metric } from "@nextide/ui/components/metric" -import { Notice } from "@nextide/ui/components/notice" -import { - Popover, - PopoverContent, - PopoverDescription, - PopoverHeader, - PopoverTitle, - PopoverTrigger, -} from "@nextide/ui/components/popover" -import { - Progress, - ProgressLabel, - ProgressValue, -} from "@nextide/ui/components/progress" -import { ProcessingText } from "@nextide/ui/components/processing-text" -import type { ScheduleControlValue } from "@nextide/ui/components/schedule-control" -import { ScrollArea } from "@nextide/ui/components/scroll-area" -import { SelectMenu } from "@nextide/ui/components/select-menu" -import { SegmentedControl } from "@nextide/ui/components/segmented-control" -import { Separator } from "@nextide/ui/components/separator" -import { Slider } from "@nextide/ui/components/slider" -import { Skeleton } from "@nextide/ui/components/skeleton" -import { Spinner } from "@nextide/ui/components/spinner" -import { StatusBadge } from "@nextide/ui/components/status-badge" -import { - Surface, - SurfaceDescription, - SurfaceHeader, - SurfaceTitle, -} from "@nextide/ui/components/surface" -import { Switch } from "@nextide/ui/components/switch" -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "@nextide/ui/components/table" -import { - Tabs, - TabsContent, - TabsList, - TabsTrigger, -} from "@nextide/ui/components/tabs" -import { TrendBarChart } from "@nextide/ui/components/trend-bar-chart" -import { SignalRidgeChart } from "@nextide/ui/components/signal-ridge-chart" -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from "@nextide/ui/components/tooltip" -import { useStagedDrawer } from "@nextide/ui/hooks/use-staged-drawer" +import { AppShell } from "@nextide/ui/blocks/app-shell" import { cn } from "@nextide/ui/lib/utils" -import { formatCompactNumber } from "@nextide/ui/lib/format-number" - -import { - IntelligenceReportMiningPage, - KrakenMiningPage, - WebMiningPage, -} from "./mining-pages" -import { ComponentReference } from "./component-reference" - -const daedalusFilterGroups = [ - { id: "campaign", label: "Campaigns" }, - { id: "creator", label: "Creators" }, - { id: "partner", label: "Partners" }, -] - -const daedalusFilterItems: DashboardFilterItem[] = [ - { - id: "campaign-starforge", - groupId: "campaign", - title: "Starforge Summer", - subtitle: "9 creators · 3 live", - badge: "Live", - live: true, - tone: "success", - }, - { - id: "campaign-orbit", - groupId: "campaign", - title: "Orbit Creator Push", - subtitle: "Weekly report ready", - badge: "Export", - tone: "processing", - }, - { - id: "campaign-daedalus", - groupId: "campaign", - title: "Daedalus Pilot", - subtitle: "LiveGuard warmup", - badge: "Guarded", - tone: "warning", - }, - { - id: "campaign-helix", - groupId: "campaign", - title: "Helix Launch Week", - subtitle: "12 creators · starts Monday", - badge: "Ready", - tone: "success", - }, - { - id: "campaign-neon", - groupId: "campaign", - title: "Neon Arena Series", - subtitle: "4 live · 2 awaiting proof", - badge: "Watch", - tone: "warning", - }, - { - id: "campaign-atlas", - groupId: "campaign", - title: "Atlas Creator Sprint", - subtitle: "Daily report at 18:00", - badge: "Export", - tone: "processing", - }, - { - id: "campaign-ember", - groupId: "campaign", - title: "Ember Winter Drop", - subtitle: "Creative review in progress", - badge: "Review", - tone: "neutral", - }, - { - id: "campaign-vanguard", - groupId: "campaign", - title: "Vanguard Finals", - subtitle: "8 creators · all approved", - badge: "Ready", - tone: "success", - }, - { - id: "campaign-lumen", - groupId: "campaign", - title: "Lumen Partner Flight", - subtitle: "Partner evidence attached", - badge: "Scoped", - tone: "success", - }, - { - id: "campaign-afterglow", - groupId: "campaign", - title: "Afterglow Retargeting", - subtitle: "Pacing 6% above plan", - badge: "Pacing", - tone: "warning", - }, - { - id: "creator-mina", - groupId: "creator", - title: "Mina Vale", - subtitle: "Twitch · YouTube", - badge: "Clean", - tone: "success", - }, - { - id: "creator-ren", - groupId: "creator", - title: "Ren Kade", - subtitle: "Kick · scheduled today", - badge: "Watch", - tone: "warning", - }, - { - id: "partner-nova", - groupId: "partner", - title: "Nova Media", - subtitle: "4 campaigns in scope", - badge: "Scoped", - tone: "success", - }, -] - -const weeklyTrendRows = [ - { id: "mon", label: "Mon", value: 42, valueLabel: "42k" }, - { id: "tue", label: "Tue", value: 51, valueLabel: "51k" }, - { id: "wed", label: "Wed", value: 47, valueLabel: "47k" }, - { - id: "thu", - label: "Thu", - value: 74, - valueLabel: "74k", - tone: "success" as const, - }, - { id: "fri", label: "Fri", value: 68, valueLabel: "68k" }, - { id: "sat", label: "Sat", value: 59, valueLabel: "59k" }, - { id: "sun", label: "Sun", value: 63, valueLabel: "63k" }, -] - -const hourlyPacingBuckets = [ - 70, 50, 40, 35, 35, 40, 45, 55, 70, 90, 115, 150, 190, 150, 120, 105, 110, - 135, 190, 260, 310, 310, 250, 160, -].map((value, hour) => ({ - id: `hour-${hour}`, - hour, - value, - valueLabel: `${value}%`, - detail: - hour >= 19 && hour <= 21 - ? "prime window" - : hour >= 11 && hour <= 13 - ? "lunch lift" - : hour < 6 - ? "overnight floor" - : "steady delivery", -})) - -const campaignLinePoints = [ - { id: "w1", label: "W1", value: 64, valueLabel: "64k", meta: "baseline" }, - { id: "w2", label: "W2", value: 72, valueLabel: "72k" }, - { id: "w3", label: "W3", value: 69, valueLabel: "69k" }, - { id: "w4", label: "W4", value: 91, valueLabel: "91k", meta: "launch" }, - { id: "w5", label: "W5", value: 104, valueLabel: "104k" }, - { id: "w6", label: "W6", value: 118, valueLabel: "118k" }, -] - -const weeklyImpressionDays: LineItemGraphDay[] = [ - { id: "may-11", label: "May 11", weekday: "Mo", hidden: true }, - { id: "may-12", label: "May 12", weekday: "Tu" }, - { id: "may-13", label: "May 13", weekday: "We" }, - { id: "may-14", label: "May 14", weekday: "Th" }, - { id: "may-15", label: "May 15", weekday: "Fr" }, - { id: "may-16", label: "May 16", weekday: "Sa" }, - { id: "may-17", label: "May 17", weekday: "Su" }, - { id: "may-18", label: "May 18", weekday: "Mo" }, -] - -const weeklyImpressionSeries: LineItemGraphSeries[] = [ - { - id: "coca-cola-q2", - label: "Coca Cola Q2", - tone: "cyan", - points: [ - { dayId: "may-11", value: 382000 }, - { dayId: "may-12", value: 330000 }, - { dayId: "may-13", value: 194000 }, - { dayId: "may-14", value: 116000 }, - { dayId: "may-15", value: 301000 }, - { dayId: "may-16", value: 356000 }, - { dayId: "may-17", value: 352000 }, - { dayId: "may-18", value: 140000 }, - ], - }, - { - id: "snickers-testbuy-q2", - label: "Snickers Testbuy Q2", - tone: "yellow", - points: [ - { dayId: "may-11", value: 85000 }, - { dayId: "may-12", value: 86000 }, - { dayId: "may-13", value: 87000 }, - { dayId: "may-14", value: 87500 }, - { dayId: "may-15", value: 86000 }, - { dayId: "may-16", value: 85000 }, - { dayId: "may-17", value: 85000 }, - { dayId: "may-18", value: 88000 }, - ], - }, - { - id: "frozen-reprise", - label: "Frozen Reprise Movie Campaign Q2", - tone: "red", - points: [ - { dayId: "may-11", value: 0 }, - { dayId: "may-12", value: 0 }, - { dayId: "may-13", value: 32000 }, - { dayId: "may-14", value: 28000 }, - { dayId: "may-15", value: 105000 }, - { dayId: "may-16", value: 0 }, - { dayId: "may-17", value: 118000 }, - { dayId: "may-18", value: 22000 }, - ], - }, - { - id: "rtx6000", - label: "RTX6000 Launch Campaign", - tone: "tide", - points: weeklyImpressionDays.map((day) => ({ - dayId: day.id, - value: day.hidden ? 0 : 1200, - })), - }, -] - -const bannerImpressionDays: LineItemGraphDay[] = [ - "Apr 28", - "Apr 29", - "Apr 30", - "May 1", - "May 2", - "May 3", - "May 4", - "May 5", - "May 6", - "May 7", - "May 8", - "May 9", - "May 10", - "May 11", - "May 12", - "May 13", - "May 14", - "May 15", - "May 16", - "May 17", - "May 18", -].map((label) => ({ - id: label.toLowerCase().replace(/[^a-z0-9]+/g, "-"), - label, -})) - -const bannerImpressionSeries: LineItemGraphSeries[] = [ - { - id: "banner-impressions", - label: "Banner impressions", - tone: "cyan", - points: [ - 92000, 570000, 318000, 284000, 268000, 98000, 205000, 190000, 410000, - 295000, 336000, 356000, 330000, 718000, 292000, 315000, 246000, 345000, - 270000, 315000, 140000, - ].map((value, index) => ({ - dayId: bannerImpressionDays[index].id, - value, - })), - }, - { - id: "immersive-frame-impressions", - label: "Immersive frame impressions", - tone: "red", - points: [ - 110000, 142000, 92000, 78000, 102000, 276000, 44000, 156000, 132000, - 82000, 74000, 105000, 98000, 76000, 42000, 83000, 26000, 18000, 96000, - 22000, 112000, - ].map((value, index) => ({ - dayId: bannerImpressionDays[index].id, - value, - })), - }, - { - id: "link-clicks", - label: "Link clicks", - tone: "tide", - points: [ - 7200, 11800, 9200, 8600, 7600, 6000, 5100, 9400, 11000, 8300, 7800, 6900, - 13200, 9600, 8300, 7400, 7000, 12100, 8800, 9500, 6200, - ].map((value, index) => ({ - dayId: bannerImpressionDays[index].id, - value, - })), - }, -] - -const channelMixSegments = [ - { - id: "twitch", - label: "Twitch", - value: 48, - valueLabel: "48%", - tone: "success" as const, - }, - { - id: "youtube", - label: "YouTube", - value: 31, - valueLabel: "31%", - tone: "processing" as const, - }, - { - id: "kick", - label: "Kick", - value: 14, - valueLabel: "14%", - tone: "warning" as const, - }, - { - id: "other", - label: "Other", - value: 7, - valueLabel: "7%", - tone: "neutral" as const, - }, -] - -const exportSessionRows = [ - { - id: "run-1", - creator: "Mina Vale", - window: "May 12, 18:00-20:00", - metric: "74k", - status: Reported, - }, - { - id: "run-2", - creator: "Ren Kade", - window: "May 13, live", - metric: "31k", - status: ( - - Live - - ), - }, - { - id: "run-3", - creator: "Taro", - window: "May 14, scheduled", - metric: "Pending", - status: Final, - }, -] - -const liveguardCreators = [ - { - id: "creator-1", - name: "Mina Vale", - platforms: ["twitch", "youtube"], - state: Clean, - lastEvent: "6m ago", - }, - { - id: "creator-2", - name: "Ren Kade", - platforms: ["kick"], - state: Watch, - lastEvent: "12m ago", - }, - { - id: "creator-3", - name: "Taro", - platforms: ["youtube"], - state: Offline, - lastEvent: "1h ago", - }, -] - -const liveguardIncidents = [ - { - id: "incident-1", - time: "18:42", - creator: "Ren Kade", - type: "Brand mention", - severity: Under, - summary: "Competitor mention stayed under threshold.", - }, - { - id: "incident-2", - time: "19:04", - creator: "Mina Vale", - type: "Transcript proof", - severity: Clean, - summary: "Scheduled read detected and ignored.", - }, -] - -const intelligenceCreators = [ - { - id: "creator-mina", - name: "Mina Vale", - meta: "Twitch - 6 streams", - avatar: "MV", - }, - { - id: "creator-ren", - name: "Ren Kade", - meta: "Kick - live today", - avatar: "RK", - disabled: true, - }, - { - id: "creator-taro", - name: "Taro", - meta: "YouTube - scheduled", - avatar: "TA", - }, - { - id: "creator-ivy", - name: "Ivy North", - meta: "Twitch - partner", - avatar: "IN", - }, -] - -const intelligenceFitRows = [ - { - id: "fit-mina", - name: "Mina Vale", - meta: "Twitch · Lifestyle", - avatarFallback: "MV", - fit: 4.8, - safety: 4.6, - sentiment: 3.9, - sentimentDetail: "28.4K mentions", - }, - { - id: "fit-ren", - name: "Ren Kade", - meta: "Kick · Competitive", - avatarFallback: "RK", - fit: 4.1, - safety: 3.4, - sentiment: 1.8, - sentimentDetail: "12.7K mentions", - }, - { - id: "fit-ivy", - name: "Ivy North", - meta: "Twitch · Variety", - avatarFallback: "IN", - fit: 3.6, - safety: 4.2, - sentiment: -0.7, - sentimentDetail: "8.1K mentions", - }, -] - -function autocompleteCreatorValue( - creator: (typeof intelligenceCreators)[number] -) { - return creator.name -} - -const intelligenceStreamRows: StreamSelectorItem[] = [ - { - id: "stream-mina-1", - creatorId: "creator-mina", - creatorName: "Mina Vale", - title: "Launch room watch party", - meta: "Twitch", - dateLabel: "May 11", - durationLabel: "3h 12m", - readinessLabel: "Finished", - readinessTone: "success", - thumbnail: - "linear-gradient(135deg, rgb(30 228 188 / 0.24), rgb(0 0 0 / 0.2))", - }, - { - id: "stream-mina-2", - creatorId: "creator-mina", - creatorName: "Mina Vale", - title: "Creator recap and chat Q&A", - meta: "Twitch", - dateLabel: "May 12", - durationLabel: "2h 48m", - readinessLabel: "Processing", - readinessTone: "processing", - thumbnail: - "linear-gradient(135deg, rgb(175 46 255 / 0.24), rgb(30 228 188 / 0.08))", - }, - { - id: "stream-ren-1", - creatorId: "creator-ren", - creatorName: "Ren Kade", - title: "Sponsored challenge slot", - meta: "Kick", - dateLabel: "May 13", - durationLabel: "1h 56m", - readinessLabel: "Finished", - readinessTone: "success", - disabled: true, - thumbnail: - "linear-gradient(135deg, rgb(30 228 188 / 0.2), rgb(255 218 83 / 0.12))", - }, - { - id: "stream-taro-1", - creatorId: "creator-taro", - creatorName: "Taro", - title: "Late night product read", - meta: "YouTube", - dateLabel: "May 14", - durationLabel: "scheduled", - readinessLabel: "Queued", - readinessTone: "warning", - thumbnail: - "linear-gradient(135deg, rgb(255 218 83 / 0.18), rgb(0 0 0 / 0.18))", - }, - { - id: "stream-ivy-1", - creatorId: "creator-ivy", - creatorName: "Ivy North", - title: "Co-stream safety proof", - meta: "Twitch", - dateLabel: "May 15", - durationLabel: "2h 20m", - readinessLabel: "Finished", - readinessTone: "success", - thumbnail: - "linear-gradient(135deg, rgb(30 228 188 / 0.16), rgb(255 51 85 / 0.1))", - }, -] - -const intelligenceContextBuckets: ReportContextBucket[] = [ - { - id: "brand", - label: "Brand", - required: true, - selectionPolicy: "single", - selected: ["Daedalus"], - suggestions: ["Nextide", "Starforge", "Orbit"], - }, - { - id: "products", - label: "Products", - locked: true, - selected: ["Command center"], - suggestions: ["Creator roster", "Weekly export", "LiveGuard cockpit"], - }, - { - id: "phrases", - label: "Special phrases", - disabled: true, - selected: ["runtime proof"], - suggestions: ["brand-safe", "chat lift", "campaign slot"], - }, - { - id: "competitors", - label: "Competing brands", - selected: [], - suggestions: ["Orbit", "Nova Media", "CreatorOS"], - }, -] - -const intelligenceFlowSessions: CreatorFlowSession[] = [ - { - id: "flow-mina", - creatorId: "creator-mina", - label: "Starforge", - startIndex: 1, - endIndex: 4, - tone: "success", - }, - { - id: "flow-ren", - creatorId: "creator-ren", - label: "Daedalus", - startIndex: 3, - endIndex: 6, - tone: "processing", - }, - { - id: "flow-taro", - creatorId: "creator-taro", - label: "LiveGuard", - startIndex: 5, - endIndex: 8, - tone: "warning", - }, - { - id: "flow-ivy", - creatorId: "creator-ivy", - label: "Orbit", - startIndex: 0, - endIndex: 2, - tone: "success", - }, -] - -const intelligenceProgressionStages: IntelligenceProgressionStage[] = [ - { - id: "queue", - label: "Queue streams", - detail: "5 selected", - status: "completed", - icon: , - }, - { - id: "vod-ingest", - label: "Ingest VODs", - detail: "5/5 ready", - status: "completed", - icon: