commit 6a6ca780a3b6a691945b755ed9e73242befc97b4 Author: sBubshait Date: Sat Jun 13 15:59:39 2026 +0100 first commit diff --git a/app.js b/app.js new file mode 100644 index 0000000..4d93073 --- /dev/null +++ b/app.js @@ -0,0 +1,697 @@ +// FPGABench Model Dataset +// Metrics: +// - feasible: Feasible@1 (adapted pass@1) as a decimal fraction (0.0 to 1.0) +// - moq: MOQ@1 (mean design quality index) normalized around 1.0 (higher is better) +const modelsData = [ + { + id: "gpt-5", + name: "GPT-5", + developer: "OpenAI", + type: "Proprietary", + feasible: 25 / 52, + moq: 1.15, + lutCount: 2180, + frequency: 212.5, + power: 0.24, + link: "https://openai.com" + }, + { + id: "gemini-3-pro", + name: "Gemini 3 Pro", + developer: "Google", + type: "Proprietary", + feasible: 22 / 52, + moq: 1.05, + lutCount: 2250, + frequency: 205.0, + power: 0.26, + link: "https://deepmind.google" + }, + { + id: "claude-sonnet-4-5", + name: "Claude Sonnet 4.5", + developer: "Anthropic", + type: "Proprietary", + feasible: 19 / 52, + moq: 1.11, + lutCount: 2210, + frequency: 208.4, + power: 0.25, + link: "https://anthropic.com" + }, + { + id: "kimi-k2-5", + name: "Kimi K2.5", + developer: "Moonshot AI", + type: "Proprietary", + feasible: 17 / 52, + moq: 1.23, + lutCount: 2020, + frequency: 228.2, + power: 0.21, + link: "https://www.moonshot.cn" + }, + { + id: "deepseek-v3", + name: "DeepSeek V3", + developer: "DeepSeek", + type: "Open Source", + feasible: 9 / 52, + moq: 1.22, + lutCount: 2050, + frequency: 224.8, + power: 0.22, + link: "https://github.com/deepseek-ai" + }, + { + id: "qwen3-coder", + name: "Qwen3 Coder", + developer: "Alibaba Cloud", + type: "Open Source", + feasible: 8 / 52, + moq: 1.07, + lutCount: 2280, + frequency: 201.5, + power: 0.27, + link: "https://github.com/QwenLM" + }, + { + id: "meta-llama-3-1", + name: "Meta Llama 3.1", + developer: "Meta", + type: "Open Source", + feasible: 0 / 52, + moq: null, + lutCount: null, + frequency: null, + power: null, + link: "https://llama.meta.com" + }, + { + id: "qwen-2-5-coder", + name: "Qwen 2.5 Coder", + developer: "Alibaba Cloud", + type: "Open Source", + feasible: 0 / 52, + moq: null, + lutCount: null, + frequency: null, + power: null, + link: "https://github.com/QwenLM" + } +]; + +// App State Management +let currentSortColumn = "rank"; +let currentSortDirection = "asc"; // "asc" or "desc" +let searchFilter = ""; +let licenseFilter = "all"; +let frontierChart = null; + +// Pareto Frontier Calculation +// A point is on the frontier if it is not dominated by any other point. +// Dominates = both feasibility and MOQ are larger/equal, and at least one is strictly larger. +function calculateParetoFrontier(data) { + const frontier = []; + const validData = data.filter(d => d.moq !== null && d.moq !== undefined); + for (const item of validData) { + let dominated = false; + for (const other of validData) { + if (other.id === item.id) continue; + if (other.feasible >= item.feasible && other.moq >= item.moq) { + if (other.feasible > item.feasible || other.moq > item.moq) { + dominated = true; + break; + } + } + } + if (!dominated) { + frontier.push(item); + } + } + // Sort by feasibility ascending to draw a continuous curve from left to right + return frontier.sort((a, b) => a.feasible - b.feasible); +} + +// Compute overall ranks based on Feasible@1 (primary) and MOQ@1 (secondary tie-breaker) +function computeModelRanks() { + const sorted = [...modelsData].sort((a, b) => { + if (b.feasible !== a.feasible) { + return b.feasible - a.feasible; + } + const moqA = a.moq !== null ? a.moq : -1; + const moqB = b.moq !== null ? b.moq : -1; + return moqB - moqA; + }); + + sorted.forEach((model, index) => { + model.computedRank = index + 1; + }); +} + +// Set initial global stats on page load +function populateGlobalStats() { + document.getElementById("total-models-val").textContent = modelsData.length; + + const maxFeasible = Math.max(...modelsData.map(m => m.feasible)); + document.getElementById("top-feasible-val").textContent = `${(maxFeasible * 100).toFixed(1)}%`; + + const validMoqs = modelsData.map(m => m.moq).filter(moq => moq !== null && moq !== undefined); + const maxMOQ = validMoqs.length > 0 ? Math.max(...validMoqs) : 0; + document.getElementById("top-moq-val").textContent = maxMOQ > 0 ? maxMOQ.toFixed(2) : "—"; +} + +// Render Leaderboard Table +function renderLeaderboard() { + const tbody = document.getElementById("leaderboard-body"); + tbody.innerHTML = ""; + + // Apply filters + let filteredData = modelsData.filter(model => { + const matchesSearch = model.name.toLowerCase().includes(searchFilter.toLowerCase()) || + model.developer.toLowerCase().includes(searchFilter.toLowerCase()); + const matchesLicense = licenseFilter === "all" || model.type === licenseFilter; + return matchesSearch && matchesLicense; + }); + + // Apply sorting + filteredData.sort((a, b) => { + let valA, valB; + + if (currentSortColumn === "rank") { + valA = a.computedRank; + valB = b.computedRank; + } else { + valA = a[currentSortColumn]; + valB = b[currentSortColumn]; + } + + if (typeof valA === "string") { + return currentSortDirection === "asc" + ? valA.localeCompare(valB) + : valB.localeCompare(valA); + } else { + return currentSortDirection === "asc" + ? valA - valB + : valB - valA; + } + }); + + if (filteredData.length === 0) { + tbody.innerHTML = ` + + + No models matched your search or filter criteria. + + + `; + return; + } + + filteredData.forEach(model => { + const rankClass = model.computedRank === 1 ? "rank-1" : model.computedRank === 2 ? "rank-2" : model.computedRank === 3 ? "rank-3" : "rank-other"; + const licenseBadgeClass = model.type === "Open Source" ? "badge-open" : "badge-proprietary"; + + // Create base data row + const row = document.createElement("tr"); + row.className = `model-row ${rankClass}`; + row.id = `row-${model.id}`; + row.setAttribute("data-model-id", model.id); + + // Feasible percent & MOQ bar fills + const feasiblePct = (model.feasible * 100).toFixed(1); + const feasibleBarWidth = model.feasible * 100; + const isMoqValid = model.moq !== null && model.moq !== undefined; + const moqText = isMoqValid ? model.moq.toFixed(2) : "—"; + const moqBarWidth = isMoqValid ? Math.min(model.moq * 65, 100) : 0; + + row.innerHTML = ` + + ${model.computedRank} + + ${model.name} + ${model.developer} + + ${model.type} + + +
+ ${feasiblePct}% + +
+ + +
+ ${moqText} + +
+ + + + + `; + + // Create details/expandable row + const detailsRow = document.createElement("tr"); + detailsRow.className = "details-row"; + detailsRow.id = `details-${model.id}`; + + const lutText = (model.lutCount !== null && model.lutCount !== undefined) ? model.lutCount.toLocaleString() : "—"; + const freqText = (model.frequency !== null && model.frequency !== undefined) ? `${model.frequency.toFixed(1)} MHz` : "—"; + const powerText = (model.power !== null && model.power !== undefined) ? `${model.power.toFixed(2)} W` : "—"; + + detailsRow.innerHTML = ` + +
+
+
+ Estimated LUT Usage + ${lutText} + Lower is better (Area optimization) +
+ +
+ Max Freq (Fmax) + ${freqText} + Higher is better (Performance optimization) +
+ +
+ Dynamic Power + ${powerText} + Lower is better (Power optimization) +
+ +
+

Hardware synthesizability verified post-routing using FPGABench automation.

