fix(web): isolate lucide icons for server pages

This commit is contained in:
2026-10-06 14:16:20 +08:00
parent ce7f84a4ae
commit c325872b57
23 changed files with 103 additions and 29 deletions
@@ -1,5 +1,5 @@
import Link from "next/link";
import { ArrowLeft, Bot, GitBranch } from "lucide-react";
import { ArrowLeft, Bot, GitBranch } from "@/components/lucide-icons";
type ProviderConfig = {
id: string;
@@ -1,5 +1,5 @@
import Link from "next/link";
import { ArrowLeft, FileText, GitBranch } from "lucide-react";
import { ArrowLeft, FileText, GitBranch } from "@/components/lucide-icons";
type PromptTemplate = {
id: string;
@@ -1,6 +1,6 @@
import Link from "next/link";
import type { LucideIcon } from "lucide-react";
import { FileClock, Fingerprint, ListFilter, ShieldCheck } from "lucide-react";
import type { LucideIcon } from "@/components/lucide-icons";
import { FileClock, Fingerprint, ListFilter, ShieldCheck } from "@/components/lucide-icons";
import { getGlobalAuditEvents, type GlobalAuditEventItem } from "@/services/contracts";
type PageProps = {
@@ -1,5 +1,5 @@
import Link from "next/link";
import { AlertTriangle, ArrowLeft, CheckCircle2, Search, ShieldCheck } from "lucide-react";
import { AlertTriangle, ArrowLeft, CheckCircle2, Search, ShieldCheck } from "@/components/lucide-icons";
import {
getAccountConflict,
getAccountConflicts,
@@ -1,6 +1,6 @@
import Link from "next/link";
import type { LucideIcon } from "lucide-react";
import { BookMarked, Filter, Gavel, History, Layers3, Link2, Pencil, RotateCcw, Scale, Search, ShieldAlert, ShieldCheck, UploadCloud } from "lucide-react";
import type { LucideIcon } from "@/components/lucide-icons";
import { BookMarked, Filter, Gavel, History, Layers3, Link2, Pencil, RotateCcw, Scale, Search, ShieldAlert, ShieldCheck, UploadCloud } from "@/components/lucide-icons";
import {
getReviewRuleDiff,
getReviewRuleEditDraft,
@@ -1,6 +1,6 @@
import Link from "next/link";
import type { LucideIcon } from "lucide-react";
import { BookOpenText, Database, FileText, Landmark, Scale, Search, ShieldCheck } from "lucide-react";
import type { LucideIcon } from "@/components/lucide-icons";
import { BookOpenText, Database, FileText, Landmark, Scale, Search, ShieldCheck } from "@/components/lucide-icons";
import {
getLegalArticle,
getLegalArticles,
@@ -1,6 +1,6 @@
import Link from "next/link";
import type { LucideIcon } from "lucide-react";
import { Activity, AlertTriangle, Bot, BookMarked, BookOpen, BookOpenText, ClipboardList, FileText, Gauge, Scale, ServerCog, Settings, ShieldCheck, SlidersHorizontal, CheckSquare, UsersRound } from "lucide-react";
import type { LucideIcon } from "@/components/lucide-icons";
import { Activity, AlertTriangle, Bot, BookMarked, BookOpen, BookOpenText, ClipboardList, FileText, Gauge, Scale, ServerCog, Settings, ShieldCheck, SlidersHorizontal, CheckSquare, UsersRound } from "@/components/lucide-icons";
import { canAccessAdminCapability, getRoleLabel, hasPlatformCapability, normalizeUserRole, type AdminCapability, type PlatformCapability } from "@/lib/access-control";
import { getContractWebSession } from "@/lib/contract-session";
@@ -1,4 +1,4 @@
import { Activity, BellRing, Building2, CheckCircle2, Clock3, FileWarning, Route, ShieldAlert, UsersRound } from "lucide-react";
import { Activity, BellRing, Building2, CheckCircle2, Clock3, FileWarning, Route, ShieldAlert, UsersRound } from "@/components/lucide-icons";
import Link from "next/link";
import { getPilotOnCallSchedule, getPilotOperationPolicy, getPilotOperationScanRuns, getPilotOperationsDashboard, getPilotOperationsInsights, getReliableEvidenceAuditClientChanges, getReliableEvidenceAuditClients, getReliableEvidenceKeyChangeRequests, getReliableEvidenceProbeRuns, getReliableEvidenceSigningKeys, getReliableEvidenceTransparencyAnchors, getReliableEvidenceTransparencyCheckpoint, getReliableEvidenceTransparencyEvents } from "@/services/pilot-operations";
import {
@@ -1,5 +1,5 @@
import Link from "next/link";
import { Activity, ArrowRight, Clock3, FlaskConical, Gauge, Target, UsersRound } from "lucide-react";
import { Activity, ArrowRight, Clock3, FlaskConical, Gauge, Target, UsersRound } from "@/components/lucide-icons";
import { getAcquisitionFunnelSummary, getDraftFunnelSummary, getDraftingStageTimingSummary } from "@/services/product-analytics";
import { DraftingStageTimingPanel } from "./drafting-stage-timing-panel";
@@ -1,8 +1,8 @@
import Link from "next/link";
import { ReviewEvidenceSummary, ReviewFindingBasis } from "@/components/review-evidence-summary";
import { RiskCard, type RiskCardTagTone } from "@yuqei/design-system";
import type { LucideIcon } from "lucide-react";
import { FileSearch, ShieldAlert, Quote, ListChecks } from "lucide-react";
import type { LucideIcon } from "@/components/lucide-icons";
import { FileSearch, ShieldAlert, Quote, ListChecks } from "@/components/lucide-icons";
import {
getContractDetail,
getContracts,
@@ -1,5 +1,5 @@
import Link from "next/link";
import { AlertTriangle, DatabaseZap, Download, Route, ShieldCheck, UserSearch } from "lucide-react";
import { AlertTriangle, DatabaseZap, Download, Route, ShieldCheck, UserSearch } from "@/components/lucide-icons";
import {
getDataEgressLedger,
getSecurityAccessEvents,
@@ -1,6 +1,6 @@
import Link from "next/link";
import { ReviewEvidenceSummary, ReviewFindingBasis } from "@/components/review-evidence-summary";
import { UploadCloud } from "lucide-react";
import { UploadCloud } from "@/components/lucide-icons";
import {
getArchiveEvidence,
getContractDetail,
@@ -1,5 +1,5 @@
import Link from "next/link";
import { ChevronLeft, ChevronRight, FileSignature, Search } from "lucide-react";
import { ChevronLeft, ChevronRight, FileSignature, Search } from "@/components/lucide-icons";
import { getContractPage } from "@/services/contracts";
import { PageSizeSelect } from "./page-size-select";
import { RecordDownloadButton } from "./record-download-button";
@@ -1,5 +1,5 @@
import Link from "next/link";
import { FileText, Clock, CheckCircle, XCircle, AlertTriangle, TrendingUp } from "lucide-react";
import { FileText, Clock, CheckCircle, XCircle, AlertTriangle, TrendingUp } from "@/components/lucide-icons";
import { getContractsDashboard, type ContractDashboard } from "@/services/contracts";
const text = {
@@ -1,5 +1,5 @@
import Link from "next/link";
import { Filter } from "lucide-react";
import { Filter } from "@/components/lucide-icons";
import { getContractFiles, getContracts } from "@/services/contracts";
import { FileRepositoryTable } from "./file-repository-table";
import { UploadContractFileForm } from "./upload-contract-file-form";
@@ -6,8 +6,8 @@ import {
ScrollText,
Search,
WandSparkles
} from "lucide-react";
import type { LucideIcon } from "lucide-react";
} from "@/components/lucide-icons";
import type { LucideIcon } from "@/components/lucide-icons";
import {
getContractTemplateTree,
type ContractTemplateItem,
@@ -1,5 +1,5 @@
import Link from "next/link";
import { Bell, Check, CheckCircle, XCircle, AlertTriangle, Clock, FileText } from "lucide-react";
import { Bell, Check, CheckCircle, XCircle, AlertTriangle, Clock, FileText } from "@/components/lucide-icons";
import { getNotifications, type Notification, type NotificationType } from "@/services/contracts";
const text = {
@@ -10,7 +10,7 @@ import {
ShieldCheck,
Sparkles,
UsersRound,
} from "lucide-react";
} from "@/components/lucide-icons";
import { getContractWebSession } from "@/lib/contract-session";
import { industrySolutions } from "@/lib/industry-solutions";
import { TrackedCta } from "@/components/tracked-cta";
@@ -1,6 +1,6 @@
import Link from "next/link";
import type { ReactNode } from "react";
import { Search } from "lucide-react";
import { Search } from "@/components/lucide-icons";
import { getUnifiedSearchResults, type UnifiedSearchResult, type SearchResultType } from "@/services/contracts";
type PageProps = {
@@ -1,6 +1,6 @@
import Link from "next/link";
import { notFound } from "next/navigation";
import { ArrowLeft, ArrowRight, Check, FileSignature, Headphones, ShieldCheck } from "lucide-react";
import { ArrowLeft, ArrowRight, Check, FileSignature, Headphones, ShieldCheck } from "@/components/lucide-icons";
import { getContractWebSession } from "@/lib/contract-session";
import { getIndustrySolution, industrySolutions } from "@/lib/industry-solutions";
@@ -1,6 +1,6 @@
import Link from "next/link";
import { FileText, History, Layers3, Pencil, RotateCcw, Scale, Search, ShieldCheck, UploadCloud, WandSparkles } from "lucide-react";
import type { LucideIcon } from "lucide-react";
import { FileText, History, Layers3, Pencil, RotateCcw, Scale, Search, ShieldCheck, UploadCloud, WandSparkles } from "@/components/lucide-icons";
import type { LucideIcon } from "@/components/lucide-icons";
import {
getContractTemplateHistory,
getContractTemplateDiff,
@@ -0,0 +1,74 @@
"use client";
// lucide-react 1.x uses React context internally. Re-export the icons that are
// rendered by server pages through a client boundary so RSC never evaluates
// that context on the server.
export {
Activity,
AlertTriangle,
ArrowLeft,
ArrowRight,
Bell,
BellRing,
BookMarked,
BookOpen,
BookOpenText,
Bot,
Building2,
Check,
CheckCircle,
CheckCircle2,
CheckSquare,
ChevronLeft,
ChevronRight,
ClipboardList,
Clock,
Clock3,
Database,
DatabaseZap,
Download,
FileCheck2,
FileClock,
FilePlus2,
FileSearch,
FileSignature,
FileText,
FileWarning,
Filter,
Fingerprint,
FlaskConical,
Gauge,
Gavel,
GitBranch,
Headphones,
History,
Landmark,
Layers3,
LibraryBig,
Link2,
ListChecks,
ListFilter,
LockKeyhole,
Pencil,
Quote,
RotateCcw,
Route,
Scale,
ScrollText,
Search,
ServerCog,
Settings,
ShieldAlert,
ShieldCheck,
SlidersHorizontal,
Sparkles,
Target,
TrendingUp,
UploadCloud,
UserSearch,
UsersRound,
WandSparkles,
XCircle,
} from "lucide-react";
export type { LucideIcon } from "lucide-react";
@@ -1,5 +1,5 @@
import Link from "next/link";
import { FilePlus2, FileSearch, Gavel, Search, ShieldCheck, UploadCloud } from "lucide-react";
import { FilePlus2, FileSearch, Gavel, Search, ShieldCheck, UploadCloud } from "@/components/lucide-icons";
import { MemberHero } from "@yuqei/design-system";
import { getWorkspaceTasks, type WorkspaceTask } from "@/services/contracts";
import { OnboardingGuide } from "@/components/onboarding-guide";