Add prominent counsel-return CTA to institutional compliance hub.
Some checks failed
CD Pipeline / Deploy to Staging (push) Failing after 36s
CI Pipeline / Lint and Type Check (push) Failing after 30s
CI Pipeline / Build (push) Has been skipped
CI Pipeline / Test Backend (push) Failing after 1m37s
CI Pipeline / Test Frontend (push) Failing after 29s
CI Pipeline / Security Scan (push) Failing after 1m41s
Deploy to Staging / Deploy to Staging (push) Failing after 29s
Portal CI / Portal Lint (push) Failing after 20s
Portal CI / Portal Type Check (push) Failing after 20s
Portal CI / Portal Test (push) Failing after 21s
Portal CI / Portal Build (push) Failing after 20s
Test Suite / frontend-tests (push) Failing after 32s
Test Suite / api-tests (push) Failing after 57s
Test Suite / blockchain-tests (push) Failing after 30s
Type Check / type-check (map[directory:. name:root]) (push) Failing after 22s
Type Check / type-check (map[directory:api name:api]) (push) Failing after 21s
Type Check / type-check (map[directory:portal name:portal]) (push) Failing after 22s
CD Pipeline / Deploy to Production (push) Has been skipped
Some checks failed
CD Pipeline / Deploy to Staging (push) Failing after 36s
CI Pipeline / Lint and Type Check (push) Failing after 30s
CI Pipeline / Build (push) Has been skipped
CI Pipeline / Test Backend (push) Failing after 1m37s
CI Pipeline / Test Frontend (push) Failing after 29s
CI Pipeline / Security Scan (push) Failing after 1m41s
Deploy to Staging / Deploy to Staging (push) Failing after 29s
Portal CI / Portal Lint (push) Failing after 20s
Portal CI / Portal Type Check (push) Failing after 20s
Portal CI / Portal Test (push) Failing after 21s
Portal CI / Portal Build (push) Failing after 20s
Test Suite / frontend-tests (push) Failing after 32s
Test Suite / api-tests (push) Failing after 57s
Test Suite / blockchain-tests (push) Failing after 30s
Type Check / type-check (map[directory:. name:root]) (push) Failing after 22s
Type Check / type-check (map[directory:api name:api]) (push) Failing after 21s
Type Check / type-check (map[directory:portal name:portal]) (push) Failing after 22s
CD Pipeline / Deploy to Production (push) Has been skipped
Splits counsel portals into a dedicated panel and syncs manifest with Gitea issue template URL. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
import { ArrowRight, Building2, Globe2, Scale, ShieldAlert } from 'lucide-react';
|
||||
import { ArrowRight, Building2, FileText, Globe2, Scale, ShieldAlert } from 'lucide-react';
|
||||
import Link from 'next/link';
|
||||
|
||||
import {
|
||||
institutionalUx,
|
||||
jurisdictionStatusClass,
|
||||
type InstitutionalPortal,
|
||||
type JurisdictionCard,
|
||||
type LegalTrack,
|
||||
type OnboardingStep,
|
||||
@@ -13,6 +14,9 @@ export function InstitutionalComplianceHub() {
|
||||
const { disclaimer, legalTracks, onboardingJourney, jurisdictionCards, portals, prohibitedClaimsPreview } =
|
||||
institutionalUx;
|
||||
|
||||
const counselPortals = portals.filter((p) => p.audience === 'counsel');
|
||||
const institutionalPortals = portals.filter((p) => p.audience !== 'counsel');
|
||||
|
||||
return (
|
||||
<section
|
||||
id="institutional-compliance"
|
||||
@@ -79,22 +83,33 @@ export function InstitutionalComplianceHub() {
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
{/* Counsel return — external counsel */}
|
||||
{counselPortals.length > 0 ? (
|
||||
<div className="mt-12 rounded-xl border border-indigo-500/25 bg-indigo-500/5 p-6">
|
||||
<div className="flex flex-col gap-5 lg:flex-row lg:items-center lg:justify-between">
|
||||
<div className="max-w-xl">
|
||||
<div className="inline-flex items-center gap-2 text-sm font-semibold text-indigo-200">
|
||||
<FileText className="h-4 w-4" aria-hidden />
|
||||
External counsel returns
|
||||
</div>
|
||||
<p className="mt-2 text-xs leading-relaxed text-sovereign-ivory/55">
|
||||
Track A checklist and Track B WP-1–4 deliverables — signed matrices, memoranda PDFs, and gap
|
||||
register. Preferred channel: Gitea issue with the counsel-return template.
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex flex-wrap gap-3">
|
||||
{counselPortals.map((p) => (
|
||||
<CounselPortalButton key={p.id} portal={p} primary={p.id === 'legal-issues'} />
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
{/* Portal links */}
|
||||
<div className="mt-10 flex flex-wrap gap-3">
|
||||
{portals.map((p) => (
|
||||
<Link
|
||||
key={p.id}
|
||||
href={p.href}
|
||||
className="inline-flex items-center gap-1.5 rounded-lg border border-gray-700 bg-gray-900/50 px-4 py-2 text-sm font-medium text-orange-300 no-underline transition hover:border-orange-500/40 hover:text-orange-200"
|
||||
>
|
||||
{p.id.includes('onboard') ? (
|
||||
<Building2 className="h-4 w-4" aria-hidden />
|
||||
) : (
|
||||
<Globe2 className="h-4 w-4" aria-hidden />
|
||||
)}
|
||||
{p.label}
|
||||
<ArrowRight className="h-3.5 w-3.5" aria-hidden />
|
||||
</Link>
|
||||
{institutionalPortals.map((p) => (
|
||||
<PortalLink key={p.id} portal={p} />
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
@@ -102,6 +117,37 @@ export function InstitutionalComplianceHub() {
|
||||
);
|
||||
}
|
||||
|
||||
function CounselPortalButton({ portal, primary }: { portal: InstitutionalPortal; primary?: boolean }) {
|
||||
const className = primary
|
||||
? 'inline-flex items-center gap-1.5 rounded-lg border border-indigo-400/50 bg-indigo-500/20 px-4 py-2.5 text-sm font-semibold text-indigo-100 no-underline transition hover:border-indigo-300/60 hover:bg-indigo-500/30'
|
||||
: 'inline-flex items-center gap-1.5 rounded-lg border border-gray-700 bg-gray-900/50 px-4 py-2.5 text-sm font-medium text-indigo-200 no-underline transition hover:border-indigo-500/40 hover:text-indigo-100';
|
||||
|
||||
return (
|
||||
<Link href={portal.href} className={className}>
|
||||
<FileText className="h-4 w-4" aria-hidden />
|
||||
{portal.label}
|
||||
<ArrowRight className="h-3.5 w-3.5" aria-hidden />
|
||||
</Link>
|
||||
);
|
||||
}
|
||||
|
||||
function PortalLink({ portal }: { portal: InstitutionalPortal }) {
|
||||
return (
|
||||
<Link
|
||||
href={portal.href}
|
||||
className="inline-flex items-center gap-1.5 rounded-lg border border-gray-700 bg-gray-900/50 px-4 py-2 text-sm font-medium text-orange-300 no-underline transition hover:border-orange-500/40 hover:text-orange-200"
|
||||
>
|
||||
{portal.id.includes('onboard') ? (
|
||||
<Building2 className="h-4 w-4" aria-hidden />
|
||||
) : (
|
||||
<Globe2 className="h-4 w-4" aria-hidden />
|
||||
)}
|
||||
{portal.label}
|
||||
<ArrowRight className="h-3.5 w-3.5" aria-hidden />
|
||||
</Link>
|
||||
);
|
||||
}
|
||||
|
||||
function LegalTrackCard({ track }: { track: LegalTrack }) {
|
||||
return (
|
||||
<Link
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generatedAt": "2026-06-15T19:09:04.567Z",
|
||||
"generatedAt": "2026-06-15T20:07:36.006Z",
|
||||
"source": "config/institutional-ux-ui.v1.json",
|
||||
"disclaimer": "Informational engineering readiness only — not legal advice, a regulatory determination, or an audit certificate. Counsel owns statutory interpretation.",
|
||||
"legalTracks": [
|
||||
@@ -114,7 +114,7 @@
|
||||
{
|
||||
"id": "legal-issues",
|
||||
"label": "Open counsel return issue",
|
||||
"href": "https://gitea.d-bis.org/HOSPITALLERS/legal/issues/new",
|
||||
"href": "https://gitea.d-bis.org/HOSPITALLERS/legal/issues/new?template=counsel-wp-return",
|
||||
"audience": "counsel"
|
||||
}
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user