Skip to content

Commit aaa71b4

Browse files
authored
Merge pull request #17 from plotflow/claude/artwork-sales-website-01JWP9tY4m4hfX8WyoEQZ1kU
design: Three calm-voice redesign directions (specimen / datasheet / …
2 parents 9839da0 + 54274a1 commit aaa71b4

7 files changed

Lines changed: 451 additions & 13 deletions

File tree

index.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ <h2 class="jpcap">マシンドロー</h2>
125125
<div class="grain"></div>
126126
<div class="wrap mani-in">
127127
<div><h2>Drawn by<br>machine<span class="star">.</span></h2><div class="jp">マシンドロー</div></div>
128-
<p>Each Universal-Century mobile suit is rebuilt as a vector drawing and traced in ink by an AxiDraw plotter on Strathmore Bristol. Every impression is unique to its edition, signed and numbered.</p>
128+
<p>Each mobile suit is rebuilt as vector line work and drawn by an AxiDraw plotter in pigment ink on Strathmore Bristol. Ink flow varies with temperature, humidity, and feed rate, so no two copies are identical. Each sheet is inspected, signed, and numbered.</p>
129129
</div>
130130
</section>
131131

@@ -135,7 +135,7 @@ <h2 class="jpcap">マシンドロー</h2>
135135
<div class="wrap">
136136
<div class="shop-head">
137137
<h2>Current Editions<span class="star">*</span></h2><span class="jp">作品</span>
138-
<div class="meta tiny">Limited editions, made to order. Minor variation in line + ink is a feature of the medium.</div>
138+
<div class="meta tiny">Editions of 25, plotted to order. Copies within an edition differ in line weight and ink laydown; no correction is applied.</div>
139139
</div>
140140
<div class="grid" id="grid"></div>
141141
</div>
@@ -147,7 +147,7 @@ <h2>Current Editions<span class="star">*</span></h2><span class="jp">作品</spa
147147
<div class="proc-grid">
148148
<div class="ps"><div class="n">01</div><div class="jp">ベクター化</div><h4>Vectorize</h4><p>The suit is rebuilt as a precise vector drawing. Every line mapped as a coordinate path for the plotter.</p></div>
149149
<div class="ps"><div class="n">02</div><div class="jp">作画</div><h4>Plot</h4><p>An AxiDraw traces the paths in Staedtler Triplus 0.3mm fineliner on Strathmore 300 Bristol, 11×14″.</p></div>
150-
<div class="ps"><div class="n">03</div><div class="jp">仕上げ</div><h4>Finish</h4><p>Inspected, signed, and numbered. No two prints in an edition are ever identical.</p></div>
150+
<div class="ps"><div class="n">03</div><div class="jp">仕上げ</div><h4>Finish</h4><p>Each sheet is inspected, signed, and numbered by hand. No two sheets in an edition are identical.</p></div>
151151
</div>
152152
</div>
153153
</section>
@@ -157,14 +157,14 @@ <h2>Current Editions<span class="star">*</span></h2><span class="jp">作品</spa
157157
<div class="grain"></div>
158158
<div class="wrap news-in">
159159
<div class="news-copy">
160-
<h2>Join the drop list<span class="star">*</span></h2>
160+
<h2>Notifications<span class="star">*</span></h2>
161161
<div class="jp">入荷通知</div>
162-
<p>Editions are limited to 25 and sell out. Get an email the moment a new suit drops or a sold-out edition is back. No spam, just drops.</p>
162+
<p>New editions are released irregularly. To be notified when one is released or restocked, leave an email address. It is used for that purpose only.</p>
163163
</div>
164164
<form class="news-form" id="newsForm" novalidate>
165165
<div class="news-row">
166166
<input type="email" id="newsEmail" placeholder="you@example.com" autocomplete="email" required aria-label="Email address">
167-
<button type="submit">Notify me</button>
167+
<button type="submit">Notify</button>
168168
</div>
169169
<p class="news-msg tiny" id="newsMsg" role="status"></p>
170170
</form>
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
<!DOCTYPE html>
2+
<html lang="en"><head><meta charset="utf-8">
3+
<title>PLOTFLOW · Specimen direction</title>
4+
<style>
5+
:root{
6+
--paper:#f4f1e8; --ink:#1c1d17; --dim:#7d7f74; --line:#dcd7c8; --red:#c93b22;
7+
--sans:'Archivo','Liberation Sans',Arial,sans-serif;
8+
--mono:'Liberation Mono',monospace;
9+
}
10+
*{margin:0;padding:0;box-sizing:border-box}
11+
body{background:var(--paper);color:var(--ink);font-family:var(--sans);font-weight:400;
12+
font-size:14px;line-height:1.65}
13+
a{color:inherit}
14+
/* header — one quiet line */
15+
header{display:flex;justify-content:space-between;align-items:baseline;
16+
padding:22px 48px;border-bottom:1px solid var(--line)}
17+
.brand{font-weight:700;font-size:14px;letter-spacing:.02em}
18+
.brand i{color:var(--red);font-style:normal}
19+
header nav{display:flex;gap:26px;font-size:12.5px;color:var(--dim)}
20+
header nav a{text-decoration:none}
21+
header nav a:hover{color:var(--ink)}
22+
/* intro — declarative, no pitch */
23+
.intro{max-width:1200px;margin:0 auto;padding:72px 48px 56px;
24+
display:grid;grid-template-columns:minmax(320px,460px) 1fr;gap:72px}
25+
.intro h1{font-weight:400;font-size:21px;line-height:1.55;letter-spacing:0}
26+
.intro .facts{margin-top:26px;font-family:var(--mono);font-size:11px;line-height:2.1;color:var(--dim)}
27+
.intro .facts b{color:var(--ink);font-weight:400}
28+
/* measured drawing — dimension lines like an engineering sheet */
29+
.measure{position:relative;padding:10px 64px 54px 10px}
30+
.measure svg.art path{fill:none;stroke:var(--ink);stroke-width:1.1}
31+
.dim{position:absolute;font-family:var(--mono);font-size:10px;color:var(--dim)}
32+
.dim.h{left:10px;right:74px;bottom:26px;border-bottom:1px solid var(--dim);text-align:center;padding-bottom:3px}
33+
.dim.h::before,.dim.h::after{content:'';position:absolute;bottom:-4px;width:1px;height:9px;background:var(--dim)}
34+
.dim.h::before{left:0}.dim.h::after{right:0}
35+
.dim.v{top:10px;bottom:64px;right:38px;border-right:1px solid var(--dim);
36+
writing-mode:vertical-rl;text-align:center;padding-right:4px}
37+
.dim.v::before,.dim.v::after{content:'';position:absolute;right:-5px;height:1px;width:9px;background:var(--dim)}
38+
.dim.v::before{top:0}.dim.v::after{bottom:0}
39+
/* record table */
40+
.records{max-width:1200px;margin:0 auto;padding:0 48px 80px}
41+
.records h2{font-weight:400;font-size:13px;color:var(--dim);border-bottom:1px solid var(--ink);
42+
padding-bottom:8px;margin-bottom:0}
43+
table{width:100%;border-collapse:collapse;font-size:13px}
44+
th{font-family:var(--mono);font-size:10px;font-weight:400;color:var(--dim);text-align:left;
45+
padding:12px 14px 8px 0;border-bottom:1px solid var(--line);letter-spacing:.06em}
46+
td{padding:14px 14px 14px 0;border-bottom:1px solid var(--line);vertical-align:middle}
47+
td.num,th.num{font-family:var(--mono);font-size:11.5px;text-align:right;padding-right:22px}
48+
td .th{width:56px;height:64px}
49+
td .th path{fill:none;stroke:var(--ink);stroke-width:2.4}
50+
td .name{font-weight:700}
51+
td .jp{color:var(--dim);font-size:12px;margin-left:8px;font-weight:400}
52+
td .code{font-family:var(--mono);font-size:10.5px;color:var(--dim)}
53+
td .st{font-family:var(--mono);font-size:10px;color:var(--dim)}
54+
td .st.open{color:var(--red)}
55+
tr:hover td{background:rgba(28,29,23,.025)}
56+
.foot-note{max-width:1200px;margin:0 auto;padding:0 48px 40px;
57+
font-size:12px;color:var(--dim);line-height:1.8;max-width:1200px}
58+
.foot-note p{max-width:560px;margin-bottom:10px}
59+
.foot-note sup{color:var(--red)}
60+
footer{border-top:1px solid var(--line);padding:22px 48px;display:flex;
61+
justify-content:space-between;font-family:var(--mono);font-size:10px;color:var(--dim)}
62+
</style></head>
63+
<body>
64+
<header>
65+
<span class="brand">PLOTFLOW<i>*</i></span>
66+
<nav><a href="#">Editions</a><a href="#">Method</a><a href="#">Notes</a><a href="#">Cart — 0</a></nav>
67+
</header>
68+
69+
<section class="intro">
70+
<div>
71+
<h1>Pen-plotted drawings of Universal-Century mobile suits. Each drawing is executed
72+
by an AxiDraw plotter in pigment ink on Strathmore Bristol, then inspected, signed,
73+
and numbered. Editions are limited to 25.</h1>
74+
<div class="facts" id="facts"></div>
75+
</div>
76+
<div class="measure" id="measure"></div>
77+
</section>
78+
79+
<section class="records">
80+
<h2>Records — current editions</h2>
81+
<table id="tbl">
82+
<thead><tr>
83+
<th style="width:70px"></th><th>Designation</th>
84+
<th class="num">Ink</th><th class="num">Strokes</th><th class="num">Plot time</th>
85+
<th class="num">Sheet</th><th>Status</th>
86+
</tr></thead>
87+
<tbody></tbody>
88+
</table>
89+
</section>
90+
91+
<div class="foot-note">
92+
<p><sup>1</sup> Plot time is measured, not estimated: pen-down travel at 1100 mm/min,
93+
pen-up travel at 6600 mm/min, and 0.10 s per pen lift.</p>
94+
<p><sup>2</sup> Ink flow varies with temperature, humidity, and feed rate. Copies within
95+
an edition differ accordingly. This is a property of the medium and is not corrected.</p>
96+
<p><sup>3</sup> To be notified when an edition is released or restocked, leave an email
97+
address on the notes page. Nothing else is sent.</p>
98+
</div>
99+
100+
<footer>
101+
<span>PLOTFLOW · プロットフロー · est. 2026</span>
102+
<span>machine-drawn · signed &amp; numbered · plotted in the U.S.A.</span>
103+
</footer>
104+
105+
<script src="/data/editions.js"></script>
106+
<script>
107+
const S = window.PLOTFLOW.suits, ORDER = window.PLOTFLOW.shopOrder;
108+
function stats(s){
109+
const re=/([ML])\s*(-?\d+(?:\.\d+)?),(-?\d+(?:\.\d+)?)/g;
110+
let m,px=null,py=null,draw=0,travel=0,lifts=0,verts=0;
111+
let minx=1e9,miny=1e9,maxx=-1e9,maxy=-1e9;
112+
while((m=re.exec(s.d))!==null){
113+
const x=+m[2],y=+m[3]; verts++;
114+
if(x<minx)minx=x; if(x>maxx)maxx=x; if(y<miny)miny=y; if(y>maxy)maxy=y;
115+
if(m[1]==='M'){ if(px!==null){travel+=Math.hypot(x-px,y-py);lifts++;} }
116+
else if(px!==null){ draw+=Math.hypot(x-px,y-py); }
117+
px=x;py=y;
118+
}
119+
const mm=420/Math.max(maxx-minx,maxy-miny);
120+
const min=(draw*mm)/1100+(travel*mm)/6600+lifts*0.10/60;
121+
return {ink:(draw*mm/1000), min, strokes:lifts+1, verts,
122+
bb:[minx,miny,maxx-minx,maxy-miny], wmm:(maxx-minx)*mm, hmm:(maxy-miny)*mm};
123+
}
124+
function fmt(min){const s2=Math.round(min*60);return Math.floor(s2/60)+':'+String(s2%60).padStart(2,'0');}
125+
126+
// measured hero — Zaku with dimension lines
127+
const z=S['zaku'], zs=stats(z), pad=zs.bb[2]*0.03;
128+
document.getElementById('measure').innerHTML =
129+
`<svg class="art" viewBox="${zs.bb[0]-pad} ${zs.bb[1]-pad} ${zs.bb[2]+2*pad} ${zs.bb[3]+2*pad}"
130+
preserveAspectRatio="xMidYMid meet" style="width:100%;max-height:520px">
131+
<path d="${z.d}"/></svg>
132+
<span class="dim h">${zs.wmm.toFixed(0)} mm</span>
133+
<span class="dim v">${zs.hmm.toFixed(0)} mm</span>`;
134+
document.getElementById('facts').innerHTML =
135+
`shown&nbsp; <b>${z.code} ${z.name} · ${z.jp}</b><br>` +
136+
`ink&nbsp;&nbsp;&nbsp; <b>${zs.ink.toFixed(1)} m</b> over <b>${zs.strokes.toLocaleString()}</b> strokes<br>` +
137+
`plot&nbsp;&nbsp; <b>${fmt(zs.min)}</b> at 1100 mm/min<sup>1</sup><br>` +
138+
`pen&nbsp;&nbsp;&nbsp; Staedtler Triplus 0.3 mm, pigment<br>` +
139+
`paper&nbsp; Strathmore Bristol 300, 11×14 in`;
140+
141+
// records table
142+
document.querySelector('#tbl tbody').innerHTML = ORDER.map(k=>{
143+
const s=S[k], t=stats(s), p2=t.bb[2]*0.05;
144+
const ed=s.edition.split('·')[0].trim().replace('ED. ','');
145+
return `<tr>
146+
<td><svg class="th" viewBox="${t.bb[0]-p2} ${t.bb[1]-p2} ${t.bb[2]+2*p2} ${t.bb[3]+2*p2}"
147+
preserveAspectRatio="xMidYMid meet"><path d="${s.d}"/></svg></td>
148+
<td><span class="name">${s.name}</span><span class="jp">${s.jp}</span><br>
149+
<span class="code">${s.code}</span></td>
150+
<td class="num">${t.ink.toFixed(1)} m</td>
151+
<td class="num">${t.strokes.toLocaleString()}</td>
152+
<td class="num">${fmt(t.min)}</td>
153+
<td class="num">11×14</td>
154+
<td><span class="st open">${ed} · available</span></td>
155+
</tr>`;
156+
}).join('');
157+
</script>
158+
</body></html>
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
<!DOCTYPE html>
2+
<html lang="en"><head><meta charset="utf-8">
3+
<title>PLOTFLOW · Datasheet direction</title>
4+
<style>
5+
:root{
6+
--paper:#f7f5ee; --ink:#191a14; --dim:#83857a; --line:#d8d4c6; --red:#c93b22;
7+
--sans:'Archivo','Liberation Sans',Arial,sans-serif; --mono:'Liberation Mono',monospace;
8+
}
9+
*{margin:0;padding:0;box-sizing:border-box}
10+
body{background:var(--paper);color:var(--ink);font-family:var(--sans);font-size:13.5px;line-height:1.7}
11+
.doc{max-width:960px;margin:0 auto;padding:0 40px}
12+
/* datasheet masthead */
13+
.mast{display:flex;justify-content:space-between;align-items:flex-end;
14+
border-bottom:2px solid var(--ink);padding:34px 0 14px}
15+
.mast .brand{font-weight:700;font-size:22px;letter-spacing:.01em}
16+
.mast .brand i{color:var(--red);font-style:normal}
17+
.mast .meta{font-family:var(--mono);font-size:10px;color:var(--dim);text-align:right;line-height:1.9}
18+
.titleblock{display:flex;justify-content:space-between;align-items:baseline;
19+
border-bottom:1px solid var(--line);padding:14px 0}
20+
.titleblock h1{font-weight:400;font-size:15px}
21+
.titleblock nav{display:flex;gap:22px;font-size:12px;color:var(--dim)}
22+
.titleblock nav a{text-decoration:none;color:inherit}
23+
section{padding:30px 0;border-bottom:1px solid var(--line)}
24+
h2{font-size:13.5px;font-weight:700;margin-bottom:10px}
25+
h2 .n{font-family:var(--mono);font-weight:400;color:var(--red);margin-right:12px}
26+
section p{max-width:620px;color:#3c3e34;margin-bottom:8px}
27+
/* editions table */
28+
table{width:100%;border-collapse:collapse;margin-top:14px;font-size:12.5px}
29+
th{font-family:var(--mono);font-size:10px;font-weight:400;text-align:left;color:var(--dim);
30+
border-top:1px solid var(--ink);border-bottom:1px solid var(--line);padding:8px 12px 8px 0}
31+
td{border-bottom:1px solid var(--line);padding:10px 12px 10px 0;vertical-align:middle}
32+
.num{font-family:var(--mono);font-size:11px;text-align:right;padding-right:26px}
33+
td svg{width:40px;height:46px}
34+
td svg path{fill:none;stroke:var(--ink);stroke-width:2.6}
35+
td b{font-weight:700}
36+
td .jp{color:var(--dim);font-size:11.5px;margin-left:7px}
37+
.avail{font-family:var(--mono);font-size:10px;color:var(--red)}
38+
/* two-col spec lists */
39+
.cols{display:grid;grid-template-columns:1fr 1fr;gap:40px;max-width:820px}
40+
dl{font-size:12.5px}
41+
dt{font-family:var(--mono);font-size:10px;color:var(--dim);margin-top:10px}
42+
dd{margin:1px 0 0}
43+
/* ordering steps as plain numbered rows */
44+
ol{max-width:620px;margin:10px 0 0 16px;color:#3c3e34}
45+
ol li{margin-bottom:6px}
46+
.docfoot{display:flex;justify-content:space-between;font-family:var(--mono);
47+
font-size:10px;color:var(--dim);padding:20px 0 46px}
48+
</style></head>
49+
<body>
50+
<div class="doc">
51+
<div class="mast">
52+
<span class="brand">PLOTFLOW<i>*</i></span>
53+
<div class="meta">DOCUMENT PF-100 · REV C<br>2026-08 · プロットフロー</div>
54+
</div>
55+
<div class="titleblock">
56+
<h1>Machine-drawn editions — Universal-Century mobile suits</h1>
57+
<nav><a href="#s3">Editions</a><a href="#s2">Method</a><a href="#s5">Ordering</a><a href="#">Cart — 0</a></nav>
58+
</div>
59+
60+
<section id="s1">
61+
<h2><span class="n">1.0</span>Scope</h2>
62+
<p>PLOTFLOW produces pen-plotted drawings of Universal-Century mobile suits. Each copy
63+
is drawn individually by machine, in ink, on archival paper. This document describes the
64+
current editions, the drawing method, and how to order.</p>
65+
</section>
66+
67+
<section id="s2">
68+
<h2><span class="n">2.0</span>Method</h2>
69+
<p>2.1 — The subject is rebuilt as vector line work and compiled to a stroke program.</p>
70+
<p>2.2 — An AxiDraw plotter executes the program with a Staedtler Triplus 0.3 mm
71+
pigment fineliner on Strathmore Bristol 300, 11×14 in. Pen-down feed is 1100 mm/min.</p>
72+
<p>2.3 — Ink laydown varies with temperature, humidity, and feed. Copies within an
73+
edition therefore differ in line weight and saturation. No correction is applied.</p>
74+
<p>2.4 — Finished sheets are inspected, signed, and numbered by hand.</p>
75+
</section>
76+
77+
<section id="s3">
78+
<h2><span class="n">3.0</span>Current editions</h2>
79+
<table>
80+
<thead><tr>
81+
<th style="width:52px"></th><th>Designation</th><th>Code</th>
82+
<th class="num">Ink, m</th><th class="num">Strokes</th><th class="num">Vertices</th>
83+
<th class="num">Plot time</th><th>Availability</th>
84+
</tr></thead>
85+
<tbody id="tbody"></tbody>
86+
</table>
87+
<p style="font-family:var(--mono);font-size:10px;color:var(--dim);margin-top:10px">
88+
Plot time includes pen-up travel (6600 mm/min) and 0.10 s per pen lift. Values are
89+
computed from the stroke program, not estimated.</p>
90+
</section>
91+
92+
<section id="s4">
93+
<h2><span class="n">4.0</span>Materials</h2>
94+
<div class="cols">
95+
<dl>
96+
<dt>PAPER</dt><dd>Strathmore 300 Series Bristol, smooth, 270 gsm, 11×14 in</dd>
97+
<dt>INK</dt><dd>Staedtler Triplus 0.3 mm fineliner, pigment-based, lightfast</dd>
98+
</dl>
99+
<dl>
100+
<dt>MACHINE</dt><dd>AxiDraw pen plotter; travel 430×297 mm</dd>
101+
<dt>FINISHING</dt><dd>Inspected, signed, numbered; unframed</dd>
102+
</dl>
103+
</div>
104+
</section>
105+
106+
<section id="s5">
107+
<h2><span class="n">5.0</span>Ordering</h2>
108+
<ol>
109+
<li>Each copy is plotted after the order is placed. Allow 2–3 weeks before dispatch.</li>
110+
<li>Shipping: free within the U.S.; flat $20 international. Taxes at checkout.</li>
111+
<li>Copies damaged in transit are replaced at no cost.</li>
112+
<li>To be notified when an edition is released or restocked, leave an email address.
113+
It is used for that purpose only.</li>
114+
</ol>
115+
</section>
116+
117+
<div class="docfoot">
118+
<span>PLOTFLOW · plotted in the U.S.A. · est. 2026</span>
119+
<span>PF-100 REV C · page 1 of 1</span>
120+
</div>
121+
</div>
122+
123+
<script src="/data/editions.js"></script>
124+
<script>
125+
const S = window.PLOTFLOW.suits, ORDER = window.PLOTFLOW.shopOrder;
126+
function stats(s){
127+
const re=/([ML])\s*(-?\d+(?:\.\d+)?),(-?\d+(?:\.\d+)?)/g;
128+
let m,px=null,py=null,draw=0,travel=0,lifts=0,verts=0;
129+
let minx=1e9,miny=1e9,maxx=-1e9,maxy=-1e9;
130+
while((m=re.exec(s.d))!==null){
131+
const x=+m[2],y=+m[3]; verts++;
132+
if(x<minx)minx=x; if(x>maxx)maxx=x; if(y<miny)miny=y; if(y>maxy)maxy=y;
133+
if(m[1]==='M'){ if(px!==null){travel+=Math.hypot(x-px,y-py);lifts++;} }
134+
else if(px!==null){ draw+=Math.hypot(x-px,y-py); }
135+
px=x;py=y;
136+
}
137+
const mm=420/Math.max(maxx-minx,maxy-miny);
138+
return {ink:(draw*mm/1000), min:(draw*mm)/1100+(travel*mm)/6600+lifts*0.10/60,
139+
strokes:lifts+1, verts, bb:[minx,miny,maxx-minx,maxy-miny]};
140+
}
141+
const fmt=n=>{const s2=Math.round(n*60);return Math.floor(s2/60)+':'+String(s2%60).padStart(2,'0')};
142+
document.getElementById('tbody').innerHTML = ORDER.map(k=>{
143+
const s=S[k], t=stats(s), p=t.bb[2]*0.05;
144+
const ed=s.edition.split('·')[0].trim().replace('ED. ','');
145+
return `<tr>
146+
<td><svg viewBox="${t.bb[0]-p} ${t.bb[1]-p} ${t.bb[2]+2*p} ${t.bb[3]+2*p}"
147+
preserveAspectRatio="xMidYMid meet"><path d="${s.d}"/></svg></td>
148+
<td><b>${s.name}</b><span class="jp">${s.jp}</span></td>
149+
<td style="font-family:var(--mono);font-size:11px">${s.code}</td>
150+
<td class="num">${t.ink.toFixed(1)}</td>
151+
<td class="num">${t.strokes.toLocaleString()}</td>
152+
<td class="num">${t.verts.toLocaleString()}</td>
153+
<td class="num">${fmt(t.min)}</td>
154+
<td><span class="avail">${ed} available</span></td>
155+
</tr>`;
156+
}).join('');
157+
</script>
158+
</body></html>

0 commit comments

Comments
 (0)