+ + Visit Model Website → + +
+
+
+ + `; + + tbody.appendChild(row); + tbody.appendChild(detailsRow); + + // Setup expandable row click listener + const toggleBtn = row.querySelector(".btn-toggle-details"); + row.addEventListener("click", (e) => { + // Don't expand if user clicked a link + if (e.target.tagName === "A" || e.target.closest("a")) return; + toggleDetails(model.id, toggleBtn); + }); + + // Hover mapping: Hovering table highlights scatter dot + row.addEventListener("mouseenter", () => { + highlightChartPoint(model.id, true); + }); + row.addEventListener("mouseleave", () => { + highlightChartPoint(model.id, false); + }); + }); +} + +// Toggle detail row expansion +function toggleDetails(modelId, button) { + const content = document.getElementById(`details-content-${modelId}`); + const isExpanded = button.classList.contains("expanded"); + + // Collapse all other detail rows first for accordion feel (clean UI) + document.querySelectorAll(".btn-toggle-details.expanded").forEach(btn => { + if (btn !== button) { + const mid = btn.closest(".model-row").getAttribute("data-model-id"); + const otherContent = document.getElementById(`details-content-${mid}`); + otherContent.style.height = "0px"; + btn.classList.remove("expanded"); + btn.setAttribute("aria-expanded", "false"); + } + }); + + if (isExpanded) { + content.style.height = "0px"; + button.classList.remove("expanded"); + button.setAttribute("aria-expanded", "false"); + } else { + // Set to scrollHeight to animate correctly + content.style.height = content.scrollHeight + "px"; + button.classList.add("expanded"); + button.setAttribute("aria-expanded", "true"); + } +} + +// Handle dynamic sorting clicking on columns +function setupSorting() { + const headers = document.querySelectorAll("th.sortable"); + headers.forEach(header => { + header.addEventListener("click", () => { + const sortColumn = header.getAttribute("data-sort"); + + if (currentSortColumn === sortColumn) { + // Toggle direction + currentSortDirection = currentSortDirection === "asc" ? "desc" : "asc"; + } else { + currentSortColumn = sortColumn; + // Default directions based on column type + currentSortDirection = (sortColumn === "feasible" || sortColumn === "moq") ? "desc" : "asc"; + } + + // Update UI classes on header + headers.forEach(h => { + h.classList.remove("sorted-asc", "sorted-desc"); + const indicator = h.querySelector(".sort-indicator"); + indicator.textContent = "↕"; + }); + + header.classList.add(currentSortDirection === "asc" ? "sorted-asc" : "sorted-desc"); + header.querySelector(".sort-indicator").textContent = currentSortDirection === "asc" ? "↑" : "↓"; + + renderLeaderboard(); + }); + }); +} + +// Setup search input and filter dropdown listeners +function setupFilters() { + const searchInput = document.getElementById("model-search"); + const licenseFilterSelect = document.getElementById("type-filter"); + + searchInput.addEventListener("input", (e) => { + searchFilter = e.target.value; + renderLeaderboard(); + updateChartOpacity(); // Dim models in chart that don't match filters + }); + + licenseFilterSelect.addEventListener("change", (e) => { + licenseFilter = e.target.value; + renderLeaderboard(); + updateChartOpacity(); // Dim models in chart that don't match filters + }); +} + +// --- Chart.js Setup & Integration --- +function initFrontierChart() { + const ctx = document.getElementById("frontierChart").getContext("2d"); + + // Calculate Pareto Frontier curve data + const frontierPoints = calculateParetoFrontier(modelsData); + + // Format scatter data (filter out models with no MOQ) + const validModels = modelsData.filter(model => model.moq !== null && model.moq !== undefined); + const scatterData = validModels.map(model => ({ + x: model.feasible * 100, // X-axis: Feasible@1 in % + y: model.moq, // Y-axis: MOQ@1 index + id: model.id, + name: model.name, + dev: model.developer, + type: model.type + })); + + // Format line curve data (draw a smooth spline through the frontier points) + // To make the line look smooth and go slightly past edges, we sort it. + const lineData = frontierPoints.map(model => ({ + x: model.feasible * 100, + y: model.moq + })); + + frontierChart = new Chart(ctx, { + type: "scatter", + data: { + datasets: [ + { + label: "Pareto Frontier", + data: lineData, + type: "line", + borderColor: "#7c3aed", // Purple frontier line + borderWidth: 3, + tension: 0.35, // Smooth curves + fill: false, + pointRadius: 0, // Hide points on the line dataset, rely on the scatter dataset + order: 1, + hoverRadius: 0 + }, + { + label: "Models", + data: scatterData, + backgroundColor: (context) => { + const index = context.dataIndex; + const model = context.dataset.data[index]; + if (!model) return "rgba(2, 132, 199, 0.75)"; + + // Check if point is on the Pareto frontier to style differently + const isOnFrontier = frontierPoints.some(f => f.id === model.id); + return isOnFrontier ? "#7c3aed" : "#0284c7"; // Purple for frontier, Sky Blue for others + }, + borderColor: "#ffffff", + borderWidth: 2, + pointRadius: 8, + pointHoverRadius: 12, + pointHoverBackgroundColor: "#fff", + pointHoverBorderColor: "#7c3aed", + pointHoverBorderWidth: 3, + order: 0 + } + ] + }, + options: { + responsive: true, + maintainAspectRatio: false, + plugins: { + legend: { + display: false // Using custom styled legend in HTML instead + }, + tooltip: { + backgroundColor: "#ffffff", + titleColor: "#0f172a", + bodyColor: "#334155", + titleFont: { + family: "Space Grotesk", + size: 14, + weight: "bold" + }, + bodyFont: { + family: "Plus Jakarta Sans", + size: 13 + }, + borderColor: "rgba(15, 23, 42, 0.08)", + borderWidth: 1, + padding: 12, + cornerRadius: 8, + displayColors: false, + callbacks: { + title: (context) => { + const model = context[0].raw; + return model.name || "Pareto Frontier Line"; + }, + label: (context) => { + const model = context.raw; + if (model.id) { + return [ + `Developer: ${model.dev}`, + `Feasible@1: ${model.x.toFixed(1)}%`, + `MOQ@1: ${model.y.toFixed(2)}` + ]; + } + return `Frontier MOQ: ${model.y.toFixed(2)} at Feasible: ${model.x.toFixed(1)}%`; + } + } + } + }, + scales: { + x: { + title: { + display: true, + text: "Feasible@1 Success Rate (%)", + color: "#334155", + font: { + family: "Space Grotesk", + size: 13, + weight: "bold" + } + }, + grid: { + color: "rgba(15, 23, 42, 0.05)" + }, + ticks: { + color: "#475569", + font: { family: "JetBrains Mono" }, + callback: (value) => `${value}%` + }, + min: 0, + max: 60 + }, + y: { + title: { + display: true, + text: "MOQ@1 Design Quality Index (Normalized)", + color: "#334155", + font: { + family: "Space Grotesk", + size: 13, + weight: "bold" + } + }, + grid: { + color: "rgba(15, 23, 42, 0.05)" + }, + ticks: { + color: "#475569", + font: { family: "JetBrains Mono" } + }, + min: 1.0, + max: 1.26 + } + }, + onHover: (event, activeElements) => { + // Change cursor to pointer if hovering over points + event.chart.canvas.style.cursor = activeElements.length ? "pointer" : "default"; + + // Link Hover: Highlight table row when hovering chart point + if (activeElements.length > 0) { + const index = activeElements[0].index; + const datasetIndex = activeElements[0].datasetIndex; + + if (datasetIndex === 1) { // Models scatter dataset + const model = event.chart.data.datasets[1].data[index]; + highlightTableRow(model.id); + } + } else { + clearTableHighlights(); + } + } + } + }); +} + +// Sync highlight: Table row hover -> Chart point highlight +function highlightChartPoint(modelId, highlight) { + if (!frontierChart) return; + + const dataset = frontierChart.data.datasets[1]; + const modelIndex = dataset.data.findIndex(p => p.id === modelId); + + if (modelIndex !== -1) { + const meta = frontierChart.getDatasetMeta(1); + const point = meta.data[modelIndex]; + + if (highlight) { + // Force active hover styling in Chart.js + frontierChart.tooltip.setActiveElements([{ datasetIndex: 1, index: modelIndex }], { + x: point.x, + y: point.y + }); + // Set visual state + point.options.radius = 12; + point.options.backgroundColor = "#fff"; + point.options.borderColor = "#8b5cf6"; + point.options.borderWidth = 3; + } else { + // Reset active elements + frontierChart.tooltip.setActiveElements([], { x: 0, y: 0 }); + // Reset visual state + point.options.radius = undefined; // defaults back + point.options.backgroundColor = undefined; + point.options.borderColor = undefined; + point.options.borderWidth = undefined; + } + + frontierChart.update("none"); // Update without animation loops for performance + } +} + +// Sync highlight: Chart point hover -> Table row highlight +let lastHighlightedRow = null; +function highlightTableRow(modelId) { + clearTableHighlights(); + + const row = document.getElementById(`row-${modelId}`); + if (row) { + row.classList.add("row-active"); + lastHighlightedRow = row; + + // Smoothly scroll the highlighted row into view if it's outside the scroll container view + // (Only if it's not already in view, to prevent jarring screen jumps) + const tableWrapper = row.closest(".table-wrapper"); + const rowTop = row.offsetTop; + const rowBottom = rowTop + row.offsetHeight; + const scrollContainerTop = tableWrapper.scrollTop; + const scrollContainerBottom = scrollContainerTop + tableWrapper.offsetHeight; + + if (rowTop < scrollContainerTop) { + tableWrapper.scrollTo({ top: rowTop - 20, behavior: "smooth" }); + } else if (rowBottom > scrollContainerBottom) { + tableWrapper.scrollTo({ top: rowBottom - tableWrapper.offsetHeight + 20, behavior: "smooth" }); + } + } +} + +function clearTableHighlights() { + if (lastHighlightedRow) { + lastHighlightedRow.classList.remove("row-active"); + lastHighlightedRow = null; + } +} + +// Update chart point opacities based on active filters (dim non-matching models) +function updateChartOpacity() { + if (!frontierChart) return; + + const filteredIds = modelsData + .filter(model => { + const matchesSearch = model.name.toLowerCase().includes(searchFilter.toLowerCase()) || + model.developer.toLowerCase().includes(searchFilter.toLowerCase()); + const matchesLicense = licenseFilter === "all" || model.type === licenseFilter; + return matchesSearch && matchesLicense; + }) + .map(model => model.id); + + // Dynamically update point background opacity + const frontierPoints = calculateParetoFrontier(modelsData); + + frontierChart.data.datasets[1].backgroundColor = (context) => { + const index = context.dataIndex; + const model = context.dataset.data[index]; + if (!model) return "rgba(2, 132, 199, 0.75)"; + + const isFiltered = filteredIds.includes(model.id); + const isOnFrontier = frontierPoints.some(f => f.id === model.id); + + const baseColor = isOnFrontier ? "124, 58, 237" : "2, 132, 199"; // purple vs blue RGB + const opacity = isFiltered ? "1.0" : "0.15"; + return `rgba(${baseColor}, ${opacity})`; + }; + + frontierChart.data.datasets[1].borderColor = (context) => { + const index = context.dataIndex; + const model = context.dataset.data[index]; + if (!model) return "rgba(15, 23, 42, 0.2)"; + + const isFiltered = filteredIds.includes(model.id); + const opacity = isFiltered ? "1.0" : "0.15"; + return `rgba(255, 255, 255, ${opacity})`; + }; + + frontierChart.update(); +} + +// --- Page Initialization --- +document.addEventListener("DOMContentLoaded", () => { + computeModelRanks(); + populateGlobalStats(); + renderLeaderboard(); + setupSorting(); + setupFilters(); + + // Initialize Chart after a brief timeout to let grid layout render properly + setTimeout(() => { + initFrontierChart(); + }, 100); +}); diff --git a/dist/assets/index-D9BrbtBe.js b/dist/assets/index-D9BrbtBe.js new file mode 100644 index 0000000..2f074ec --- /dev/null +++ b/dist/assets/index-D9BrbtBe.js @@ -0,0 +1,68 @@ +(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const t of document.querySelectorAll('link[rel="modulepreload"]'))r(t);new MutationObserver(t=>{for(const o of t)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function e(t){const o={};return t.integrity&&(o.integrity=t.integrity),t.referrerPolicy&&(o.referrerPolicy=t.referrerPolicy),t.crossOrigin==="use-credentials"?o.credentials="include":t.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(t){if(t.ep)return;t.ep=!0;const o=e(t);fetch(t.href,o)}})();const l=[{id:"o1",name:"o1 (2024-12-17)",developer:"OpenAI",type:"Proprietary",feasible:.885,moq:1.08,lutCount:2540,frequency:188.5,power:.31,link:"https://openai.com"},{id:"claude-3-5-sonnet",name:"Claude 3.5 Sonnet",developer:"Anthropic",type:"Proprietary",feasible:.827,moq:1.12,lutCount:2450,frequency:185.4,power:.32,link:"https://anthropic.com"},{id:"deepseek-coder-v2",name:"DeepSeek-Coder-V2-Instruct",developer:"DeepSeek",type:"Open Source",feasible:.788,moq:1.09,lutCount:2510,frequency:178.9,power:.34,link:"https://github.com/deepseek-ai/DeepSeek-Coder-V2"},{id:"qwen-2-5-coder-32b",name:"Qwen2.5-Coder-32B-Instruct",developer:"Alibaba Cloud",type:"Open Source",feasible:.75,moq:1.18,lutCount:2310,frequency:196.2,power:.28,link:"https://github.com/QwenLM/Qwen2.5-Coder"},{id:"gemini-1-5-pro",name:"Gemini 1.5 Pro (002)",developer:"Google",type:"Proprietary",feasible:.731,moq:1.03,lutCount:2620,frequency:168.4,power:.38,link:"https://deepmind.google"},{id:"llama-3-1-405b",name:"Llama-3.1-405B-Instruct",developer:"Meta",type:"Open Source",feasible:.712,moq:1.01,lutCount:2680,frequency:165.2,power:.39,link:"https://llama.meta.com"},{id:"gpt-4-turbo",name:"GPT-4-Turbo",developer:"OpenAI",type:"Proprietary",feasible:.673,moq:.98,lutCount:2750,frequency:161,power:.41,link:"https://openai.com"},{id:"llama-3-1-70b",name:"Llama-3.1-70B-Instruct",developer:"Meta",type:"Open Source",feasible:.654,moq:.97,lutCount:2790,frequency:158.3,power:.42,link:"https://llama.meta.com"},{id:"qwen-2-5-coder-7b",name:"Qwen2.5-Coder-7B-Instruct",developer:"Alibaba Cloud",type:"Open Source",feasible:.615,moq:1.02,lutCount:2660,frequency:170.8,power:.36,link:"https://github.com/QwenLM/Qwen2.5-Coder"},{id:"gemini-1-5-flash",name:"Gemini 1.5 Flash (002)",developer:"Google",type:"Proprietary",feasible:.596,moq:.92,lutCount:2910,frequency:149.5,power:.46,link:"https://deepmind.google"},{id:"claude-3-opus",name:"Claude 3 Opus",developer:"Anthropic",type:"Proprietary",feasible:.577,moq:.94,lutCount:2880,frequency:151,power:.45,link:"https://anthropic.com"},{id:"fpga-llama-3-8b",name:"FPGA-Llama-3-8B (Fine-tuned)",developer:"UCSD (Academic)",type:"Open Source",feasible:.519,moq:1.22,lutCount:2100,frequency:205,power:.26,link:"https://github.com"},{id:"codellama-34b",name:"CodeLlama-34b-Instruct",developer:"Meta",type:"Open Source",feasible:.385,moq:.74,lutCount:3500,frequency:120,power:.58,link:"https://github.com/meta-llama/codellama"},{id:"starcoder-2-15b",name:"StarCoder2-15B-Instruct",developer:"BigCode",type:"Open Source",feasible:.346,moq:.68,lutCount:3750,frequency:110.5,power:.62,link:"https://github.com/bigcode-project/starcoder2"}];let u="rank",d="asc",f="",m="all",s=null;function x(n){const a=[];for(const e of n){let r=!1;for(const t of n)if(t.id!==e.id&&t.feasible>=e.feasible&&t.moq>=e.moq&&(t.feasible>e.feasible||t.moq>e.moq)){r=!0;break}r||a.push(e)}return a.sort((e,r)=>e.feasible-r.feasible)}function k(){[...l].sort((a,e)=>e.feasible!==a.feasible?e.feasible-a.feasible:e.moq-a.moq).forEach((a,e)=>{a.computedRank=e+1})}function L(){document.getElementById("total-models-val").textContent=l.length;const n=Math.max(...l.map(e=>e.feasible));l.find(e=>e.feasible===n),document.getElementById("top-feasible-val").textContent=`${(n*100).toFixed(1)}%`;const a=Math.max(...l.map(e=>e.moq));document.getElementById("top-moq-val").textContent=a.toFixed(2)}function h(){const n=document.getElementById("leaderboard-body");n.innerHTML="";let a=l.filter(e=>{const r=e.name.toLowerCase().includes(f.toLowerCase())||e.developer.toLowerCase().includes(f.toLowerCase()),t=m==="all"||e.type===m;return r&&t});if(a.sort((e,r)=>{let t,o;return u==="rank"?(t=e.computedRank,o=r.computedRank):(t=e[u],o=r[u]),typeof t=="string"?d==="asc"?t.localeCompare(o):o.localeCompare(t):d==="asc"?t-o:o-t}),a.length===0){n.innerHTML=` + + + No models matched your search or filter criteria. + + + `;return}a.forEach(e=>{const r=e.computedRank===1?"rank-1":e.computedRank===2?"rank-2":e.computedRank===3?"rank-3":"rank-other",t=e.type==="Open Source"?"badge-open":"badge-proprietary",o=document.createElement("tr");o.className=`model-row ${r}`,o.id=`row-${e.id}`,o.setAttribute("data-model-id",e.id);const i=(e.feasible*100).toFixed(1),b=e.feasible*100,c=Math.min(e.moq*65,100);o.innerHTML=` + + ${e.computedRank} + + ${e.name} + ${e.developer} + + ${e.type} + + +
+ ${i}% + +
+ + +
+ ${e.moq.toFixed(2)} + +
+ + + + + `;const p=document.createElement("tr");p.className="details-row",p.id=`details-${e.id}`,p.innerHTML=` + +
+
+
+ Estimated LUT Usage + ${e.lutCount.toLocaleString()} + Lower is better (Area optimization) +
+ +
+ Max Freq (Fmax) + ${e.frequency.toFixed(1)} MHz + Higher is better (Performance optimization) +
+ +
+ Dynamic Power + ${e.power.toFixed(2)} W + Lower is better (Power optimization) +
+ +
+

