Initial Abigail immigration AI prototype
This commit is contained in:
143
assets/script.js
Normal file
143
assets/script.js
Normal file
@@ -0,0 +1,143 @@
|
||||
const routes = {
|
||||
extraordinaryTemporary: {
|
||||
title: "O-1A Extraordinary Ability",
|
||||
summary:
|
||||
"Best for a high-achieving founder, researcher, engineer, artist, or operator who can prove sustained acclaim.",
|
||||
score: 92,
|
||||
steps: ["Collect acclaim evidence", "Map facts to O-1 criteria", "Draft petition letter and expert letters"]
|
||||
},
|
||||
extraordinaryGreen: {
|
||||
title: "EB-1A or EB-2 NIW",
|
||||
summary:
|
||||
"Best when the client has strong accomplishments and wants a permanent path without relying only on an employer sponsor.",
|
||||
score: 88,
|
||||
steps: ["Run EB-1A vs NIW matrix", "Build national importance narrative", "Prepare recommendation letter prompts"]
|
||||
},
|
||||
companyTemporary: {
|
||||
title: "H-1B / TN / E-3 / H-1B1",
|
||||
summary:
|
||||
"Best when an employer can sponsor a defined specialty role and the applicant has matching credentials.",
|
||||
score: 84,
|
||||
steps: ["Validate role and credentials", "Collect employer documents", "Prepare LCA and petition data"]
|
||||
},
|
||||
managerTemporary: {
|
||||
title: "L-1A / L-1B",
|
||||
summary:
|
||||
"Best for multinational transfers involving executives, managers, or specialized knowledge employees.",
|
||||
score: 86,
|
||||
steps: ["Confirm qualifying relationship", "Map foreign and U.S. duties", "Collect org charts and payroll evidence"]
|
||||
},
|
||||
investmentTemporary: {
|
||||
title: "E-2 Treaty Investor",
|
||||
summary:
|
||||
"Best for founders or investors from treaty countries who have made or are making a substantial U.S. investment.",
|
||||
score: 82,
|
||||
steps: ["Confirm treaty nationality", "Organize investment evidence", "Draft business and source-of-funds story"]
|
||||
},
|
||||
aos: {
|
||||
title: "Adjustment of Status Bundle",
|
||||
summary:
|
||||
"Best when the applicant is ready to file I-485 with related work authorization and travel documents.",
|
||||
score: 79,
|
||||
steps: ["Confirm priority date and eligibility", "Collect civil documents", "Prepare I-485, I-765, and I-131 data"]
|
||||
},
|
||||
renewal: {
|
||||
title: "Extension, Amendment, or Change of Employer",
|
||||
summary:
|
||||
"Best when the existing immigration category is still viable but facts have changed or status needs to continue.",
|
||||
score: 81,
|
||||
steps: ["Compare current approval to new facts", "Identify material changes", "Refresh employer and status evidence"]
|
||||
}
|
||||
};
|
||||
|
||||
const form = document.querySelector("#intakeForm");
|
||||
const routeTitle = document.querySelector("#routeTitle");
|
||||
const routeSummary = document.querySelector("#routeSummary");
|
||||
const fitMeter = document.querySelector("#fitMeter");
|
||||
const fitScore = document.querySelector("#fitScore");
|
||||
const nextSteps = document.querySelector("#nextSteps");
|
||||
const packetButton = document.querySelector("#generatePacket");
|
||||
|
||||
function formValue(name) {
|
||||
return new FormData(form).get(name);
|
||||
}
|
||||
|
||||
function pickRoute() {
|
||||
const strength = formValue("strength");
|
||||
const goal = formValue("goal");
|
||||
|
||||
if (goal === "aos") return routes.aos;
|
||||
if (goal === "renewal") return routes.renewal;
|
||||
if (strength === "extraordinary" && goal === "green") return routes.extraordinaryGreen;
|
||||
if (strength === "extraordinary") return routes.extraordinaryTemporary;
|
||||
if (strength === "manager") return routes.managerTemporary;
|
||||
if (strength === "investment") return routes.investmentTemporary;
|
||||
return routes.companyTemporary;
|
||||
}
|
||||
|
||||
function renderRoute() {
|
||||
const route = pickRoute();
|
||||
routeTitle.textContent = route.title;
|
||||
routeSummary.textContent = route.summary;
|
||||
fitScore.textContent = `${route.score}%`;
|
||||
fitMeter.style.width = `${route.score}%`;
|
||||
nextSteps.innerHTML = route.steps.map((step) => `<div>${step}</div>`).join("");
|
||||
packetButton.textContent = "Generate case packet";
|
||||
}
|
||||
|
||||
form.addEventListener("change", renderRoute);
|
||||
renderRoute();
|
||||
|
||||
packetButton.addEventListener("click", () => {
|
||||
packetButton.textContent = "Packet drafted for attorney review";
|
||||
});
|
||||
|
||||
const detailCopy = {
|
||||
passport: {
|
||||
title: "Passport and I-94",
|
||||
body: "Abigail checks name consistency, expiration dates, status history, admission class, and travel gaps.",
|
||||
output: "Identity table, status timeline, and form-ready biographic data."
|
||||
},
|
||||
resume: {
|
||||
title: "Resume and biography",
|
||||
body: "The platform extracts employers, titles, education, publications, products, patents, and leadership history.",
|
||||
output: "Chronology, achievement taxonomy, and role-specific narrative bullets."
|
||||
},
|
||||
awards: {
|
||||
title: "Awards, press, publications",
|
||||
body: "Abigail extracts dates, publication names, award criteria, circulation, and relevance to the proposed role.",
|
||||
output: "Evidence summary, exhibit labels, expert letter talking points, and petition narrative bullets."
|
||||
},
|
||||
letters: {
|
||||
title: "Recommendation letter inputs",
|
||||
body: "Clients provide recommender context once. The AI creates letter outlines tailored to each legal criterion.",
|
||||
output: "Recommender brief, draft letter structure, and conflict checks across letters."
|
||||
},
|
||||
company: {
|
||||
title: "Company registration and job details",
|
||||
body: "HR uploads company facts, role data, reporting lines, wage details, and signatory information into a reusable vault.",
|
||||
output: "Employer support letter draft, role summary, org chart notes, and petition fields."
|
||||
}
|
||||
};
|
||||
|
||||
const uploadButtons = document.querySelectorAll(".upload-item");
|
||||
const uploadDetail = document.querySelector("#uploadDetail");
|
||||
|
||||
uploadButtons.forEach((button) => {
|
||||
button.addEventListener("click", () => {
|
||||
uploadButtons.forEach((item) => item.classList.remove("is-active"));
|
||||
button.classList.add("is-active");
|
||||
const detail = detailCopy[button.dataset.doc];
|
||||
uploadDetail.innerHTML = `
|
||||
<p class="panel-label">Selected document</p>
|
||||
<h3>${detail.title}</h3>
|
||||
<p>${detail.body}</p>
|
||||
<div class="draft-box">
|
||||
<strong>AI draft output</strong>
|
||||
<p>${detail.output}</p>
|
||||
</div>
|
||||
`;
|
||||
});
|
||||
});
|
||||
|
||||
document.querySelector('[data-doc="awards"]').classList.add("is-active");
|
||||
Reference in New Issue
Block a user