TOXRA.AI / static /iso_10993_17.html
hchevva's picture
Create iso_10993_17.html
94f9ade verified
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>ISO 10993 Part 17 — E&L RA</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-slate-50 text-slate-800">
<header class="max-w-6xl mx-auto px-4 py-6 flex items-center justify-between">
<h1 class="text-2xl font-bold">ISO 10993 Part 17</h1>
<nav class="space-x-4 text-sm">
<a href="/elra/" class="underline hover:no-underline">← Back to E&L RA</a>
<a href="/" class="underline hover:no-underline">Home</a>
</nav>
</header>
<main class="max-w-6xl mx-auto px-4 pb-16">
<!-- Drop your custom HTML inside the container below -->
<section class="rounded-xl border border-slate-200 bg-white p-4 md:p-6 shadow-sm">
<!-- START: YOUR CUSTOM HTML -->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ISO 10993-17:2023 | Interactive Technical Guide</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
html {
scroll-behavior: smooth;
}
body {
font-family: 'Inter', sans-serif;
}
.section-card {
background-color: white;
border-radius: 1rem;
padding: 2rem;
margin-bottom: 2rem;
box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
border: 1px solid #e5e7eb;
}
.calculator-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1.5rem;
}
.form-input {
width: 100%;
padding: 0.5rem 0.75rem;
border: 1px solid #d1d5db;
border-radius: 0.5rem;
transition: border-color 0.2s, box-shadow 0.2s;
}
.form-input:focus {
outline: none;
border-color: #3b82f6;
box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.4);
}
.result-box {
background-color: #f3f4f6;
padding: 1rem;
border-radius: 0.75rem;
margin-top: 1rem;
font-weight: 600;
border: 1px solid #e5e7eb;
}
/* Interactive Flowchart Styles */
.flowchart-step {
position: relative;
padding: 1.5rem;
border: 2px solid #e5e7eb;
border-radius: 0.75rem;
text-align: center;
background-color: #fafafa;
transition: all 0.2s ease-in-out;
}
.flowchart-arrow {
font-size: 2rem;
color: #9ca3af;
}
</style>
<div class="bg-slate-50 text-slate-800">
</div>
<div class="w-full max-w-5xl mx-auto p-4 sm:p-6 lg:p-8">
<!-- Header -->
<header class="text-center mb-10">
<h1 class="text-3xl sm:text-4xl font-bold text-sky-800">ISO 10993-17:2023 Technical Guide</h1>
<p class="text-slate-500 mt-2 text-lg">An interactive tool for exploring the toxicological risk assessment framework.</p>
</header>
<!-- Main Content -->
<main>
<!-- Section 1: The TRA Process -->
<section id="tra-process" class="section-card">
<h2 class="text-2xl font-bold text-slate-700 mb-6">The 3-Step Toxicological Risk Assessment (TRA) Process</h2>
<div class="flex flex-col md:flex-row items-center justify-between gap-4">
<!-- Step 1 -->
<div class="flowchart-step flex-1 w-full">
<span class="absolute -top-3 bg-sky-600 text-white text-sm font-bold px-3 py-1 rounded-full">Step 1</span>
<h3 class="text-lg font-semibold mb-2">Hazard Identification</h3>
<p class="text-sm text-slate-600">Identify all chemical constituents from ISO 10993-18 and apply the TSL to screen out low-risk substances.</p>
</div>
<div class="flowchart-arrow transform md:rotate-0 rotate-90">&rarr;</div>
<!-- Step 2 -->
<div class="flowchart-step flex-1 w-full">
<span class="absolute -top-3 bg-sky-600 text-white text-sm font-bold px-3 py-1 rounded-full">Step 2</span>
<h3 class="text-lg font-semibold mb-2">Risk Assessment</h3>
<p class="text-sm text-slate-600">For remaining constituents, derive a safety threshold (TI/TCL) and calculate the worst-case patient exposure (EED).</p>
</div>
<div class="flowchart-arrow transform md:rotate-0 rotate-90">&rarr;</div>
<!-- Step 3 -->
<div class="flowchart-step flex-1 w-full">
<span class="absolute -top-3 bg-sky-600 text-white text-sm font-bold px-3 py-1 rounded-full">Step 3</span>
<h3 class="text-lg font-semibold mb-2">Risk Evaluation</h3>
<p class="text-sm text-slate-600">Compare the exposure (EED) to the safety threshold (TI) by calculating the Margin of Safety (MoS).</p>
</div>
</div>
</section>
<!-- Section 2: Interactive Calculators -->
<section id="calculators" class="section-card">
<h2 class="text-2xl font-bold text-slate-700 mb-6">The Toxicologist's Toolbox: Interactive Calculators</h2>
<div class="calculator-grid">
<!-- TSL Screener -->
<div class="section-card p-6">
<h3 class="text-xl font-bold text-sky-700 mb-4">Toxicological Screening Limit (TSL)</h3>
<p class="text-sm text-slate-500 mb-4">Use the TSL to quickly screen out constituents that pose negligible risk. Enter the total quantity found in your chemical analysis.</p>
<div>
<label for="tsl-tq" class="block text-sm font-medium text-slate-700 mb-1">Total Quantity (TQ) (µg)</label>
<input type="number" id="tsl-tq" class="form-input" placeholder="e.g., 500">
</div>
<div class="mt-4">
<label for="tsl-duration" class="block text-sm font-medium text-slate-700 mb-1">Contact Duration</label>
<select id="tsl-duration" class="form-input">
<option value="120">Limited / Prolonged (≤ 30 days)</option>
<option value="600">Long-term (> 30 days)</option>
</select>
</div>
<div id="tsl-result" class="result-box text-center">Enter a TQ value to see the result.</div>
</div>
<!-- TI Calculator -->
<div class="section-card p-6">
<h3 class="text-xl font-bold text-sky-700 mb-4">Tolerable Intake (TI)</h3>
<p class="text-sm text-slate-500 mb-4">Derive the TI by applying Uncertainty Factors (UFs) to a Point of Departure (POD), such as a NOAEL.</p>
<div>
<label for="ti-pod" class="block text-sm font-medium text-slate-700 mb-1">Point of Departure (POD) (mg/kg/day)</label>
<input type="number" id="ti-pod" class="form-input" placeholder="e.g., 10">
</div>
<div class="mt-4">
<label class="block text-sm font-medium text-slate-700 mb-2">Select Uncertainty Factors (UFs):</label>
<div class="space-y-2">
<label class="flex items-center"><input type="checkbox" data-uf="10" class="ti-uf h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500"> <span class="ml-2">Interspecies (10x)</span></label>
<label class="flex items-center"><input type="checkbox" data-uf="10" class="ti-uf h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500"> <span class="ml-2">Intraspecies (10x)</span></label>
<label class="flex items-center"><input type="checkbox" data-uf="3" class="ti-uf h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500"> <span class="ml-2">Sensitive Pediatric (3x)</span></label>
<label class="flex items-center"><input type="checkbox" data-uf="10" class="ti-uf h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-500"> <span class="ml-2">Data Quality / Other (10x)</span></label>
</div>
</div>
<div id="ti-result" class="result-box text-center">Enter POD and select UFs.</div>
</div>
<!-- EED Calculator -->
<div class="section-card p-6">
<h3 class="text-xl font-bold text-sky-700 mb-4">Worst-Case Est. Exposure Dose (EED)</h3>
<p class="text-sm text-slate-500 mb-4">Calculate the max patient exposure dose based on analytical data, assuming 100% release.</p>
<div>
<label for="eed-tq" class="block text-sm font-medium text-slate-700 mb-1">Total Quantity (TQ) (µg)</label>
<input type="number" id="eed-tq" class="form-input" placeholder="e.g., 2000">
</div>
<div class="mt-4">
<label for="eed-bw" class="block text-sm font-medium text-slate-700 mb-1">Patient Body Weight (kg)</label>
<input type="number" id="eed-bw" class="form-input" value="60">
</div>
<div class="mt-4">
<label for="eed-dr" class="block text-sm font-medium text-slate-700 mb-1">Assumed Release Duration (days)</label>
<input type="number" id="eed-dr" class="form-input" value="1" placeholder="e.g., 1 for worst-case">
</div>
<div id="eed-result" class="result-box text-center">Enter required values.</div>
</div>
<!-- MoS Calculator -->
<div class="section-card p-6 bg-sky-50 border-sky-200">
<h3 class="text-xl font-bold text-sky-700 mb-4">Margin of Safety (MoS)</h3>
<p class="text-sm text-slate-500 mb-4">The final risk evaluation step. An MoS ≥ 1 indicates the toxicological risk is acceptable.</p>
<div>
<label for="mos-ti" class="block text-sm font-medium text-slate-700 mb-1">Tolerable Intake (TI) (µg/kg/day)</label>
<input type="number" id="mos-ti" class="form-input" placeholder="From TI calculation">
</div>
<div class="mt-4">
<label for="mos-eed" class="block text-sm font-medium text-slate-700 mb-1">Exposure Dose (EED) (µg/kg/day)</label>
<input type="number" id="mos-eed" class="form-input" placeholder="From EED calculation">
</div>
<div id="mos-result" class="result-box text-center">Enter TI and EED.</div>
</div>
</div>
</section>
</main>
</div>
<script>
document.addEventListener('DOMContentLoaded', () => {
// --- TSL Screener ---
const tslTqInput = document.getElementById('tsl-tq');
const tslDurationSelect = document.getElementById('tsl-duration');
const tslResultEl = document.getElementById('tsl-result');
function calculateTsl() {
const tq = parseFloat(tslTqInput.value);
const limit = parseFloat(tslDurationSelect.value);
if (isNaN(tq)) {
tslResultEl.textContent = 'Enter a TQ value to see the result.';
tslResultEl.className = 'result-box text-center';
return;
}
if (tq < limit) {
tslResultEl.textContent = `PASS: TQ (${tq} µg) is below the TSL of ${limit} µg. Risk is negligible.`;
tslResultEl.className = 'result-box text-center bg-green-100 text-green-800';
} else {
tslResultEl.textContent = `FAIL: TQ (${tq} µg) exceeds the TSL of ${limit} µg. Full TRA required.`;
tslResultEl.className = 'result-box text-center bg-red-100 text-red-800';
}
}
tslTqInput.addEventListener('input', calculateTsl);
tslDurationSelect.addEventListener('change', calculateTsl);
// --- TI Calculator ---
const tiPodInput = document.getElementById('ti-pod');
const tiUfCheckboxes = document.querySelectorAll('.ti-uf');
const tiResultEl = document.getElementById('ti-result');
function calculateTi() {
const pod = parseFloat(tiPodInput.value);
if (isNaN(pod)) {
tiResultEl.textContent = 'Enter POD and select UFs.';
return;
}
let totalUf = 1;
tiUfCheckboxes.forEach(box => {
if (box.checked) {
totalUf *= parseFloat(box.dataset.uf);
}
});
if (totalUf === 1) {
tiResultEl.textContent = 'Select at least one UF.';
return;
}
const ti = (pod * 1000) / totalUf; // Convert POD from mg to µg
tiResultEl.textContent = `TI = ${ti.toFixed(4)} µg/kg/day`;
document.getElementById('mos-ti').value = ti.toFixed(4); // auto-populate MoS calc
calculateMos();
}
tiPodInput.addEventListener('input', calculateTi);
tiUfCheckboxes.forEach(box => box.addEventListener('change', calculateTi));
// --- EED Calculator ---
const eedTqInput = document.getElementById('eed-tq');
const eedBwInput = document.getElementById('eed-bw');
const eedDrInput = document.getElementById('eed-dr');
const eedResultEl = document.getElementById('eed-result');
function calculateEed() {
const tq = parseFloat(eedTqInput.value);
const bw = parseFloat(eedBwInput.value);
const dr = parseFloat(eedDrInput.value);
if (isNaN(tq) || isNaN(bw) || isNaN(dr) || bw <= 0 || dr <= 0) {
eedResultEl.textContent = 'Enter valid, positive values.';
return;
}
const eed = tq / (bw * dr);
eedResultEl.textContent = `EED = ${eed.toFixed(4)} µg/kg/day`;
document.getElementById('mos-eed').value = eed.toFixed(4); // auto-populate MoS calc
calculateMos();
}
[eedTqInput, eedBwInput, eedDrInput].forEach(el => el.addEventListener('input', calculateEed));
// --- MoS Calculator ---
const mosTiInput = document.getElementById('mos-ti');
const mosEedInput = document.getElementById('mos-eed');
const mosResultEl = document.getElementById('mos-result');
function calculateMos() {
const ti = parseFloat(mosTiInput.value);
const eed = parseFloat(mosEedInput.value);
if (isNaN(ti) || isNaN(eed)) {
mosResultEl.textContent = 'Enter TI and EED.';
mosResultEl.className = 'result-box text-center';
return;
}
if (eed <= 0) {
mosResultEl.textContent = 'EED must be greater than zero.';
mosResultEl.className = 'result-box text-center bg-yellow-100 text-yellow-800';
return;
}
const mos = ti / eed;
mosResultEl.textContent = `MoS = ${mos.toFixed(2)}`;
if (mos >= 1) {
mosResultEl.className = 'result-box text-center bg-green-100 text-green-800';
} else {
mosResultEl.className = 'result-box text-center bg-red-100 text-red-800';
}
}
[mosTiInput, mosEedInput].forEach(el => el.addEventListener('input', calculateMos));
});
</script>
<!-- END: YOUR CUSTOM HTML -->
</section>
</main>
</body>
</html>