Jake Shore 96e52666c5 MCPEngine full sync — studio scaffold, factory v2, server updates, state.json — 2026-02-12
=== NEW ===
- studio/ — MCPEngine Studio scaffold (Next.js monorepo, build plan)
- docs/FACTORY-V2.md — Factory v2 architecture doc
- docs/CALENDLY_MCP_BUILD_SUMMARY.md — Calendly MCP build report

=== UPDATED SERVERS ===
- fieldedge: Added jobs-tools, UI build script, main entry update
- lightspeed: Updated main + server entry points
- squarespace: Added collection-browser + page-manager apps
- toast: Added main + server entry points

=== INFRA ===
- infra/command-center/state.json — Updated pipeline state
- infra/command-center/FACTORY-V2.md — Factory v2 operator playbook
2026-02-12 17:58:33 -05:00

62 lines
1.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React from 'react';
import { clsx } from 'clsx';
import { twMerge } from 'tailwind-merge';
export type ProgressColor = 'indigo' | 'emerald';
export interface ProgressBarProps {
percent?: number; // 0100, ignored in indeterminate mode
color?: ProgressColor;
indeterminate?: boolean;
className?: string;
height?: 'sm' | 'md' | 'lg';
}
const colorMap: Record<ProgressColor, string> = {
indigo: 'bg-indigo-500',
emerald: 'bg-emerald-500',
};
const heightMap: Record<string, string> = {
sm: 'h-1',
md: 'h-2',
lg: 'h-3',
};
export const ProgressBar: React.FC<ProgressBarProps> = ({
percent = 0,
color = 'indigo',
indeterminate = false,
className,
height = 'md',
}) => {
const clamped = Math.max(0, Math.min(100, percent));
return (
<div
role="progressbar"
aria-valuenow={indeterminate ? undefined : clamped}
aria-valuemin={0}
aria-valuemax={100}
className={twMerge(
clsx(
'w-full rounded-full overflow-hidden bg-gray-800',
heightMap[height],
),
className,
)}
>
<div
className={clsx(
'h-full rounded-full transition-all duration-500 ease-out',
colorMap[color],
indeterminate && 'animate-[indeterminate_1.5s_ease-in-out_infinite] w-1/3',
)}
style={indeterminate ? undefined : { width: `${clamped}%` }}
/>
</div>
);
};
ProgressBar.displayName = 'ProgressBar';