// decorative.jsx — Decorative elements & patterns (expanded). // Reusable visual vocabulary for the institutional site, posters, // social, certificates, receipts. const FIVE = ['var(--ceu)', 'var(--ceramica)', 'var(--sol)', 'var(--rosa)', 'var(--folha)']; // ──────────────────────────────────────────────────────────────── // CATEGORY · DIVIDERS — discrete units between content blocks // ──────────────────────────────────────────────────────────────── // 01 — Five Dots function DecFiveDots({ size = 10, gap = 12, colors = FIVE }) { return (
{colors.map((c, i) => ( ))}
); } // 02 — Five Triangles function DecFiveTriangles({ size = 16, gap = 5 }) { return ( {FIVE.map((c, i) => { const x = i * (size + gap); return ( ); })} ); } // 03 — Five Squares (rotated 45°) function DecFiveDiamonds({ size = 12, gap = 8 }) { return (
{FIVE.map((c, i) => ( ))}
); } // 04 — Five Bars (varying heights — references the original child drawing) function DecFiveBars({ unit = 8, gap = 4, max = 5 }) { const heights = [3, 5, 5, 2, 4]; return (
{FIVE.map((c, i) => ( ))}
); } // 05 — Roof Rule (horizontal rule with house-roof apex) function DecRoofRule({ width = 280, height = 28, color = 'var(--ink)' }) { const mid = width / 2; return ( ); } // 06 — Five Roof Rule (5 small roofs centered) function DecFiveRoofs({ unit = 16, gap = 6 }) { return ( {FIVE.map((c, i) => { const x = i * (unit + gap); return ( ); })} ); } // 07 — Section Mark (small house silhouette · use before section labels) function DecSectionMark({ size = 18 }) { return ( ); } // ──────────────────────────────────────────────────────────────── // CATEGORY · LINE ART — long-form decoration for marginalia, page edges // ──────────────────────────────────────────────────────────────── // 08 — Caminho (winding dashed path with sun) function DecPath({ width = 280, height = 60, sun = true }) { return ( {sun && ( )} ); } // 09 — Vertical caminho — same path rotated, for page margins function DecPathVertical({ width = 60, height = 280 }) { return ( ); } // 10 — Quote marks (large editorial quote) function DecQuoteMark({ size = 80, color = 'var(--sol)' }) { return ( ); } // 11 — Page corner ornament (top-left) function DecCornerOrnament({ size = 60, position = 'tl' }) { // position: tl, tr, bl, br const rotate = { tl: 0, tr: 90, br: 180, bl: 270 }[position]; return ( ); } // ──────────────────────────────────────────────────────────────── // CATEGORY · RAYS / SUN — light motifs // ──────────────────────────────────────────────────────────────── // 12 — Sunburst (rays from a corner) function DecSunburst({ size = 220, origin = 'bl' }) { let cx = 0, cy = size; if (origin === 'br') { cx = size; cy = size; } if (origin === 'tl') { cx = 0; cy = 0; } if (origin === 'tr') { cx = size; cy = 0; } if (origin === 'c') { cx = size / 2; cy = size / 2; } return ( {Array.from({ length: 14 }).map((_, i) => { const angle = origin === 'bl' ? (i / 14) * 90 - 90 : origin === 'br' ? 180 + (i / 14) * 90 : origin === 'tl' ? (i / 14) * 90 : origin === 'tr' ? 90 + (i / 14) * 90 : i * (360 / 14); const rad = (angle * Math.PI) / 180; const len = size * (i % 3 === 0 ? 0.95 : 0.82); const ex = cx + Math.cos(rad) * len; const ey = cy + Math.sin(rad) * len; return ( ); })} ); } // 13 — Single sun (sol) symbol function DecSun({ size = 60, rays = true }) { return ( {rays && Array.from({ length: 8 }).map((_, i) => { const a = (i * 360) / 8; const rad = (a * Math.PI) / 180; return ( ); })} ); } // 14 — Half-sun (horizon line) function DecHalfSun({ width = 140, height = 70 }) { return ( {[0, 1, 2, 3, 4].map((i) => { const a = -180 + (i / 4) * 180; const rad = (a * Math.PI) / 180; return ( ); })} ); } // ──────────────────────────────────────────────────────────────── // CATEGORY · PATTERNS — full tile fills // ──────────────────────────────────────────────────────────────── // 15 — Roof pattern function DecPatternRoofs({ density = 40, opacity = 0.35 }) { return ( ); } // 16 — Dots pattern (palette dots scattered on a grid) function DecPatternDots({ tile = 32 }) { return ( {FIVE.map((c, i) => ( ))} ); } // 17 — Path pattern (winding caminhos repeated) function DecPatternPath() { const tile = 80; return ( ); } // 18 — Houses+dots pattern (richer fill) function DecPatternHouses() { const tile = 80; return ( {[-10, -5, 0, 5, 10].map((x, i) => ( ))} ); } // 19 — Cross-stitch grid pattern (referencing the embroidery feel) function DecPatternStitch() { const tile = 18; return ( ); } // ──────────────────────────────────────────────────────────────── // CATEGORY · BIGGER SCENES // ──────────────────────────────────────────────────────────────── // 20 — Skyline of small houses (used in footers, hero backgrounds) function DecSkyline({ width = 1080, height = 80 }) { // SVG dims match container — no preserveAspectRatio crop. Houses sit on // the baseline; total house height < container height, so roofs always // have headroom. const baseline = height - 2; const houses = [ { x: 30, w: 36 }, { x: 85, w: 44 }, { x: 145, w: 56 }, { x: 215, w: 42 }, { x: 275, w: 48 }, { x: 340, w: 38 }, { x: 395, w: 52 }, { x: 465, w: 44 }, { x: 525, w: 50 }, { x: 590, w: 40 }, { x: 645, w: 56 }, { x: 715, w: 38 }, { x: 770, w: 50 }, { x: 835, w: 44 }, { x: 895, w: 56 }, { x: 965, w: 40 }, { x: 1020, w: 48 }, ]; return ( {houses.map((h, i) => { const c = FIVE[i % 5]; const roofH = h.w * 0.40; const bodyH = h.w * 0.55; const y = baseline - (roofH + bodyH); return ( ); })} ); } // 21 — Constellation of children figures (decorative scatter) function DecConstellation({ width = 600, height = 200 }) { const figures = [ { x: 60, y: 70, h: 26, c: FIVE[0] }, { x: 130, y: 130, h: 36, c: FIVE[1] }, { x: 200, y: 60, h: 22, c: FIVE[2] }, { x: 280, y: 150, h: 30, c: FIVE[3] }, { x: 350, y: 90, h: 40, c: FIVE[4] }, { x: 430, y: 140, h: 32, c: FIVE[0] }, { x: 510, y: 70, h: 24, c: FIVE[1] }, { x: 560, y: 130, h: 36, c: FIVE[2] }, ]; return ( {figures.map((f, i) => ( ))} ); } // ──────────────────────────────────────────────────────────────── // Showcase artboard — lays everything out for review // ──────────────────────────────────────────────────────────────── function DecorativeShowcase() { const Group = ({ label, children }) => (
{label}
{children}
); return (
Elementos decorativos
21 unidades
nossa equipe
); } function DecorativePatternShowcase() { return (
Padrões
5 tiles
{[ { label: '15 · Telhados', el: }, { label: '16 · Cinco cores', el: }, { label: '17 · Caminhos', el: }, { label: '18 · Casas + cores', el: }, { label: '19 · Ponto-cruz', el: }, ].map((p, i) => (
{p.label}
{p.el}
))}
); } Object.assign(window, { DecFiveDots, DecFiveTriangles, DecFiveDiamonds, DecFiveBars, DecRoofRule, DecFiveRoofs, DecSectionMark, DecPath, DecPathVertical, DecQuoteMark, DecCornerOrnament, DecSunburst, DecSun, DecHalfSun, DecPatternRoofs, DecPatternDots, DecPatternPath, DecPatternHouses, DecPatternStitch, DecSkyline, DecConstellation, DecorativeShowcase, DecorativePatternShowcase, DEC_FIVE: FIVE, });