experiment
Explore creation
A bold SVG poster generator built from a seeded grid of arcs and blocks. Change the edition or palette w…
An original layered SVG flower generated from polar coordinates. Change petal count, seed and palette to explore botanical forms.
<!-- Original layout, SVG/CSS artwork and JavaScript © 2026 XXC Templates. MIT License.
Illustrative sample content and data; no real accounts, purchases or bookings. -->
<main>
<header class="intro">
<div>
<div class="kicker">BOTANICAL / PROCEDURAL PRINTS</div>
<h1>Something in bloom.</h1>
<p>A flower drawn entirely with SVG paths and a little trigonometry.</p>
</div>
</header>
<div class="bloom-layout">
<section class="bloom-art panel">
<svg
id="bloom"
viewBox="0 0 400 400"
role="img"
aria-label="Generative layered botanical flower"
></svg
><span>FIG. 01 / NO TWO QUITE ALIKE</span>
</section>
<aside class="panel">
<span class="kicker">THE GARDEN CONTROLS</span>
<h2>Take a moment.<br />Grow something.</h2>
<label
>Petals <input id="petals" type="range" min="5" max="16" value="9" /><output
id="petal-count"
>9</output
></label
><label
>Palette
<select id="palette">
<option value="rose">Dusty rose</option>
<option value="sage">Garden sage</option>
<option value="blue">Blue hour</option>
</select></label
><button id="change" class="primary">Another bloom ↗</button
><output id="status" class="status" aria-live="polite"></output>
</aside>
</div>
</main>
:root {
--bg: #f9eae3;
--panel: #fff8f0;
--text: #473a45;
--muted: #796777;
--line: #e3c8ce;
--accent: #9d526f;
}
/* Original XXC Templates Studio collection. MIT; sample data only. */
* {
box-sizing: border-box;
}
html {
color-scheme: dark;
}
body {
margin: 0;
background: var(--bg);
color: var(--text);
font:
14px/1.6 system-ui,
-apple-system,
BlinkMacSystemFont,
"Segoe UI",
sans-serif;
padding: clamp(18px, 4vw, 40px);
min-height: 100vh;
}
h1,
h2,
h3,
p {
margin: 0;
}
h1 {
font-size: clamp(27px, 4.8vw, 46px);
line-height: 1.07;
letter-spacing: -0.055em;
font-weight: 650;
}
h2 {
font-size: 22px;
letter-spacing: -0.025em;
line-height: 1.2;
}
h3 {
font-size: 15px;
}
p {
color: var(--muted);
}
button,
input,
select {
font: inherit;
}
button,
a,
input,
select,
summary {
touch-action: manipulation;
}
button {
cursor: pointer;
color: var(--text);
background: var(--panel);
border: 1px solid var(--line);
border-radius: 9px;
padding: 9px 14px;
font-size: 12px;
}
button:hover {
border-color: var(--accent);
}
button[aria-pressed="true"],
button.active {
background: var(--accent);
color: var(--bg);
border-color: var(--accent);
}
button:disabled {
opacity: 0.5;
cursor: default;
}
button:focus-visible,
a:focus-visible,
input:focus-visible,
select:focus-visible,
summary:focus-visible,
[tabindex]:focus-visible {
outline: 3px solid var(--accent);
outline-offset: 4px;
}
a {
color: inherit;
text-underline-offset: 4px;
}
input,
select {
min-width: 0;
max-width: 100%;
color: var(--text);
background: var(--bg);
border: 1px solid var(--line);
border-radius: 8px;
padding: 9px;
}
input[type="range"] {
accent-color: var(--accent);
padding: 0;
}
input[type="checkbox"] {
accent-color: var(--accent);
}
label {
display: flex;
gap: 8px;
align-items: center;
font-size: 12px;
color: var(--muted);
}
svg {
max-width: 100%;
display: block;
}
img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
main {
max-width: 1120px;
margin: auto;
min-width: 0;
}
.kicker {
text-transform: uppercase;
letter-spacing: 0.17em;
font:
10px/1.6 ui-monospace,
monospace;
color: var(--accent);
}
.intro {
display: flex;
justify-content: space-between;
gap: 20px;
align-items: center;
margin-bottom: 25px;
}
.intro h1 {
margin: 8px 0 10px;
}
.intro p {
max-width: 470px;
font-size: 13px;
}
.badge {
display: inline-flex;
border: 1px solid var(--line);
border-radius: 50px;
padding: 5px 10px;
font:
10px ui-monospace,
monospace;
color: var(--muted);
}
.panel {
background: var(--panel);
border: 1px solid var(--line);
border-radius: 16px;
padding: 22px;
min-width: 0;
}
.toolbar {
display: flex;
gap: 9px;
flex-wrap: wrap;
align-items: center;
margin: 16px 0;
}
.primary {
background: var(--accent);
color: var(--bg);
border-color: var(--accent);
}
.grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 15px;
}
.muted {
color: var(--muted);
}
.metric {
font-size: 36px;
letter-spacing: -0.05em;
font-weight: 600;
}
.mono {
font-family: ui-monospace, monospace;
}
.rule {
border: 0;
border-top: 1px solid var(--line);
margin: 20px 0;
}
footer,
.footnote {
font-size: 10px;
color: var(--muted);
margin-top: 18px;
}
.status {
display: block;
min-height: 20px;
margin-top: 10px;
color: var(--accent);
font-size: 12px;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
}
[hidden] {
display: none !important;
}
.data-table {
margin-top: 16px;
font-size: 11px;
color: var(--muted);
}
.data-table summary {
cursor: pointer;
}
.table-scroll {
overflow: auto;
max-width: 100%;
}
table {
border-collapse: collapse;
width: 100%;
font-size: 11px;
}
th,
td {
text-align: left;
border-bottom: 1px solid var(--line);
padding: 9px;
white-space: nowrap;
}
caption {
text-align: left;
color: var(--muted);
padding: 8px 0;
}
.legend {
display: flex;
gap: 17px;
flex-wrap: wrap;
font-size: 11px;
color: var(--muted);
}
.legend i {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--c);
margin-right: 6px;
}
dialog {
max-width: calc(100vw - 36px);
width: 460px;
background: var(--panel);
color: var(--text);
border: 1px solid var(--line);
border-radius: 16px;
padding: 25px;
}
dialog::backdrop {
background: #000a;
}
dialog p {
margin: 12px 0;
}
.media-credit {
font-size: 9px;
margin-top: 16px;
color: var(--muted);
}
.stage {
position: relative;
min-height: 290px;
border-radius: 18px;
overflow: hidden;
border: 1px solid var(--line);
background: var(--panel);
}
@media (max-width: 520px) {
.intro {
align-items: flex-start;
flex-direction: column;
}
.grid {
grid-template-columns: 1fr;
}
.panel {
padding: 17px;
}
.toolbar label {
flex-wrap: wrap;
}
.stage {
min-height: 270px;
}
h1 {
font-size: 32px;
}
.intro p {
font-size: 12px;
}
}
@media (prefers-reduced-motion: reduce) {
*,
*:before,
*:after {
animation: none !important;
transition: none !important;
scroll-behavior: auto !important;
}
}
html {
color-scheme: light;
}
.bloom-layout {
display: grid;
grid-template-columns: 1.3fr 1fr;
gap: 20px;
}
.bloom-art {
background: #eee3d7;
padding: 15px;
text-align: center;
}
.bloom-art svg {
width: 100%;
max-height: 350px;
}
.bloom-art > span {
font:
8px ui-monospace,
monospace;
letter-spacing: 2px;
color: #827468;
}
.bloom-layout aside {
align-self: center;
}
.bloom-layout h2 {
font:
29px/1.15 Georgia,
serif;
margin: 20px 0;
}
.bloom-layout label {
flex-wrap: wrap;
margin: 20px 0;
font-size: 11px;
}
.bloom-layout input {
flex: 1;
min-width: 80px;
}
.bloom-layout select {
flex: 1;
}
.bloom-layout button {
margin-top: 10px;
}
@media (max-width: 520px) {
.bloom-layout {
grid-template-columns: 1fr;
}
}
(() => {
"use strict";
const $ = (s) => document.querySelector(s),
$$ = (s) => [...document.querySelectorAll(s)],
status = (t) => {
const el = $("#status");
if (el) el.textContent = t;
},
clamp = (n, a, b) => Math.max(a, Math.min(b, n));
const reduced = matchMedia("(prefers-reduced-motion: reduce)").matches;
const ns = "http://www.w3.org/2000/svg";
function svg(tag, attrs = {}, text) {
const el = document.createElementNS(ns, tag);
for (const [k, v] of Object.entries(attrs)) el.setAttribute(k, String(v));
if (text !== undefined) el.textContent = text;
return el;
}
function table(headers, rows) {
const t = $("#data-table");
if (!t) return;
t.replaceChildren();
const caption = document.createElement("caption");
caption.textContent = "Illustrative sample data";
t.append(caption);
const head = t.createTHead().insertRow();
headers.forEach((v) => {
const th = document.createElement("th");
th.scope = "col";
th.textContent = v;
head.append(th);
});
const body = t.createTBody();
rows.forEach((row) => {
const r = body.insertRow();
row.forEach((v) => (r.insertCell().textContent = String(v)));
});
}
function selectButtons(selector, callback) {
$$(selector).forEach((b) =>
b.addEventListener("click", () => {
$$(selector).forEach((x) => x.setAttribute("aria-pressed", String(x === b)));
callback(b);
}),
);
}
let seed = 0;
function draw() {
const s = $("#bloom");
s.replaceChildren();
const n = Number($("#petals").value),
colors = {
rose: ["#d6a9a3", "#bb7d89", "#835966", "#edd6ad"],
sage: ["#b8c5a1", "#829b76", "#496957", "#e9d6a0"],
blue: ["#a9bfd0", "#778fab", "#4e627d", "#e6cbaa"],
}[$("#palette").value];
$("#petal-count").textContent = n;
for (let layer = 0; layer < 3; layer++) {
const length = 148 - layer * 32,
width = 47 - layer * 11;
for (let i = 0; i < n; i++) {
const angle = (360 / n) * i + (layer * 180) / n + seed * 7;
s.append(
svg("path", {
d:
"M200 210 C" +
(200 - width) +
" " +
(210 - length * 0.55) +
" " +
(200 - width * 0.6) +
" " +
(210 - length) +
" 200 " +
(210 - length) +
" C" +
(200 + width * 0.6) +
" " +
(210 - length) +
" " +
(200 + width) +
" " +
(210 - length * 0.55) +
" 200 210",
fill: colors[layer],
opacity: 0.85,
transform: "rotate(" + angle + " 200 210)",
}),
);
}
}
s.append(svg("circle", { cx: 200, cy: 210, r: 23, fill: colors[3] }));
for (let i = 0; i < 25; i++) {
const a = i * 2.4,
r = 3 * Math.sqrt(i);
s.append(
svg("circle", {
cx: 200 + Math.cos(a) * r,
cy: 210 + Math.sin(a) * r,
r: 1.6,
fill: colors[2],
}),
);
}
}
$("#petals").addEventListener("input", draw);
$("#palette").addEventListener("change", draw);
$("#change").addEventListener("click", () => {
seed++;
$("#petals").value = 5 + ((seed * 3) % 12);
draw();
status("Bloom " + (seed + 1) + " · " + $("#petals").value + " petals per layer.");
});
draw();
})();
A bold SVG poster generator built from a seeded grid of arcs and blocks. Change the edition or palette w…
A tiny original isometric city assembled from SVG geometry, with selectable buildings and a day/night li…