Hardware synthesizability verified post-routing using FPGABench automation.

+ + Visit Model Website → + +
+
+
+ + `,n.appendChild(o),n.appendChild(p);const q=o.querySelector(".btn-toggle-details");o.addEventListener("click",y=>{y.target.tagName==="A"||y.target.closest("a")||F(e.id,q)}),o.addEventListener("mouseenter",()=>{v(e.id,!0)}),o.addEventListener("mouseleave",()=>{v(e.id,!1)})})}function F(n,a){const e=document.getElementById(`details-content-${n}`),r=a.classList.contains("expanded");document.querySelectorAll(".btn-toggle-details.expanded").forEach(t=>{if(t!==a){const o=t.closest(".model-row").getAttribute("data-model-id"),i=document.getElementById(`details-content-${o}`);i.style.height="0px",t.classList.remove("expanded"),t.setAttribute("aria-expanded","false")}}),r?(e.style.height="0px",a.classList.remove("expanded"),a.setAttribute("aria-expanded","false")):(e.style.height=e.scrollHeight+"px",a.classList.add("expanded"),a.setAttribute("aria-expanded","true"))}function S(){const n=document.querySelectorAll("th.sortable");n.forEach(a=>{a.addEventListener("click",()=>{const e=a.getAttribute("data-sort");u===e?d=d==="asc"?"desc":"asc":(u=e,d=e==="feasible"||e==="moq"?"desc":"asc"),n.forEach(r=>{r.classList.remove("sorted-asc","sorted-desc");const t=r.querySelector(".sort-indicator");t.textContent="↕"}),a.classList.add(d==="asc"?"sorted-asc":"sorted-desc"),a.querySelector(".sort-indicator").textContent=d==="asc"?"↑":"↓",h()})})}function I(){const n=document.getElementById("model-search"),a=document.getElementById("type-filter");n.addEventListener("input",e=>{f=e.target.value,h(),C()}),a.addEventListener("change",e=>{m=e.target.value,h(),C()})}function $(){const n=document.getElementById("frontierChart").getContext("2d"),a=x(l),e=l.map(t=>({x:t.feasible*100,y:t.moq,id:t.id,name:t.name,dev:t.developer,type:t.type})),r=a.map(t=>({x:t.feasible*100,y:t.moq}));s=new Chart(n,{type:"scatter",data:{datasets:[{label:"Pareto Frontier",data:r,type:"line",borderColor:"#7c3aed",borderWidth:3,tension:.35,fill:!1,pointRadius:0,order:1,hoverRadius:0},{label:"Models",data:e,backgroundColor:t=>{const o=t.dataIndex,i=t.dataset.data[o];return i?a.some(c=>c.id===i.id)?"#7c3aed":"#0284c7":"rgba(2, 132, 199, 0.75)"},borderColor:"#ffffff",borderWidth:2,pointRadius:8,pointHoverRadius:12,pointHoverBackgroundColor:"#fff",pointHoverBorderColor:"#7c3aed",pointHoverBorderWidth:3,order:0}]},options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1},tooltip:{backgroundColor:"#ffffff",titleColor:"#0f172a",bodyColor:"#334155",titleFont:{family:"Space Grotesk",size:14,weight:"bold"},bodyFont:{family:"Plus Jakarta Sans",size:13},borderColor:"rgba(15, 23, 42, 0.08)",borderWidth:1,padding:12,cornerRadius:8,displayColors:!1,callbacks:{title:t=>t[0].raw.name||"Pareto Frontier Line",label:t=>{const o=t.raw;return o.id?[`Developer: ${o.dev}`,`Feasible@1: ${o.x.toFixed(1)}%`,`MOQ@1: ${o.y.toFixed(2)}`]:`Frontier MOQ: ${o.y.toFixed(2)} at Feasible: ${o.x.toFixed(1)}%`}}}},scales:{x:{title:{display:!0,text:"Feasible@1 Success Rate (%)",color:"#334155",font:{family:"Space Grotesk",size:13,weight:"bold"}},grid:{color:"rgba(15, 23, 42, 0.05)"},ticks:{color:"#475569",font:{family:"JetBrains Mono"},callback:t=>`${t}%`},min:30,max:95},y:{title:{display:!0,text:"MOQ@1 Design Quality Index (Normalized)",color:"#334155",font:{family:"Space Grotesk",size:13,weight:"bold"}},grid:{color:"rgba(15, 23, 42, 0.05)"},ticks:{color:"#475569",font:{family:"JetBrains Mono"}},min:.6,max:1.3}},onHover:(t,o)=>{if(t.chart.canvas.style.cursor=o.length?"pointer":"default",o.length>0){const i=o[0].index;if(o[0].datasetIndex===1){const c=t.chart.data.datasets[1].data[i];B(c.id)}}else w()}}})}function v(n,a){if(!s)return;const r=s.data.datasets[1].data.findIndex(t=>t.id===n);if(r!==-1){const o=s.getDatasetMeta(1).data[r];a?(s.tooltip.setActiveElements([{datasetIndex:1,index:r}],{x:o.x,y:o.y}),o.options.radius=12,o.options.backgroundColor="#fff",o.options.borderColor="#8b5cf6",o.options.borderWidth=3):(s.tooltip.setActiveElements([],{x:0,y:0}),o.options.radius=void 0,o.options.backgroundColor=void 0,o.options.borderColor=void 0,o.options.borderWidth=void 0),s.update("none")}}let g=null;function B(n){w();const a=document.getElementById(`row-${n}`);if(a){a.classList.add("row-active"),g=a;const e=a.closest(".table-wrapper"),r=a.offsetTop,t=r+a.offsetHeight,o=e.scrollTop,i=o+e.offsetHeight;ri&&e.scrollTo({top:t-e.offsetHeight+20,behavior:"smooth"})}}function w(){g&&(g.classList.remove("row-active"),g=null)}function C(){if(!s)return;const n=l.filter(e=>{const r=e.name.toLowerCase().includes(f.toLowerCase())||e.developer.toLowerCase().includes(f.toLowerCase()),t=m==="all"||e.type===m;return r&&t}).map(e=>e.id),a=x(l);s.data.datasets[1].backgroundColor=e=>{const r=e.dataIndex,t=e.dataset.data[r];if(!t)return"rgba(2, 132, 199, 0.75)";const o=n.includes(t.id);return`rgba(${a.some(p=>p.id===t.id)?"124, 58, 237":"2, 132, 199"}, ${o?"1.0":"0.15"})`},s.data.datasets[1].borderColor=e=>{const r=e.dataIndex,t=e.dataset.data[r];return t?`rgba(255, 255, 255, ${n.includes(t.id)?"1.0":"0.15"})`:"rgba(15, 23, 42, 0.2)"},s.update()}document.addEventListener("DOMContentLoaded",()=>{k(),L(),h(),S(),I(),setTimeout(()=>{$()},100)}); diff --git a/dist/assets/index-rRGFXrZW.css b/dist/assets/index-rRGFXrZW.css new file mode 100644 index 0000000..e80f3bb --- /dev/null +++ b/dist/assets/index-rRGFXrZW.css @@ -0,0 +1 @@ +:root{--bg-base: #f8fafc;--bg-surface: #ffffff;--bg-surface-solid: #ffffff;--bg-surface-hover: #f1f5f9;--border-color: rgba(15, 23, 42, .08);--border-hover: rgba(2, 132, 199, .4);--primary: #0284c7;--primary-rgb: 2, 132, 199;--secondary: #7c3aed;--secondary-rgb: 124, 58, 237;--accent: #059669;--accent-rgb: 5, 150, 105;--warning: #d97706;--warning-rgb: 217, 119, 6;--text-primary: #0f172a;--text-secondary: #334155;--text-muted: #64748b;--font-heading: "Space Grotesk", sans-serif;--font-body: "Plus Jakarta Sans", sans-serif;--font-mono: "JetBrains Mono", monospace;--radius-sm: 8px;--radius-md: 12px;--radius-lg: 20px;--transition-fast: .15s ease;--transition-normal: .3s cubic-bezier(.4, 0, .2, 1);--transition-slow: .5s cubic-bezier(.4, 0, .2, 1);--backdrop-blur: blur(12px)}*{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth;background-color:var(--bg-base);color:var(--text-primary);font-family:var(--font-body);-webkit-font-smoothing:antialiased}body{min-height:100vh;position:relative;overflow-x:hidden;padding-bottom:60px}.glow-bg{position:absolute;width:600px;height:600px;border-radius:50%;filter:blur(140px);pointer-events:none;z-index:-1;opacity:.06;transition:all var(--transition-slow)}.glow-bg-1{top:-100px;right:-100px;background:radial-gradient(circle,var(--primary) 0%,transparent 70%)}.glow-bg-2{top:600px;left:-200px;background:radial-gradient(circle,var(--secondary) 0%,transparent 70%)}h1,h2,h3,h4{font-family:var(--font-heading);font-weight:700;letter-spacing:-.02em;color:var(--text-primary)}p{color:var(--text-secondary);line-height:1.6}a{color:var(--primary);text-decoration:none;transition:color var(--transition-fast)}a:hover{color:#38bdf8}.highlight{background:linear-gradient(135deg,var(--primary) 0%,var(--secondary) 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.badge{display:inline-block;padding:6px 14px;border-radius:50px;font-family:var(--font-heading);font-weight:500;font-size:.8rem;background:#0284c714;border:1px solid rgba(2,132,199,.15);color:var(--primary);margin-bottom:1.5rem;letter-spacing:.05em;text-transform:uppercase}.app-header{position:sticky;top:0;z-index:100;background:#f8fafccc;backdrop-filter:var(--backdrop-blur);-webkit-backdrop-filter:var(--backdrop-blur);border-bottom:1px solid var(--border-color);padding:1.25rem 0}.header-container{max-width:1400px;margin:0 auto;padding:0 2rem;display:flex;justify-content:space-between;align-items:center}.logo-area{display:flex;align-items:center}.logo-text{font-family:var(--font-heading);font-weight:700;font-size:1.35rem;letter-spacing:-.03em}.nav-links{display:flex;align-items:center;gap:2rem}.nav-links a{color:var(--text-secondary);font-family:var(--font-heading);font-weight:500;font-size:.95rem}.nav-links a:hover{color:var(--text-primary)}.btn-primary{background:var(--primary);color:#fff;padding:12px 24px;border-radius:var(--radius-sm);font-family:var(--font-heading);font-weight:600;border:none;cursor:pointer;box-shadow:0 4px 12px #0284c726;transition:transform var(--transition-fast),background-color var(--transition-fast),box-shadow var(--transition-fast)}.btn-primary:hover{background:#0270a5;transform:translateY(-2px);box-shadow:0 6px 16px #0284c74d;color:#fff}.btn-primary-sm{background:var(--primary);color:#fff;padding:8px 18px;border-radius:var(--radius-sm);font-family:var(--font-heading);font-weight:500;font-size:.85rem;border:none;cursor:pointer;box-shadow:0 4px 10px #0284c71f;transition:transform var(--transition-fast),background-color var(--transition-fast),box-shadow var(--transition-fast)}.btn-primary-sm:hover{background:#0270a5;transform:translateY(-1px);box-shadow:0 4px 12px #0284c740;color:#fff}.btn-secondary{background:#fff;border:1px solid var(--border-color);color:var(--text-primary);padding:12px 24px;border-radius:var(--radius-sm);font-family:var(--font-heading);font-weight:600;cursor:pointer;transition:background var(--transition-fast),border var(--transition-fast),box-shadow var(--transition-fast);box-shadow:0 1px 2px #00000005}.btn-secondary:hover{background:#f1f5f9;border-color:#00000026;color:var(--text-primary)}.main-content{max-width:1400px;margin:0 auto;padding:3rem 2rem;display:flex;flex-direction:column;gap:4rem}.hero-section{display:grid;grid-template-columns:1.2fr 1fr;gap:3rem;align-items:center}.hero-content h1{font-size:3.5rem;line-height:1.15;margin-bottom:1.5rem;background:linear-gradient(to right,#0f172a,#475569);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.hero-content .lead{font-size:1.15rem;color:var(--text-secondary)}.stats-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1.5rem}.stat-card{background:var(--bg-surface);backdrop-filter:var(--backdrop-blur);-webkit-backdrop-filter:var(--backdrop-blur);border:1px solid var(--border-color);border-radius:var(--radius-md);padding:1.5rem;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;transition:border-color var(--transition-normal),transform var(--transition-normal)}.stat-card:hover{border-color:var(--border-hover);transform:translateY(-3px)}.stat-info{display:flex;flex-direction:column}.stat-label{font-size:.85rem;color:var(--text-muted);font-weight:500;text-transform:uppercase;letter-spacing:.05em}.stat-value{font-size:1.75rem;font-weight:700;font-family:var(--font-heading);color:var(--text-primary)}.dashboard-panel{background:var(--bg-surface);backdrop-filter:var(--backdrop-blur);-webkit-backdrop-filter:var(--backdrop-blur);border:1px solid var(--border-color);border-radius:var(--radius-lg);padding:2.25rem;display:flex;flex-direction:column;gap:2rem;box-shadow:0 10px 30px #0f172a0a,0 1px 3px #0f172a05}.panel-header{display:flex;justify-content:space-between;align-items:flex-start;gap:2rem}.panel-title-area h2{font-size:1.75rem;margin-bottom:.5rem}.panel-desc{font-size:.95rem;color:var(--text-muted);max-width:700px}.chart-legend-custom{display:flex;gap:1.5rem;font-size:.85rem;color:var(--text-secondary);font-weight:500;background:#0f172a08;padding:8px 16px;border-radius:50px;border:1px solid var(--border-color)}.legend-item{display:flex;align-items:center;gap:.5rem}.legend-dot{width:10px;height:10px;border-radius:50%}.legend-line{width:18px;height:3px;border-radius:4px}.color-primary{background-color:var(--primary)}.color-secondary{background-color:var(--secondary)}.chart-container-wrapper{position:relative;width:100%;height:480px;background:#fff9;border-radius:var(--radius-md);padding:1.25rem;border:1px solid var(--border-color)}.table-controls-header{flex-direction:row;align-items:center;flex-wrap:wrap}.filters-container{display:flex;gap:1rem;align-items:center}.search-wrapper{position:relative;width:280px}.search-icon{position:absolute;left:14px;top:50%;transform:translateY(-50%);color:var(--text-muted);pointer-events:none}#model-search{width:100%;background:#0f162acc;border:1px solid var(--border-color);border-radius:var(--radius-sm);padding:10px 14px;color:var(--text-primary);font-family:var(--font-body);font-size:.9rem;transition:all var(--transition-fast)}#model-search:focus{outline:none;border-color:var(--primary);box-shadow:0 0 10px #0ea5e933}.filter-dropdown-wrapper select{background:#0f162acc;border:1px solid var(--border-color);border-radius:var(--radius-sm);padding:10px 28px 10px 14px;color:var(--text-primary);font-family:var(--font-body);font-size:.9rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;background-size:14px;transition:all var(--transition-fast)}.filter-dropdown-wrapper select:focus{outline:none;border-color:var(--primary);box-shadow:0 0 10px #0ea5e933}.table-wrapper{overflow-x:auto;border-radius:var(--radius-md);border:1px solid var(--border-color)}.leaderboard-table{width:100%;border-collapse:collapse;text-align:left;font-size:.95rem;background:transparent}.leaderboard-table th,.leaderboard-table td{padding:1rem 1.5rem;border-bottom:1px solid var(--border-color)}.leaderboard-table th{background:#f1f5f9;color:var(--text-secondary);font-family:var(--font-heading);font-weight:600;font-size:.9rem;letter-spacing:.02em;-webkit-user-select:none;user-select:none}.leaderboard-table th.sortable{cursor:pointer;transition:color var(--transition-fast),background-color var(--transition-fast)}.leaderboard-table th.sortable:hover{color:var(--text-primary);background:#e2e8f0}.sort-indicator{display:inline-block;margin-left:4px;font-size:.8rem;color:var(--text-muted)}th.sorted-asc .sort-indicator,th.sorted-desc .sort-indicator{color:var(--primary)}.leaderboard-table tbody tr.model-row{cursor:pointer;transition:background-color var(--transition-fast),transform var(--transition-fast)}.leaderboard-table tbody tr.model-row:hover{background-color:var(--bg-surface-hover)}.leaderboard-table tbody tr.model-row.row-active{background-color:#0284c70d;border-left:4px solid var(--primary)}.col-rank{width:80px;text-align:center}.col-name{font-weight:600}.col-dev{color:var(--text-secondary)}.col-type{width:140px}.col-feasible,.col-moq{width:140px;font-family:var(--font-mono);font-weight:500;text-align:right}.col-action{width:100px;text-align:center}.rank-badge{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:50%;font-weight:700;font-family:var(--font-heading);font-size:.85rem}.rank-1 .rank-badge{background:#fef08a;color:#854d0e;box-shadow:0 2px 8px #eab30833}.rank-2 .rank-badge{background:#e2e8f0;color:#475569;box-shadow:0 2px 8px #64748b26}.rank-3 .rank-badge{background:#ffedd5;color:#9a3412;box-shadow:0 2px 8px #f9731626}.rank-other .rank-badge{background:#f1f5f9;border:1px solid var(--border-color);color:var(--text-muted)}.badge-type{display:inline-block;padding:4px 10px;border-radius:4px;font-size:.75rem;font-weight:600;letter-spacing:.02em}.badge-open{background:#05966914;color:var(--accent);border:1px solid rgba(5,150,105,.15)}.badge-proprietary{background:#7c3aed14;color:var(--secondary);border:1px solid rgba(124,58,237,.15)}.metric-value-container{display:flex;align-items:center;justify-content:flex-end;gap:8px}.metric-bar-bg{width:40px;height:6px;background:#e2e8f0;border-radius:3px;overflow:hidden;display:inline-block}.metric-bar-fill{height:100%;border-radius:3px}.feasible-fill{background-color:var(--accent)}.moq-fill{background-color:var(--warning)}.btn-toggle-details{background:none;border:none;color:var(--text-muted);cursor:pointer;display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:50%;transition:all var(--transition-fast)}.btn-toggle-details:hover{background:#0f172a0a;color:var(--text-primary)}.btn-toggle-details .toggle-indicator{display:inline-block;font-size:.7rem;transition:transform var(--transition-normal),color var(--transition-fast)}.btn-toggle-details.expanded .toggle-indicator{transform:rotate(180deg);color:var(--primary)}.details-row{background:#0f172a05}.details-row td{padding:0;border-bottom:1px solid var(--border-color)}.details-content{overflow:hidden;height:0;transition:height var(--transition-normal)}.details-inner{padding:1.5rem 2.5rem;display:grid;grid-template-columns:repeat(3,1fr) 1.2fr;gap:2rem;border-top:1px dashed var(--border-color)}.detail-metric-card{background:#fff;border:1px solid var(--border-color);border-radius:var(--radius-sm);padding:1rem 1.25rem;display:flex;flex-direction:column;gap:.5rem;box-shadow:0 1px 3px #00000005}.detail-metric-label{font-size:.75rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:.05em;font-weight:500}.detail-metric-value{font-family:var(--font-mono);font-size:1.25rem;font-weight:600;color:var(--text-primary)}.detail-metric-sub{font-size:.75rem;color:var(--text-muted)}.detail-action-card{display:flex;flex-direction:column;justify-content:center;gap:.75rem}.detail-action-card p{font-size:.85rem;color:var(--text-muted)}.detail-link-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;background:#fff;border:1px solid var(--border-color);color:var(--text-secondary);font-size:.85rem;padding:8px 16px;border-radius:var(--radius-sm);font-weight:500;transition:all var(--transition-fast);box-shadow:0 1px 2px #00000005}.detail-link-btn:hover{background:#0284c714;border-color:var(--primary);color:var(--primary)}.info-section-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:2rem}.info-card{background:var(--bg-surface);backdrop-filter:var(--backdrop-blur);-webkit-backdrop-filter:var(--backdrop-blur);border:1px solid var(--border-color);border-radius:var(--radius-lg);padding:2.5rem;display:flex;flex-direction:column;gap:1.5rem;box-shadow:0 10px 30px #0f172a08,0 1px 3px #0f172a05}.info-card h3{font-size:1.5rem;background:linear-gradient(to right,#0f172a,#475569);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.info-card p{font-size:.95rem}.info-card ul{padding-left:1.25rem;color:var(--text-secondary);font-size:.95rem;display:flex;flex-direction:column;gap:.5rem}.metric-def{border-left:2px solid var(--border-color);padding-left:1.25rem;display:flex;flex-direction:column;gap:.75rem}.metric-def:hover{border-color:var(--primary)}.metric-title{display:flex;align-items:center;gap:10px;font-family:var(--font-heading)}.metric-badge{font-size:.7rem;font-weight:700;text-transform:uppercase;padding:3px 8px;border-radius:4px;letter-spacing:.02em}.badge-emerald{background:#05966914;color:var(--accent);border:1px solid rgba(5,150,105,.15)}.badge-purple{background:#7c3aed14;color:var(--secondary);border:1px solid rgba(124,58,237,.15)}.submit-section{width:100%}.submit-card{background:radial-gradient(circle at top right,rgba(124,58,237,.04),transparent 50%),var(--bg-surface);border:1px solid var(--border-color);border-radius:var(--radius-lg);padding:3.5rem;display:flex;flex-direction:column;align-items:center;text-align:center;gap:1.5rem;box-shadow:0 10px 30px #0f172a08,0 1px 3px #0f172a05}.submit-card:hover{border-color:#7c3aed40}.submit-card h2{font-size:2.25rem}.submit-card p{max-width:600px;font-size:1.05rem}.steps-list{display:flex;flex-direction:column;gap:1.25rem;width:100%;max-width:650px;text-align:left;margin:1.5rem 0}.step-item{display:flex;gap:1.25rem;align-items:flex-start;background:#0f172a05;border:1px solid var(--border-color);padding:1.25rem;border-radius:var(--radius-md);transition:border-color var(--transition-fast)}.step-item:hover{border-color:var(--primary)}.step-num{background:var(--primary);color:#fff;width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-weight:700;font-family:var(--font-heading);font-size:.85rem;flex-shrink:0}.step-detail{display:flex;flex-direction:column;gap:.5rem}.step-detail strong{color:var(--text-primary);font-size:.95rem}.step-detail code{font-family:var(--font-mono);background:#f1f5f9;border:1px solid #cbd5e1;padding:4px 8px;border-radius:4px;color:var(--primary);font-size:.85rem;word-break:break-all}.submit-actions{display:flex;gap:1rem;margin-top:1rem}.app-footer{border-top:1px solid var(--border-color);padding:2rem 0;background:#f1f5f9}.footer-container{max-width:1400px;margin:0 auto;padding:0 2rem;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:1.5rem}.app-footer p{font-size:.85rem;color:var(--text-muted)}.footer-meta{display:flex;align-items:center;gap:1rem;font-size:.85rem;color:var(--text-muted)}.separator{color:#0f172a14}.footer-meta a{color:var(--text-muted)}.footer-meta a:hover{color:var(--text-primary)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}@media (max-width: 1200px){.hero-section{grid-template-columns:1fr;text-align:center;gap:2rem}.hero-content h1{font-size:3rem}.hero-content .lead{max-width:800px;margin:0 auto}.badge{margin-left:auto;margin-right:auto}.stats-grid{max-width:800px;margin:0 auto;width:100%}}@media (max-width: 900px){.info-section-grid{grid-template-columns:1fr}.details-inner{grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.header-container{flex-direction:column;gap:1.25rem}.nav-links{width:100%;justify-content:center;flex-wrap:wrap;gap:1.25rem}.main-content{padding:1.5rem 1rem;gap:2.5rem}.stats-grid{grid-template-columns:1fr}.panel-header{flex-direction:column;align-items:stretch;gap:1.25rem}.chart-legend-custom{align-self:flex-start}.table-controls-header,.filters-container{flex-direction:column;align-items:stretch}.search-wrapper{width:100%}.chart-container-wrapper{height:350px}.submit-card{padding:2rem 1.5rem}.submit-actions{flex-direction:column;width:100%}.submit-actions a{width:100%;text-align:center}.footer-container{flex-direction:column;text-align:center;gap:1rem}}@media (max-width: 600px){.details-inner{grid-template-columns:1fr;padding:1.25rem 1.5rem}} diff --git a/dist/index.html b/dist/index.html new file mode 100644 index 0000000..566e444 --- /dev/null +++ b/dist/index.html @@ -0,0 +1,260 @@ + + + + + + FPGABench: Verilog PPA Leaderboard for LLMs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+
+ FPGABench +
+ +
+
+ +
+ + +
+
+

Evaluating Verilog Synthesis & PPA Quality

+

+ FPGABench is a 52-problem benchmark designed to assess FPGA Verilog code generated by Large Language Models. + It goes beyond simple functional correctness to evaluate critical hardware design quality metrics. +

+
+ + +
+
+
+ Total Problems + 52 +
+
+ +
+
+ Top Feasible@1 + 82.7% +
+
+ +
+
+ Top MOQ@1 Quality + 1.12 +
+
+ +
+
+ Evaluated Models + 13 +
+
+
+
+ + +
+
+
+

Feasibility vs. Design Quality Frontier

+

Visualizing model capability. The Pareto frontier curve connects models achieving the optimal balance between functional feasibility and compilation/PPA quality.

+
+
+ Model Performance + Pareto Frontier +
+
+
+ +
+
+ + +
+
+
+

FPGABench Leaderboard

+

Sort by columns to find the most cost-effective, high-quality, or functionally correct models.

+
+ + +
+
+ +
+ +
+ + +
+
+
+ + +
+ + + + + + + + + + + + + + + +
Rank ↑Model Name ↕Developer ↕License ↕Feasible@1 ↕MOQ@1 ↕Details
+
+
+ + +
+
+

What is FPGABench?

+

+ Unlike general code generation benchmarks (e.g., HumanEval) that only verify functional execution, FPGA Verilog development is tightly bound to hardware constraints. + A design that runs correctly in simulation can still fail synthesis, exceed resource budgets, or run too slowly on a real chip. +

+

+ FPGABench introduces 52 diverse, hand-crafted hardware design problems ranging from basic arithmetic blocks (multipliers, ALUs) to complex sequential circuits (FIFO controllers, SPI masters, AES pipelines). It automatically synthesizes generated code to evaluate post-routing hardware metrics. +

+
+ +
+

Key Metrics Defined

+
+
+ Feasible@1 + Functional & Synthesis Success +
+

+ The percentage of LLM generations that successfully pass compiler parsing, syntactical checks, compile clean in EDA tools (like Xilinx Vivado or Intel Quartus), and fulfill functional simulation specifications. It is an adaptation of the classic pass@1 metric for hardware. +

+
+ +
+
+ MOQ@1 (Mean Quality of Design) + PPA Efficiency Index +
+

+ A composite numerical score normalized around 1.0 (representing reference designs). MOQ@1 evaluates Power, Performance, and Area (PPA) efficiency. It ranks models based on: +

+
    +
  • Area: Look-Up Table (LUT) and Flip-Flop usage (lower is better).
  • +
  • Performance: Maximum Clock Frequency ($F_{max}$) post-routing (higher is better).
  • +
  • Power: Estimated dynamic power consumption (lower is better).
  • +
+

An MOQ@1 value > 1.0 indicates that the model's design quality surpasses standard reference implementation efficiency.

+
+
+
+ + +
+
+

Submit Your Model Results

+

+ We encourage researchers and developers to run FPGABench on new models. + To add your model to the official leaderboard, please follow the steps below: +

+ +
+
+
1
+
+ Clone the FPGABench Repository: + git clone https://github.com/fpgabench/fpgabench.git +
+
+
+
2
+
+ Run generation & synthesis suite: + python run_eval.py --model your-model-name --eda_tool vivado +
+
+
+
3
+
+ Submit a Pull Request: + Upload your generated JSON result artifact under results/your_model.json. +
+
+
+ + +
+
+
+ +
+ +
+ + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..267d8e5 --- /dev/null +++ b/index.html @@ -0,0 +1,350 @@ + + + + + + Can LLMs Generate FPGA-Ready Verilog? | FPGABench + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+
+ FPGABench +
+ +
+
+ +
+ + +
+
+

Can LLMs Generate FPGA-Ready Verilog?

+

+ FPGABench tests generated hardware designs beyond simulation, measuring whether they can actually synthesise, meet physical FPGA constraints, and optimise for a design objective. +

+ +
+ + +
+
+
+ Total Problems + 52 +
+
+ +
+
+ Top Feasible@1 + 82.7% +
+
+ +
+
+ Top MOQ@1 Quality + 1.12 +
+
+ +
+
+ Evaluated Models + 13 +
+
+
+
+ + +
+
+
+

Feasibility vs. Design Quality Frontier

+

Visualizing model capability. The Pareto frontier curve connects models achieving the optimal balance between functional feasibility and compilation/PPA quality.

+
+
+ Model Performance + Pareto Frontier +
+
+
+ +
+
+ + +
+
+
+

FPGABench Leaderboard

+

Sort by columns to find the most cost-effective, high-quality, or functionally correct models.

+
+ + +
+
+ +
+ +
+ + +
+
+
+ + +
+ + + + + + + + + + + + + + + +
Rank ↑Model Name ↕Developer ↕License ↕Feasible@1 ↕MOQ@1 ↕Details
+
+
+ + +
+
+

What is FPGABench?

+

+ Unlike general code generation benchmarks (e.g., HumanEval) that only verify functional execution, FPGA Verilog development is tightly bound to hardware constraints. + A design that runs correctly in simulation can still fail synthesis, exceed resource budgets, or run too slowly on a real chip. +

+

+ FPGABench introduces 52 diverse, hand-crafted hardware design problems ranging from basic arithmetic blocks (multipliers, ALUs) to complex sequential circuits (FIFO controllers, SPI masters, AES pipelines). It automatically synthesizes generated code to evaluate post-routing hardware metrics. +

+
+ +
+

Key Metrics Defined

+
+
+ Feasible@K + Functional, Synthesis & Constraint Satisfaction +
+

+ A candidate design $d$ is feasible for problem $p$ iff it is functionally correct, synthesisable, and meets all constraints. $\text{Feasible@}K$ is then the fraction of problems where model $m$ produces a feasible design in $K$ attempts: +

+
+ $$\text{feasible}(d, p) = \mathbf{1}[\text{correct}(d, p)] \cdot \mathbf{1}[\text{synth}(d)] \cdot \prod_{j=1}^{N_c} \mathbf{1}[d \text{ meets constraint } c_p(j)]$$ +
+
+ $$\text{Feasible@}K = \frac{1}{|P|} \sum_{p \in P} \max_{1 \le i \le K} \text{feasible}(d^{(i)}, p)$$ +
+
+ +
+
+ MOQ@K (Maximum Objective Quality) + PPA Optimization Index +
+

+ $\text{Feasible@}K$ measures whether a model can produce a usable design, but not how well that design optimises the target hardware. To quantify synthesis quality among feasible designs, we define the Maximum Objective Quality (MOQ). +

+

+ For each problem $p$, let $f_p^*$ denote the objective value achieved by the reference implementation. For a feasible generated design $d$, define its normalised quality $q_p(d)$: +

+
+ $$q_p(d) = \begin{cases} \frac{f(d)}{f_p^*} & \text{if } \text{dir}_p = \;\uparrow (F_{\text{max}}) \\ \frac{f_p^*}{f(d)} & \text{if } \text{dir}_p = \;\downarrow (\text{LUTs}) \end{cases}$$ +
+

+ Here, $q_p(d) = 1$ means the generated design matches the reference, $q_p(d) > 1$ means it improves on the reference, and $q_p(d) < 1$ indicates underperformance. +

+

+ Across a benchmark set $P$, $\text{MOQ@}K$ is defined as the geometric mean, over all problems, of the best feasible objective ratio found within the first $K$ attempts: +

+
+ $$\text{MOQ@}K = \left( \prod_{p \in P} \max_{\substack{1 \le i \le K \\ \text{feasible}(d^{(i)}, p) = 1}} q_p(d^{(i)}) \right)^{\frac{1}{|P|}}$$ +
+

+ The geometric mean is the natural aggregator for ratio-valued scores: a design $2\times$ better and one $0.5\times$ worse correctly average to $1.0$ ($\sqrt{2 \times 0.5} = 1.0$), whereas the arithmetic mean would incorrectly report a net gain of $1.25$. $\text{MOQ@}K$ is conditional on feasibility and must be interpreted alongside $\text{Feasible@}K$. +

+
+
+
+ + +
+
+
+

Table 4.3: Scoring examples for the 7-Sample Median Denoising Filter

+

A detailed illustration of candidate evaluation for a specific hardware design target under Feasible@K and MOQ@K metrics.

+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Candidate IDFunctionally CorrectSynthesizableMeets ConstraintsLUT UsageFeasibleQuality ratio ($q_p(d)$)
Candidate 1 (Optimal)✅ Yes✅ Yes✅ Yes80 (Reference: 100)Yes1.25 (Improves PPA)
Candidate 2 (Suboptimal)✅ Yes✅ Yes✅ Yes120 (Reference: 100)Yes0.83 (Underperforms)
Candidate 3 (Fails Constraint)✅ Yes✅ Yes❌ No (Timing Violation)70 (Reference: 100)No— (Infeasible)
Candidate 4 (Fails Function)❌ No✅ Yes——No— (Infeasible)
+
+
+ + +
+
+

Submit Your Model Results

+

+ We encourage researchers and developers to run FPGABench on new models. + To add your model to the official leaderboard, please follow the steps below: +

+ +
+
+
1
+
+ Clone the FPGABench Repository: + git clone https://github.com/fpgabench/fpgabench.git +
+
+
+
2
+
+ Run generation & synthesis suite: + python run_eval.py --model your-model-name --eda_tool vivado +
+
+
+
3
+
+ Submit a Pull Request: + Upload your generated JSON result artifact under results/your_model.json. +
+
+
+ + +
+
+
+ +
+ +
+ + + + + diff --git a/node_modules/.bin/esbuild b/node_modules/.bin/esbuild new file mode 120000 index 0000000..c83ac07 --- /dev/null +++ b/node_modules/.bin/esbuild @@ -0,0 +1 @@ +../esbuild/bin/esbuild \ No newline at end of file diff --git a/node_modules/.bin/nanoid b/node_modules/.bin/nanoid new file mode 120000 index 0000000..e2be547 --- /dev/null +++ b/node_modules/.bin/nanoid @@ -0,0 +1 @@ +../nanoid/bin/nanoid.cjs \ No newline at end of file diff --git a/node_modules/.bin/rollup b/node_modules/.bin/rollup new file mode 120000 index 0000000..5939621 --- /dev/null +++ b/node_modules/.bin/rollup @@ -0,0 +1 @@ +../rollup/dist/bin/rollup \ No newline at end of file diff --git a/node_modules/.bin/vite b/node_modules/.bin/vite new file mode 120000 index 0000000..6d1e3be --- /dev/null +++ b/node_modules/.bin/vite @@ -0,0 +1 @@ +../vite/bin/vite.js \ No newline at end of file diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json new file mode 100644 index 0000000..9f61162 --- /dev/null +++ b/node_modules/.package-lock.json @@ -0,0 +1,255 @@ +{ + "name": "fpgabench-leaderboard", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz", + "integrity": "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz", + "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.61.1", + "@rollup/rollup-android-arm64": "4.61.1", + "@rollup/rollup-darwin-arm64": "4.61.1", + "@rollup/rollup-darwin-x64": "4.61.1", + "@rollup/rollup-freebsd-arm64": "4.61.1", + "@rollup/rollup-freebsd-x64": "4.61.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", + "@rollup/rollup-linux-arm-musleabihf": "4.61.1", + "@rollup/rollup-linux-arm64-gnu": "4.61.1", + "@rollup/rollup-linux-arm64-musl": "4.61.1", + "@rollup/rollup-linux-loong64-gnu": "4.61.1", + "@rollup/rollup-linux-loong64-musl": "4.61.1", + "@rollup/rollup-linux-ppc64-gnu": "4.61.1", + "@rollup/rollup-linux-ppc64-musl": "4.61.1", + "@rollup/rollup-linux-riscv64-gnu": "4.61.1", + "@rollup/rollup-linux-riscv64-musl": "4.61.1", + "@rollup/rollup-linux-s390x-gnu": "4.61.1", + "@rollup/rollup-linux-x64-gnu": "4.61.1", + "@rollup/rollup-linux-x64-musl": "4.61.1", + "@rollup/rollup-openbsd-x64": "4.61.1", + "@rollup/rollup-openharmony-arm64": "4.61.1", + "@rollup/rollup-win32-arm64-msvc": "4.61.1", + "@rollup/rollup-win32-ia32-msvc": "4.61.1", + "@rollup/rollup-win32-x64-gnu": "4.61.1", + "@rollup/rollup-win32-x64-msvc": "4.61.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + } + } +} diff --git a/node_modules/.vite/deps/_metadata.json b/node_modules/.vite/deps/_metadata.json new file mode 100644 index 0000000..0571cd4 --- /dev/null +++ b/node_modules/.vite/deps/_metadata.json @@ -0,0 +1,8 @@ +{ + "hash": "ce157793", + "configHash": "02afb10d", + "lockfileHash": "ea9d430b", + "browserHash": "96ca3751", + "optimized": {}, + "chunks": {} +} \ No newline at end of file diff --git a/node_modules/.vite/deps/package.json b/node_modules/.vite/deps/package.json new file mode 100644 index 0000000..3dbc1ca --- /dev/null +++ b/node_modules/.vite/deps/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/node_modules/@esbuild/darwin-arm64/README.md b/node_modules/@esbuild/darwin-arm64/README.md new file mode 100644 index 0000000..c2c0398 --- /dev/null +++ b/node_modules/@esbuild/darwin-arm64/README.md @@ -0,0 +1,3 @@ +# esbuild + +This is the macOS ARM 64-bit binary for esbuild, a JavaScript bundler and minifier. See https://github.com/evanw/esbuild for details. diff --git a/node_modules/@esbuild/darwin-arm64/bin/esbuild b/node_modules/@esbuild/darwin-arm64/bin/esbuild new file mode 100755 index 0000000..e81b7da Binary files /dev/null and b/node_modules/@esbuild/darwin-arm64/bin/esbuild differ diff --git a/node_modules/@esbuild/darwin-arm64/package.json b/node_modules/@esbuild/darwin-arm64/package.json new file mode 100644 index 0000000..6eea7ea --- /dev/null +++ b/node_modules/@esbuild/darwin-arm64/package.json @@ -0,0 +1,20 @@ +{ + "name": "@esbuild/darwin-arm64", + "version": "0.21.5", + "description": "The macOS ARM 64-bit binary for esbuild, a JavaScript bundler.", + "repository": { + "type": "git", + "url": "git+https://github.com/evanw/esbuild.git" + }, + "license": "MIT", + "preferUnplugged": true, + "engines": { + "node": ">=12" + }, + "os": [ + "darwin" + ], + "cpu": [ + "arm64" + ] +} diff --git a/node_modules/@rollup/rollup-darwin-arm64/README.md b/node_modules/@rollup/rollup-darwin-arm64/README.md new file mode 100644 index 0000000..c29619c --- /dev/null +++ b/node_modules/@rollup/rollup-darwin-arm64/README.md @@ -0,0 +1,3 @@ +# `@rollup/rollup-darwin-arm64` + +This is the **aarch64-apple-darwin** binary for `rollup` diff --git a/node_modules/@rollup/rollup-darwin-arm64/package.json b/node_modules/@rollup/rollup-darwin-arm64/package.json new file mode 100644 index 0000000..92335fb --- /dev/null +++ b/node_modules/@rollup/rollup-darwin-arm64/package.json @@ -0,0 +1,22 @@ +{ + "name": "@rollup/rollup-darwin-arm64", + "version": "4.61.1", + "os": [ + "darwin" + ], + "cpu": [ + "arm64" + ], + "files": [ + "rollup.darwin-arm64.node" + ], + "description": "Native bindings for Rollup", + "author": "Lukas Taegert-Atkinson", + "homepage": "https://rollupjs.org/", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/rollup/rollup.git" + }, + "main": "./rollup.darwin-arm64.node" +} \ No newline at end of file diff --git a/node_modules/@rollup/rollup-darwin-arm64/rollup.darwin-arm64.node b/node_modules/@rollup/rollup-darwin-arm64/rollup.darwin-arm64.node new file mode 100644 index 0000000..c9e6e80 Binary files /dev/null and b/node_modules/@rollup/rollup-darwin-arm64/rollup.darwin-arm64.node differ diff --git a/node_modules/@types/estree/LICENSE b/node_modules/@types/estree/LICENSE new file mode 100644 index 0000000..9e841e7 --- /dev/null +++ b/node_modules/@types/estree/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/node_modules/@types/estree/README.md b/node_modules/@types/estree/README.md new file mode 100644 index 0000000..eda7980 --- /dev/null +++ b/node_modules/@types/estree/README.md @@ -0,0 +1,15 @@ +# Installation +> `npm install --save @types/estree` + +# Summary +This package contains type definitions for estree (https://github.com/estree/estree). + +# Details +Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/estree. + +### Additional Details + * Last updated: Wed, 06 May 2026 21:01:00 GMT + * Dependencies: none + +# Credits +These definitions were written by [RReverser](https://github.com/RReverser). diff --git a/node_modules/@types/estree/flow.d.ts b/node_modules/@types/estree/flow.d.ts new file mode 100644 index 0000000..9d001a9 --- /dev/null +++ b/node_modules/@types/estree/flow.d.ts @@ -0,0 +1,167 @@ +declare namespace ESTree { + interface FlowTypeAnnotation extends Node {} + + interface FlowBaseTypeAnnotation extends FlowTypeAnnotation {} + + interface FlowLiteralTypeAnnotation extends FlowTypeAnnotation, Literal {} + + interface FlowDeclaration extends Declaration {} + + interface AnyTypeAnnotation extends FlowBaseTypeAnnotation {} + + interface ArrayTypeAnnotation extends FlowTypeAnnotation { + elementType: FlowTypeAnnotation; + } + + interface BooleanLiteralTypeAnnotation extends FlowLiteralTypeAnnotation {} + + interface BooleanTypeAnnotation extends FlowBaseTypeAnnotation {} + + interface ClassImplements extends Node { + id: Identifier; + typeParameters?: TypeParameterInstantiation | null; + } + + interface ClassProperty { + key: Expression; + value?: Expression | null; + typeAnnotation?: TypeAnnotation | null; + computed: boolean; + static: boolean; + } + + interface DeclareClass extends FlowDeclaration { + id: Identifier; + typeParameters?: TypeParameterDeclaration | null; + body: ObjectTypeAnnotation; + extends: InterfaceExtends[]; + } + + interface DeclareFunction extends FlowDeclaration { + id: Identifier; + } + + interface DeclareModule extends FlowDeclaration { + id: Literal | Identifier; + body: BlockStatement; + } + + interface DeclareVariable extends FlowDeclaration { + id: Identifier; + } + + interface FunctionTypeAnnotation extends FlowTypeAnnotation { + params: FunctionTypeParam[]; + returnType: FlowTypeAnnotation; + rest?: FunctionTypeParam | null; + typeParameters?: TypeParameterDeclaration | null; + } + + interface FunctionTypeParam { + name: Identifier; + typeAnnotation: FlowTypeAnnotation; + optional: boolean; + } + + interface GenericTypeAnnotation extends FlowTypeAnnotation { + id: Identifier | QualifiedTypeIdentifier; + typeParameters?: TypeParameterInstantiation | null; + } + + interface InterfaceExtends extends Node { + id: Identifier | QualifiedTypeIdentifier; + typeParameters?: TypeParameterInstantiation | null; + } + + interface InterfaceDeclaration extends FlowDeclaration { + id: Identifier; + typeParameters?: TypeParameterDeclaration | null; + extends: InterfaceExtends[]; + body: ObjectTypeAnnotation; + } + + interface IntersectionTypeAnnotation extends FlowTypeAnnotation { + types: FlowTypeAnnotation[]; + } + + interface MixedTypeAnnotation extends FlowBaseTypeAnnotation {} + + interface NullableTypeAnnotation extends FlowTypeAnnotation { + typeAnnotation: TypeAnnotation; + } + + interface NumberLiteralTypeAnnotation extends FlowLiteralTypeAnnotation {} + + interface NumberTypeAnnotation extends FlowBaseTypeAnnotation {} + + interface StringLiteralTypeAnnotation extends FlowLiteralTypeAnnotation {} + + interface StringTypeAnnotation extends FlowBaseTypeAnnotation {} + + interface TupleTypeAnnotation extends FlowTypeAnnotation { + types: FlowTypeAnnotation[]; + } + + interface TypeofTypeAnnotation extends FlowTypeAnnotation { + argument: FlowTypeAnnotation; + } + + interface TypeAlias extends FlowDeclaration { + id: Identifier; + typeParameters?: TypeParameterDeclaration | null; + right: FlowTypeAnnotation; + } + + interface TypeAnnotation extends Node { + typeAnnotation: FlowTypeAnnotation; + } + + interface TypeCastExpression extends Expression { + expression: Expression; + typeAnnotation: TypeAnnotation; + } + + interface TypeParameterDeclaration extends Node { + params: Identifier[]; + } + + interface TypeParameterInstantiation extends Node { + params: FlowTypeAnnotation[]; + } + + interface ObjectTypeAnnotation extends FlowTypeAnnotation { + properties: ObjectTypeProperty[]; + indexers: ObjectTypeIndexer[]; + callProperties: ObjectTypeCallProperty[]; + } + + interface ObjectTypeCallProperty extends Node { + value: FunctionTypeAnnotation; + static: boolean; + } + + interface ObjectTypeIndexer extends Node { + id: Identifier; + key: FlowTypeAnnotation; + value: FlowTypeAnnotation; + static: boolean; + } + + interface ObjectTypeProperty extends Node { + key: Expression; + value: FlowTypeAnnotation; + optional: boolean; + static: boolean; + } + + interface QualifiedTypeIdentifier extends Node { + qualification: Identifier | QualifiedTypeIdentifier; + id: Identifier; + } + + interface UnionTypeAnnotation extends FlowTypeAnnotation { + types: FlowTypeAnnotation[]; + } + + interface VoidTypeAnnotation extends FlowBaseTypeAnnotation {} +} diff --git a/node_modules/@types/estree/index.d.ts b/node_modules/@types/estree/index.d.ts new file mode 100644 index 0000000..7d4ab36 --- /dev/null +++ b/node_modules/@types/estree/index.d.ts @@ -0,0 +1,694 @@ +// This definition file follows a somewhat unusual format. ESTree allows +// runtime type checks based on the `type` parameter. In order to explain this +// to typescript we want to use discriminated union types: +// https://github.com/Microsoft/TypeScript/pull/9163 +// +// For ESTree this is a bit tricky because the high level interfaces like +// Node or Function are pulling double duty. We want to pass common fields down +// to the interfaces that extend them (like Identifier or +// ArrowFunctionExpression), but you can't extend a type union or enforce +// common fields on them. So we've split the high level interfaces into two +// types, a base type which passes down inherited fields, and a type union of +// all types which extend the base type. Only the type union is exported, and +// the union is how other types refer to the collection of inheriting types. +// +// This makes the definitions file here somewhat more difficult to maintain, +// but it has the notable advantage of making ESTree much easier to use as +// an end user. + +export interface BaseNodeWithoutComments { + // Every leaf interface that extends BaseNode must specify a type property. + // The type property should be a string literal. For example, Identifier + // has: `type: "Identifier"` + type: string; + loc?: SourceLocation | null | undefined; + range?: [number, number] | undefined; +} + +export interface BaseNode extends BaseNodeWithoutComments { + leadingComments?: Comment[] | undefined; + trailingComments?: Comment[] | undefined; +} + +export interface NodeMap { + AssignmentProperty: AssignmentProperty; + CatchClause: CatchClause; + Class: Class; + ClassBody: ClassBody; + Expression: Expression; + Function: Function; + Identifier: Identifier; + Literal: Literal; + MethodDefinition: MethodDefinition; + ModuleDeclaration: ModuleDeclaration; + ModuleSpecifier: ModuleSpecifier; + Pattern: Pattern; + PrivateIdentifier: PrivateIdentifier; + Program: Program; + Property: Property; + PropertyDefinition: PropertyDefinition; + SpreadElement: SpreadElement; + Statement: Statement; + Super: Super; + SwitchCase: SwitchCase; + TemplateElement: TemplateElement; + VariableDeclarator: VariableDeclarator; +} + +export type Node = NodeMap[keyof NodeMap]; + +export interface Comment extends BaseNodeWithoutComments { + type: "Line" | "Block"; + value: string; +} + +export interface SourceLocation { + source?: string | null | undefined; + start: Position; + end: Position; +} + +export interface Position { + /** >= 1 */ + line: number; + /** >= 0 */ + column: number; +} + +export interface Program extends BaseNode { + type: "Program"; + sourceType: "script" | "module"; + body: Array; + comments?: Comment[] | undefined; +} + +export interface Directive extends BaseNode { + type: "ExpressionStatement"; + expression: Literal; + directive: string; +} + +export interface BaseFunction extends BaseNode { + params: Pattern[]; + generator?: boolean | undefined; + async?: boolean | undefined; + // The body is either BlockStatement or Expression because arrow functions + // can have a body that's either. FunctionDeclarations and + // FunctionExpressions have only BlockStatement bodies. + body: BlockStatement | Expression; +} + +export type Function = FunctionDeclaration | FunctionExpression | ArrowFunctionExpression; + +export type Statement = + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | Declaration; + +export interface BaseStatement extends BaseNode {} + +export interface EmptyStatement extends BaseStatement { + type: "EmptyStatement"; +} + +export interface BlockStatement extends BaseStatement { + type: "BlockStatement"; + body: Statement[]; + innerComments?: Comment[] | undefined; +} + +export interface StaticBlock extends Omit { + type: "StaticBlock"; +} + +export interface ExpressionStatement extends BaseStatement { + type: "ExpressionStatement"; + expression: Expression; +} + +export interface IfStatement extends BaseStatement { + type: "IfStatement"; + test: Expression; + consequent: Statement; + alternate?: Statement | null | undefined; +} + +export interface LabeledStatement extends BaseStatement { + type: "LabeledStatement"; + label: Identifier; + body: Statement; +} + +export interface BreakStatement extends BaseStatement { + type: "BreakStatement"; + label?: Identifier | null | undefined; +} + +export interface ContinueStatement extends BaseStatement { + type: "ContinueStatement"; + label?: Identifier | null | undefined; +} + +export interface WithStatement extends BaseStatement { + type: "WithStatement"; + object: Expression; + body: Statement; +} + +export interface SwitchStatement extends BaseStatement { + type: "SwitchStatement"; + discriminant: Expression; + cases: SwitchCase[]; +} + +export interface ReturnStatement extends BaseStatement { + type: "ReturnStatement"; + argument?: Expression | null | undefined; +} + +export interface ThrowStatement extends BaseStatement { + type: "ThrowStatement"; + argument: Expression; +} + +export interface TryStatement extends BaseStatement { + type: "TryStatement"; + block: BlockStatement; + handler?: CatchClause | null | undefined; + finalizer?: BlockStatement | null | undefined; +} + +export interface WhileStatement extends BaseStatement { + type: "WhileStatement"; + test: Expression; + body: Statement; +} + +export interface DoWhileStatement extends BaseStatement { + type: "DoWhileStatement"; + body: Statement; + test: Expression; +} + +export interface ForStatement extends BaseStatement { + type: "ForStatement"; + init?: VariableDeclaration | Expression | null | undefined; + test?: Expression | null | undefined; + update?: Expression | null | undefined; + body: Statement; +} + +export interface BaseForXStatement extends BaseStatement { + left: VariableDeclaration | Pattern; + right: Expression; + body: Statement; +} + +export interface ForInStatement extends BaseForXStatement { + type: "ForInStatement"; +} + +export interface DebuggerStatement extends BaseStatement { + type: "DebuggerStatement"; +} + +export type Declaration = FunctionDeclaration | VariableDeclaration | ClassDeclaration; + +export interface BaseDeclaration extends BaseStatement {} + +export interface MaybeNamedFunctionDeclaration extends BaseFunction, BaseDeclaration { + type: "FunctionDeclaration"; + /** It is null when a function declaration is a part of the `export default function` statement */ + id: Identifier | null; + body: BlockStatement; +} + +export interface FunctionDeclaration extends MaybeNamedFunctionDeclaration { + id: Identifier; +} + +export interface VariableDeclaration extends BaseDeclaration { + type: "VariableDeclaration"; + declarations: VariableDeclarator[]; + kind: "var" | "let" | "const" | "using" | "await using"; +} + +export interface VariableDeclarator extends BaseNode { + type: "VariableDeclarator"; + id: Pattern; + init?: Expression | null | undefined; +} + +export interface ExpressionMap { + ArrayExpression: ArrayExpression; + ArrowFunctionExpression: ArrowFunctionExpression; + AssignmentExpression: AssignmentExpression; + AwaitExpression: AwaitExpression; + BinaryExpression: BinaryExpression; + CallExpression: CallExpression; + ChainExpression: ChainExpression; + ClassExpression: ClassExpression; + ConditionalExpression: ConditionalExpression; + FunctionExpression: FunctionExpression; + Identifier: Identifier; + ImportExpression: ImportExpression; + Literal: Literal; + LogicalExpression: LogicalExpression; + MemberExpression: MemberExpression; + MetaProperty: MetaProperty; + NewExpression: NewExpression; + ObjectExpression: ObjectExpression; + SequenceExpression: SequenceExpression; + TaggedTemplateExpression: TaggedTemplateExpression; + TemplateLiteral: TemplateLiteral; + ThisExpression: ThisExpression; + UnaryExpression: UnaryExpression; + UpdateExpression: UpdateExpression; + YieldExpression: YieldExpression; +} + +export type Expression = ExpressionMap[keyof ExpressionMap]; + +export interface BaseExpression extends BaseNode {} + +export type ChainElement = SimpleCallExpression | MemberExpression; + +export interface ChainExpression extends BaseExpression { + type: "ChainExpression"; + expression: ChainElement; +} + +export interface ThisExpression extends BaseExpression { + type: "ThisExpression"; +} + +export interface ArrayExpression extends BaseExpression { + type: "ArrayExpression"; + elements: Array; +} + +export interface ObjectExpression extends BaseExpression { + type: "ObjectExpression"; + properties: Array; +} + +export interface PrivateIdentifier extends BaseNode { + type: "PrivateIdentifier"; + name: string; +} + +export interface Property extends BaseNode { + type: "Property"; + key: Expression; + value: Expression | Pattern; // Could be an AssignmentProperty + kind: "init" | "get" | "set"; + method: boolean; + shorthand: boolean; + computed: boolean; +} + +export interface PropertyDefinition extends BaseNode { + type: "PropertyDefinition"; + key: Expression | PrivateIdentifier; + value?: Expression | null | undefined; + computed: boolean; + static: boolean; +} + +export interface FunctionExpression extends BaseFunction, BaseExpression { + id?: Identifier | null | undefined; + type: "FunctionExpression"; + body: BlockStatement; +} + +export interface SequenceExpression extends BaseExpression { + type: "SequenceExpression"; + expressions: Expression[]; +} + +export interface UnaryExpression extends BaseExpression { + type: "UnaryExpression"; + operator: UnaryOperator; + prefix: true; + argument: Expression; +} + +export interface BinaryExpression extends BaseExpression { + type: "BinaryExpression"; + operator: BinaryOperator; + left: Expression | PrivateIdentifier; + right: Expression; +} + +export interface AssignmentExpression extends BaseExpression { + type: "AssignmentExpression"; + operator: AssignmentOperator; + left: Pattern | MemberExpression; + right: Expression; +} + +export interface UpdateExpression extends BaseExpression { + type: "UpdateExpression"; + operator: UpdateOperator; + argument: Expression; + prefix: boolean; +} + +export interface LogicalExpression extends BaseExpression { + type: "LogicalExpression"; + operator: LogicalOperator; + left: Expression; + right: Expression; +} + +export interface ConditionalExpression extends BaseExpression { + type: "ConditionalExpression"; + test: Expression; + alternate: Expression; + consequent: Expression; +} + +export interface BaseCallExpression extends BaseExpression { + callee: Expression | Super; + arguments: Array; +} +export type CallExpression = SimpleCallExpression | NewExpression; + +export interface SimpleCallExpression extends BaseCallExpression { + type: "CallExpression"; + optional: boolean; +} + +export interface NewExpression extends BaseCallExpression { + type: "NewExpression"; +} + +export interface MemberExpression extends BaseExpression, BasePattern { + type: "MemberExpression"; + object: Expression | Super; + property: Expression | PrivateIdentifier; + computed: boolean; + optional: boolean; +} + +export type Pattern = Identifier | ObjectPattern | ArrayPattern | RestElement | AssignmentPattern | MemberExpression; + +export interface BasePattern extends BaseNode {} + +export interface SwitchCase extends BaseNode { + type: "SwitchCase"; + test?: Expression | null | undefined; + consequent: Statement[]; +} + +export interface CatchClause extends BaseNode { + type: "CatchClause"; + param: Pattern | null; + body: BlockStatement; +} + +export interface Identifier extends BaseNode, BaseExpression, BasePattern { + type: "Identifier"; + name: string; +} + +export type Literal = SimpleLiteral | RegExpLiteral | BigIntLiteral; + +export interface SimpleLiteral extends BaseNode, BaseExpression { + type: "Literal"; + value: string | boolean | number | null; + raw?: string | undefined; +} + +export interface RegExpLiteral extends BaseNode, BaseExpression { + type: "Literal"; + value?: RegExp | null | undefined; + regex: { + pattern: string; + flags: string; + }; + raw?: string | undefined; +} + +export interface BigIntLiteral extends BaseNode, BaseExpression { + type: "Literal"; + value?: bigint | null | undefined; + bigint: string; + raw?: string | undefined; +} + +export type UnaryOperator = "-" | "+" | "!" | "~" | "typeof" | "void" | "delete"; + +export type BinaryOperator = + | "==" + | "!=" + | "===" + | "!==" + | "<" + | "<=" + | ">" + | ">=" + | "<<" + | ">>" + | ">>>" + | "+" + | "-" + | "*" + | "/" + | "%" + | "**" + | "|" + | "^" + | "&" + | "in" + | "instanceof"; + +export type LogicalOperator = "||" | "&&" | "??"; + +export type AssignmentOperator = + | "=" + | "+=" + | "-=" + | "*=" + | "/=" + | "%=" + | "**=" + | "<<=" + | ">>=" + | ">>>=" + | "|=" + | "^=" + | "&=" + | "||=" + | "&&=" + | "??="; + +export type UpdateOperator = "++" | "--"; + +export interface ForOfStatement extends BaseForXStatement { + type: "ForOfStatement"; + await: boolean; +} + +export interface Super extends BaseNode { + type: "Super"; +} + +export interface SpreadElement extends BaseNode { + type: "SpreadElement"; + argument: Expression; +} + +export interface ArrowFunctionExpression extends BaseExpression, BaseFunction { + type: "ArrowFunctionExpression"; + expression: boolean; + body: BlockStatement | Expression; +} + +export interface YieldExpression extends BaseExpression { + type: "YieldExpression"; + argument?: Expression | null | undefined; + delegate: boolean; +} + +export interface TemplateLiteral extends BaseExpression { + type: "TemplateLiteral"; + quasis: TemplateElement[]; + expressions: Expression[]; +} + +export interface TaggedTemplateExpression extends BaseExpression { + type: "TaggedTemplateExpression"; + tag: Expression; + quasi: TemplateLiteral; +} + +export interface TemplateElement extends BaseNode { + type: "TemplateElement"; + tail: boolean; + value: { + /** It is null when the template literal is tagged and the text has an invalid escape (e.g. - tag`\unicode and \u{55}`) */ + cooked?: string | null | undefined; + raw: string; + }; +} + +export interface AssignmentProperty extends Property { + value: Pattern; + kind: "init"; + method: boolean; // false +} + +export interface ObjectPattern extends BasePattern { + type: "ObjectPattern"; + properties: Array; +} + +export interface ArrayPattern extends BasePattern { + type: "ArrayPattern"; + elements: Array; +} + +export interface RestElement extends BasePattern { + type: "RestElement"; + argument: Pattern; +} + +export interface AssignmentPattern extends BasePattern { + type: "AssignmentPattern"; + left: Pattern; + right: Expression; +} + +export type Class = ClassDeclaration | ClassExpression; +export interface BaseClass extends BaseNode { + superClass?: Expression | null | undefined; + body: ClassBody; +} + +export interface ClassBody extends BaseNode { + type: "ClassBody"; + body: Array; +} + +export interface MethodDefinition extends BaseNode { + type: "MethodDefinition"; + key: Expression | PrivateIdentifier; + value: FunctionExpression; + kind: "constructor" | "method" | "get" | "set"; + computed: boolean; + static: boolean; +} + +export interface MaybeNamedClassDeclaration extends BaseClass, BaseDeclaration { + type: "ClassDeclaration"; + /** It is null when a class declaration is a part of the `export default class` statement */ + id: Identifier | null; +} + +export interface ClassDeclaration extends MaybeNamedClassDeclaration { + id: Identifier; +} + +export interface ClassExpression extends BaseClass, BaseExpression { + type: "ClassExpression"; + id?: Identifier | null | undefined; +} + +export interface MetaProperty extends BaseExpression { + type: "MetaProperty"; + meta: Identifier; + property: Identifier; +} + +export type ModuleDeclaration = + | ImportDeclaration + | ExportNamedDeclaration + | ExportDefaultDeclaration + | ExportAllDeclaration; +export interface BaseModuleDeclaration extends BaseNode {} + +export type ModuleSpecifier = ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier | ExportSpecifier; +export interface BaseModuleSpecifier extends BaseNode { + local: Identifier; +} + +export interface ImportDeclaration extends BaseModuleDeclaration { + type: "ImportDeclaration"; + specifiers: Array; + attributes: ImportAttribute[]; + source: Literal; +} + +export interface ImportSpecifier extends BaseModuleSpecifier { + type: "ImportSpecifier"; + imported: Identifier | Literal; +} + +export interface ImportAttribute extends BaseNode { + type: "ImportAttribute"; + key: Identifier | Literal; + value: Literal; +} + +export interface ImportExpression extends BaseExpression { + type: "ImportExpression"; + source: Expression; + options?: Expression | null | undefined; +} + +export interface ImportDefaultSpecifier extends BaseModuleSpecifier { + type: "ImportDefaultSpecifier"; +} + +export interface ImportNamespaceSpecifier extends BaseModuleSpecifier { + type: "ImportNamespaceSpecifier"; +} + +export interface ExportNamedDeclaration extends BaseModuleDeclaration { + type: "ExportNamedDeclaration"; + declaration?: Declaration | null | undefined; + specifiers: ExportSpecifier[]; + attributes: ImportAttribute[]; + source?: Literal | null | undefined; +} + +export interface ExportSpecifier extends Omit { + type: "ExportSpecifier"; + local: Identifier | Literal; + exported: Identifier | Literal; +} + +export interface ExportDefaultDeclaration extends BaseModuleDeclaration { + type: "ExportDefaultDeclaration"; + declaration: MaybeNamedFunctionDeclaration | MaybeNamedClassDeclaration | Expression; +} + +export interface ExportAllDeclaration extends BaseModuleDeclaration { + type: "ExportAllDeclaration"; + exported: Identifier | Literal | null; + attributes: ImportAttribute[]; + source: Literal; +} + +export interface AwaitExpression extends BaseExpression { + type: "AwaitExpression"; + argument: Expression; +} diff --git a/node_modules/@types/estree/package.json b/node_modules/@types/estree/package.json new file mode 100644 index 0000000..367a5d9 --- /dev/null +++ b/node_modules/@types/estree/package.json @@ -0,0 +1,27 @@ +{ + "name": "@types/estree", + "version": "1.0.9", + "description": "TypeScript definitions for estree", + "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/estree", + "license": "MIT", + "contributors": [ + { + "name": "RReverser", + "githubUsername": "RReverser", + "url": "https://github.com/RReverser" + } + ], + "main": "", + "types": "index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git", + "directory": "types/estree" + }, + "scripts": {}, + "dependencies": {}, + "peerDependencies": {}, + "typesPublisherContentHash": "db16da859cb0bee641414117047a4becba2e9f39d3e14a6745f887c47ef68482", + "typeScriptVersion": "5.3", + "nonNpm": true +} \ No newline at end of file diff --git a/node_modules/esbuild/LICENSE.md b/node_modules/esbuild/LICENSE.md new file mode 100644 index 0000000..2027e8d --- /dev/null +++ b/node_modules/esbuild/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Evan Wallace + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, Internal Server Error - Gitea: Git with a cup of tea
500 Internal Server Error

Gitea Version: 1.25.1