{"id":27401389,"date":"2024-08-19T00:01:06","date_gmt":"2024-08-18T22:01:06","guid":{"rendered":"https:\/\/www.digiaccion.com\/?page_id=27401389"},"modified":"2026-10-21T22:34:18","modified_gmt":"2026-10-21T20:34:18","slug":"online-ruler-cm-mm","status":"publish","type":"page","link":"https:\/\/www.digiaccion.com\/en\/online-ruler-cm-mm\/","title":{"rendered":"Online Ruler in cm and mm, Actual Size | DigiAcci\u00f3n\u00a0"},"content":{"rendered":"<div class=\"et_pb_section_0 et_pb_section et_section_regular et_flex_section preset--module--divi-section--default\">\n<div class=\"et_pb_row_0 et_pb_row et_flex_row preset--module--divi-row--default\">\n<div class=\"et_pb_column_0 et_pb_column et-last-child et_flex_column et_pb_css_mix_blend_mode_passthrough et_flex_column_24_24 et_flex_column_24_24_tablet et_flex_column_24_24_phone preset--module--divi-column--default\">\n<div class=\"et_pb_code_0 et_pb_code et_pb_module\"><div class=\"et_pb_code_inner\"><!-- DigiAcci\u00f3n | Herramienta: Online ruler in cm and mm (actual size) | English | entrega v13 | 2026-10-20\n     Pegar tal cual en el m\u00f3dulo C\u00f3digo de la \u00fanica secci\u00f3n de la p\u00e1gina. Sin secci\u00f3n de contacto debajo: el c\u00f3digo\n     termina con su propio CTA (contacto y WhatsApp) y los servicios.\n     Los estilos se cargan desde verticales.css del hosting (v12). Dentro: HTML (ra\u00edz .dgv.dgt), JSON-LD\n     (WebApplication creada por DigiAcci\u00f3n + FAQPage) y JS. Sin caracteres de 4 bytes: los emojis van como entidades. -->\n<link rel=\"stylesheet\" id=\"dgv-css\" href=\"https:\/\/www.digiaccion.com\/wp-content\/uploads\/digiaccion-verticales\/verticales.css?v=12\">\n<div class=\"dgv dgt ui-no-swap\" lang=\"en\" data-dgv=\"herramienta-regla-cm\" data-dgt=\"regla-cm\">\n<svg class=\"dgv-sprite\" aria-hidden=\"true\" focusable=\"false\"><symbol id=\"dgv-i-arrow\" viewBox=\"0 0 24 24\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/symbol><symbol id=\"dgv-i-bed\" viewBox=\"0 0 24 24\"><path d=\"M3 18.5V6M3 14h18v4.5M21 14v-2.5a3 3 0 0 0-3-3h-7v5.5\"\/><circle cx=\"7\" cy=\"11\" r=\"2\"\/><\/symbol><symbol id=\"dgv-i-bolt\" viewBox=\"0 0 24 24\"><path d=\"M13 2.5 4.5 13.5H11l-1 8 8.5-11H12l1-8z\"\/><\/symbol><symbol id=\"dgv-i-briefcase\" viewBox=\"0 0 24 24\"><rect x=\"3.5\" y=\"7\" width=\"17\" height=\"12.5\" rx=\"2.5\"\/><path d=\"M9 7V5.5A1.5 1.5 0 0 1 10.5 4h3A1.5 1.5 0 0 1 15 5.5V7M3.5 12.5h17\"\/><\/symbol><symbol id=\"dgv-i-chart\" viewBox=\"0 0 24 24\"><path d=\"M4 19.5h16M7 16v-4M12 16V8M17 16V5\"\/><\/symbol><symbol id=\"dgv-i-check\" viewBox=\"0 0 24 24\"><path d=\"m5 12.5 4.5 4.5L19 7.5\"\/><\/symbol><symbol id=\"dgv-i-chev\" viewBox=\"0 0 24 24\"><path d=\"m6 9 6 6 6-6\"\/><\/symbol><symbol id=\"dgv-i-compass\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"4.5\" r=\"1.5\"\/><path d=\"M11.2 5.8 5.5 20M12.8 5.8 18.5 20M8 14h8\"\/><\/symbol><symbol id=\"dgv-i-cpu\" viewBox=\"0 0 24 24\"><rect x=\"6\" y=\"6\" width=\"12\" height=\"12\" rx=\"2\"\/><rect x=\"9.5\" y=\"9.5\" width=\"5\" height=\"5\" rx=\"1\"\/><path d=\"M9.5 3v3M14.5 3v3M9.5 18v3M14.5 18v3M3 9.5h3M3 14.5h3M18 9.5h3M18 14.5h3\"\/><\/symbol><symbol id=\"dgv-i-crane\" viewBox=\"0 0 24 24\"><path d=\"M5 21V4l13 3H5M9 4l9 3M18 7v5M16.5 12h3v2.5h-3zM3 21h8\"\/><\/symbol><symbol id=\"dgv-i-dumbbell\" viewBox=\"0 0 24 24\"><path d=\"M6.5 6.5v11M17.5 6.5v11M3.5 9v6M20.5 9v6M6.5 12h11\"\/><\/symbol><symbol id=\"dgv-i-food\" viewBox=\"0 0 24 24\"><path d=\"M7 3v8M5 3v5a2 2 0 0 0 4 0V3M7 11v10M16.5 21V3c-2 1.5-3 4-3 7 0 1.5.8 2.5 3 2.5\"\/><\/symbol><symbol id=\"dgv-i-hanger\" viewBox=\"0 0 24 24\"><path d=\"M12 8.5a2 2 0 1 1 2-2c0 1-.8 1.4-1.4 1.8-.4.3-.6.6-.6 1.2v.5L3.5 15.5a1.5 1.5 0 0 0 .9 2.7h15.2a1.5 1.5 0 0 0 .9-2.7L12 10\"\/><\/symbol><symbol id=\"dgv-i-health\" viewBox=\"0 0 24 24\"><path d=\"M12 20s-7.5-4.6-7.5-10A4.3 4.3 0 0 1 12 7.5 4.3 4.3 0 0 1 19.5 10c0 5.4-7.5 10-7.5 10z\"\/><path d=\"M9.5 12h5M12 9.5v5\"\/><\/symbol><symbol id=\"dgv-i-home\" viewBox=\"0 0 24 24\"><path d=\"M3.5 11 12 4l8.5 7\"\/><path d=\"M5.5 9.5V20h13V9.5M10 20v-5.5h4V20\"\/><\/symbol><symbol id=\"dgv-i-kana\" viewBox=\"0 0 24 24\"><path d=\"M5 8h9M9.5 5c-.5 6-2 10-4.5 13M8 12c3 0 7 1 9 5M16 5.5l2.5 2.5\"\/><\/symbol><symbol id=\"dgv-i-layout\" viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2.5\"\/><path d=\"M3 9h18M9 9v11\"\/><\/symbol><symbol id=\"dgv-i-megaphone\" viewBox=\"0 0 24 24\"><path d=\"M4 10v4a1 1 0 0 0 1 1h2l6 4.5v-15L7 9H5a1 1 0 0 0-1 1z\"\/><path d=\"M16.5 9a4 4 0 0 1 0 6M19 6.5a7.5 7.5 0 0 1 0 11\"\/><\/symbol><symbol id=\"dgv-i-minus\" viewBox=\"0 0 24 24\"><path d=\"M5.5 12h13\"\/><\/symbol><symbol id=\"dgv-i-mountain\" viewBox=\"0 0 24 24\"><path d=\"M2.5 20 9 9.5l3.5 5.5 2.5-3.5 6.5 8.5z\"\/><circle cx=\"17\" cy=\"6\" r=\"2\"\/><\/symbol><symbol id=\"dgv-i-palette\" viewBox=\"0 0 24 24\"><path d=\"M12 3a9 9 0 1 0 0 18c1.1 0 1.8-.9 1.8-1.9 0-.5-.2-.9-.5-1.3-.3-.3-.5-.8-.5-1.3 0-1 .8-1.8 1.8-1.8H17a4 4 0 0 0 4-4C21 6.6 17 3 12 3z\"\/><circle cx=\"7.5\" cy=\"11\" r=\"1.1\"\/><circle cx=\"10.5\" cy=\"7.4\" r=\"1.1\"\/><circle cx=\"15\" cy=\"7.8\" r=\"1.1\"\/><\/symbol><symbol id=\"dgv-i-paw\" viewBox=\"0 0 24 24\"><circle cx=\"7\" cy=\"10\" r=\"1.8\"\/><circle cx=\"10.5\" cy=\"6.5\" r=\"1.8\"\/><circle cx=\"14.5\" cy=\"6.5\" r=\"1.8\"\/><circle cx=\"18\" cy=\"10\" r=\"1.8\"\/><path d=\"M12.5 11.5c-2.5 0-5 3.5-5 5.5 0 1.5 1 2.5 2.5 2.5 1 0 1.6-.5 2.5-.5s1.5.5 2.5.5c1.5 0 2.5-1 2.5-2.5 0-2-2.5-5.5-5-5.5z\"\/><\/symbol><symbol id=\"dgv-i-pen\" viewBox=\"0 0 24 24\"><path d=\"M12.5 19.5 19 13l-2.5-2.5L10 17v2.5zM15 9l-2-5-8 3 3 8 5-2M5 7l4 4\"\/><\/symbol><symbol id=\"dgv-i-plus\" viewBox=\"0 0 24 24\"><path d=\"M12 5v14M5 12h14\"\/><\/symbol><symbol id=\"dgv-i-quote\" viewBox=\"0 0 24 24\"><path d=\"M10 7.5C6.8 8.6 5 10.9 5 14.3V18h5.2v-5.2H7.6c.1-1.7 1.1-2.9 3-3.6zM19 7.5c-3.2 1.1-5 3.4-5 6.8V18h5.2v-5.2h-2.6c.1-1.7 1.1-2.9 3-3.6z\"\/><\/symbol><symbol id=\"dgv-i-refresh\" viewBox=\"0 0 24 24\"><path d=\"M19.5 12a7.5 7.5 0 0 1-13 5.1M4.5 12a7.5 7.5 0 0 1 13-5.1\"\/><path d=\"M17.5 3.5v3.6h-3.6M6.5 20.5v-3.6h3.6\"\/><\/symbol><symbol id=\"dgv-i-ruler\" viewBox=\"0 0 24 24\"><rect x=\"2.5\" y=\"8\" width=\"19\" height=\"8\" rx=\"1.5\"\/><path d=\"M6.5 8v3M10 8v4.5M13.5 8v3M17 8v4.5\"\/><\/symbol><symbol id=\"dgv-i-scale\" viewBox=\"0 0 24 24\"><path d=\"M12 4v16M8 20h8M5 7h14M5 7l-2.5 6a2.5 2.5 0 0 0 5 0zM19 7l-2.5 6a2.5 2.5 0 0 0 5 0z\"\/><\/symbol><symbol id=\"dgv-i-shop\" viewBox=\"0 0 24 24\"><path d=\"M4 9h16l-1.4-4.5H5.4zM5 9v11h14V9M9.5 20v-5.5h5V20\"\/><\/symbol><symbol id=\"dgv-i-smile\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"8.5\"\/><path d=\"M8.5 14.2c.9 1.3 2.1 2 3.5 2s2.6-.7 3.5-2\"\/><circle cx=\"9.2\" cy=\"10\" r=\".9\"\/><circle cx=\"14.8\" cy=\"10\" r=\".9\"\/><\/symbol><symbol id=\"dgv-i-sparkles\" viewBox=\"0 0 24 24\"><path d=\"M11 3.5l1.7 4.6 4.6 1.7-4.6 1.7L11 16.1l-1.7-4.6L4.7 9.8l4.6-1.7z\"\/><path d=\"M18 14.5l.8 2.1 2.1.8-2.1.8-.8 2.1-.8-2.1-2.1-.8 2.1-.8z\"\/><\/symbol><symbol id=\"dgv-i-star\" viewBox=\"0 0 24 24\"><path d=\"M12 2.8l2.8 5.8 6.3.9-4.6 4.4 1.1 6.3L12 17.3l-5.6 2.9 1.1-6.3L2.9 9.5l6.3-.9z\"\/><\/symbol><symbol id=\"dgv-i-target\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"8.5\"\/><circle cx=\"12\" cy=\"12\" r=\"4.5\"\/><circle cx=\"12\" cy=\"12\" r=\".6\"\/><\/symbol><symbol id=\"dgv-i-video\" viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"6\" width=\"13\" height=\"12\" rx=\"2.5\"\/><path d=\"m16 10 5-3v10l-5-3\"\/><\/symbol><symbol id=\"dgv-i-whatsapp\" viewBox=\"0 0 24 24\"><path d=\"M20 11.6A8.4 8.4 0 0 1 7.6 19L4 20l1-3.5A8.4 8.4 0 1 1 20 11.6z\"\/><path d=\"M9.3 8.4c.3-.4.7-.4 1-.4l.6 1.6c.1.2 0 .5-.1.6l-.5.6c.6 1.1 1.5 2 2.6 2.6l.6-.5c.2-.1.4-.2.6-.1l1.6.6c0 .4-.1.8-.4 1.1-.5.4-1.1.6-1.7.5-2.6-.5-4.6-2.5-5.1-5.1-.1-.6.1-1.1.5-1.5z\"\/><\/symbol><symbol id=\"dgv-i-wrench\" viewBox=\"0 0 24 24\"><path d=\"M14.5 5.5a4.5 4.5 0 0 0 5.6 5.6L12 19.2a2 2 0 0 1-2.8 0l-.4-.4a2 2 0 0 1 0-2.8l8.1-8.1\"\/><path d=\"M14.5 5.5 17 3l4 4-2.5 2.5\"\/><\/symbol><\/svg>\n<section class=\"dgv-sec dgt-hero\" aria-labelledby=\"dgt-h1\">\n<div class=\"dgv-fx\" aria-hidden=\"true\"><div class=\"dgv-beams dgv-beams--soft\"><\/div><\/div>\n<div class=\"dgv-wrap dgt-hero-in\" data-dgv-r>\n<p class=\"dgt-kicker\"><span class=\"dgv-live\" aria-hidden=\"true\"><\/span>Free tool by DigiAcci\u00f3n<\/p>\n<h1 class=\"dgt-h1\" id=\"dgt-h1\"><span class=\"dgv-grad\">Accurate online ruler in cm and mm at actual size<\/span><\/h1>\n<p class=\"dgv-intro dgt-intro\">A free on-screen ruler with no sign-up, made by DigiAcci\u00f3n, a digital marketing agency in Andorra. Calibrate it with a credit card, measure in centimeters and millimeters, or type a length to see how big 5 or 10 cm really is.<\/p>\n<ul class=\"dgt-badges\" role=\"list\"><li><svg class=\"dgv-i\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-check\"><\/use><\/svg>Free<\/li><li><svg class=\"dgv-i\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-check\"><\/use><\/svg>No sign-up<\/li><li><svg class=\"dgv-i\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-check\"><\/use><\/svg>Card calibration<\/li><\/ul>\n<\/div>\n<\/section>\n<section class=\"dgv-sec dgt-app-sec\" id=\"dgt-app\" aria-label=\"Tool\">\n<div class=\"dgv-wrap\">\n<div class=\"dgt-tool dgt-card dgt-ruler\" data-dgt-ruler data-unit=\"cm\" data-ui=\"{&#34;copiado&#34;: &#34;Copied&#34;, &#34;f_simbolo&#34;: &#34;Symbol&#34;, &#34;calibrada&#34;: &#34;Ruler calibrated in this browser.&#34;, &#34;equiv&#34;: &#34;1 {u} = {px} px.&#34;, &#34;sin_calibrar&#34;: &#34;Not calibrated: the length is approximate. Press \\&#34;Calibrate\\&#34; to make it exact on your screen.&#34;, &#34;guardada&#34;: &#34;Calibration saved&#34;, &#34;aa_grande&#34;: &#34;AA large text&#34;, &#34;no_pasa&#34;: &#34;Fails&#34;, &#34;no_cabe&#34;: &#34;Up to {n} fits on your screen. Turn your phone sideways or use full screen.&#34;, &#34;pasa&#34;: &#34;Pass&#34;, &#34;jn_aprox&#34;: &#34;Spelled by sound: double-check it if it is for a tattoo or anything important.&#34;, &#34;jn_dic&#34;: &#34;Usual spelling in Japan.&#34;, &#34;regla_fija&#34;: &#34;Actual size {n} ruler&#34;}\">\n<div class=\"dgt-bar dgt-bar--r\">\n<div class=\"dgt-seg\" role=\"radiogroup\" aria-label=\"Unit\"><button type=\"button\" role=\"radio\" data-u=\"cm\" aria-checked=\"true\">Centimeters<\/button><button type=\"button\" role=\"radio\" data-u=\"in\" aria-checked=\"false\">Inches<\/button><\/div>\n<p class=\"dgt-read\" aria-live=\"polite\"><small>Length<\/small><output data-dgt-read>0<\/output><\/p>\n<label class=\"dgt-goto\"><span>Go to a length<\/span><span class=\"dgt-goto-in\"><input type=\"number\" min=\"0\" step=\"0.1\" inputmode=\"decimal\" placeholder=\"10\" data-dgt-goto><b data-dgt-gu>cm<\/b><\/span><\/label>\n<span class=\"dgt-bar-b\"><button type=\"button\" class=\"dgt-btn dgt-btn--pri\" data-act=\"calibrar\"><svg class=\"dgv-i\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-target\"><\/use><\/svg>Calibrate<\/button><button type=\"button\" class=\"dgt-btn\" data-act=\"pantalla\" aria-pressed=\"false\"><svg class=\"dgv-i\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-layout\"><\/use><\/svg>Full screen<\/button><\/span>\n<\/div>\n<div class=\"dgt-ruler-box\" data-dgt-rbox><canvas class=\"dgt-ruler-c\" data-dgt-canvas role=\"img\" aria-label=\"Actual size ruler\"><\/canvas><button type=\"button\" class=\"dgt-mark\" data-dgt-mark aria-label=\"Measuring marker: drag it or use the arrow keys\" role=\"slider\" aria-valuemin=\"0\" aria-valuenow=\"0\"><i><\/i><\/button><\/div>\n<p class=\"dgt-cal-state\" data-dgt-state><\/p>\n<div class=\"dgt-cal dgt-panel\" data-dgt-cal hidden>\n<p class=\"dgt-panel-t\"><svg class=\"dgv-i\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-target\"><\/use><\/svg>Calibrate the ruler so it measures at actual size<\/p>\n<div class=\"dgt-cal-grid\">\n<div><p class=\"dgt-cal-h\">With a credit card<\/p><p class=\"dgt-note\">Hold a credit or debit card (85.60 x 53.98 mm, the standard size) against the screen and adjust the slider until the drawing has the same width.<\/p><div class=\"dgt-cardbox\"><div class=\"dgt-credit\" data-dgt-card><span><\/span><\/div><\/div><div class=\"dgt-cal-ctl\"><button type=\"button\" class=\"dgt-btn\" data-act=\"cal-menos\" aria-label=\"Smaller\"><svg class=\"dgv-i\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-minus\"><\/use><\/svg><\/button><input type=\"range\" min=\"2.4\" max=\"9\" step=\"0.005\" data-dgt-ppm aria-label=\"With a credit card\"><button type=\"button\" class=\"dgt-btn\" data-act=\"cal-mas\" aria-label=\"Larger\"><svg class=\"dgv-i\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-plus\"><\/use><\/svg><\/button><\/div><\/div>\n<div><p class=\"dgt-cal-h\">With your screen size<\/p><p class=\"dgt-note\">If you know your screen diagonal in inches, type it in.<\/p><label class=\"dgt-field\"><span>Diagonal in inches<\/span><input type=\"number\" min=\"3\" max=\"100\" step=\"0.1\" inputmode=\"decimal\" placeholder=\"15.6\" data-dgt-diag><\/label><button type=\"button\" class=\"dgt-btn\" data-act=\"cal-diag\">Apply<\/button><\/div>\n<\/div>\n<div class=\"dgt-cal-end\"><button type=\"button\" class=\"dgt-btn dgt-btn--pri\" data-act=\"cal-ok\"><svg class=\"dgv-i\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-check\"><\/use><\/svg>Save calibration<\/button><button type=\"button\" class=\"dgt-btn\" data-act=\"cal-reset\"><svg class=\"dgv-i\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-refresh\"><\/use><\/svg>Reset<\/button><\/div>\n<\/div>\n<div class=\"dgt-fixed\" data-dgt-fixed>\n<div class=\"dgt-grp-h\"><h2 class=\"dgt-gh dgv-grad\" id=\"dgt-fijas-h\">25, 20, 15, 10 and 5 cm rulers at actual size<\/h2><p class=\"dgt-gd\">They use the same calibration as the main ruler: once your screen is calibrated, each one is exactly as long as its label. See at a glance how big 5, 10 or 20 cm is. Until you calibrate, lengths are approximate.<\/p><\/div>\n<div class=\"dgt-fr\" data-n=\"25\"><h3 class=\"dgt-fr-h\">25 cm ruler: how big is 25 cm<\/h3><div class=\"dgt-fr-w\"><canvas class=\"dgt-fr-c\" data-dgt-fc data-n=\"25\" role=\"img\" aria-label=\"Actual size 25 cm ruler\"><\/canvas><\/div><\/div>\n<div class=\"dgt-fr\" data-n=\"20\"><h3 class=\"dgt-fr-h\">20 cm ruler: how long is 20 cm<\/h3><div class=\"dgt-fr-w\"><canvas class=\"dgt-fr-c\" data-dgt-fc data-n=\"20\" role=\"img\" aria-label=\"Actual size 20 cm ruler\"><\/canvas><\/div><\/div>\n<div class=\"dgt-fr\" data-n=\"15\"><h3 class=\"dgt-fr-h\">15 cm ruler: how long is 15 cm<\/h3><div class=\"dgt-fr-w\"><canvas class=\"dgt-fr-c\" data-dgt-fc data-n=\"15\" role=\"img\" aria-label=\"Actual size 15 cm ruler\"><\/canvas><\/div><\/div>\n<div class=\"dgt-fr\" data-n=\"10\"><h3 class=\"dgt-fr-h\">10 cm ruler: how big is 10 cm<\/h3><div class=\"dgt-fr-w\"><canvas class=\"dgt-fr-c\" data-dgt-fc data-n=\"10\" role=\"img\" aria-label=\"Actual size 10 cm ruler\"><\/canvas><\/div><\/div>\n<div class=\"dgt-fr\" data-n=\"5\"><h3 class=\"dgt-fr-h\">5 cm ruler: how big is 5 cm<\/h3><div class=\"dgt-fr-w\"><canvas class=\"dgt-fr-c\" data-dgt-fc data-n=\"5\" role=\"img\" aria-label=\"Actual size 5 cm ruler\"><\/canvas><\/div><\/div>\n<p class=\"dgt-note dgt-fr-note\">Swipe to see the whole ruler<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/section>\n<section class=\"dgv-sec dgt-guide\">\n<div class=\"dgv-wrap\">\n<div class=\"dgv-head dgv-head--c\" data-dgv-r><h2 class=\"dgv-h2 dgv-grad\">How to use the actual size ruler on your screen<\/h2><p class=\"dgv-intro\">Four steps to measure correctly and two tips to keep it accurate.<\/p><\/div><div class=\"dgt-cards dgt-cards--6\"><article class=\"dgv-card dgt-gcard\" data-dgv-r style=\"--dgv-d:0.00s\"><span class=\"dgt-num\" aria-hidden=\"true\">01<\/span><h3 class=\"dgv-h3\">Calibrate with a card<\/h3><p class=\"dgv-txt\">Press <strong>Calibrate<\/strong>, hold a credit card against the drawing and adjust it until both are the same width. Then save the calibration.<\/p><\/article><article class=\"dgv-card dgt-gcard\" data-dgv-r style=\"--dgv-d:0.08s\"><span class=\"dgt-num\" aria-hidden=\"true\">02<\/span><p class=\"dgv-h3\">Or enter your diagonal<\/p><p class=\"dgv-txt\">If you know your screen size in inches, type it in and press <strong>Apply<\/strong>. Then check against an object of known size.<\/p><\/article><article class=\"dgv-card dgt-gcard\" data-dgv-r style=\"--dgv-d:0.16s\"><span class=\"dgt-num\" aria-hidden=\"true\">03<\/span><p class=\"dgv-h3\">Put the object at zero<\/p><p class=\"dgv-txt\">Line one end up with the 0 mark, which sits slightly inward, not with the edge of the screen.<\/p><\/article><article class=\"dgv-card dgt-gcard\" data-dgv-r style=\"--dgv-d:0.00s\"><span class=\"dgt-num\" aria-hidden=\"true\">04<\/span><p class=\"dgv-h3\">Drag the marker or type a length<\/p><p class=\"dgv-txt\">Move it to the other end, tap that point or type the length in <strong>Go to a length<\/strong>. The arrow keys move it one millimeter at a time.<\/p><\/article><article class=\"dgv-card dgt-gcard\" data-dgv-r style=\"--dgv-d:0.08s\"><span class=\"dgt-num\" aria-hidden=\"true\">05<\/span><p class=\"dgv-h3\">Go full screen<\/p><p class=\"dgv-txt\">You get more room for long objects. On a phone, turn it sideways. Press Esc or the same button to exit.<\/p><\/article><article class=\"dgv-card dgt-gcard\" data-dgv-r style=\"--dgv-d:0.16s\"><span class=\"dgt-num\" aria-hidden=\"true\">06<\/span><p class=\"dgv-h3\">Recalibrate after changes<\/p><p class=\"dgv-txt\">The setting is saved in this browser. Do it again if you switch browser or screen, or if zoom isn't at 100%.<\/p><\/article><\/div>\n<\/div>\n<\/section>\n<section class=\"dgv-sec dgt-guide\">\n<div class=\"dgv-wrap\">\n<div class=\"dgv-head dgv-head--c\" data-dgv-r><h2 class=\"dgv-h2 dgv-grad\">Credit card size and other reference measurements<\/h2><p class=\"dgv-intro\">Objects with a standard size you can use to calibrate the ruler or check that it measures right.<\/p><\/div><div class=\"dgt-table-w\" data-dgv-r><table class=\"dgt-table\"><thead><tr><th scope=\"col\">Object<\/th><th scope=\"col\">Size<\/th><th scope=\"col\">In inches<\/th><\/tr><\/thead><tbody><tr><th scope=\"row\">Credit card (ISO\/IEC 7810 ID-1)<\/th><td>85.60 x 53.98 mm<\/td><td>3.370 x 2.125 in<\/td><\/tr><tr><th scope=\"row\">Card thickness<\/th><td>0.76 mm<\/td><td>0.030 in<\/td><\/tr><tr><th scope=\"row\">US Letter sheet<\/th><td>215.9 x 279.4 mm<\/td><td>8.5 x 11 in<\/td><\/tr><tr><th scope=\"row\">A4 sheet<\/th><td>210 x 297 mm<\/td><td>8.27 x 11.69 in<\/td><\/tr><tr><th scope=\"row\">US quarter (diameter)<\/th><td>24.26 mm<\/td><td>0.955 in<\/td><\/tr><tr><th scope=\"row\">US penny (diameter)<\/th><td>19.05 mm<\/td><td>0.750 in<\/td><\/tr><\/tbody><\/table><\/div>\n<\/div>\n<\/section>\n<section class=\"dgv-sec dgt-guide\">\n<div class=\"dgv-wrap\">\n<div class=\"dgv-head dgv-head--c\" data-dgv-r><h2 class=\"dgv-h2 dgv-grad\">How many mm in a cm: conversion chart<\/h2><p class=\"dgv-intro\">A centimeter has 10 millimeters. The chart adds the inch, which is exactly 25.4 mm.<\/p><\/div><div class=\"dgt-table-w\" data-dgv-r><table class=\"dgt-table\"><thead><tr><th scope=\"col\">Centimeters<\/th><th scope=\"col\">Millimeters<\/th><th scope=\"col\">Inches (approx.)<\/th><\/tr><\/thead><tbody><tr><th scope=\"row\">0.1 cm<\/th><td>1 mm<\/td><td>0.04 in<\/td><\/tr><tr><th scope=\"row\">1 cm<\/th><td>10 mm<\/td><td>0.39 in<\/td><\/tr><tr><th scope=\"row\">2.54 cm<\/th><td>25.4 mm<\/td><td>1 in (exact)<\/td><\/tr><tr><th scope=\"row\">5 cm<\/th><td>50 mm<\/td><td>1.97 in<\/td><\/tr><tr><th scope=\"row\">10 cm<\/th><td>100 mm<\/td><td>3.94 in<\/td><\/tr><tr><th scope=\"row\">15 cm<\/th><td>150 mm<\/td><td>5.91 in<\/td><\/tr><tr><th scope=\"row\">20 cm<\/th><td>200 mm<\/td><td>7.87 in<\/td><\/tr><tr><th scope=\"row\">30 cm<\/th><td>300 mm<\/td><td>11.81 in<\/td><\/tr><\/tbody><\/table><\/div>\n<\/div>\n<\/section>\n<section class=\"dgv-sec dgv-faq-sec\" id=\"dgv-faq\">\n<div class=\"dgv-fx\" aria-hidden=\"true\"><div class=\"dgv-halo dgv-halo--t\"><\/div><\/div>\n<div class=\"dgv-wrap dgv-faq-wrap\">\n<div class=\"dgv-head dgv-head--c\" data-dgv-r><h2 class=\"dgv-h2 dgv-grad\">Online ruler FAQ: accuracy, phones and sizes<\/h2><\/div>\n<div class=\"dgv-faq dgv-faq--2\"><div class=\"dgv-faq-col\">\n<div class=\"dgv-faq-item is-open\"><h3 class=\"dgv-faq-q\"><button class=\"dgv-faq-btn\" type=\"button\" id=\"dgv-faq-q1\" aria-expanded=\"true\" aria-controls=\"dgv-faq-a1\"><span>Is there an accurate online ruler?<\/span><span class=\"dgv-pm\" aria-hidden=\"true\"><\/span><\/button><\/h3><div class=\"dgv-faq-a\" id=\"dgv-faq-a1\" role=\"region\" aria-labelledby=\"dgv-faq-q1\"><div><p>Yes, as long as you calibrate it. Without calibration the browser doesn't know your screen's physical size, so on some phones a centimeter comes out 3 to 4 mm short. Calibrated with a credit card, the error on small objects stays within a few tenths of a millimeter.<\/p><\/div><\/div><\/div>\n<div class=\"dgv-faq-item\"><h3 class=\"dgv-faq-q\"><button class=\"dgv-faq-btn\" type=\"button\" id=\"dgv-faq-q2\" aria-expanded=\"false\" aria-controls=\"dgv-faq-a2\"><span>Can you use a phone as a ruler?<\/span><span class=\"dgv-pm\" aria-hidden=\"true\"><\/span><\/button><\/h3><div class=\"dgv-faq-a\" id=\"dgv-faq-a2\" role=\"region\" aria-labelledby=\"dgv-faq-q2\"><div><p>Yes. Open this page on your phone, tap <strong>Calibrate<\/strong> and match the drawing to a credit card held on the screen. Save the calibration, line the object up with zero and drag the marker to its end. Turn the phone sideways if you need more than 6 or 7 cm.<\/p><\/div><\/div><\/div>\n<div class=\"dgv-faq-item\"><h3 class=\"dgv-faq-q\"><button class=\"dgv-faq-btn\" type=\"button\" id=\"dgv-faq-q3\" aria-expanded=\"false\" aria-controls=\"dgv-faq-a3\"><span>How can I get a ruler on my screen?<\/span><span class=\"dgv-pm\" aria-hidden=\"true\"><\/span><\/button><\/h3><div class=\"dgv-faq-a\" id=\"dgv-faq-a3\" role=\"region\" aria-labelledby=\"dgv-faq-q3\"><div><p>There is nothing to install: this page draws a centimeter and millimeter ruler in your browser, with inches along the bottom, plus fixed 5 to 25 cm rulers underneath. Calibrate it once with a credit card or your screen diagonal and it is ready to measure in that browser.<\/p><\/div><\/div><\/div>\n<div class=\"dgv-faq-item\"><h3 class=\"dgv-faq-q\"><button class=\"dgv-faq-btn\" type=\"button\" id=\"dgv-faq-q4\" aria-expanded=\"false\" aria-controls=\"dgv-faq-a4\"><span>How can I show 1 centimeter on my screen?<\/span><span class=\"dgv-pm\" aria-hidden=\"true\"><\/span><\/button><\/h3><div class=\"dgv-faq-a\" id=\"dgv-faq-a4\" role=\"region\" aria-labelledby=\"dgv-faq-q4\"><div><p>Calibrate the ruler, then type 1 in <strong>Go to a length<\/strong>: the marker moves to 1 cm (10 mm). You can also select the marker and press the right arrow key ten times, since each press moves it 1 mm. The distance from zero to the marker is one real centimeter.<\/p><\/div><\/div><\/div>\n<div class=\"dgv-faq-item\"><h3 class=\"dgv-faq-q\"><button class=\"dgv-faq-btn\" type=\"button\" id=\"dgv-faq-q5\" aria-expanded=\"false\" aria-controls=\"dgv-faq-a5\"><span>How big is 1 mm visually?<\/span><span class=\"dgv-pm\" aria-hidden=\"true\"><\/span><\/button><\/h3><div class=\"dgv-faq-a\" id=\"dgv-faq-a5\" role=\"region\" aria-labelledby=\"dgv-faq-q5\"><div><p>One millimeter is the gap between two small lines on the ruler, a tenth of a centimeter. A credit card is 0.76 mm thick, so a millimeter is a little more than the thickness of a credit card.<\/p><\/div><\/div><\/div>\n<div class=\"dgv-faq-item\"><h3 class=\"dgv-faq-q\"><button class=\"dgv-faq-btn\" type=\"button\" id=\"dgv-faq-q6\" aria-expanded=\"false\" aria-controls=\"dgv-faq-a6\"><span>How long is 20 cm on a ruler?<\/span><span class=\"dgv-pm\" aria-hidden=\"true\"><\/span><\/button><\/h3><div class=\"dgv-faq-a\" id=\"dgv-faq-a6\" role=\"region\" aria-labelledby=\"dgv-faq-q6\"><div><p>20 cm is 200 millimeters, about 7.87 inches: on a ruler, the distance from 0 to the long line marked 20. This page has a fixed 20 cm ruler at actual size below the main one, or you can type 20 in <strong>Go to a length<\/strong> to move the marker there. On a phone it won't fit on one screen, so swipe along the fixed ruler.<\/p><\/div><\/div><\/div><\/div><div class=\"dgv-faq-col\">\n<div class=\"dgv-faq-item\"><h3 class=\"dgv-faq-q\"><button class=\"dgv-faq-btn\" type=\"button\" id=\"dgv-faq-q7\" aria-expanded=\"false\" aria-controls=\"dgv-faq-a7\"><span>How big is 30 cm visually?<\/span><span class=\"dgv-pm\" aria-hidden=\"true\"><\/span><\/button><\/h3><div class=\"dgv-faq-a\" id=\"dgv-faq-a7\" role=\"region\" aria-labelledby=\"dgv-faq-q7\"><div><p>30 cm is 300 mm, about 11.81 inches, just under a foot (12 inches is 30.48 cm). It is 3 mm longer than an A4 sheet (29.7 cm) and about 2 cm longer than a sheet of US Letter paper (27.94 cm). On a laptop, type 30 in <strong>Go to a length<\/strong> to see it on screen; if it doesn't fit, the ruler tells you how much does.<\/p><\/div><\/div><\/div>\n<div class=\"dgv-faq-item\"><h3 class=\"dgv-faq-q\"><button class=\"dgv-faq-btn\" type=\"button\" id=\"dgv-faq-q8\" aria-expanded=\"false\" aria-controls=\"dgv-faq-a8\"><span>How many mm in a cm?<\/span><span class=\"dgv-pm\" aria-hidden=\"true\"><\/span><\/button><\/h3><div class=\"dgv-faq-a\" id=\"dgv-faq-a8\" role=\"region\" aria-labelledby=\"dgv-faq-q8\"><div><p>There are 10 millimeters in a centimeter and 1,000 in a meter. To convert centimeters to millimeters, multiply by 10: 4.5 cm is 45 mm. One inch is exactly 25.4 mm, or 2.54 cm.<\/p><\/div><\/div><\/div>\n<div class=\"dgv-faq-item\"><h3 class=\"dgv-faq-q\"><button class=\"dgv-faq-btn\" type=\"button\" id=\"dgv-faq-q9\" aria-expanded=\"false\" aria-controls=\"dgv-faq-a9\"><span>What is the size of a credit card in mm?<\/span><span class=\"dgv-pm\" aria-hidden=\"true\"><\/span><\/button><\/h3><div class=\"dgv-faq-a\" id=\"dgv-faq-a9\" role=\"region\" aria-labelledby=\"dgv-faq-q9\"><div><p>Credit and debit cards follow the ISO\/IEC 7810 ID-1 format: 85.60 mm long, 53.98 mm high and 0.76 mm thick, about 3.370 x 2.125 inches. Because the size is the same everywhere, a card works for calibrating on-screen rulers in any country.<\/p><\/div><\/div><\/div>\n<div class=\"dgv-faq-item\"><h3 class=\"dgv-faq-q\"><button class=\"dgv-faq-btn\" type=\"button\" id=\"dgv-faq-q10\" aria-expanded=\"false\" aria-controls=\"dgv-faq-a10\"><span>Does the iPhone have a digital ruler?<\/span><span class=\"dgv-pm\" aria-hidden=\"true\"><\/span><\/button><\/h3><div class=\"dgv-faq-a\" id=\"dgv-faq-a10\" role=\"region\" aria-labelledby=\"dgv-faq-q10\"><div><p>The iPhone includes Apple's Measure app, which uses the camera to measure objects around you. For small items you hold against the screen, this on-screen ruler works in Safari with no app; calibrate it first so the millimeters match your screen.<\/p><\/div><\/div><\/div>\n<div class=\"dgv-faq-item\"><h3 class=\"dgv-faq-q\"><button class=\"dgv-faq-btn\" type=\"button\" id=\"dgv-faq-q11\" aria-expanded=\"false\" aria-controls=\"dgv-faq-a11\"><span>How to measure without a ruler?<\/span><span class=\"dgv-pm\" aria-hidden=\"true\"><\/span><\/button><\/h3><div class=\"dgv-faq-a\" id=\"dgv-faq-a11\" role=\"region\" aria-labelledby=\"dgv-faq-q11\"><div><p>Use an object of known size: a credit card is 85.60 x 53.98 mm, a US quarter is 24.26 mm across and a sheet of US Letter paper is 8.5 x 11 inches. Body measures such as a finger width vary from person to person, so measure yours once with a calibrated ruler.<\/p><\/div><\/div><\/div>\n<div class=\"dgv-faq-item\"><h3 class=\"dgv-faq-q\"><button class=\"dgv-faq-btn\" type=\"button\" id=\"dgv-faq-q12\" aria-expanded=\"false\" aria-controls=\"dgv-faq-a12\"><span>When do I need to recalibrate the online ruler?<\/span><span class=\"dgv-pm\" aria-hidden=\"true\"><\/span><\/button><\/h3><div class=\"dgv-faq-a\" id=\"dgv-faq-a12\" role=\"region\" aria-labelledby=\"dgv-faq-q12\"><div><p>When you switch browser, device or monitor, and whenever browser zoom isn't at 100%, because zoom stretches or shrinks the ruler. Calibration is saved per browser, so another computer needs its own. Clearing your browsing data removes it too.<\/p><\/div><\/div><\/div><\/div>\n<\/div>\n<\/div>\n<\/section>\n<section class=\"dgv-sec dgv-more-sec\" id=\"dgv-leer-mas\">\n<div class=\"dgv-wrap dgv-more-grid\">\n<div class=\"dgv-card dgv-more-card\" data-dgv-r>\n<p class=\"dgv-more-t dgv-grad\">Guide to the online ruler in cm and mm<\/p><p class=\"dgv-more-s\">How to calibrate it, how to measure well and what is behind a centimeter on screen<\/p>\n<div class=\"dgv-more\" id=\"dgv-more-body\" data-dgv-more><div class=\"dgv-prose\"><h2>What a virtual ruler is and what it is for<\/h2><p>A virtual ruler is a ruler drawn on your screen that, once adjusted, measures like a plastic one. This one shows centimeters and millimeters along the top and inches along the bottom, and it has a marker you can drag to read the exact length from zero to that point, plus fixed 5, 10, 15, 20 and 25 cm rulers underneath.<\/p><p>It won't replace calipers or a tape measure for workshop jobs, but once calibrated it gives reliable readings, within a few tenths of a millimeter, for anything that fits on the screen.<\/p><h3>What you can measure with a ruler on screen<\/h3><p>It gets you out of a jam when there is no ruler around:<\/p><ul><li>The diameter of a button, a screw, a battery or a ring.<\/li><li>A small part before you order a replacement or a case.<\/li><li>The size of a label, a photo or a printed card.<\/li><li>What 1, 5 or 10 cm really looks like when a product page gives a size you can't picture.<\/li><\/ul><h2>Why an actual size ruler in cm needs calibration<\/h2><p>Your browser doesn't know how big your screen physically is. It draws in CSS pixels, and the <a href=\"https:\/\/www.w3.org\/TR\/css-values-3\/#absolute-lengths\" target=\"_blank\" rel=\"noopener\">W3C CSS units specification<\/a> sets 1 inch at 96 of those pixels and 1 cm at 96\/2.54, about 37.8. On screens, the W3C recommends anchoring lengths to the pixel, and it warns that physical units may then not match their real-world size.<\/p><h3>Why an online ruler isn't accurate until you calibrate it<\/h3><p>Every screen has its own pixel density (pixels per inch), and the operating system applies scaling so text isn't tiny. As a result, those 37.8 pixels can take up more or less than a centimeter. Two worked examples:<\/p><ul><li>On a 15.6-inch laptop at 1920 x 1080 with Windows scaling at 125%, an uncalibrated centimeter is drawn about 8.5 mm long.<\/li><li>On a phone with 400 to 460 pixels per inch and 3x scaling, it shrinks to about 6.3 to 7.2 mm.<\/li><\/ul><p>That's why the tool tells you the reading is approximate until you calibrate. Calibration tells the ruler how many pixels make a millimeter on your screen and corrects the difference.<\/p><h2>How to calibrate the ruler to actual size<\/h2><p>Press <strong>Calibrate<\/strong> and pick one of the two methods. Both end the same way: press <strong>Save calibration<\/strong> and the ruler remembers the setting in that browser. It is stored only on your device and sent nowhere. If something goes wrong, <strong>Reset<\/strong> takes you back to the start. The same calibration applies to the main ruler and to the fixed 5 to 25 cm rulers.<\/p><h3>With a credit or debit card<\/h3><p>Credit cards follow the ISO\/IEC 7810 ID-1 format: 85.60 x 53.98 mm (3.370 x 2.125 inches). Hold the card horizontally against the card drawing in the panel, without pressing, and move the slider or the <em>Smaller<\/em> and <em>Larger<\/em> buttons until both edges line up.<\/p><p>It is the most reliable method because you compare against a physical object, and the error it leaves is small: if you are half a millimeter off over the card's 85.6 mm, the error is 0.6%, about six tenths of a millimeter every 10 cm.<\/p><h3>With your screen diagonal<\/h3><p>If you know your screen's diagonal in inches (it's on the spec sheet of your laptop, monitor or phone), type it in and press <strong>Apply<\/strong>. The ruler works out the pixels per inch from the resolution the browser reports. It's quick, but it depends on that figure being right: with external monitors, several displays or unusual scaling it can miss. Check the result afterward with a card or any object of known size.<\/p><h2>How to measure in cm and mm with the online ruler<\/h2><p>Once the ruler is calibrated, place the object on the screen with one end at zero. Zero isn't at the edge of the screen but slightly inward, so always line up with the 0 mark. Then drag the marker to the other end, or click or tap the point on the ruler where the object ends. The reading shows centimeters, with up to two decimals, and millimeters in parentheses.<\/p><p>To fine-tune, select the marker and use the arrow keys: each press moves it 1 mm, and 1 cm with Shift held down. The Home key sends it back to zero. For long objects, press <strong>Full screen<\/strong> to gain room, and press Esc to leave.<\/p><p>If you already know the length you want, type it in <strong>Go to a length<\/strong>, next to the reading: type 7 and the marker moves to 7 cm. It accepts decimals, and if you switch to inches, the number is read in inches.<\/p><h3>How to read centimeters and millimeters on a ruler<\/h3><p>On the top scale, the long numbered lines mark each centimeter, the slightly shorter middle line marks half a centimeter (5 mm), and the small lines mark each millimeter. There are 10 millimeters between two numbers. If an object reaches the third small line after 4, it is 4.3 cm, or 43 mm, long.<\/p><h2>Tips to make it measure like a real ruler<\/h2><p>Calibration fixes the scale, but a few details still change the reading:<\/p><ul><li><strong>Keep zoom at 100%.<\/strong> If you zoom the page in or out, the ruler stretches or shrinks with it. Go back to 100% (Ctrl + 0 on Windows, Command + 0 on Mac) or calibrate again.<\/li><li><strong>Look straight on.<\/strong> Screen glass has thickness, so at an angle the edge of the object seems to fall on a different line. A tempered glass protector makes it worse.<\/li><li><strong>Don't press down.<\/strong> On touchscreens, rest the object without pressing so nothing moves when you touch the marker.<\/li><li><strong>One calibration per browser.<\/strong> It is saved in the browser you use. If you switch browser or computer, or plug in another monitor, do it again.<\/li><li><strong>Check now and then.<\/strong> Lay a card on the ruler: its long side should end exactly at 8.56 cm.<\/li><\/ul><h2>Using the ruler on your phone<\/h2><p>The ruler works the same on a phone, in the browser, with nothing to install. What changes is the space: the screen of a 6.1-inch phone with a 19.5:9 aspect ratio is about 6.5 cm wide held upright and about 14 cm wide sideways. Turn the phone and use full screen to measure longer objects.<\/p><p>Calibrate on each device, because your laptop setting won't work on your phone: every screen has its own density. On a phone the card is the best method, since few people know their screen diagonal. Lay the phone flat on a table so it doesn't move while you position the object.<\/p><h3>Does a 10 cm ruler fit on a phone screen?<\/h3><p>Not upright, because a phone screen is around 6 to 7 cm wide: if you type 10 in <strong>Go to a length<\/strong>, the ruler tells you how much fits. Sideways, a 10 cm ruler at actual size usually fits with room to spare. The fixed rulers that don't fit on the screen scroll sideways with your finger. To measure anything longer than 14 or 15 cm, do it in sections or switch to a computer.<\/p><h2>How big is 5 cm and 10 cm at actual size<\/h2><p>It's one of the most searched questions: seeing how long a measurement is without a ruler. With your screen calibrated, there are two ways to see it. The first is the fixed 5 cm or 10 cm ruler below the main one. The second is typing 5 or 10 in <strong>Go to a length<\/strong>, next to the reading: the marker moves to 5 cm (50 mm) or 10 cm (100 mm), and the distance from zero is the real length.<\/p><p>The field works for any number, such as 3, 7, 12 or 25 cm. If the length doesn't fit on your screen, the ruler tells you how much does, so you can turn your phone or switch to full screen.<\/p><p>To picture it without a screen, use objects with a fixed size. A credit card is 8.56 x 5.398 cm: 5 cm is about 4 mm shorter than its short side, and 10 cm is almost a centimeter and a half longer than its long side. A US quarter is 24.26 mm across, so two in a row come to 4.85 cm, just under 5 cm.<\/p><h3>How big is 1 cm, 2 cm or 3 cm<\/h3><p>One centimeter is 10 millimeters, the gap between two numbers on the ruler, and a little more than a stack of 13 credit cards (13 x 0.76 mm = 9.88 mm). A US penny is 19.05 mm across, just under 2 cm, and 3 cm is about 6 mm more than the width of a quarter. For small lengths like these, type the number in <strong>Go to a length<\/strong> or use the arrow keys, which move the marker one millimeter at a time.<\/p><h3>How long is 30 cm? A 30 cm ruler on a laptop<\/h3><p>30 cm is about 11.81 inches, just under a foot. A 30 cm ruler fits on a 15.6-inch laptop screen, which is about 34.5 cm wide, and on any desktop monitor. On 13- or 14-inch laptops it either doesn't fit or barely fits, since the screen is between 28 and 31 cm wide depending on its aspect ratio: switch to full screen to use all the space or measure in sections. If you type 30 in <strong>Go to a length<\/strong> and it doesn't fit, the ruler tells you how many centimeters your screen can show.<\/p><h2>15 cm ruler and 20 cm ruler: which fits on your screen<\/h2><p>Below the main ruler there are five fixed rulers: 25, 20, 15, 10 and 5 cm. They have no marker: each one draws exactly its length, from the red zero line to the red end line, with the same calibration as the main ruler. Use them to see a length at a glance, to compare an object with several lengths at once, or to check your calibration: lay a credit card on the 10 cm ruler and its long side should end at 8.56 cm.<\/p><p>Whether they show in full depends on your screen width. On a laptop or a desktop monitor they usually all fit. On a phone, the ones that don't fit scroll sideways with your finger and keep their actual size. Turn the phone sideways and the 10 cm ruler usually fits in full.<\/p><h3>How big is 15 cm or 25 cm<\/h3><p>15 cm is 150 mm, about 5.91 inches: 6 mm shorter than a US dollar bill, which is 6.14 inches (156 mm) long. 25 cm is 250 mm, about 9.84 inches, 4 mm short of 10 inches (25.4 cm). Rulers of 15, 20 and 30 cm are very common in schools and offices, and the fixed rulers let you see the first two at actual size without having one at hand.<\/p><h2>Metric ruler: meters, centimeters and millimeters<\/h2><p>Centimeters and millimeters are fractions of the meter, the SI unit of length. As <a href=\"https:\/\/www.nist.gov\/pml\/owm\/si-units-length\" target=\"_blank\" rel=\"noopener\">NIST explains<\/a>, the meter is defined by fixing the speed of light in vacuum at 299,792,458 meters per second. A centimeter is one hundredth of a meter and a millimeter one thousandth: 1 cm = 10 mm and 1 m = 100 cm = 1,000 mm.<\/p><p>That's why a metric ruler reads in base 10, with no fractions: 37 mm is 3.7 cm and 125 mm is 12.5 cm.<\/p><h3>Centimeters and inches on the same ruler<\/h3><p>The bottom scale shows inches in 1\/16 steps. An inch is exactly 25.4 mm, so 10 cm is about 3.94 inches. With the <strong>Inches<\/strong> button, that scale moves to the top and the reading is given in fractions of an inch. If you mostly work in that unit, use our <a href=\"https:\/\/www.digiaccion.com\/en\/online-ruler-inches\/\">online ruler in inches<\/a>, built for it.<\/p><h2>How to measure without a ruler<\/h2><p>If you have neither a ruler nor a screen at hand, find an object of known size and compare. A credit card is the handiest reference: 85.60 mm long and 53.98 mm high. A sheet of US Letter paper is 8.5 x 11 inches (21.59 x 27.94 cm), and an A4 sheet is 21 x 29.7 cm.<\/p><p>Coins work too: a US penny is 19.05 mm across, so five in a row come to 9.5 cm. Body measures such as a finger width or a hand span vary a lot from person to person: measure yours once with this ruler and you will have your own reference.<\/p><h2>Online ruler or printable ruler<\/h2><p>A printed ruler has its advantages: you can carry it and wrap it around curved surfaces. But it has its own trap: many printers and PDF viewers fit the document to the page and shrink it by a few millimeters. If you print a ruler, choose 100% scale or actual size, turn off fit to page, and check it with a card afterward.<\/p><p>The on-screen ruler doesn't depend on a printer or paper, takes a minute to calibrate and gives an exact reading with the marker. For long measurements, curved surfaces or precision work, a tape measure or calipers are still the best choice.<\/p><h2>A free online ruler by DigiAcci\u00f3n, a digital marketing agency in Andorra<\/h2><p>This ruler is a free tool by DigiAcci\u00f3n, a <a href=\"https:\/\/www.digiaccion.com\/en\/\">digital marketing agency in Andorra<\/a> based in La Massana. It is built so anyone can measure from the browser: no sign-up, nothing to install, and it works on computers, tablets and phones.<\/p><p>At DigiAcci\u00f3n we do <a href=\"https:\/\/www.digiaccion.com\/en\/web-design-agency-in-andorra\/\">web design<\/a>, SEO, GEO or AI search optimization, Google Ads and Meta Ads campaigns, video production, <a href=\"https:\/\/www.digiaccion.com\/en\/graphic-design-agency-andorra\/\">graphic design<\/a> and online stores for businesses in Andorra, Spain and other countries. If you want your business to show up on Google and in AI answers, tell us about your project.<\/p><\/div><\/div>\n<button class=\"dgv-more-btn\" type=\"button\" aria-expanded=\"false\" aria-controls=\"dgv-more-body\" data-more=\"Read the full guide\" data-less=\"Close the guide\"><span class=\"dgv-more-lab\">Read the full guide<\/span><svg class=\"dgv-i\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-chev\"><\/use><\/svg><\/button>\n<\/div>\n<aside class=\"dgv-more-aside\" aria-label=\"Who made this tool\"><div class=\"dgv-card dgv-glow dgv-more-cta dgt-author\" data-dgv-r style=\"--dgv-d:.1s\"><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><span class=\"dgt-author-logo\" aria-hidden=\"true\"><svg viewBox=\"0 0 164 35\" role=\"img\" aria-label=\"DigiAcci\u00f3n\"><path class=\"g\" d=\"M133.8 8.8L133.8 8.8C133.8 8.7 133.8 8.7 133.9 8.7C136.4 8.4 138.9 8 141.5 7.6C141.9 7.5 142.2 7.5 142.5 7.5C142.9 7.5 143.2 7.5 143.6 7.5L143.6 7.5L143.6 8.8L143.6 8.8L133.8 8.8C133.7 8.8 133.7 8.8 133.8 8.8L133.8 8.8Z\"\/><path class=\"g\" d=\"M149.4 18.9C148.8 21.8 146.8 24 143.8 24.4C143.6 24.4 143.2 24.4 142.6 24.4C138.9 24.4 135.3 24.4 131.6 24.4C131 24.4 130.6 24.4 130.4 24.4C122.5 23.6 122.5 10.6 130.4 9.9C130.6 9.8 131 9.8 131.6 9.8C135.5 9.8 139.4 9.8 143.3 9.8C143.8 9.8 144.4 9.9 145 10.1C148.7 11.3 150.1 15.3 149.4 18.9ZM128.8 11.4C125.9 12.6 125.4 16.1 125.9 18.8C126.2 20.8 127.3 22.4 129.3 23C129.8 23.1 130.4 23.2 130.9 23.2C132.7 23.2 136.7 23.2 142.9 23.2C143.5 23.2 144 23.2 144.6 23.1C148.1 22.2 148.7 18.2 148.2 15.2C147.8 13.3 146.8 11.8 144.9 11.3C144.3 11.1 143.7 11 143.2 11C139.3 11 135.4 11 131.4 11C130.5 11 129.6 11 128.8 11.4Z\"\/><path class=\"g\" d=\"M152.6 13.3L152.6 13.3C153.3 11.4 154.8 10.2 156.7 9.9C158.8 9.6 160.9 10.1 162.1 12C162.8 13.2 163 14.6 163 15.9C163 18.6 163 21.4 163 24.1L163 24.1C163 24.1 163 24.1 162.9 24.1L161.7 24.1L161.7 24.1L161.7 24.1C161.7 21.4 161.7 18.6 161.7 15.9C161.7 13.8 161.2 11.5 158.7 11.1C157.8 10.9 157 10.9 156.1 11.1C153.7 11.7 152.7 13.7 152.7 16C152.7 18.7 152.7 21.4 152.7 24.1L152.7 24.1L151.5 24.1C151.5 24.1 151.4 24.1 151.4 24.1L151.4 24.1L151.4 10.1L151.4 10.1C151.4 10.1 151.4 10.1 151.5 10.1L152.5 10.1L152.5 10.1L152.5 10.1L152.5 13.3L152.5 13.3L152.5 13.3L152.5 13.3L152.6 13.3Z\"\/><path class=\"b\" d=\"M37 5L37 5C39.2 5 41.4 5 43.5 5C44.8 5 46 5.2 47.1 5.7C49.9 6.8 51.6 9.2 52.2 12.1C52.6 14.6 52.5 17.3 51.4 19.5C50 22.3 47.3 23.8 44.2 24.1C44 24.1 43.5 24.1 43 24.1C41 24.1 39 24.1 37 24.1L37 24.1L37 24.1V5ZM46.9 6.8C45.7 6.3 44.4 6.2 43.1 6.2C41.5 6.2 39.9 6.2 38.3 6.2L38.3 6.2L38.3 6.2V22.9L38.3 22.9L38.3 22.9C40 22.9 41.7 23 43.4 23C44.6 23 45.7 22.8 46.8 22.4C50.7 20.9 51.4 16.5 51 12.8C50.7 10.2 49.5 7.9 46.9 6.8Z\"\/><path class=\"b\" d=\"M76.8 24.1L75.6 24.1L75.5 24.1L75.5 24.1L75.5 24.1L75.5 24.1L83.5 5L83.5 5L83.5 5H85.2L85.2 5L85.2 5L93.2 24.1L93.2 24.1L93.2 24.1L93.2 24.1C93.2 24.1 93.2 24.1 93.1 24.1L91.8 24.1L91.8 24.1L91.8 24.1L89.2 18.1L89.2 18.1L89.2 18.1H79.4L79.4 18.1L79.4 18.1L76.9 24.1L76.9 24.1C76.9 24.1 76.9 24.1 76.8 24.1ZM84.2 6.4C82.9 9.9 81.4 13.4 79.9 16.8L79.9 16.8L79.9 16.9L79.9 16.9L79.9 16.9L88.7 16.9C88.7 16.9 88.7 16.9 88.7 16.8C87.6 14.2 86.6 11.7 85.5 9.1C85.1 8.2 84.7 7.3 84.4 6.4C84.4 6.3 84.3 6.3 84.3 6.3C84.2 6.3 84.2 6.4 84.2 6.4Z\"\/><path class=\"b\" d=\"M55.8 6.5L54.6 6.5L54.6 6.5L54.6 8.1L54.6 8.1L55.8 8.1C55.8 8.1 55.9 8.1 55.9 8.1L55.9 6.5C55.9 6.5 55.8 6.5 55.8 6.5Z\"\/><path class=\"b\" d=\"M74.1 6.5L72.8 6.5L72.8 6.5L72.8 8.1L72.8 8.1L74.1 8.1L74.1 8.1L74.1 6.5L74.1 6.5Z\"\/><path class=\"b\" d=\"M122.5 6.5H121.3L121.3 6.5V8.1L121.3 8.1H122.5L122.6 8.1V6.5C122.6 6.5 122.6 6.5 122.5 6.5Z\"\/><path class=\"b\" d=\"M69 19.7C69 19.6 68.9 19.6 68.9 19.7C68.2 21.6 66.3 22.9 64.2 22.9C60.5 23.1 58.1 20.9 57.8 17.3C57.5 13.8 58.9 10.4 62.8 9.9C65.4 9.5 68.1 10.6 69 13.3L69 13.3L69 13.3C69.1 13.3 69.1 13.3 69.1 13.2C69.1 12.2 69.1 11.2 69.1 10.1L69.1 10.1L70.2 10.1L70.2 10.1C70.2 10.1 70.2 10.1 70.2 10.2C70.2 14.9 70.2 19.6 70.2 24.3C70.2 24.5 70.2 24.9 70 25.4C69.2 28.8 65.5 29.8 62.5 29C60.2 28.5 58.5 26.7 58.5 24.2L58.5 24.2L58.5 24.2L59.8 24.2C59.8 24.2 59.8 24.2 59.8 24.3C59.8 27.7 62.9 28.4 65.7 28C68 27.6 69 26.1 69 23.8C69 22.4 69 21 69 19.7ZM62.4 11.1C60.3 11.5 59.3 13.1 59.1 15.1C58.8 17.7 59.3 20.8 62.2 21.6C64.7 22.2 67.6 21.6 68.6 18.9C69 17.8 69 16.6 68.9 15.5C68.7 11.9 65.5 10.5 62.4 11.1Z\"\/><path class=\"b\" d=\"M101.5 10C104.1 10.7 105.7 12.8 105.7 15.5L105.7 15.5L105.7 15.5L104.5 15.5C104.5 15.5 104.4 15.5 104.4 15.5C104.5 12.2 102.1 10.7 99.1 11C95.2 11.5 94.4 15.5 94.9 18.7C95.3 21.5 97 23.3 99.9 23.2C101.8 23.2 103.5 22.5 104.2 20.6C104.4 20 104.4 19.4 104.5 18.7L104.5 18.7L105.7 18.7L105.7 18.7L105.7 18.7C105.7 19.1 105.7 19.5 105.6 19.8C105.2 22.4 103.3 24 100.7 24.4C98.6 24.6 96.5 23.9 95.2 22.3C93.8 20.6 93.4 18.4 93.5 16.3C93.7 13.5 95.3 10.8 98.1 10.1C99.2 9.7 100.3 9.7 101.5 10Z\"\/><path class=\"b\" d=\"M119.4 18.7C119.5 21.7 117.4 24 114.6 24.3C110.9 24.8 108.1 22.6 107.4 19.1C106.5 14.8 108.5 9.9 113.4 9.8C116.8 9.8 119.5 12.1 119.4 15.5L119.4 15.5L118.2 15.5C118.2 15.5 118.1 15.5 118.1 15.5C118.1 14.5 117.9 13.5 117.3 12.6C116.2 11.1 114.1 10.8 112.4 11.1C110.6 11.5 109.3 12.7 108.8 14.4C108.4 15.9 108.3 17.6 108.6 19C109.1 21.5 110.7 23.1 113.2 23.2C115.1 23.3 116.9 22.7 117.7 20.9C118 20.2 118.2 19.5 118.1 18.7L118.1 18.7L118.1 18.7C118.1 18.7 118.2 18.7 118.2 18.7L118.2 18.7L119.4 18.7L119.4 18.7Z\"\/><path class=\"b\" d=\"M55.8 9.8H54.6C54.6 9.8 54.6 9.9 54.6 9.9V24.1L54.6 24.1H55.8C55.8 24.1 55.9 24.1 55.9 24.1V9.9C55.9 9.9 55.8 9.8 55.8 9.8Z\"\/><path class=\"b\" d=\"M74.1 9.8H72.8C72.8 9.8 72.8 9.9 72.8 9.9V24.1L72.8 24.1H74.1L74.1 24.1V9.9C74.1 9.9 74.1 9.8 74.1 9.8Z\"\/><path class=\"b\" d=\"M122.6 9.9V24.1L122.6 24.1C122.6 24.1 122.5 24.1 122.5 24.1L121.3 24.1L121.3 24.1L121.3 24.1V9.9L121.3 9.9L121.3 9.8L122.5 9.8C122.5 9.8 122.6 9.8 122.6 9.9L122.6 9.9Z\"\/><path class=\"b\" d=\"M0.4 6.8C1.1 5 2.9 4.7 4.6 4.7C8.5 4.7 12.2 4.7 15.8 4.7L15.8 4.7L15.9 4.6L18.6 0.1C18.6 0.1 18.6 0 18.6 0C18.7 0 18.7 0 18.8 5.9e-06L21.8 0L21.8 0L21.8 0C21.8 0 21.9 0 21.9 0.1C21.9 0.1 21.8 0.1 21.8 0.1C17.9 6.6 14 13.1 10.1 19.6C9.6 20.4 9.3 20.9 9.2 21C7.1 24.2 3.8 26.6 0 27.2L0 27.2L0 27.2L0 27.1C0 27.1 6.5e-05 27.1 0 27.1C0 21.3 0 15.4 0 9.7C0 8.7 0.1 7.7 0.4 6.8ZM3.2 23C4.8 22.1 6 20.8 7 19.2C9.2 15.6 11.4 11.9 13.7 8.2C13.7 8 13.9 7.9 13.9 7.8C14 7.7 13.9 7.7 13.9 7.7C10.3 7.7 6.9 7.7 3.8 7.7C3.4 7.7 3 7.7 2.9 8.2C2.9 8.2 2.9 8.3 2.9 8.4C2.9 12.9 2.9 17.7 2.9 23.1L2.9 23.1L2.9 23.1L2.9 23.1C2.9 23.1 3 23.1 3 23.1C3 23.1 3.1 23 3.2 23Z\"\/><path class=\"g\" d=\"M11.7 29.8L9.1 34.3L9.1 34.3C9.1 34.3 9.1 34.3 9 34.3L5.8 34.4C5.8 34.4 5.8 34.3 5.8 34.3C8.4 30 11 25.6 13.6 21.3C13.9 20.8 14.2 20.4 14.5 19.9C15.6 18 16.8 16.1 17.9 14.1C20 10.7 23.5 8.1 27.5 7.4L27.5 7.4L27.5 7.4L27.5 7.4L27.5 7.4C27.5 12.8 27.5 18.2 27.5 23.7C27.5 24.9 27.5 26.1 27.3 27.3C27 28.4 26.4 29.2 25.3 29.5C24.4 29.8 23.5 29.8 22.6 29.8C18.7 29.8 15.1 29.8 11.8 29.8L11.8 29.8L11.7 29.8ZM13.9 26.3C13.7 26.6 13.6 26.8 13.6 26.9L13.6 26.9L13.6 26.9L13.6 26.9L13.6 26.9C13.6 26.9 17 26.9 23.8 26.9C24.3 26.9 24.6 26.8 24.6 26.3C24.6 21.2 24.6 16.3 24.6 11.6C24.6 11.6 24.6 11.6 24.6 11.5L24.6 11.5L24.6 11.5L24.6 11.5C22.9 12.4 21.5 13.8 20.5 15.4C19.6 16.8 18.4 18.9 16.9 21.5C15.9 23.1 14.9 24.6 13.9 26.3Z\"\/><\/svg><\/span><p class=\"dgv-more-cta-t dgv-grad\">Tool created by DigiAcci\u00f3n<\/p><p class=\"dgv-txt\">DigiAcci\u00f3n is a digital marketing agency based in La Massana, Andorra. We do web design, SEO, GEO, Google Ads, Meta Ads, video, graphic design and online stores for businesses in Andorra, Spain and other countries.<\/p><a class=\"dgv-btn dgv-btn--pri\" href=\"https:\/\/www.digiaccion.com\/en\/#contacto\">Talk to DigiAcci\u00f3n<svg class=\"dgv-i dgv-arr\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><\/a><\/div><\/aside>\n<\/div>\n<\/section>\n<section class=\"dgv-sec dgv-rel dgt-more-tools\" aria-labelledby=\"dgt-tools-t\">\n<div class=\"dgv-wrap\">\n<div class=\"dgv-head dgv-head--c dgv-rel-head\" data-dgv-r><p class=\"dgv-h2 dgv-rel-h dgv-grad\" id=\"dgt-tools-t\">More free tools by DigiAcci\u00f3n<\/p><p class=\"dgv-intro\">Other tools we have built: free, no sign-up and ready to use in your browser.<\/p><\/div>\n<ul class=\"dgt-tools\" role=\"list\"><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d data-dgv-r style=\"--dgv-d:0.00s\"><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-i--f dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-quote\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/quotation-marks-symbols\/\">Quotation marks and writing symbols to copy<\/a><small class=\"dgt-tools-d\">Quotes, primes, apostrophes, dashes and typographic signs with their codes.<\/small><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d data-dgv-r style=\"--dgv-d:0.06s\"><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-kana\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/japanese-alphabet\/\">Japanese letters: hiragana, katakana and kanji<\/a><small class=\"dgt-tools-d\">The Japanese alphabet to copy and a romaji to Japanese converter.<\/small><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d data-dgv-r style=\"--dgv-d:0.12s\"><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-ruler\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/online-ruler-inches\/\">Online ruler in inches (actual size)<\/a><small class=\"dgt-tools-d\">Measure in inches and fractions of an inch at actual size.<\/small><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d data-dgv-r style=\"--dgv-d:0.00s\"><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-palette\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/html-color-codes\/\">HTML color codes chart: HEX and RGB<\/a><small class=\"dgt-tools-d\">Hundreds of organized colors, picker, converter and contrast checker.<\/small><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d data-dgv-r style=\"--dgv-d:0.06s\"><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-i--f dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-star\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/star-symbols\/\">Star emojis and star symbols<\/a><small class=\"dgt-tools-d\">Stars to copy and a star rating generator.<\/small><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d data-dgv-r style=\"--dgv-d:0.12s\"><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-smile\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/emojis-copy-paste\/\">Emojis to copy and paste<\/a><small class=\"dgt-tools-d\">Nearly 1,900 emojis with search, skin tones and symbols for titles.<\/small><\/li><\/ul>\n<\/div>\n<\/section>\n<section class=\"dgv-sec dgv-final dgt-final\">\n<div class=\"dgv-fx\" aria-hidden=\"true\"><div class=\"dgv-beams dgv-beams--up\"><\/div><\/div>\n<div class=\"dgv-wrap\"><div class=\"dgv-final-card\" data-dgv-r><p class=\"dgv-final-t dgv-grad\">Looking for an agency that specializes in web design, SEO, GEO and AI?<\/p><p class=\"dgv-intro\">DigiAcci\u00f3n, a digital marketing agency in Andorra, works with businesses in Andorra, Spain and other countries.<\/p><div class=\"dgv-ctas dgv-ctas--c\"><a class=\"dgv-btn dgv-btn--pri\" href=\"https:\/\/www.digiaccion.com\/en\/#contacto\">Contact DigiAcci\u00f3n<svg class=\"dgv-i dgv-arr\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><\/a><a class=\"dgv-btn dgv-btn--demo\" href=\"https:\/\/wa.me\/376372337\" target=\"_blank\" rel=\"noopener\"><svg class=\"dgv-i dgt-wa\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-whatsapp\"><\/use><\/svg>Message us on WhatsApp<span class=\"dgv-sr\"> (opens in a new tab)<\/span><\/a><\/div><p class=\"dgv-final-n\">Tool created by <a href=\"https:\/\/www.digiaccion.com\/en\/\">DigiAcci\u00f3n, a digital marketing agency in Andorra<\/a>.<\/p><\/div><\/div>\n<\/section>\n<section class=\"dgv-sec dgv-rel dgv-svc\" aria-labelledby=\"dgv-svc-t\">\n<div class=\"dgv-wrap\">\n<div class=\"dgv-head dgv-head--c dgv-rel-head\" data-dgv-r><p class=\"dgv-h2 dgv-rel-h dgv-grad\" id=\"dgv-svc-t\">Digital marketing services<\/p><p class=\"dgv-intro\">Web design, SEO, GEO, advertising, video and graphic design for businesses that want to grow on Google and in AI chats.<\/p><\/div>\n<div class=\"dgv-rel-car dgv-svc-car\" data-dgv-r data-dgv-car>\n<ul class=\"dgv-rel-track dgv-svc-track\" id=\"dgv-svc-track\" role=\"list\"><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-bolt\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/\">Digital marketing agency in Andorra<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-layout\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/web-design-agency-in-andorra\/\">Web design agency in Andorra<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-chart\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/seo-organic-positioning-agency-andorra\/\">SEO agency in Andorra<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-megaphone\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/google-ads-sem-agency-in-andorra\/\">Google Ads agency in Andorra<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-target\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/meta-ads-agency-facebook-ads-in-andorra\/\">Social Ads agency in Andorra<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-video\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/video-production-editing-agency-andorra\/\">Video production and editing agency in Andorra<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-sparkles\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/geo-agency-ai-chat-positioning-andorra\/\">GEO agency in Andorra<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-pen\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/graphic-design-agency-andorra\/\">Graphic design agency in Andorra<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-shop\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a dgv-rel-a--guion\" href=\"https:\/\/www.digiaccion.com\/en\/e-commerce-design-agency-andorra\/\">E-commerce agency in Andorra<\/a><\/li><\/ul>\n<div class=\"dgv-rel-nav\"><span class=\"dgv-rel-bar\" aria-hidden=\"true\"><i><\/i><\/span><span class=\"dgv-rel-btns\"><button class=\"dgv-rel-btn\" type=\"button\" data-dir=\"-1\" aria-controls=\"dgv-svc-track\" aria-label=\"Previous services\"><svg class=\"dgv-i dgv-rel-prev\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><\/button><button class=\"dgv-rel-btn\" type=\"button\" data-dir=\"1\" aria-controls=\"dgv-svc-track\" aria-label=\"Next services\"><svg class=\"dgv-i\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><\/button><\/span><\/div>\n<\/div>\n<\/div>\n<\/section>\n<section class=\"dgv-sec dgv-rel\" aria-labelledby=\"dgv-rel-t\">\n<div class=\"dgv-fx\" aria-hidden=\"true\"><div class=\"dgv-rel-glow\"><\/div><\/div>\n<div class=\"dgv-wrap\">\n<div class=\"dgv-head dgv-head--c dgv-rel-head\" data-dgv-r><p class=\"dgv-h2 dgv-rel-h dgv-grad\" id=\"dgv-rel-t\">Web design by industry and marketing for lawyers<\/p><p class=\"dgv-intro\">Websites built around the needs of each industry, plus digital marketing for law firms.<\/p><\/div>\n<div class=\"dgv-rel-car\" data-dgv-r data-dgv-car>\n<ul class=\"dgv-rel-track\" id=\"dgv-rel-track\" role=\"list\"><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-briefcase\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/web-design-agency-consulting-management-firms\/\">Web design for consulting and management firms<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-scale\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/web-design-agency-lawyers-law-firms\/\">Web design for lawyers and law firms<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-megaphone\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/legal-marketing-agency-lawyers\/\">Digital marketing agency for lawyers<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-compass\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/web-design-agency-architects-interior-designers\/\">Web design for architects and interior designers<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-food\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/web-design-agency-restaurants-hospitality\/\">Web design for restaurants and hospitality<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-health\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/web-design-agency-clinics-healthcare\/\">Web design for clinics and healthcare<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-home\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/web-design-agency-real-estate\/\">Real estate website design<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-crane\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/web-design-agency-construction-contractors\/\">Contractor website design<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-bed\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/web-design-agency-hotels\/\">Hotel website design<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-mountain\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/web-design-agency-vacation-rentals\/\">Vacation rental website design<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-wrench\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/web-design-agency-auto-repair-shops\/\">Auto repair website design<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-paw\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/web-design-agency-veterinary-clinics\/\">Veterinary website design<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-dumbbell\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/web-design-agency-gyms-fitness\/\">Gym and fitness website design<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-cpu\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/web-design-agency-it-companies\/\">Website design for IT companies<\/a><\/li><li class=\"dgv-rel-card dgv-glow\" data-dgv-3d><span class=\"dgv-edge\" aria-hidden=\"true\"><\/span><svg class=\"dgv-i dgv-rel-ic\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-hanger\"><\/use><\/svg><svg class=\"dgv-i dgv-rel-go\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><a class=\"dgv-rel-a\" href=\"https:\/\/www.digiaccion.com\/en\/web-design-agency-fashion-brands\/\">Fashion website design<\/a><\/li><\/ul>\n<div class=\"dgv-rel-nav\"><span class=\"dgv-rel-bar\" aria-hidden=\"true\"><i><\/i><\/span><span class=\"dgv-rel-btns\"><button class=\"dgv-rel-btn\" type=\"button\" data-dir=\"-1\" aria-controls=\"dgv-rel-track\" aria-label=\"Previous\"><svg class=\"dgv-i dgv-rel-prev\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><\/button><button class=\"dgv-rel-btn\" type=\"button\" data-dir=\"1\" aria-controls=\"dgv-rel-track\" aria-label=\"Next\"><svg class=\"dgv-i\" aria-hidden=\"true\" focusable=\"false\"><use href=\"#dgv-i-arrow\"><\/use><\/svg><\/button><\/span><\/div>\n<\/div>\n<\/div>\n<\/section>\n<div class=\"dgt-toast\" data-dgt-toast role=\"status\" aria-live=\"polite\"><\/div>\n<\/div>\n<script type=\"application\/ld+json\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebApplication\",\"@id\":\"https:\/\/www.digiaccion.com\/en\/online-ruler-cm-mm\/#herramienta\",\"name\":\"Online ruler in cm and mm at actual size\",\"description\":\"Free on-screen ruler to measure in cm and mm at actual size, with a marker, a go-to-length field, fixed 5 to 25 cm rulers and calibration by credit card or screen diagonal. By DigiAcci\u00f3n.\",\"url\":\"https:\/\/www.digiaccion.com\/en\/online-ruler-cm-mm\/\",\"applicationCategory\":\"UtilitiesApplication\",\"operatingSystem\":\"Any\",\"browserRequirements\":\"Requires JavaScript\",\"inLanguage\":\"en-US\",\"isAccessibleForFree\":true,\"offers\":{\"@type\":\"Offer\",\"price\":\"0\",\"priceCurrency\":\"EUR\"},\"creator\":{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.digiaccion.com\/#organization\",\"name\":\"DigiAcci\u00f3n\",\"url\":\"https:\/\/www.digiaccion.com\/\"},\"publisher\":{\"@id\":\"https:\/\/www.digiaccion.com\/#organization\"},\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.digiaccion.com\/en\/online-ruler-cm-mm\/#webpage\"}},{\"@type\":\"FAQPage\",\"@id\":\"https:\/\/www.digiaccion.com\/en\/online-ruler-cm-mm\/#faq\",\"url\":\"https:\/\/www.digiaccion.com\/en\/online-ruler-cm-mm\/\",\"isPartOf\":{\"@id\":\"https:\/\/www.digiaccion.com\/en\/online-ruler-cm-mm\/#webpage\"},\"inLanguage\":\"en-US\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"Is there an accurate online ruler?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes, as long as you calibrate it. Without calibration the browser doesn't know your screen's physical size, so on some phones a centimeter comes out 3 to 4 mm short. Calibrated with a credit card, the error on small objects stays within a few tenths of a millimeter.\"}},{\"@type\":\"Question\",\"name\":\"Can you use a phone as a ruler?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. Open this page on your phone, tap Calibrate and match the drawing to a credit card held on the screen. Save the calibration, line the object up with zero and drag the marker to its end. Turn the phone sideways if you need more than 6 or 7 cm.\"}},{\"@type\":\"Question\",\"name\":\"How can I get a ruler on my screen?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"There is nothing to install: this page draws a centimeter and millimeter ruler in your browser, with inches along the bottom, plus fixed 5 to 25 cm rulers underneath. Calibrate it once with a credit card or your screen diagonal and it is ready to measure in that browser.\"}},{\"@type\":\"Question\",\"name\":\"How can I show 1 centimeter on my screen?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Calibrate the ruler, then type 1 in Go to a length: the marker moves to 1 cm (10 mm). You can also select the marker and press the right arrow key ten times, since each press moves it 1 mm. The distance from zero to the marker is one real centimeter.\"}},{\"@type\":\"Question\",\"name\":\"How big is 1 mm visually?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"One millimeter is the gap between two small lines on the ruler, a tenth of a centimeter. A credit card is 0.76 mm thick, so a millimeter is a little more than the thickness of a credit card.\"}},{\"@type\":\"Question\",\"name\":\"How long is 20 cm on a ruler?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"20 cm is 200 millimeters, about 7.87 inches: on a ruler, the distance from 0 to the long line marked 20. This page has a fixed 20 cm ruler at actual size below the main one, or you can type 20 in Go to a length to move the marker there. On a phone it won't fit on one screen, so swipe along the fixed ruler.\"}},{\"@type\":\"Question\",\"name\":\"How big is 30 cm visually?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"30 cm is 300 mm, about 11.81 inches, just under a foot (12 inches is 30.48 cm). It is 3 mm longer than an A4 sheet (29.7 cm) and about 2 cm longer than a sheet of US Letter paper (27.94 cm). On a laptop, type 30 in Go to a length to see it on screen; if it doesn't fit, the ruler tells you how much does.\"}},{\"@type\":\"Question\",\"name\":\"How many mm in a cm?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"There are 10 millimeters in a centimeter and 1,000 in a meter. To convert centimeters to millimeters, multiply by 10: 4.5 cm is 45 mm. One inch is exactly 25.4 mm, or 2.54 cm.\"}},{\"@type\":\"Question\",\"name\":\"What is the size of a credit card in mm?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Credit and debit cards follow the ISO\/IEC 7810 ID-1 format: 85.60 mm long, 53.98 mm high and 0.76 mm thick, about 3.370 x 2.125 inches. Because the size is the same everywhere, a card works for calibrating on-screen rulers in any country.\"}},{\"@type\":\"Question\",\"name\":\"Does the iPhone have a digital ruler?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"The iPhone includes Apple's Measure app, which uses the camera to measure objects around you. For small items you hold against the screen, this on-screen ruler works in Safari with no app; calibrate it first so the millimeters match your screen.\"}},{\"@type\":\"Question\",\"name\":\"How to measure without a ruler?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Use an object of known size: a credit card is 85.60 x 53.98 mm, a US quarter is 24.26 mm across and a sheet of US Letter paper is 8.5 x 11 inches. Body measures such as a finger width vary from person to person, so measure yours once with a calibrated ruler.\"}},{\"@type\":\"Question\",\"name\":\"When do I need to recalibrate the online ruler?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"When you switch browser, device or monitor, and whenever browser zoom isn't at 100%, because zoom stretches or shrinks the ruler. Calibration is saved per browser, so another computer needs its own. Clearing your browsing data removes it too.\"}}]}]}<\/script>\n<script id=\"dgv-js\">\n\/* DigiAcci\u00f3n | P\u00e1ginas verticales | JS del bloque (nativo, sin librer\u00edas).\n   No se ejecuta en el constructor visual de Divi (body.et-fb o ?et_fb=1): all\u00ed todo queda desplegado y editable. *\/\n(function () {\n  var d = document, b = d.body;\n  if (!b || b.classList.contains('et-fb') || \/[?&](et_fb|et_pb_preview)=\/.test(location.search)) return;\n  var roots = d.querySelectorAll('.dgv[data-dgv]');\n  var RM = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n  var FINE = window.matchMedia && window.matchMedia('(hover: hover) and (pointer: fine)').matches;\n  function each(list, fn) { Array.prototype.forEach.call(list, fn); }\n  each(roots, function (root) {\n    if (root.getAttribute('data-dgv-on')) return;\n    root.setAttribute('data-dgv-on', '1');\n    root.classList.add('dgv-js');\n    \/* 10. Nota y n\u00famero de rese\u00f1as de Google desde verticales.css (v11): :root{--dgv-google-nota;--dgv-google-resenas}.\n       Si cambian all\u00ed, se actualizan todas las menciones del bloque ([data-dgv-g]) sin volver a pegar el c\u00f3digo.\n       El HTML lleva el valor del d\u00eda en que se construy\u00f3 (es lo que se ve sin JS y lo que leen los buscadores). *\/\n    (function () {\n      var cs = getComputedStyle(d.documentElement);\n      function val(n) { return (cs.getPropertyValue(n) || '').trim().replace(\/^[\"']|[\"']$\/g, ''); }\n      var nota = val('--dgv-google-nota'), res = val('--dgv-google-resenas');\n      if (!\/^\\d([.,]\\d)?$\/.test(nota)) nota = '';\n      if (!\/^\\d{1,5}$\/.test(res)) res = '';\n      if (nota && \/^en\/i.test(root.getAttribute('lang') || '')) nota = nota.replace(',', '.');\n      if (nota) each(root.querySelectorAll('[data-dgv-g=\"nota\"]'), function (el) { if (el.textContent !== nota) el.textContent = nota; });\n      if (res) each(root.querySelectorAll('[data-dgv-g=\"resenas\"]'), function (el) { if (el.textContent !== res) el.textContent = res; });\n    })();\n    \/* 1. Aparici\u00f3n suave al entrar en pantalla *\/\n    var rv = root.querySelectorAll('[data-dgv-r]');\n    var late = window.performance && performance.now() > 4000; \/* script retrasado por un optimizador: sin animaci\u00f3n de entrada *\/\n    if (!RM && !late && 'IntersectionObserver' in window) {\n      var io = new IntersectionObserver(function (es) {\n        es.forEach(function (e) { if (e.isIntersecting) { e.target.classList.add('is-in'); io.unobserve(e.target); } });\n      }, { rootMargin: '0px 0px -6% 0px', threshold: 0.06 });\n      each(rv, function (el) { io.observe(el); });\n    } else { each(rv, function (el) { el.classList.add('is-in'); }); }\n    \/* 2. Preguntas frecuentes: botones con aria-expanded (rat\u00f3n y teclado) *\/\n    each(root.querySelectorAll('.dgv-faq-btn'), function (btn) {\n      btn.addEventListener('click', function () {\n        var item = btn.closest('.dgv-faq-item'), open = btn.getAttribute('aria-expanded') !== 'true';\n        btn.setAttribute('aria-expanded', open ? 'true' : 'false');\n        item.classList.toggle('is-open', open);\n      });\n    });\n    \/* 3. \"Leer m\u00e1s\": texto completo en el HTML, plegado con degradado *\/\n    var more = root.querySelector('[data-dgv-more]'), mb = root.querySelector('.dgv-more-btn');\n    if (more && mb) {\n      var lab = mb.querySelector('.dgv-more-lab');\n      var setMore = function (open, fromFocus) {\n        if (open === more.classList.contains('is-open')) return;\n        mb.setAttribute('aria-expanded', open ? 'true' : 'false');\n        if (lab) lab.textContent = mb.getAttribute(open ? 'data-less' : 'data-more');\n        if (open) {\n          more.style.maxHeight = more.scrollHeight + 'px';\n          more.classList.add('is-open');\n          var done = function () { more.style.maxHeight = 'none'; more.removeEventListener('transitionend', done); };\n          if (RM || fromFocus) done(); else more.addEventListener('transitionend', done);\n        } else {\n          more.style.maxHeight = more.scrollHeight + 'px';\n          void more.offsetHeight;\n          more.classList.remove('is-open');\n          more.style.maxHeight = '';\n          var card = more.closest('.dgv-more-card') || more;\n          var top = card.getBoundingClientRect().top;\n          if (top < 0) window.scrollTo({ top: window.pageYOffset + top - 110, behavior: RM ? 'auto' : 'smooth' });\n        }\n      };\n      mb.addEventListener('click', function () { setMore(mb.getAttribute('aria-expanded') !== 'true'); });\n      more.addEventListener('focusin', function () { setMore(true, true); });\n    }\n    \/* 4. Luz que sigue al cursor en las tarjetas con borde luminoso *\/\n    if (FINE && !RM) {\n      root.addEventListener('pointermove', function (e) {\n        var c = e.target.closest ? e.target.closest('.dgv-glow') : null;\n        if (!c) return;\n        var r = c.getBoundingClientRect();\n        c.style.setProperty('--dgv-mx', (e.clientX - r.left) + 'px');\n        c.style.setProperty('--dgv-my', (e.clientY - r.top) + 'px');\n      }, { passive: true });\n      \/* Inclinaci\u00f3n ligera de la ventana de la demo *\/\n      each(root.querySelectorAll('[data-dgv-tilt]'), function (w) {\n        w.addEventListener('pointermove', function (e) {\n          var r = w.getBoundingClientRect(), x = (e.clientX - r.left) \/ r.width - 0.5, y = (e.clientY - r.top) \/ r.height - 0.5;\n          w.style.setProperty('--dgv-ry', (x * 5).toFixed(2) + 'deg');\n          w.style.setProperty('--dgv-rx', (-y * 4).toFixed(2) + 'deg');\n        }, { passive: true });\n        w.addEventListener('pointerleave', function () { w.style.setProperty('--dgv-ry', '0deg'); w.style.setProperty('--dgv-rx', '0deg'); });\n      });\n    }\n    \/* 5. Frases de impacto: una diapositiva por frase a pantalla completa. La secci\u00f3n queda fijada (sticky en la CSS)\n       y la pista se desplaza en horizontal seg\u00fan el scroll vertical dentro de ella. Sin JS o con movimiento reducido,\n       la CSS deja las frases una debajo de otra. Cada diapositiva se queda quieta un tramo (HOLD) para que en reposo\n       no se vean dos a medias, y el paso de una a otra va suavizado. *\/\n    var hx = root.querySelector('[data-dgv-hx]');\n    var hxs = hx ? hx.querySelectorAll('.dgv-hx-slide') : [], hxn = hxs.length, hxp = hx && hx.querySelector('.dgv-hx-pin');\n    if (hx && hxp && hxn > 1 && !RM) {\n      hx.classList.add('is-hx');\n      var cnt = hx.querySelector('.dgv-hx-count'), HOLD = 0.22, hxTick = false, hxLive = false, hxCur = -1;\n      var clamp = function (v, a, z) { return v < a ? a : (v > z ? z : v); };\n      var ease = function (t) { return t * t * t * (t * (t * 6 - 15) + 10); };\n      var hxPaint = function () {\n        hxTick = false;\n        if (!hx.classList.contains('is-hx')) return;\n        var r = hx.getBoundingClientRect(), ph = hxp.offsetHeight, run = r.height - ph;\n        \/* Seguro: si algo de la p\u00e1gina rompe el sticky (overflow o transform en un ancestro), el pin no se queda\n           arriba dentro del recorrido; entonces se vuelve a las frases una debajo de otra. *\/\n        if (r.top < -40 && r.bottom > ph + 40 && Math.abs(hxp.getBoundingClientRect().top) > 4) {\n          hx.classList.remove('is-hx'); hxListen(false); return;\n        }\n        var p = run > 0 ? clamp(-r.top \/ run, 0, 1) : 0;\n        var s = p * (hxn - 1), k = Math.min(hxn - 2, Math.floor(s));\n        var x = k + ease(clamp((s - k - HOLD) \/ (1 - 2 * HOLD), 0, 1)), t = x \/ (hxn - 1) * 2;\n        hx.style.setProperty('--dgv-hx-x', x.toFixed(4));\n        hx.style.setProperty('--dgv-hx-p', p.toFixed(4));\n        hx.style.setProperty('--dgv-hx-bar', ((1 + x) \/ hxn).toFixed(4));\n        for (var j = 0; j < 3; j++) hx.style.setProperty('--dgv-hx-w' + j, Math.max(0, 1 - Math.abs(t - j)).toFixed(3));\n        each(hxs, function (sl, i) {\n          var o = clamp(i - x, -1, 1);\n          sl.style.setProperty('--dgv-hx-o', o.toFixed(4));\n          sl.style.setProperty('--dgv-hx-a', Math.abs(o).toFixed(4));\n        });\n        var cur = Math.round(x);\n        if (cur !== hxCur && cnt) { hxCur = cur; cnt.setAttribute('data-n', (cur < 9 ? '0' : '') + (cur + 1)); }\n      };\n      var hxOn = function () { if (!hxTick) { hxTick = true; window.requestAnimationFrame(hxPaint); } };\n      var hxListen = function (on) {\n        if (!hx.classList.contains('is-hx')) on = false;\n        if (on === hxLive) return;\n        hxLive = on;\n        window[on ? 'addEventListener' : 'removeEventListener']('scroll', hxOn, { passive: true });\n        window[on ? 'addEventListener' : 'removeEventListener']('resize', hxOn, { passive: true });\n        hxOn();\n      };\n      if ('IntersectionObserver' in window) {\n        new IntersectionObserver(function (es) { hxListen(es[es.length - 1].isIntersecting); }, { rootMargin: '25% 0px 25% 0px' }).observe(hx);\n      } else { hxListen(true); }\n      hxPaint();\n    }\n    \/* 6. Carruseles ([data-dgv-car]: servicios relacionados, servicios principales en m\u00f3vil y testimonios), cada uno por\n       separado. Scroll nativo (scroll-snap en la CSS: se desliza con el dedo, el trackpad o el teclado). Los botones pasan\n       una p\u00e1gina de tarjetas y quedan desactivados (aria-disabled, siguen enfocables) en cada extremo. Si todas las\n       tarjetas caben (o la CSS las pone en cuadr\u00edcula), .is-static y sin botones. Sin JS los botones no se ven y la pista\n       sigue siendo deslizable. *\/\n    each(root.querySelectorAll('[data-dgv-car]'), function (car) {\n      var tr = car.querySelector('.dgv-rel-track'), rb = car.querySelectorAll('.dgv-rel-btn');\n      if (!tr || rb.length < 2 || !tr.children.length) return;\n      var cards = tr.children, relTick = false;\n      var off = function (bt, v) { bt.setAttribute('aria-disabled', v ? 'true' : 'false'); };\n      var relPaint = function () {\n        relTick = false;\n        var max = tr.scrollWidth - tr.clientWidth, x = tr.scrollLeft;\n        car.classList.toggle('is-static', max <= 2);\n        off(rb[0], x <= 2); off(rb[1], x >= max - 2);\n        car.style.setProperty('--dgv-rel-w', (tr.clientWidth \/ tr.scrollWidth).toFixed(4));\n        car.style.setProperty('--dgv-rel-x', (tr.scrollWidth ? x \/ tr.scrollWidth : 0).toFixed(4));\n      };\n      var relOn = function () { if (!relTick) { relTick = true; window.requestAnimationFrame(relPaint); } };\n      each(rb, function (bt) {\n        bt.addEventListener('click', function () {\n          if (bt.getAttribute('aria-disabled') === 'true') return;\n          var cs = getComputedStyle(tr), pl = parseFloat(cs.paddingLeft) || 0, pr = parseFloat(cs.paddingRight) || 0;\n          var gap = parseFloat(cs.columnGap) || 0, tl = tr.getBoundingClientRect().left + pl;\n          var w = cards[0].getBoundingClientRect().width, n = cards.length, k = 0;\n          var per = Math.max(1, Math.floor((tr.clientWidth - pl - pr + gap + 2) \/ (w + gap)));\n          while (k < n - 1 && cards[k].getBoundingClientRect().left < tl - 2) k++;   \/* primera tarjeta visible entera *\/\n          var to = Math.max(0, Math.min(n - 1, k + (bt.getAttribute('data-dir') === '-1' ? -per : per)));\n          var max = tr.scrollWidth - tr.clientWidth;\n          var left = Math.max(0, Math.min(max, tr.scrollLeft + cards[to].getBoundingClientRect().left - tl));\n          tr.scrollTo({ left: left, behavior: RM ? 'auto' : 'smooth' });\n        });\n      });\n      tr.addEventListener('scroll', relOn, { passive: true });\n      window.addEventListener('resize', relOn, { passive: true });\n      if ('ResizeObserver' in window) new ResizeObserver(relOn).observe(tr);\n      relPaint();\n    });\n    \/* 8. Testimonios con el texto largo: las citas largas llevan en el HTML el texto completo y un bot\u00f3n oculto (hidden).\n       Si el texto pasa de 7 l\u00edneas (6 = --dgv-q-lines en la CSS, m\u00e1s una de margen) en el ancho actual, la tarjeta pasa a .is-clamp (texto\n       recortado con degradado) y se ense\u00f1a el bot\u00f3n \"+ Leer m\u00e1s\", que lo despliega en la propia tarjeta (aria-expanded y el\n       texto del bot\u00f3n cambian). Las tarjetas cerradas del carrusel tienen el mismo alto; al desplegar una, la pista pasa a\n       .has-open y fija el alto de las dem\u00e1s (--dgv-qh), as\u00ed solo crece la desplegada. Se recalcula al cambiar el ancho y al\n       cargar las fuentes. Sin JS: texto entero, sin bot\u00f3n. *\/\n    var qs = root.querySelectorAll('.dgv-quote'), qW = -1, qTick = false;\n    var qAfter = function (el, fn) {           \/* fin de la transici\u00f3n (o enseguida con movimiento reducido) *\/\n      var ok = false, go = function () { if (ok) return; ok = true; el.removeEventListener('transitionend', go); fn(); };\n      if (RM) { go(); return; }\n      el.addEventListener('transitionend', go); setTimeout(go, 800);\n    };\n    var qLock = function (tr) {                 \/* alto de las tarjetas cerradas, medido con las abiertas recortadas *\/\n      if (!tr || !tr.classList.contains('has-open')) return;\n      var open = tr.querySelectorAll('.dgv-quote.is-open');\n      each(open, function (f) { f.classList.add('is-measuring'); });\n      tr.classList.remove('has-open');\n      var h = tr.firstElementChild ? tr.firstElementChild.offsetHeight : 0;\n      tr.style.setProperty('--dgv-qh', h + 'px');\n      tr.classList.add('has-open');\n      each(open, function (f) { f.classList.remove('is-measuring'); });\n    };\n    var qFit = function () {\n      each(qs, function (fig) {\n        var bt = fig.querySelector('.dgv-q-more'), bq = fig.querySelector('.dgv-q-body');\n        if (!bt || !bq) return;\n        var cs = getComputedStyle(bq), lh = parseFloat(cs.lineHeight) || parseFloat(cs.fontSize) * 1.5;\n        var n = parseFloat(getComputedStyle(fig).getPropertyValue('--dgv-q-lines')) || 6;\n        var long = bq.scrollHeight > lh * (n + 1) + 4;   \/* con una sola l\u00ednea de m\u00e1s se lee entera: no se recorta *\/\n        if (long || fig.classList.contains('is-open')) { bt.hidden = false; fig.classList.add('is-clamp'); }\n        else { bt.hidden = true; fig.classList.remove('is-clamp'); }\n      });\n      each(root.querySelectorAll('.dgv-qcar-track.has-open'), qLock);\n    };\n    each(qs, function (fig) {\n      var bt = fig.querySelector('.dgv-q-more'), bq = fig.querySelector('.dgv-q-body');\n      if (!bt || !bq) return;\n      var lab = bt.querySelector('.dgv-q-lab');\n      bt.addEventListener('click', function () {\n        var open = bt.getAttribute('aria-expanded') !== 'true', tr = fig.closest('.dgv-qcar-track'), it = fig.parentNode;\n        bt.setAttribute('aria-expanded', open ? 'true' : 'false');\n        if (lab) lab.textContent = bt.getAttribute(open ? 'data-less' : 'data-more');\n        if (open) {\n          if (tr && !tr.classList.contains('has-open')) { tr.style.setProperty('--dgv-qh', it.offsetHeight + 'px'); tr.classList.add('has-open'); }\n          bq.style.maxHeight = bq.scrollHeight + 'px';\n          fig.classList.add('is-open');\n          qAfter(bq, function () { if (fig.classList.contains('is-open')) bq.style.maxHeight = 'none'; });\n        } else {\n          var top = fig.getBoundingClientRect().top;     \/* si la tarjeta empieza por encima de la pantalla, se vuelve a ella *\/\n          if (top < 80) window.scrollTo({ top: window.pageYOffset + top - 110, behavior: RM ? 'auto' : 'smooth' });\n          bq.style.maxHeight = bq.scrollHeight + 'px';\n          void bq.offsetHeight;\n          fig.classList.remove('is-open');\n          bq.style.maxHeight = '';\n          qAfter(bq, function () {\n            if (tr && !tr.querySelector('.dgv-quote.is-open')) { tr.classList.remove('has-open'); tr.style.removeProperty('--dgv-qh'); }\n          });\n        }\n      });\n    });\n    if (qs.length) {\n      var qOn = function () {\n        if (qTick) return; qTick = true;\n        window.requestAnimationFrame(function () { qTick = false; var w = root.clientWidth; if (w !== qW) { qW = w; qFit(); } });\n      };\n      window.addEventListener('resize', qOn, { passive: true });\n      if (d.fonts && d.fonts.ready) d.fonts.ready.then(function () { qW = -1; qOn(); });\n      qW = root.clientWidth; qFit();\n    }\n    \/* 9. Hablan de nosotros (v11): cinta de logos en movimiento continuo. Sin JS, en el constructor de Divi o con movimiento\n       reducido, los logos quedan quietos y centrados. Aqu\u00ed se duplica la lista (la copia, oculta a lectores de pantalla y sin\n       texto alternativo) para que el bucle no tenga cortes; la velocidad depende del ancho; se pausa al pasar el rat\u00f3n y\n       cuando la cinta est\u00e1 fuera de la pantalla. *\/\n    each(root.querySelectorAll('[data-dgv-press]'), function (mq) {\n      var ul = mq.querySelector('.dgv-press-list');\n      if (RM || !ul || mq.classList.contains('is-mq')) return;\n      var cp = ul.cloneNode(true);\n      cp.setAttribute('aria-hidden', 'true');\n      each(cp.querySelectorAll('img'), function (im) { im.setAttribute('alt', ''); });\n      each(ul.querySelectorAll('img'), function (im) { im.loading = 'eager'; });   \/* que no aparezcan de golpe al entrar en la cinta *\/\n      each(cp.querySelectorAll('img'), function (im) { im.loading = 'eager'; });\n      mq.appendChild(cp);\n      mq.classList.add('is-mq');\n      function speed() { mq.style.setProperty('--dgv-pd', Math.max(22, Math.round(ul.scrollWidth \/ 42)) + 's'); }\n      speed();\n      if ('ResizeObserver' in window) { new ResizeObserver(speed).observe(ul); }\n      if ('IntersectionObserver' in window) {\n        new IntersectionObserver(function (es) { es.forEach(function (e) { mq.classList.toggle('is-off', !e.isIntersecting); }); }).observe(mq);\n      }\n    });\n    \/* 7. Respaldo del formulario de contacto: el bloque no lleva formulario; debajo va la secci\u00f3n de contacto de Divi\n       con el formulario de cada idioma. Si en la p\u00e1gina NO hay ning\u00fan elemento con id=\"contacto\", los enlaces del bloque\n       a #contacto llevan al primer formulario visible que haya despu\u00e9s del bloque, con el mismo margen de cabecera que\n       las secciones (scroll-margin-top de .dgv-sec). Si existe #contacto no se toca nada; si no hay formulario, tampoco. *\/\n    root.addEventListener('click', function (e) {\n      var a = e.target.closest ? e.target.closest('a[href=\"#contacto\"]') : null;\n      if (!a || e.defaultPrevented || e.button || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n      if (d.getElementById('contacto')) return;\n      var fs = d.querySelectorAll('form'), f = null;\n      for (var k = 0; k < fs.length && !f; k++) {\n        if (!root.contains(fs[k]) && (root.compareDocumentPosition(fs[k]) & 4) && fs[k].getClientRects().length) f = fs[k];\n      }\n      if (!f) return;\n      e.preventDefault();\n      var sec = root.querySelector('.dgv-sec'), m = sec ? parseFloat(getComputedStyle(sec).scrollMarginTop) : NaN;\n      window.scrollTo({ top: Math.max(0, f.getBoundingClientRect().top + window.pageYOffset - (m >= 0 ? m : 100)), behavior: RM ? 'auto' : 'smooth' });\n      if (e.detail === 0) { \/* activado con teclado: el foco pasa al formulario, como har\u00eda el ancla *\/\n        if (!f.hasAttribute('tabindex')) f.setAttribute('tabindex', '-1');\n        try { f.focus({ preventScroll: true }); } catch (er) { \/* navegadores antiguos: sin foco *\/ }\n      }\n    });\n    \/* 11. Tarjetas clicables en 3D ([data-dgv-3d], v12). Con rat\u00f3n: se inclinan siguiendo al cursor. En pantallas t\u00e1ctiles:\n       la tarjeta que pasa por el centro de la pantalla se enciende (.is-focus) y al tocarla se hunde un poco (CSS :active). *\/\n    var c3 = root.querySelectorAll('[data-dgv-3d]');\n    if (c3.length && !RM) {\n      if (FINE) {\n        each(c3, function (c) {\n          var t = null, ex = 0, ey = 0;\n          var tilt = function () {\n            t = null;\n            var r = c.getBoundingClientRect(), x = (ex - r.left) \/ r.width - 0.5, y = (ey - r.top) \/ r.height - 0.5;\n            c.style.setProperty('--ry', (x * 9).toFixed(2) + 'deg');\n            c.style.setProperty('--rx', (-y * 7).toFixed(2) + 'deg');\n          };\n          c.addEventListener('pointerenter', function (e) { if (e.pointerType === 'mouse') c.classList.add('is-tilt'); });\n          c.addEventListener('pointermove', function (e) {\n            if (e.pointerType !== 'mouse') return;\n            ex = e.clientX; ey = e.clientY; if (!t) t = window.requestAnimationFrame(tilt);\n          }, { passive: true });\n          c.addEventListener('pointerleave', function () {\n            c.classList.remove('is-tilt'); c.style.removeProperty('--rx'); c.style.removeProperty('--ry');\n          });\n        });\n      } else if ('IntersectionObserver' in window) {\n        var io3 = new IntersectionObserver(function (es) {\n          es.forEach(function (e) { e.target.classList.toggle('is-focus', e.isIntersecting); });\n        }, { rootMargin: '-40% 0px -40% 0px' });\n        each(c3, function (c) { io3.observe(c); });\n      }\n    }\n    \/* 13. Ilustraciones en c\u00f3digo (.dgp-ill, v13): se animan solo mientras se ven (sin JS o sin IntersectionObserver, siempre). *\/\n    var ills = root.querySelectorAll('.dgp-ill');\n    if (ills.length) {\n      if ('IntersectionObserver' in window) {\n        var ioI = new IntersectionObserver(function (es) {\n          es.forEach(function (e) { e.target.classList.toggle('is-vis', e.isIntersecting); });\n        }, { rootMargin: '60px 0px 60px 0px' });\n        each(ills, function (el) { ioI.observe(el); });\n      } else { each(ills, function (el) { el.classList.add('is-vis'); }); }\n    }\n  });\n  \/* 12. Cursor de DigiAcci\u00f3n (v12): anillo de degradado que sigue a la flecha con un retraso suave; sobre enlaces y botones\n     crece y brilla, y al pulsar se encoge. Solo con rat\u00f3n y sin movimiento reducido. Una sola vez por p\u00e1gina: si ya lo ha\n     puesto el fragmento global de Divi (window.dgvCursor), no se repite. *\/\n  if (FINE && !RM && !window.dgvCursor) {\n    window.dgvCursor = 1;\n    var cur = d.createElement('div'), cx = -100, cy = -100, tx = -100, ty = -100, raf = 0;\n    cur.className = 'dgv-cur'; cur.setAttribute('aria-hidden', 'true'); b.appendChild(cur);\n    var HOT = 'a,button,[role=\"button\"],[role=\"tab\"],summary,label[for],select,.dgp-strat-row';\n    var loop = function () {\n      cx += (tx - cx) * 0.22; cy += (ty - cy) * 0.22;\n      cur.style.transform = 'translate3d(' + cx.toFixed(1) + 'px,' + cy.toFixed(1) + 'px,0)';\n      raf = (Math.abs(tx - cx) + Math.abs(ty - cy) > 0.2) ? window.requestAnimationFrame(loop) : 0;\n    };\n    d.addEventListener('pointermove', function (e) {\n      if (e.pointerType !== 'mouse') { cur.classList.remove('is-on'); return; }\n      tx = e.clientX; ty = e.clientY;\n      if (!cur.classList.contains('is-on')) { cx = tx; cy = ty; cur.classList.add('is-on'); }\n      var h = e.target && e.target.closest ? e.target.closest(HOT) : null;\n      cur.classList.toggle('is-big', !!h);\n      if (!raf) raf = window.requestAnimationFrame(loop);\n    }, { passive: true });\n    d.addEventListener('pointerdown', function () { cur.classList.add('is-press'); }, { passive: true });\n    d.addEventListener('pointerup', function () { cur.classList.remove('is-press'); }, { passive: true });\n    d.documentElement.addEventListener('mouseleave', function () { cur.classList.remove('is-on'); });\n    window.addEventListener('blur', function () { cur.classList.remove('is-on'); });\n  }\n})();\n\/* DigiAcci\u00f3n | Herramientas gratuitas (ra\u00edz .dgv.dgt): rejilla de s\u00edmbolos, conversor de romaji, valoraci\u00f3n con estrellas,\n   regla a tama\u00f1o real y colores. JS nativo, sin dependencias. Sin JS, todo el contenido se ve (las rejillas, los colores\n   y los textos est\u00e1n en el HTML); el JS a\u00f1ade copiar, buscar, filtrar, convertir y medir. *\/\n(function () {\n  'use strict';\n  var d = document;\n  function go() {\n    var root = d.querySelector('.dgv.dgt');\n    if (!root) return;\n    var b = d.body;\n    if (b && (b.classList.contains('et-fb') || \/[?&](et_fb|et_pb_preview)=\/.test(location.search))) return;\n    \/* Modo claro de entrada (.dgt-claro, solo en las herramientas): en cuanto el visitante usa el interruptor d\u00eda y noche\n       de la web, la herramienta sigue al interruptor como el resto de p\u00e1ginas. No guarda nada ni cambia la web. *\/\n    if (root.classList.contains('dgt-claro') && b && window.MutationObserver) {\n      var lm0 = b.classList.contains('diviui-light-mode');\n      var mo = new MutationObserver(function () { if (b.classList.contains('diviui-light-mode') !== lm0) { root.classList.remove('dgt-claro'); mo.disconnect(); } });\n      mo.observe(b, { attributes: true, attributeFilter: ['class'] });\n    }\n    var LANG = root.getAttribute('lang') || 'es';\n    var NUM = function (n, dec) { try { return n.toLocaleString(LANG === 'es' ? 'es-ES' : 'en-US', { maximumFractionDigits: dec, minimumFractionDigits: 0 }); } catch (e) { return String(Math.round(n * 100) \/ 100); } };\n    var toastEl = root.querySelector('[data-dgt-toast]'), tt = 0;\n    function toast(msg) {\n      if (!toastEl) return;\n      toastEl.textContent = msg; toastEl.classList.add('is-on');\n      clearTimeout(tt); tt = setTimeout(function () { toastEl.classList.remove('is-on'); }, 1600);\n    }\n    function copy(text) {\n      function fb() {\n        var ta = d.createElement('textarea'); ta.value = text; ta.setAttribute('readonly', '');\n        ta.style.cssText = 'position:fixed;top:0;left:0;opacity:0;pointer-events:none';\n        d.body.appendChild(ta); ta.select();\n        try { d.execCommand('copy'); } catch (e) { \/* nada *\/ }\n        d.body.removeChild(ta);\n      }\n      try {\n        if (navigator.clipboard && window.isSecureContext) { return navigator.clipboard.writeText(text).catch(fb); }\n      } catch (e) { \/* nada *\/ }\n      fb(); return Promise.resolve();\n    }\n    function cpStr(hex) { return hex.split('-').map(function (h) { return String.fromCodePoint(parseInt(h, 16)); }).join(''); }\n    function cps(s) { var o = []; for (var ch of s) o.push(ch.codePointAt(0).toString(16).toUpperCase()); return o; }\n    function norm(s) { return (s || '').toLowerCase().normalize('NFD').replace(\/[\u0300-\u036f]\/g, ''); }\n    function esc(s) { return String(s).replace(\/[&<>\"]\/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' }[c]; }); }\n    function ui(el) { try { return JSON.parse(el.getAttribute('data-ui') || '{}'); } catch (e) { return {}; } }\n    function pad4(h) { return h.length < 4 ? ('0000' + h).slice(-4) : h; }\n    \/* ---------- Panel de detalle (\u00faltimo elemento copiado) ---------- *\/\n    function detailPanel(tool, U) {\n      var p = tool.querySelector('[data-dgt-detail]');\n      if (!p) return function () {};\n      var fg = p.querySelector('[data-f=\"g\"]'), fn = p.querySelector('[data-f=\"n\"]'), fs = p.querySelector('[data-f=\"s\"]'), ff = p.querySelector('[data-f=\"fmts\"]');\n      p.querySelector('[data-act=\"close-detail\"]').addEventListener('click', function () { p.hidden = true; });\n      d.addEventListener('keydown', function (e) { if (e.key === 'Escape') p.hidden = true; });\n      ff.addEventListener('click', function (e) {\n        var bt = e.target.closest('button[data-v]'); if (!bt) return;\n        copy(bt.getAttribute('data-v')); toast((U.copiado || 'Copied') + ': ' + bt.getAttribute('data-v'));\n      });\n      return function (glyph, name, fmts, color) {\n        fg.textContent = color ? '' : glyph;\n        if (color) fg.style.setProperty('--c', color); else fg.style.removeProperty('--c');\n        fn.textContent = name; fs.textContent = (U.copiado || 'Copied');\n        ff.innerHTML = fmts.filter(function (f) { return f && f[1]; }).map(function (f) {\n          return '<button type=\"button\" data-v=\"' + esc(f[1]) + '\"><b>' + esc(f[0]) + '<\/b><code>' + esc(f[2] || f[1]) + '<\/code><\/button>';\n        }).join('');\n        p.hidden = false;\n      };\n    }\n    \/* ---------- 1. Rejilla de s\u00edmbolos, emojis y kana ---------- *\/\n    Array.prototype.forEach.call(root.querySelectorAll('[data-dgt-grid]'), function (tool) {\n      var U = ui(tool), mode = tool.getAttribute('data-detalle');\n      var items = Array.prototype.slice.call(tool.querySelectorAll('.dgt-i'));\n      var groups = Array.prototype.slice.call(tool.querySelectorAll('.dgt-grp'));\n      var q = tool.querySelector('[data-dgt-q]'), empty = tool.querySelector('[data-dgt-empty]');\n      var tray = tool.querySelector('[data-dgt-tray]'), trayOut = tray && tray.querySelector('.dgt-tray-t');\n      var show = detailPanel(tool, U), tone = '', curG = '*';\n      var idx = items.map(function (el) {\n        var dc = el.getAttribute('data-c'), v = dc ? cpStr(dc) : el.textContent;\n        var g = el.querySelector('.dgt-g'); if (g && dc) g.textContent = v;\n        el._v = v; el._base = v;\n        return { el: el, hay: norm([el.getAttribute('aria-label'), el.getAttribute('data-k'), el.getAttribute('data-r'), v].join(' ')), grp: el.closest('.dgt-grp') };\n      });\n      function trayState() { if (tray) tray.classList.toggle('is-empty', !trayOut.textContent); }\n      trayState();\n      function withTone(v) {\n        if (!tone) return v;\n        var arr = Array.from(v.replace(\/\ufe0f\/g, ''));\n        arr.splice(1, 0, String.fromCodePoint(parseInt(tone, 16)));\n        return arr.join('');\n      }\n      function filter() {\n        var s = norm(q ? q.value.trim() : ''), any = false;\n        var terms = s ? s.split(\/\\s+\/) : [];\n        idx.forEach(function (o) {\n          var okG = curG === '*' || o.grp.getAttribute('data-g') === curG;\n          var okQ = !terms.length || terms.every(function (t) { return o.hay.indexOf(t) > -1; });\n          o.el.hidden = !(okG && okQ);\n        });\n        groups.forEach(function (g) {\n          var vis = false;\n          Array.prototype.forEach.call(g.querySelectorAll('.dgt-grid'), function (gr) {\n            var has = !!gr.querySelector('.dgt-i:not([hidden])');\n            gr.hidden = !has;\n            var prev = gr.previousElementSibling;\n            if (prev && prev.classList.contains('dgt-sh')) prev.hidden = !has;\n            vis = vis || has;\n          });\n          g.hidden = !vis; any = any || vis;\n        });\n        if (empty) empty.hidden = any;\n      }\n      var tq = 0;\n      if (q) q.addEventListener('input', function () { clearTimeout(tq); tq = setTimeout(filter, 110); });\n      Array.prototype.forEach.call(tool.querySelectorAll('.dgt-chips button'), function (bt, i, all) {\n        bt.addEventListener('click', function () {\n          Array.prototype.forEach.call(all, function (x) { x.classList.toggle('is-on', x === bt); });\n          curG = bt.getAttribute('data-g'); filter();\n          if (curG !== '*') { var t = tool.querySelector('.dgt-grp[data-g=\"' + curG + '\"]'); if (t && t.getBoundingClientRect().top < 0) t.scrollIntoView({ behavior: 'smooth', block: 'start' }); }\n        });\n      });\n      Array.prototype.forEach.call(tool.querySelectorAll('.dgt-tones button'), function (bt, i, all) {\n        bt.addEventListener('click', function () {\n          Array.prototype.forEach.call(all, function (x) { x.setAttribute('aria-checked', x === bt ? 'true' : 'false'); });\n          tone = bt.getAttribute('data-tone') || '';\n          idx.forEach(function (o) {\n            if (!o.el.hasAttribute('data-t')) return;\n            o.el._v = withTone(o.el._base);\n            var g = o.el.querySelector('.dgt-g') || o.el; g.textContent = o.el._v;\n          });\n        });\n      });\n      tool.addEventListener('click', function (e) {\n        var el = e.target.closest('.dgt-i'); if (!el) return;\n        var v = el._v || el.textContent;\n        copy(v);\n        el.classList.add('is-copied'); setTimeout(function () { el.classList.remove('is-copied'); }, 1200);\n        if (trayOut) { trayOut.textContent += v; trayState(); }\n        toast((U.copiado || 'Copied') + ': ' + v);\n        var c = cps(v), uni = c.map(function (h) { return 'U+' + pad4(h); }).join(' ');\n        var ent = el.getAttribute('data-e'), num = c.map(function (h) { return '&#x' + h + ';'; }).join('');\n        var css = c.map(function (h) { return '\\\\' + pad4(h); }).join(' ');\n        var js = c.map(function (h) { return h.length > 4 ? '\\\\u{' + h + '}' : '\\\\u' + pad4(h); }).join('');\n        var alt = el.getAttribute('data-a'), altS = '';\n        if (alt) altS = alt.split('|').map(function (a) { return 'Alt+' + a; }).join(' \/ ');\n        var f = [[U.f_simbolo || 'Symbol', v]];\n        if (mode === 'kana') f.push(['Romaji', el.getAttribute('data-r') || '']);\n        f.push(['Unicode', uni]);\n        if (ent) f.push(['HTML', '&' + ent + ';']);\n        f.push([ent ? 'HTML (n.)' : 'HTML', num]);\n        f.push(['CSS', css]);\n        f.push(['JavaScript', js]);\n        if (mode === 'simbolo') { try { f.push(['URL', encodeURIComponent(v)]); } catch (x) { \/* nada *\/ } }\n        if (altS) f.push(['Windows', altS.split(' \/ ').pop(), altS]);\n        show(v, el.getAttribute('aria-label') || '', f);\n      });\n      if (tray) tray.addEventListener('click', function (e) {\n        var a = e.target.closest('[data-act]'); if (!a) return;\n        if (a.getAttribute('data-act') === 'copy-tray' && trayOut.textContent) { copy(trayOut.textContent); toast((U.copiado || 'Copied') + ': ' + trayOut.textContent); }\n        if (a.getAttribute('data-act') === 'clear-tray') { trayOut.textContent = ''; trayState(); }\n      });\n      \/* Conversor de romaji a hiragana y katakana *\/\n      var rin = tool.querySelector('[data-dgt-rin]');\n      if (rin) {\n        var T = {}, base = {\n          a: '\u3042', i: '\u3044', u: '\u3046', e: '\u3048', o: '\u304a', ka: '\u304b', ki: '\u304d', ku: '\u304f', ke: '\u3051', ko: '\u3053', sa: '\u3055', si: '\u3057', shi: '\u3057', su: '\u3059', se: '\u305b', so: '\u305d',\n          ta: '\u305f', ti: '\u3061', chi: '\u3061', tu: '\u3064', tsu: '\u3064', te: '\u3066', to: '\u3068', na: '\u306a', ni: '\u306b', nu: '\u306c', ne: '\u306d', no: '\u306e',\n          ha: '\u306f', hi: '\u3072', hu: '\u3075', fu: '\u3075', he: '\u3078', ho: '\u307b', ma: '\u307e', mi: '\u307f', mu: '\u3080', me: '\u3081', mo: '\u3082', ya: '\u3084', yu: '\u3086', yo: '\u3088',\n          ra: '\u3089', ri: '\u308a', ru: '\u308b', re: '\u308c', ro: '\u308d', la: '\u3089', li: '\u308a', lu: '\u308b', le: '\u308c', lo: '\u308d', wa: '\u308f', wo: '\u3092',\n          ga: '\u304c', gi: '\u304e', gu: '\u3050', ge: '\u3052', go: '\u3054', za: '\u3056', zi: '\u3058', ji: '\u3058', zu: '\u305a', ze: '\u305c', zo: '\u305e', da: '\u3060', di: '\u3062', du: '\u3065', de: '\u3067', do: '\u3069',\n          ba: '\u3070', bi: '\u3073', bu: '\u3076', be: '\u3079', bo: '\u307c', pa: '\u3071', pi: '\u3074', pu: '\u3077', pe: '\u307a', po: '\u307d', vu: '\u3094',\n          kya: '\u304d\u3083', kyu: '\u304d\u3085', kyo: '\u304d\u3087', sha: '\u3057\u3083', shu: '\u3057\u3085', sho: '\u3057\u3087', sya: '\u3057\u3083', syu: '\u3057\u3085', syo: '\u3057\u3087', cha: '\u3061\u3083', chu: '\u3061\u3085', cho: '\u3061\u3087',\n          tya: '\u3061\u3083', tyu: '\u3061\u3085', tyo: '\u3061\u3087', nya: '\u306b\u3083', nyu: '\u306b\u3085', nyo: '\u306b\u3087', hya: '\u3072\u3083', hyu: '\u3072\u3085', hyo: '\u3072\u3087', mya: '\u307f\u3083', myu: '\u307f\u3085', myo: '\u307f\u3087',\n          rya: '\u308a\u3083', ryu: '\u308a\u3085', ryo: '\u308a\u3087', gya: '\u304e\u3083', gyu: '\u304e\u3085', gyo: '\u304e\u3087', ja: '\u3058\u3083', ju: '\u3058\u3085', jo: '\u3058\u3087', jya: '\u3058\u3083', jyu: '\u3058\u3085', jyo: '\u3058\u3087',\n          bya: '\u3073\u3083', byu: '\u3073\u3085', byo: '\u3073\u3087', pya: '\u3074\u3083', pyu: '\u3074\u3085', pyo: '\u3074\u3087',\n          fa: '\u3075\u3041', fi: '\u3075\u3043', fe: '\u3075\u3047', fo: '\u3075\u3049', she: '\u3057\u3047', je: '\u3058\u3047', che: '\u3061\u3047', thi: '\u3066\u3043', dhi: '\u3067\u3043', twu: '\u3068\u3045', dwu: '\u3069\u3045',\n          wi: '\u3046\u3043', we: '\u3046\u3047', va: '\u3094\u3041', vi: '\u3094\u3043', ve: '\u3094\u3047', vo: '\u3094\u3049', tsa: '\u3064\u3041', ye: '\u3044\u3047',\n          xa: '\u3041', xi: '\u3043', xu: '\u3045', xe: '\u3047', xo: '\u3049', xtu: '\u3063', xtsu: '\u3063', xya: '\u3083', xyu: '\u3085', xyo: '\u3087', '-': '\u30fc'\n        };\n        for (var k in base) T[k] = base[k];\n        var toKata = function (s) { return s.replace(\/[\u3041-\u3096]\/g, function (c) { return String.fromCharCode(c.charCodeAt(0) + 0x60); }); };\n        \/* Vocales largas (\u014d, \u00f4...): en hiragana se escriben con vocal (ou, aa, ii, uu, ee) y en katakana con la raya \u30fc.\n           Las tildes del espa\u00f1ol se quitan (\u00e1 > a) y la \u00f1 pasa a ny. *\/\n        var LV = { '\u0101': 'a', '\u00e2': 'a', '\u012b': 'i', '\u00ee': 'i', '\u016b': 'u', '\u00fb': 'u', '\u0113': 'e', '\u00ea': 'e', '\u014d': 'o', '\u00f4': 'o' }, HL = { a: 'a', i: 'i', u: 'u', e: 'e', o: 'u' };\n        var prep = function (src, kata) {\n          return src.toLowerCase().replace(\/[\u0101\u00e2\u012b\u00ee\u016b\u00fb\u0113\u00ea\u014d\u00f4]\/g, function (c) { var v = LV[c]; return v + (kata ? '-' : HL[v]); })\n            .replace(\/\u00f1\/g, 'ny').replace(\/[\u00e0-\u00ff]\/g, function (c) { return c.normalize ? c.normalize('NFD').charAt(0) : c; });\n        };\n        var conv = function (src) {\n          var s = src, out = '', i = 0;\n          while (i < s.length) {\n            var ch = s[i], nx = s[i + 1];\n            if (ch === 'n') {\n              if (nx === \"'\") { out += '\u3093'; i += 2; continue; }\n              if (nx === 'n') { out += '\u3093'; i += \/[aeiouy]\/.test(s[i + 2] || '') ? 1 : 2; continue; }\n              if (!nx || !\/[aeiouy]\/.test(nx)) { out += '\u3093'; i++; continue; }\n            }\n            if (nx && ch === nx && \/[bcdfghjklmpqrstvwxz]\/.test(ch) && ch !== 'n') { out += '\u3063'; i++; continue; }\n            if (ch === 't' && nx === 'c' && s[i + 2] === 'h') { out += '\u3063'; i++; continue; }\n            var hit = false;\n            for (var L = 4; L > 0; L--) { var part = s.substr(i, L); if (T[part]) { out += T[part]; i += L; hit = true; break; } }\n            if (!hit) { out += src[i]; i++; }\n          }\n          return out;\n        };\n        var rh = tool.querySelector('[data-dgt-rh]'), rk = tool.querySelector('[data-dgt-rk]');\n        var upd = function () { rh.textContent = conv(prep(rin.value, false)); rk.textContent = toKata(conv(prep(rin.value, true))); };\n        rin.addEventListener('input', upd);\n        if (!rin.value) rin.value = rin.getAttribute('placeholder') || ''; upd(); rin.value = '';\n      }\n      \/* Generador de valoraci\u00f3n con estrellas *\/\n      var rn = tool.querySelector('[data-dgt-rn]');\n      if (rn) {\n        var rmax = tool.querySelector('[data-dgt-rmax]'), rst = tool.querySelector('[data-dgt-rst]'), rout = tool.querySelector('[data-dgt-rout]');\n        var rv = tool.querySelector('[data-dgt-rv]'), half = rn.getAttribute('data-half');\n        var rate = function () {\n          var mx = parseInt(rmax.value, 10); rn.max = mx; if (+rn.value > mx) rn.value = mx;\n          var st = rst.value.split(','), full = cpStr(st[0]), emp = cpStr(st[1]);\n          var canHalf = !!half && st[0] === '2605';          \/* la media estrella solo existe para \u2605 \u2606 *\/\n          var v = parseFloat(rn.value); if (!canHalf) v = Math.floor(v);\n          rn.step = canHalf ? '0.5' : '1'; rn.value = v;\n          var n = Math.floor(v), h = canHalf && v - n >= 0.5 ? 1 : 0;\n          rout.textContent = new Array(n + 1).join(full) + (h ? cpStr(half) : '') + new Array(mx - n - h + 1).join(emp);\n          if (rv) rv.textContent = NUM(v, 1) + ' \/ ' + mx;\n        };\n        [rn, rmax, rst].forEach(function (x) { x.addEventListener('input', rate); x.addEventListener('change', rate); });\n        rate();\n      }\n      \/* Pesta\u00f1as del conversor de japon\u00e9s: nombre o palabra \/ desde romaji *\/\n      var jtabs = tool.querySelectorAll('[data-jm]');\n      Array.prototype.forEach.call(jtabs, function (bt) {\n        bt.addEventListener('click', function () {\n          Array.prototype.forEach.call(jtabs, function (x) { var on = x === bt; x.setAttribute('aria-selected', on ? 'true' : 'false'); x.tabIndex = on ? 0 : -1; });\n          Array.prototype.forEach.call(tool.querySelectorAll('[data-jp]'), function (pn) { pn.hidden = pn.getAttribute('data-jp') !== bt.getAttribute('data-jm'); });\n        });\n        bt.addEventListener('keydown', function (e) {\n          if (e.key !== 'ArrowRight' && e.key !== 'ArrowLeft') return;\n          var arr = Array.prototype.slice.call(jtabs), i = arr.indexOf(bt), nx = arr[(i + (e.key === 'ArrowRight' ? 1 : arr.length - 1)) % arr.length];\n          nx.focus(); nx.click(); e.preventDefault();\n        });\n      });\n      \/* Tu nombre en japon\u00e9s: katakana por c\u00f3mo suena (espa\u00f1ol; en la p\u00e1gina inglesa, con algunas reglas del ingl\u00e9s),\n         diccionario de nombres con su graf\u00eda habitual y traducci\u00f3n de palabras y frases comunes *\/\n      var nin = tool.querySelector('[data-dgt-nin]'), jd = tool.querySelector('[data-dgt-jdict]');\n      if (nin && jd) {\n        var J = {}; try { J = JSON.parse(jd.textContent); } catch (x) { J = { n: { es: {}, en: {} }, d: { es: {}, en: {} } }; }\n        var OTHER = LANG === 'es' ? 'en' : 'es';\n        var KV = {\n          '': ['\u30a2', '\u30a4', '\u30a6', '\u30a8', '\u30aa'], k: ['\u30ab', '\u30ad', '\u30af', '\u30b1', '\u30b3'], g: ['\u30ac', '\u30ae', '\u30b0', '\u30b2', '\u30b4'], s: ['\u30b5', '\u30b7', '\u30b9', '\u30bb', '\u30bd'],\n          z: ['\u30b6', '\u30b8', '\u30ba', '\u30bc', '\u30be'], t: ['\u30bf', '\u30c6\u30a3', '\u30c8\u30a5', '\u30c6', '\u30c8'], d: ['\u30c0', '\u30c7\u30a3', '\u30c9\u30a5', '\u30c7', '\u30c9'], n: ['\u30ca', '\u30cb', '\u30cc', '\u30cd', '\u30ce'],\n          h: ['\u30cf', '\u30d2', '\u30d5', '\u30d8', '\u30db'], b: ['\u30d0', '\u30d3', '\u30d6', '\u30d9', '\u30dc'], p: ['\u30d1', '\u30d4', '\u30d7', '\u30da', '\u30dd'], m: ['\u30de', '\u30df', '\u30e0', '\u30e1', '\u30e2'],\n          y: ['\u30e4', '\u30a4', '\u30e6', '\u30a4\u30a7', '\u30e8'], r: ['\u30e9', '\u30ea', '\u30eb', '\u30ec', '\u30ed'], w: ['\u30ef', '\u30a6\u30a3', '\u30a6', '\u30a6\u30a7', '\u30a6\u30a9'], f: ['\u30d5\u30a1', '\u30d5\u30a3', '\u30d5', '\u30d5\u30a7', '\u30d5\u30a9'],\n          ch: ['\u30c1\u30e3', '\u30c1', '\u30c1\u30e5', '\u30c1\u30a7', '\u30c1\u30e7'], ny: ['\u30cb\u30e3', '\u30cb', '\u30cb\u30e5', '\u30cb\u30a7', '\u30cb\u30e7'], sh: ['\u30b7\u30e3', '\u30b7', '\u30b7\u30e5', '\u30b7\u30a7', '\u30b7\u30e7'],\n          gw: ['\u30b0\u30a1', '\u30b0\u30a3', '\u30b0', '\u30b0\u30a7', '\u30b0\u30a9'], j: ['\u30b8\u30e3', '\u30b8', '\u30b8\u30e5', '\u30b8\u30a7', '\u30b8\u30e7'], kw: ['\u30af\u30a1', '\u30af\u30a3', '\u30af', '\u30af\u30a7', '\u30af\u30a9']\n        };\n        var CODA = { k: '\u30af', g: '\u30b0', s: '\u30b9', z: '\u30ba', t: '\u30c8', d: '\u30c9', h: '\u30d5', b: '\u30d6', p: '\u30d7', m: '\u30e0', r: '\u30eb', f: '\u30d5', ch: '\u30c1', sh: '\u30b7\u30e5', j: '\u30b8', w: '\u30a6', y: '\u30a4', ny: '\u30cb', gw: '\u30b0', kw: '\u30af' };\n        var VI = { a: 0, i: 1, u: 2, e: 3, o: 4 };\n        var isV = function (ch) { return !!ch && VI.hasOwnProperty(ch); };\n        var clean = function (w) {\n          return w.toLowerCase().replace(\/l\u00b7l\/g, 'l').replace(\/[\u00e1\u00e0\u00e2\u00e4]\/g, 'a').replace(\/[\u00e9\u00e8\u00ea\u00eb]\/g, 'e').replace(\/[\u00ed\u00ec\u00ee\u00ef]\/g, 'i').replace(\/[\u00f3\u00f2\u00f4\u00f6]\/g, 'o')\n            .replace(\/[\u00fa\u00f9\u00fb]\/g, 'u').replace(\/\u00e7\/g, 's').replace(\/[^a-z\u00f1\u00fc]\/g, '');\n        };\n        var phon = function (w, EN) {\n          if (EN) {   \/* algunas reglas del ingl\u00e9s: vocales largas, e final muda y j *\/\n            w = w.replace(\/ee|ea\/g, '\u012b').replace(\/oo\/g, '\u016b').replace(\/ph\/g, 'f').replace(\/ck\/g, 'kk').replace(\/wh\/g, 'w');\n            if (w.length > 3 && \/[^aeiouy]e$\/.test(w)) w = w.slice(0, -1);\n            w = w.replace(\/y$\/, '\u012b');\n          }\n          var out = '', i = 0, L = w.length;\n          while (i < L) {\n            var ch = w[i], nx = w[i + 1], c = null, adv = 1;\n            if (ch === '\u012b') { out += '\u30a4\u30fc'; i++; continue; }\n            if (ch === '\u016b') { out += '\u30a6\u30fc'; i++; continue; }\n            if (isV(ch)) { out += KV[''][VI[ch]]; i++; continue; }\n            if (ch === '\u00fc') { out += '\u30a6'; i++; continue; }\n            var two = w.substr(i, 2);\n            if (two === 'ch') { c = 'ch'; adv = 2; }\n            else if (two === 'll') { c = EN ? 'r' : 'y'; adv = 2; }\n            else if (two === 'rr') { c = 'r'; adv = 2; }\n            else if (two === 'sh') { c = 'sh'; adv = 2; }\n            else if (two === 'th') { c = EN ? 's' : 't'; adv = 2; }\n            else if (two === 'tx') { c = 'ch'; adv = 2; }\n            else if (two === 'qu') { if (\/[ei]\/.test(w[i + 2] || '')) { c = 'k'; adv = 2; } else { c = 'kw'; adv = 2; } }\n            else if (two === 'gu' && \/[ei]\/.test(w[i + 2] || '')) { c = 'g'; adv = 2; }\n            else if (two === 'g\u00fc') { c = 'gw'; adv = 2; }\n            else if (\/^(mm|bb|dd|gg|ff|zz|nn)$\/.test(two) && !(two === 'nn' && isV(w[i + 2]))) { i++; continue; }\n            else if (\/^(tt|ss|pp|kk|cc)$\/.test(two) && isV(w[i + 2]) && !(two === 'cc' && \/[eiy]\/.test(w[i + 2]))) { out += '\u30c3'; i++; continue; }\n            if (!c) {\n              switch (ch) {\n                case 'c': c = \/[eiy]\/.test(nx || '') ? 's' : 'k'; break;\n                case 'g': c = \/[eiy]\/.test(nx || '') ? (EN ? 'j' : 'h') : 'g'; break;\n                case 'j': c = EN ? 'j' : 'h'; break;\n                case 'z': c = EN ? 'z' : 's'; break;\n                case 'v': c = 'b'; break;\n                case 'q': c = 'k'; break;\n                case 'h': if (EN && isV(nx)) { c = 'h'; break; } i++; continue;\n                case '\u00f1': c = 'ny'; break;\n                case 'x': if (isV(nx)) { out += '\u30af'; c = 's'; } else { out += '\u30af\u30b9'; i++; continue; } break;\n                case 'y': if (isV(nx)) { c = 'y'; } else { out += EN && i === L - 1 ? '\u30a4\u30fc' : '\u30a4'; i++; continue; } break;\n                default: c = ch;\n              }\n            }\n            if (c === 'l') c = 'r';\n            var v = w[i + adv];\n            if (v === '\u012b' || v === '\u016b') { out += KV[c] ? KV[c][v === '\u012b' ? 1 : 2] + '\u30fc' : ''; i += adv + 1; continue; }\n            if (isV(v) && KV[c]) {\n              out += (c === 'y' && v === 'i') ? '\u30a4' : (c === 'w' && v === 'u') ? '\u30a6' : KV[c][VI[v]];\n              i += adv + 1; continue;\n            }\n            if (c === 'n') out += '\u30f3';\n            else if (c === 'm' && \/[bp]\/.test(w[i + adv] || '')) out += '\u30f3';\n            else if (c === 'l') out += '\u30eb';\n            else out += CODA[c] || '';\n            i += adv;\n          }\n          return out;\n        };\n        var ROM = {};   \/* lectura en romaji de lo que sale en katakana *\/\n        Object.keys(KV).forEach(function (cl) {\n          var base = { '': ['a', 'i', 'u', 'e', 'o'], k: ['ka', 'ki', 'ku', 'ke', 'ko'], g: ['ga', 'gi', 'gu', 'ge', 'go'], s: ['sa', 'shi', 'su', 'se', 'so'], z: ['za', 'ji', 'zu', 'ze', 'zo'], t: ['ta', 'ti', 'tu', 'te', 'to'], d: ['da', 'di', 'du', 'de', 'do'], n: ['na', 'ni', 'nu', 'ne', 'no'], h: ['ha', 'hi', 'fu', 'he', 'ho'], b: ['ba', 'bi', 'bu', 'be', 'bo'], p: ['pa', 'pi', 'pu', 'pe', 'po'], m: ['ma', 'mi', 'mu', 'me', 'mo'], y: ['ya', 'i', 'yu', 'ye', 'yo'], r: ['ra', 'ri', 'ru', 're', 'ro'], w: ['wa', 'wi', 'u', 'we', 'wo'], f: ['fa', 'fi', 'fu', 'fe', 'fo'], ch: ['cha', 'chi', 'chu', 'che', 'cho'], ny: ['nya', 'ni', 'nyu', 'nye', 'nyo'], sh: ['sha', 'shi', 'shu', 'she', 'sho'], gw: ['gwa', 'gwi', 'gu', 'gwe', 'gwo'], j: ['ja', 'ji', 'ju', 'je', 'jo'], kw: ['kwa', 'kwi', 'ku', 'kwe', 'kwo'] }[cl];\n          KV[cl].forEach(function (kk, ix) { if (!ROM[kk]) ROM[kk] = base[ix]; });\n        });\n        '\u30c4:tsu,\u30c5:zu,\u30c2:ji,\u30f2:wo,\u30f4:vu,\u30f3:n,\u30fc:-,\u30b8:ji,\u30c1:chi,\u30b7:shi,\u30d5:fu,\u30be:zo,\u30ba:zu'.split(',').forEach(function (p) { var q = p.split(':'); ROM[q[0]] = q[1]; });\n        var reading = function (k) {\n          var o = '', i = 0;\n          while (i < k.length) {\n            var two = k.substr(i, 2), one = k[i];\n            if (one === '\u30c3') { var nxr = ROM[k.substr(i + 1, 2)] || ROM[k[i + 1]] || ''; o += nxr.charAt(0); i++; continue; }\n            if (one === '\u30fb') { o += ' '; i++; continue; }\n            if (one === '\u30fc') { var lv = o.slice(-1); o += \/[aeiou]\/.test(lv) ? lv : ''; i++; continue; }\n            if (ROM[two]) { o += ROM[two]; i += 2; continue; }\n            o += ROM[one] || one; i++;\n          }\n          return o;\n        };\n        var nk = tool.querySelector('[data-dgt-nk]'), ntr = tool.querySelector('[data-dgt-ntr]'), nt = tool.querySelector('[data-dgt-nt]');\n        var nl = tool.querySelector('[data-dgt-nl]'), nm = tool.querySelector('[data-dgt-nm]');\n        var key = function (s) { return norm(s).replace(\/[\u00bf?\u00a1!.,;:'\u2019\"]\/g, '').replace(\/\\s+\/g, ' ').trim(); };\n        var nupd = function () {\n          var raw = nin.value.trim() || nin.getAttribute('placeholder') || '';\n          var words = raw.split(\/[\\s\\-]+\/).filter(Boolean), dic = true;\n          var kat = words.map(function (wd) {\n            var w = clean(wd); if (!w) return '';\n            var k = (J.n[LANG] || {})[w] || (J.n[OTHER] || {})[w];\n            if (k) return k;\n            dic = false; return phon(w, LANG === 'en' && !\/[\u00e1\u00e9\u00ed\u00f3\u00fa\u00f1\u00fc]\/i.test(wd));   \/* con tilde o \u00f1, se lee en espa\u00f1ol *\/\n          }).filter(Boolean).join('\u30fb');\n          nk.textContent = kat;\n          nl.textContent = reading(kat);\n          var hit = (J.d[LANG] || {})[key(raw)] || (J.d[OTHER] || {})[key(raw)];\n          if (hit && hit.length) {\n            ntr.hidden = false; nt.textContent = hit[0][0];\n            nm.textContent = hit.map(function (h) { return h[0] + ' (' + h[1] + '): ' + h[2]; }).join('. ');\n          } else {\n            ntr.hidden = true; nt.textContent = '';\n            nm.textContent = (dic ? (U.jn_dic || '') : (U.jn_aprox || ''));\n          }\n        };\n        var nt0 = 0; nin.addEventListener('input', function () { clearTimeout(nt0); nt0 = setTimeout(nupd, 60); });\n        nupd();\n      }\n      \/* Conversor de comillas: rectas a latinas \u00ab \u00bb (orden de la RAE: \u00ab \u201c \u2018 \u2019 \u201d \u00bb) o inglesas \u201c \u201d (\u201c \u2018 \u2019 \u201d) *\/\n      var qin = tool.querySelector('[data-qc-in]');\n      if (qin) {\n        var qout = tool.querySelector('[data-dgt-qcout]'), qap = tool.querySelector('[data-qc-ap]'), qs0 = tool.querySelector('[data-qs][aria-checked=\"true\"]'), qstyle = qs0 ? qs0.getAttribute('data-qs') : 'lat';\n        var LEV = { lat: [['\u00ab', '\u00bb'], ['\u201c', '\u201d'], ['\u2018', '\u2019']], ing: [['\u201c', '\u201d'], ['\u2018', '\u2019'], ['\u201c', '\u201d']] };\n        var DQ = '\"\u00ab\u00bb\u201c\u201d\u201e\u201f\u275d\u275e', SQ = \"'\u2018\u2019\u201a\u201b\";\n        var isL = function (ch) { return !!ch && \/[0-9A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u00ff\u0100-\u017e]\/.test(ch); };\n        var qconv = function (t, st, ap) {\n          if (st === 'rect') return t.replace(\/[\u00ab\u00bb\u201c\u201d\u201e\u201f\u275d\u275e]\/g, '\"').replace(\/[\u2018\u2019\u201a\u201b]\/g, \"'\");\n          var out = '', stack = [], lastQ = null;   \/* lastQ: si el car\u00e1cter anterior era una comilla, si abr\u00eda (true) o cerraba (false) *\/\n          for (var i = 0; i < t.length; i++) {\n            var ch = t[i], pv = t[i - 1], nx = t[i + 1];\n            var dq = DQ.indexOf(ch) > -1, sq = SQ.indexOf(ch) > -1;\n            if (!dq && !sq) { out += ch; lastQ = null; continue; }\n            if ((ch === \"'\" || ch === '\"') && \/[0-9]\/.test(pv || '') && !\/[A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u00ff]\/.test(nx || '') && !stack.some(function (x) { return x.t === (dq ? 'd' : 's'); })) {\n              out += dq ? '\u2033' : '\u2032'; lastQ = null; continue;                                          \/* medidas tras un n\u00famero: 5' 11\" a primas 5\u2032 11\u2033 *\/\n            }\n            if (sq && isL(pv) && isL(nx)) { out += ap ? '\u2019' : ch; lastQ = null; continue; }         \/* ap\u00f3strofo entre letras: it's, l'amour *\/\n            if (sq && isL(pv) && !stack.some(function (x) { return x.t === 's'; })) { out += ap ? '\u2019' : ch; lastQ = null; continue; }  \/* ap\u00f3strofo final *\/\n            var opening = ch === '\u00ab' || ch === '\u201c' || ch === '\u2018' || ch === '\u201e' || ch === '\u201a' ? true : ch === '\u00bb' || ch === '\u201d' || ch === '\u2019' ? false\n              : lastQ !== null ? lastQ : (!pv || \/[\\s(\\[{\u00bf\u00a1\u2014\u2013\\-\\\/:]\/.test(pv));\n            var type = dq ? 'd' : 's';\n            if (!opening && stack.length) {\n              var top = stack[stack.length - 1];\n              if (top.t !== type) { var j = stack.length - 1; while (j >= 0 && stack[j].t !== type) j--; if (j >= 0) { while (stack.length > j + 1) { stack.pop(); } } }\n            }\n            if (opening) { var lv = Math.min(stack.length, 2); stack.push({ t: type, l: lv }); out += LEV[st][lv][0]; }\n            else if (stack.length) { var o = stack.pop(); out += LEV[st][o.l][1]; }\n            else { out += LEV[st][0][1]; }\n            lastQ = opening;\n          }\n          return out;\n        };\n        var qupd = function () { qout.textContent = qconv(qin.value || qin.getAttribute('placeholder') || '', qstyle, !qap || qap.checked); };\n        qin.addEventListener('input', qupd); if (qap) qap.addEventListener('change', qupd);\n        Array.prototype.forEach.call(tool.querySelectorAll('[data-qs]'), function (bt, i, all) {\n          bt.addEventListener('click', function () { qstyle = bt.getAttribute('data-qs'); Array.prototype.forEach.call(all, function (x) { x.setAttribute('aria-checked', x === bt ? 'true' : 'false'); }); qupd(); });\n        });\n        qupd();\n      }\n      tool.addEventListener('click', function (e) {\n        var a = e.target.closest('[data-act=\"copy-out\"]'); if (!a) return;\n        var o = tool.querySelector('[data-dgt-' + a.getAttribute('data-src') + ']');\n        if (o && o.textContent) { copy(o.textContent); toast((U.copiado || 'Copied') + ': ' + o.textContent); }\n      });\n    });\n    \/* ---------- 2. Regla a tama\u00f1o real ---------- *\/\n    Array.prototype.forEach.call(root.querySelectorAll('[data-dgt-ruler]'), function (tool) {\n      var U = ui(tool), KEY = 'dgt-ppm', DEF = 96 \/ 25.4;\n      var box = tool.querySelector('[data-dgt-rbox]'), cv = tool.querySelector('[data-dgt-canvas]'), mark = tool.querySelector('[data-dgt-mark]');\n      var read = tool.querySelector('[data-dgt-read]'), state = tool.querySelector('[data-dgt-state]'), cal = tool.querySelector('[data-dgt-cal]');\n      var slider = tool.querySelector('[data-dgt-ppm]'), card = tool.querySelector('[data-dgt-card]'), diag = tool.querySelector('[data-dgt-diag]');\n      var unit = tool.getAttribute('data-unit') || 'cm', X0 = 16, pos = 0, saved = null;\n      try { saved = parseFloat(localStorage.getItem(KEY)); } catch (e) { saved = null; }\n      var ppm = saved && saved > 1 && saved < 20 ? saved : DEF;\n      function setState() {\n        var eq = NUM(unit === 'in' ? ppm * 25.4 : ppm * 10, 1);\n        state.innerHTML = saved ? '<b>' + esc(U.calibrada || '') + '<\/b> ' + esc((U.equiv || '1 {u} = {px} px').replace('{u}', unit === 'in' ? 'in' : 'cm').replace('{px}', eq)) : esc(U.sin_calibrar || '');\n      }\n      function fracIn(inches) {\n        var whole = Math.floor(inches), rest = Math.round((inches - whole) * 16), den = 16;\n        if (rest === 16) { whole++; rest = 0; }\n        while (rest && rest % 2 === 0) { rest \/= 2; den \/= 2; }\n        return (whole || !rest ? whole : '') + (rest ? (whole ? ' ' : '') + rest + '\/' + den : '') + ' in';\n      }\n      function readout() {\n        var mm = Math.max(0, pos) \/ ppm;\n        if (unit === 'cm') read.textContent = NUM(mm \/ 10, 2) + ' cm (' + NUM(mm, 1) + ' mm)';\n        else { var fr = fracIn(mm \/ 25.4); read.textContent = fr.indexOf('\/') > -1 ? fr + ' (' + NUM(mm \/ 25.4, 2) + ' in)' : fr; }\n        mark.setAttribute('aria-valuenow', String(Math.round(mm * 10) \/ 10)); mark.setAttribute('aria-valuetext', read.textContent);\n      }\n      function draw() {\n        var w = box.clientWidth, h = box.clientHeight, dpr = window.devicePixelRatio || 1;\n        cv.width = Math.round(w * dpr); cv.height = Math.round(h * dpr);\n        var c = cv.getContext('2d'); c.setTransform(dpr, 0, 0, dpr, 0, 0); c.clearRect(0, 0, w, h);\n        c.strokeStyle = '#16161d'; c.fillStyle = '#16161d'; c.lineWidth = 1; c.textBaseline = 'top';\n        var font = '600 13px Inter Tight, system-ui, sans-serif', small = '500 11px Inter Tight, system-ui, sans-serif';\n        function line(x, y1, y2) { var xx = Math.round(x) + 0.5; c.beginPath(); c.moveTo(xx, y1); c.lineTo(xx, y2); c.stroke(); }\n        var primary = unit, secondary = unit === 'cm' ? 'in' : 'cm';\n        [[primary, 0, 1], [secondary, h, -1]].forEach(function (cfg) {\n          var u = cfg[0], y0 = cfg[1], dir = cfg[2], isP = u === primary;\n          var sc = isP ? 1 : 0.62;\n          if (u === 'cm') {\n            for (var mm = 0; X0 + mm * ppm <= w; mm++) {\n              var x = X0 + mm * ppm, len = mm % 10 === 0 ? 40 : (mm % 5 === 0 ? 26 : 15);\n              line(x, y0, y0 + dir * len * sc);\n              if (mm % 10 === 0 && x < w - 40) { c.font = isP ? font : small; var t = String(mm \/ 10); var tw = c.measureText(t).width; c.fillText(t, mm === 0 ? x + 3 : x - tw \/ 2, dir > 0 ? y0 + 44 * sc : y0 - 44 * sc - 12); }\n            }\n            c.font = small; c.fillText('cm', w - 26, dir > 0 ? y0 + 46 * sc + (isP ? 0 : 0) : y0 - 46 * sc - 12);\n          } else {\n            var ppi = ppm * 25.4;\n            for (var s = 0; X0 + s * ppi \/ 16 <= w; s++) {\n              var xi = X0 + s * ppi \/ 16, L = s % 16 === 0 ? 40 : (s % 8 === 0 ? 30 : (s % 4 === 0 ? 22 : (s % 2 === 0 ? 15 : 9)));\n              line(xi, y0, y0 + dir * L * sc);\n              if (s % 16 === 0 && xi < w - 34) { c.font = isP ? font : small; var ti = String(s \/ 16); var twi = c.measureText(ti).width; c.fillText(ti, s === 0 ? xi + 3 : xi - twi \/ 2, dir > 0 ? y0 + 44 * sc : y0 - 44 * sc - 12); }\n            }\n            c.font = small; c.fillText('in', w - 20, dir > 0 ? y0 + 46 * sc : y0 - 46 * sc - 12);\n          }\n        });\n        mark.style.left = (X0 + pos) + 'px'; readout(); drawFixed();\n      }\n      \/* Reglas fijas (25, 20, 15, 10 y 5 cm o 12, 6, 4, 3, 2 y 1 in), con la misma calibraci\u00f3n *\/\n      var fcs = tool.querySelectorAll('[data-dgt-fc]'), U0 = tool.getAttribute('data-unit') || 'cm';\n      function drawFixed() {\n        Array.prototype.forEach.call(fcs, function (fc) {\n          var n = parseFloat(fc.getAttribute('data-n')), per = U0 === 'cm' ? ppm * 10 : ppm * 25.4, sub = U0 === 'cm' ? 10 : 16;\n          var w = Math.ceil(X0 + n * per + 34), h = 74, dpr = window.devicePixelRatio || 1;\n          fc.style.width = w + 'px'; fc.style.height = h + 'px'; fc.width = Math.round(w * dpr); fc.height = Math.round(h * dpr);\n          var c = fc.getContext('2d'); c.setTransform(dpr, 0, 0, dpr, 0, 0); c.clearRect(0, 0, w, h);\n          c.fillStyle = 'rgba(91,74,224,.10)'; c.fillRect(X0, 0, n * per, h);\n          c.strokeStyle = '#16161d'; c.fillStyle = '#16161d'; c.lineWidth = 1; c.textBaseline = 'top';\n          for (var k = 0; k <= n * sub; k++) {\n            var x = Math.round(X0 + k * per \/ sub) + 0.5, L;\n            if (U0 === 'cm') L = k % 10 === 0 ? 34 : (k % 5 === 0 ? 22 : 13);\n            else L = k % 16 === 0 ? 34 : (k % 8 === 0 ? 25 : (k % 4 === 0 ? 18 : (k % 2 === 0 ? 12 : 8)));\n            c.beginPath(); c.moveTo(x, 0); c.lineTo(x, L); c.stroke();\n            if (k % sub === 0) { c.font = '600 12px Inter Tight, system-ui, sans-serif'; var t = String(k \/ sub), tw = c.measureText(t).width; c.fillText(t, k === 0 ? x + 3 : x - tw \/ 2, 38); }\n          }\n          c.strokeStyle = '#e11d48'; c.lineWidth = 2;\n          [X0, X0 + n * per].forEach(function (xx) { c.beginPath(); c.moveTo(Math.round(xx) + 0.5, 0); c.lineTo(Math.round(xx) + 0.5, h); c.stroke(); });\n          c.font = '600 12px Inter Tight, system-ui, sans-serif'; c.fillStyle = '#e11d48';\n          var lab = NUM(n, 1) + ' ' + U0; c.fillText(lab, X0 + n * per - c.measureText(lab).width - 6, h - 17);\n        });\n      }\n      function setPos(px) { pos = Math.max(0, Math.min(px, box.clientWidth - X0 - 2)); mark.style.left = (X0 + pos) + 'px'; readout(); }\n      function fromEvent(e) { var r = box.getBoundingClientRect(); setPos((e.touches ? e.touches[0].clientX : e.clientX) - r.left - X0); }\n      var dragging = false;\n      mark.addEventListener('pointerdown', function (e) { dragging = true; try { mark.setPointerCapture(e.pointerId); } catch (x) { \/* nada *\/ } e.preventDefault(); });\n      mark.addEventListener('pointermove', function (e) { if (dragging) fromEvent(e); });\n      mark.addEventListener('pointerup', function () { dragging = false; });\n      box.addEventListener('click', function (e) { if (e.target === mark || mark.contains(e.target)) return; fromEvent(e); });\n      mark.addEventListener('keydown', function (e) {\n        var step = unit === 'cm' ? ppm : ppm * 25.4 \/ 16, big = unit === 'cm' ? ppm * 10 : ppm * 25.4;\n        if (e.key === 'ArrowRight' || e.key === 'ArrowUp') { setPos(pos + (e.shiftKey ? big : step)); e.preventDefault(); }\n        if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') { setPos(pos - (e.shiftKey ? big : step)); e.preventDefault(); }\n        if (e.key === 'Home') { setPos(0); e.preventDefault(); }\n      });\n      \/* Ir a una medida: coloca el marcador en la medida escrita *\/\n      var gin = tool.querySelector('[data-dgt-goto]'), gu = tool.querySelector('[data-dgt-gu]');\n      function gotoM() {\n        if (!gin) return;\n        var v = parseFloat(String(gin.value).replace(',', '.')); if (!(v >= 0)) return;\n        var px = v * (unit === 'cm' ? 10 : 25.4) * ppm, mx = box.clientWidth - X0 - 2;\n        if (px > mx) { setPos(mx); var fit = mx \/ ppm \/ (unit === 'cm' ? 10 : 25.4); toast((U.no_cabe || '{n}').replace('{n}', NUM(Math.floor(fit * 10) \/ 10, 1) + ' ' + unit)); }\n        else setPos(px);\n      }\n      if (gin) { var gt = 0; gin.addEventListener('input', function () { clearTimeout(gt); gt = setTimeout(gotoM, 250); }); gin.addEventListener('keydown', function (e) { if (e.key === 'Enter') { clearTimeout(gt); gotoM(); } }); }\n      Array.prototype.forEach.call(tool.querySelectorAll('[data-u]'), function (bt, i, all) {\n        bt.addEventListener('click', function () {\n          unit = bt.getAttribute('data-u');\n          Array.prototype.forEach.call(all, function (x) { x.setAttribute('aria-checked', x === bt ? 'true' : 'false'); });\n          if (gu) gu.textContent = unit;\n          setState(); draw(); if (gin && gin.value) gotoM();\n        });\n      });\n      function cardSize() { if (card) card.style.width = (85.6 * ppm) + 'px'; if (slider) slider.value = ppm; }\n      tool.addEventListener('click', function (e) {\n        var a = e.target.closest('[data-act]'); if (!a) return;\n        var act = a.getAttribute('data-act');\n        if (act === 'calibrar') { cal.hidden = !cal.hidden; cardSize(); if (!cal.hidden) cal.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }\n        if (act === 'cal-menos') { ppm = Math.max(2.4, ppm - 0.005); cardSize(); draw(); }\n        if (act === 'cal-mas') { ppm = Math.min(9, ppm + 0.005); cardSize(); draw(); }\n        if (act === 'cal-diag') {\n          var dg = parseFloat(String(diag.value).replace(',', '.'));\n          if (dg > 2) { ppm = Math.hypot(screen.width, screen.height) \/ dg \/ 25.4; cardSize(); draw(); }\n        }\n        if (act === 'cal-ok') { saved = ppm; try { localStorage.setItem(KEY, String(ppm)); } catch (x) { \/* nada *\/ } setState(); cal.hidden = true; toast(U.guardada || 'OK'); }\n        if (act === 'cal-reset') { ppm = DEF; saved = null; try { localStorage.removeItem(KEY); } catch (x) { \/* nada *\/ } cardSize(); setState(); draw(); }\n        if (act === 'pantalla') {\n          var on = !root.classList.contains('is-full');\n          var fsOk = tool.requestFullscreen && !d.fullscreenElement;\n          if (on && fsOk) { tool.requestFullscreen().catch(function () { \/* nada *\/ }); }\n          if (!on && d.fullscreenElement) { d.exitFullscreen().catch(function () { \/* nada *\/ }); }\n          root.classList.toggle('is-full', on); a.setAttribute('aria-pressed', on ? 'true' : 'false');\n          setTimeout(draw, 120);\n        }\n      });\n      d.addEventListener('fullscreenchange', function () { if (!d.fullscreenElement && root.classList.contains('is-full')) { root.classList.remove('is-full'); var p = tool.querySelector('[data-act=\"pantalla\"]'); if (p) p.setAttribute('aria-pressed', 'false'); setTimeout(draw, 120); } });\n      d.addEventListener('keydown', function (e) { if (e.key === 'Escape' && root.classList.contains('is-full')) { root.classList.remove('is-full'); setTimeout(draw, 120); } });\n      if (slider) slider.addEventListener('input', function () { ppm = parseFloat(slider.value); cardSize(); draw(); });\n      var rt = 0; window.addEventListener('resize', function () { clearTimeout(rt); rt = setTimeout(draw, 120); });\n      setState(); cardSize(); draw(); setPos(ppm * (unit === 'cm' ? 50 : 25.4 * 2));\n    });\n    \/* ---------- 3. Colores ---------- *\/\n    Array.prototype.forEach.call(root.querySelectorAll('[data-dgt-colors]'), function (tool) {\n      var U = ui(tool), cur = { r: 91, g: 74, b: 224 }, fmt = 'hex';\n      var show = detailPanel(tool, U);\n      var sw = tool.querySelector('.dgt-pick-sw'), cin = tool.querySelector('[data-dgt-cin]');\n      var F = {}; Array.prototype.forEach.call(tool.querySelectorAll('[data-fmt]'), function (i) { F[i.getAttribute('data-fmt')] = i; });\n      function h2(n) { return ('0' + n.toString(16)).slice(-2).toUpperCase(); }\n      function hex(c) { return '#' + h2(c.r) + h2(c.g) + h2(c.b); }\n      function parseHex(s) { var m = String(s).trim().replace('#', ''); if (\/^[0-9a-f]{3}$\/i.test(m)) m = m.replace(\/(.)\/g, '$1$1'); if (!\/^[0-9a-f]{6}$\/i.test(m)) return null; return { r: parseInt(m.slice(0, 2), 16), g: parseInt(m.slice(2, 4), 16), b: parseInt(m.slice(4, 6), 16) }; }\n      function toHsl(c) {\n        var r = c.r \/ 255, g = c.g \/ 255, b = c.b \/ 255, mx = Math.max(r, g, b), mn = Math.min(r, g, b), h = 0, s = 0, l = (mx + mn) \/ 2;\n        if (mx !== mn) { var dd = mx - mn; s = l > 0.5 ? dd \/ (2 - mx - mn) : dd \/ (mx + mn); h = mx === r ? (g - b) \/ dd + (g < b ? 6 : 0) : mx === g ? (b - r) \/ dd + 2 : (r - g) \/ dd + 4; h *= 60; }\n        return { h: Math.round(h), s: Math.round(s * 100), l: Math.round(l * 100) };\n      }\n      function fromHsl(h, s, l) {\n        s \/= 100; l \/= 100; var k = function (n) { return (n + h \/ 30) % 12; }, a = s * Math.min(l, 1 - l);\n        var f = function (n) { return l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1))); };\n        return { r: Math.round(f(0) * 255), g: Math.round(f(8) * 255), b: Math.round(f(4) * 255) };\n      }\n      function rgbS(c) { return 'rgb(' + c.r + ', ' + c.g + ', ' + c.b + ')'; }\n      function hslS(c) { var x = toHsl(c); return 'hsl(' + x.h + ', ' + x.s + '%, ' + x.l + '%)'; }\n      function cmykS(c) {\n        var r = c.r \/ 255, g = c.g \/ 255, b = c.b \/ 255, k = 1 - Math.max(r, g, b);\n        if (k >= 1) return 'cmyk(0%, 0%, 0%, 100%)';\n        var p = function (x) { return Math.round((1 - x - k) \/ (1 - k) * 100) + '%'; };\n        return 'cmyk(' + p(r) + ', ' + p(g) + ', ' + p(b) + ', ' + Math.round(k * 100) + '%)';\n      }\n      function lum(c) { var a = [c.r, c.g, c.b].map(function (v) { v \/= 255; return v <= 0.03928 ? v \/ 12.92 : Math.pow((v + 0.055) \/ 1.055, 2.4); }); return 0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2]; }\n      function ratio(a, b2) { var l1 = lum(a), l2 = lum(b2), hi = Math.max(l1, l2), lo = Math.min(l1, l2); return (hi + 0.05) \/ (lo + 0.05); }\n      function badge(r) { return r >= 7 ? 'AAA' : r >= 4.5 ? 'AA' : r >= 3 ? (U.aa_grande || 'AA large') : (U.no_pasa || 'Fail'); }\n      var ct = tool.querySelector('[data-dgt-contrast]');\n      function paint(skip) {\n        var hx = hex(cur);\n        tool.style.setProperty('--c', hx); sw.style.setProperty('--c', hx);\n        if (cin && skip !== 'cin') cin.value = hx.toLowerCase();\n        if (skip !== 'hex') F.hex.value = hx;\n        if (skip !== 'rgb') F.rgb.value = rgbS(cur);\n        if (skip !== 'hsl') F.hsl.value = hslS(cur);\n        F.cmyk.value = cmykS(cur);\n        if (ct) {\n          var rw = ratio(cur, { r: 255, g: 255, b: 255 }), rb = ratio(cur, { r: 0, g: 0, b: 0 });\n          ct.querySelector('[data-f=\"rw\"]').textContent = NUM(Math.floor(rw * 100) \/ 100, 2) + ':1'; ct.querySelector('[data-f=\"bw\"]').textContent = badge(rw);\n          ct.querySelector('[data-f=\"rb\"]').textContent = NUM(Math.floor(rb * 100) \/ 100, 2) + ':1'; ct.querySelector('[data-f=\"bb\"]').textContent = badge(rb);\n        }\n      }\n      if (cin) cin.addEventListener('input', function () { var c = parseHex(cin.value); if (c) { cur = c; paint('cin'); } });\n      F.hex.addEventListener('input', function () { var c = parseHex(F.hex.value); if (c) { cur = c; paint('hex'); } });\n      F.rgb.addEventListener('input', function () { var m = F.rgb.value.match(\/\\d+(\\.\\d+)?\/g); if (m && m.length >= 3) { var c = { r: Math.min(255, +m[0] | 0), g: Math.min(255, +m[1] | 0), b: Math.min(255, +m[2] | 0) }; cur = c; paint('rgb'); } });\n      F.hsl.addEventListener('input', function () { var m = F.hsl.value.match(\/\\d+(\\.\\d+)?\/g); if (m && m.length >= 3) { cur = fromHsl(+m[0] % 360, Math.min(100, +m[1]), Math.min(100, +m[2])); paint('hsl'); } });\n      Array.prototype.forEach.call(tool.querySelectorAll('[data-fmt]'), function (inp) {\n        inp.addEventListener('focus', function () { inp.select(); });\n      });\n      var ed = tool.querySelector('[data-act=\"eyedropper\"]');\n      if (ed && window.EyeDropper) {\n        ed.hidden = false;\n        ed.addEventListener('click', function () { new window.EyeDropper().open().then(function (r) { var c = parseHex(r.sRGBHex); if (c) { cur = c; paint(); copy(hex(c)); toast((U.copiado || 'Copied') + ': ' + hex(c)); } }).catch(function () { \/* cancelado *\/ }); });\n      }\n      var fin = tool.querySelector('[data-dgt-img]'), ibox = tool.querySelector('[data-dgt-imgbox]'), icv = tool.querySelector('[data-dgt-imgc]');\n      if (fin) fin.addEventListener('change', function () {\n        var f = fin.files && fin.files[0]; if (!f) return;\n        var url = URL.createObjectURL(f), img = new Image();\n        img.onload = function () {\n          var mw = Math.min(900, ibox.parentNode.clientWidth || 900), sc = Math.min(1, mw \/ img.width);\n          icv.width = Math.round(img.width * sc); icv.height = Math.round(img.height * sc);\n          icv.getContext('2d').drawImage(img, 0, 0, icv.width, icv.height); ibox.hidden = false; URL.revokeObjectURL(url);\n        };\n        img.src = url;\n      });\n      if (icv) icv.addEventListener('click', function (e) {\n        var r = icv.getBoundingClientRect(), x = Math.floor((e.clientX - r.left) * icv.width \/ r.width), y = Math.floor((e.clientY - r.top) * icv.height \/ r.height);\n        var p = icv.getContext('2d').getImageData(x, y, 1, 1).data; cur = { r: p[0], g: p[1], b: p[2] }; paint();\n        copy(hex(cur)); toast((U.copiado || 'Copied') + ': ' + hex(cur));\n      });\n      Array.prototype.forEach.call(tool.querySelectorAll('[data-fmtc]'), function (bt, i, all) {\n        bt.addEventListener('click', function () { fmt = bt.getAttribute('data-fmtc'); Array.prototype.forEach.call(all, function (x) { x.setAttribute('aria-checked', x === bt ? 'true' : 'false'); }); });\n      });\n      var sws = Array.prototype.slice.call(tool.querySelectorAll('.dgt-c'));\n      var idx = sws.map(function (el) { return { el: el, hay: norm((el.getAttribute('data-k') || '') + ' #' + el.getAttribute('data-h') + ' ' + el.getAttribute('data-h')), grp: el.closest('.dgt-grp') }; });\n      var q = tool.querySelector('[data-dgt-q]'), empty = tool.querySelector('[data-dgt-empty]'), groups = Array.prototype.slice.call(tool.querySelectorAll('.dgt-grp')), curG = '*';\n      function filter() {\n        var s = norm(q.value.trim()).replace(\/^#\/, ''), any = false, terms = s ? s.split(\/\\s+\/) : [];\n        idx.forEach(function (o) { var okG = curG === '*' || o.grp.getAttribute('data-g') === curG; var okQ = !terms.length || terms.every(function (t) { return o.hay.indexOf(t) > -1; }); o.el.hidden = !(okG && okQ); });\n        groups.forEach(function (g) {\n          Array.prototype.forEach.call(g.querySelectorAll('.dgt-cgrid'), function (gr) { var has = !!gr.querySelector('.dgt-c:not([hidden])'); gr.hidden = !has; var pv = gr.previousElementSibling; if (pv && pv.classList.contains('dgt-sh')) pv.hidden = !has; });\n          Array.prototype.forEach.call(g.querySelectorAll('.dgt-trow'), function (tr) { tr.hidden = !tr.querySelector('.dgt-c:not([hidden])'); });\n          var vis = !!g.querySelector('.dgt-c:not([hidden])'); g.hidden = !vis; any = any || vis;\n        });\n        empty.hidden = any;\n      }\n      var tq = 0; q.addEventListener('input', function () { clearTimeout(tq); tq = setTimeout(filter, 110); });\n      Array.prototype.forEach.call(tool.querySelectorAll('.dgt-chips button'), function (bt, i, all) {\n        bt.addEventListener('click', function () { Array.prototype.forEach.call(all, function (x) { x.classList.toggle('is-on', x === bt); }); curG = bt.getAttribute('data-g'); filter(); });\n      });\n      tool.addEventListener('click', function (e) {\n        var el = e.target.closest('.dgt-c'); if (!el) return;\n        var c = parseHex(el.getAttribute('data-h')); if (!c) return;\n        cur = c; paint();\n        var val = fmt === 'rgb' ? rgbS(c) : fmt === 'hsl' ? hslS(c) : hex(c);\n        copy(val); el.classList.add('is-copied'); setTimeout(function () { el.classList.remove('is-copied'); }, 1200);\n        toast((U.copiado || 'Copied') + ': ' + val);\n        var nm = el.querySelector('b'), sm = el.querySelector('small');\n        var name = (nm ? nm.textContent : (el.getAttribute('aria-label') || hex(c))) + (sm && nm ? ' (' + sm.textContent + ')' : '');\n        var css = el.getAttribute('data-css');\n        show('', name, [['HEX', hex(c)], ['RGB', rgbS(c)], ['HSL', hslS(c)], ['CMYK', cmykS(c)], css ? ['CSS', css] : null], hex(c));\n      });\n      \/* Comprobador de contraste entre dos colores (WCAG 2.2: 4,5:1 y 7:1 texto normal; 3:1 y 4,5:1 texto grande; 3:1 iconos y bordes) *\/\n      var cc = tool.querySelector('[data-dgt-cc]');\n      if (cc) {\n        var CC = {}; Array.prototype.forEach.call(cc.querySelectorAll('[data-cc]'), function (el) { CC[el.getAttribute('data-cc')] = el; });\n        var col = { fg: parseHex(CC.fg.value) || { r: 91, g: 74, b: 224 }, bg: parseHex(CC.bg.value) || { r: 255, g: 255, b: 255 } };\n        var ccPaint = function (skip) {\n          ['fg', 'bg'].forEach(function (k) { var hx = hex(col[k]); if (skip !== k) CC[k].value = hx; if (skip !== k + 'c') CC[k + 'c'].value = hx.toLowerCase(); });\n          CC.prev.style.color = hex(col.fg); CC.prev.style.background = hex(col.bg);\n          var r = ratio(col.fg, col.bg); CC.ratio.textContent = NUM(Math.floor(r * 100) \/ 100, 2) + ':1';\n          ['aa', 'aaa', 'aal', 'aaal', 'ui'].forEach(function (k) {\n            var li = CC[k], ok = r >= parseFloat(li.getAttribute('data-min'));\n            li.classList.toggle('is-ok', ok); li.classList.toggle('is-ko', !ok);\n            li.querySelector('b').textContent = ok ? (U.pasa || 'Pass') : (U.no_pasa || 'Fail');\n          });\n        };\n        ['fg', 'bg'].forEach(function (k) {\n          CC[k].addEventListener('input', function () { var c = parseHex(CC[k].value); if (c) { col[k] = c; ccPaint(k); } });\n          CC[k + 'c'].addEventListener('input', function () { var c = parseHex(CC[k + 'c'].value); if (c) { col[k] = c; ccPaint(k + 'c'); } });\n          CC[k].addEventListener('focus', function () { CC[k].select(); });\n        });\n        cc.addEventListener('click', function (e) {\n          var a = e.target.closest('[data-act]'); if (!a) return;\n          if (a.getAttribute('data-act') === 'cc-swap') { var t = col.fg; col.fg = col.bg; col.bg = t; ccPaint(); }\n          if (a.getAttribute('data-act') === 'cc-use') { col[a.getAttribute('data-t')] = { r: cur.r, g: cur.g, b: cur.b }; ccPaint(); }\n        });\n        ccPaint();\n      }\n      paint();\n    });\n    \/* Preguntas frecuentes: solo una abierta a la vez (de entrada, la primera) *\/\n    var fbs = root.querySelectorAll('.dgv-faq-btn');\n    Array.prototype.forEach.call(fbs, function (btn) {\n      btn.addEventListener('click', function () {\n        setTimeout(function () {\n          if (btn.getAttribute('aria-expanded') !== 'true') return;\n          Array.prototype.forEach.call(fbs, function (o) {\n            if (o === btn || o.getAttribute('aria-expanded') !== 'true') return;\n            o.setAttribute('aria-expanded', 'false'); var it = o.closest('.dgv-faq-item'); if (it) it.classList.remove('is-open');\n          });\n        }, 0);\n      });\n    });\n  }\n  if (d.readyState === 'loading') d.addEventListener('DOMContentLoaded', go); else go();\n})();\n<\/script><\/div><\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"estilo_pagina_titulo":"","estilo_pagina_descripcion":"","estilo_pagina_imagen":"","_joinchat":[],"footnotes":""},"estilo_pagina":[],"class_list":["post-27401389","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.digiaccion.com\/en\/wp-json\/wp\/v2\/pages\/27401389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.digiaccion.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.digiaccion.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.digiaccion.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.digiaccion.com\/en\/wp-json\/wp\/v2\/comments?post=27401389"}],"version-history":[{"count":3,"href":"https:\/\/www.digiaccion.com\/en\/wp-json\/wp\/v2\/pages\/27401389\/revisions"}],"predecessor-version":[{"id":27401392,"href":"https:\/\/www.digiaccion.com\/en\/wp-json\/wp\/v2\/pages\/27401389\/revisions\/27401392"}],"wp:attachment":[{"href":"https:\/\/www.digiaccion.com\/en\/wp-json\/wp\/v2\/media?parent=27401389"}],"wp:term":[{"taxonomy":"estilo_pagina","embeddable":true,"href":"https:\/\/www.digiaccion.com\/en\/wp-json\/wp\/v2\/estilo_pagina?post=27401389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}