Maya Relief

3D & Depth · Static · pure CSS

Each glyph sits in its own rounded-square limestone cell, carved via a real SVG lighting chain — blurred alpha height-map into feDiffuseLighting and feSpecularLighting — so the letterform pillows out of the stone under a raking overhead sun, while a turbulence pass weathers mortar, cell and glyph alike into an eroded stela. Choose limestone, basalt or jade and tune relief depth, weathering and cell roundness: a carved cartouche band, not a flat machined plate.

Maya Relief

How it works

Maya Relief is a static 3d & depth text effect rendered entirely in CSS. Each character is wrapped in its own span so it can animate independently — the HTML and JSX exports include that per-letter markup. It relies on an inline SVG <defs> block (filters, gradients or clip-paths), which the HTML export carries alongside the CSS.

Controls

Maya Relief exposes 4 dedicated controls — Stone, Relief Depth, Weathering and Cell Corners — on top of the shared type controls (font, weight, letter-spacing and case). Open it in the generator to tune every value live, then copy the updated CSS.

CSS

/* Maya Relief — made with TEXT-FX · https://text-fx.app
 * HTML: each character is wrapped in a <span> — see the HTML export; requires the inline <svg> filter defs — see the HTML export.
 * Font: 'Recursive', sans-serif (load from Google Fonts).
 */

.text-effect {
  font-family: 'Recursive', sans-serif;
  font-weight: 400;
  letter-spacing: 0px;
  text-transform: none;
}

