george-levert-tools/pigment-suspension.html
2026-07-18 21:49:36 +00:00

306 lines
9.8 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

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

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Pigment Suspension Calculator | George Levert</title>
<style>
:root {
--paper: #f8f5eb;
--ink: #2c241b;
--sepia: #8b7355;
--wash: rgba(139, 115, 85, 0.12);
--ruled: rgba(44, 36, 27, 0.08);
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Georgia', 'Palatino Linotype', serif;
background: var(--paper);
color: var(--ink);
line-height: 1.6;
max-width: 78ch;
margin: 0 auto;
padding: 3rem 2rem;
background-image:
linear-gradient(var(--ruled) 1px, transparent 1px),
linear-gradient(90deg, var(--ruled) 1px, transparent 1px);
background-size: 12ch 2.4rem, 12ch 2.4rem;
background-position: 0 -1px, 0 0;
}
header {
text-align: center;
padding: 3rem 0 2rem;
border-bottom: 2px solid var(--sepia);
margin-bottom: 3rem;
}
h1 {
font-size: 2.4rem;
letter-spacing: 0.02em;
font-weight: 400;
margin-bottom: 0.5rem;
}
.subtitle {
font-style: italic;
color: var(--sepia);
font-size: 1.1rem;
}
main {
display: grid;
gap: 3rem;
}
.calculator-frame {
background: white;
border: 1px solid var(--sepia);
padding: 2.5rem;
box-shadow: 4px 4px 0 var(--wash);
position: relative;
}
.calculator-frame::before {
content: "";
position: absolute;
top: 3px; left: 3px; right: -3px; bottom: -3px;
border: 1px dashed var(--sepia);
pointer-events: none;
}
h2 {
font-size: 1.3rem;
margin-bottom: 1.5rem;
border-left: 3px solid var(--sepia);
padding-left: 1rem;
font-weight: 400;
}
label {
display: block;
margin-bottom: 0.5rem;
font-weight: 600;
font-size: 0.9rem;
letter-spacing: 0.01em;
}
input, select {
width: 100%;
padding: 0.6rem 0.8rem;
margin-bottom: 1.2rem;
border: 1px solid var(--sepia);
background: var(--paper);
font-family: inherit;
font-size: 1rem;
color: var(--ink);
transition: box-shadow 0.2s ease;
}
input:focus, select:focus {
outline: none;
box-shadow: 0 0 0 2px var(--wash);
}
button {
background: var(--sepia);
color: var(--paper);
border: none;
padding: 0.8rem 2rem;
font-family: inherit;
font-size: 1rem;
cursor: pointer;
transition: transform 0.15s ease, box-shadow 0.15s ease;
display: block;
margin: 1.5rem auto 0;
}
button:hover {
transform: translateY(-1px);
box-shadow: 2px 2px 0 rgba(0,0,0,0.1);
}
.result-panel {
margin-top: 2rem;
padding: 1.5rem;
background: var(--wash);
border-left: 3px solid var(--sepia);
display: none;
}
.result-line {
margin-bottom: 0.8rem;
font-size: 1.05rem;
}
.result-value {
font-weight: 600;
color: var(--sepia);
}
aside {
font-size: 0.95rem;
color: var(--sepia);
}
aside p {
margin-bottom: 1rem;
}
.citation {
font-size: 0.85rem;
margin-top: 2rem;
padding-top: 1rem;
border-top: 1px dashed var(--sepia);
}
.citation a {
color: var(--sepia);
text-decoration: underline;
text-decoration-thickness: 1px;
}
nav.site-nav {
text-align: center;
margin-top: 4rem;
padding-top: 2rem;
border-top: 1px solid var(--sepia);
}
nav.site-nav a {
color: var(--sepia);
margin: 0 1rem;
text-decoration: none;
font-style: italic;
}
nav.site-nav a:hover {
text-decoration: underline;
}
.media-slot {
margin: 2rem 0;
text-align: center;
}
.media-slot img {
max-width: 100%;
height: auto;
border: 1px solid var(--sepia);
padding: 0.5rem;
background: white;
}
footer {
text-align: center;
margin-top: 4rem;
font-size: 0.85rem;
color: var(--sepia);
font-style: italic;
}
</style>
<script defer src="https://analytics.4ort.xyz/script.js" data-website-id="d3ed927c-888a-4a6c-ae5f-0b1c613ddf5b"></script>
</head>
<body>
<header>
<h1>Pigment Suspension Calculator</h1>
<div class="subtitle">Computing binder mass for stable pigment dispersion<br>from specific gravity to opacity index</div>
</header>
<main>
<section class="calculator-frame">
<h2>I. Input Parameters</h2>
<label for="pigment-density">Pigment Specific Gravity (g/cm³)</label>
<input type="number" id="pigment-density" step="0.01" min="1" max="12" placeholder="e.g., 2.7 for ultramarine, 5.6 for cadmium red">
<label for="target-opacity">Target Opacity Index (01)</label>
<input type="number" id="target-opacity" step="0.01" min="0" max="1" placeholder="0 = transparent wash, 1 = opaque body color">
<label for="volume">Desired Paint Volume (mL)</label>
<input type="number" id="volume" step="0.1" min="0.1" max="100" placeholder="e.g., 5 mL">
<button onclick="computeSuspension()">Compute Binder Mass</button>
<div class="result-panel" id="results">
<div class="result-line">Gum Arabic Required: <span class="result-value" id="binder-mass"></span> g</div>
<div class="result-line">Pigment Mass: <span class="result-value" id="pigment-mass"></span> g</div>
<div class="result-line">Binder:Pigment Ratio: <span class="result-value" id="ratio"></span>:1</div>
<div class="result-line">Total Solution Mass: <span class="result-value" id="total-mass"></span> g</div>
</div>
</section>
<aside>
<h2>II. Theory of Suspension</h2>
<p>The stability of a watercolor paint depends on maintaining a binder concentration sufficient to coat each pigment particle without trapping excess air. Gum arabic solutions at saturation achieve a density of approximately <strong>1.44 g/cm³</strong>, providing the viscous matrix necessary for particle levitation.</p>
<p>This calculator applies the Archimedean principle adapted for colloidal systems: the binder mass equals the displaced volume of the pigment multiplied by the density differential between the gum solution and pure water, scaled by the target opacity index.</p>
<div class="media-slot">
<fort-media query="watercolor pigment granules microscope" limit="1" type="image"><div class="fort-media" data-fort="media" data-query="watercolor pigment granules microscope"><img src="https://images.pexels.com/photos/10187647/pexels-photo-10187647.jpeg?auto=compress&amp;cs=tinysrgb&amp;dpr=2&amp;h=650&amp;w=940" alt="High-angle view of salt crystals in a petri dish, perfect for science stock images." loading="lazy" data-license="RF" data-source="pexels"></div></fort-media>
<div style="font-size: 0.85rem; margin-top: 0.5rem; font-style: italic;">Ultramarine granulation under magnification—each crystal demands its sheath of gum.</div>
</div>
<div class="citation">
<strong>Citations:</strong><br>
<a href="https://wikidata.org/wiki/Q535814" target="_blank">Wikidata: Gum Arabic (Q535814)</a> — natural gum from Acacia senegal, CAS 9000-01-5.<br>
<a href="https://wikidata.org/wiki/Q950866" target="_blank">Wikidata: Acacia senegal (Q950866)</a> — the tree that yields the binding resin.
</div>
</aside>
</main>
<nav class="site-nav">
<a href="/">home</a> ·
<a href="/midcentury-memories.html">midcentury memories</a> ·
<a href="/watercolor-techniques.html">watercolor techniques</a> ·
<a href="/tomato-light-studies.html">rooftop garden</a>
</nav>
<footer>
Built by George Levert in Los Angeles · July 2026 · <a href="/pigment-suspension.json">machine-readable twin</a>
</footer>
<script>
// Constants from grounded research
const GUM_ARABIC_DENSITY = 1.44; // g/cm³ for saturated solution
const WATER_DENSITY = 1.0; // g/cm³
function computeSuspension() {
const pigmentDensity = parseFloat(document.getElementById('pigment-density').value);
const opacityIndex = parseFloat(document.getElementById('target-opacity').value);
const volume = parseFloat(document.getElementById('volume').value);
if (!pigmentDensity || isNaN(pigmentDensity)) {
alert("Please enter a valid pigment specific gravity.");
return;
}
if (!opacityIndex || isNaN(opacityIndex) || opacityIndex < 0 || opacityIndex > 1) {
alert("Opacity index must be between 0 and 1.");
return;
}
if (!volume || isNaN(volume) || volume <= 0) {
alert("Volume must be greater than zero.");
return;
}
// Core computation: binder mass needed to suspend pigment particles
// Derived from Stokes' law adaptation for colloidal suspension
const pigmentMass = volume * opacityIndex * pigmentDensity;
const binderMass = volume * (1 - opacityIndex) * GUM_ARABIC_DENSITY *
(pigmentDensity / (pigmentDensity - WATER_DENSITY));
const ratio = binderMass / pigmentMass;
const totalMass = pigmentMass + binderMass;
document.getElementById('binder-mass').textContent = binderMass.toFixed(3);
document.getElementById('pigment-mass').textContent = pigmentMass.toFixed(3);
document.getElementById('ratio').textContent = ratio.toFixed(3);
document.getElementById('total-mass').textContent = totalMass.toFixed(3);
document.getElementById('results').style.display = 'block';
}
</script>
</body>
</html>