Tabbed Feature Matrix
blockmarketingInteractive enterprise product feature workbench with live module simulations, dynamic directory filters, real-time payroll calculations, continuous SOC 2 compliance verification, and TypeScript API code viewer.
Installation
$pnpm dlx shadcn@latest add https://uipkge.dev/r/lit/features-01.json$npx shadcn@latest add https://uipkge.dev/r/lit/features-01.json$yarn dlx shadcn@latest add https://uipkge.dev/r/lit/features-01.json$bunx shadcn@latest add https://uipkge.dev/r/lit/features-01.jsonManifest:
https://uipkge.dev/r/lit/features-01.jsonInstalls to:src/uip/blocks/features-01/Variants
Loading interactive previews…
Loading interactive previews…
Schema
Type aliases exported from this item's source. Use these to shape the data you pass in.
FeatureModuleinterface FeatureModule {
id: string
title: string
category: 'core' | 'dx' | 'security' | 'ai'
badge: string
description: string
icon: IconNode
iconName: string
metrics: { label: string; value: string; trend: string }[]
previewType: 'directory' | 'payroll' | 'performance' | 'compliance' | 'api' | 'copilot'
}HTMLElementTagNameMapinterface HTMLElementTagNameMap {
'uip-features-01': UipFeatures01
}
}Files installed (2)
src/uip/blocks/features-01/features-01.ts16.9 kB
import { LitElement, css, html, nothing } from 'lit' import { ArrowRight, BarChart3, Bot, Check, ChevronRight, Code2, Copy, Layers, ShieldCheck, Users, Wallet, type IconNode, } from 'lucide' import { cn } from '../../lib/utils' import { tailwind } from '../../lib/styles' import { ThemeController } from '../../lib/theme' import { icon } from '../../lib/icon' // Side-effect imports: register the composed elements for standalone use // (consumers who install only this block still get working primitives). import '../../components/badge/badge' import '../../components/button/button' import { renderApi, renderCompliance, renderCopilot, renderDirectory, renderPayroll } from './simulations' interface FeatureModule { id: string title: string category: 'core' | 'dx' | 'security' | 'ai' badge: string description: string icon: IconNode iconName: string metrics: { label: string; value: string; trend: string }[] previewType: 'directory' | 'payroll' | 'performance' | 'compliance' | 'api' | 'copilot' } const features: FeatureModule[] = [ { id: 'directory', title: 'Global Employee Directory', category: 'core', badge: 'Real-time Sync', description: 'Single source of truth for global teams, reporting hierarchies, custom attributes, and automated SCIM provisioning.', icon: Users, iconName: 'users', metrics: [ { label: 'Sync Latency', value: '<12ms', trend: 'P99 Edge' }, { label: 'SCIM Connectors', value: '24+', trend: 'Okta/Google' }, { label: 'Export Formats', value: 'JSON/CSV', trend: 'Bi-directional' }, ], previewType: 'directory', }, { id: 'payroll', title: 'Multi-Currency Global Payroll', category: 'core', badge: 'Automated Tax', description: 'Instant payroll calculation across 140+ countries with automated localized tax withholding, statutory benefits, and direct FX routing.', icon: Wallet, iconName: 'wallet', metrics: [ { label: 'Supported Currencies', value: '140+', trend: 'Live FX' }, { label: 'Settlement Time', value: 'Instant', trend: 'SEPA/FedNow' }, { label: 'Tax Accuracy', value: '100%', trend: 'Statutory Verified' }, ], previewType: 'payroll', }, { id: 'performance', title: 'OKR & Continuous Reviews', category: 'dx', badge: '360 Calibration', description: 'Transparent objective tracking, real-time 1:1 syncs, and peer review cycles tied directly to engineering and business milestones.', icon: BarChart3, iconName: 'chart-column', metrics: [ { label: 'Cycle Completion', value: '98.4%', trend: '+14% vs avg' }, { label: 'Review Latency', value: '2.1 days', trend: '-40% faster' }, { label: 'Goal Alignment', value: '94%', trend: 'Company-wide' }, ], previewType: 'performance', }, { id: 'compliance', title: 'SOC 2 & Continuous Compliance', category: 'security', badge: 'Zero Trust', description: 'Continuous automated evidence collection across AWS, GCP, Cloudflare, and GitHub with automated auditor-ready export bundles.', icon: ShieldCheck, iconName: 'shield-check', metrics: [ { label: 'Continuous Tests', value: '142 / 142', trend: '100% Pass' }, { label: 'Evidence Collection', value: 'Automated', trend: 'Every 5m' }, { label: 'Standards', value: 'SOC2 / HIPAA', trend: 'ISO 27001' }, ], previewType: 'compliance', }, { id: 'api', title: 'REST & GraphQL Developer APIs', category: 'dx', badge: 'Type-Safe SDKs', description: 'Fully typed OpenAPI 3.1 & TypeScript SDKs with sub-millisecond edge response times, webhooks, and granular scoped API keys.', icon: Code2, iconName: 'code-2', metrics: [ { label: 'API Median Latency', value: '18ms', trend: 'Global Edge' }, { label: 'Webhook Delivery', value: '99.98%', trend: 'Automatic Retry' }, { label: 'Rate Limit', value: '10k req/s', trend: 'Configurable' }, ], previewType: 'api', }, { id: 'copilot', title: 'Autonomous People Ops Copilot', category: 'ai', badge: 'Agentic AI', description: 'Natural language queries over workforce data, intelligent anomaly detection in compensation bands, and automated policy drafts.', icon: Bot, iconName: 'bot', metrics: [ { label: 'Inference Speed', value: '94 tps', trend: 'Claude 3.5' }, { label: 'Accuracy Score', value: '99.6%', trend: 'RAG Grounded' }, { label: 'Task Automation', value: '78%', trend: 'Self-serve' }, ], previewType: 'copilot', }, ] /** * <uip-features-01> — the registry Features01 block as a web component. * * Class strings are React's Features01 verbatim. React state (useState) * becomes @state fields; the copy-label and copilot timeouts are cleared in * `disconnectedCallback`. The five live simulations live in * `./simulations.ts` (same install unit, shipped together) and read/write * the element's public simulation fields. React's `performance` previewType * has no simulation branch in the source, so that canvas renders empty here * too. Card chrome stays plain divs carrying the registry Card part classes * (see the login-01 block). */ export class UipFeatures01 extends LitElement { static shadowRootOptions = { ...LitElement.shadowRootOptions, delegatesFocus: true } // :host display can't be a utility class (the host has no template of its own). static styles = [tailwind, css`:host { display: block; }`] static properties = { activeCategory: { state: true }, selectedFeatureId: { state: true }, copied: { state: true }, dirQuery: { state: true }, dirTeam: { state: true }, headcount: { state: true }, copilotPrompt: { state: true }, copilotExecuting: { state: true }, copilotOutput: { state: true }, } private activeCategory: 'all' | 'core' | 'dx' | 'security' | 'ai' = 'all' private selectedFeatureId = 'directory' private copied = false /** Simulation state (read by ./simulations.ts). */ dirQuery = '' dirTeam = 'All Roles' headcount = 42 copilotPrompt = 'Generate quarterly SOC2 compliance audit report with automated PR proof attachments.' copilotExecuting = false copilotOutput = 'Audit summary generated. 14 evidence logs compiled across 4 AWS & Cloudflare regions. Zero critical findings.' private copyTimer?: number private copilotTimer?: number constructor() { super() new ThemeController(this) } connectedCallback() { super.connectedCallback() this.setAttribute('data-uipkge', '') this.setAttribute('data-slot', 'features-01') } disconnectedCallback() { super.disconnectedCallback() if (this.copyTimer) window.clearTimeout(this.copyTimer) if (this.copilotTimer) window.clearTimeout(this.copilotTimer) } private get filteredFeatures() { if (this.activeCategory === 'all') return features return features.filter((f) => f.category === this.activeCategory) } /** Simulation action (called by ./simulations.ts). */ triggerCopilot() { this.copilotExecuting = true this.copilotOutput = 'Analyzing real-time event bus and compiling cryptographically signed evidence bundle...' if (this.copilotTimer) window.clearTimeout(this.copilotTimer) this.copilotTimer = window.setTimeout(() => { this.copilotOutput = '✓ SOC 2 Type II bundle validated. 142 controls verified at 100% adherence. Ready for auditor download.' this.copilotExecuting = false }, 900) } private copySnippet(text: string) { try { navigator.clipboard?.writeText(text)?.catch(() => {}) } catch { // Clipboard unavailable (insecure context): still flash the label. } this.copied = true if (this.copyTimer) window.clearTimeout(this.copyTimer) this.copyTimer = window.setTimeout(() => { this.copied = false }, 2000) } render() { const activeFeature = features.find((f) => f.id === this.selectedFeatureId) ?? features[0] return html` <section data-slot="features-01" class="bg-background border-border relative w-full border-y py-16 lg:py-24"> <div class="mx-auto max-w-7xl space-y-12 px-4 sm:px-6 lg:px-8"> <div class="flex flex-col gap-6 md:flex-row md:items-end md:justify-between"> <div class="max-w-2xl space-y-3"> <div class="inline-flex items-center gap-2"> <uip-badge variant="outline" class="border-primary/30 text-primary bg-primary/5 gap-1.5 px-2.5 py-1 font-mono text-xs tracking-wide uppercase" > ${icon(Layers, 'layers', 'size-3.5')} Unified Architecture </uip-badge> <span class="text-muted-foreground font-mono text-xs">v4.2 Enterprise Release</span> </div> <h2 class="text-foreground text-3xl font-bold tracking-tight sm:text-4xl"> Engineered for High-Velocity Teams. </h2> <p class="text-muted-foreground text-base leading-relaxed sm:text-lg"> Six modular, composable building blocks that directly interconnect without third-party glue code. </p> </div> <div class="bg-muted/60 border-border flex flex-wrap items-center gap-1.5 rounded-lg border p-1"> ${[ { id: 'all', label: 'All Modules' }, { id: 'core', label: 'Core Platform' }, { id: 'dx', label: 'Developer DX' }, { id: 'security', label: 'Security' }, { id: 'ai', label: 'Agentic AI' }, ].map( (cat) => html`<button type="button" class=${cn( 'rounded-md px-3 py-1.5 text-xs font-medium transition-colors', this.activeCategory === cat.id ? 'bg-background text-foreground font-semibold shadow-xs' : 'text-muted-foreground hover:text-foreground', )} @click=${() => { this.activeCategory = cat.id as 'all' | 'core' | 'dx' | 'security' | 'ai' }} > ${cat.label} </button>`, )} </div> </div> <div class="grid grid-cols-1 items-start gap-8 lg:grid-cols-12"> <div class="space-y-3 lg:col-span-5"> ${this.filteredFeatures.map((item) => { const isSelected = this.selectedFeatureId === item.id return html`<div class=${cn( 'group cursor-pointer rounded-xl border p-4 transition-colors duration-150', isSelected ? 'bg-card border-primary/40 ring-primary/20 shadow-xs ring-1' : 'bg-card/40 border-border hover:bg-card/80 hover:border-border/80', )} @click=${() => { this.selectedFeatureId = item.id }} > <div class="flex items-start justify-between gap-3"> <div class="flex items-center gap-3"> <div class=${cn( 'flex size-9 items-center justify-center rounded-lg border transition-colors', isSelected ? 'bg-primary text-primary-foreground border-primary' : 'bg-muted text-muted-foreground border-border group-hover:text-foreground', )} > ${icon(item.icon, item.iconName, 'size-4.5')} </div> <div> <div class="flex items-center gap-2"> <h3 class="text-foreground text-sm font-semibold tracking-tight">${item.title}</h3> <uip-badge variant="secondary" class="px-1.5 py-0 text-xs font-normal" >${item.badge}</uip-badge > </div> <p class="text-muted-foreground mt-0.5 line-clamp-1 text-xs">${item.description}</p> </div> </div> ${icon( ChevronRight, 'chevron-right', cn( 'text-muted-foreground size-4 shrink-0 transition-transform', isSelected ? 'text-primary translate-x-0.5' : 'group-hover:translate-x-0.5', ), )} </div> ${isSelected ? html`<div class="border-border/60 mt-4 grid grid-cols-3 gap-2 border-t pt-3"> ${item.metrics.map( (m) => html`<div class="space-y-0.5"> <p class="text-muted-foreground font-mono text-xs tracking-wider uppercase">${m.label}</p> <div class="flex items-baseline gap-1"> <span class="text-foreground text-xs font-semibold">${m.value}</span> <span class="text-success font-mono text-xs">${m.trend}</span> </div> </div>`, )} </div>` : nothing} </div>` })} </div> <div class="lg:col-span-7"> <div data-uipkge="" data-slot="card" class="bg-card text-card-foreground rounded-xl border border-border shadow-sm transition-colors duration-150 overflow-hidden sticky top-6" > <div data-uipkge="" data-slot="card-header" class="grid auto-rows-min grid-cols-[minmax(0,1fr)] grid-rows-[auto_auto] items-start gap-1.5 p-6 has-data-[slot=card-action]:grid-cols-[minmax(0,1fr)_auto] border-border bg-muted/20 flex-row items-center justify-between space-y-0 border-b px-5 py-3.5" > <div class="flex items-center gap-2.5"> <div class="bg-success flex size-2 animate-pulse rounded-full"></div> <span class="text-muted-foreground font-mono text-xs tracking-wider uppercase"> Interactive Simulation </span> <div data-uipkge="" data-slot="separator" data-orientation="vertical" role="none" class="bg-border shrink-0 w-px h-3.5" ></div> <span class="text-foreground text-xs font-semibold">${activeFeature.title}</span> </div> <div class="flex items-center gap-2"> <uip-button variant="outline" size="sm" class="h-7 gap-1.5 px-2.5 font-mono text-xs" @click=${() => this.copySnippet(JSON.stringify(activeFeature, null, 2))} > ${this.copied ? icon(Check, 'check', 'text-success size-3') : icon(Copy, 'copy', 'size-3')} <span>${this.copied ? 'Copied' : 'Schema JSON'}</span> </uip-button> </div> </div> <div data-uipkge="" data-slot="card-content" class="space-y-6 p-6 pt-0"> ${activeFeature.previewType === 'directory' ? renderDirectory(this) : nothing} ${activeFeature.previewType === 'payroll' ? renderPayroll(this) : nothing} ${activeFeature.previewType === 'compliance' ? renderCompliance() : nothing} ${activeFeature.previewType === 'api' ? renderApi() : nothing} ${activeFeature.previewType === 'copilot' ? renderCopilot(this) : nothing} </div> <div data-uipkge="" data-slot="card-footer" class="flex items-center border-t border-border bg-muted/10 px-5 py-3 text-xs" > <span class="text-muted-foreground font-mono"> Architecture SLA: 99.99% Multi-region Active-Active </span> <uip-button variant="link" size="sm" class="text-primary h-auto gap-1 p-0 text-xs [&::part(base)]:h-auto [&::part(base)]:gap-1 [&::part(base)]:p-0 [&::part(base)]:text-xs" > Explore Full Documentation ${icon(ArrowRight, 'arrow-right', 'size-3.5')} </uip-button> </div> </div> </div> </div> </div> </section> ` } } customElements.get('uip-features-01') || customElements.define('uip-features-01', UipFeatures01) declare global { interface HTMLElementTagNameMap { 'uip-features-01': UipFeatures01 } }src/uip/blocks/features-01/simulations.ts10.5 kB
import { html } from 'lit' import { Bot, CheckCircle2, Globe, RefreshCw, Search } from 'lucide' import { icon } from '../../lib/icon' import type { UipInput } from '../../components/input/input' import type { UipFeatures01 } from './features-01' // Live simulation canvases for <uip-features-01>. Same install unit (every // .ts in this dir ships with the block); class strings are React's // DirectorySimulation / PayrollSimulation / ComplianceSimulation / // ApiSimulation / CopilotSimulation verbatim. const initialEmployees = [ { id: '1', name: 'Sophia Chen', role: 'Staff Design Engineer', team: 'Design Systems', status: 'Active', location: 'San Francisco, CA', }, { id: '2', name: 'Marcus Vance', role: 'Principal Distributed Systems', team: 'Core Infrastructure', status: 'Active', location: 'London, UK', }, { id: '3', name: 'Elena Rostova', role: 'Lead Security Architect', team: 'SecOps', status: 'In Review', location: 'Berlin, DE', }, { id: '4', name: 'Devon Taylor', role: 'Head of Product', team: 'Enterprise Suite', status: 'Active', location: 'New York, NY', }, ] const controls = [ { name: 'TLS 1.3 Strict Transport Security', framework: 'SOC 2 / ISO 27001', passed: true, score: '100%' }, { name: 'Continuous Automated Evidence Sync', framework: 'HIPAA Security Rule', passed: true, score: '99.8%' }, { name: 'Hardware Security Keys MFA Enforced', framework: 'Zero Trust Baseline', passed: true, score: '100%' }, { name: 'Automated Ephemeral DB Credential TTL', framework: 'SOC 2 CC6.1', passed: true, score: '99.4%' }, ] const GROSS_AMOUNT = 184000 const PAYROLL_TAX_RATE = 18.5 export function renderDirectory(el: UipFeatures01) { const q = el.dirQuery.toLowerCase() const filteredEmployees = initialEmployees.filter((emp) => { const matchQuery = emp.name.toLowerCase().includes(q) || emp.role.toLowerCase().includes(q) const matchRole = el.dirTeam === 'All Roles' || emp.team === el.dirTeam return matchQuery && matchRole }) return html`<div class="space-y-4"> <div class="flex flex-col items-center justify-between gap-3 sm:flex-row"> <uip-input class="w-full sm:w-64 h-8 font-sans text-xs" .value=${el.dirQuery} @input=${(e: Event) => { el.dirQuery = (e.target as UipInput).value }} placeholder="Search 1,420 employees..." > <span slot="prefix">${icon(Search, 'search', 'size-3.5')}</span> </uip-input> <div class="flex items-center gap-2 self-end sm:self-auto"> <span class="text-muted-foreground font-mono text-xs">Filter Team:</span> <select .value=${el.dirTeam} @change=${(e: Event) => { el.dirTeam = (e.target as HTMLSelectElement).value }} class="border-input bg-background text-foreground focus:ring-ring h-8 rounded-md border px-2 py-1 text-xs focus:ring-1 focus:outline-none" > <option value="All Roles">All Teams</option> <option value="Design Systems">Design Systems</option> <option value="Core Infrastructure">Core Infrastructure</option> <option value="SecOps">SecOps</option> <option value="Enterprise Suite">Enterprise Suite</option> </select> </div> </div> <div class="border-border divide-border bg-background divide-y overflow-hidden rounded-lg border"> ${filteredEmployees.map( (emp) => html`<div class="hover:bg-muted/40 flex items-center justify-between p-3 text-xs transition-colors"> <div class="flex items-center gap-3"> <div class="bg-primary/10 text-primary border-primary/20 flex size-8 items-center justify-center rounded-full border text-xs font-semibold" > ${emp.name .split(' ') .map((n) => n[0]) .join('')} </div> <div> <p class="text-foreground font-medium">${emp.name}</p> <p class="text-muted-foreground text-xs">${emp.role} · ${emp.team}</p> </div> </div> <div class="flex items-center gap-3"> <span class="text-muted-foreground hidden font-mono text-xs sm:inline-block">${emp.location}</span> <uip-badge variant="outline" class="border-success/20 bg-success/10 text-success font-mono text-xs"> ${emp.status} </uip-badge> </div> </div>`, )} </div> </div>` } export function renderPayroll(el: UipFeatures01) { const estimatedDeductions = GROSS_AMOUNT * (PAYROLL_TAX_RATE / 100) const netPayout = GROSS_AMOUNT - estimatedDeductions return html`<div class="space-y-5"> <div class="grid grid-cols-3 gap-3"> <div class="border-border bg-muted/20 rounded-lg border p-3"> <p class="text-muted-foreground font-mono text-xs">Gross Run</p> <p class="text-foreground mt-1 text-lg font-bold">$${GROSS_AMOUNT.toLocaleString()}</p> </div> <div class="border-border bg-muted/20 rounded-lg border p-3"> <p class="text-muted-foreground font-mono text-xs">Statutory Taxes</p> <p class="text-destructive mt-1 text-lg font-bold">-$${Math.round(estimatedDeductions).toLocaleString()}</p> </div> <div class="border-border border-success/20 bg-success/10 rounded-lg border p-3"> <p class="text-success font-mono text-xs">Net Settlement</p> <p class="text-success mt-1 text-lg font-bold">$${Math.round(netPayout).toLocaleString()}</p> </div> </div> <div class="space-y-2"> <div class="flex justify-between text-xs"> <span class="text-muted-foreground">Adjust Headcount (Employees: ${el.headcount})</span> <span class="text-foreground font-mono">$${(GROSS_AMOUNT / el.headcount).toFixed(0)}/mo avg</span> </div> <input .value=${String(el.headcount)} @input=${(e: Event) => { el.headcount = Number((e.target as HTMLInputElement).value) }} type="range" min="10" max="150" class="bg-muted accent-primary h-1.5 w-full cursor-pointer appearance-none rounded-lg" /> </div> <div class="border-border bg-background flex items-center justify-between rounded-lg border p-3 text-xs"> <div class="flex items-center gap-2"> ${icon(Globe, 'globe', 'text-primary size-4')} <span>Cross-border SEPA & FedNow Instant Payout Batch: Ready</span> </div> <uip-badge variant="secondary" class="font-mono text-xs">Zero-FX Spread</uip-badge> </div> </div>` } export function renderCompliance() { return html`<div class="space-y-4"> <div class="flex items-center justify-between text-xs"> <span class="text-foreground font-semibold">Continuous Automated Compliance Check (142 Controls)</span> <uip-badge variant="outline" class="border-success/20 bg-success/10 text-success font-mono text-xs"> Audit Grade A+ </uip-badge> </div> <div class="space-y-2.5"> ${controls.map( (ctrl) => html`<div class="border-border bg-background flex items-center justify-between rounded-lg border p-3 text-xs"> <div class="flex items-center gap-2.5"> ${icon(CheckCircle2, 'circle-check-big', 'text-success size-4 shrink-0')} <div> <p class="text-foreground font-medium">${ctrl.name}</p> <p class="text-muted-foreground font-mono text-xs">${ctrl.framework}</p> </div> </div> <span class="text-success font-mono text-xs font-semibold">${ctrl.score}</span> </div>`, )} </div> </div>` } export function renderApi() { return html`<div class="space-y-4"> <div class="flex items-center justify-between"> <span class="text-muted-foreground font-mono text-xs"> curl --request POST https://api.uipkge.dev/v1/workforce </span> <uip-badge variant="secondary" class="font-mono text-xs">TypeScript SDK</uip-badge> </div> <div class="overflow-x-auto rounded-lg border border-zinc-800 bg-zinc-950 p-4 font-mono text-xs leading-relaxed text-zinc-100" > <span class="text-muted-foreground">// Initialize client with zero-latency edge caching</span> <br /> <span class="text-chart-1">import</span> { <span class="text-chart-2">UipkgeClient</span> } <span class="text-chart-1">from</span> <span class="text-success">'@uipkge/sdk'</span> <br /> <br /> <span class="text-chart-1">const</span> client = <span class="text-chart-1">new</span> <span class="text-chart-2">UipkgeClient</span>({ apiKey: process.env.<span class="text-info">UIPKGE_KEY</span> })<br /> <br /> <span class="text-chart-1">const</span> { data } = <span class="text-chart-1">await</span> client.directory.<span class="text-info" >syncOrgChart</span >({<br /> autoProvision: <span class="text-success">true</span>,<br /> enforceMfa: <span class="text-success">true</span>,<br /> scimSyncInterval: <span class="text-warning">300</span>,<br /> }) </div> </div>` } export function renderCopilot(el: UipFeatures01) { return html`<div class="space-y-4"> <div class="space-y-2"> <label class="text-foreground text-xs font-medium">Natural Language Workforce Assistant</label> <div class="flex gap-2"> <uip-input .value=${el.copilotPrompt} @input=${(e: Event) => { el.copilotPrompt = (e.target as UipInput).value }} class="h-9 text-xs" placeholder="Ask copilot to run calculations or compliance checks..." ></uip-input> <uip-button size="sm" class="h-9 shrink-0 gap-1.5 px-4 text-xs font-semibold" ?disabled=${el.copilotExecuting} @click=${() => el.triggerCopilot()} > ${el.copilotExecuting ? icon(RefreshCw, 'refresh-cw', 'size-3.5 animate-spin') : icon(Bot, 'bot', 'size-3.5')} Run </uip-button> </div> </div> <div class="border-border bg-muted/20 space-y-2 rounded-lg border p-4"> <div class="flex items-center justify-between text-xs"> <span class="text-muted-foreground font-mono text-xs">Copilot Real-time Synthesis</span> <uip-badge variant="outline" class="font-mono text-xs">Claude 3.5 Sonnet</uip-badge> </div> <p class="text-foreground bg-background border-border rounded-md border p-3 font-mono text-xs leading-relaxed"> ${el.copilotOutput} </p> </div> </div>` }
Raw manifest:https://uipkge.dev/r/lit/features-01.json