Loading...
Loading...
Draws original hand-written SVG spot scenes in the Line interior style, wide airy rooms or terraces where slim, realistic people do design and coding work. A thin uniform indigo outline (1.4 px at 480 wide) runs around mostly white fills. Sparse flat accents (teal, sage, coral, mustard, lavender, peach wood) cover under 7% of the card. Pale lavender 1 px background decor (brick clusters, pendant lamps, framed posters) sits behind, and a long floor line with end dashes runs under it all. Covers the palette, line weights, heads and hands from a parts toolkit, composition and a render-critique loop. Use when asked for line-art, thin-line or outline illustrations, indigo line art, office, desk, home-workspace, remote-work or team scenes, or interior spot illustrations for empty states, onboarding screens, 404 pages, blog headers, feature spots, landing sections or marketing cards.
npx skill4agent add mengto/skills illustration-line-interiorillustration-outlined-cartoonillustration-framed-panelillustration-flat| Role | Hex | Where it goes |
|---|---|---|
| Indigo ink | | every outline, the floor line, eye dots, indigo hair (hair is a filled ink shape) |
| Wall line | | background decor strokes only (bricks, lamps, posters, clouds, birds, skyline, railing). Never a fill |
| White | | default fill for everything: furniture, shirts, screens, pots, books, sneakers, mugs |
| Peach wood | | wood: ladder rails and boards, posts, stool, crate, a striped pot |
| Mustard | | one book, a duck, bulbs, sneakers, sticky notes, earring stud, a top |
| Orange | | a pot, trousers, a duck beak, shine arcs on brown hair, one code dash |
| Coral | | sneakers or soles, a label, a marker tip, a mug band, one code dash, window dot |
| Teal | | a book, a top, a mug band, a hammock stripe, a check mark |
| Sage / Leaf | | light and dark leaves, alternating leaf by leaf |
| Lavender | | a book, a top, page lines, keyboard lines, a sneaker sole |
| Purple | | a book, trousers, shine arcs on indigo hair, one code dash |
| Denim | | jeans |
| Brown | | brown hair, coffee in a cup |
| Skin | | light, medium, deep, dark; two people in a card get two different tones |
<g id="xx-bg" fill="none" stroke="#cfc9e0" stroke-width="1" stroke-linecap="round" stroke-linejoin="round"><g id="xx-fg" stroke="#3a2d66" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round">fillM190 146h0.1xm()font-family="ui-monospace, monospace" font-weight="700"stroke="none"head()#3a2d66#7f6cc4#7b4b3a#f6a85eafrobunsidecropbeardglassesearringbehindhead(x, y, rot, opts)torso(hx, hy, { style: 'tee' | 'top', facing, fill, skin })TORSO_ANCHORS[style]sleeve(S, arm.u, 13, 5.8)bentArm()arm.IsolveElbow(S, wrist, 35, 30, flip)flipwristFor(HANDS[name].tip, target, angle, scale, flip)restHANDStypecupwrapmarkerHANDS.marker.pen()pointrestreferences/craft.mdflip = truetrouserLeg()bentLeg()cuffAndAnkle()sneaker()scale(-1 1)shoeOpening(heel, rot, mirror)heel = liftedHeel(toeX, 22–28, mirror)sneaker(\. For a mirrored shoe use androtAbout()bricks()lampDome()lampCone()poster()leaf()figLeaf()blade()pot()#ffffffM56 308H424M40 308h10M430 308h10translate(-8 0)rotate(-7 284 180)scripts/interior.mjslimbbentArmsolveElbowsleevetorsotrouserLegbentLegcuffAndAnklesneakershoeOpeningliftedHeelrotAboutHANDShand()place()wristFor()head()mirrorPath()node scripts/interior.mjs --demo /abs/work/demo.svgcard.mjsnode card.mjsimport fs from 'node:fs';
import * as LI from '/abs/path/to/illustration-line-interior/scripts/interior.mjs';
const { W, C, SKIN, FL, P, f } = LI, id = 'sn-', sk = SKIN.medium;
const HC = [300, 102], A = LI.TORSO_ANCHORS.top, rel = q => [HC[0] - q[0], HC[1] + q[1]]; // facing left: mirror x
const LEAN = -5, PV = [300, 188]; // lean toward the left, about the hips
const h = LI.head(HC[0], HC[1], -4, { hair: 'bun', facing: 'left', skin: sk, hairColor: C.brown, earring: true });
const heelB = LI.liftedHeel(300, 24, true); // rear heel up, toe on the floor
const legF = LI.trouserLeg([[296, 188], [293, 230], [291, 270], [290, 291]], [10, 8, 6.2, 5.8], LI.shoeOpening([297, FL], 0, true), C.denim, sk);
const legB = LI.trouserLeg([[306, 188], [309, 230], [313, 262], [316, 282]], [10.6, 8.4, 6.4, 5.8], LI.shoeOpening(heelB, -24, true), C.denim, sk);
let fg = LI.floor(id);
fg += `<rect x="150" y="96" width="70" height="54" rx="2" fill="${W}"/><path d="M158 138l14-16 10 9 12-15 16 12" fill="none" stroke="${C.teal}" stroke-width="1.8"/>`;
fg += legB.skin + LI.sneaker(`translate(${P(heelB)}) rotate(-24) scale(-1 1)`, C.coral, W) + legB.leg;
fg += legF.skin + LI.sneaker(`translate(297 ${FL}) scale(-1 1)`, C.coral, W) + legF.leg;
fg += `<rect x="284" y="${HC[1] + A.waistTop}" width="33" height="5" rx="0.8" fill="${C.denim}"/>`;
fg += `<g transform="rotate(${LEAN} ${P(PV)})">${LI.torso(HC[0], HC[1], { style: 'top', facing: 'left', fill: C.lav, skin: sk })}${h.front}</g>`;
// near arm = LEFT (she faces left); back of the hand visible, index pointing left -> thumb UP.
// HANDS.point keeps its thumb on local -y; at 186 deg local -y points DOWN, so flip = true.
const S = LI.rotAbout(rel(A.nearShoulder), LEAN, PV), ang = 186, tip = [221, 124];
const Wr = LI.wristFor(LI.HANDS.point.tip, tip, ang, 1.1, true);
const arm = LI.bentArm(S, LI.solveElbow(S, Wr, 36, 30), Wr, 4.6, 4.2, 3.3);
fg += `<path d="${arm.d}" fill="${sk}"/><path d="M${P(arm.I)}l${f(-arm.u[0] * 3)} ${f(-arm.u[1] * 3)}" fill="none" stroke-width="1"/>`;
fg += `<path d="${LI.sleeve(S, arm.u, 13, 5.8)}" fill="${C.lav}"/>` + LI.place(LI.hand('point', sk), Wr[0], Wr[1], ang, true, id + 'hand', 1.1);
const bg = LI.bgLayer(id, LI.bricks(60, 80, [[0, 0], [15, 0], [7, 7]]) + LI.lampDome(380, 40));
fs.writeFileSync('card.svg', LI.svgWrap(bg + LI.fgLayer(id, fg), 'Snippet test, Line interior style'));stroke="none"Zhand()<g transform="rotate(-7 hipX hipY)">rotAbout(shoulder, -7, [hipX, hipY])stroke-width="1.8"hand()flipbentArm()flip#cfc9e0examples/books.svgexamples/remote-work.svgtypeclipPathexamples/whiteboard.svgmarkerwrapcupob-card.mjsscripts/interior.mjscard.svg--demoreferences/craft.mdHANDSflipnode scripts/render.mjs card.svg card.pngnode scripts/render.mjs --sheet sheet.png examples/books.svg examples/remote-work.svg examples/whiteboard.svg card.svgnode scripts/render.mjs card.svg z-hand.png --zoom x,y,w,h --scale 8references/craft.mdreferences/craft.mdnode scripts/lint.mjs card.svg --prefix ob- --palette style.json#3a2d66#cfc9e0lint.mjs --palette style.json