{"id":2608,"date":"2026-09-25T09:35:09","date_gmt":"2026-09-25T06:35:09","guid":{"rendered":"https:\/\/t-print.fi\/julistekauppa\/"},"modified":"2026-09-25T09:35:09","modified_gmt":"2026-09-25T06:35:09","slug":"julistekauppa","status":"publish","type":"page","link":"https:\/\/t-print.fi\/en\/julistekauppa\/","title":{"rendered":"Poster shop"},"content":{"rendered":"<style>\n.tpp-scope{ font-family:\"IBM Plex Sans\",system-ui,sans-serif; color:var(--ink); -webkit-font-smoothing:antialiased; line-height:1.4; }\n.tpp-scope{\n    --bg:#ffffff; --panel:#f6f5f2; --surface:#ffffff; --ink:#17161a; --sub:#6b6862;\n    --line:#e6e3da; --red:#c11f2b; --red-ink:#8f1620; --ok:#1e7d46;\n    --cyan:#00aeef; --magenta:#ec008c; --yellow:#ffcc00;\n    box-sizing:border-box; padding-top:env(safe-area-inset-top,0px); padding-bottom:env(safe-area-inset-bottom,0px);\n  }\n  @media (prefers-color-scheme: dark){.tpp-scope:not([data-theme=\"light\"]){ --bg:#141316; --panel:#1c1b1f; --surface:#1c1b1f; --ink:#f1efe9; --sub:#a09d97; --line:#332f31; } }.tpp-scope[data-theme=\"dark\"]{ --bg:#141316; --panel:#1c1b1f; --surface:#1c1b1f; --ink:#f1efe9; --sub:#a09d97; --line:#332f31; }.tpp-scope *{box-sizing:border-box}.tpp-scope{display:block;box-sizing:border-box}.tpp-scope .shell{ display:grid; grid-template-columns:1.05fr 1fr; gap:8px 56px; max-width:1240px; width:100%; margin:0 auto; padding:clamp(32px,5vw,56px) clamp(20px,5vw,56px) 64px;\n    grid-template-areas: \"hero preview\" \"editor preview\" \"price preview\"; }\n  @media (max-width:900px){.tpp-scope .shell{ grid-template-columns:1fr; grid-template-areas:\"hero\" \"preview\" \"editor\" \"price\"; gap:28px; } }.tpp-scope .hero-copy{grid-area:hero; padding-bottom:12px; position:relative}.tpp-scope .hero-copy::before{\n    content:\"\"; position:absolute; top:-20px; right:-40px; width:220px; height:220px; z-index:-1; opacity:.5;\n    background-image:radial-gradient(circle, var(--cyan) 1.6px, transparent 1.6px),\n      radial-gradient(circle, var(--magenta) 1.6px, transparent 1.6px),\n      radial-gradient(circle, var(--yellow) 1.6px, transparent 1.6px);\n    background-size:16px 16px; background-position:0 0, 5px 8px, 10px 3px;\n    -webkit-mask-image:radial-gradient(circle, #000 40%, transparent 75%);\n    mask-image:radial-gradient(circle, #000 40%, transparent 75%);\n  }\n  @media (max-width:900px){.tpp-scope .hero-copy::before{display:none} }.tpp-scope h1{ font-family:\"Space Grotesk\",sans-serif; font-weight:700; font-size:clamp(32px,4.4vw,48px); line-height:1.06; margin:0 0 16px; letter-spacing:-0.01em; }.tpp-scope .hero-copy p{font-size:16px; color:var(--sub); line-height:1.55; max-width:48ch; margin:0 0 22px}.tpp-scope .hero-cta{ display:inline-flex; align-items:center; gap:8px; padding:15px 24px; background:linear-gradient(135deg, var(--red), var(--red-ink)); color:#fff; border:none; border-radius:2px; font-size:15px; font-weight:600; cursor:pointer; font-family:inherit; box-shadow:0 10px 24px -10px rgba(193,31,43,.55); }.tpp-scope .hero-cta:hover{background:var(--red-ink)}.tpp-scope .benefits{display:flex; flex-wrap:wrap; gap:10px; margin-top:22px; font-size:13px}.tpp-scope .benefits span{ padding:7px 13px; border-radius:20px; background:var(--panel); color:var(--ink); border:1px solid var(--line); }.tpp-scope .benefits span:nth-child(1){border-color:color-mix(in srgb, var(--cyan) 40%, var(--line))}.tpp-scope .benefits span:nth-child(2){border-color:color-mix(in srgb, var(--magenta) 40%, var(--line))}.tpp-scope .benefits span:nth-child(3){border-color:color-mix(in srgb, var(--yellow) 55%, var(--line))}.tpp-scope .right{ grid-area:preview; }\n  @media (min-width:901px){.tpp-scope .right{ position:sticky; top:20px; align-self:start; } }.tpp-scope .wall{ background:linear-gradient(150deg, #eef2f3 0%, var(--panel) 45%, #f3ece9 100%); border-radius:2px; padding:clamp(28px,4vw,48px) 20px; display:flex; flex-direction:column; align-items:center; gap:16px; }.tpp-scope .poster{ background:var(--surface); border:1px solid var(--line); box-shadow:0 22px 48px -20px rgba(0,0,0,.30);\n    position:relative; display:flex; align-items:center; justify-content:center; transition:width .3s ease, height .3s ease; overflow:hidden; cursor:default; touch-action:none; }.tpp-scope .poster.has-image{cursor:grab}.tpp-scope .poster.has-image:active{cursor:grabbing}.tpp-scope .poster-inner{ width:100%; height:100%; display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center; gap:10px; padding:16px;\n    background:linear-gradient(135deg,#e9e5da 0%,#d9d3c4 45%,#cfc8b8 100%); }.tpp-scope .poster-inner .ico{font-size:26px; opacity:.55}.tpp-scope .poster-inner span{ font-family:\"IBM Plex Sans\",sans-serif; font-size:12.5px; color:#6b6355; font-weight:500; }.tpp-scope .poster.has-image .poster-inner{display:none}.tpp-scope #posterImg{position:absolute; top:0; left:0; display:none; user-select:none; -webkit-user-drag:none; touch-action:none; pointer-events:none}.tpp-scope .dims{font-family:\"IBM Plex Mono\",monospace; font-size:12px; color:var(--sub)}.tpp-scope .upload{ border:1px solid var(--line); background:var(--surface); border-radius:2px; padding:14px 20px; text-align:center; cursor:pointer; width:100%; max-width:280px; }.tpp-scope .upload:hover, .tpp-scope .upload.drag{border-color:var(--red)}.tpp-scope .upload input{display:none}.tpp-scope .upload .u-title{font-weight:600; font-size:13.5px}.tpp-scope .upload .u-file{font-family:\"IBM Plex Mono\",monospace; font-size:12px; color:var(--ok); margin-top:6px; word-break:break-all}.tpp-scope .crop-controls{display:none; align-items:center; gap:10px; width:100%; max-width:280px}.tpp-scope .crop-controls.show{display:flex}.tpp-scope .crop-controls input[type=range]{flex:1; margin:0; accent-color:var(--red)}.tpp-scope .crop-controls button{ font-size:11px; padding:8px 10px; border:1px solid var(--line); background:var(--surface); color:var(--sub); border-radius:2px; cursor:pointer; white-space:nowrap; }.tpp-scope .crop-hint{font-size:11.5px; color:var(--sub); text-align:center}.tpp-scope .quality{display:none; align-items:flex-start; gap:10px; width:100%; max-width:280px; padding:12px 14px; border-radius:2px; border:1px solid var(--line); background:var(--surface); text-align:left}.tpp-scope .quality.show{display:flex}.tpp-scope .q-dot{width:10px; height:10px; border-radius:50%; margin-top:4px; flex:none}.tpp-scope .q-text strong{display:block; font-size:13px}.tpp-scope .q-text span{display:block; font-size:11.5px; color:var(--sub); margin-top:2px; line-height:1.4}.tpp-scope .card{ background:var(--surface); border:1px solid var(--line); border-radius:2px; padding:clamp(22px,3vw,30px); }.tpp-scope .editor-card{grid-area:editor; margin-top:16px}.tpp-scope .editor-card h2{font-family:\"Space Grotesk\",sans-serif; font-size:19px; margin:0 0 20px}.tpp-scope .field{margin-bottom:22px}.tpp-scope .field:last-child{margin-bottom:0}.tpp-scope .field label.group-label{display:block; font-size:12px; font-weight:600; margin-bottom:9px; text-transform:uppercase; letter-spacing:.03em; color:var(--sub)}.tpp-scope .chips{display:flex; flex-wrap:wrap; gap:8px}.tpp-scope .chip{ border:1px solid var(--line); background:var(--surface); color:var(--ink); padding:9px 14px; border-radius:2px; cursor:pointer; font-family:\"IBM Plex Sans\",sans-serif; font-size:13px; text-align:center; line-height:1.3; }.tpp-scope .chip .sub{display:block; font-family:\"IBM Plex Mono\",monospace; font-size:10px; color:var(--sub); margin-top:2px}.tpp-scope .chip:hover{border-color:var(--ink)}.tpp-scope .chip.active{border-color:var(--red); background:var(--red); color:#fff}.tpp-scope .chip.active .sub{color:#f3c9cb}.tpp-scope .qty-row{display:flex; align-items:center; gap:12px; margin-top:10px}.tpp-scope .qty-btn{ width:36px; height:36px; border:1px solid var(--line); background:var(--surface); color:var(--ink); font-size:17px; border-radius:2px; cursor:pointer; }.tpp-scope .qty-btn:hover{border-color:var(--ink)}.tpp-scope #qtyInput{ width:60px; text-align:center; border:1px solid var(--line); background:var(--surface); color:var(--ink); padding:8px 4px; border-radius:2px; font-family:\"IBM Plex Mono\",monospace; font-size:15px; }.tpp-scope .custom-row{display:flex; gap:10px; margin-top:10px}.tpp-scope .custom-row.hidden{display:none}.tpp-scope .custom-row div{flex:1}.tpp-scope .custom-row label{display:block; font-size:11px; color:var(--sub); margin-bottom:4px}.tpp-scope .custom-row input{ width:100%; border:1px solid var(--line); background:var(--surface); color:var(--ink); padding:8px 10px; border-radius:2px; font-family:\"IBM Plex Mono\",monospace; font-size:13px; }.tpp-scope .price-card{grid-area:price; margin-top:16px}.tpp-scope .price-head{font-family:\"Space Grotesk\",sans-serif; font-size:13px; font-weight:600; text-transform:uppercase; letter-spacing:.04em; color:var(--sub); margin-bottom:14px}.tpp-scope .sum-row{display:flex; justify-content:space-between; font-size:13px; padding:6px 0; border-bottom:1px solid var(--line); color:var(--sub)}.tpp-scope .sum-row span:last-child{color:var(--ink); font-weight:500; text-align:right}.tpp-scope .price-main{padding-top:16px}.tpp-scope .price-total{display:flex; justify-content:space-between; align-items:baseline}.tpp-scope .price-total .lbl{font-size:12px; color:var(--sub)}.tpp-scope .price-total .val{font-family:\"Space Grotesk\",sans-serif; font-size:30px; font-weight:700}.tpp-scope .price-unit{display:flex; justify-content:space-between; font-size:12px; color:var(--sub); margin-top:4px}.tpp-scope .price-unit.free{color:var(--ok); font-weight:600}.tpp-scope .fineprint{font-size:11.5px; color:var(--sub); margin-top:12px; line-height:1.5}.tpp-scope .cta{ margin-top:16px; width:100%; padding:14px 20px; background:var(--red); color:#fff; border:none; border-radius:2px; font-size:15px; font-weight:600; cursor:pointer; }.tpp-scope .cta:hover{background:var(--red-ink)}.tpp-scope .cta:disabled{background:var(--line); color:var(--sub); cursor:not-allowed}.tpp-scope .success{display:none; text-align:center; padding:8px 0}.tpp-scope .success .ico{width:44px; height:44px; border-radius:50%; background:var(--ok); color:#fff; display:flex; align-items:center; justify-content:center; margin:0 auto 12px; font-size:20px}.tpp-scope .success h3{font-family:\"Space Grotesk\",sans-serif; margin:0 0 8px}.tpp-scope .success p{font-size:13px; color:var(--sub); line-height:1.6; margin:0 0 16px}.tpp-scope .modal-fields{display:none; margin-top:18px; border-top:1px solid var(--line); padding-top:18px}.tpp-scope .modal-fields.open{display:block}.tpp-scope .frow{display:flex; gap:10px; margin-bottom:12px}.tpp-scope .frow .fl{flex:1}.tpp-scope .frow label{display:block; font-size:11px; color:var(--sub); margin-bottom:4px}.tpp-scope .frow input, .tpp-scope textarea{ width:100%; border:1px solid var(--line); background:var(--surface); color:var(--ink); padding:9px 10px; border-radius:2px; font-family:inherit; font-size:13px; }.tpp-scope textarea{resize:vertical}.tpp-scope .err{color:var(--red); font-size:12px; margin-top:8px; display:none}.tpp-scope .filemodes{display:flex; flex-wrap:wrap; gap:6px; margin-bottom:10px}.tpp-scope .fm-btn{font-size:12px; padding:8px 12px; border:1px solid var(--line); background:var(--surface); color:var(--ink); border-radius:2px; cursor:pointer}.tpp-scope .fm-btn.active{border-color:var(--red); background:var(--red); color:#fff}.tpp-scope .fm-note{font-size:12px; color:var(--sub); border:1px dashed var(--line); border-radius:2px; padding:12px; text-align:center; display:none}.tpp-scope .fm-note.show{display:block}\n\n<\/style>\n<div class=\"tpp-scope\" id=\"tppRoot\" data-ajaxurl=\"https:\/\/t-print.fi\/wp-admin\/admin-ajax.php\" data-nonce=\"a67d74cca3\">\n<div class=\"shell\">\n  <div class=\"hero-copy\">\n    <h1>Oma kuva.<br>Omaksi julisteeksi.<\/h1>\n    <p>Tee kuvastasi laadukas juliste kotiin, lahjaksi tai vaikka toimistolle. Lataa kuva, rajaa se haluamallasi tavalla ja valitse koko. N\u00e4et hinnan heti.<\/p>\n    <button class=\"hero-cta\" id=\"heroCta\">Lataa kuva ja aloita \u2192<\/button>\n    <div class=\"benefits\">\n      <span>\u26a1 Hinta heti<\/span><span>\ud83d\uddbc Rajaa itse<\/span><span>\ud83d\udcd0 30\u00d740\u201370\u00d7100 cm + oma koko<\/span>\n    <\/div>\n  <\/div>\n\n  <div class=\"right\">\n    <div class=\"wall\">\n      <div class=\"poster\" id=\"posterBox\">\n        <div class=\"poster-inner\"><span class=\"ico\">\ud83d\uddbc<\/span><span id=\"posterLabel\">A3 \u00b7 297 \u00d7 420 mm<\/span><\/div>\n        <img id=\"posterImg\" alt=\"\">\n      <\/div>\n      <div class=\"dims\" id=\"posterDims\">297 mm \u00d7 420 mm<\/div>\n      <label class=\"upload\" id=\"uploadZone\" tabindex=\"0\">\n        <input type=\"file\" id=\"fileInput\" accept=\"image\/*,.pdf,.ai,.eps,.tif,.tiff,.zip\">\n        <div class=\"u-title\">Lataa kuvasi<\/div>\n        <div class=\"u-file\" id=\"fileName\"><\/div>\n      <\/label>\n      <div class=\"crop-controls\" id=\"cropControls\">\n        <button type=\"button\" id=\"resetCrop\">Nollaa<\/button>\n        <input type=\"range\" id=\"zoomRange\" min=\"0\" max=\"100\" value=\"0\">\n      <\/div>\n      <div class=\"crop-hint\" id=\"cropHint\" style=\"display:none\">Raahaa kuvaa sommitellaksesi, zoomaa liu'ulla<\/div>\n      <div class=\"quality\" id=\"qualityBox\">\n        <div class=\"q-dot\" id=\"qDot\"><\/div>\n        <div class=\"q-text\"><strong id=\"qLabel\"><\/strong><span id=\"qDetail\"><\/span><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"card editor-card\">\n    <h2>Tee julisteesi<\/h2>\n\n    <div class=\"field\">\n      <label class=\"group-label\">Koko<\/label>\n      <div class=\"chips\" id=\"sizeGrid\"><\/div>\n      <div class=\"custom-row hidden\" id=\"customRow\">\n        <div><label for=\"customW\">Leveys (mm)<\/label><input id=\"customW\" type=\"number\" min=\"100\" max=\"2000\" value=\"420\"><\/div>\n        <div><label for=\"customH\">Korkeus (mm)<\/label><input id=\"customH\" type=\"number\" min=\"100\" max=\"3000\" value=\"594\"><\/div>\n      <\/div>\n      <div class=\"chips\" id=\"orientChips\" style=\"margin-top:10px\"><\/div>\n    <\/div>\n\n    <div class=\"field\">\n      <label class=\"group-label\">M\u00e4\u00e4r\u00e4<\/label>\n      <div class=\"chips\" id=\"qtyChips\"><\/div>\n      <div class=\"qty-row\">\n        <button class=\"qty-btn\" id=\"qtyMinus\">\u2212<\/button>\n        <input id=\"qtyInput\" type=\"number\" min=\"1\" max=\"20\" value=\"10\">\n        <button class=\"qty-btn\" id=\"qtyPlus\">+<\/button>\n      <\/div>\n      <button type=\"button\" class=\"chip\" id=\"moreThan20\" style=\"margin-top:10px; width:100%\">Tarvitsetko yli 20 kpl? Pyyd\u00e4 tarjous \u2192<\/button>\n    <\/div>\n\n    <div class=\"field\">\n      <label class=\"group-label\">Toimitus<\/label>\n      <div class=\"chips\" id=\"deliveryChips\"><\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"card price-card\">\n    <div class=\"price-head\">Hinta<\/div>\n    <div id=\"summary\">\n      <div class=\"sum-row\"><span>Koko<\/span><span id=\"sSize\">\u2014<\/span><\/div>\n      <div class=\"sum-row\"><span>M\u00e4\u00e4r\u00e4<\/span><span id=\"sQty\">\u2014<\/span><\/div>\n      <div class=\"sum-row\"><span>Toimitus<\/span><span id=\"sDelivery\">\u2014<\/span><\/div>\n    <\/div>\n    <div class=\"price-main\">\n      <div class=\"price-total\"><span class=\"lbl\">Yhteens\u00e4 (alv 0%)<\/span><span class=\"val\" id=\"priceTotal\">\u2014<\/span><\/div>\n      <div class=\"price-unit\"><span>Sis. alv 25,5%<\/span><span id=\"priceVat\">\u2014<\/span><\/div>\n      <div class=\"price-unit\"><span>Kappalehinta<\/span><span id=\"priceUnit\">\u2014<\/span><\/div>\n      <div class=\"price-unit\" id=\"feeRow\"><span>Toimituskulut<\/span><span id=\"feeVal\">\u2014<\/span><\/div>\n    <\/div>\n\n    <button class=\"cta\" id=\"ctaBtn\" disabled>Lataa kuva jatkaaksesi<\/button>\n\n    <div class=\"modal-fields\" id=\"orderFields\">\n      <div class=\"frow\"><div class=\"fl\"><label>Nimi *<\/label><input id=\"fName\"><\/div><div class=\"fl\"><label>Yritys<\/label><input id=\"fCompany\"><\/div><\/div>\n      <div class=\"frow\"><div class=\"fl\"><label>S\u00e4hk\u00f6posti *<\/label><input id=\"fEmail\" type=\"email\"><\/div><div class=\"fl\"><label>Puhelin<\/label><input id=\"fPhone\" type=\"tel\"><\/div><\/div>\n      <div class=\"filemodes\">\n        <button type=\"button\" class=\"fm-btn active\" id=\"fm-upload\" data-mode=\"upload\">\ud83d\udcce Liit\u00e4n nyt<\/button>\n        <button type=\"button\" class=\"fm-btn\" id=\"fm-later\" data-mode=\"later\">\ud83d\udcec L\u00e4het\u00e4n my\u00f6hemmin<\/button>\n        <button type=\"button\" class=\"fm-btn\" id=\"fm-design\" data-mode=\"design\">\u270f\ufe0f Tarvitsen suunnittelun<\/button>\n      <\/div>\n      <div class=\"fm-note\" id=\"fm-note-later\">Tilaus kirjataan, l\u00e4het\u00e4 aineisto my\u00f6hemmin: aineistot@t-print.fi<\/div>\n      <div class=\"fm-note\" id=\"fm-note-design\">Suunnittelupalvelu alkaen 50 \u20ac \u2014 kerro toiveesi alla.<\/div>\n      <textarea id=\"fMessage\" rows=\"2\" placeholder=\"Lis\u00e4tietoja...\"><\/textarea>\n      <div class=\"err\" id=\"formErr\"><\/div>\n      <button class=\"cta\" id=\"submitBtn\" style=\"margin-top:12px\">Tilaa<\/button>\n    <\/div>\n\n    <div class=\"success\" id=\"success\">\n      <div class=\"ico\">\u2713<\/div>\n      <h3 id=\"successTitle\">Tilaus vastaanotettu!<\/h3>\n      <p>Kiitos tilauksesta. L\u00e4hetimme vahvistuksen s\u00e4hk\u00f6postiisi. K\u00e4ymme tiedot l\u00e4pi ja otamme sinuun yhteytt\u00e4 mahdollisimman pian \u2014 yleens\u00e4 saman p\u00e4iv\u00e4n aikana.<\/p>\n    <\/div>\n  <\/div>\n<\/div>\n\n<\/div>\n<script>\n(function(){\n\n  const C = { fixed:50.57, click44:0.18, click10:0.108, labor44:0.06, labor10:0.036, perPiece:0.00489, margin:0.20, waste:1.02 };\n  const DELIVERY_FEE = 15, FREE_THRESHOLD = 250, VAT = 0.255;\n\n  function round2(n){ return Math.round(n*100)\/100; }\n  function lfCalc(pts, extra, q){\n    if (q <= pts[0][0]) return round2(pts[0][1] + (q-pts[0][0])*(pts[1][1]-pts[0][1])\/(pts[1][0]-pts[0][0]));\n    if (q >= pts[pts.length-1][0]) return round2(pts[pts.length-1][1] + (q-pts[pts.length-1][0])*extra);\n    for (let i=0;i<pts.length-1;i++){ const [q1,p1]=pts[i],[q2,p2]=pts[i+1]; if(q>=q1&&q<=q2) return round2(p1+(q-q1)*(p2-p1)\/(q2-q1)); }\n  }\n  function priceA2(q){ const lookup={10:90,25:200,100:240}; if(lookup[q]) return lookup[q]; return lfCalc([[10,90],[25,200],[100,240]],0.40,q); }\n  function price5070(q){ const lookup={1:30,2:51,3:72,4:83,5:92}; if(lookup[q]) return lookup[q]; return lfCalc([[5,92],[25,200],[50,260],[100,280]],0.40,q); }\n  function price70100(q){\n    if (q===1) return 40;\n    if (q<=10) return round2(40+(q-1)*21);\n    if (q<=50) return round2(40+9*21+(q-10)*15);\n    if (q<=100) return round2(40+9*21+40*15+(q-50)*10);\n    return round2(40+9*21+40*15+50*10+(q-100)*8);\n  }\n  function priceEstimate(q, areaM2){\n    const qty1 = Math.round(20 + 28.57*areaM2);\n    if (q===1) return qty1;\n    if (q<=10) return round2(qty1+(q-1)*21);\n    if (q<=50) return round2(qty1+9*21+(q-10)*15);\n    if (q<=100) return round2(qty1+9*21+40*15+(q-50)*10);\n    return round2(qty1+9*21+40*15+50*10+(q-100)*8);\n  }\n\n  const SIZES = [\n    { val:'A3', label:'A3', sub:'297\u00d7420mm', short:297,long:420, real:false, area:0.1247 },\n    { val:'A2', label:'A2', sub:'420\u00d7594mm', short:420,long:594, real:true, kind:'a2' },\n    { val:'30x40', label:'30\u00d740cm', sub:'300\u00d7400mm', short:300,long:400, real:false, area:0.12 },\n    { val:'32x32', label:'32\u00d732cm', sub:'320\u00d7320mm', short:320,long:320, real:false, area:0.1024 },\n    { val:'40x40', label:'40cm', sub:'400\u00d7400mm (neli\u00f6)', short:400,long:400, real:false, area:0.16 },\n    { val:'40x50', label:'40\u00d750cm', sub:'400\u00d7500mm', short:400,long:500, real:false, area:0.20 },\n    { val:'46x61', label:'46\u00d761cm', sub:'460\u00d7610mm', short:460,long:610, real:false, area:0.2806 },\n    { val:'50x70', label:'50\u00d770cm', sub:'500\u00d7700mm', short:500,long:700, real:true, kind:'5070' },\n    { val:'61x61', label:'61cm', sub:'610\u00d7610mm (neli\u00f6)', short:610,long:610, real:false, area:0.3721 },\n    { val:'61x91', label:'61\u00d791cm', sub:'610\u00d7910mm', short:610,long:910, real:false, area:0.5551 },\n    { val:'70x100', label:'70\u00d7100cm', sub:'700\u00d71000mm', short:700,long:1000, real:true, kind:'70100' },\n    { val:'custom', label:'Oma koko', sub:'mm', custom:true },\n  ];\n  const QTY_PRESETS = [1,5,10,15,20];\n  const DELIVERY = [ {val:'pickup',label:'Nouto Hyvink\u00e4\u00e4lt\u00e4 \ud83c\udd93'}, {val:'normal',label:'Toimitus 3\u20135 pv'}, {val:'rush',label:'Pikatoimitus 1\u20132 pv'} ];\n\n  let state = { sizeVal:'A3', w:297, h:420, area:0.1247, qty:10, delivery:'pickup', fileName:null, quoteMode:false, orientation:'portrait' };\n  let fileMode = 'upload';\n  let selectedFile = null;\n  const rootEl = document.getElementById('tppRoot');\n  (function fullBleed(){\n    if (!rootEl) return;\n    function fix(){\n      rootEl.style.width = '';\n      rootEl.style.marginLeft = '';\n      rootEl.style.marginRight = '';\n      const rect = rootEl.getBoundingClientRect();\n      const vw = document.documentElement.clientWidth;\n      rootEl.style.width = vw + 'px';\n      rootEl.style.marginLeft = (-rect.left) + 'px';\n      rootEl.style.marginRight = (rect.left - vw + rect.width) + 'px';\n    }\n    fix();\n    window.addEventListener('resize', fix);\n    window.addEventListener('load', fix);\n  })();\n  const AJAX_URL = rootEl ? rootEl.dataset.ajaxurl : '';\n  const AJAX_NONCE = rootEl ? rootEl.dataset.nonce : '';\n  const $ = id => document.getElementById(id);\n  const fmtEur = n => new Intl.NumberFormat('fi-FI',{style:'currency',currency:'EUR'}).format(n);\n\n  function applyOrientation(){\n    const s = SIZES.find(x=>x.val===state.sizeVal);\n    if (s && s.custom){\n      let a=parseInt($('customW').value)||420, b=parseInt($('customH').value)||594;\n      state.w=a; state.h=b;\n    } else if (s){\n      if (state.orientation==='landscape' && s.short!==s.long){ state.w=s.long; state.h=s.short; }\n      else { state.w=s.short; state.h=s.long; }\n      state.area = s.area || (s.short*s.long)\/1e6;\n    }\n  }\n  function renderOrient(){\n    const s = SIZES.find(x=>x.val===state.sizeVal);\n    const wrap = $('orientChips'); wrap.innerHTML='';\n    if (s && !s.custom && s.short===s.long) return;\n    [{val:'portrait',label:'\u2195 Pysty'},{val:'landscape',label:'\u2194 Vaaka'}].forEach(o=>{\n      const btn=document.createElement('button');\n      btn.className='chip'+(state.orientation===o.val?' active':'');\n      btn.textContent=o.label;\n      btn.addEventListener('click',()=>{\n        if (s && s.custom){ const a=$('customW').value; $('customW').value=$('customH').value; $('customH').value=a; }\n        state.orientation=o.val; applyOrientation(); renderOrient(); renderAll();\n      });\n      wrap.appendChild(btn);\n    });\n  }\n\n  function calcTotal(){\n    const s = SIZES.find(x=>x.val===state.sizeVal);\n    let productTotal;\n    if (s && s.kind==='a2') productTotal = priceA2(state.qty);\n    else if (s && s.kind==='5070') productTotal = price5070(state.qty);\n    else if (s && s.kind==='70100') productTotal = price70100(state.qty);\n    else productTotal = priceEstimate(state.qty, state.area);\n    const rushMult = state.delivery==='rush' ? 1.30 : 1;\n    const prod = round2(productTotal*rushMult);\n    const fee = (state.delivery==='pickup' || prod>=FREE_THRESHOLD) ? 0 : DELIVERY_FEE;\n    return { total: round2(prod+fee), vatTotal: round2((prod+fee)*(1+VAT)), productTotal: prod, fee, unit: round2(prod\/state.qty), isEstimate: !(s && s.real) };\n  }\n\n  function renderSizes(){\n    const grid = $('sizeGrid'); grid.innerHTML='';\n    SIZES.forEach(s=>{\n      const btn = document.createElement('button');\n      btn.className = 'chip' + (s.val===state.sizeVal?' active':'') + (s.real===false?' est':'');\n      btn.innerHTML = `${s.label}${s.sub?`<span class=\"sub\">${s.sub}<\/span>`:''}`;\n      btn.addEventListener('click', ()=>{\n        state.sizeVal = s.val;\n        if (s.custom){ $('customRow').classList.remove('hidden'); } else { $('customRow').classList.add('hidden'); }\n        applyOrientation();\n        renderSizes(); renderOrient(); renderAll();\n      });\n      grid.appendChild(btn);\n    });\n  }\n  function renderQty(){\n    const wrap = $('qtyChips'); wrap.innerHTML='';\n    QTY_PRESETS.forEach(q=>{\n      const btn=document.createElement('button');\n      btn.className='chip'+(q===state.qty && !state.quoteMode?' active':'');\n      btn.textContent=q+' kpl';\n      btn.addEventListener('click',()=>{ state.qty=q; state.quoteMode=false; $('qtyInput').value=q; renderQty(); renderAll(); });\n      wrap.appendChild(btn);\n    });\n    $('moreThan20').classList.toggle('active', state.quoteMode);\n  }\n  function renderDelivery(){\n    const wrap=$('deliveryChips'); wrap.innerHTML='';\n    DELIVERY.forEach(d=>{\n      const btn=document.createElement('button');\n      btn.className='chip'+(d.val===state.delivery?' active':'');\n      btn.textContent=d.label;\n      btn.addEventListener('click',()=>{ state.delivery=d.val; renderDelivery(); renderAll(); });\n      wrap.appendChild(btn);\n    });\n  }\n\n  let boxW=280, boxH=280;\n  let crop = { natW:0, natH:0, scale:1, minScale:1, maxScale:1, left:0, top:0, dragging:false, startX:0, startY:0, startLeft:0, startTop:0 };\n  const posterImg = document.getElementById('posterImg');\n  const posterBoxEl = document.getElementById('posterBox');\n\n  function renderPoster(){\n    const maxDim=320, minDim=100;\n    const ratio = state.h\/state.w;\n    let w,h;\n    if (ratio>=1){ h=maxDim; w=Math.max(minDim,maxDim\/ratio); } else { w=maxDim; h=Math.max(minDim,maxDim*ratio); }\n    $('posterBox').style.width=w+'px'; $('posterBox').style.height=h+'px';\n    $('posterDims').textContent = state.w+' mm \u00d7 '+state.h+' mm';\n    $('posterLabel').textContent = SIZES.find(s=>s.val===state.sizeVal)?.label || 'Oma koko';\n    boxW=w; boxH=h;\n    if (crop.natW) refitCrop(true);\n  }\n  function clampCrop(){\n    const minLeft=boxW-crop.natW*crop.scale, minTop=boxH-crop.natH*crop.scale;\n    crop.left = Math.min(0, Math.max(minLeft, crop.left));\n    crop.top = Math.min(0, Math.max(minTop, crop.top));\n  }\n  function applyCropTransform(){\n    posterImg.style.width=(crop.natW*crop.scale)+'px'; posterImg.style.height=(crop.natH*crop.scale)+'px';\n    posterImg.style.left=crop.left+'px'; posterImg.style.top=crop.top+'px';\n  }\n  function updateQuality(){\n    if (!crop.natW){ $('qualityBox').classList.remove('show'); return; }\n    const dpi = (boxW\/crop.scale)\/state.w*25.4;\n    let level, color, msg;\n    if (dpi>=200){ level='Erinomainen tarkkuus'; color='var(--ok)'; msg='Tulostuu ter\u00e4v\u00e4n\u00e4 l\u00e4helt\u00e4kin katsottuna.'; }\n    else if (dpi>=150){ level='Hyv\u00e4 tarkkuus'; color='var(--ok)'; msg='Sopii hyvin t\u00e4h\u00e4n kokoon.'; }\n    else if (dpi>=100){ level='Riitt\u00e4v\u00e4 tarkkuus'; color='#c98a12'; msg='Julisteita katsotaan yleens\u00e4 et\u00e4\u00e4mm\u00e4lt\u00e4 \u2014 t\u00e4m\u00e4 riitt\u00e4\u00e4 useimmiten.'; }\n    else { level='Tarkkuus voi olla liian pieni'; color='var(--red)'; msg='Kokeile pienemp\u00e4\u00e4 kokoa, zoomaa v\u00e4hemm\u00e4n tai lataa suurempi kuva.'; }\n    $('qualityBox').classList.add('show');\n    $('qDot').style.background=color;\n    $('qLabel').textContent=level+' \u00b7 noin '+Math.round(dpi)+' DPI';\n    $('qDetail').textContent=msg;\n  }\n  function refitCrop(preserve){\n    const oldT = (crop.maxScale>crop.minScale) ? (crop.scale-crop.minScale)\/(crop.maxScale-crop.minScale) : 0;\n    crop.minScale = Math.max(boxW\/crop.natW, boxH\/crop.natH);\n    crop.maxScale = crop.minScale*3;\n    crop.scale = preserve ? crop.minScale + oldT*(crop.maxScale-crop.minScale) : crop.minScale;\n    crop.left = (boxW - crop.natW*crop.scale)\/2; crop.top = (boxH - crop.natH*crop.scale)\/2;\n    clampCrop(); applyCropTransform();\n    $('zoomRange').value = Math.round(((crop.scale-crop.minScale)\/(crop.maxScale-crop.minScale||1))*100);\n    updateQuality();\n  }\n  function setupCropFromImage(img){\n    crop.natW=img.naturalWidth; crop.natH=img.naturalHeight;\n    posterImg.src=img.src; posterImg.style.display='block';\n    posterBoxEl.classList.add('has-image');\n    $('cropControls').classList.add('show'); $('cropHint').style.display='block';\n    refitCrop(false);\n  }\n  posterBoxEl.addEventListener('pointerdown', e=>{ if(!crop.natW) return; crop.dragging=true; crop.startX=e.clientX; crop.startY=e.clientY; crop.startLeft=crop.left; crop.startTop=crop.top; posterBoxEl.setPointerCapture(e.pointerId); });\n  posterBoxEl.addEventListener('pointermove', e=>{ if(!crop.dragging) return; crop.left=crop.startLeft+(e.clientX-crop.startX); crop.top=crop.startTop+(e.clientY-crop.startY); clampCrop(); applyCropTransform(); });\n  ['pointerup','pointercancel'].forEach(evt=>posterBoxEl.addEventListener(evt, ()=>{ crop.dragging=false; }));\n  $('zoomRange').addEventListener('input', ()=>{\n    if(!crop.natW) return;\n    const t=$('zoomRange').value\/100, cx=boxW\/2, cy=boxH\/2;\n    const relX=(cx-crop.left)\/crop.scale, relY=(cy-crop.top)\/crop.scale;\n    crop.scale=crop.minScale+t*(crop.maxScale-crop.minScale);\n    crop.left=cx-relX*crop.scale; crop.top=cy-relY*crop.scale;\n    clampCrop(); applyCropTransform(); updateQuality();\n  });\n  $('resetCrop').addEventListener('click', ()=>refitCrop(false));\n\n  function renderPrice(){\n    if (state.quoteMode){\n      $('sSize').textContent = (SIZES.find(s=>s.val===state.sizeVal)?.label||'')+' \u00b7 '+state.w+'\u00d7'+state.h+'mm';\n      $('sQty').textContent = 'yli 20 kpl';\n      $('sDelivery').textContent = DELIVERY.find(d=>d.val===state.delivery)?.label||'';\n      $('priceTotal').textContent = 'Tarjouksen mukaan';\n      $('priceVat').textContent = '\u2014'; $('priceUnit').textContent = '\u2014';\n      $('feeRow').style.display = 'none';\n      return;\n    }\n    const r = calcTotal();\n    $('sSize').textContent = (SIZES.find(s=>s.val===state.sizeVal)?.label||'')+' \u00b7 '+state.w+'\u00d7'+state.h+'mm';\n    $('sQty').textContent = state.qty+' kpl';\n    $('sDelivery').textContent = DELIVERY.find(d=>d.val===state.delivery)?.label||'';\n    $('priceTotal').textContent = fmtEur(r.total);\n    $('priceVat').textContent = fmtEur(r.vatTotal);\n    $('priceUnit').textContent = fmtEur(r.unit)+'\/kpl';\n    $('feeRow').style.display='flex'; $('feeRow').classList.remove('free');\n    if (r.fee>0){ $('feeVal').textContent=fmtEur(r.fee); } else { $('feeVal').textContent='Ilmainen \u2713'; $('feeRow').classList.add('free'); }\n  }\n  function renderCta(){\n    const cta=$('ctaBtn');\n    if (state.quoteMode){ cta.disabled=false; cta.textContent='Pyyd\u00e4 tarjous'; return; }\n    if (state.fileName){ cta.disabled=false; cta.textContent='Tilaa t\u00e4ll\u00e4 valinnalla'; }\n    else { cta.disabled=true; cta.textContent='Lataa kuva jatkaaksesi'; }\n  }\n  function renderAll(){ renderPoster(); renderPrice(); renderCta(); }\n\n  ['customW','customH'].forEach(id=>{\n    $(id).addEventListener('input', ()=>{ state.w=parseInt($('customW').value)||420; state.h=parseInt($('customH').value)||594; state.area=(state.w\/1000)*(state.h\/1000); renderAll(); });\n  });\n  function setQty(v){ v=Math.max(1,Math.min(20,parseInt(v)||1)); state.qty=v; state.quoteMode=false; $('qtyInput').value=v; renderQty(); renderAll(); }\n  $('qtyMinus').addEventListener('click',()=>setQty(state.qty-1));\n  $('qtyPlus').addEventListener('click',()=>setQty(state.qty+1));\n  $('qtyInput').addEventListener('input',()=>setQty($('qtyInput').value));\n  $('moreThan20').addEventListener('click',()=>{ state.quoteMode=true; renderQty(); renderAll(); });\n\n  const uploadZone=$('uploadZone'), fileInput=$('fileInput'), fileNameEl=$('fileName');\n  function handleFile(file){\n    if(!file) return;\n    selectedFile = file;\n    state.fileName=file.name; fileNameEl.textContent='\u2713 '+file.name;\n    if (file.type && file.type.indexOf('image')===0){\n      const reader=new FileReader();\n      reader.onload=e=>{ const img=new Image(); img.onload=()=>setupCropFromImage(img); img.src=e.target.result; };\n      reader.readAsDataURL(file);\n    }\n    renderCta();\n  }\n  uploadZone.addEventListener('click',()=>fileInput.click());\n  uploadZone.addEventListener('keydown',e=>{ if(e.key==='Enter'||e.key===' '){ e.preventDefault(); fileInput.click(); } });\n  fileInput.addEventListener('change',()=>handleFile(fileInput.files[0]));\n  ['dragover','dragenter'].forEach(evt=>uploadZone.addEventListener(evt,e=>{ e.preventDefault(); uploadZone.classList.add('drag'); }));\n  ['dragleave','drop'].forEach(evt=>uploadZone.addEventListener(evt,e=>{ e.preventDefault(); uploadZone.classList.remove('drag'); }));\n  uploadZone.addEventListener('drop',e=>{ e.preventDefault(); if(e.dataTransfer.files[0]) handleFile(e.dataTransfer.files[0]); });\n\n  $('heroCta').addEventListener('click', ()=>{ uploadZone.scrollIntoView({behavior:'smooth', block:'center'}); fileInput.click(); });\n\n  $('ctaBtn').addEventListener('click',()=>{ $('orderFields').classList.add('open'); $('ctaBtn').style.display='none'; $('submitBtn').textContent = state.quoteMode ? 'L\u00e4het\u00e4 tarjouspyynt\u00f6' : 'Tilaa'; });\n  ['upload','later','design'].forEach(m=>{\n    $('fm-'+m).addEventListener('click',()=>{\n      fileMode = m;\n      ['upload','later','design'].forEach(x=>$('fm-'+x).classList.toggle('active', x===m));\n      $('fm-note-later').classList.toggle('show', m==='later');\n      $('fm-note-design').classList.toggle('show', m==='design');\n    });\n  });\n\n  function buildSummary(){\n    const s = SIZES.find(x=>x.val===state.sizeVal);\n    const sizeLabel = (s?s.label:'Oma koko') + ' (' + state.w + '\u00d7' + state.h + ' mm' + (s && !s.custom && s.short!==s.long ? (', '+(state.orientation==='landscape'?'vaaka':'pysty')) : '') + ')';\n    const deliveryLabel = DELIVERY.find(d=>d.val===state.delivery)?.label || '';\n    let lines = ['Tuote: Juliste omasta kuvasta', 'Koko: '+sizeLabel];\n    if (state.quoteMode){\n      lines.push('M\u00e4\u00e4r\u00e4: yli 20 kpl (tarjouspyynt\u00f6)');\n    } else {\n      const r = calcTotal();\n      lines.push('M\u00e4\u00e4r\u00e4: '+state.qty+' kpl');\n      lines.push('Kappalehinta: '+fmtEur(r.unit));\n      lines.push('Yhteens\u00e4 (alv 0%): '+fmtEur(r.total));\n      lines.push('Yhteens\u00e4 (sis. alv 25,5%): '+fmtEur(r.vatTotal));\n    }\n    lines.push('Toimitus: '+deliveryLabel);\n    if (crop.natW){\n      const dpi = Math.round((boxW\/crop.scale)\/state.w*25.4);\n      lines.push('Kuvan tarkkuus: noin '+dpi+' DPI (asiakkaan sommittelun mukaan)');\n    }\n    return lines.join('\\n');\n  }\n\n  $('submitBtn').addEventListener('click',()=>{\n    const name=$('fName').value.trim(), email=$('fEmail').value.trim(), phone=$('fPhone').value.trim();\n    const err=$('formErr');\n    if (!name || (!email && !phone)){ err.textContent='T\u00e4yt\u00e4 nimi sek\u00e4 s\u00e4hk\u00f6posti tai puhelinnumero.'; err.style.display='block'; return; }\n    if (fileMode==='upload' && !selectedFile){ err.textContent='Lataa kuva, tai valitse \"L\u00e4het\u00e4n my\u00f6hemmin\".'; err.style.display='block'; return; }\n    err.style.display='none';\n\n    const btn=$('submitBtn');\n    btn.disabled=true; btn.textContent='L\u00e4hetet\u00e4\u00e4n...';\n\n    const fd = new FormData();\n    fd.append('action','tprint_send_quote');\n    fd.append('nonce', AJAX_NONCE);\n    fd.append('name', name);\n    fd.append('company', $('fCompany').value.trim());\n    fd.append('email', email);\n    fd.append('phone', phone);\n    fd.append('message', $('fMessage').value.trim());\n    fd.append('summary', buildSummary());\n    fd.append('price', state.quoteMode ? 'Tarjouksen mukaan' : fmtEur(calcTotal().total));\n    fd.append('product', 'juliste');\n    fd.append('delivery_label', DELIVERY.find(d=>d.val===state.delivery)?.label || '');\n    fd.append('file_mode', fileMode);\n    if (selectedFile) fd.append('tp_files[]', selectedFile, selectedFile.name);\n\n    fetch(AJAX_URL, { method:'POST', body:fd })\n      .then(r=>r.json())\n      .then(data=>{\n        if (data && data.success){\n          $('orderFields').style.display='none';\n          $('successTitle').textContent = state.quoteMode ? 'Tarjouspyynt\u00f6 vastaanotettu!' : 'Tilaus vastaanotettu!';\n          $('success').style.display='block';\n        } else {\n          err.textContent = (data && data.data) ? data.data : 'L\u00e4hetys ep\u00e4onnistui \u2014 yrit\u00e4 uudelleen tai ota yhteytt\u00e4 myynti@t-print.fi.';\n          err.style.display='block';\n          btn.disabled=false; btn.textContent = state.quoteMode ? 'L\u00e4het\u00e4 tarjouspyynt\u00f6' : 'Tilaa';\n        }\n      })\n      .catch(()=>{\n        err.textContent='Verkkovirhe \u2014 yrit\u00e4 uudelleen tai ota yhteytt\u00e4 myynti@t-print.fi.';\n        err.style.display='block';\n        btn.disabled=false; btn.textContent = state.quoteMode ? 'L\u00e4het\u00e4 tarjouspyynt\u00f6' : 'Tilaa';\n      });\n  });\n\n  renderSizes(); renderOrient(); renderQty(); renderDelivery(); renderAll();\n\n})();\n<\/script>\n    \n","protected":false},"excerpt":{"rendered":"Oma kuva.Omaksi julisteeksi. Tee kuvastasi laadukas juliste kotiin, lahjaksi tai vaikka toimistolle. Lataa kuva, rajaa se haluamallasi tavalla ja valitse koko. N\u00e4et hinnan heti. Lataa kuva ja aloita \u2192 \u26a1 Hinta heti\ud83d\uddbc Rajaa itse\ud83d\udcd0 30\u00d740\u201370\u00d7100 cm + oma koko \ud83d\uddbcA3 \u00b7 297 \u00d7 420 mm 297 mm \u00d7 420 mm Lataa kuvasi Nollaa Raahaa kuvaa [...]","protected":false},"author":7,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2608","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Julistekauppa - T-Print<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/t-print.fi\/en\/julistekauppa\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Julistekauppa - T-Print\" \/>\n<meta property=\"og:url\" content=\"https:\/\/t-print.fi\/en\/julistekauppa\/\" \/>\n<meta property=\"og:site_name\" content=\"T-Print\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/TPrintKy\/\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/t-print.fi\\\/julistekauppa\\\/\",\"url\":\"https:\\\/\\\/t-print.fi\\\/julistekauppa\\\/\",\"name\":\"Julistekauppa - T-Print\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/t-print.fi\\\/#website\"},\"datePublished\":\"2026-09-25T06:35:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/t-print.fi\\\/julistekauppa\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/t-print.fi\\\/julistekauppa\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/t-print.fi\\\/julistekauppa\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/t-print.fi\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Julistekauppa\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/t-print.fi\\\/#website\",\"url\":\"https:\\\/\\\/t-print.fi\\\/\",\"name\":\"T-Print\",\"description\":\"Kotimaista painopalvelua\",\"publisher\":{\"@id\":\"https:\\\/\\\/t-print.fi\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/t-print.fi\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/t-print.fi\\\/#organization\",\"name\":\"T-Print\",\"url\":\"https:\\\/\\\/t-print.fi\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/t-print.fi\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"http:\\\/\\\/t-print.fi\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/t-print-logo.png\",\"contentUrl\":\"http:\\\/\\\/t-print.fi\\\/wp-content\\\/uploads\\\/2019\\\/01\\\/t-print-logo.png\",\"width\":303,\"height\":85,\"caption\":\"T-Print\"},\"image\":{\"@id\":\"https:\\\/\\\/t-print.fi\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/TPrintKy\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Julistekauppa - T-Print","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/t-print.fi\/en\/julistekauppa\/","og_locale":"en_US","og_type":"article","og_title":"Julistekauppa - T-Print","og_url":"https:\/\/t-print.fi\/en\/julistekauppa\/","og_site_name":"T-Print","article_publisher":"https:\/\/www.facebook.com\/TPrintKy\/","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/t-print.fi\/julistekauppa\/","url":"https:\/\/t-print.fi\/julistekauppa\/","name":"Julistekauppa - T-Print","isPartOf":{"@id":"https:\/\/t-print.fi\/#website"},"datePublished":"2026-09-25T06:35:09+00:00","breadcrumb":{"@id":"https:\/\/t-print.fi\/julistekauppa\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/t-print.fi\/julistekauppa\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/t-print.fi\/julistekauppa\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/t-print.fi\/"},{"@type":"ListItem","position":2,"name":"Julistekauppa"}]},{"@type":"WebSite","@id":"https:\/\/t-print.fi\/#website","url":"https:\/\/t-print.fi\/","name":"T-Print","description":"Kotimaista painopalvelua","publisher":{"@id":"https:\/\/t-print.fi\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/t-print.fi\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/t-print.fi\/#organization","name":"T-Print","url":"https:\/\/t-print.fi\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/t-print.fi\/#\/schema\/logo\/image\/","url":"https:\/\/mlscupq2hhrz.i.optimole.com\/cb:X3aX.fe0\/w:auto\/h:auto\/q:mauto\/f:best\/ig:avif\/http:\/\/t-print.fi\/wp-content\/uploads\/2019\/01\/t-print-logo.png","contentUrl":"https:\/\/mlscupq2hhrz.i.optimole.com\/cb:X3aX.fe0\/w:auto\/h:auto\/q:mauto\/f:best\/ig:avif\/http:\/\/t-print.fi\/wp-content\/uploads\/2019\/01\/t-print-logo.png","width":303,"height":85,"caption":"T-Print"},"image":{"@id":"https:\/\/t-print.fi\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/TPrintKy\/"]}]}},"_links":{"self":[{"href":"https:\/\/t-print.fi\/en\/wp-json\/wp\/v2\/pages\/2608","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/t-print.fi\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/t-print.fi\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/t-print.fi\/en\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/t-print.fi\/en\/wp-json\/wp\/v2\/comments?post=2608"}],"version-history":[{"count":0,"href":"https:\/\/t-print.fi\/en\/wp-json\/wp\/v2\/pages\/2608\/revisions"}],"wp:attachment":[{"href":"https:\/\/t-print.fi\/en\/wp-json\/wp\/v2\/media?parent=2608"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}