.text-effect {
  position: relative;
  display: inline-flex;
  flex-wrap: nowrap;
  max-width: 100%;
  align-items: center;
  line-height: 1;
  gap: 0.26em;
  padding: 0.34em;
  background: hsl(34 24% 20%);
  border-radius: 0.256em;
  box-shadow: inset 0 0.05em 0 hsl(0 0% 100% / 0.06), inset 0 -0.05em 0.1em hsl(0 0% 0% / 0.55), 0 0.16em 0.3em hsl(0 0% 0% / 0.55);
  filter: url(#text-effect-weather);
}
.text-effect .fx-ch {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  width: 1.32em;
  height: 1.32em;
  border-radius: 24%;
  background: hsl(34 24% 40%);
  border: 0.055em solid hsl(34 30% 13%);
  box-shadow: 0 0.08em 0.16em hsl(0 0% 0% / 0.62), inset 0 0.05em 0.03em hsl(34 24% 78% / 0.1), inset 0 -0.07em 0.05em hsl(34 32% 4% / 0.5);
  overflow: hidden;
  transform: rotate(var(--rot, 0deg)) translateY(var(--jy, 0em));
}
.text-effect .fx-ch.fx-sp {
  width: 0.46em;
  background: none;
  border: none;
  box-shadow: none;
}
.text-effect .fx-glyph {
  position: relative;
  display: inline-block;
  font-size: 0.86em;
  line-height: 1;
  color: #c5b5a0;
  filter: url(#text-effect-carve);
}

HTML

This effect needs the markup below (per-letter spans, SVG defs, or a data-text attribute).

<!-- Made with TEXT-FX · https://text-fx.app -->

<style>
.text-effect {
  font-family: 'Recursive', sans-serif;
  font-weight: 400;
  letter-spacing: 0px;
  text-transform: none;
}

.text-effect {
  position: relative;
  display: inline-flex;
  flex-wrap: nowrap;
  max-width: 100%;
  align-items: center;
  line-height: 1;
  gap: 0.26em;
  padding: 0.34em;
  background: hsl(34 24% 20%);
  border-radius: 0.256em;
  box-shadow: inset 0 0.05em 0 hsl(0 0% 100% / 0.06), inset 0 -0.05em 0.1em hsl(0 0% 0% / 0.55), 0 0.16em 0.3em hsl(0 0% 0% / 0.55);
  filter: url(#text-effect-weather);
}
.text-effect .fx-ch {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  width: 1.32em;
  height: 1.32em;
  border-radius: 24%;
  background: hsl(34 24% 40%);
  border: 0.055em solid hsl(34 30% 13%);
  box-shadow: 0 0.08em 0.16em hsl(0 0% 0% / 0.62), inset 0 0.05em 0.03em hsl(34 24% 78% / 0.1), inset 0 -0.07em 0.05em hsl(34 32% 4% / 0.5);
  overflow: hidden;
  transform: rotate(var(--rot, 0deg)) translateY(var(--jy, 0em));
}
.text-effect .fx-ch.fx-sp {
  width: 0.46em;
  background: none;
  border: none;
  box-shadow: none;
}
.text-effect .fx-glyph {
  position: relative;
  display: inline-block;
  font-size: 0.86em;
  line-height: 1;
  color: #c5b5a0;
  filter: url(#text-effect-carve);
}
</style>

<svg width="0" height="0" style="position:absolute" aria-hidden="true"><defs>
<filter id="text-effect-carve" x="-45%" y="-45%" width="190%" height="190%" color-interpolation-filters="sRGB">
  <feGaussianBlur in="SourceAlpha" stdDeviation="3.55" result="bump"/>
  <feDiffuseLighting in="bump" surfaceScale="7.2" diffuseConstant="0.98" lighting-color="#c5b5a0" result="diffuse">
    <feDistantLight azimuth="268" elevation="44"/>
  </feDiffuseLighting>
  <feSpecularLighting in="bump" surfaceScale="7.2" specularConstant="0.06" specularExponent="6" lighting-color="#cec1ab" result="spec">
    <feDistantLight azimuth="268" elevation="44"/>
  </feSpecularLighting>
  <feComposite in="spec" in2="SourceAlpha" operator="in" result="specClip"/>
  <feComposite in="specClip" in2="diffuse" operator="arithmetic" k1="0" k2="1" k3="1" k4="0" result="lit"/>
  <feComposite in="lit" in2="SourceAlpha" operator="in" result="relief"/>
  <feMorphology in="SourceAlpha" operator="dilate" radius="1.34" result="fat"/>
  <feFlood flood-color="#1a150f" flood-opacity="0.72" result="rimC"/>
  <feComposite in="rimC" in2="fat" operator="in" result="rim"/>
  <feMerge>
    <feMergeNode in="rim"/>
    <feMergeNode in="relief"/>
  </feMerge>
</filter>
<filter id="text-effect-weather" x="-30%" y="-30%" width="160%" height="160%" color-interpolation-filters="sRGB">
  <feTurbulence type="fractalNoise" baseFrequency="0.75 0.8" numOctaves="2" seed="9" result="n"/>
  <feColorMatrix in="n" type="matrix" values="0 0 0 0 0  0 0 0 0 0  0 0 0 0 0  0.25 0 0 0 0" result="speck"/>
  <feComposite in="speck" in2="SourceAlpha" operator="in" result="speckClip"/>
  <feBlend in="SourceGraphic" in2="speckClip" mode="multiply"/>
</filter>
</defs></svg>

<div class="text-effect"><span class="fx-ch" style="--i:0;--rot:0.13deg;--jy:0.003em"><span class="fx-glyph">Y</span></span><span class="fx-ch" style="--i:1;--rot:1.41deg;--jy:-0.032em"><span class="fx-glyph">o</span></span><span class="fx-ch" style="--i:2;--rot:-0.63deg;--jy:-0.021em"><span class="fx-glyph">u</span></span><span class="fx-ch" style="--i:3;--rot:0.1deg;--jy:0.026em"><span class="fx-glyph">r</span></span><span class="fx-ch fx-sp" style="--i:4"> </span><span class="fx-ch" style="--i:5;--rot:1.06deg;--jy:0.028em"><span class="fx-glyph">t</span></span><span class="fx-ch" style="--i:6;--rot:1.4deg;--jy:-0.027em"><span class="fx-glyph">e</span></span><span class="fx-ch" style="--i:7;--rot:-0.01deg;--jy:-0.02em"><span class="fx-glyph">x</span></span><span class="fx-ch" style="--i:8;--rot:1.2deg;--jy:0em"><span class="fx-glyph">t</span></span></div>
Category
3D & Depth
Type
Static
Browser support
SVG feDiffuse/feSpecularLighting pillow-relief per glyph + a single feTurbulence weathering pass via filter:url(#…); best in Chromium & Firefox
Capabilities
perLetter, svgDefs

Related 3D & Depth effects