{"id":"type-foundry","title":"Type foundry","category":"Typography","prompt":"A type specimen that builds itself. A radial generator backdrop, dimmed under a wash. The word TYPE in oversized display lettering built as a letter COLLAGE — one coloured tile per glyph, cascading in — with FOUNDRY beneath it in a second collage treatment on a wave. A strapline, 'letterforms are items too', typing itself on under a neon text effect and an outline text style. A gradient focal mark pulsing under a sparkle particle effect, and a field of small accents fading at individual tempos. A footer naming the machinery: collage · text effect · text style · particles · generator.","designedBy":{"provider":"anthropic","model":"claude-fable-5","inference":{"inputTokens":0,"outputTokens":0,"costUsd":0,"inPerMTokUsd":10,"outPerMTokUsd":50,"interactive":true}},"render":{"jobId":"rnd_1788538564214_8kyt28","credits":8,"priceUsd":0.12,"format":"mp4","renderMs":15251,"frameCount":240,"bytes":137797,"seed":633318473,"engineVersion":"v0.5.6","width":1440,"height":1080,"fps":30,"durationSeconds":8},"howToReproduce":{"renderApi":"POST /v1/renders with `renderRequest` below as the body (Authorization: Bearer <your pp_sa_… key>).","editor":"/gallery/type-foundry/editor opens this piece live in the studio.","codeConsole":"/gallery/type-foundry.js is this piece as PinePaper code — paste it into the editor's AI code console."},"renderRequest":{"scene":{"canvas":{"width":800,"height":600},"items":[],"relations":[],"generators":[],"media":[],"skeletons":[],"background":"#08080e","engineOps":[{"tool":"execute_custom_code","args":{"description":"Type foundry: a quiet specimen page — gradient letter collage, a text style, a text effect, one particle mark","code":"function prng(seed){var t=seed>>>0;return function(){t+=0x6D2B79F5;var r=Math.imul(t^(t>>>15),1|t);r^=r+Math.imul(r^(r>>>7),61|r);return((r^(r>>>14))>>>0)/4294967296;}}\nvar r = prng(20260821);\nvar W = 800, H = 600, DUR = 8;\n// A GRID, declared first. Everything below sits on it.\nvar CX = W / 2, TOP = 150, BASE = 300, RULE_Y = 372, SPEC_Y = 430, FOOT_Y = 545;\n\n// Ground: a single deep tone and one soft pool of light. The first version\n// of this piece put a full-saturation sunburst behind the type — olive and\n// maroon wedges fighting mustard tiles — which is a feature demo, not a\n// specimen. A specimen page is quiet so the letterforms can be looked at.\nPinePaper.create('rectangle', { x: CX, y: H / 2, width: W, height: H, fillColor: '#08080e' });\nPinePaper.create('circle', { x: CX, y: BASE - 40, radius: 300, fillColor: { type: 'radial', stops: [{ color: '#161a2e' }, { color: '#08080e' }] }, opacity: 0.85 });\n\n// THE SPECIMEN. letterStyle 'gradient' renders the glyphs themselves —\n// the default 'paperCut' packs each letter into a coloured block, which is\n// where the mustard-and-grey bingo card came from.\nvar big = null;\ntry { big = app.createLetterCollage('TYPE', { x: CX, y: TOP + 40, fontSize: 150, style: 'gradient' }); } catch (e) { console.warn('collage', e); }\ntry { if (big) app.animateLetterCollage(big, { animationType: 'cascade', speed: 0.8 }); } catch (e) { /* still legible without it */ }\n\n// Second line, set as TYPE not as tiles, with a text style on it.\nvar sub = PinePaper.create('text', { x: CX, y: BASE, content: 'F O U N D R Y', fontSize: 34, fontWeight: '300', fillColor: '#c8d2e8' });\ntry { app.applyTextStyle(sub, 'outline-only'); } catch (e) { console.warn('text style', e); }\n\n// A hairline rule — the thing that makes a page look set rather than\n// arranged. Draws itself open from the centre.\nvar rule = PinePaper.create('rectangle', { x: CX, y: RULE_Y, width: 8, height: 1.5, fillColor: '#3d4763' });\nPinePaper.modifyItem(rule, { animationType: 'keyframe', duration: DUR, keyframes: [\n  { time: 0, properties: { width: 8, opacity: 0 } },\n  { time: 1.0, properties: { width: 8, opacity: 0.9 } },\n  { time: 2.2, properties: { width: 470, opacity: 0.9 }, easing: 'easeOut' },\n  { time: DUR, properties: { width: 470, opacity: 0.9 } }\n] });\n\n// The character set, one size, evenly tracked — a specimen shows the font,\n// not just a word.\nvar GLYPHS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\nvar startX = CX - (GLYPHS.length - 1) * 17 / 2;\nfor (var g = 0; g < GLYPHS.length; g++) {\n  var gl = PinePaper.create('text', { x: startX + g * 17, y: SPEC_Y, content: GLYPHS[g], fontSize: 19, fillColor: '#7f8bab', opacity: 0 });\n  PinePaper.modifyItem(gl, { animationType: 'keyframe', duration: DUR, keyframes: [\n    { time: 0, properties: { opacity: 0 } },\n    { time: 2.4 + g * 0.035, properties: { opacity: 0 } },\n    { time: 2.7 + g * 0.035, properties: { opacity: 0.85 } },\n    { time: DUR, properties: { opacity: 0.85 } }\n  ] });\n}\n\n// Strapline, typed on, with a text EFFECT — the third piece of machinery.\nvar strap = PinePaper.create('text', { x: CX, y: SPEC_Y + 56, content: '', fontSize: 21, fillColor: '#e6ecfa' });\ntry { app.applyTextEffect(strap, 'neon'); } catch (e) { console.warn('text effect', e); }\n\n// One focal mark, carrying the particle effect. Parked BETWEEN the\n// strapline and the footer — at FOOT_Y - 58 it landed on the strapline's\n// own baseline and sat in the middle of the word 'are'.\nvar mark = PinePaper.create('circle', { x: CX, y: FOOT_Y - 27, radius: 9, fillColor: { type: 'radial', stops: [{ color: '#fde68a' }, { color: '#f59e0b' }] } });\nPinePaper.animate(mark, { animationType: 'pulse', speed: 0.5 });\ntry { app.applyEffect(mark, 'sparkle', { color: '#fde68a' }); } catch (e) { console.warn('effect', e); }\n\n// Accents: few, dim, and kept out of the type's column.\nfor (var i = 0; i < 26; i++) {\n  var side = r() < 0.5 ? -1 : 1;\n  var ax = CX + side * (200 + r() * 170);\n  var id = PinePaper.create('circle', { x: ax, y: 60 + r() * 480, radius: 0.8 + r() * 1.6, fillColor: r() < 0.5 ? '#5b7bb5' : '#8b6fb5', opacity: 0.16 + r() * 0.24 });\n  PinePaper.animate(id, { animationType: 'fade', speed: 0.3 + r() * 1.1 });\n}\n\nvar foot = PinePaper.create('text', { x: CX, y: FOOT_Y, content: 'letter collage \\u00b7 text style \\u00b7 text effect \\u00b7 particles', fontSize: 16, fillColor: '#8492b0', opacity: 0 });\nPinePaper.modifyItem(foot, { animationType: 'keyframe', duration: DUR, keyframes: [\n  { time: 0, properties: { opacity: 0 } },\n  { time: 5.4, properties: { opacity: 0 } },\n  { time: 6.1, properties: { opacity: 0.9 } },\n  { time: DUR, properties: { opacity: 0.9 } }\n] });\nPinePaper.modifyItem(strap, { animationType: 'keyframe', duration: 8, keyframes: [{ time: 0, properties: { content: '' } }, { time: 3.60, properties: { content: '' } }, { time: 3.650, properties: { content: 'l' } }, { time: 3.700, properties: { content: 'le' } }, { time: 3.750, properties: { content: 'let' } }, { time: 3.800, properties: { content: 'lett' } }, { time: 3.850, properties: { content: 'lette' } }, { time: 3.900, properties: { content: 'letter' } }, { time: 3.950, properties: { content: 'letterf' } }, { time: 4.000, properties: { content: 'letterfo' } }, { time: 4.050, properties: { content: 'letterfor' } }, { time: 4.100, properties: { content: 'letterform' } }, { time: 4.150, properties: { content: 'letterforms' } }, { time: 4.200, properties: { content: 'letterforms ' } }, { time: 4.250, properties: { content: 'letterforms a' } }, { time: 4.300, properties: { content: 'letterforms ar' } }, { time: 4.350, properties: { content: 'letterforms are' } }, { time: 4.400, properties: { content: 'letterforms are ' } }, { time: 4.450, properties: { content: 'letterforms are i' } }, { time: 4.500, properties: { content: 'letterforms are it' } }, { time: 4.550, properties: { content: 'letterforms are ite' } }, { time: 4.600, properties: { content: 'letterforms are item' } }, { time: 4.650, properties: { content: 'letterforms are items' } }, { time: 4.700, properties: { content: 'letterforms are items ' } }, { time: 4.750, properties: { content: 'letterforms are items t' } }, { time: 4.800, properties: { content: 'letterforms are items to' } }, { time: 4.850, properties: { content: 'letterforms are items too' } }, { time: 8.00, properties: { content: 'letterforms are items too' } }] });"}}]},"exportProfile":{"format":"mp4","resolution":"1080p","fps":30,"durationSeconds":6},"source":{"prompt":"A type specimen that builds itself. A radial generator backdrop, dimmed under a wash. The word TYPE in oversized display lettering built as a letter COLLAGE — one coloured tile per glyph, cascading in — with FOUNDRY beneath it in a second collage treatment on a wave. A strapline, 'letterforms are items too', typing itself on under a neon text effect and an outline text style. A gradient focal mark pulsing under a sparkle particle effect, and a field of small accents fading at individual tempos. A footer naming the machinery: collage · text effect · text style · particles · generator.","provider":"anthropic","model":"claude-fable-5","app":"gallery-reproduction"}},"ops":[{"tool":"pinepaper_set_background_color","args":{"color":"#08080e"}},{"tool":"pinepaper_execute_custom_code","args":{"description":"Type foundry: a quiet specimen page — gradient letter collage, a text style, a text effect, one particle mark","code":"function prng(seed){var t=seed>>>0;return function(){t+=0x6D2B79F5;var r=Math.imul(t^(t>>>15),1|t);r^=r+Math.imul(r^(r>>>7),61|r);return((r^(r>>>14))>>>0)/4294967296;}}\nvar r = prng(20260821);\nvar W = 800, H = 600, DUR = 8;\n// A GRID, declared first. Everything below sits on it.\nvar CX = W / 2, TOP = 150, BASE = 300, RULE_Y = 372, SPEC_Y = 430, FOOT_Y = 545;\n\n// Ground: a single deep tone and one soft pool of light. The first version\n// of this piece put a full-saturation sunburst behind the type — olive and\n// maroon wedges fighting mustard tiles — which is a feature demo, not a\n// specimen. A specimen page is quiet so the letterforms can be looked at.\nPinePaper.create('rectangle', { x: CX, y: H / 2, width: W, height: H, fillColor: '#08080e' });\nPinePaper.create('circle', { x: CX, y: BASE - 40, radius: 300, fillColor: { type: 'radial', stops: [{ color: '#161a2e' }, { color: '#08080e' }] }, opacity: 0.85 });\n\n// THE SPECIMEN. letterStyle 'gradient' renders the glyphs themselves —\n// the default 'paperCut' packs each letter into a coloured block, which is\n// where the mustard-and-grey bingo card came from.\nvar big = null;\ntry { big = app.createLetterCollage('TYPE', { x: CX, y: TOP + 40, fontSize: 150, style: 'gradient' }); } catch (e) { console.warn('collage', e); }\ntry { if (big) app.animateLetterCollage(big, { animationType: 'cascade', speed: 0.8 }); } catch (e) { /* still legible without it */ }\n\n// Second line, set as TYPE not as tiles, with a text style on it.\nvar sub = PinePaper.create('text', { x: CX, y: BASE, content: 'F O U N D R Y', fontSize: 34, fontWeight: '300', fillColor: '#c8d2e8' });\ntry { app.applyTextStyle(sub, 'outline-only'); } catch (e) { console.warn('text style', e); }\n\n// A hairline rule — the thing that makes a page look set rather than\n// arranged. Draws itself open from the centre.\nvar rule = PinePaper.create('rectangle', { x: CX, y: RULE_Y, width: 8, height: 1.5, fillColor: '#3d4763' });\nPinePaper.modifyItem(rule, { animationType: 'keyframe', duration: DUR, keyframes: [\n  { time: 0, properties: { width: 8, opacity: 0 } },\n  { time: 1.0, properties: { width: 8, opacity: 0.9 } },\n  { time: 2.2, properties: { width: 470, opacity: 0.9 }, easing: 'easeOut' },\n  { time: DUR, properties: { width: 470, opacity: 0.9 } }\n] });\n\n// The character set, one size, evenly tracked — a specimen shows the font,\n// not just a word.\nvar GLYPHS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\nvar startX = CX - (GLYPHS.length - 1) * 17 / 2;\nfor (var g = 0; g < GLYPHS.length; g++) {\n  var gl = PinePaper.create('text', { x: startX + g * 17, y: SPEC_Y, content: GLYPHS[g], fontSize: 19, fillColor: '#7f8bab', opacity: 0 });\n  PinePaper.modifyItem(gl, { animationType: 'keyframe', duration: DUR, keyframes: [\n    { time: 0, properties: { opacity: 0 } },\n    { time: 2.4 + g * 0.035, properties: { opacity: 0 } },\n    { time: 2.7 + g * 0.035, properties: { opacity: 0.85 } },\n    { time: DUR, properties: { opacity: 0.85 } }\n  ] });\n}\n\n// Strapline, typed on, with a text EFFECT — the third piece of machinery.\nvar strap = PinePaper.create('text', { x: CX, y: SPEC_Y + 56, content: '', fontSize: 21, fillColor: '#e6ecfa' });\ntry { app.applyTextEffect(strap, 'neon'); } catch (e) { console.warn('text effect', e); }\n\n// One focal mark, carrying the particle effect. Parked BETWEEN the\n// strapline and the footer — at FOOT_Y - 58 it landed on the strapline's\n// own baseline and sat in the middle of the word 'are'.\nvar mark = PinePaper.create('circle', { x: CX, y: FOOT_Y - 27, radius: 9, fillColor: { type: 'radial', stops: [{ color: '#fde68a' }, { color: '#f59e0b' }] } });\nPinePaper.animate(mark, { animationType: 'pulse', speed: 0.5 });\ntry { app.applyEffect(mark, 'sparkle', { color: '#fde68a' }); } catch (e) { console.warn('effect', e); }\n\n// Accents: few, dim, and kept out of the type's column.\nfor (var i = 0; i < 26; i++) {\n  var side = r() < 0.5 ? -1 : 1;\n  var ax = CX + side * (200 + r() * 170);\n  var id = PinePaper.create('circle', { x: ax, y: 60 + r() * 480, radius: 0.8 + r() * 1.6, fillColor: r() < 0.5 ? '#5b7bb5' : '#8b6fb5', opacity: 0.16 + r() * 0.24 });\n  PinePaper.animate(id, { animationType: 'fade', speed: 0.3 + r() * 1.1 });\n}\n\nvar foot = PinePaper.create('text', { x: CX, y: FOOT_Y, content: 'letter collage \\u00b7 text style \\u00b7 text effect \\u00b7 particles', fontSize: 16, fillColor: '#8492b0', opacity: 0 });\nPinePaper.modifyItem(foot, { animationType: 'keyframe', duration: DUR, keyframes: [\n  { time: 0, properties: { opacity: 0 } },\n  { time: 5.4, properties: { opacity: 0 } },\n  { time: 6.1, properties: { opacity: 0.9 } },\n  { time: DUR, properties: { opacity: 0.9 } }\n] });\nPinePaper.modifyItem(strap, { animationType: 'keyframe', duration: 8, keyframes: [{ time: 0, properties: { content: '' } }, { time: 3.60, properties: { content: '' } }, { time: 3.650, properties: { content: 'l' } }, { time: 3.700, properties: { content: 'le' } }, { time: 3.750, properties: { content: 'let' } }, { time: 3.800, properties: { content: 'lett' } }, { time: 3.850, properties: { content: 'lette' } }, { time: 3.900, properties: { content: 'letter' } }, { time: 3.950, properties: { content: 'letterf' } }, { time: 4.000, properties: { content: 'letterfo' } }, { time: 4.050, properties: { content: 'letterfor' } }, { time: 4.100, properties: { content: 'letterform' } }, { time: 4.150, properties: { content: 'letterforms' } }, { time: 4.200, properties: { content: 'letterforms ' } }, { time: 4.250, properties: { content: 'letterforms a' } }, { time: 4.300, properties: { content: 'letterforms ar' } }, { time: 4.350, properties: { content: 'letterforms are' } }, { time: 4.400, properties: { content: 'letterforms are ' } }, { time: 4.450, properties: { content: 'letterforms are i' } }, { time: 4.500, properties: { content: 'letterforms are it' } }, { time: 4.550, properties: { content: 'letterforms are ite' } }, { time: 4.600, properties: { content: 'letterforms are item' } }, { time: 4.650, properties: { content: 'letterforms are items' } }, { time: 4.700, properties: { content: 'letterforms are items ' } }, { time: 4.750, properties: { content: 'letterforms are items t' } }, { time: 4.800, properties: { content: 'letterforms are items to' } }, { time: 4.850, properties: { content: 'letterforms are items too' } }, { time: 8.00, properties: { content: 'letterforms are items too' } }] });"}}],"license":"CC0-1.0"}